{"version":3,"file":"SanityVision.mjs","sources":["../../src/apiVersions.ts","../../src/components/DelayedSpinner.tsx","../../src/codemirror/extensions.ts","../../src/codemirror/useCodemirrorTheme.ts","../../src/codemirror/VisionCodeMirror.styled.tsx","../../src/codemirror/VisionCodeMirror.tsx","../../src/perspectives.ts","../../src/util/encodeQueryString.ts","../../src/util/isPlainObject.ts","../../src/util/localStorage.ts","../../src/util/parseApiQueryString.ts","../../src/util/prefixApiVersion.ts","../../src/util/validateApiVersion.ts","../../src/util/tryParseParams.ts","../../src/components/VisionGui.styled.tsx","../../src/components/ParamsEditor.tsx","../../src/hooks/useSavedQueries.ts","../../src/components/QueryRecall.styled.tsx","../../src/components/QueryRecall.tsx","../../src/components/usePaneSize.ts","../../src/components/VisionGuiControls.tsx","../../src/components/PerspectivePopover.styled.tsx","../../src/components/PerspectivePopover.tsx","../../src/components/VisionGuiHeader.tsx","../../src/util/getBlobUrl.ts","../../src/components/QueryErrorDialog.styled.tsx","../../src/components/QueryErrorDetails.tsx","../../src/components/QueryErrorDialog.tsx","../../src/components/ResultView.styled.tsx","../../src/components/ResultView.tsx","../../src/components/SaveResultButtons.tsx","../../src/components/VisionGuiResult.tsx","../../src/components/VisionGui.tsx","../../src/hooks/useDatasets.ts","../../src/containers/VisionContainer.tsx","../../src/containers/VisionErrorBoundary.tsx","../../src/SanityVision.tsx"],"sourcesContent":["export const API_VERSIONS = [\n  'v1',\n  'vX',\n  'v2021-03-25',\n  'v2021-10-21',\n  'v2022-03-07',\n  'v2025-02-19',\n  `v${new Date().toISOString().split('T')[0]}`,\n]\nexport const [DEFAULT_API_VERSION] = API_VERSIONS.slice(-1)\n","import {Spinner} from '@sanity/ui'\nimport {useEffect, useState} from 'react'\n\ninterface DelayedSpinnerProps {\n  delay?: number\n}\n\n// Waits for X ms before showing a spinner\nexport function DelayedSpinner(props: DelayedSpinnerProps) {\n  const [show, setShow] = useState(false)\n\n  useEffect(() => {\n    const timer = setTimeout(() => setShow(true), props.delay || 500)\n    return () => clearTimeout(timer)\n  }, [props.delay])\n\n  return show ? <Spinner muted size={4} /> : null\n}\n","import {closeBrackets} from '@codemirror/autocomplete'\nimport {defaultKeymap, history, historyKeymap} from '@codemirror/commands'\nimport {javascriptLanguage} from '@codemirror/lang-javascript'\nimport {\n  bracketMatching,\n  defaultHighlightStyle,\n  indentOnInput,\n  syntaxHighlighting,\n} from '@codemirror/language'\nimport {highlightSelectionMatches} from '@codemirror/search'\nimport {type Extension} from '@codemirror/state'\nimport {\n  drawSelection,\n  highlightActiveLine,\n  highlightActiveLineGutter,\n  highlightSpecialChars,\n  keymap,\n  lineNumbers,\n} from '@codemirror/view'\n\nexport const codemirrorExtensions: Extension[] = [\n  [javascriptLanguage],\n  lineNumbers(),\n  highlightActiveLine(),\n  highlightActiveLineGutter(),\n  highlightSelectionMatches(),\n  highlightSpecialChars(),\n  indentOnInput(),\n  bracketMatching(),\n  closeBrackets(),\n  history(),\n  drawSelection(),\n  syntaxHighlighting(defaultHighlightStyle, {fallback: true}),\n  keymap.of(\n    [\n      // Override the default keymap for Mod-Enter to not insert a new line, we have a custom event handler for executing queries\n      {key: 'Mod-Enter', run: () => true},\n\n      // Add the default keymap and history keymap\n      defaultKeymap,\n      historyKeymap,\n    ]\n      .flat()\n      .filter(Boolean),\n  ),\n]\n","import {HighlightStyle, syntaxHighlighting} from '@codemirror/language'\nimport {EditorView} from '@codemirror/view'\nimport {tags as t} from '@lezer/highlight'\nimport {hues} from '@sanity/color'\nimport {rem, type Theme} from '@sanity/ui'\nimport {useMemo} from 'react'\n\nexport function useCodemirrorTheme(theme: Theme) {\n  const cmTheme = useMemo(() => createTheme(theme), [theme])\n  const cmHighlight = useMemo(() => syntaxHighlighting(createHighlight(theme)), [theme])\n\n  return [cmTheme, cmHighlight]\n}\n\nfunction createTheme(theme: Theme) {\n  const {color, fonts} = theme.sanity\n  const card = color.card.enabled\n  const cursor = hues.blue[color.dark ? 400 : 500].hex\n  const selection = hues.gray[theme.sanity.color.dark ? 900 : 100].hex\n\n  return EditorView.theme(\n    {\n      '&': {\n        color: card.fg,\n        backgroundColor: card.bg,\n      },\n\n      '.cm-content': {\n        caretColor: cursor,\n      },\n\n      '.cm-editor': {\n        fontFamily: fonts.code.family,\n        fontSize: rem(fonts.code.sizes[1].fontSize),\n        lineHeight: 'inherit',\n      },\n\n      '.cm-cursor, .cm-dropCursor': {borderLeftColor: cursor},\n      '&.cm-focused .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection': {\n        backgroundColor: selection,\n      },\n\n      '.cm-panels': {backgroundColor: card.bg, color: card.fg},\n      '.cm-panels.cm-panels-top': {borderBottom: `2px solid ${card.border}`},\n      '.cm-panels.cm-panels-bottom': {borderTop: `2px solid ${card.border}`},\n    },\n    {dark: color.dark},\n  )\n}\n\nfunction createHighlight(theme: Theme) {\n  const c = theme.sanity.color.base\n  const s = theme.sanity.color.syntax\n  return HighlightStyle.define([\n    {tag: t.keyword, color: s.keyword},\n    {tag: [t.propertyName, t.name, t.deleted, t.character, t.macroName], color: s.property},\n    {tag: [t.function(t.variableName), t.labelName], color: s.function},\n    {tag: [t.color, t.constant(t.name), t.standard(t.name)], color: s.variable},\n    {tag: [t.definition(t.name), t.separator], color: s.constant},\n    {\n      tag: [\n        t.typeName,\n        t.className,\n        t.number,\n        t.changed,\n        t.annotation,\n        t.modifier,\n        t.self,\n        t.namespace,\n      ],\n      color: s.number,\n    },\n    {\n      tag: [t.operator, t.operatorKeyword, t.url, t.escape, t.regexp, t.link, t.special(t.string)],\n      color: s.operator,\n    },\n    {tag: [t.meta, t.comment], color: s.comment},\n    {tag: t.strong, fontWeight: 'bold'},\n    {tag: t.emphasis, fontStyle: 'italic'},\n    {tag: t.strikethrough, textDecoration: 'line-through'},\n    {tag: t.heading, fontWeight: 'bold', color: s.property},\n    {tag: [t.atom, t.bool, t.special(t.variableName)], color: s.boolean},\n    {tag: [t.processingInstruction, t.string, t.inserted], color: s.string},\n    {tag: t.invalid, color: c.fg},\n  ])\n}\n","import {rem} from '@sanity/ui'\nimport {styled} from 'styled-components'\n\nexport const EditorRoot = styled.div`\n  width: 100%;\n  box-sizing: border-box;\n  height: 100%;\n  overflow: hidden;\n  overflow: clip;\n  position: relative;\n  display: flex;\n\n  & .cm-theme {\n    width: 100%;\n  }\n\n  & .cm-editor {\n    height: 100%;\n\n    font-size: 16px;\n    line-height: 21px;\n  }\n\n  & .cm-line {\n    padding-left: ${({theme}) => rem(theme.sanity.space[3])};\n  }\n\n  & .cm-content {\n    border-right-width: ${({theme}) => rem(theme.sanity.space[4])} !important;\n    padding-top: ${({theme}) => rem(theme.sanity.space[5])};\n  }\n`\n","import {useTheme} from '@sanity/ui'\nimport CodeMirror, {\n  EditorSelection,\n  type ReactCodeMirrorProps,\n  type ReactCodeMirrorRef,\n} from '@uiw/react-codemirror'\nimport {forwardRef, useCallback, useImperativeHandle, useRef, useState} from 'react'\n\nimport {codemirrorExtensions} from './extensions'\nimport {useCodemirrorTheme} from './useCodemirrorTheme'\nimport {EditorRoot} from './VisionCodeMirror.styled'\n\nexport interface VisionCodeMirrorHandle {\n  resetEditorContent: (newContent: string) => void\n}\n\nexport const VisionCodeMirror = forwardRef<\n  VisionCodeMirrorHandle,\n  Pick<ReactCodeMirrorProps, 'onChange'> & {\n    initialValue: ReactCodeMirrorProps['value']\n  }\n>((props, ref) => {\n  // The value prop is only passed for initial value, and is not updated when the parent component updates the value.\n  // If you need to update the value, use the resetEditorContent function.\n  const [initialValue] = useState(props.initialValue)\n  const sanityTheme = useTheme()\n  const theme = useCodemirrorTheme(sanityTheme)\n  const codeMirrorRef = useRef<ReactCodeMirrorRef>(null)\n\n  const resetEditorContent = useCallback((newContent: string) => {\n    const editorView = codeMirrorRef.current?.view\n    if (!editorView) return\n\n    const currentDoc = editorView.state.doc.toString()\n    if (newContent !== currentDoc) {\n      editorView.dispatch({\n        changes: {from: 0, to: currentDoc.length, insert: newContent},\n        selection: EditorSelection.cursor(newContent.length), // Place cursor at end\n      })\n    }\n  }, [])\n\n  useImperativeHandle(\n    ref,\n    () => ({\n      resetEditorContent,\n    }),\n    [resetEditorContent],\n  )\n\n  return (\n    <EditorRoot>\n      <CodeMirror\n        ref={codeMirrorRef}\n        basicSetup={false}\n        theme={theme}\n        extensions={codemirrorExtensions}\n        value={initialValue}\n        onChange={props.onChange}\n      />\n    </EditorRoot>\n  )\n})\n\n// Add display name\nVisionCodeMirror.displayName = 'VisionCodeMirror'\n","import {type ClientPerspective} from '@sanity/client'\nimport isEqual from 'react-fast-compare'\nimport {type PerspectiveContextValue} from 'sanity'\n\nexport const SUPPORTED_PERSPECTIVES = ['pinnedRelease', 'raw', 'published', 'drafts'] as const\n\nexport type SupportedPerspective = (typeof SUPPORTED_PERSPECTIVES)[number]\n\n/**\n * Virtual perspectives are recognised by Vision, but do not concretely reflect the names of real\n * perspectives. Virtual perspectives are transformed into real perspectives before being used to\n * interact with data.\n *\n * For example, the `pinnedRelease` virtual perspective is transformed to the real perspective\n * currently pinned in Studio.\n */\nexport const VIRTUAL_PERSPECTIVES = ['pinnedRelease'] as const\n\nexport type VirtualPerspective = (typeof VIRTUAL_PERSPECTIVES)[number]\n\nexport function isSupportedPerspective(p: string): p is SupportedPerspective {\n  return SUPPORTED_PERSPECTIVES.includes(p as SupportedPerspective)\n}\n\nexport function isVirtualPerspective(\n  maybeVirtualPerspective: unknown,\n): maybeVirtualPerspective is VirtualPerspective {\n  return (\n    typeof maybeVirtualPerspective === 'string' &&\n    VIRTUAL_PERSPECTIVES.includes(maybeVirtualPerspective as VirtualPerspective)\n  )\n}\n\nexport function hasPinnedPerspective({selectedPerspectiveName}: PerspectiveContextValue): boolean {\n  return typeof selectedPerspectiveName !== 'undefined'\n}\n\nexport function hasPinnedPerspectiveChanged(\n  previous: PerspectiveContextValue,\n  next: PerspectiveContextValue,\n): boolean {\n  const hasPerspectiveStackChanged = !isEqual(previous.perspectiveStack, next.perspectiveStack)\n\n  return (\n    previous.selectedPerspectiveName !== next.selectedPerspectiveName || hasPerspectiveStackChanged\n  )\n}\n\nexport function getActivePerspective({\n  visionPerspective,\n  perspectiveStack,\n}: {\n  visionPerspective: ClientPerspective | SupportedPerspective | undefined\n  perspectiveStack: PerspectiveContextValue['perspectiveStack']\n}): ClientPerspective | undefined {\n  if (visionPerspective !== 'pinnedRelease') {\n    return visionPerspective\n  }\n  return perspectiveStack\n}\n","export function encodeQueryString(\n  query: string,\n  params: Record<string, unknown> = {},\n  options: Record<string, string | string[]> = {},\n): string {\n  const searchParams = new URLSearchParams()\n  searchParams.set('query', query)\n\n  for (const [key, value] of Object.entries(params)) {\n    searchParams.set(`$${key}`, JSON.stringify(value))\n  }\n\n  for (const [key, value] of Object.entries(options)) {\n    if (value) searchParams.set(key, `${value}`)\n  }\n\n  return `?${searchParams}`\n}\n","export function isPlainObject(obj: unknown): obj is Record<string, unknown> {\n  return (\n    !!obj && typeof obj === 'object' && Object.prototype.toString.call(obj) === '[object Object]'\n  )\n}\n","import {isPlainObject} from './isPlainObject'\n\nconst hasLocalStorage = supportsLocalStorage()\nconst keyPrefix = 'sanityVision:'\n\nexport interface LocalStorageish {\n  get: <T>(key: string, defaultVal: T) => T\n  set: <T>(key: string, value: T) => T\n  merge: <T>(props: T) => T\n}\n\nexport function clearLocalStorage() {\n  if (!hasLocalStorage) {\n    return\n  }\n\n  for (let i = 0; i < localStorage.length; i++) {\n    const key = localStorage.key(i)\n    if (key?.startsWith(keyPrefix)) {\n      localStorage.removeItem(key)\n    }\n  }\n}\n\nexport function getLocalStorage(namespace: string): LocalStorageish {\n  const storageKey = `${keyPrefix}${namespace}`\n  let loadedState: Record<string, unknown> | null = null\n\n  return {get, set, merge}\n\n  function get<T>(key: string, defaultVal: T): T {\n    const state = ensureState()\n    return typeof state[key] === 'undefined' ? defaultVal : (state[key] as T)\n  }\n\n  function set<T>(key: string, value: T): T {\n    const state = ensureState()\n    state[key] = value\n    localStorage.setItem(storageKey, JSON.stringify(loadedState))\n    return value\n  }\n\n  function merge<T>(props: T): T {\n    const state = {...ensureState(), ...props}\n    localStorage.setItem(storageKey, JSON.stringify(state))\n    return state\n  }\n\n  function ensureState(): Record<string, unknown> {\n    if (loadedState === null) {\n      loadedState = loadState()\n    }\n\n    return loadedState\n  }\n\n  function loadState() {\n    if (!hasLocalStorage) {\n      return {}\n    }\n\n    try {\n      const stored = JSON.parse(localStorage.getItem(storageKey) || '{}')\n      return isPlainObject(stored) ? stored : {}\n    } catch (err) {\n      return {}\n    }\n  }\n}\n\nfunction supportsLocalStorage() {\n  const mod = 'lsCheck'\n  try {\n    localStorage.setItem(mod, mod)\n    localStorage.removeItem(mod)\n    return true\n  } catch (err) {\n    return false\n  }\n}\n","export interface ParsedApiQueryString {\n  query: string\n  params: Record<string, unknown>\n  options: Record<string, string>\n}\n\nexport function parseApiQueryString(qs: URLSearchParams): ParsedApiQueryString {\n  const params: Record<string, unknown> = {}\n  const options: Record<string, string> = {}\n\n  for (const [key, value] of qs.entries()) {\n    if (key[0] === '$') {\n      params[key.slice(1)] = JSON.parse(value)\n      continue\n    }\n\n    if (key === 'perspective') {\n      options[key] = value\n      continue\n    }\n  }\n\n  return {query: qs.get('query') || '', params, options}\n}\n","export function prefixApiVersion(version: string): string {\n  if (version[0] !== 'v' && version !== 'other') {\n    return `v${version}`\n  }\n\n  return version\n}\n","export function validateApiVersion(apiVersion: string): boolean {\n  const parseableApiVersion = apiVersion.replace(/^v/, '').trim().toUpperCase()\n\n  const isValidApiVersion =\n    parseableApiVersion.length > 0 &&\n    (parseableApiVersion === 'X' ||\n      parseableApiVersion === '1' ||\n      (/^\\d{4}-\\d{2}-\\d{2}$/.test(parseableApiVersion) && !isNaN(Date.parse(parseableApiVersion))))\n\n  return isValidApiVersion\n}\n","import JSON5 from 'json5'\nimport {type TFunction} from 'sanity'\n\nexport function tryParseParams(\n  val: string,\n  t: TFunction<'vision', undefined>,\n): Record<string, unknown> | Error {\n  try {\n    const parsed = val ? JSON5.parse(val) : {}\n    return typeof parsed === 'object' && parsed && !Array.isArray(parsed) ? parsed : {}\n  } catch (err) {\n    // JSON5 always prefixes the error message with JSON5:, so we remove it\n    // to clean up the error tooltip\n    err.message = `${t('params.error.params-invalid-json')}:\\n\\n${err.message.replace(\n      'JSON5:',\n      '',\n    )}`\n    return err\n  }\n}\n","import {Box, Card, Flex, Label, rem, Text} from '@sanity/ui'\nimport {css, styled} from 'styled-components'\n\nexport const Root = styled(Flex)`\n  .sidebarPanes .Pane {\n    overflow-y: auto;\n    overflow-x: hidden;\n  }\n\n  & .Resizer {\n    background: var(--card-border-color);\n    opacity: 1;\n    z-index: 1;\n    box-sizing: border-box;\n    background-clip: padding-box;\n    border: solid transparent;\n  }\n\n  & .Resizer:hover {\n    border-color: var(--card-shadow-ambient-color);\n  }\n\n  & .Resizer.horizontal {\n    height: 11px;\n    margin: -5px 0;\n    border-width: 5px 0;\n    cursor: row-resize;\n    width: 100%;\n    z-index: 4;\n  }\n\n  & .Resizer.vertical {\n    width: 11px;\n    margin: 0 -5px;\n    border-width: 0 5px;\n    cursor: col-resize;\n    z-index: 2; /* To prevent the resizer from being hidden behind CodeMirror scroll area */\n  }\n\n  .Resizer.disabled {\n    cursor: not-allowed;\n  }\n\n  .Resizer.disabled:hover {\n    border-color: transparent;\n  }\n`\n\nRoot.displayName = 'Root'\n\nexport const Header = styled(Card)`\n  border-bottom: 1px solid var(--card-border-color);\n`\n\nexport const StyledLabel = styled(Label)`\n  flex: 1;\n`\n\nexport const SplitpaneContainer = styled(Box)`\n  position: relative;\n`\n\nexport const QueryCopyLink = styled.a`\n  cursor: pointer;\n  margin-right: auto;\n`\n\nexport const InputBackgroundContainer = styled(Box)`\n  position: absolute;\n  top: 1rem;\n  left: 0;\n  padding: 0;\n  margin: 0;\n  z-index: 10;\n  right: 0;\n\n  ${StyledLabel} {\n    user-select: none;\n  }\n`\n\nexport const InputBackgroundContainerLeft = styled(InputBackgroundContainer)`\n  // This is so its aligned with the gutters of CodeMirror\n  left: 33px;\n`\n\nexport const InputContainer = styled(Card)`\n  width: 100%;\n  height: 100%;\n  position: relative;\n  flex-direction: column;\n`\n\nexport const ResultOuterContainer = styled(Flex)`\n  height: 100%;\n`\n\nexport const ResultInnerContainer = styled(Box)`\n  position: relative;\n`\n\nexport const ResultContainer = styled(Card)<{$isInvalid: boolean}>`\n  height: 100%;\n  width: 100%;\n  position: absolute;\n  max-width: 100%;\n\n  ${({$isInvalid}) =>\n    $isInvalid &&\n    css`\n      &:after {\n        background-color: var(--card-bg-color);\n        content: '';\n        position: absolute;\n        top: 0;\n        bottom: 0;\n        left: 0;\n        width: 100%;\n      }\n    `}\n`\n\nexport const Result = styled(Box)`\n  position: relative;\n  width: 100%;\n  height: 100%;\n  z-index: 20;\n`\n\nexport const ResultFooter = styled(Flex)`\n  border-top: 1px solid var(--card-border-color);\n`\n\nexport const TimingsCard = styled(Card)`\n  position: relative;\n`\n\nexport const TimingsContainer = styled(Box)`\n  width: 100%;\n  height: 100%;\n`\n\nexport const TimingsTextContainer = styled(Flex)`\n  height: 100%;\n  min-height: ${({theme}) =>\n    rem(\n      theme.sanity.space[3] * 2 +\n        theme.sanity.fonts.text.sizes[2].lineHeight -\n        theme.sanity.fonts.text.sizes[2].ascenderHeight -\n        theme.sanity.fonts.text.sizes[2].descenderHeight,\n    )};\n`\n\nexport const DownloadsCard = styled(Card)`\n  position: relative;\n`\n\nexport const SaveResultLabel = styled(Text)`\n  transform: initial;\n  &:before,\n  &:after {\n    content: none;\n  }\n  > span {\n    display: flex !important;\n    gap: ${({theme}) => rem(theme.sanity.space[3])};\n    align-items: center;\n  }\n`\n\nexport const ControlsContainer = styled(Box)`\n  border-top: 1px solid var(--card-border-color);\n`\n","import {ErrorOutlineIcon} from '@sanity/icons'\nimport {Box, Card, Flex, Text, Tooltip} from '@sanity/ui'\nimport {debounce} from 'lodash'\nimport {type RefObject, useCallback, useEffect, useMemo, useState} from 'react'\nimport {type TFunction, useTranslation} from 'sanity'\n\nimport {VisionCodeMirror, type VisionCodeMirrorHandle} from '../codemirror/VisionCodeMirror'\nimport {visionLocaleNamespace} from '../i18n'\nimport {tryParseParams} from '../util/tryParseParams'\nimport {type Params} from './VisionGui'\nimport {InputBackgroundContainerLeft, StyledLabel} from './VisionGui.styled'\n\nconst defaultValue = `{\\n  \\n}`\n\nexport interface ParamsEditorProps {\n  value: string\n  onChange: (changeEvt: Params) => void\n  paramsError: string | undefined\n  hasValidParams: boolean\n  editorRef: RefObject<VisionCodeMirrorHandle | null>\n}\n\nexport interface ParamsEditorChange {\n  valid: boolean\n}\n\nexport function ParamsEditor(props: ParamsEditorProps) {\n  const {onChange, paramsError, hasValidParams, editorRef} = props\n  const {t} = useTranslation(visionLocaleNamespace)\n  const {raw: value, error, parsed, valid} = parseParams(props.value, t)\n  const [isValid, setValid] = useState(valid)\n  const [init, setInit] = useState(false)\n\n  // Emit onChange on very first render\n  useEffect(() => {\n    if (!init) {\n      onChange({parsed, raw: value, valid: isValid, error})\n      setInit(true)\n    }\n  }, [error, init, isValid, onChange, parsed, value])\n\n  const handleChangeRaw = useCallback(\n    (newValue: string) => {\n      const event = parseParams(newValue, t)\n      setValid(event.valid)\n      onChange(event)\n    },\n    [onChange, t],\n  )\n\n  const handleChange = useMemo(() => debounce(handleChangeRaw, 333), [handleChangeRaw])\n  return (\n    <Card flex={1} tone={hasValidParams ? 'default' : 'critical'} data-testid=\"params-editor\">\n      <InputBackgroundContainerLeft>\n        <Flex>\n          <StyledLabel muted>{t('params.label')}</StyledLabel>\n          {paramsError && (\n            <Tooltip animate placement=\"top\" portal content={<Text size={1}>{paramsError}</Text>}>\n              <Box padding={1} marginX={2}>\n                <Text>\n                  <ErrorOutlineIcon />\n                </Text>\n              </Box>\n            </Tooltip>\n          )}\n        </Flex>\n      </InputBackgroundContainerLeft>\n      <VisionCodeMirror\n        ref={editorRef}\n        initialValue={props.value || defaultValue}\n        onChange={handleChange}\n      />\n    </Card>\n  )\n}\n\nexport function parseParams(\n  value: string,\n  t: TFunction<typeof visionLocaleNamespace, undefined>,\n): Params {\n  const parsedParams = tryParseParams(value, t)\n  const params = parsedParams instanceof Error ? {} : parsedParams\n  const validationError = parsedParams instanceof Error ? parsedParams.message : undefined\n  const isValid = !validationError\n\n  return {\n    parsed: params,\n    raw: value,\n    valid: isValid,\n    error: validationError,\n  }\n}\n","import {uuid} from '@sanity/uuid' // Import the UUID library\nimport {useCallback, useEffect, useMemo, useState} from 'react'\nimport {map, startWith} from 'rxjs/operators'\nimport {type KeyValueStoreValue, useKeyValueStore} from 'sanity'\n\nconst STORED_QUERIES_NAMESPACE = 'studio.vision-tool.saved-queries'\n\nexport interface QueryConfig {\n  _key: string\n  url: string\n  savedAt: string\n  title?: string\n  shared?: boolean\n}\n\nexport interface StoredQueries {\n  queries: QueryConfig[]\n}\n\nconst defaultValue = {\n  queries: [],\n}\nconst keyValueStoreKey = STORED_QUERIES_NAMESPACE\n\nexport function useSavedQueries(): {\n  queries: QueryConfig[]\n  saveQuery: (query: Omit<QueryConfig, '_key'>) => void\n  updateQuery: (query: QueryConfig) => void\n  deleteQuery: (key: string) => void\n  saving: boolean\n  deleting: string[]\n  saveQueryError: Error | undefined\n  deleteQueryError: Error | undefined\n  error: Error | undefined\n} {\n  const keyValueStore = useKeyValueStore()\n\n  const [value, setValue] = useState<StoredQueries>(defaultValue)\n  const [saving, setSaving] = useState(false)\n  const [deleting, setDeleting] = useState<string[]>([])\n  const [saveQueryError, setSaveQueryError] = useState<Error | undefined>()\n  const [deleteQueryError, setDeleteQueryError] = useState<Error | undefined>()\n  const [error, setError] = useState<Error | undefined>()\n\n  const queries = useMemo(() => {\n    return keyValueStore.getKey(keyValueStoreKey)\n  }, [keyValueStore])\n\n  useEffect(() => {\n    const sub = queries\n      .pipe(\n        startWith(defaultValue as any),\n        map((data: StoredQueries) => {\n          if (!data) {\n            return defaultValue\n          }\n          return data\n        }),\n      )\n      .subscribe({\n        next: setValue,\n        error: (err) => setError(err as Error),\n      })\n\n    return () => sub?.unsubscribe()\n  }, [queries, keyValueStore])\n\n  const saveQuery = useCallback(\n    (query: Omit<QueryConfig, '_key'>) => {\n      setSaving(true)\n      setSaveQueryError(undefined)\n      try {\n        const newQuery = {...query, _key: uuid()} // Add a unique _key to the query\n        const newQueries = [newQuery, ...value.queries]\n        setValue({queries: newQueries})\n        keyValueStore.setKey(keyValueStoreKey, {\n          queries: newQueries,\n        } as unknown as KeyValueStoreValue)\n      } catch (err) {\n        setSaveQueryError(err as Error)\n      } finally {\n        setSaving(false)\n      }\n    },\n    [keyValueStore, value.queries],\n  )\n\n  const updateQuery = useCallback(\n    (query: QueryConfig) => {\n      setSaving(true)\n      setSaveQueryError(undefined)\n      try {\n        const updatedQueries = value.queries.map((q) =>\n          q._key === query._key ? {...q, ...query} : q,\n        )\n        setValue({queries: updatedQueries})\n        keyValueStore.setKey(keyValueStoreKey, {\n          queries: updatedQueries,\n        } as unknown as KeyValueStoreValue)\n      } catch (err) {\n        setSaveQueryError(err as Error)\n      } finally {\n        setSaving(false)\n      }\n    },\n    [keyValueStore, value.queries],\n  )\n\n  const deleteQuery = useCallback(\n    (key: string) => {\n      setDeleting((prev) => [...prev, key])\n      setDeleteQueryError(undefined)\n      try {\n        const filteredQueries = value.queries.filter((q) => q._key !== key)\n        setValue({queries: filteredQueries})\n        keyValueStore.setKey(keyValueStoreKey, {\n          queries: filteredQueries,\n        } as unknown as KeyValueStoreValue)\n      } catch (err) {\n        setDeleteQueryError(err as Error)\n      } finally {\n        setDeleting((prev) => prev.filter((k) => k !== key))\n      }\n    },\n    [keyValueStore, value.queries],\n  )\n\n  return {\n    queries: value.queries,\n    saveQuery,\n    updateQuery,\n    deleteQuery,\n    saving,\n    deleting,\n    saveQueryError,\n    deleteQueryError,\n    error,\n  }\n}\n","import {Box, Stack} from '@sanity/ui'\nimport {styled} from 'styled-components'\n\nexport const FixedHeader = styled(Stack)`\n  position: sticky;\n  top: 0;\n  background: ${({theme}) => theme.sanity.color.base.bg};\n  z-index: 1;\n`\n\nexport const ScrollContainer = styled(Box)`\n  height: 100%;\n  overflow-y: auto;\n  overflow-x: hidden;\n\n  &::-webkit-scrollbar {\n    width: 8px;\n  }\n\n  &::-webkit-scrollbar-track {\n    background: transparent;\n  }\n\n  &::-webkit-scrollbar-thumb {\n    background: ${({theme}) => theme.sanity.color.base.border};\n    border-radius: 4px;\n  }\n`\n","import {AddIcon, SearchIcon, TrashIcon} from '@sanity/icons'\nimport {\n  Box,\n  Button,\n  Card,\n  Code,\n  Flex,\n  Menu,\n  MenuButton,\n  MenuItem,\n  Stack,\n  Text,\n  TextInput,\n  useToast,\n} from '@sanity/ui'\nimport {isEqual} from 'lodash'\nimport {type ReactElement, useCallback, useState} from 'react'\nimport {ContextMenuButton, useDateTimeFormat, useTranslation} from 'sanity'\n\nimport {type QueryConfig, useSavedQueries} from '../hooks/useSavedQueries'\nimport {visionLocaleNamespace} from '../i18n'\nimport {FixedHeader, ScrollContainer} from './QueryRecall.styled'\nimport {type ParsedUrlState} from './VisionGui'\n\nexport function QueryRecall({\n  url,\n  getStateFromUrl,\n  setStateFromParsedUrl,\n  currentQuery,\n  currentParams,\n  generateUrl,\n}: {\n  url?: string\n  getStateFromUrl: (data: string) => ParsedUrlState | null\n  setStateFromParsedUrl: (parsedUrlObj: ParsedUrlState) => void\n  currentQuery: string\n  currentParams: Record<string, unknown>\n  generateUrl: (query: string, params: Record<string, unknown>) => string\n}): ReactElement {\n  const toast = useToast()\n  const {saveQuery, updateQuery, queries, deleteQuery, saving, deleting, saveQueryError} =\n    useSavedQueries()\n  const {t} = useTranslation(visionLocaleNamespace)\n  const formatDate = useDateTimeFormat({\n    month: 'short',\n    day: 'numeric',\n    year: 'numeric',\n    hour: 'numeric',\n    minute: '2-digit',\n    hour12: true,\n  })\n  const [editingKey, setEditingKey] = useState<string | null>(null)\n  const [editingTitle, setEditingTitle] = useState('')\n  const [optimisticTitles, setOptimisticTitles] = useState<Record<string, string>>({})\n  const [searchQuery, setSearchQuery] = useState('')\n  const [selectedUrl, setSelectedUrl] = useState<string | undefined>(url)\n\n  const handleSave = useCallback(async () => {\n    // Generate the correct URL first\n    const newUrl = generateUrl(currentQuery, currentParams)\n\n    // Check for duplicates by comparing query content and params\n    const isDuplicate = queries?.some((q) => {\n      const savedQueryObj = getStateFromUrl(q.url)\n      return (\n        savedQueryObj &&\n        savedQueryObj.query === currentQuery &&\n        isEqual(savedQueryObj.params, currentParams)\n      )\n    })\n\n    if (isDuplicate) {\n      const duplicateQuery = queries?.find((q) => {\n        const savedQueryObj = getStateFromUrl(q.url)\n        return (\n          savedQueryObj &&\n          savedQueryObj.query === currentQuery &&\n          isEqual(savedQueryObj.params, currentParams)\n        )\n      })\n      toast.push({\n        closable: true,\n        status: 'warning',\n        title: t('save-query.already-saved'),\n        description: `${duplicateQuery?.title} - ${formatDate.format(new Date(duplicateQuery?.savedAt || ''))}`,\n      })\n      return\n    }\n\n    if (newUrl) {\n      await saveQuery({\n        url: newUrl,\n        savedAt: new Date().toISOString(),\n        title: 'Untitled',\n      })\n      // Set the selected URL to the newly saved query's URL\n      setSelectedUrl(newUrl)\n    }\n    if (saveQueryError) {\n      toast.push({\n        closable: true,\n        status: 'error',\n        title: t('save-query.error'),\n        description: saveQueryError.message,\n      })\n    } else {\n      toast.push({\n        closable: true,\n        status: 'success',\n        title: t('save-query.success'),\n      })\n    }\n  }, [\n    queries,\n    saveQueryError,\n    toast,\n    t,\n    currentQuery,\n    currentParams,\n    getStateFromUrl,\n    generateUrl,\n    formatDate,\n    saveQuery,\n  ])\n\n  const handleTitleSave = useCallback(\n    async (query: QueryConfig, newTitle: string) => {\n      setEditingKey(null)\n      setOptimisticTitles((prev) => ({...prev, [query._key]: newTitle}))\n\n      try {\n        await updateQuery({\n          ...query,\n          title: newTitle,\n        })\n        // Clear optimistic title on success\n        setOptimisticTitles((prev) => {\n          const next = {...prev}\n          delete next[query._key]\n          return next\n        })\n      } catch (err) {\n        // Clear optimistic title on error\n        setOptimisticTitles((prev) => {\n          const next = {...prev}\n          delete next[query._key]\n          return next\n        })\n        toast.push({\n          closable: true,\n          status: 'error',\n          title: t('save-query.error'),\n          description: err.message,\n        })\n      }\n    },\n    [updateQuery, toast, t],\n  )\n\n  const handleUpdate = useCallback(\n    async (query: QueryConfig) => {\n      const newUrl = generateUrl(currentQuery, currentParams)\n\n      // Check for duplicates by comparing query content and params\n      const isDuplicate = queries?.some((q) => {\n        // Skip the current query when checking for duplicates\n        if (q._key === query._key) return false\n        const savedQueryObj = getStateFromUrl(q.url)\n        return (\n          savedQueryObj &&\n          savedQueryObj.query === currentQuery &&\n          isEqual(savedQueryObj.params, currentParams)\n        )\n      })\n\n      if (isDuplicate) {\n        const duplicateQuery = queries?.find((q) => {\n          if (q._key === query._key) return false\n          const savedQueryObj = getStateFromUrl(q.url)\n          return (\n            savedQueryObj &&\n            savedQueryObj.query === currentQuery &&\n            isEqual(savedQueryObj.params, currentParams)\n          )\n        })\n        toast.push({\n          closable: true,\n          status: 'warning',\n          title: t('save-query.already-saved'),\n          description: `${duplicateQuery?.title} - ${formatDate.format(\n            new Date(duplicateQuery?.savedAt || ''),\n          )}`,\n        })\n        return\n      }\n\n      try {\n        await updateQuery({\n          ...query,\n          url: newUrl,\n          savedAt: new Date().toISOString(),\n        })\n        setSelectedUrl(newUrl)\n        toast.push({\n          closable: true,\n          status: 'success',\n          title: t('save-query.success'),\n        })\n      } catch (err) {\n        toast.push({\n          closable: true,\n          status: 'error',\n          title: t('save-query.error'),\n          description: err.message,\n        })\n      }\n    },\n    [\n      currentQuery,\n      currentParams,\n      formatDate,\n      generateUrl,\n      updateQuery,\n      toast,\n      t,\n      queries,\n      getStateFromUrl,\n    ],\n  )\n\n  const filteredQueries = queries?.filter((q) => {\n    return q?.title?.toLowerCase().includes(searchQuery.toLowerCase())\n  })\n\n  return (\n    <ScrollContainer>\n      <FixedHeader space={3}>\n        <Flex padding={3} paddingTop={4} paddingBottom={0} justify=\"space-between\" align=\"center\">\n          <Text weight=\"semibold\" style={{textTransform: 'capitalize'}} size={4}>\n            {t('label.saved-queries')}\n          </Text>\n          <Button\n            label={t('action.save-query')}\n            icon={AddIcon}\n            disabled={saving}\n            onClick={handleSave}\n            mode=\"bleed\"\n          />\n        </Flex>\n        <Box padding={3} paddingTop={0}>\n          <TextInput\n            placeholder={t('label.search-queries')}\n            icon={SearchIcon}\n            value={searchQuery}\n            onChange={(event) => setSearchQuery(event.currentTarget.value)}\n          />\n        </Box>\n      </FixedHeader>\n      <Stack paddingY={3}>\n        {filteredQueries?.map((q) => {\n          const queryObj = getStateFromUrl(q.url)\n          const isSelected = selectedUrl === q.url\n\n          // Compare against current live state\n          const areQueriesEqual =\n            queryObj && currentQuery === queryObj.query && isEqual(currentParams, queryObj.params)\n\n          const isEdited = isSelected && !areQueriesEqual\n          return (\n            <Card\n              key={q._key}\n              width={'fill'}\n              padding={4}\n              border\n              tone={isSelected ? 'positive' : 'default'}\n              onClick={() => {\n                setSelectedUrl(q.url) // Update the selected query immediately\n                const parsedUrl = getStateFromUrl(q.url)\n                if (parsedUrl) {\n                  setStateFromParsedUrl(parsedUrl)\n                }\n              }}\n              style={{position: 'relative'}}\n            >\n              <Stack space={3}>\n                <Flex justify=\"space-between\" align={'center'}>\n                  <Flex align=\"center\" gap={2} paddingRight={1}>\n                    {editingKey === q._key ? (\n                      <TextInput\n                        value={editingTitle}\n                        onChange={(event) => setEditingTitle(event.currentTarget.value)}\n                        onKeyDown={(event) => {\n                          if (event.key === 'Enter') {\n                            handleTitleSave(q, editingTitle)\n                          } else if (event.key === 'Escape') {\n                            setEditingKey(null)\n                          }\n                        }}\n                        onBlur={() => handleTitleSave(q, editingTitle)}\n                        autoFocus\n                        style={{maxWidth: '170px', height: '24px'}}\n                      />\n                    ) : (\n                      <Text\n                        weight=\"bold\"\n                        size={3}\n                        textOverflow=\"ellipsis\"\n                        style={{maxWidth: '170px', cursor: 'pointer', padding: '4px 0'}}\n                        title={\n                          optimisticTitles[q._key] ||\n                          q.title ||\n                          q._key.slice(q._key.length - 5, q._key.length)\n                        }\n                        onClick={() => {\n                          setEditingKey(q._key)\n                          setEditingTitle(q.title || q._key.slice(0, 5))\n                        }}\n                      >\n                        {optimisticTitles[q._key] ||\n                          q.title ||\n                          q._key.slice(q._key.length - 5, q._key.length)}\n                      </Text>\n                    )}\n                    {isEdited && (\n                      <Box\n                        style={{\n                          width: '6px',\n                          height: '6px',\n                          borderRadius: '50%',\n                          backgroundColor: 'var(--card-focus-ring-color)',\n                        }}\n                      />\n                    )}\n                  </Flex>\n                  <MenuButton\n                    button={<ContextMenuButton />}\n                    id={`${q._key}-menu`}\n                    menu={\n                      <Menu\n                      // style={{background: 'white', backgroundColor: 'white', borderRadius: '11%'}}\n                      >\n                        <MenuItem\n                          tone=\"critical\"\n                          padding={3}\n                          icon={TrashIcon}\n                          text={t('action.delete')}\n                          onClick={(event) => {\n                            event.stopPropagation()\n                            deleteQuery(q._key)\n                          }}\n                        />\n                      </Menu>\n                    }\n                    popover={{portal: true, placement: 'bottom-end', tone: 'default'}}\n                  />\n                </Flex>\n\n                <Code muted>{queryObj?.query.split('{')[0]}</Code>\n\n                <Flex align=\"center\" gap={1}>\n                  <Text size={1} muted>\n                    {formatDate.format(new Date(q.savedAt || ''))}\n                  </Text>\n                </Flex>\n\n                {isEdited && (\n                  <Button\n                    mode=\"ghost\"\n                    tone=\"default\"\n                    size={1}\n                    padding={2}\n                    style={{\n                      height: '24px',\n                      position: 'absolute',\n                      right: '16px',\n                      bottom: '16px',\n                      fontSize: '12px',\n                    }}\n                    text={t('action.update')}\n                    onClick={(e) => {\n                      e.stopPropagation()\n                      handleUpdate(q)\n                    }}\n                  />\n                )}\n              </Stack>\n            </Card>\n          )\n        })}\n      </Stack>\n    </ScrollContainer>\n  )\n}\n","import {useEffect, useState} from 'react'\n\ninterface PaneSizeOptions {\n  defaultSize: number\n  size?: number\n  allowResize: boolean\n  minSize: number\n  maxSize: number\n}\nfunction narrowBreakpoint(): boolean {\n  return typeof window !== 'undefined' && window.innerWidth > 600\n}\n\nfunction calculatePaneSizeOptions(height: number | undefined): PaneSizeOptions {\n  let rootHeight = height\n\n  if (!rootHeight) {\n    // Initial root height without header\n    rootHeight =\n      typeof window !== 'undefined' && typeof document !== 'undefined'\n        ? document.body.getBoundingClientRect().height - 60\n        : 0\n  }\n  return {\n    defaultSize: rootHeight / (narrowBreakpoint() ? 2 : 1),\n    size: rootHeight > 550 ? undefined : rootHeight * 0.4,\n    allowResize: rootHeight > 550,\n    minSize: Math.min(170, Math.max(170, rootHeight / 2)),\n    maxSize: rootHeight > 650 ? rootHeight * 0.7 : rootHeight * 0.6,\n  }\n}\n\nexport function usePaneSize({\n  visionRootRef,\n}: {\n  visionRootRef: React.RefObject<HTMLDivElement | null>\n}) {\n  const [isNarrowBreakpoint, setIsNarrowBreakpoint] = useState(() => narrowBreakpoint())\n  const [paneSizeOptions, setPaneSizeOptions] = useState<PaneSizeOptions>(() =>\n    calculatePaneSizeOptions(undefined),\n  )\n\n  useEffect(() => {\n    if (!visionRootRef.current) {\n      return undefined\n    }\n    const handleResize = (entries: ResizeObserverEntry[]) => {\n      setIsNarrowBreakpoint(narrowBreakpoint())\n      const entry = entries?.[0]\n      if (entry) {\n        setPaneSizeOptions(calculatePaneSizeOptions(entry.contentRect.height))\n      }\n    }\n    const resizeObserver = new ResizeObserver(handleResize)\n    resizeObserver.observe(visionRootRef.current)\n\n    return () => {\n      resizeObserver.disconnect()\n    }\n  }, [visionRootRef])\n\n  return {paneSizeOptions, isNarrowBreakpoint}\n}\n","import {PlayIcon, StopIcon} from '@sanity/icons'\nimport {Box, Button, Card, Flex, Hotkeys, Text, Tooltip} from '@sanity/ui'\nimport {useTranslation} from 'sanity'\n\nimport {visionLocaleNamespace} from '../i18n'\nimport {ControlsContainer} from './VisionGui.styled'\n\nexport interface VisionGuiControlsProps {\n  hasValidParams: boolean\n  queryInProgress: boolean\n  listenInProgress: boolean\n  onQueryExecution: () => void\n  onListenExecution: () => void\n}\n\n/**\n * Vision GUI controls\n * To handle query and listen execution.\n */\nexport function VisionGuiControls({\n  hasValidParams,\n  listenInProgress,\n  queryInProgress,\n  onQueryExecution,\n  onListenExecution,\n}: VisionGuiControlsProps) {\n  const {t} = useTranslation(visionLocaleNamespace)\n\n  return (\n    <ControlsContainer>\n      <Card padding={3} paddingX={3}>\n        <Tooltip\n          content={\n            <Card radius={4}>\n              <Text size={1} muted>\n                {t('params.error.params-invalid-json')}\n              </Text>\n            </Card>\n          }\n          placement=\"top\"\n          disabled={hasValidParams}\n          portal\n        >\n          <Flex justify=\"space-evenly\">\n            <Box flex={1}>\n              <Tooltip\n                content={\n                  <Card radius={4}>\n                    <Hotkeys keys={['Ctrl', 'Enter']} />\n                  </Card>\n                }\n                placement=\"top\"\n                portal\n              >\n                <Button\n                  width=\"fill\"\n                  onClick={onQueryExecution}\n                  type=\"button\"\n                  icon={queryInProgress ? StopIcon : PlayIcon}\n                  disabled={listenInProgress || !hasValidParams}\n                  tone={queryInProgress ? 'positive' : 'primary'}\n                  text={queryInProgress ? t('action.query-cancel') : t('action.query-execute')}\n                />\n              </Tooltip>\n            </Box>\n            <Box flex={1} marginLeft={3}>\n              <Button\n                width=\"fill\"\n                onClick={onListenExecution}\n                type=\"button\"\n                icon={listenInProgress ? StopIcon : PlayIcon}\n                text={listenInProgress ? t('action.listen-cancel') : t('action.listen-execute')}\n                mode=\"ghost\"\n                disabled={!hasValidParams}\n                tone={listenInProgress ? 'positive' : 'default'}\n              />\n            </Box>\n          </Flex>\n        </Tooltip>\n      </Card>\n    </ControlsContainer>\n  )\n}\n","import {Box} from '@sanity/ui'\nimport {styled} from 'styled-components'\n\nexport const PerspectivePopoverContent = styled(Box)`\n  /* This limits the width of the popover content */\n  max-width: 240px;\n`\n\nexport const PerspectivePopoverLink = styled.a`\n  cursor: pointer;\n  margin-right: auto;\n`\n","import {HelpCircleIcon} from '@sanity/icons'\nimport {\n  Badge,\n  Box,\n  Button,\n  Card,\n  type CardTone,\n  Inline,\n  Popover,\n  Stack,\n  Text,\n  useClickOutsideEvent,\n} from '@sanity/ui'\nimport {useCallback, useRef, useState} from 'react'\nimport {Translate, useTranslation} from 'sanity'\nimport {styled} from 'styled-components'\n\nimport {visionLocaleNamespace} from '../i18n'\nimport {PerspectivePopoverContent, PerspectivePopoverLink} from './PerspectivePopover.styled'\n\nconst Dot = styled.div<{$tone: CardTone}>`\n  width: 4px;\n  height: 4px;\n  border-radius: 3px;\n  box-shadow: 0 0 0 1px var(--card-bg-color);\n  background-color: ${({$tone}) => `var(--card-badge-${$tone}-dot-color)`};\n`\n\nconst SHOW_DEFAULT_PERSPECTIVE_NOTIFICATION = false\n\nexport function PerspectivePopover() {\n  const [open, setOpen] = useState(false)\n  const buttonRef = useRef<HTMLButtonElement | null>(null)\n  const popoverRef = useRef<HTMLDivElement | null>(null)\n\n  const handleClick = useCallback(() => setOpen((o) => !o), [])\n\n  const {t} = useTranslation(visionLocaleNamespace)\n\n  useClickOutsideEvent(\n    () => setOpen(false),\n    () => [buttonRef.current, popoverRef.current],\n  )\n\n  return (\n    <Popover\n      content={\n        <PerspectivePopoverContent>\n          <Stack space={4}>\n            <Inline space={2}>\n              <Text weight=\"medium\">{t('settings.perspectives.title')}</Text>\n            </Inline>\n\n            <Card>\n              <Text muted>{t('settings.perspectives.description')}</Text>\n            </Card>\n            <Card>\n              <Stack space={2}>\n                <Box>\n                  <Badge tone=\"primary\">{t('label.new')}</Badge>\n                </Box>\n                <Text muted>\n                  <Translate\n                    t={t}\n                    i18nKey=\"settings.perspective.preview-drafts-renamed-to-drafts.description\"\n                  />\n                </Text>\n              </Stack>\n            </Card>\n            {SHOW_DEFAULT_PERSPECTIVE_NOTIFICATION ? (\n              <Card>\n                <Badge tone=\"caution\">{t('label.new')}</Badge>\n                <Card>\n                  <Text muted>\n                    <Translate t={t} i18nKey=\"settings.perspectives.new-default.description\" />\n                  </Text>\n                </Card>\n              </Card>\n            ) : null}\n\n            <Card>\n              <Text>\n                <PerspectivePopoverLink href=\"https://sanity.io/docs/perspectives\" target=\"_blank\">\n                  {t('settings.perspectives.action.docs-link')} &rarr;\n                </PerspectivePopoverLink>\n              </Text>\n            </Card>\n          </Stack>\n        </PerspectivePopoverContent>\n      }\n      placement=\"bottom-start\"\n      portal\n      padding={3}\n      ref={popoverRef}\n      open={open}\n    >\n      <Button\n        icon={HelpCircleIcon}\n        mode=\"bleed\"\n        padding={2}\n        paddingRight={1}\n        tone=\"primary\"\n        fontSize={1}\n        ref={buttonRef}\n        onClick={handleClick}\n        selected={open}\n      >\n        <Dot $tone={SHOW_DEFAULT_PERSPECTIVE_NOTIFICATION ? 'caution' : 'primary'} />\n      </Button>\n    </Popover>\n  )\n}\n","import {CopyIcon} from '@sanity/icons'\nimport {Box, Button, Card, Flex, Grid, Inline, Select, Stack, TextInput, Tooltip} from '@sanity/ui'\nimport {\n  type ChangeEvent,\n  type ComponentType,\n  Fragment,\n  type RefObject,\n  useCallback,\n  useMemo,\n  useRef,\n} from 'react'\nimport {type PerspectiveContextValue, type TFunction, usePerspective, useTranslation} from 'sanity'\n\nimport {API_VERSIONS} from '../apiVersions'\nimport {visionLocaleNamespace} from '../i18n'\nimport {\n  hasPinnedPerspective,\n  SUPPORTED_PERSPECTIVES,\n  type SupportedPerspective,\n} from '../perspectives'\nimport {PerspectivePopover} from './PerspectivePopover'\nimport {Header, QueryCopyLink, StyledLabel} from './VisionGui.styled'\n\nconst PinnedReleasePerspectiveOption: ComponentType<{\n  pinnedPerspective: PerspectiveContextValue\n  t: TFunction\n}> = ({pinnedPerspective, t}) => {\n  const name =\n    typeof pinnedPerspective.selectedPerspective === 'object'\n      ? pinnedPerspective.selectedPerspective.metadata.title\n      : pinnedPerspective.selectedPerspectiveName\n\n  const label = hasPinnedPerspective(pinnedPerspective)\n    ? `(${t('settings.perspectives.pinned-release-label')})`\n    : t('settings.perspectives.pinned-release-label')\n\n  const text = useMemo(\n    () => [name, label].filter((value) => typeof value !== 'undefined').join(' '),\n    [label, name],\n  )\n\n  return (\n    <option value=\"pinnedRelease\" disabled={!hasPinnedPerspective(pinnedPerspective)}>\n      {text}\n    </option>\n  )\n}\n\nexport interface VisionGuiHeaderProps {\n  onChangeDataset: (evt: ChangeEvent<HTMLSelectElement>) => void\n  dataset: string\n  customApiVersion: string | false\n  apiVersion: string\n  onChangeApiVersion: (evt: ChangeEvent<HTMLSelectElement>) => void\n  datasets: string[]\n  customApiVersionElementRef: RefObject<HTMLInputElement | null>\n  onCustomApiVersionChange: (evt: ChangeEvent<HTMLInputElement>) => void\n  isValidApiVersion: boolean\n  onChangePerspective: (evt: ChangeEvent<HTMLSelectElement>) => void\n  url?: string\n  perspective?: SupportedPerspective\n}\n\nexport function VisionGuiHeader({\n  onChangeDataset,\n  dataset,\n  customApiVersion,\n  apiVersion,\n  onChangeApiVersion,\n  datasets,\n  customApiVersionElementRef,\n  onCustomApiVersionChange,\n  isValidApiVersion,\n  onChangePerspective,\n  url,\n  perspective,\n}: VisionGuiHeaderProps) {\n  const pinnedPerspective = usePerspective()\n  const {t} = useTranslation(visionLocaleNamespace)\n  const operationUrlElement = useRef<HTMLInputElement | null>(null)\n  const handleCopyUrl = useCallback(() => {\n    const el = operationUrlElement.current\n    if (!el) return\n\n    try {\n      el.select()\n      document.execCommand('copy')\n    } catch (err) {\n      // eslint-disable-next-line no-console\n      console.error('Unable to copy to clipboard :(')\n    }\n  }, [])\n\n  return (\n    <Header paddingX={3} paddingY={2}>\n      <Grid columns={[1, 4, 8, 12]}>\n        {/* Dataset selector */}\n        <Box padding={1} column={2}>\n          <Stack>\n            <Card paddingTop={2} paddingBottom={3}>\n              <StyledLabel>{t('settings.dataset-label')}</StyledLabel>\n            </Card>\n            <Select value={dataset} onChange={onChangeDataset}>\n              {datasets.map((ds: string) => (\n                <option key={ds}>{ds}</option>\n              ))}\n            </Select>\n          </Stack>\n        </Box>\n\n        {/* API version selector */}\n        <Box padding={1} column={2}>\n          <Stack>\n            <Card paddingTop={2} paddingBottom={3}>\n              <StyledLabel>{t('settings.api-version-label')}</StyledLabel>\n            </Card>\n            <Select\n              data-testid=\"api-version-selector\"\n              value={customApiVersion === false ? apiVersion : 'other'}\n              onChange={onChangeApiVersion}\n            >\n              {API_VERSIONS.map((version) => (\n                <option key={version}>{version}</option>\n              ))}\n              <option key=\"other\" value=\"other\">\n                {t('settings.other-api-version-label')}\n              </option>\n            </Select>\n          </Stack>\n        </Box>\n\n        {/* Custom API version input */}\n        {customApiVersion !== false && (\n          <Box padding={1} column={2}>\n            <Stack>\n              <Card paddingTop={2} paddingBottom={3}>\n                <StyledLabel textOverflow=\"ellipsis\">\n                  {t('settings.custom-api-version-label')}\n                </StyledLabel>\n              </Card>\n\n              <TextInput\n                ref={customApiVersionElementRef}\n                value={customApiVersion}\n                onChange={onCustomApiVersionChange}\n                customValidity={\n                  isValidApiVersion ? undefined : t('settings.error.invalid-api-version')\n                }\n                maxLength={11}\n              />\n            </Stack>\n          </Box>\n        )}\n\n        {/* Perspective selector */}\n        <Box padding={1} column={2}>\n          <Stack>\n            <Card paddingBottom={1}>\n              <Inline space={1}>\n                <Box>\n                  <StyledLabel>{t('settings.perspective-label')}</StyledLabel>\n                </Box>\n\n                <Box>\n                  <PerspectivePopover />\n                </Box>\n              </Inline>\n            </Card>\n            <Select value={perspective || 'default'} onChange={onChangePerspective}>\n              {SUPPORTED_PERSPECTIVES.map((perspectiveName) => {\n                if (perspectiveName === 'pinnedRelease') {\n                  return (\n                    <Fragment key=\"pinnedRelease\">\n                      <PinnedReleasePerspectiveOption pinnedPerspective={pinnedPerspective} t={t} />\n                      <option key=\"default\" value=\"default\">\n                        {t('settings.perspectives.default')}\n                      </option>\n                      <hr />\n                    </Fragment>\n                  )\n                }\n                return <option key={perspectiveName}>{perspectiveName}</option>\n              })}\n            </Select>\n          </Stack>\n        </Box>\n\n        {/* Query URL (for copying) */}\n        {typeof url === 'string' ? (\n          <Box padding={1} flex={1} column={customApiVersion === false ? 6 : 4}>\n            <Stack>\n              <Card paddingTop={2} paddingBottom={3}>\n                <StyledLabel>\n                  {t('query.url')}&nbsp;\n                  <QueryCopyLink onClick={handleCopyUrl}>\n                    [{t('action.copy-url-to-clipboard')}]\n                  </QueryCopyLink>\n                </StyledLabel>\n              </Card>\n              <Flex flex={1} gap={1}>\n                <Box flex={1}>\n                  <TextInput readOnly type=\"url\" ref={operationUrlElement} value={url} />\n                </Box>\n                <Tooltip content={t('action.copy-url-to-clipboard')}>\n                  <Button\n                    aria-label={t('action.copy-url-to-clipboard')}\n                    type=\"button\"\n                    mode=\"ghost\"\n                    icon={CopyIcon}\n                    onClick={handleCopyUrl}\n                  />\n                </Tooltip>\n              </Flex>\n            </Stack>\n          </Box>\n        ) : (\n          <Box flex={1} />\n        )}\n      </Grid>\n    </Header>\n  )\n}\n","import {json2csv} from 'json-2-csv'\n\nfunction getBlobUrl(content: string, mimeType: string): string {\n  return URL.createObjectURL(\n    new Blob([content], {\n      type: mimeType,\n    }),\n  )\n}\n\nfunction getMemoizedBlobUrlResolver(mimeType: string, stringEncoder: (input: any) => string) {\n  return (() => {\n    let prevResult = ''\n    let prevContent = ''\n    return (input: unknown) => {\n      const content = stringEncoder(input)\n      if (typeof content !== 'string' || content === '') {\n        return undefined\n      }\n\n      if (content === prevContent) {\n        return prevResult\n      }\n\n      prevContent = content\n      if (prevResult) {\n        URL.revokeObjectURL(prevResult)\n      }\n\n      prevResult = getBlobUrl(content, mimeType)\n      return prevResult\n    }\n  })()\n}\n\nexport const getJsonBlobUrl = getMemoizedBlobUrlResolver('application/json', (input) =>\n  JSON.stringify(input, null, 2),\n)\n\nexport const getCsvBlobUrl = getMemoizedBlobUrlResolver('text/csv', (input) => {\n  return json2csv(Array.isArray(input) ? input : [input]).trim()\n})\n","import {Code} from '@sanity/ui'\nimport {styled} from 'styled-components'\n\nexport const ErrorCode = styled(Code)`\n  color: ${({theme}) => theme.sanity.color.muted.critical.enabled.fg};\n`\n","import {Box} from '@sanity/ui'\nimport {useTranslation} from 'sanity'\n\nimport {visionLocaleNamespace} from '../i18n'\nimport {ErrorCode} from './QueryErrorDialog.styled'\n\ninterface ContentLakeQueryError {\n  details: {\n    query: string\n    start: number\n    end: number\n\n    lineNumber?: number\n    column?: number\n  }\n}\n\nexport function QueryErrorDetails({error}: {error: ContentLakeQueryError | Error}) {\n  const {t} = useTranslation(visionLocaleNamespace)\n\n  if (!('details' in error)) {\n    return null\n  }\n\n  const details = {...error.details, ...mapToLegacyDetails(error.details)}\n  if (!details.line) {\n    return null\n  }\n\n  return (\n    <div>\n      <ErrorCode size={1}>{`${details.line}\\n${dashLine(\n        details.column,\n        details.columnEnd,\n      )}`}</ErrorCode>\n      <Box marginTop={4}>\n        <ErrorCode size={1}>{`${t('query.error.line')}:   ${details.lineNumber}\\n${t(\n          'query.error.column',\n        )}: ${details.column}`}</ErrorCode>\n      </Box>\n    </div>\n  )\n}\n\nfunction mapToLegacyDetails(details: ContentLakeQueryError['details']) {\n  if (!details || typeof details.query !== 'string' || typeof details.start !== 'number') {\n    return {}\n  }\n\n  const {query, start, end} = details\n  const lineStart = query.slice(0, start).lastIndexOf('\\n') + 1\n  const lineNumber = (query.slice(0, lineStart).match(/\\n/g) || []).length\n  const line = query.slice(lineStart, query.indexOf('\\n', lineStart))\n  const column = start - lineStart\n  const columnEnd = typeof end === 'number' ? end - lineStart : undefined\n\n  return {line, lineNumber, column, columnEnd}\n}\n\nfunction dashLine(column: number, columnEnd: number | undefined): string {\n  const line = '-'.repeat(column)\n  const hats = `^`.repeat(columnEnd ? columnEnd - column : 1)\n  return `${line}${hats}`\n}\n","import {Stack} from '@sanity/ui'\n\nimport {QueryErrorDetails} from './QueryErrorDetails'\nimport {ErrorCode} from './QueryErrorDialog.styled'\n\nexport function QueryErrorDialog(props: {error: Error}) {\n  return (\n    <Stack space={5} marginTop={2}>\n      <ErrorCode size={1}>{props.error.message}</ErrorCode>\n      <QueryErrorDetails error={props.error} />\n    </Stack>\n  )\n}\n","import {rem, type Theme} from '@sanity/ui'\nimport {css, styled} from 'styled-components'\n\nexport const ResultViewWrapper = styled.div<{theme: Theme}>(({theme}) => {\n  const {color, fonts, space} = theme.sanity\n\n  return css`\n    & .json-inspector,\n    & .json-inspector .json-inspector__selection {\n      font-family: ${fonts.code.family};\n      font-size: ${fonts.code.sizes[2].fontSize}px;\n      line-height: ${fonts.code.sizes[2].lineHeight}px;\n      color: var(--card-code-fg-color);\n    }\n\n    & .json-inspector .json-inspector__leaf {\n      padding-left: ${rem(space[4])};\n    }\n\n    & .json-inspector .json-inspector__leaf.json-inspector__leaf_root {\n      padding-top: ${rem(space[0])};\n      padding-left: 0;\n    }\n\n    & .json-inspector > .json-inspector__leaf_root > .json-inspector__line > .json-inspector__key {\n      display: none;\n    }\n\n    & .json-inspector .json-inspector__line {\n      display: block;\n      position: relative;\n      cursor: default;\n    }\n\n    & .json-inspector .json-inspector__line::after {\n      content: '';\n      position: absolute;\n      top: 0;\n      left: -200px;\n      right: -50px;\n      bottom: 0;\n      z-index: -1;\n      pointer-events: none;\n    }\n\n    & .json-inspector .json-inspector__line:hover::after {\n      background: var(--card-code-bg-color);\n    }\n\n    & .json-inspector .json-inspector__leaf_composite > .json-inspector__line {\n      cursor: pointer;\n    }\n\n    & .json-inspector .json-inspector__leaf_composite > .json-inspector__line::before {\n      content: '▸ ';\n      margin-left: calc(0px - ${rem(space[4])});\n      font-size: ${fonts.code.sizes[2].fontSize}px;\n      line-height: ${fonts.code.sizes[2].lineHeight}px;\n    }\n\n    &\n      .json-inspector\n      .json-inspector__leaf_expanded.json-inspector__leaf_composite\n      > .json-inspector__line::before {\n      content: '▾ ';\n      font-size: ${fonts.code.sizes[2].fontSize}px;\n      line-height: ${fonts.code.sizes[2].lineHeight}px;\n    }\n\n    & .json-inspector .json-inspector__radio,\n    & .json-inspector .json-inspector__flatpath {\n      display: none;\n    }\n\n    & .json-inspector .json-inspector__value {\n      margin-left: ${rem(space[4] / 2)};\n    }\n\n    &\n      .json-inspector\n      > .json-inspector__leaf_root\n      > .json-inspector__line\n      > .json-inspector__key\n      + .json-inspector__value {\n      margin: 0;\n    }\n\n    & .json-inspector .json-inspector__key {\n      color: ${color.syntax.property};\n    }\n\n    & .json-inspector .json-inspector__value_helper,\n    & .json-inspector .json-inspector__value_null {\n      color: ${color.syntax.constant};\n    }\n\n    & .json-inspector .json-inspector__not-found {\n      padding-top: ${rem(space[2])};\n    }\n\n    & .json-inspector .json-inspector__value_string {\n      color: ${color.syntax.string};\n      word-break: break-word;\n    }\n\n    & .json-inspector .json-inspector__value_boolean {\n      color: ${color.syntax.boolean};\n    }\n\n    & .json-inspector .json-inspector__value_number {\n      color: ${color.syntax.number};\n    }\n\n    & .json-inspector .json-inspector__show-original {\n      display: inline-block;\n      padding: 0 6px;\n      cursor: pointer;\n    }\n\n    & .json-inspector .json-inspector__show-original:hover {\n      color: inherit;\n    }\n\n    & .json-inspector .json-inspector__show-original::before {\n      content: '↔';\n    }\n\n    & .json-inspector .json-inspector__show-original:hover::after {\n      content: ' expand';\n    }\n  `\n})\n","import {JsonInspector} from '@rexxars/react-json-inspector'\nimport {LinkIcon} from '@sanity/icons'\nimport {Code} from '@sanity/ui'\nimport LRU from 'quick-lru'\nimport {useDataset} from 'sanity'\nimport {IntentLink} from 'sanity/router'\n\nimport {ResultViewWrapper} from './ResultView.styled'\n\nconst lru = new LRU({maxSize: 50000})\n\nexport function ResultView(props: {data: unknown; datasetName: string}): React.JSX.Element {\n  const {data, datasetName} = props\n  const workspaceDataset = useDataset()\n\n  if (isRecord(data) || Array.isArray(data)) {\n    return (\n      <ResultViewWrapper>\n        <JsonInspector\n          data={data}\n          search={false}\n          isExpanded={isExpanded}\n          onClick={toggleExpanded}\n          interactiveLabel={workspaceDataset === datasetName ? DocumentEditLabel : undefined}\n        />\n      </ResultViewWrapper>\n    )\n  }\n\n  return <Code language=\"json\">{JSON.stringify(data)}</Code>\n}\n\nfunction DocumentEditLabel(props: {value: string; isKey: boolean; keypath: string}) {\n  if (props.isKey || (!props.keypath.endsWith('_id') && !props.keypath.endsWith('_ref'))) {\n    return null\n  }\n\n  return (\n    <IntentLink intent=\"edit\" params={{id: props.value}}>\n      <LinkIcon />\n    </IntentLink>\n  )\n}\n\nfunction isExpanded(keyPath: string, value: unknown): boolean {\n  const depthLimit = 4\n  const cached = lru.get(keyPath) as boolean | undefined\n\n  if (typeof cached === 'boolean') {\n    return cached\n  }\n\n  const segments = keyPath.split('.', depthLimit)\n  if (segments.length === depthLimit) {\n    return false\n  }\n\n  if (Array.isArray(value)) {\n    return true\n  }\n\n  return isRecord(value) && !segments.some((key) => isArrayKeyOverLimit(key))\n}\n\nfunction toggleExpanded(event: {path: string}): void {\n  const {path} = event\n  const current = lru.get(path)\n\n  if (current === undefined) {\n    // something is wrong\n    return\n  }\n\n  lru.set(path, !current)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n  return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\nconst numeric = /^\\d+$/\nfunction isArrayKeyOverLimit(segment: string, limit = 10) {\n  return numeric.test(segment) && parseInt(segment, 10) > limit\n}\n","import {DocumentSheetIcon} from '@sanity/icons'\nimport {Button, Tooltip} from '@sanity/ui'\nimport {type MouseEvent} from 'react'\nimport {useTranslation} from 'sanity'\n\nimport {visionLocaleNamespace} from '../i18n'\n\ninterface SaveButtonProps {\n  blobUrl: string | undefined\n}\n\nfunction preventSave(evt: MouseEvent<HTMLButtonElement>) {\n  return evt.preventDefault()\n}\n\nexport function SaveCsvButton({blobUrl}: SaveButtonProps) {\n  const {t} = useTranslation(visionLocaleNamespace)\n  const isDisabled = !blobUrl\n\n  const button = (\n    <Button\n      as=\"a\"\n      disabled={isDisabled}\n      download={isDisabled ? undefined : 'query-result.csv'}\n      href={blobUrl}\n      icon={DocumentSheetIcon}\n      mode=\"ghost\"\n      onClick={isDisabled ? preventSave : undefined}\n      // eslint-disable-next-line @sanity/i18n/no-attribute-string-literals\n      text=\"CSV\" // String is a File extension\n      tone=\"default\"\n    />\n  )\n\n  return isDisabled ? (\n    <Tooltip content={t('result.save-result-as-csv.not-csv-encodable')} placement=\"top\">\n      {button}\n    </Tooltip>\n  ) : (\n    button\n  )\n}\n\nexport function SaveJsonButton({blobUrl}: SaveButtonProps) {\n  return (\n    <Button\n      as=\"a\"\n      download={'query-result.json'}\n      href={blobUrl}\n      icon={DocumentSheetIcon}\n      mode=\"ghost\"\n      // eslint-disable-next-line @sanity/i18n/no-attribute-string-literals\n      text=\"JSON\" // String is a File extension\n      tone=\"default\"\n    />\n  )\n}\n","/* eslint-disable complexity */\nimport {type MutationEvent} from '@sanity/client'\nimport {Box, Text} from '@sanity/ui'\nimport {Translate, useTranslation} from 'sanity'\n\nimport {visionLocaleNamespace} from '../i18n'\nimport {getCsvBlobUrl, getJsonBlobUrl} from '../util/getBlobUrl'\nimport {DelayedSpinner} from './DelayedSpinner'\nimport {QueryErrorDialog} from './QueryErrorDialog'\nimport {ResultView} from './ResultView'\nimport {SaveCsvButton, SaveJsonButton} from './SaveResultButtons'\nimport {\n  DownloadsCard,\n  InputBackgroundContainer,\n  Result,\n  ResultContainer,\n  ResultFooter,\n  ResultInnerContainer,\n  ResultOuterContainer,\n  SaveResultLabel,\n  StyledLabel,\n  TimingsCard,\n  TimingsTextContainer,\n} from './VisionGui.styled'\n\ninterface VisionGuiResultProps {\n  error?: Error | undefined\n  queryInProgress: boolean\n  queryResult?: unknown | undefined\n  listenInProgress: boolean\n  listenMutations: MutationEvent[]\n  dataset: string\n  queryTime: number | undefined\n  e2eTime: number | undefined\n}\n\nexport function VisionGuiResult({\n  error,\n  queryInProgress,\n  queryResult,\n  listenInProgress,\n  listenMutations,\n  dataset,\n  queryTime,\n  e2eTime,\n}: VisionGuiResultProps) {\n  const {t} = useTranslation(visionLocaleNamespace)\n  const hasResult = !error && !queryInProgress && typeof queryResult !== 'undefined'\n\n  const jsonUrl = hasResult ? getJsonBlobUrl(queryResult) : ''\n  const csvUrl = hasResult ? getCsvBlobUrl(queryResult) : ''\n\n  return (\n    <ResultOuterContainer direction=\"column\" data-testid=\"vision-result\">\n      <ResultInnerContainer flex={1}>\n        <ResultContainer\n          flex={1}\n          overflow=\"hidden\"\n          tone={error ? 'critical' : 'default'}\n          $isInvalid={Boolean(error)}\n        >\n          <Result overflow=\"auto\">\n            <InputBackgroundContainer>\n              <Box marginLeft={3}>\n                <StyledLabel muted>{t('result.label')}</StyledLabel>\n              </Box>\n            </InputBackgroundContainer>\n            <Box padding={3} paddingTop={5}>\n              {(queryInProgress || (listenInProgress && listenMutations.length === 0)) && (\n                <Box marginTop={3}>\n                  <DelayedSpinner />\n                </Box>\n              )}\n              {error && <QueryErrorDialog error={error} />}\n              {hasResult && <ResultView data={queryResult} datasetName={dataset} />}\n              {listenInProgress && listenMutations.length > 0 && (\n                <ResultView data={listenMutations} datasetName={dataset} />\n              )}\n            </Box>\n          </Result>\n        </ResultContainer>\n      </ResultInnerContainer>\n      {/* Execution time */}\n      <ResultFooter justify=\"space-between\" direction={['column', 'column', 'row']}>\n        <TimingsCard paddingX={4} paddingY={3} sizing=\"border\">\n          <TimingsTextContainer align=\"center\">\n            <Box>\n              <Text muted>\n                {t('result.execution-time-label')}:{' '}\n                {typeof queryTime === 'number'\n                  ? `${queryTime}ms`\n                  : t('result.timing-not-applicable')}\n              </Text>\n            </Box>\n            <Box marginLeft={4}>\n              <Text muted>\n                {t('result.end-to-end-time-label')}:{' '}\n                {typeof e2eTime === 'number' ? `${e2eTime}ms` : t('result.timing-not-applicable')}\n              </Text>\n            </Box>\n          </TimingsTextContainer>\n        </TimingsCard>\n\n        {hasResult && (\n          <DownloadsCard paddingX={4} paddingY={3} sizing=\"border\">\n            <SaveResultLabel muted>\n              <Translate\n                components={{\n                  SaveResultButtons: () => (\n                    <>\n                      <SaveJsonButton blobUrl={jsonUrl} />\n                      <SaveCsvButton blobUrl={csvUrl} />\n                    </>\n                  ),\n                }}\n                i18nKey=\"result.save-result-as-format\"\n                t={t}\n              />\n            </SaveResultLabel>\n          </DownloadsCard>\n        )}\n      </ResultFooter>\n    </ResultOuterContainer>\n  )\n}\n","/* eslint-disable max-statements */\nimport {SplitPane} from '@rexxars/react-split-pane'\nimport {\n  type ClientPerspective,\n  type ListenEvent,\n  type MutationEvent,\n  type StackablePerspective,\n} from '@sanity/client'\nimport {ChevronLeftIcon, ChevronRightIcon} from '@sanity/icons'\nimport {Box, Button, Flex, useToast} from '@sanity/ui'\nimport {isHotkey} from 'is-hotkey-esm'\nimport {type ChangeEvent, useCallback, useEffect, useMemo, useRef, useState} from 'react'\nimport {useClient, usePerspective, useTranslation} from 'sanity'\nimport {useEffectEvent} from 'use-effect-event'\n\nimport {API_VERSIONS, DEFAULT_API_VERSION} from '../apiVersions'\nimport {VisionCodeMirror, type VisionCodeMirrorHandle} from '../codemirror/VisionCodeMirror'\nimport {visionLocaleNamespace} from '../i18n'\nimport {\n  getActivePerspective,\n  isSupportedPerspective,\n  isVirtualPerspective,\n  type SupportedPerspective,\n} from '../perspectives'\nimport {type VisionProps} from '../types'\nimport {encodeQueryString} from '../util/encodeQueryString'\nimport {getLocalStorage} from '../util/localStorage'\nimport {parseApiQueryString, type ParsedApiQueryString} from '../util/parseApiQueryString'\nimport {prefixApiVersion} from '../util/prefixApiVersion'\nimport {validateApiVersion} from '../util/validateApiVersion'\nimport {ParamsEditor, parseParams} from './ParamsEditor'\nimport {QueryRecall} from './QueryRecall'\nimport {usePaneSize} from './usePaneSize'\nimport {\n  InputBackgroundContainerLeft,\n  InputContainer,\n  Root,\n  SplitpaneContainer,\n  StyledLabel,\n} from './VisionGui.styled'\nimport {VisionGuiControls} from './VisionGuiControls'\nimport {VisionGuiHeader} from './VisionGuiHeader'\nimport {VisionGuiResult} from './VisionGuiResult'\n\nfunction nodeContains(node: Node, other: EventTarget | Node | null): boolean {\n  if (!node || !other) {\n    return false\n  }\n\n  // eslint-disable-next-line no-bitwise\n  return node === other || !!(node.compareDocumentPosition(other as Node) & 16)\n}\n\nconst sanityUrl =\n  /\\.(?:api|apicdn)\\.sanity\\.(?:io|work)\\/(vX|v1|v\\d{4}-\\d\\d-\\d\\d)\\/.*?(?:query|listen)\\/(.*?)\\?(.*)/\n\nconst isRunHotkey = (event: KeyboardEvent) =>\n  isHotkey('ctrl+enter', event) || isHotkey('mod+enter', event)\n\ninterface Subscription {\n  unsubscribe: () => void\n}\nexport interface Params {\n  raw: string\n  parsed: Record<string, unknown> | undefined\n  valid: boolean\n  error: string | undefined\n}\n\ninterface QueryExecutionOptions {\n  apiVersion?: string\n  dataset?: string\n  perspective?: SupportedPerspective\n  query?: string\n  params?: Record<string, unknown>\n}\n\ninterface VisionGuiProps extends VisionProps {\n  datasets: string[]\n  projectId: string | undefined\n  defaultDataset: string\n}\n\nexport interface ParsedUrlState {\n  query: string\n  params: Record<string, unknown>\n  rawParams: string\n  dataset: string\n  apiVersion: string\n  customApiVersion: string | false | undefined\n  perspective: SupportedPerspective\n  url: string\n}\n\nexport function VisionGui(props: VisionGuiProps) {\n  const {datasets, config, projectId, defaultDataset} = props\n  const toast = useToast()\n  const {t} = useTranslation(visionLocaleNamespace)\n  const {perspectiveStack} = usePerspective()\n\n  const defaultApiVersion = prefixApiVersion(`${config.defaultApiVersion}`)\n  const editorQueryRef = useRef<VisionCodeMirrorHandle>(null)\n  const editorParamsRef = useRef<VisionCodeMirrorHandle>(null)\n  const visionRootRef = useRef<HTMLDivElement | null>(null)\n  const customApiVersionElementRef = useRef<HTMLInputElement | null>(null)\n  const querySubscriptionRef = useRef<Subscription | undefined>(undefined)\n  const listenSubscriptionRef = useRef<Subscription | undefined>(undefined)\n\n  const [localStorage] = useState(() => getLocalStorage(projectId || 'default'))\n\n  const {storedDataset, storedApiVersion, storedQuery, storedParams, storedPerspective} =\n    useMemo(() => {\n      return {\n        storedDataset: localStorage.get('dataset', defaultDataset),\n        storedApiVersion: localStorage.get('apiVersion', defaultApiVersion),\n        storedQuery: localStorage.get('query', ''),\n        storedParams: localStorage.get('params', '{\\n  \\n}'),\n        storedPerspective: localStorage.get<SupportedPerspective | undefined>(\n          'perspective',\n          undefined,\n        ),\n      }\n    }, [defaultDataset, defaultApiVersion, localStorage])\n\n  const [dataset, setDataset] = useState<string>(() => {\n    if (datasets.includes(storedDataset)) {\n      return storedDataset\n    }\n    if (datasets.includes(defaultDataset)) {\n      return defaultDataset\n    }\n    return datasets[0]\n  })\n  const [apiVersion, setApiVersion] = useState<string>(() =>\n    API_VERSIONS.includes(storedApiVersion) ? storedApiVersion : DEFAULT_API_VERSION,\n  )\n  const [customApiVersion, setCustomApiVersion] = useState<string | false>(() =>\n    API_VERSIONS.includes(storedApiVersion) ? false : storedApiVersion,\n  )\n  const [perspective, setPerspectiveState] = useState<SupportedPerspective>(\n    storedPerspective || 'raw',\n  )\n  const isValidApiVersion = customApiVersion ? validateApiVersion(customApiVersion) : true\n\n  const [url, setUrl] = useState<string | undefined>(undefined)\n  const [query, setQuery] = useState<string>(() =>\n    typeof storedQuery === 'string' ? storedQuery : '',\n  )\n  const [params, setParams] = useState<Params>(() => parseParams(storedParams, t))\n  const [queryResult, setQueryResult] = useState<unknown | undefined>(undefined)\n  const [listenMutations, setListenMutations] = useState<MutationEvent[]>([])\n  const [error, setError] = useState<Error | undefined>(undefined)\n  const [queryTime, setQueryTime] = useState<number | undefined>(undefined)\n  const [e2eTime, setE2eTime] = useState<number | undefined>(undefined)\n  const [queryInProgress, setQueryInProgress] = useState<boolean>(false)\n  const [listenInProgress, setListenInProgress] = useState<boolean>(false)\n  const [isQueryRecallCollapsed, setIsQueryRecallCollapsed] = useState(false)\n\n  const {paneSizeOptions, isNarrowBreakpoint} = usePaneSize({visionRootRef})\n\n  // Client  with memoized initial value\n  const _client = useClient({\n    apiVersion: isValidApiVersion && customApiVersion ? customApiVersion : apiVersion,\n  })\n  const client = useMemo(() => {\n    return _client.withConfig({\n      apiVersion: isValidApiVersion && customApiVersion ? customApiVersion : apiVersion,\n      perspective: getActivePerspective({visionPerspective: perspective, perspectiveStack}),\n      dataset,\n      allowReconfigure: true,\n    })\n  }, [\n    perspectiveStack,\n    perspective,\n    customApiVersion,\n    apiVersion,\n    dataset,\n    _client,\n    isValidApiVersion,\n  ])\n\n  const cancelQuerySubscription = useCallback(() => {\n    if (!querySubscriptionRef.current) {\n      return\n    }\n    querySubscriptionRef.current.unsubscribe()\n    querySubscriptionRef.current = undefined\n  }, [])\n\n  const cancelListenerSubscription = useCallback(() => {\n    if (!listenSubscriptionRef.current) {\n      return\n    }\n    listenSubscriptionRef.current.unsubscribe()\n    listenSubscriptionRef.current = undefined\n  }, [])\n\n  const handleQueryExecution = useCallback(\n    (options?: QueryExecutionOptions) => {\n      if (queryInProgress) {\n        cancelQuerySubscription()\n        cancelListenerSubscription()\n        setQueryInProgress(false)\n        return\n      }\n\n      const context: Required<Omit<QueryExecutionOptions, 'params' | 'perspective'>> & {\n        params: Params\n        perspective: ClientPerspective | undefined\n      } = {\n        query: options?.query || query,\n        dataset: options?.dataset || dataset,\n        params: parseParams(JSON.stringify(options?.params || params.parsed, null, 2), t),\n        perspective: getActivePerspective({\n          visionPerspective: options?.perspective || perspective,\n          perspectiveStack,\n        }),\n        apiVersion:\n          options?.apiVersion ||\n          (customApiVersion && isValidApiVersion ? customApiVersion : apiVersion),\n      }\n\n      localStorage.set('query', context.query)\n      localStorage.set('params', context.params.raw)\n\n      cancelListenerSubscription()\n\n      setQueryInProgress(!context.params.error && Boolean(context.query))\n      setListenInProgress(false)\n      setListenMutations([])\n      setError(context.params.error ? new Error(context.params.error) : undefined)\n      setQueryResult(undefined)\n      setQueryTime(undefined)\n      setE2eTime(undefined)\n\n      if (context.params.error) {\n        return\n      }\n\n      const urlQueryOpts: Record<string, string | string[]> = {\n        perspective: context.perspective ?? [],\n      }\n\n      const ctxClient = client.withConfig({\n        apiVersion: context.apiVersion,\n        dataset: context.dataset,\n        perspective: context.perspective,\n      })\n\n      const newUrl = ctxClient.getUrl(\n        ctxClient.getDataUrl(\n          'query',\n          encodeQueryString(context.query, context.params.parsed, urlQueryOpts),\n        ),\n      )\n      setUrl(newUrl)\n\n      const queryStart = Date.now()\n\n      querySubscriptionRef.current = ctxClient.observable\n        .fetch(context.query, context.params.parsed, {filterResponse: false, tag: 'vision'})\n        .subscribe({\n          next: (res) => {\n            setQueryTime(res.ms)\n            setE2eTime(Date.now() - queryStart)\n            setQueryResult(res.result)\n            setQueryInProgress(false)\n            setError(undefined)\n          },\n          error: (err) => {\n            setError(err)\n            setQueryInProgress(false)\n          },\n        })\n    },\n    [\n      queryInProgress,\n      query,\n      dataset,\n      params.parsed,\n      t,\n      perspective,\n      perspectiveStack,\n      customApiVersion,\n      isValidApiVersion,\n      apiVersion,\n      localStorage,\n      cancelListenerSubscription,\n      client,\n      cancelQuerySubscription,\n    ],\n  )\n\n  const setPerspective = useCallback(\n    (newPerspective: string | undefined): void => {\n      if (newPerspective !== undefined && !isSupportedPerspective(newPerspective)) {\n        return\n      }\n\n      setPerspectiveState(newPerspective as SupportedPerspective)\n      localStorage.set('perspective', newPerspective)\n\n      handleQueryExecution({perspective: newPerspective})\n    },\n    [localStorage, handleQueryExecution],\n  )\n\n  const handleChangeDataset = useCallback(\n    (evt: ChangeEvent<HTMLSelectElement>) => {\n      const newDataset = evt.target.value\n      localStorage.set('dataset', newDataset)\n      setDataset(newDataset)\n      handleQueryExecution({dataset: newDataset})\n    },\n    [localStorage, handleQueryExecution],\n  )\n\n  const handleChangeApiVersion = useCallback(\n    (evt: ChangeEvent<HTMLSelectElement>) => {\n      const newApiVersion = evt.target.value\n      if (newApiVersion?.toLowerCase() === 'other') {\n        setCustomApiVersion('v')\n        customApiVersionElementRef.current?.focus()\n        return\n      }\n\n      setApiVersion(newApiVersion)\n      setCustomApiVersion(false)\n      localStorage.set('apiVersion', newApiVersion)\n      handleQueryExecution({apiVersion: newApiVersion})\n    },\n    [localStorage, handleQueryExecution],\n  )\n\n  // Handle custom API version change\n  const handleCustomApiVersionChange = useCallback(\n    (evt: ChangeEvent<HTMLInputElement>) => {\n      const newCustomApiVersion = evt.target.value || ''\n      setCustomApiVersion(newCustomApiVersion || 'v')\n\n      if (validateApiVersion(newCustomApiVersion)) {\n        setApiVersion(newCustomApiVersion)\n        localStorage.set('apiVersion', newCustomApiVersion)\n        handleQueryExecution({apiVersion: newCustomApiVersion})\n      }\n    },\n    [localStorage, handleQueryExecution],\n  )\n\n  // Handle perspective change\n  const handleChangePerspective = useCallback(\n    (evt: ChangeEvent<HTMLSelectElement>) => {\n      const newPerspective = evt.target.value\n      setPerspective(newPerspective === 'default' ? undefined : newPerspective)\n    },\n    [setPerspective],\n  )\n\n  const handleListenerEvent = useCallback((evt: ListenEvent<any>) => {\n    if (evt.type !== 'mutation') {\n      return\n    }\n\n    setListenMutations((prevMutations) =>\n      prevMutations.length === 50 ? [evt, ...prevMutations.slice(0, 49)] : [evt, ...prevMutations],\n    )\n  }, [])\n  const handleListenExecution = useCallback(() => {\n    if (listenInProgress) {\n      cancelListenerSubscription()\n      setListenInProgress(false)\n      return\n    }\n\n    const newUrl = client.getDataUrl('listen', encodeQueryString(query, params.parsed, {}))\n\n    const shouldExecute = !params.error && query.trim().length > 0\n\n    localStorage.set('query', query)\n    localStorage.set('params', params.raw)\n\n    cancelQuerySubscription()\n\n    setUrl(newUrl)\n    setListenMutations([])\n    setQueryInProgress(false)\n    setQueryResult(undefined)\n    setListenInProgress(shouldExecute)\n    setError(params.error ? new Error(params.error) : undefined)\n    setQueryTime(undefined)\n    setE2eTime(undefined)\n\n    if (!shouldExecute) {\n      return\n    }\n\n    listenSubscriptionRef.current = client\n      .listen(query, params.parsed, {events: ['mutation', 'welcome'], includeAllVersions: true})\n      .subscribe({\n        next: handleListenerEvent,\n        error: (err) => {\n          setError(err)\n          setListenInProgress(false)\n        },\n      })\n  }, [\n    listenInProgress,\n    params,\n    query,\n    localStorage,\n    cancelQuerySubscription,\n    handleListenerEvent,\n    cancelListenerSubscription,\n    client,\n  ])\n\n  const handleParamsChange = useCallback(\n    (value: Params) => {\n      setParams(value)\n      localStorage.set('params', value.raw)\n    },\n    [localStorage],\n  )\n\n  // Get object of state values from provided URL\n  const getStateFromUrl = useCallback(\n    (data: string): ParsedUrlState | null => {\n      const match = data.match(sanityUrl)\n      if (!match) {\n        return null\n      }\n\n      const [, usedApiVersion, usedDataset, urlQuery] = match\n\n      const qs = new URLSearchParams(urlQuery)\n      const parts: ParsedApiQueryString = parseApiQueryString(qs)\n      if (!parts) return null\n      let newApiVersion: string | undefined\n      let newCustomApiVersion: string | false | undefined\n\n      if (validateApiVersion(usedApiVersion)) {\n        if (API_VERSIONS.includes(usedApiVersion)) {\n          newApiVersion = usedApiVersion\n          newCustomApiVersion = false\n        } else {\n          newCustomApiVersion = usedApiVersion\n        }\n      }\n\n      const newPerspective =\n        isSupportedPerspective(parts.options.perspective) &&\n        !isVirtualPerspective(parts.options.perspective)\n          ? parts.options.perspective\n          : undefined\n\n      if (\n        newPerspective &&\n        (!isSupportedPerspective(parts.options.perspective) ||\n          isVirtualPerspective(parts.options.perspective))\n      ) {\n        toast.push({\n          closable: true,\n          id: 'vision-paste-unsupported-perspective',\n          status: 'warning',\n          title: 'Perspective in pasted url is currently not supported. Falling back to \"raw\"',\n        })\n      }\n\n      return {\n        query: parts.query,\n        params: parts.params,\n        rawParams: JSON.stringify(parts.params, null, 2),\n        dataset: datasets.includes(usedDataset) ? usedDataset : dataset,\n        apiVersion: newApiVersion || apiVersion,\n        customApiVersion: newCustomApiVersion,\n        perspective: newPerspective || perspective,\n        url: data,\n      }\n    },\n    [datasets, dataset, apiVersion, perspective, toast],\n  )\n\n  // Use state object from parsed URL to update state\n  const setStateFromParsedUrl = useCallback(\n    (parsedUrlObj: ParsedUrlState) => {\n      // Update state with pasted values\n      setDataset(parsedUrlObj.dataset)\n      setQuery(parsedUrlObj.query)\n      setParams({\n        parsed: parsedUrlObj.params,\n        raw: parsedUrlObj.rawParams,\n        valid: true,\n        error: undefined,\n      })\n      setApiVersion(parsedUrlObj.apiVersion)\n      if (parsedUrlObj.customApiVersion) {\n        setCustomApiVersion(parsedUrlObj.customApiVersion)\n      }\n      setPerspectiveState(parsedUrlObj.perspective)\n      setUrl(parsedUrlObj.url)\n      // Update the codemirror editor content\n      editorQueryRef.current?.resetEditorContent(parsedUrlObj.query)\n      editorParamsRef.current?.resetEditorContent(parsedUrlObj.rawParams)\n\n      // Update localStorage and client config\n      localStorage.merge({\n        query: parsedUrlObj.query,\n        params: parsedUrlObj.rawParams,\n        dataset: parsedUrlObj.dataset,\n        apiVersion: parsedUrlObj.customApiVersion || parsedUrlObj.apiVersion,\n        perspective: parsedUrlObj.perspective,\n      })\n\n      // Execute query with new values\n      handleQueryExecution(parsedUrlObj)\n    },\n    [localStorage, handleQueryExecution],\n  )\n\n  const handlePaste = useCallback(\n    (evt: ClipboardEvent) => {\n      if (!evt.clipboardData) {\n        return\n      }\n\n      const data = evt.clipboardData.getData('text/plain')\n      evt.preventDefault()\n      const urlState = getStateFromUrl(data)\n      if (urlState) {\n        setStateFromParsedUrl(urlState)\n        toast.push({\n          closable: true,\n          id: 'vision-paste',\n          status: 'info',\n          title: 'Parsed URL to query',\n        })\n      }\n    },\n    [getStateFromUrl, setStateFromParsedUrl, toast],\n  )\n\n  const handleKeyDown = useCallback(\n    (event: KeyboardEvent) => {\n      const isWithinRoot =\n        visionRootRef.current && nodeContains(visionRootRef.current, event.target)\n      if (isRunHotkey(event) && isWithinRoot && params.valid) {\n        handleQueryExecution()\n        event.preventDefault()\n        event.stopPropagation()\n      }\n    },\n    [params.valid, handleQueryExecution],\n  )\n\n  useEffect(() => {\n    window.document.addEventListener('paste', handlePaste)\n    window.document.addEventListener('keydown', handleKeyDown)\n\n    return () => {\n      window.document.removeEventListener('paste', handlePaste)\n      window.document.removeEventListener('keydown', handleKeyDown)\n    }\n  }, [handleKeyDown, handlePaste])\n\n  useEffect(() => {\n    return () => {\n      cancelQuerySubscription()\n      cancelListenerSubscription()\n    }\n  }, [cancelQuerySubscription, cancelListenerSubscription])\n\n  const handleStudioPerspectiveChange = useEffectEvent((stack: StackablePerspective[]) => {\n    if (stack.length > 0) {\n      setPerspective('pinnedRelease')\n    }\n  })\n  // Handle pinned perspective changes\n  useEffect(() => {\n    handleStudioPerspectiveChange(perspectiveStack)\n  }, [perspectiveStack])\n\n  const generateUrl = useCallback(\n    (queryString: string, queryParams: Record<string, unknown>) => {\n      const urlQueryOpts: Record<string, string | string[]> = {\n        perspective: getActivePerspective({visionPerspective: perspective, perspectiveStack}) ?? [],\n      }\n      return client.getUrl(\n        client.getDataUrl('query', encodeQueryString(queryString, queryParams, urlQueryOpts)),\n      )\n    },\n    [client, perspective, perspectiveStack],\n  )\n\n  return (\n    <Root\n      direction=\"column\"\n      height=\"fill\"\n      ref={visionRootRef}\n      sizing=\"border\"\n      overflow=\"hidden\"\n      data-testid=\"vision-root\"\n    >\n      <VisionGuiHeader\n        apiVersion={apiVersion}\n        customApiVersion={customApiVersion}\n        dataset={dataset}\n        datasets={datasets}\n        onChangeDataset={handleChangeDataset}\n        onChangeApiVersion={handleChangeApiVersion}\n        customApiVersionElementRef={customApiVersionElementRef}\n        onCustomApiVersionChange={handleCustomApiVersionChange}\n        isValidApiVersion={isValidApiVersion}\n        onChangePerspective={handleChangePerspective}\n        url={url}\n        perspective={perspective}\n      />\n\n      <SplitpaneContainer flex=\"auto\">\n        <SplitPane\n          minSize={800}\n          defaultSize={window.innerWidth - 275}\n          size={isQueryRecallCollapsed ? window.innerWidth : window.innerWidth - 275}\n          maxSize={-225}\n          primary=\"first\"\n        >\n          <Box height=\"stretch\" flex={1}>\n            <SplitPane\n              className=\"sidebarPanes\"\n              // eslint-disable-next-line @sanity/i18n/no-attribute-string-literals\n              split={isNarrowBreakpoint ? 'vertical' : 'horizontal'}\n              minSize={300}\n            >\n              <Box height=\"stretch\" flex={1}>\n                <SplitPane\n                  className=\"sidebarPanes\"\n                  split=\"horizontal\"\n                  defaultSize={\n                    isNarrowBreakpoint ? paneSizeOptions.defaultSize : paneSizeOptions.minSize\n                  }\n                  size={paneSizeOptions.size}\n                  allowResize={paneSizeOptions.allowResize}\n                  minSize={isNarrowBreakpoint ? paneSizeOptions.minSize : 100}\n                  maxSize={paneSizeOptions.maxSize}\n                  primary=\"first\"\n                >\n                  <InputContainer display=\"flex\" data-testid=\"vision-query-editor\">\n                    <Box flex={1}>\n                      <InputBackgroundContainerLeft>\n                        <Flex>\n                          <StyledLabel muted>{t('query.label')}</StyledLabel>\n                        </Flex>\n                      </InputBackgroundContainerLeft>\n                      <VisionCodeMirror\n                        initialValue={query}\n                        onChange={setQuery}\n                        ref={editorQueryRef}\n                      />\n                    </Box>\n                  </InputContainer>\n                  <InputContainer display=\"flex\">\n                    <ParamsEditor\n                      value={params.raw}\n                      onChange={handleParamsChange}\n                      paramsError={params.error}\n                      hasValidParams={params.valid}\n                      editorRef={editorParamsRef}\n                    />\n\n                    <VisionGuiControls\n                      hasValidParams={params.valid}\n                      queryInProgress={queryInProgress}\n                      listenInProgress={listenInProgress}\n                      onQueryExecution={handleQueryExecution}\n                      onListenExecution={handleListenExecution}\n                    />\n                  </InputContainer>\n                </SplitPane>\n              </Box>\n              <VisionGuiResult\n                error={error}\n                queryInProgress={queryInProgress}\n                queryResult={queryResult}\n                listenInProgress={listenInProgress}\n                listenMutations={listenMutations}\n                dataset={dataset}\n                queryTime={queryTime}\n                e2eTime={e2eTime}\n              />\n            </SplitPane>\n          </Box>\n          <Box style={{position: 'relative', height: '100%'}}>\n            <Button\n              mode=\"ghost\"\n              padding={2}\n              style={{\n                position: 'absolute',\n                left: -32,\n                top: '50%',\n                transform: 'translateY(-50%)',\n                zIndex: 100,\n                pointerEvents: 'auto',\n              }}\n              onClick={() => setIsQueryRecallCollapsed(!isQueryRecallCollapsed)}\n            >\n              <div style={{display: 'flex', alignItems: 'center', height: '100%'}}>\n                {isQueryRecallCollapsed ? <ChevronLeftIcon /> : <ChevronRightIcon />}\n              </div>\n            </Button>\n            <QueryRecall\n              url={url}\n              getStateFromUrl={getStateFromUrl}\n              setStateFromParsedUrl={setStateFromParsedUrl}\n              currentQuery={query}\n              currentParams={params.parsed || {}}\n              generateUrl={generateUrl}\n            />\n          </Box>\n        </SplitPane>\n      </SplitpaneContainer>\n    </Root>\n  )\n}\n","import {type SanityClient} from '@sanity/client'\nimport {useEffect, useState} from 'react'\n\nexport function useDatasets(client: SanityClient): string[] | Error | undefined {\n  const projectId = client.config().projectId\n  const [datasets, setDatasets] = useState<string[] | Error | undefined>()\n\n  useEffect(() => {\n    const datasets$ = client.observable.datasets.list().subscribe({\n      next: (result) => setDatasets(result.map((ds) => ds.name)),\n      error: (err) => setDatasets(err),\n    })\n\n    return () => datasets$.unsubscribe()\n  }, [client, projectId])\n\n  return datasets || undefined\n}\n","import {Flex} from '@sanity/ui'\n\nimport {DelayedSpinner} from '../components/DelayedSpinner'\nimport {VisionGui} from '../components/VisionGui'\nimport {useDatasets} from '../hooks/useDatasets'\nimport {type VisionProps} from '../types'\n\nexport function VisionContainer(props: VisionProps) {\n  const loadedDatasets = useDatasets(props.client)\n\n  if (!loadedDatasets) {\n    return (\n      <Flex align=\"center\" height=\"fill\" justify=\"center\">\n        <DelayedSpinner />\n      </Flex>\n    )\n  }\n\n  const datasets =\n    loadedDatasets instanceof Error\n      ? // On error, use the clients configured dataset\n        [props.client.config().dataset || 'production']\n      : // Otherwise use the loaded list, obviously\n        loadedDatasets\n\n  const projectId = props.client.config().projectId\n  const defaultDataset = props.config.defaultDataset || props.client.config().dataset || datasets[0]\n\n  return (\n    <VisionGui\n      {...props}\n      key={projectId}\n      datasets={datasets}\n      projectId={projectId}\n      defaultDataset={defaultDataset}\n    />\n  )\n}\n","/* eslint-disable @sanity/i18n/no-attribute-string-literals */\n/* eslint-disable i18next/no-literal-string */\nimport {Button, Card, Code, Container, Heading, Stack} from '@sanity/ui'\nimport {Component, type PropsWithChildren} from 'react'\n\nimport {clearLocalStorage} from '../util/localStorage'\n\n/**\n * @internal\n */\nexport type VisionErrorBoundaryProps = PropsWithChildren\n\n/**\n * @internal\n */\ninterface VisionErrorBoundaryState {\n  error: string | null\n  numRetries: number\n}\n\n/**\n * @internal\n */\nexport class VisionErrorBoundary extends Component<\n  VisionErrorBoundaryProps,\n  VisionErrorBoundaryState\n> {\n  constructor(props: VisionErrorBoundaryProps) {\n    super(props)\n    this.state = {error: null, numRetries: 0}\n  }\n\n  static getDerivedStateFromError(error: unknown) {\n    return {error: error instanceof Error ? error.message : `${error}`}\n  }\n\n  handleRetryRender = () =>\n    this.setState((prev) => ({error: null, numRetries: prev.numRetries + 1}))\n\n  handleRetryWithCacheClear = () => {\n    clearLocalStorage()\n    this.handleRetryRender()\n  }\n\n  render() {\n    if (!this.state.error) {\n      return this.props.children\n    }\n\n    const message = this.state.error\n    const withCacheClear = this.state.numRetries > 0\n\n    return (\n      <Card\n        height=\"fill\"\n        overflow=\"auto\"\n        paddingY={[4, 5, 6, 7]}\n        paddingX={4}\n        sizing=\"border\"\n        tone=\"critical\"\n      >\n        <Container width={3}>\n          <Stack space={4}>\n            <div>\n              <Button\n                onClick={withCacheClear ? this.handleRetryWithCacheClear : this.handleRetryRender}\n                text={withCacheClear ? 'Clear cache and retry' : 'Retry'}\n                tone=\"default\"\n              />\n            </div>\n\n            <Heading>An error occurred</Heading>\n\n            <Card border radius={2} overflow=\"auto\" padding={4} tone=\"inherit\">\n              <Stack space={4}>\n                {message && (\n                  <Code size={1}>\n                    <strong>Error: {message}</strong>\n                  </Code>\n                )}\n              </Stack>\n            </Card>\n          </Stack>\n        </Container>\n      </Card>\n    )\n  }\n}\n","import {type Tool, useClient} from 'sanity'\n\nimport {DEFAULT_API_VERSION} from './apiVersions'\nimport {VisionContainer} from './containers/VisionContainer'\nimport {VisionErrorBoundary} from './containers/VisionErrorBoundary'\nimport {type VisionConfig} from './types'\n\ninterface SanityVisionProps {\n  tool: Tool<VisionConfig>\n}\n\nfunction SanityVision(props: SanityVisionProps) {\n  const client = useClient({apiVersion: '1'})\n  const config: VisionConfig = {\n    defaultApiVersion: DEFAULT_API_VERSION,\n    ...props.tool.options,\n  }\n\n  return (\n    <VisionErrorBoundary>\n      <VisionContainer client={client} config={config} />\n    </VisionErrorBoundary>\n  )\n}\n\nexport default SanityVision\n"],"names":["API_VERSIONS","Date","toISOString","split","DEFAULT_API_VERSION","slice","DelayedSpinner","props","$","_c","show","setShow","useState","t0","t1","delay","timer","setTimeout","clearTimeout","useEffect","t2","codemirrorExtensions","javascriptLanguage","lineNumbers","highlightActiveLine","highlightActiveLineGutter","highlightSelectionMatches","highlightSpecialChars","indentOnInput","bracketMatching","closeBrackets","history","drawSelection","syntaxHighlighting","defaultHighlightStyle","fallback","keymap","of","key","run","defaultKeymap","historyKeymap","flat","filter","Boolean","useCodemirrorTheme","theme","createTheme","cmTheme","t3","createHighlight","cmHighlight","t4","color","fonts","sanity","card","enabled","cursor","hues","blue","dark","hex","selection","gray","EditorView","fg","backgroundColor","bg","caretColor","fontFamily","code","family","fontSize","rem","sizes","lineHeight","borderLeftColor","borderBottom","border","borderTop","c","base","s","syntax","HighlightStyle","define","tag","t","keyword","propertyName","name","deleted","character","macroName","property","function","variableName","labelName","constant","standard","variable","definition","separator","typeName","className","number","changed","annotation","modifier","self","namespace","operator","operatorKeyword","url","escape","regexp","link","special","string","meta","comment","strong","fontWeight","emphasis","fontStyle","strikethrough","textDecoration","heading","atom","bool","boolean","processingInstruction","inserted","invalid","EditorRoot","styled","div","space","VisionCodeMirror","forwardRef","ref","initialValue","sanityTheme","useTheme","codeMirrorRef","useRef","Symbol","for","newContent","editorView","current","view","currentDoc","state","doc","toString","dispatch","changes","from","to","length","insert","EditorSelection","resetEditorContent","useImperativeHandle","onChange","displayName","SUPPORTED_PERSPECTIVES","VIRTUAL_PERSPECTIVES","isSupportedPerspective","p","includes","isVirtualPerspective","maybeVirtualPerspective","hasPinnedPerspective","selectedPerspectiveName","getActivePerspective","visionPerspective","perspectiveStack","encodeQueryString","query","params","options","searchParams","URLSearchParams","set","value","Object","entries","JSON","stringify","isPlainObject","obj","prototype","call","hasLocalStorage","supportsLocalStorage","keyPrefix","clearLocalStorage","i","localStorage","startsWith","removeItem","getLocalStorage","storageKey","loadedState","get","merge","defaultVal","ensureState","setItem","loadState","stored","parse","getItem","mod","parseApiQueryString","qs","prefixApiVersion","version","validateApiVersion","apiVersion","parseableApiVersion","replace","trim","toUpperCase","test","isNaN","tryParseParams","val","parsed","JSON5","Array","isArray","err","message","Root","Flex","Header","Card","StyledLabel","Label","SplitpaneContainer","Box","QueryCopyLink","a","InputBackgroundContainer","InputBackgroundContainerLeft","InputContainer","ResultOuterContainer","ResultInnerContainer","ResultContainer","$isInvalid","css","Result","ResultFooter","TimingsCard","TimingsTextContainer","text","ascenderHeight","descenderHeight","DownloadsCard","SaveResultLabel","Text","ControlsContainer","defaultValue","ParamsEditor","paramsError","hasValidParams","editorRef","useTranslation","visionLocaleNamespace","parseParams","raw","error","valid","isValid","setValid","init","setInit","newValue","event","handleChangeRaw","t5","debounce","handleChange","t6","t7","t8","t9","t10","t11","t12","t13","parsedParams","Error","validationError","undefined","STORED_QUERIES_NAMESPACE","queries","keyValueStoreKey","useSavedQueries","keyValueStore","useKeyValueStore","setValue","saving","setSaving","deleting","setDeleting","saveQueryError","setSaveQueryError","deleteQueryError","setDeleteQueryError","setError","useMemo","getKey","sub","pipe","startWith","map","data","subscribe","next","unsubscribe","saveQuery","useCallback","newQueries","_key","uuid","setKey","updateQuery","updatedQueries","q","deleteQuery","prev","filteredQueries","k","FixedHeader","Stack","ScrollContainer","QueryRecall","getStateFromUrl","setStateFromParsedUrl","currentQuery","currentParams","generateUrl","toast","useToast","month","day","year","hour","minute","hour12","formatDate","useDateTimeFormat","editingKey","setEditingKey","editingTitle","setEditingTitle","optimisticTitles","setOptimisticTitles","searchQuery","setSearchQuery","selectedUrl","setSelectedUrl","newUrl","some","savedQueryObj","isEqual","duplicateQuery","find","q_0","savedQueryObj_0","push","closable","status","title","description","format","savedAt","handleSave","newTitle","prev_1","next_0","prev_0","handleTitleSave","query_0","newUrl_0","q_1","savedQueryObj_1","duplicateQuery_0","q_2","savedQueryObj_2","handleUpdate","T0","T1","q_3","toLowerCase","textTransform","AddIcon","t14","t15","t16","currentTarget","t17","SearchIcon","q_4","queryObj","isSelected","areQueriesEqual","isEdited","parsedUrl","position","event_0","event_1","maxWidth","height","padding","width","borderRadius","TrashIcon","event_2","stopPropagation","portal","placement","tone","right","bottom","e","narrowBreakpoint","window","innerWidth","calculatePaneSizeOptions","rootHeight","document","body","getBoundingClientRect","defaultSize","size","allowResize","minSize","Math","min","max","maxSize","usePaneSize","visionRootRef","isNarrowBreakpoint","setIsNarrowBreakpoint","_temp","paneSizeOptions","setPaneSizeOptions","_temp2","handleResize","entry","contentRect","resizeObserver","ResizeObserver","observe","disconnect","VisionGuiControls","listenInProgress","queryInProgress","onQueryExecution","onListenExecution","StopIcon","PlayIcon","PerspectivePopoverContent","PerspectivePopoverLink","Dot","$tone","PerspectivePopover","open","setOpen","buttonRef","popoverRef","handleClick","useClickOutsideEvent","HelpCircleIcon","o","PinnedReleasePerspectiveOption","pinnedPerspective","selectedPerspective","metadata","label","join","VisionGuiHeader","onChangeDataset","dataset","customApiVersion","onChangeApiVersion","datasets","customApiVersionElementRef","onCustomApiVersionChange","isValidApiVersion","onChangePerspective","perspective","usePerspective","operationUrlElement","el","select","execCommand","console","handleCopyUrl","_temp3","t18","t19","t20","t21","t22","perspectiveName","t23","t24","t25","CopyIcon","t26","ds","getBlobUrl","content","mimeType","URL","createObjectURL","Blob","type","getMemoizedBlobUrlResolver","stringEncoder","prevResult","prevContent","input","revokeObjectURL","getJsonBlobUrl","getCsvBlobUrl","json2csv","ErrorCode","Code","muted","critical","QueryErrorDetails","details","mapToLegacyDetails","line","dashLine","column","columnEnd","lineNumber","start","end","lineStart","lastIndexOf","match","indexOf","repeat","hats","QueryErrorDialog","ResultViewWrapper","lru","LRU","ResultView","datasetName","workspaceDataset","useDataset","isRecord","DocumentEditLabel","isExpanded","toggleExpanded","isKey","keypath","endsWith","id","keyPath","cached","segments","depthLimit","isArrayKeyOverLimit","path","numeric","segment","limit","parseInt","preventSave","evt","preventDefault","SaveCsvButton","blobUrl","isDisabled","DocumentSheetIcon","button","SaveJsonButton","VisionGuiResult","queryResult","listenMutations","queryTime","e2eTime","hasResult","jsonUrl","csvUrl","SaveResultButtons","Fragment","nodeContains","node","other","compareDocumentPosition","sanityUrl","isRunHotkey","isHotkey","VisionGui","config","projectId","defaultDataset","defaultApiVersion","editorQueryRef","editorParamsRef","querySubscriptionRef","listenSubscriptionRef","storedDataset","storedApiVersion","storedQuery","storedParams","storedPerspective","setDataset","setApiVersion","setCustomApiVersion","setPerspectiveState","setUrl","setQuery","setParams","setQueryResult","setListenMutations","setQueryTime","setE2eTime","setQueryInProgress","setListenInProgress","isQueryRecallCollapsed","setIsQueryRecallCollapsed","_client","useClient","client","withConfig","allowReconfigure","cancelQuerySubscription","cancelListenerSubscription","handleQueryExecution","context","urlQueryOpts","ctxClient","getUrl","getDataUrl","queryStart","now","observable","fetch","filterResponse","res","ms","result","setPerspective","newPerspective","handleChangeDataset","newDataset","target","handleChangeApiVersion","newApiVersion","focus","handleCustomApiVersionChange","newCustomApiVersion","handleChangePerspective","handleListenerEvent","prevMutations","handleListenExecution","shouldExecute","listen","events","includeAllVersions","handleParamsChange","usedApiVersion","usedDataset","urlQuery","parts","rawParams","parsedUrlObj","handlePaste","clipboardData","getData","urlState","handleKeyDown","isWithinRoot","addEventListener","removeEventListener","handleStudioPerspectiveChange","useEffectEvent","stack","queryString","queryParams","left","top","transform","zIndex","pointerEvents","display","alignItems","useDatasets","setDatasets","datasets$","list","VisionContainer","loadedDatasets","VisionErrorBoundary","Component","constructor","numRetries","getDerivedStateFromError","handleRetryRender","setState","handleRetryWithCacheClear","render","children","withCacheClear","SanityVision","tool"],"mappings":"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"}