@akira-io/ui 1.3.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/README.md +2 -2
  2. package/dist/blocks.d.ts +100 -10
  3. package/dist/blocks.js +547 -270
  4. package/dist/blocks.js.map +1 -1
  5. package/dist/{chunk-3Z2VGVPI.js → chunk-53V4J7MC.js} +17 -7
  6. package/dist/chunk-53V4J7MC.js.map +1 -0
  7. package/dist/chunk-BH3B26DK.js +394 -0
  8. package/dist/chunk-BH3B26DK.js.map +1 -0
  9. package/dist/chunk-BP2YDMMI.js +29 -0
  10. package/dist/chunk-BP2YDMMI.js.map +1 -0
  11. package/dist/chunk-BR3JI3KN.js +458 -0
  12. package/dist/chunk-BR3JI3KN.js.map +1 -0
  13. package/dist/{chunk-YBXRJSR3.js → chunk-CAUTXZ4U.js} +15 -7
  14. package/dist/chunk-CAUTXZ4U.js.map +1 -0
  15. package/dist/{chunk-I6VVCFZ2.js → chunk-DPLCEU34.js} +342 -238
  16. package/dist/chunk-DPLCEU34.js.map +1 -0
  17. package/dist/chunk-IQMRJXEO.js +5 -4
  18. package/dist/chunk-IQMRJXEO.js.map +1 -1
  19. package/dist/chunk-L2H5GIF7.js +5 -4
  20. package/dist/chunk-L2H5GIF7.js.map +1 -1
  21. package/dist/{chunk-2V6HUWST.js → chunk-NKPFIA32.js} +19 -6
  22. package/dist/chunk-NKPFIA32.js.map +1 -0
  23. package/dist/{chunk-QNF4LJVT.js → chunk-OS7YY5R4.js} +8 -6
  24. package/dist/chunk-OS7YY5R4.js.map +1 -0
  25. package/dist/{chunk-IDNOI4OK.js → chunk-PCYYU332.js} +15 -8
  26. package/dist/chunk-PCYYU332.js.map +1 -0
  27. package/dist/{chunk-KHOA4TEI.js → chunk-PPWJK5T3.js} +60 -25
  28. package/dist/chunk-PPWJK5T3.js.map +1 -0
  29. package/dist/{chunk-N2KIFFI7.js → chunk-QZRSQVCN.js} +30 -34
  30. package/dist/chunk-QZRSQVCN.js.map +1 -0
  31. package/dist/{chunk-SZUXATOF.js → chunk-XLAOE5MV.js} +170 -76
  32. package/dist/chunk-XLAOE5MV.js.map +1 -0
  33. package/dist/{chunk-B3L6PRLX.js → chunk-ZQXZ4UGE.js} +208 -100
  34. package/dist/chunk-ZQXZ4UGE.js.map +1 -0
  35. package/dist/code.d.ts +2 -2
  36. package/dist/code.js +96 -52
  37. package/dist/code.js.map +1 -1
  38. package/dist/{context-OwSoVEri.d.ts → context-2wTOwxCk.d.ts} +13 -5
  39. package/dist/editor.d.ts +1 -1
  40. package/dist/editor.js +135 -52
  41. package/dist/editor.js.map +1 -1
  42. package/dist/{field-DWm5NXeV.d.ts → field-C1TdmC2t.d.ts} +1 -1
  43. package/dist/index.d.ts +15 -12
  44. package/dist/index.js +1105 -633
  45. package/dist/index.js.map +1 -1
  46. package/dist/inertia.d.ts +11 -3
  47. package/dist/inertia.js +66 -12
  48. package/dist/inertia.js.map +1 -1
  49. package/dist/{input-Dxnsxi-f.d.ts → input-B4uEClxB.d.ts} +1 -1
  50. package/dist/{json-viewer-BARA2RCW.d.ts → json-viewer-Bssv9mTD.d.ts} +1 -1
  51. package/dist/locales/fr.d.ts +44 -0
  52. package/dist/locales/fr.js +248 -0
  53. package/dist/locales/fr.js.map +1 -0
  54. package/dist/locales/pt.d.ts +10 -9
  55. package/dist/locales/pt.js +40 -3
  56. package/dist/locales/pt.js.map +1 -1
  57. package/dist/shells.d.ts +46 -5
  58. package/dist/shells.js +211 -71
  59. package/dist/shells.js.map +1 -1
  60. package/dist/{sidebar-Bp6Q46j-.d.ts → sidebar-BLL2tgTt.d.ts} +2 -2
  61. package/dist/types-1LUmNJf_.d.ts +41 -0
  62. package/dist/{types-cmBL8zOc.d.ts → types-CMZRvMV5.d.ts} +1 -1
  63. package/dist/{types-B-eGPoFD.d.ts → types-CfAUvz--.d.ts} +1 -1
  64. package/package.json +8 -2
  65. package/theme.css +11 -0
  66. package/dist/chunk-2V6HUWST.js.map +0 -1
  67. package/dist/chunk-3Z2VGVPI.js.map +0 -1
  68. package/dist/chunk-B3L6PRLX.js.map +0 -1
  69. package/dist/chunk-I6VVCFZ2.js.map +0 -1
  70. package/dist/chunk-IDNOI4OK.js.map +0 -1
  71. package/dist/chunk-KHOA4TEI.js.map +0 -1
  72. package/dist/chunk-N2KIFFI7.js.map +0 -1
  73. package/dist/chunk-NGMG2UWX.js +0 -172
  74. package/dist/chunk-NGMG2UWX.js.map +0 -1
  75. package/dist/chunk-QNF4LJVT.js.map +0 -1
  76. package/dist/chunk-SZUXATOF.js.map +0 -1
  77. package/dist/chunk-YBXRJSR3.js.map +0 -1
  78. package/dist/types-u1qfmJQi.d.ts +0 -28
package/dist/code.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/ui/code.tsx","../src/components/ui/code-block-header.tsx","../src/lib/shiki.ts","../src/hooks/use-highlighted-code.ts","../src/lib/code-lines.ts","../src/components/ui/code-block.tsx","../src/lib/json-value.ts","../src/components/ui/json-node.tsx","../src/components/ui/json-viewer.tsx"],"names":["jsx","React","jsxs","React3","React4"],"mappings":"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","file":"code.js","sourcesContent":["import * as React from 'react';\n\nimport { compactRadius, controlFill } from '@/lib/language';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\n\nfunction Code({\n className,\n slotName = 'code',\n ...props\n}: React.ComponentProps<'code'> & SlotNameProps) {\n return (\n <code\n className={cn(\n compactRadius,\n controlFill,\n 'px-1.5 py-0.5 font-mono font-medium text-[0.875em] text-foreground',\n className,\n )}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nexport { Code };\n","import { FileCode } from 'lucide-react';\n\nimport { CopyButton, type CopyButtonLabels } from '@/components/ui/copy-button';\nimport type { SlotNameProps } from '@/types';\n\ninterface CodeBlockHeaderProps {\n filename: string;\n language?: string;\n code: string;\n copyLabel: CopyButtonLabels['copyLabel'];\n copiedLabel: CopyButtonLabels['copiedLabel'];\n}\n\nfunction CodeBlockHeader({\n filename,\n language,\n code,\n copyLabel,\n copiedLabel,\n slotName = 'code-block-header',\n}: CodeBlockHeaderProps & SlotNameProps) {\n return (\n <div\n className=\"gap-2 px-4 py-2 flex items-center border-b border-border\"\n data-slot={slotName}\n >\n <FileCode className=\"size-4 shrink-0 text-muted-foreground\" />\n <span\n data-slot=\"code-block-filename\"\n className=\"text-sm font-medium truncate text-foreground\"\n >\n {filename}\n </span>\n {language !== undefined && (\n <span\n data-slot=\"code-block-language\"\n className=\"text-xs font-medium tracking-wide text-muted-foreground uppercase\"\n >\n {language}\n </span>\n )}\n <CopyButton\n value={code}\n copyLabel={copyLabel}\n copiedLabel={copiedLabel}\n className=\"ml-auto text-muted-foreground\"\n />\n </div>\n );\n}\n\nexport { CodeBlockHeader };\n","const LIGHT_THEME = 'github-light';\n\nconst DARK_THEME = 'github-dark';\n\ntype CodeToHtml = typeof import('shiki').codeToHtml;\n\nlet pending: Promise<CodeToHtml | null> | null = null;\n\nfunction loadCodeToHtml(): Promise<CodeToHtml | null> {\n pending ??= import('shiki')\n .then((module) => module.codeToHtml)\n .catch(() => null);\n\n return pending;\n}\n\nexport async function highlightCode(\n code: string,\n language: string,\n): Promise<string | null> {\n const codeToHtml = await loadCodeToHtml();\n\n if (!codeToHtml) {\n return null;\n }\n\n try {\n return await codeToHtml(code, {\n lang: language,\n themes: { light: LIGHT_THEME, dark: DARK_THEME },\n defaultColor: false,\n });\n } catch {\n return null;\n }\n}\n","import * as React from 'react';\n\nimport { highlightCode } from '@/lib/shiki';\n\nexport function useHighlightedCode(\n code: string,\n language: string | undefined,\n html: string | undefined,\n): string | null {\n const [highlighted, setHighlighted] = React.useState<string | null>(\n html ?? null,\n );\n\n React.useEffect(() => {\n if (html !== undefined) {\n setHighlighted(html);\n\n return;\n }\n\n if (language === undefined) {\n setHighlighted(null);\n\n return;\n }\n\n let active = true;\n\n highlightCode(code, language).then((result) => {\n if (active) {\n setHighlighted(result);\n }\n });\n\n return () => {\n active = false;\n };\n }, [code, language, html]);\n\n return highlighted;\n}\n","const LINE_OPEN = '<span class=\"line\">';\n\nconst SPAN_CLOSE = '</span>';\n\nexport function splitSourceLines(code: string): string[] {\n return code.replace(/\\n$/, '').split('\\n');\n}\n\nexport function parseLineRanges(\n spec: string | number[] | undefined,\n): Set<number> {\n const lines = new Set<number>();\n\n if (spec === undefined) {\n return lines;\n }\n\n if (Array.isArray(spec)) {\n for (const line of spec) {\n lines.add(line);\n }\n\n return lines;\n }\n\n for (const part of spec.split(',')) {\n const [from, to] = part\n .split('-')\n .map((bound) => Number.parseInt(bound.trim(), 10));\n\n if (Number.isNaN(from)) {\n continue;\n }\n\n const last = to === undefined || Number.isNaN(to) ? from : to;\n\n for (let line = from; line <= last; line += 1) {\n lines.add(line);\n }\n }\n\n return lines;\n}\n\nfunction closingSpan(html: string, from: number): number {\n let depth = 0;\n let cursor = from;\n\n while (cursor < html.length) {\n const open = html.indexOf('<span', cursor);\n const close = html.indexOf(SPAN_CLOSE, cursor);\n\n if (close === -1) {\n return -1;\n }\n\n if (open !== -1 && open < close) {\n depth += 1;\n cursor = open + 5;\n continue;\n }\n\n if (depth === 0) {\n return close;\n }\n\n depth -= 1;\n cursor = close + SPAN_CLOSE.length;\n }\n\n return -1;\n}\n\nexport function splitHighlightedLines(html: string): string[] | null {\n const lines: string[] = [];\n let cursor = html.indexOf(LINE_OPEN);\n\n while (cursor !== -1) {\n const start = cursor + LINE_OPEN.length;\n const end = closingSpan(html, start);\n\n if (end === -1) {\n return null;\n }\n\n lines.push(html.slice(start, end));\n cursor = html.indexOf(LINE_OPEN, end);\n }\n\n return lines.length > 0 ? lines : null;\n}\n","import * as React from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport { CodeBlockHeader } from '@/components/ui/code-block-header';\nimport { CopyButton } from '@/components/ui/copy-button';\nimport { useHighlightedCode } from '@/hooks/use-highlighted-code';\nimport {\n parseLineRanges,\n splitHighlightedLines,\n splitSourceLines,\n} from '@/lib/code-lines';\nimport { elevatedSurface, nestedSurfaceReset } from '@/lib/language';\nimport { cn } from '@/lib/utils';\nimport { useUiLabels } from '@/locales/context';\nimport type { SlotNameProps } from '@/types';\n\nexport interface CodeBlockLabels {\n copyLabel: string;\n copiedLabel: string;\n expandLabel: string;\n collapseLabel: string;\n}\n\nexport const codeBlockLabels: CodeBlockLabels = {\n copyLabel: 'Copy',\n copiedLabel: 'Copied',\n expandLabel: 'Expand',\n collapseLabel: 'Collapse',\n};\n\nexport interface CodeBlockProps extends Omit<\n React.ComponentProps<'div'>,\n 'children'\n> {\n code: string;\n language?: string;\n html?: string;\n filename?: string;\n lineNumbers?: boolean;\n highlightLines?: string | number[];\n maxHeight?: number | string;\n copyLabel?: CodeBlockLabels['copyLabel'];\n copiedLabel?: CodeBlockLabels['copiedLabel'];\n expandLabel?: CodeBlockLabels['expandLabel'];\n collapseLabel?: CodeBlockLabels['collapseLabel'];\n}\n\nfunction CodeBlock({\n code,\n language,\n html,\n filename,\n lineNumbers = false,\n highlightLines,\n maxHeight,\n copyLabel,\n copiedLabel,\n expandLabel,\n collapseLabel,\n className,\n slotName = 'code-block',\n ...props\n}: CodeBlockProps & SlotNameProps) {\n const labels = useUiLabels('codeBlock', codeBlockLabels, {\n copyLabel,\n copiedLabel,\n expandLabel,\n collapseLabel,\n });\n const highlighted = useHighlightedCode(code, language, html);\n const lines = React.useMemo(() => splitSourceLines(code), [code]);\n const markup = React.useMemo(\n () =>\n highlighted === null ? null : splitHighlightedLines(highlighted),\n [highlighted],\n );\n const emphasised = React.useMemo(\n () => parseLineRanges(highlightLines),\n [highlightLines],\n );\n\n const bodyRef = React.useRef<HTMLDivElement>(null);\n const [expanded, setExpanded] = React.useState(false);\n const [clipped, setClipped] = React.useState(false);\n\n React.useEffect(() => {\n const body = bodyRef.current;\n\n if (!body || maxHeight === undefined || expanded) {\n return;\n }\n\n setClipped(body.scrollHeight > body.clientHeight + 1);\n }, [maxHeight, expanded, lines, markup]);\n\n return (\n <div\n className={cn(\n elevatedSurface,\n nestedSurfaceReset,\n 'relative overflow-hidden bg-card',\n className,\n )}\n {...props}\n data-slot={slotName}\n >\n {filename === undefined ? (\n <CopyButton\n value={code}\n copyLabel={labels.copyLabel}\n copiedLabel={labels.copiedLabel}\n className=\"top-2 right-2 absolute z-10 text-muted-foreground\"\n />\n ) : (\n <CodeBlockHeader\n filename={filename}\n language={language}\n code={code}\n copyLabel={labels.copyLabel}\n copiedLabel={labels.copiedLabel}\n />\n )}\n <div\n ref={bodyRef}\n data-slot=\"code-block-body\"\n style={{ maxHeight: expanded ? undefined : maxHeight }}\n className=\"py-4 font-mono text-sm leading-6 overflow-auto rounded-[inherit]\"\n >\n <pre className=\"w-max min-w-full\">\n <code data-slot=\"code-block-code\">\n {lines.map((line, index) => (\n <CodeBlockLine\n key={index}\n number={index + 1}\n line={line}\n markup={markup?.[index]}\n lineNumbers={lineNumbers}\n emphasised={emphasised.has(index + 1)}\n />\n ))}\n </code>\n </pre>\n </div>\n {clipped && (\n <CodeBlockExpander\n expanded={expanded}\n expandLabel={labels.expandLabel}\n collapseLabel={labels.collapseLabel}\n onToggle={() => setExpanded((open) => !open)}\n />\n )}\n </div>\n );\n}\n\ninterface CodeBlockLineProps {\n number: number;\n line: string;\n markup: string | undefined;\n lineNumbers: boolean;\n emphasised: boolean;\n}\n\nfunction CodeBlockLine({\n number,\n line,\n markup,\n lineNumbers,\n emphasised,\n slotName = 'code-block-line',\n}: CodeBlockLineProps & SlotNameProps) {\n return (\n <span\n data-highlighted={emphasised ? '' : undefined}\n className={cn(\n 'min-h-6 px-4 grid w-full data-highlighted:bg-accent',\n lineNumbers ? 'grid-cols-[2.5rem_1fr]' : 'grid-cols-1',\n )}\n data-slot={slotName}\n >\n {lineNumbers && (\n <span\n data-slot=\"code-block-gutter\"\n aria-hidden=\"true\"\n className=\"pr-4 text-right text-muted-foreground select-none\"\n >\n {number}\n </span>\n )}\n {markup === undefined ? (\n <span data-slot=\"code-block-source\">{line}</span>\n ) : (\n <span\n data-slot=\"code-block-source\"\n dangerouslySetInnerHTML={{ __html: markup }}\n />\n )}\n </span>\n );\n}\n\ninterface CodeBlockExpanderProps {\n expanded: boolean;\n expandLabel: string;\n collapseLabel: string;\n onToggle: () => void;\n}\n\nfunction CodeBlockExpander({\n expanded,\n expandLabel,\n collapseLabel,\n onToggle,\n slotName = 'code-block-expander',\n}: CodeBlockExpanderProps & SlotNameProps) {\n return (\n <div\n className=\"inset-x-0 bottom-0 pt-10 pb-2 absolute flex justify-center\"\n data-slot={slotName}\n >\n {!expanded && (\n <span\n aria-hidden=\"true\"\n className=\"inset-0 pointer-events-none absolute bg-gradient-to-t from-card to-transparent\"\n />\n )}\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n onClick={onToggle}\n >\n {expanded ? collapseLabel : expandLabel}\n </Button>\n </div>\n );\n}\n\nexport { CodeBlock };\n","export type JsonKind =\n | 'string'\n | 'number'\n | 'boolean'\n | 'null'\n | 'object'\n | 'array'\n | 'unsupported';\n\nconst CIRCULAR_MARKER = '[Circular]';\n\nexport function jsonKind(value: unknown): JsonKind {\n if (value === null) {\n return 'null';\n }\n\n if (Array.isArray(value)) {\n return 'array';\n }\n\n switch (typeof value) {\n case 'string':\n return 'string';\n case 'number':\n return Number.isFinite(value) ? 'number' : 'unsupported';\n case 'boolean':\n return 'boolean';\n case 'object':\n return 'object';\n default:\n return 'unsupported';\n }\n}\n\nexport function isBranch(kind: JsonKind): boolean {\n return kind === 'object' || kind === 'array';\n}\n\nexport function entriesOf(value: unknown): [string, unknown][] {\n if (Array.isArray(value)) {\n return value.map((item, index) => [String(index), item]);\n }\n\n if (value !== null && typeof value === 'object') {\n return Object.entries(value as Record<string, unknown>);\n }\n\n return [];\n}\n\nfunction serialisable(value: unknown, ancestors: readonly object[]): unknown {\n if (typeof value === 'bigint') {\n return value.toString();\n }\n\n if (value === null || typeof value !== 'object') {\n return value;\n }\n\n if (ancestors.includes(value)) {\n return CIRCULAR_MARKER;\n }\n\n const trail = [...ancestors, value];\n\n if (Array.isArray(value)) {\n return value.map((item) => serialisable(item, trail));\n }\n\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>).map(([key, item]) => [\n key,\n serialisable(item, trail),\n ]),\n );\n}\n\nexport function stringifyJson(value: unknown): string {\n return JSON.stringify(serialisable(value, []), null, 2) ?? 'null';\n}\n","import { ChevronRight } from 'lucide-react';\nimport * as React from 'react';\n\nimport { entriesOf, isBranch, jsonKind, type JsonKind } from '@/lib/json-value';\nimport { focusRing } from '@/lib/language';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\n\nconst LEAF_CLASS: Record<JsonKind, string> = {\n string: 'text-success',\n number: 'text-primary',\n boolean: 'text-destructive',\n null: 'text-muted-foreground',\n object: 'text-foreground',\n array: 'text-foreground',\n unsupported: 'text-muted-foreground italic',\n};\n\nconst BRACKETS: Record<'object' | 'array', [string, string]> = {\n object: ['{', '}'],\n array: ['[', ']'],\n};\n\nexport interface JsonNodeLabels {\n expandLabel: string;\n collapseLabel: string;\n circularLabel: string;\n entriesLabel: (count: number) => string;\n}\n\ninterface JsonNodeProps {\n name?: string;\n value: unknown;\n depth: number;\n initialDepth: number;\n ancestors: readonly object[];\n labels: JsonNodeLabels;\n}\n\nfunction leafText(value: unknown, kind: JsonKind): string {\n if (kind === 'string') {\n return `\"${String(value)}\"`;\n }\n\n if (kind === 'null') {\n return 'null';\n }\n\n return String(value);\n}\n\nfunction JsonKey({\n name,\n slotName = 'json-viewer-key',\n}: { name: string } & SlotNameProps) {\n return (\n <span className=\"font-medium text-foreground\" data-slot={slotName}>\n {name}:\n </span>\n );\n}\n\nfunction JsonNode({\n name,\n value,\n depth,\n initialDepth,\n ancestors,\n labels,\n slotName = 'json-viewer-node',\n}: JsonNodeProps & SlotNameProps) {\n const kind = jsonKind(value);\n const branch = isBranch(kind);\n const circular = branch && ancestors.includes(value as object);\n const [open, setOpen] = React.useState(depth < initialDepth);\n\n const entries = React.useMemo(\n () => (branch && !circular ? entriesOf(value) : []),\n [branch, circular, value],\n );\n const trail = React.useMemo(\n () => (branch ? [...ancestors, value as object] : ancestors),\n [branch, ancestors, value],\n );\n\n if (!branch || circular) {\n return (\n <div className=\"gap-2 py-0.5 pl-5 flex\" data-slot={slotName}>\n {name !== undefined && <JsonKey name={name} />}\n {circular ? (\n <span\n data-slot=\"json-viewer-circular\"\n className=\"text-muted-foreground italic\"\n >\n {labels.circularLabel}\n </span>\n ) : (\n <span\n data-slot=\"json-viewer-value\"\n className={cn('break-all', LEAF_CLASS[kind])}\n >\n {leafText(value, kind)}\n </span>\n )}\n </div>\n );\n }\n\n const [opening, closing] = BRACKETS[kind === 'array' ? 'array' : 'object'];\n\n return (\n <div data-slot={slotName}>\n <button\n type=\"button\"\n data-slot=\"json-viewer-toggle\"\n aria-expanded={open}\n aria-label={open ? labels.collapseLabel : labels.expandLabel}\n onClick={() => setOpen((current) => !current)}\n className={cn(\n 'gap-2 rounded-xl py-0.5 flex w-full cursor-pointer items-center text-left hover:bg-accent',\n focusRing,\n )}\n >\n <ChevronRight\n aria-hidden=\"true\"\n className={cn(\n 'size-3.5 shrink-0 text-muted-foreground transition-transform',\n open && 'rotate-90',\n )}\n />\n {name !== undefined && <JsonKey name={name} />}\n <span className=\"text-muted-foreground\">{opening}</span>\n {!open && (\n <>\n <span\n data-slot=\"json-viewer-summary\"\n className=\"text-xs font-medium text-muted-foreground\"\n >\n {labels.entriesLabel(entries.length)}\n </span>\n <span className=\"text-muted-foreground\">{closing}</span>\n </>\n )}\n </button>\n {open && (\n <div className=\"ml-1.5 pl-3 border-l border-border\">\n {entries.map(([key, item]) => (\n <JsonNode\n key={key}\n name={key}\n value={item}\n depth={depth + 1}\n initialDepth={initialDepth}\n ancestors={trail}\n labels={labels}\n />\n ))}\n <div className=\"pl-5 text-muted-foreground\">{closing}</div>\n </div>\n )}\n </div>\n );\n}\n\nexport { JsonNode };\n","import * as React from 'react';\n\nimport { CopyButton } from '@/components/ui/copy-button';\nimport { JsonNode, type JsonNodeLabels } from '@/components/ui/json-node';\nimport { stringifyJson } from '@/lib/json-value';\nimport { elevatedSurface, nestedSurfaceReset } from '@/lib/language';\nimport { cn } from '@/lib/utils';\nimport { useUiLabels } from '@/locales/context';\nimport type { SlotNameProps } from '@/types';\n\nexport interface JsonViewerLabels extends JsonNodeLabels {\n copyLabel: string;\n copiedLabel: string;\n}\n\nexport const jsonViewerLabels: JsonViewerLabels = {\n copyLabel: 'Copy',\n copiedLabel: 'Copied',\n expandLabel: 'Expand',\n collapseLabel: 'Collapse',\n circularLabel: 'Circular reference',\n entriesLabel: (count) => `${count} ${count === 1 ? 'entry' : 'entries'}`,\n};\n\nexport interface JsonViewerProps extends Omit<\n React.ComponentProps<'div'>,\n 'children'\n> {\n value: unknown;\n initialDepth?: number;\n maxHeight?: number | string;\n copyLabel?: JsonViewerLabels['copyLabel'];\n copiedLabel?: JsonViewerLabels['copiedLabel'];\n expandLabel?: JsonViewerLabels['expandLabel'];\n collapseLabel?: JsonViewerLabels['collapseLabel'];\n circularLabel?: JsonViewerLabels['circularLabel'];\n entriesLabel?: JsonViewerLabels['entriesLabel'];\n}\n\nfunction JsonViewer({\n value,\n initialDepth = 1,\n maxHeight,\n copyLabel,\n copiedLabel,\n expandLabel,\n collapseLabel,\n circularLabel,\n entriesLabel,\n className,\n slotName = 'json-viewer',\n ...props\n}: JsonViewerProps & SlotNameProps) {\n const text = useUiLabels('jsonViewer', jsonViewerLabels, {\n copyLabel,\n copiedLabel,\n expandLabel,\n collapseLabel,\n circularLabel,\n entriesLabel,\n });\n const labels = React.useMemo<JsonNodeLabels>(\n () => ({\n expandLabel: text.expandLabel,\n collapseLabel: text.collapseLabel,\n circularLabel: text.circularLabel,\n entriesLabel: text.entriesLabel,\n }),\n [\n text.expandLabel,\n text.collapseLabel,\n text.circularLabel,\n text.entriesLabel,\n ],\n );\n\n return (\n <div\n className={cn(\n elevatedSurface,\n nestedSurfaceReset,\n 'relative overflow-hidden bg-card',\n className,\n )}\n {...props}\n data-slot={slotName}\n >\n <CopyButton\n value={stringifyJson(value)}\n copyLabel={text.copyLabel}\n copiedLabel={text.copiedLabel}\n className=\"top-2 right-2 absolute z-10 text-muted-foreground\"\n />\n <div\n data-slot=\"json-viewer-body\"\n style={{ maxHeight }}\n className=\"p-4 pr-12 font-mono text-sm leading-6 overflow-auto rounded-[inherit]\"\n >\n <JsonNode\n value={value}\n depth={0}\n initialDepth={initialDepth}\n ancestors={[]}\n labels={labels}\n />\n </div>\n </div>\n );\n}\n\nexport { JsonViewer };\n"]}
1
+ {"version":3,"sources":["../src/components/ui/code.tsx","../src/components/ui/code-block.tsx","../src/components/ui/code-block-header.tsx","../src/hooks/use-highlighted-code.ts","../src/lib/shiki.ts","../src/lib/code-lines.ts","../src/components/ui/json-viewer.tsx","../src/components/ui/json-node.tsx","../src/lib/json-value.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { compactRadius, controlFill } from '@/lib/language';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\n\nfunction Code({\n className,\n slotName = 'code',\n ...props\n}: React.ComponentProps<'code'> & SlotNameProps) {\n return (\n <code\n className={cn(\n compactRadius,\n controlFill,\n 'px-1.5 py-0.5 font-mono font-medium text-[0.875em] text-foreground',\n className,\n )}\n {...props}\n data-slot={slotName}\n />\n );\n}\n\nexport { Code };\n","import * as React from 'react';\n\nimport { Button } from '@/components/ui/button';\nimport { CodeBlockHeader } from '@/components/ui/code-block-header';\nimport { CopyButton } from '@/components/ui/copy-button';\nimport { useHighlightedCode } from '@/hooks/use-highlighted-code';\nimport {\n parseLineRanges,\n splitHighlightedLines,\n splitSourceLines,\n} from '@/lib/code-lines';\nimport { elevatedSurface, nestedSurfaceReset } from '@/lib/language';\nimport { cn } from '@/lib/utils';\nimport { useUiLabels } from '@/locales/context';\nimport type { SlotNameProps } from '@/types';\n\nexport interface CodeBlockLabels {\n copyLabel: string;\n copiedLabel: string;\n expandLabel: string;\n collapseLabel: string;\n}\n\nexport const codeBlockLabels: CodeBlockLabels = {\n copyLabel: 'Copy',\n copiedLabel: 'Copied',\n expandLabel: 'Expand',\n collapseLabel: 'Collapse',\n};\n\nexport interface CodeBlockProps extends Omit<\n React.ComponentProps<'div'>,\n 'children'\n> {\n code: string;\n language?: string;\n html?: string;\n filename?: string;\n lineNumbers?: boolean;\n highlightLines?: string | number[];\n maxHeight?: number | string;\n copyLabel?: CodeBlockLabels['copyLabel'];\n copiedLabel?: CodeBlockLabels['copiedLabel'];\n expandLabel?: CodeBlockLabels['expandLabel'];\n collapseLabel?: CodeBlockLabels['collapseLabel'];\n}\n\nfunction CodeBlock({\n code,\n language,\n html,\n filename,\n lineNumbers = false,\n highlightLines,\n maxHeight,\n copyLabel,\n copiedLabel,\n expandLabel,\n collapseLabel,\n className,\n slotName = 'code-block',\n ...props\n}: CodeBlockProps & SlotNameProps) {\n const labels = useUiLabels('codeBlock', codeBlockLabels, {\n copyLabel,\n copiedLabel,\n expandLabel,\n collapseLabel,\n });\n const highlighted = useHighlightedCode(code, language, html);\n const lines = React.useMemo(() => splitSourceLines(code), [code]);\n const markup = React.useMemo(\n () =>\n highlighted === null ? null : splitHighlightedLines(highlighted),\n [highlighted],\n );\n const emphasised = React.useMemo(\n () => parseLineRanges(highlightLines),\n [highlightLines],\n );\n\n const bodyRef = React.useRef<HTMLDivElement>(null);\n const [expanded, setExpanded] = React.useState(false);\n const [clipped, setClipped] = React.useState(false);\n\n React.useEffect(() => {\n const body = bodyRef.current;\n\n if (!body || maxHeight === undefined || expanded) {\n return;\n }\n\n setClipped(body.scrollHeight > body.clientHeight + 1);\n }, [maxHeight, expanded, lines, markup]);\n\n return (\n <div\n className={cn(\n elevatedSurface,\n nestedSurfaceReset,\n 'relative overflow-hidden bg-card',\n className,\n )}\n {...props}\n data-slot={slotName}\n >\n {filename === undefined ? (\n <CopyButton\n value={code}\n copyLabel={labels.copyLabel}\n copiedLabel={labels.copiedLabel}\n className=\"top-2 right-2 absolute z-10 text-muted-foreground\"\n />\n ) : (\n <CodeBlockHeader\n filename={filename}\n language={language}\n code={code}\n copyLabel={labels.copyLabel}\n copiedLabel={labels.copiedLabel}\n />\n )}\n <div\n ref={bodyRef}\n data-slot=\"code-block-body\"\n style={{ maxHeight: expanded ? undefined : maxHeight }}\n className=\"py-4 font-mono text-sm leading-6 overflow-auto rounded-[inherit]\"\n >\n <pre className=\"w-max min-w-full\">\n <code data-slot=\"code-block-code\">\n {lines.map((line, index) => (\n <CodeBlockLine\n key={index}\n number={index + 1}\n line={line}\n markup={markup?.[index]}\n lineNumbers={lineNumbers}\n emphasised={emphasised.has(index + 1)}\n />\n ))}\n </code>\n </pre>\n </div>\n {clipped && (\n <CodeBlockExpander\n expanded={expanded}\n expandLabel={labels.expandLabel}\n collapseLabel={labels.collapseLabel}\n onToggle={() => setExpanded((open) => !open)}\n />\n )}\n </div>\n );\n}\n\ninterface CodeBlockLineProps {\n number: number;\n line: string;\n markup: string | undefined;\n lineNumbers: boolean;\n emphasised: boolean;\n}\n\nfunction CodeBlockLine({\n number,\n line,\n markup,\n lineNumbers,\n emphasised,\n slotName = 'code-block-line',\n}: CodeBlockLineProps & SlotNameProps) {\n return (\n <span\n data-highlighted={emphasised ? '' : undefined}\n className={cn(\n 'min-h-6 px-4 grid w-full data-highlighted:bg-accent',\n lineNumbers ? 'grid-cols-[2.5rem_1fr]' : 'grid-cols-1',\n )}\n data-slot={slotName}\n >\n {lineNumbers && (\n <span\n data-slot=\"code-block-gutter\"\n aria-hidden=\"true\"\n className=\"pr-4 text-right text-muted-foreground select-none\"\n >\n {number}\n </span>\n )}\n {markup === undefined ? (\n <span data-slot=\"code-block-source\">{line}</span>\n ) : (\n <span\n data-slot=\"code-block-source\"\n dangerouslySetInnerHTML={{ __html: markup }}\n />\n )}\n </span>\n );\n}\n\ninterface CodeBlockExpanderProps {\n expanded: boolean;\n expandLabel: string;\n collapseLabel: string;\n onToggle: () => void;\n}\n\nfunction CodeBlockExpander({\n expanded,\n expandLabel,\n collapseLabel,\n onToggle,\n slotName = 'code-block-expander',\n}: CodeBlockExpanderProps & SlotNameProps) {\n return (\n <div\n className=\"inset-x-0 bottom-0 pt-10 pb-2 absolute flex justify-center\"\n data-slot={slotName}\n >\n {!expanded && (\n <span\n aria-hidden=\"true\"\n className=\"inset-0 pointer-events-none absolute bg-gradient-to-t from-card to-transparent\"\n />\n )}\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n onClick={onToggle}\n >\n {expanded ? collapseLabel : expandLabel}\n </Button>\n </div>\n );\n}\n\nexport { CodeBlock };\n","import { FileCode } from 'lucide-react';\n\nimport { CopyButton, type CopyButtonLabels } from '@/components/ui/copy-button';\nimport type { SlotNameProps } from '@/types';\n\ninterface CodeBlockHeaderProps {\n filename: string;\n language?: string;\n code: string;\n copyLabel: CopyButtonLabels['copyLabel'];\n copiedLabel: CopyButtonLabels['copiedLabel'];\n}\n\nfunction CodeBlockHeader({\n filename,\n language,\n code,\n copyLabel,\n copiedLabel,\n slotName = 'code-block-header',\n}: CodeBlockHeaderProps & SlotNameProps) {\n return (\n <div\n className=\"gap-2 px-4 py-2 flex items-center border-b border-border\"\n data-slot={slotName}\n >\n <FileCode className=\"size-4 shrink-0 text-muted-foreground\" />\n <span\n data-slot=\"code-block-filename\"\n className=\"text-sm font-medium truncate text-foreground\"\n >\n {filename}\n </span>\n {language !== undefined && (\n <span\n data-slot=\"code-block-language\"\n className=\"text-xs font-medium tracking-wide text-muted-foreground uppercase\"\n >\n {language}\n </span>\n )}\n <CopyButton\n value={code}\n copyLabel={copyLabel}\n copiedLabel={copiedLabel}\n className=\"ml-auto text-muted-foreground\"\n />\n </div>\n );\n}\n\nexport { CodeBlockHeader };\n","import * as React from 'react';\n\nimport { highlightCode } from '@/lib/shiki';\n\nexport function useHighlightedCode(\n code: string,\n language: string | undefined,\n html: string | undefined,\n): string | null {\n const [highlighted, setHighlighted] = React.useState<string | null>(\n html ?? null,\n );\n\n React.useEffect(() => {\n if (html !== undefined) {\n setHighlighted(html);\n\n return;\n }\n\n if (language === undefined) {\n setHighlighted(null);\n\n return;\n }\n\n let active = true;\n\n highlightCode(code, language).then((result) => {\n if (active) {\n setHighlighted(result);\n }\n });\n\n return () => {\n active = false;\n };\n }, [code, language, html]);\n\n return highlighted;\n}\n","const LIGHT_THEME = 'github-light';\n\nconst DARK_THEME = 'github-dark';\n\ntype CodeToHtml = typeof import('shiki').codeToHtml;\n\nlet pending: Promise<CodeToHtml | null> | null = null;\n\nfunction loadCodeToHtml(): Promise<CodeToHtml | null> {\n pending ??= import('shiki')\n .then((module) => module.codeToHtml)\n .catch(() => null);\n\n return pending;\n}\n\nexport async function highlightCode(\n code: string,\n language: string,\n): Promise<string | null> {\n const codeToHtml = await loadCodeToHtml();\n\n if (!codeToHtml) {\n return null;\n }\n\n try {\n return await codeToHtml(code, {\n lang: language,\n themes: { light: LIGHT_THEME, dark: DARK_THEME },\n defaultColor: false,\n });\n } catch {\n return null;\n }\n}\n","const LINE_OPEN = '<span class=\"line\">';\n\nconst SPAN_CLOSE = '</span>';\n\nexport function splitSourceLines(code: string): string[] {\n return code.replace(/\\n$/, '').split('\\n');\n}\n\nexport function parseLineRanges(\n spec: string | number[] | undefined,\n): Set<number> {\n const lines = new Set<number>();\n\n if (spec === undefined) {\n return lines;\n }\n\n if (Array.isArray(spec)) {\n for (const line of spec) {\n lines.add(line);\n }\n\n return lines;\n }\n\n for (const part of spec.split(',')) {\n const [from, to] = part\n .split('-')\n .map((bound) => Number.parseInt(bound.trim(), 10));\n\n if (Number.isNaN(from)) {\n continue;\n }\n\n const last = to === undefined || Number.isNaN(to) ? from : to;\n\n for (let line = from; line <= last; line += 1) {\n lines.add(line);\n }\n }\n\n return lines;\n}\n\nfunction closingSpan(html: string, from: number): number {\n let depth = 0;\n let cursor = from;\n\n while (cursor < html.length) {\n const open = html.indexOf('<span', cursor);\n const close = html.indexOf(SPAN_CLOSE, cursor);\n\n if (close === -1) {\n return -1;\n }\n\n if (open !== -1 && open < close) {\n depth += 1;\n cursor = open + 5;\n continue;\n }\n\n if (depth === 0) {\n return close;\n }\n\n depth -= 1;\n cursor = close + SPAN_CLOSE.length;\n }\n\n return -1;\n}\n\nexport function splitHighlightedLines(html: string): string[] | null {\n const lines: string[] = [];\n let cursor = html.indexOf(LINE_OPEN);\n\n while (cursor !== -1) {\n const start = cursor + LINE_OPEN.length;\n const end = closingSpan(html, start);\n\n if (end === -1) {\n return null;\n }\n\n lines.push(html.slice(start, end));\n cursor = html.indexOf(LINE_OPEN, end);\n }\n\n return lines.length > 0 ? lines : null;\n}\n","import * as React from 'react';\n\nimport { CopyButton } from '@/components/ui/copy-button';\nimport { JsonNode, type JsonNodeLabels } from '@/components/ui/json-node';\nimport { stringifyJson } from '@/lib/json-value';\nimport { elevatedSurface, nestedSurfaceReset } from '@/lib/language';\nimport { cn } from '@/lib/utils';\nimport { useUiLabels } from '@/locales/context';\nimport type { SlotNameProps } from '@/types';\n\nexport interface JsonViewerLabels extends JsonNodeLabels {\n copyLabel: string;\n copiedLabel: string;\n}\n\nexport const jsonViewerLabels: JsonViewerLabels = {\n copyLabel: 'Copy',\n copiedLabel: 'Copied',\n expandLabel: 'Expand',\n collapseLabel: 'Collapse',\n circularLabel: 'Circular reference',\n entriesLabel: (count) => `${count} ${count === 1 ? 'entry' : 'entries'}`,\n};\n\nexport interface JsonViewerProps extends Omit<\n React.ComponentProps<'div'>,\n 'children'\n> {\n value: unknown;\n initialDepth?: number;\n maxHeight?: number | string;\n copyLabel?: JsonViewerLabels['copyLabel'];\n copiedLabel?: JsonViewerLabels['copiedLabel'];\n expandLabel?: JsonViewerLabels['expandLabel'];\n collapseLabel?: JsonViewerLabels['collapseLabel'];\n circularLabel?: JsonViewerLabels['circularLabel'];\n entriesLabel?: JsonViewerLabels['entriesLabel'];\n}\n\nfunction JsonViewer({\n value,\n initialDepth = 1,\n maxHeight,\n copyLabel,\n copiedLabel,\n expandLabel,\n collapseLabel,\n circularLabel,\n entriesLabel,\n className,\n slotName = 'json-viewer',\n ...props\n}: JsonViewerProps & SlotNameProps) {\n const text = useUiLabels('jsonViewer', jsonViewerLabels, {\n copyLabel,\n copiedLabel,\n expandLabel,\n collapseLabel,\n circularLabel,\n entriesLabel,\n });\n const labels = React.useMemo<JsonNodeLabels>(\n () => ({\n expandLabel: text.expandLabel,\n collapseLabel: text.collapseLabel,\n circularLabel: text.circularLabel,\n entriesLabel: text.entriesLabel,\n }),\n [\n text.expandLabel,\n text.collapseLabel,\n text.circularLabel,\n text.entriesLabel,\n ],\n );\n\n return (\n <div\n className={cn(\n elevatedSurface,\n nestedSurfaceReset,\n 'relative overflow-hidden bg-card',\n className,\n )}\n {...props}\n data-slot={slotName}\n >\n <CopyButton\n value={stringifyJson(value)}\n copyLabel={text.copyLabel}\n copiedLabel={text.copiedLabel}\n className=\"top-2 right-2 absolute z-10 text-muted-foreground\"\n />\n <div\n data-slot=\"json-viewer-body\"\n style={{ maxHeight }}\n className=\"p-4 pr-12 font-mono text-sm leading-6 overflow-auto rounded-[inherit]\"\n >\n <JsonNode\n value={value}\n depth={0}\n initialDepth={initialDepth}\n ancestors={[]}\n labels={labels}\n />\n </div>\n </div>\n );\n}\n\nexport { JsonViewer };\n","import { ChevronRight } from 'lucide-react';\nimport * as React from 'react';\n\nimport { entriesOf, isBranch, jsonKind, type JsonKind } from '@/lib/json-value';\nimport { focusRing } from '@/lib/language';\nimport { cn } from '@/lib/utils';\nimport type { SlotNameProps } from '@/types';\n\nconst LEAF_CLASS: Record<JsonKind, string> = {\n string: 'text-success',\n number: 'text-primary',\n boolean: 'text-destructive',\n null: 'text-muted-foreground',\n object: 'text-foreground',\n array: 'text-foreground',\n unsupported: 'text-muted-foreground italic',\n};\n\nconst BRACKETS: Record<'object' | 'array', [string, string]> = {\n object: ['{', '}'],\n array: ['[', ']'],\n};\n\nexport interface JsonNodeLabels {\n expandLabel: string;\n collapseLabel: string;\n circularLabel: string;\n entriesLabel: (count: number) => string;\n}\n\ninterface JsonNodeProps {\n name?: string;\n value: unknown;\n depth: number;\n initialDepth: number;\n ancestors: readonly object[];\n labels: JsonNodeLabels;\n}\n\nfunction leafText(value: unknown, kind: JsonKind): string {\n if (kind === 'string') {\n return `\"${String(value)}\"`;\n }\n\n if (kind === 'null') {\n return 'null';\n }\n\n return String(value);\n}\n\nfunction JsonKey({\n name,\n slotName = 'json-viewer-key',\n}: { name: string } & SlotNameProps) {\n return (\n <span className=\"font-medium text-foreground\" data-slot={slotName}>\n {name}:\n </span>\n );\n}\n\nfunction JsonNode({\n name,\n value,\n depth,\n initialDepth,\n ancestors,\n labels,\n slotName = 'json-viewer-node',\n}: JsonNodeProps & SlotNameProps) {\n const kind = jsonKind(value);\n const branch = isBranch(kind);\n const circular = branch && ancestors.includes(value as object);\n const [open, setOpen] = React.useState(depth < initialDepth);\n\n const entries = React.useMemo(\n () => (branch && !circular ? entriesOf(value) : []),\n [branch, circular, value],\n );\n const trail = React.useMemo(\n () => (branch ? [...ancestors, value as object] : ancestors),\n [branch, ancestors, value],\n );\n\n if (!branch || circular) {\n return (\n <div className=\"gap-2 py-0.5 pl-5 flex\" data-slot={slotName}>\n {name !== undefined && <JsonKey name={name} />}\n {circular ? (\n <span\n data-slot=\"json-viewer-circular\"\n className=\"text-muted-foreground italic\"\n >\n {labels.circularLabel}\n </span>\n ) : (\n <span\n data-slot=\"json-viewer-value\"\n className={cn('break-all', LEAF_CLASS[kind])}\n >\n {leafText(value, kind)}\n </span>\n )}\n </div>\n );\n }\n\n const [opening, closing] = BRACKETS[kind === 'array' ? 'array' : 'object'];\n\n return (\n <div data-slot={slotName}>\n <button\n type=\"button\"\n data-slot=\"json-viewer-toggle\"\n aria-expanded={open}\n aria-label={open ? labels.collapseLabel : labels.expandLabel}\n onClick={() => setOpen((current) => !current)}\n className={cn(\n 'gap-2 rounded-xl py-0.5 flex w-full cursor-pointer items-center text-left hover:bg-accent',\n focusRing,\n )}\n >\n <ChevronRight\n aria-hidden=\"true\"\n className={cn(\n 'size-3.5 shrink-0 text-muted-foreground transition-transform',\n open && 'rotate-90',\n )}\n />\n {name !== undefined && <JsonKey name={name} />}\n <span className=\"text-muted-foreground\">{opening}</span>\n {!open && (\n <>\n <span\n data-slot=\"json-viewer-summary\"\n className=\"text-xs font-medium text-muted-foreground\"\n >\n {labels.entriesLabel(entries.length)}\n </span>\n <span className=\"text-muted-foreground\">{closing}</span>\n </>\n )}\n </button>\n {open && (\n <div className=\"ml-1.5 pl-3 border-l border-border\">\n {entries.map(([key, item]) => (\n <JsonNode\n key={key}\n name={key}\n value={item}\n depth={depth + 1}\n initialDepth={initialDepth}\n ancestors={trail}\n labels={labels}\n />\n ))}\n <div className=\"pl-5 text-muted-foreground\">{closing}</div>\n </div>\n )}\n </div>\n );\n}\n\nexport { JsonNode };\n","export type JsonKind =\n | 'string'\n | 'number'\n | 'boolean'\n | 'null'\n | 'object'\n | 'array'\n | 'unsupported';\n\nconst CIRCULAR_MARKER = '[Circular]';\n\nexport function jsonKind(value: unknown): JsonKind {\n if (value === null) {\n return 'null';\n }\n\n if (Array.isArray(value)) {\n return 'array';\n }\n\n switch (typeof value) {\n case 'string':\n return 'string';\n case 'number':\n return Number.isFinite(value) ? 'number' : 'unsupported';\n case 'boolean':\n return 'boolean';\n case 'object':\n return 'object';\n default:\n return 'unsupported';\n }\n}\n\nexport function isBranch(kind: JsonKind): boolean {\n return kind === 'object' || kind === 'array';\n}\n\nexport function entriesOf(value: unknown): [string, unknown][] {\n if (Array.isArray(value)) {\n return value.map((item, index) => [String(index), item]);\n }\n\n if (value !== null && typeof value === 'object') {\n return Object.entries(value as Record<string, unknown>);\n }\n\n return [];\n}\n\nfunction serialisable(value: unknown, ancestors: readonly object[]): unknown {\n if (typeof value === 'bigint') {\n return value.toString();\n }\n\n if (value === null || typeof value !== 'object') {\n return value;\n }\n\n if (ancestors.includes(value)) {\n return CIRCULAR_MARKER;\n }\n\n const trail = [...ancestors, value];\n\n if (Array.isArray(value)) {\n return value.map((item) => serialisable(item, trail));\n }\n\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>).map(([key, item]) => [\n key,\n serialisable(item, trail),\n ]),\n );\n}\n\nexport function stringifyJson(value: unknown): string {\n return JSON.stringify(serialisable(value, []), null, 2) ?? 'null';\n}\n"],"mappings":"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","names":["React","jsx","jsx","jsxs","React","React","jsx","jsxs","jsx","jsxs"]}
@@ -1,12 +1,12 @@
1
1
  import * as React from 'react';
2
2
  import { ReactNode, ComponentProps } from 'react';
3
3
  import { LucideIcon } from 'lucide-react';
4
- import { S as SlotNameProps, U as UrlLike, d as LinkComponent, I as IconComponent } from './types-cmBL8zOc.js';
5
- import { d as TourLabels } from './types-u1qfmJQi.js';
4
+ import { a as LoginFormLabels, e as TourLabels } from './types-1LUmNJf_.js';
5
+ import { S as SlotNameProps, U as UrlLike, L as LinkComponent, I as IconComponent } from './types-CMZRvMV5.js';
6
6
  import * as class_variance_authority_types from 'class-variance-authority/types';
7
7
  import { VariantProps } from 'class-variance-authority';
8
- import { a as CodeBlockLabels, c as JsonViewerLabels } from './json-viewer-BARA2RCW.js';
9
- import { b as buttonVariants, a as ButtonProps, I as Input } from './input-Dxnsxi-f.js';
8
+ import { a as CodeBlockLabels, c as JsonViewerLabels } from './json-viewer-Bssv9mTD.js';
9
+ import { b as buttonVariants, a as ButtonProps, I as Input } from './input-B4uEClxB.js';
10
10
  import { Column, ColumnDef, Row } from '@tanstack/react-table';
11
11
 
12
12
  interface CommandPaletteItem {
@@ -390,6 +390,7 @@ interface UiLabelSections {
390
390
  dateRangeFilter: DateRangeFilterLabels;
391
391
  floatingSheet: FloatingSheetLabels;
392
392
  jsonViewer: JsonViewerLabels;
393
+ loginForm: LoginFormLabels;
393
394
  passwordInput: PasswordInputLabels;
394
395
  saveStatus: SaveStatusLabels;
395
396
  settings: SettingsLabels;
@@ -402,6 +403,13 @@ type UiLabels = {
402
403
  dateFilterOperators?: DateFilterOption[];
403
404
  dateFilterUnits?: DateFilterOption[];
404
405
  };
406
+ type FullUiLabels = {
407
+ [Section in keyof UiLabelSections]: UiLabelSections[Section];
408
+ } & {
409
+ dateFilterPresets: DateFilterOption[];
410
+ dateFilterOperators: DateFilterOption[];
411
+ dateFilterUnits: DateFilterOption[];
412
+ };
405
413
  declare function UiLocaleProvider({ labels, children, }: {
406
414
  labels: UiLabels;
407
415
  children: ReactNode;
@@ -409,4 +417,4 @@ declare function UiLocaleProvider({ labels, children, }: {
409
417
  declare function useUiLocale(): UiLabels;
410
418
  declare function useUiLabels<Section extends keyof UiLabelSections>(section: Section, defaults: UiLabelSections[Section], overrides?: Partial<UiLabelSections[Section]>): UiLabelSections[Section];
411
419
 
412
- export { DatePicker as $, useUiLocale as A, Alert as B, type CopyButtonLabels as C, type DateFilterValue as D, AlertDescription as E, type FloatingSheetLabels as F, type AlertLabels as G, AlertTitle as H, AppearanceToggle as I, type AppearanceToggleLabels as J, type AppearanceToggleProps as K, Combobox as L, type ComboboxLabels as M, type ComboboxOption as N, type ComboboxProps as O, ConfirmDialog as P, type ConfirmDialogLabels as Q, CopyButton as R, SettingsEntry as S, type CopyButtonProps as T, type UiLabelSections as U, DataTable as V, type DataTableFacetedFilterLabels as W, type DataTableFilter as X, type DataTableLabels as Y, type DataTableRowAction as Z, type DataTableServerFilter as _, type DateFilterLabels as a, type DatePickerLabels as a0, type DatePickerProps as a1, DateRangeFilter as a2, type DateRangeFilterLabels as a3, type DateRangeFilterProps as a4, FacetedFilter as a5, PasswordInput as a6, type PasswordInputLabels as a7, RowActionsMenu as a8, SAVED_DURATION as a9, SaveStatus as aa, type SaveStatusLabels as ab, type SaveStatusProps as ac, type SaveStatusState as ad, ServerFacetedFilter as ae, alertDefaultLabels as af, appearanceToggleDefaultLabels as ag, comboboxDefaultLabels as ah, confirmDialogDefaultLabels as ai, copyButtonLabels as aj, dataTableDefaultLabels as ak, dataTableFacetedFilterDefaultLabels as al, datePickerDefaultLabels as am, dateRangeFilterDefaultLabels as an, floatingSheetDefaultLabels as ao, passwordInputDefaultLabels as ap, saveStatusLabels as aq, type CommandPaletteLabels as ar, type DateFilterOption as b, type DateFilterUnit as c, CommandPalette as d, type CommandPaletteGroup as e, type CommandPaletteItem as f, type CommandPaletteProps as g, DEFAULT_LABELS as h, DEFAULT_OPERATORS as i, DEFAULT_PRESETS as j, DEFAULT_UNITS as k, type DateFilterMode as l, type DateFilterOperator as m, type SettingsEntryProps as n, SettingsGroup as o, type SettingsGroupProps as p, type SettingsLabels as q, SettingsPage as r, type SettingsPageProps as s, SettingsSection as t, type SettingsSectionProps as u, type UiLabels as v, UiLocaleProvider as w, settingsLabels as x, useCommandPalette as y, useUiLabels as z };
420
+ export { DatePicker as $, useUiLocale as A, Alert as B, type CopyButtonLabels as C, type DateFilterValue as D, AlertDescription as E, type FloatingSheetLabels as F, type AlertLabels as G, AlertTitle as H, AppearanceToggle as I, type AppearanceToggleLabels as J, type AppearanceToggleProps as K, Combobox as L, type ComboboxLabels as M, type ComboboxOption as N, type ComboboxProps as O, ConfirmDialog as P, type ConfirmDialogLabels as Q, CopyButton as R, SettingsEntry as S, type CopyButtonProps as T, type UiLabelSections as U, DataTable as V, type DataTableFacetedFilterLabels as W, type DataTableFilter as X, type DataTableLabels as Y, type DataTableRowAction as Z, type DataTableServerFilter as _, type DateFilterLabels as a, type DatePickerLabels as a0, type DatePickerProps as a1, DateRangeFilter as a2, type DateRangeFilterLabels as a3, type DateRangeFilterProps as a4, FacetedFilter as a5, PasswordInput as a6, type PasswordInputLabels as a7, RowActionsMenu as a8, SAVED_DURATION as a9, SaveStatus as aa, type SaveStatusLabels as ab, type SaveStatusProps as ac, type SaveStatusState as ad, ServerFacetedFilter as ae, alertDefaultLabels as af, appearanceToggleDefaultLabels as ag, comboboxDefaultLabels as ah, confirmDialogDefaultLabels as ai, copyButtonLabels as aj, dataTableDefaultLabels as ak, dataTableFacetedFilterDefaultLabels as al, datePickerDefaultLabels as am, dateRangeFilterDefaultLabels as an, floatingSheetDefaultLabels as ao, passwordInputDefaultLabels as ap, saveStatusLabels as aq, type CommandPaletteLabels as ar, type FullUiLabels as as, type DateFilterOption as b, type DateFilterUnit as c, CommandPalette as d, type CommandPaletteGroup as e, type CommandPaletteItem as f, type CommandPaletteProps as g, DEFAULT_LABELS as h, DEFAULT_OPERATORS as i, DEFAULT_PRESETS as j, DEFAULT_UNITS as k, type DateFilterMode as l, type DateFilterOperator as m, type SettingsEntryProps as n, SettingsGroup as o, type SettingsGroupProps as p, type SettingsLabels as q, SettingsPage as r, type SettingsPageProps as s, SettingsSection as t, type SettingsSectionProps as u, type UiLabels as v, UiLocaleProvider as w, settingsLabels as x, useCommandPalette as y, useUiLabels as z };
package/dist/editor.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import { ReactNode } from 'react';
3
- import { S as SlotNameProps } from './types-cmBL8zOc.js';
3
+ import { S as SlotNameProps } from './types-CMZRvMV5.js';
4
4
  import { Editor as Editor$1, Extensions, JSONContent } from '@tiptap/core';
5
5
  import { LucideIcon } from 'lucide-react';
6
6
  import '@tanstack/react-table';
package/dist/editor.js CHANGED
@@ -1,13 +1,36 @@
1
- import { Toggle } from './chunk-YBXRJSR3.js';
2
- import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, Label, DialogFooter } from './chunk-N2KIFFI7.js';
3
- import { Input, Separator } from './chunk-3Z2VGVPI.js';
4
- import { cn, Button, fieldSurface, focusRing } from './chunk-KHOA4TEI.js';
5
- import { EditorContent as EditorContent$1, useEditor } from '@tiptap/react';
6
- import { createContext, useContext, useState, useRef, useMemo, useEffect, useId } from 'react';
7
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
8
- import { Code, Strikethrough, Italic, Bold, Heading6, Heading5, Heading4, Heading3, Heading2, Heading1, List, ListOrdered, Quote, Undo2, Redo2, Link2 } from 'lucide-react';
9
- import StarterKit from '@tiptap/starter-kit';
1
+ 'use client';
10
2
 
3
+ "use client";
4
+ import {
5
+ Toggle
6
+ } from "./chunk-CAUTXZ4U.js";
7
+ import {
8
+ Dialog,
9
+ DialogContent,
10
+ DialogDescription,
11
+ DialogFooter,
12
+ DialogHeader,
13
+ DialogTitle
14
+ } from "./chunk-QZRSQVCN.js";
15
+ import {
16
+ Label
17
+ } from "./chunk-BP2YDMMI.js";
18
+ import {
19
+ Input,
20
+ Separator
21
+ } from "./chunk-53V4J7MC.js";
22
+ import {
23
+ Button,
24
+ cn,
25
+ fieldSurface,
26
+ focusRing
27
+ } from "./chunk-PPWJK5T3.js";
28
+
29
+ // src/components/ui/editor/content.tsx
30
+ import { EditorContent as TiptapContent } from "@tiptap/react";
31
+
32
+ // src/components/ui/editor/context.tsx
33
+ import { createContext, useContext } from "react";
11
34
  var EditorContext = createContext(null);
12
35
  var EditorContextProvider = EditorContext.Provider;
13
36
  function useEditorContext() {
@@ -17,6 +40,9 @@ function useEditorContext() {
17
40
  }
18
41
  return context;
19
42
  }
43
+
44
+ // src/components/ui/editor/content.tsx
45
+ import { jsx } from "react/jsx-runtime";
20
46
  function EditorContent({
21
47
  className,
22
48
  slotName = "editor-content"
@@ -32,17 +58,39 @@ function EditorContent({
32
58
  className
33
59
  ),
34
60
  "data-slot": slotName,
35
- children: /* @__PURE__ */ jsx(EditorContent$1, { editor })
61
+ children: /* @__PURE__ */ jsx(TiptapContent, { editor })
36
62
  }
37
63
  );
38
64
  }
65
+
66
+ // src/components/ui/editor/controls.tsx
67
+ import {
68
+ Bold,
69
+ Code,
70
+ Heading1,
71
+ Heading2,
72
+ Heading3,
73
+ Heading4,
74
+ Heading5,
75
+ Heading6,
76
+ Italic,
77
+ List,
78
+ ListOrdered,
79
+ Quote,
80
+ Redo2,
81
+ Strikethrough,
82
+ Undo2
83
+ } from "lucide-react";
84
+
85
+ // src/components/ui/editor/toolbar.tsx
86
+ import { jsx as jsx2 } from "react/jsx-runtime";
39
87
  function EditorToolbar({
40
88
  children,
41
89
  className,
42
90
  slotName = "editor-toolbar"
43
91
  }) {
44
92
  const { labels } = useEditorContext();
45
- return /* @__PURE__ */ jsx(
93
+ return /* @__PURE__ */ jsx2(
46
94
  "div",
47
95
  {
48
96
  role: "toolbar",
@@ -64,7 +112,7 @@ function EditorControl({
64
112
  slotName = "editor-control"
65
113
  }) {
66
114
  const { editable } = useEditorContext();
67
- return /* @__PURE__ */ jsx(
115
+ return /* @__PURE__ */ jsx2(
68
116
  Toggle,
69
117
  {
70
118
  size: "sm",
@@ -75,10 +123,13 @@ function EditorControl({
75
123
  onPressedChange: onActivate,
76
124
  className,
77
125
  slotName,
78
- children: /* @__PURE__ */ jsx(Icon, { "aria-hidden": "true" })
126
+ children: /* @__PURE__ */ jsx2(Icon, { "aria-hidden": "true" })
79
127
  }
80
128
  );
81
129
  }
130
+
131
+ // src/components/ui/editor/controls.tsx
132
+ import { jsx as jsx3 } from "react/jsx-runtime";
82
133
  var MARK_ICONS = {
83
134
  bold: Bold,
84
135
  italic: Italic,
@@ -93,7 +144,7 @@ function EditorMark({ mark, label, className }) {
93
144
  strike: labels.strikeLabel,
94
145
  code: labels.codeLabel
95
146
  };
96
- return /* @__PURE__ */ jsx(
147
+ return /* @__PURE__ */ jsx3(
97
148
  EditorControl,
98
149
  {
99
150
  label: label ?? names[mark],
@@ -115,7 +166,7 @@ var HEADING_ICONS = {
115
166
  };
116
167
  function EditorHeading({ level, label, className }) {
117
168
  const { editor, labels } = useEditorContext();
118
- return /* @__PURE__ */ jsx(
169
+ return /* @__PURE__ */ jsx3(
119
170
  EditorControl,
120
171
  {
121
172
  label: label ?? labels.headingLabel(level),
@@ -130,7 +181,7 @@ function EditorHeading({ level, label, className }) {
130
181
  function EditorList({ variant, label, className }) {
131
182
  const { editor, labels } = useEditorContext();
132
183
  const name = variant === "bullet" ? "bulletList" : "orderedList";
133
- return /* @__PURE__ */ jsx(
184
+ return /* @__PURE__ */ jsx3(
134
185
  EditorControl,
135
186
  {
136
187
  label: label ?? (variant === "bullet" ? labels.bulletListLabel : labels.orderedListLabel),
@@ -144,7 +195,7 @@ function EditorList({ variant, label, className }) {
144
195
  }
145
196
  function EditorBlockquote({ label, className }) {
146
197
  const { editor, labels } = useEditorContext();
147
- return /* @__PURE__ */ jsx(
198
+ return /* @__PURE__ */ jsx3(
148
199
  EditorControl,
149
200
  {
150
201
  label: label ?? labels.blockquoteLabel,
@@ -166,7 +217,7 @@ function EditorHistory({
166
217
  const undoing = action === "undo";
167
218
  const available = undoing ? editor.can().undo() : editor.can().redo();
168
219
  const Icon = undoing ? Undo2 : Redo2;
169
- return /* @__PURE__ */ jsx(
220
+ return /* @__PURE__ */ jsx3(
170
221
  Button,
171
222
  {
172
223
  type: "button",
@@ -178,10 +229,17 @@ function EditorHistory({
178
229
  onClick: () => undoing ? editor.chain().focus().undo().run() : editor.chain().focus().redo().run(),
179
230
  className,
180
231
  slotName,
181
- children: /* @__PURE__ */ jsx(Icon, { "aria-hidden": "true" })
232
+ children: /* @__PURE__ */ jsx3(Icon, { "aria-hidden": "true" })
182
233
  }
183
234
  );
184
235
  }
236
+
237
+ // src/components/ui/editor/editor.tsx
238
+ import { useEditor } from "@tiptap/react";
239
+ import { useEffect, useMemo, useRef, useState } from "react";
240
+
241
+ // src/components/ui/editor/extensions.ts
242
+ import StarterKit from "@tiptap/starter-kit";
185
243
  var SAFE_PROTOCOLS = ["http", "https", "mailto", "tel"];
186
244
  function isSafeEditorUrl(url) {
187
245
  const protocol = /^([a-z][a-z0-9+.-]*):/i.exec(url.trim())?.[1];
@@ -226,6 +284,9 @@ var editorLabels = {
226
284
  linkRemoveLabel: "Remove",
227
285
  linkCancelLabel: "Cancel"
228
286
  };
287
+
288
+ // src/components/ui/editor/editor.tsx
289
+ import { jsx as jsx4 } from "react/jsx-runtime";
229
290
  var editorProse = "text-sm font-medium leading-relaxed [&_p]:my-2 [&_h1]:mt-4 [&_h1]:mb-2 [&_h1]:text-2xl [&_h1]:font-bold [&_h2]:mt-4 [&_h2]:mb-2 [&_h2]:text-xl [&_h2]:font-bold [&_h3]:mt-3 [&_h3]:mb-2 [&_h3]:text-lg [&_h3]:font-semibold [&_ul]:my-2 [&_ul]:list-disc [&_ul]:pl-6 [&_ol]:my-2 [&_ol]:list-decimal [&_ol]:pl-6 [&_li]:my-1 [&_blockquote]:my-3 [&_blockquote]:border-l-2 [&_blockquote]:border-border [&_blockquote]:pl-4 [&_blockquote]:text-muted-foreground [&_a]:text-primary [&_a]:underline [&_a]:underline-offset-4 [&_code]:rounded-md [&_code]:bg-muted [&_code]:px-1.5 [&_code]:py-0.5 [&_code]:font-normal [&_pre]:my-3 [&_pre]:rounded-xl [&_pre]:bg-muted [&_pre]:p-4 [&_pre_code]:bg-transparent [&_pre_code]:p-0 [&_hr]:my-4 [&_hr]:border-border";
230
291
  var editingSurface = `${fieldSurface} ${focusRing} ${editorProse} min-h-32 w-full px-4 py-3 selection:bg-primary selection:text-primary-foreground`;
231
292
  function read(editor, output) {
@@ -314,7 +375,7 @@ function Editor({
314
375
  if (context === null) {
315
376
  return null;
316
377
  }
317
- return /* @__PURE__ */ jsx(EditorContextProvider, { value: context, children: /* @__PURE__ */ jsx(
378
+ return /* @__PURE__ */ jsx4(EditorContextProvider, { value: context, children: /* @__PURE__ */ jsx4(
318
379
  "div",
319
380
  {
320
381
  "data-disabled": disabled ? "" : void 0,
@@ -328,14 +389,19 @@ function Editor({
328
389
  }
329
390
  ) });
330
391
  }
392
+
393
+ // src/components/ui/editor/link.tsx
394
+ import { Link2 } from "lucide-react";
395
+ import { useId, useState as useState2 } from "react";
396
+ import { Fragment, jsx as jsx5, jsxs } from "react/jsx-runtime";
331
397
  function EditorLink({
332
398
  label,
333
399
  className,
334
400
  slotName = "editor-link-dialog"
335
401
  }) {
336
402
  const { editor, labels, editable } = useEditorContext();
337
- const [open, setOpen] = useState(false);
338
- const [href, setHref] = useState("");
403
+ const [open, setOpen] = useState2(false);
404
+ const [href, setHref] = useState2("");
339
405
  const attached = editor.isActive("link");
340
406
  const fieldId = useId();
341
407
  function openDialog() {
@@ -354,7 +420,7 @@ function EditorLink({
354
420
  setOpen(false);
355
421
  }
356
422
  return /* @__PURE__ */ jsxs(Fragment, { children: [
357
- /* @__PURE__ */ jsx(
423
+ /* @__PURE__ */ jsx5(
358
424
  EditorControl,
359
425
  {
360
426
  label: label ?? labels.linkLabel,
@@ -365,14 +431,14 @@ function EditorLink({
365
431
  className
366
432
  }
367
433
  ),
368
- /* @__PURE__ */ jsx(Dialog, { open, onOpenChange: setOpen, children: /* @__PURE__ */ jsxs(DialogContent, { slotName, children: [
434
+ /* @__PURE__ */ jsx5(Dialog, { open, onOpenChange: setOpen, children: /* @__PURE__ */ jsxs(DialogContent, { slotName, children: [
369
435
  /* @__PURE__ */ jsxs(DialogHeader, { children: [
370
- /* @__PURE__ */ jsx(DialogTitle, { children: labels.linkDialogTitle }),
371
- /* @__PURE__ */ jsx(DialogDescription, { children: labels.linkDialogDescription })
436
+ /* @__PURE__ */ jsx5(DialogTitle, { children: labels.linkDialogTitle }),
437
+ /* @__PURE__ */ jsx5(DialogDescription, { children: labels.linkDialogDescription })
372
438
  ] }),
373
439
  /* @__PURE__ */ jsxs("div", { className: "gap-2 flex flex-col", children: [
374
- /* @__PURE__ */ jsx(Label, { htmlFor: fieldId, children: labels.linkUrlLabel }),
375
- /* @__PURE__ */ jsx(
440
+ /* @__PURE__ */ jsx5(Label, { htmlFor: fieldId, children: labels.linkUrlLabel }),
441
+ /* @__PURE__ */ jsx5(
376
442
  Input,
377
443
  {
378
444
  id: fieldId,
@@ -390,7 +456,7 @@ function EditorLink({
390
456
  )
391
457
  ] }),
392
458
  /* @__PURE__ */ jsxs(DialogFooter, { children: [
393
- attached && /* @__PURE__ */ jsx(
459
+ attached && /* @__PURE__ */ jsx5(
394
460
  Button,
395
461
  {
396
462
  type: "button",
@@ -399,7 +465,7 @@ function EditorLink({
399
465
  children: labels.linkRemoveLabel
400
466
  }
401
467
  ),
402
- /* @__PURE__ */ jsx(
468
+ /* @__PURE__ */ jsx5(
403
469
  Button,
404
470
  {
405
471
  type: "button",
@@ -408,7 +474,7 @@ function EditorLink({
408
474
  children: labels.linkCancelLabel
409
475
  }
410
476
  ),
411
- /* @__PURE__ */ jsx(
477
+ /* @__PURE__ */ jsx5(
412
478
  Button,
413
479
  {
414
480
  type: "button",
@@ -421,29 +487,46 @@ function EditorLink({
421
487
  ] }) })
422
488
  ] });
423
489
  }
490
+
491
+ // src/components/ui/editor/rich-text-editor.tsx
492
+ import { jsx as jsx6, jsxs as jsxs2 } from "react/jsx-runtime";
424
493
  function RichTextEditor(props) {
425
- return /* @__PURE__ */ jsxs(Editor, { ...props, children: [
426
- /* @__PURE__ */ jsxs(EditorToolbar, { children: [
427
- /* @__PURE__ */ jsx(EditorMark, { mark: "bold" }),
428
- /* @__PURE__ */ jsx(EditorMark, { mark: "italic" }),
429
- /* @__PURE__ */ jsx(EditorMark, { mark: "strike" }),
430
- /* @__PURE__ */ jsx(Separator, { orientation: "vertical", className: "mx-1 h-6" }),
431
- /* @__PURE__ */ jsx(EditorHeading, { level: 2 }),
432
- /* @__PURE__ */ jsx(EditorHeading, { level: 3 }),
433
- /* @__PURE__ */ jsx(Separator, { orientation: "vertical", className: "mx-1 h-6" }),
434
- /* @__PURE__ */ jsx(EditorList, { variant: "bullet" }),
435
- /* @__PURE__ */ jsx(EditorList, { variant: "ordered" }),
436
- /* @__PURE__ */ jsx(EditorBlockquote, {}),
437
- /* @__PURE__ */ jsx(EditorMark, { mark: "code" }),
438
- /* @__PURE__ */ jsx(EditorLink, {}),
439
- /* @__PURE__ */ jsx(Separator, { orientation: "vertical", className: "mx-1 h-6" }),
440
- /* @__PURE__ */ jsx(EditorHistory, { action: "undo" }),
441
- /* @__PURE__ */ jsx(EditorHistory, { action: "redo" })
494
+ return /* @__PURE__ */ jsxs2(Editor, { ...props, children: [
495
+ /* @__PURE__ */ jsxs2(EditorToolbar, { children: [
496
+ /* @__PURE__ */ jsx6(EditorMark, { mark: "bold" }),
497
+ /* @__PURE__ */ jsx6(EditorMark, { mark: "italic" }),
498
+ /* @__PURE__ */ jsx6(EditorMark, { mark: "strike" }),
499
+ /* @__PURE__ */ jsx6(Separator, { orientation: "vertical", className: "mx-1 h-6" }),
500
+ /* @__PURE__ */ jsx6(EditorHeading, { level: 2 }),
501
+ /* @__PURE__ */ jsx6(EditorHeading, { level: 3 }),
502
+ /* @__PURE__ */ jsx6(Separator, { orientation: "vertical", className: "mx-1 h-6" }),
503
+ /* @__PURE__ */ jsx6(EditorList, { variant: "bullet" }),
504
+ /* @__PURE__ */ jsx6(EditorList, { variant: "ordered" }),
505
+ /* @__PURE__ */ jsx6(EditorBlockquote, {}),
506
+ /* @__PURE__ */ jsx6(EditorMark, { mark: "code" }),
507
+ /* @__PURE__ */ jsx6(EditorLink, {}),
508
+ /* @__PURE__ */ jsx6(Separator, { orientation: "vertical", className: "mx-1 h-6" }),
509
+ /* @__PURE__ */ jsx6(EditorHistory, { action: "undo" }),
510
+ /* @__PURE__ */ jsx6(EditorHistory, { action: "redo" })
442
511
  ] }),
443
- /* @__PURE__ */ jsx(EditorContent, {})
512
+ /* @__PURE__ */ jsx6(EditorContent, {})
444
513
  ] });
445
514
  }
446
-
447
- export { Editor, EditorBlockquote, EditorContent, EditorControl, EditorHeading, EditorHistory, EditorLink, EditorList, EditorMark, EditorToolbar, RichTextEditor, defaultEditorExtensions, editorLabels, isSafeEditorUrl, useEditorContext };
448
- //# sourceMappingURL=editor.js.map
515
+ export {
516
+ Editor,
517
+ EditorBlockquote,
518
+ EditorContent,
519
+ EditorControl,
520
+ EditorHeading,
521
+ EditorHistory,
522
+ EditorLink,
523
+ EditorList,
524
+ EditorMark,
525
+ EditorToolbar,
526
+ RichTextEditor,
527
+ defaultEditorExtensions,
528
+ editorLabels,
529
+ isSafeEditorUrl,
530
+ useEditorContext
531
+ };
449
532
  //# sourceMappingURL=editor.js.map