@marktiderman/genesis-ui 2.7.0 → 2.9.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.
- package/EXTENDING.md +40 -1
- package/SKILL.md +198 -9
- package/dist/{AppShell-CX0M-dfc.d.ts → AppShell-LXQykEqe.d.ts} +47 -5
- package/dist/{chunk-M62CHO3N.js → chunk-4C4ESW6O.js} +9 -4
- package/dist/chunk-4C4ESW6O.js.map +1 -0
- package/dist/chunk-DIV4BYXX.js +58 -0
- package/dist/chunk-DIV4BYXX.js.map +1 -0
- package/dist/chunk-FUVWKTPL.js +19 -0
- package/dist/chunk-FUVWKTPL.js.map +1 -0
- package/dist/{chunk-PLIYF6KI.js → chunk-MPI33I4K.js} +2 -2
- package/dist/{chunk-PLIYF6KI.js.map → chunk-MPI33I4K.js.map} +1 -1
- package/dist/{chunk-JA3ZKULS.js → chunk-OITWCIG2.js} +3 -3
- package/dist/chunk-OITWCIG2.js.map +1 -0
- package/dist/chunk-PKFDGGZV.js +65 -0
- package/dist/chunk-PKFDGGZV.js.map +1 -0
- package/dist/{chunk-IXGAEECT.js → chunk-RKPS7ERS.js} +9 -5
- package/dist/chunk-RKPS7ERS.js.map +1 -0
- package/dist/{chunk-TXOZMKNW.js → chunk-S7NXD37O.js} +27 -26
- package/dist/chunk-S7NXD37O.js.map +1 -0
- package/dist/{chunk-ZPPLUGLA.js → chunk-UYI3GLFJ.js} +162 -19
- package/dist/chunk-UYI3GLFJ.js.map +1 -0
- package/dist/{chunk-CDYZRZ6U.js → chunk-WGMEVX3Y.js} +2 -2
- package/dist/chunk-WGMEVX3Y.js.map +1 -0
- package/dist/chunk-ZDHWNQTR.js +552 -0
- package/dist/chunk-ZDHWNQTR.js.map +1 -0
- package/dist/components/data/index.d.ts +306 -19
- package/dist/components/data/index.js +1177 -284
- package/dist/components/data/index.js.map +1 -1
- package/dist/components/layout/form-page.d.ts +1 -1
- package/dist/components/layout/form-page.js +1 -1
- package/dist/components/layout/index.d.ts +2 -2
- package/dist/components/layout/index.js +8 -8
- package/dist/components/patterns/index.d.ts +1 -1
- package/dist/components/patterns/index.js +5 -5
- package/dist/components/patterns/sortable-list.js +1 -1
- package/dist/components/rich-text/rich-text-editor.d.ts +194 -0
- package/dist/components/rich-text/rich-text-editor.js +833 -0
- package/dist/components/rich-text/rich-text-editor.js.map +1 -0
- package/dist/components/rich-text/rich-text.d.ts +51 -0
- package/dist/components/rich-text/rich-text.js +4 -0
- package/dist/components/rich-text/rich-text.js.map +1 -0
- package/dist/components/ui/alert-dialog.d.ts +12 -1
- package/dist/components/ui/alert-dialog.js +1 -1
- package/dist/hooks/index.d.ts +4 -3
- package/dist/hooks/index.js +5 -4
- package/dist/hooks/use-data-filters.d.ts +5 -3
- package/dist/hooks/use-data-filters.js +2 -2
- package/dist/hooks/use-resource-page.d.ts +2 -1
- package/dist/hooks/use-resource-page.js +3 -2
- package/dist/hooks/use-resource-url-state.d.ts +68 -0
- package/dist/hooks/use-resource-url-state.js +3 -0
- package/dist/hooks/use-resource-url-state.js.map +1 -0
- package/dist/hooks/use-view-preference.d.ts +17 -2
- package/dist/hooks/use-view-preference.js +2 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +32 -32
- package/dist/{navigation-DBwcZ6vb.d.ts → navigation-Bha0R3Fu.d.ts} +6 -3
- package/dist/rich-text-doc-C54fME2C.d.ts +180 -0
- package/dist/router/react-router.d.ts +47 -0
- package/dist/router/react-router.js +53 -0
- package/dist/router/react-router.js.map +1 -0
- package/dist/router/tanstack-router.d.ts +47 -0
- package/dist/router/tanstack-router.js +105 -0
- package/dist/router/tanstack-router.js.map +1 -0
- package/dist/{use-resource-page-Dd2VUv30.d.ts → use-resource-page-BDnnCssE.d.ts} +83 -5
- package/package.json +61 -14
- package/dist/chunk-CDYZRZ6U.js.map +0 -1
- package/dist/chunk-FTTNGGLA.js +0 -20
- package/dist/chunk-FTTNGGLA.js.map +0 -1
- package/dist/chunk-IXGAEECT.js.map +0 -1
- package/dist/chunk-JA3ZKULS.js.map +0 -1
- package/dist/chunk-M62CHO3N.js.map +0 -1
- package/dist/chunk-TXOZMKNW.js.map +0 -1
- package/dist/chunk-ZPPLUGLA.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/rich-text/video-embed.ts","../../../src/components/rich-text/rich-text-editor.tsx"],"names":["RichTextEditor","LinkIcon"],"mappings":"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","file":"rich-text-editor.js","sourcesContent":["\"use client\";\n\n/**\n * VideoEmbed — a Tiptap node for YouTube, Vimeo and Loom players.\n *\n * The node stores only `{ provider, id, hash?, title? }`, never a URL, and\n * rebuilds the player URL from those validated parts every time it renders.\n * A pasted `<iframe>` is accepted only when its `src` parses as one of the\n * three hosts; any other iframe is dropped by the editor's schema.\n *\n * Exported for apps that assemble their own Tiptap editor and want the same\n * embed node `RichTextEditor` uses.\n */\nimport { Node } from \"@tiptap/core\";\nimport {\n type VideoEmbedAttrs,\n VIDEO_IFRAME_ATTRS,\n parseVideoUrl,\n sanitizeVideoEmbedAttrs,\n videoEmbedSrc,\n videoEmbedTitle,\n} from \"./rich-text-doc\";\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n videoEmbed: {\n /**\n * Insert a video embed from a YouTube, Vimeo or Loom URL. Fails (returns\n * false, inserts nothing) for any other URL.\n */\n setVideoEmbed: (options: { url: string; title?: string }) => ReturnType;\n };\n }\n}\n\nconst noRender = { renderHTML: () => ({}) };\n\n/**\n * Tiptap node for YouTube, Vimeo and Loom players, stored as\n * `{ provider, id, hash?, title? }` and rebuilt from those parts on render.\n * Adds the `setVideoEmbed({ url, title })` command.\n *\n * @stability Beta\n */\nexport const VideoEmbed = Node.create({\n name: \"videoEmbed\",\n group: \"block\",\n atom: true,\n draggable: true,\n selectable: true,\n\n addAttributes() {\n return {\n provider: { default: null, ...noRender },\n id: { default: null, ...noRender },\n hash: { default: null, ...noRender },\n title: { default: null, ...noRender },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: \"div[data-video-embed]\",\n priority: 60,\n getAttrs: (el) => {\n const attrs = sanitizeVideoEmbedAttrs({\n provider: el.getAttribute(\"data-provider\"),\n id: el.getAttribute(\"data-id\"),\n hash: el.getAttribute(\"data-hash\") ?? undefined,\n title: el.getAttribute(\"data-title\") ?? undefined,\n });\n return attrs ? { ...attrs } : false;\n },\n },\n {\n tag: \"iframe[src]\",\n getAttrs: (el) => {\n const parsed = parseVideoUrl(el.getAttribute(\"src\") ?? \"\");\n if (!parsed) return false;\n const attrs = sanitizeVideoEmbedAttrs({ ...parsed, title: el.getAttribute(\"title\") ?? undefined });\n return attrs ? { ...attrs } : false;\n },\n },\n ];\n },\n\n renderHTML({ node }) {\n const attrs = sanitizeVideoEmbedAttrs(node.attrs);\n if (!attrs) return [\"div\", { \"data-video-embed-invalid\": \"\" }];\n const title = videoEmbedTitle(attrs);\n return [\n \"div\",\n {\n \"data-video-embed\": \"\",\n \"data-provider\": attrs.provider,\n \"data-id\": attrs.id,\n ...(attrs.hash ? { \"data-hash\": attrs.hash } : {}),\n ...(attrs.title ? { \"data-title\": attrs.title } : {}),\n },\n [\n \"iframe\",\n {\n src: videoEmbedSrc(attrs),\n title,\n allow: VIDEO_IFRAME_ATTRS.allow,\n allowfullscreen: \"true\",\n loading: VIDEO_IFRAME_ATTRS.loading,\n referrerpolicy: VIDEO_IFRAME_ATTRS.referrerPolicy,\n sandbox: VIDEO_IFRAME_ATTRS.sandbox,\n // Inside the editor the frame is not a tab stop: the node is\n // selected and deleted as a whole, and playback happens in the\n // read-only view.\n tabindex: \"-1\",\n },\n ],\n ];\n },\n\n addCommands() {\n return {\n setVideoEmbed:\n ({ url, title }) =>\n ({ commands, state }) => {\n const parsed = parseVideoUrl(url);\n if (!parsed) return false;\n const attrs: VideoEmbedAttrs | null = sanitizeVideoEmbedAttrs({ ...parsed, title });\n if (!attrs) return false;\n const node = { type: this.name, attrs: { ...attrs } };\n // Insert BETWEEN top-level blocks rather than at the caret, which\n // would split the paragraph or heading the caret is in. An empty\n // paragraph is replaced instead of being left behind.\n const { $from } = state.selection;\n if ($from.depth === 0) return commands.insertContent(node);\n const block = $from.node(1);\n if (block.type.name === \"paragraph\" && block.content.size === 0) {\n return commands.insertContentAt({ from: $from.before(1), to: $from.after(1) }, node);\n }\n return commands.insertContentAt($from.after(1), node);\n },\n };\n },\n});\n","\"use client\";\n\n/**\n * RichTextEditor — a WYSIWYG editor for formatted content (headings, bold,\n * italic, underline, lists, links, quotes and optional video embeds), built\n * on Tiptap 3 (ProseMirror) with a Genesis `Toolbar`.\n *\n * Lives on its own subpath, `@marktiderman/genesis-ui/rich-text-editor`, so\n * only apps that import it need the `@tiptap/*` peers. The read-only\n * renderer and the server-safe helpers are on `/rich-text`.\n *\n * @stability Beta\n */\nimport * as React from \"react\";\nimport { Extension } from \"@tiptap/core\";\nimport { EditorContent, useEditor, useEditorState, type Editor } from \"@tiptap/react\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport { CharacterCount, Placeholder } from \"@tiptap/extensions\";\nimport {\n Bold,\n Heading2,\n Heading3,\n Heading4,\n Italic,\n Link as LinkIcon,\n List,\n ListOrdered,\n Quote,\n Redo2,\n Underline,\n Undo2,\n Video,\n} from \"lucide-react\";\n\nimport { cn } from \"../../utils\";\nimport { Button } from \"../ui/button\";\nimport { Input } from \"../ui/input\";\nimport { Kbd } from \"../ui/kbd\";\nimport { Label } from \"../ui/label\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../ui/popover\";\nimport {\n Toolbar,\n ToolbarButton,\n ToolbarSeparator,\n ToolbarToggleGroup,\n ToolbarToggleItem,\n} from \"../ui/toolbar\";\nimport { Tooltip } from \"../ui/tooltip\";\nimport {\n type RichTextDoc,\n type RichTextHeadingLevel,\n type SanitizeRichTextOptions,\n isRichTextDoc,\n isRichTextEmpty,\n isSafeUrl,\n normalizeLinkUrl,\n parseVideoUrl,\n richTextToHtml,\n richTextToPlainText,\n sanitizeRichTextDoc,\n} from \"./rich-text-doc\";\nimport { RichText, richTextClassName } from \"./rich-text\";\nimport { VideoEmbed } from \"./video-embed\";\n\nexport { VideoEmbed } from \"./video-embed\";\nexport type { RichTextDoc, RichTextHeadingLevel } from \"./rich-text-doc\";\n\n/**\n * What the editor accepts as a value: the document JSON (canonical), or an\n * HTML string. HTML is parsed by the editor in the browser and reduced to\n * the editor's schema, so it is a migration convenience, not a storage\n * format. Output is always JSON plus derived, sanitized HTML.\n */\nexport type RichTextEditorValue = RichTextDoc | string;\n\n/** Derived forms of the document, computed on first read. */\nexport interface RichTextChangeDetails {\n /** Sanitized HTML from `richTextToHtml`. */\n readonly html: string;\n /** Plain text from `richTextToPlainText`. */\n readonly text: string;\n /** True when there is no visible text and no embed. */\n readonly isEmpty: boolean;\n /** Character count of the text (what `maxLength` limits). */\n readonly characters: number;\n}\n\nexport type RichTextToolbarItem =\n | \"heading2\"\n | \"heading3\"\n | \"heading4\"\n | \"bold\"\n | \"italic\"\n | \"underline\"\n | \"bulletList\"\n | \"orderedList\"\n | \"blockquote\"\n | \"link\"\n | \"video\"\n | \"undo\"\n | \"redo\";\n\nexport interface RichTextEditorLabels {\n toolbar: string;\n blockGroup: string;\n markGroup: string;\n heading2: string;\n heading3: string;\n heading4: string;\n bold: string;\n italic: string;\n underline: string;\n bulletList: string;\n orderedList: string;\n blockquote: string;\n link: string;\n video: string;\n undo: string;\n redo: string;\n linkUrl: string;\n linkApply: string;\n linkRemove: string;\n linkInvalid: string;\n videoUrl: string;\n videoTitle: string;\n videoInsert: string;\n videoInvalid: string;\n cancel: string;\n characterCount: (count: number, max: number | undefined) => string;\n}\n\nconst DEFAULT_LABELS: RichTextEditorLabels = {\n toolbar: \"Formatting\",\n blockGroup: \"Paragraph style\",\n markGroup: \"Text style\",\n heading2: \"Heading 2\",\n heading3: \"Heading 3\",\n heading4: \"Heading 4\",\n bold: \"Bold\",\n italic: \"Italic\",\n underline: \"Underline\",\n bulletList: \"Bulleted list\",\n orderedList: \"Numbered list\",\n blockquote: \"Quote\",\n link: \"Link\",\n video: \"Embed video\",\n undo: \"Undo\",\n redo: \"Redo\",\n linkUrl: \"Link address\",\n linkApply: \"Apply\",\n linkRemove: \"Remove link\",\n linkInvalid: \"Enter a web address (https://…), an email address or a relative path.\",\n videoUrl: \"YouTube, Vimeo or Loom link\",\n videoTitle: \"Title (read by screen readers)\",\n videoInsert: \"Insert\",\n videoInvalid: \"Paste a YouTube, Vimeo or Loom video link.\",\n cancel: \"Cancel\",\n characterCount: (count, max) =>\n max ? `${count.toLocaleString()} / ${max.toLocaleString()} characters` : `${count.toLocaleString()} characters`,\n};\n\n/** Imperative handle exposed through `ref`. */\nexport interface RichTextEditorHandle {\n /** Move focus into the editable area. */\n focus: () => void;\n /** Replace the content with an empty document (fires `onChange`). */\n clear: () => void;\n /** The current document, sanitized. */\n getJSON: () => RichTextDoc;\n /** The current document as sanitized HTML. */\n getHTML: () => string;\n /** The underlying Tiptap editor, once mounted (null during SSR/first paint). */\n readonly editor: Editor | null;\n}\n\nexport interface RichTextEditorProps {\n /**\n * Controlled value. Pass back the `doc` from `onChange` synchronously; any\n * other document (including an older one from a debounced or deferred\n * parent) replaces the content and resets the selection.\n */\n value?: RichTextEditorValue;\n /** Initial value for an uncontrolled editor. */\n defaultValue?: RichTextEditorValue;\n /**\n * Called on every edit with the sanitized document. `details` derives HTML\n * and text lazily, so reading only `doc` costs no serialization.\n */\n onChange?: (doc: RichTextDoc, details: RichTextChangeDetails) => void;\n onFocus?: () => void;\n onBlur?: () => void;\n /**\n * `id` of the editable element. A `<label htmlFor={id}>` names the editor\n * (wired as `aria-labelledby`, since a contenteditable is not a labelable\n * element) and clicking it focuses the editor.\n */\n id?: string;\n /**\n * Form field name. When set, a hidden input carries the document as JSON\n * so a native `<form>` submission includes it.\n */\n name?: string;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n \"aria-describedby\"?: string;\n /** Marks the field invalid (`aria-invalid`, destructive border). */\n invalid?: boolean;\n /** Placeholder shown while the document is empty. */\n placeholder?: string;\n /** Content is visible and selectable but not editable; the toolbar is hidden. */\n readOnly?: boolean;\n /** Not editable, toolbar disabled, dimmed. */\n disabled?: boolean;\n autoFocus?: boolean;\n /** Heading levels offered in the toolbar and kept in the document. Default `[2, 3]`. Read at mount. */\n headingLevels?: readonly RichTextHeadingLevel[];\n /** Enable YouTube / Vimeo / Loom embeds (toolbar button and schema). Default `false`. Read at mount. */\n embeds?: boolean;\n /** Maximum characters. Typing and pasting stop at the limit. Read at mount. */\n maxLength?: number;\n /** Show the character count under the editor. On by default when `maxLength` is set. */\n showCharacterCount?: boolean;\n /** Toolbar items, in groups as listed. `false` hides the toolbar (shortcuts still work). */\n toolbar?: false | readonly RichTextToolbarItem[];\n /** Override any user-facing string (for translation). */\n labels?: Partial<RichTextEditorLabels>;\n /** Classes for the outer frame. */\n className?: string;\n /** Classes for the editable area (for example a taller `min-h-*`). */\n contentClassName?: string;\n /** Stable test/automation selector (emitted as `data-testid` on the frame). */\n testID?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Toolbar definitions\n// ---------------------------------------------------------------------------\n\ntype Keys = readonly string[];\n\ninterface ToggleDef {\n id: RichTextToolbarItem;\n icon: React.ComponentType<{ className?: string }>;\n keys: Keys;\n isActive: (e: Editor) => boolean;\n run: (e: Editor) => void;\n}\n\nconst MARKS: ToggleDef[] = [\n {\n id: \"bold\",\n icon: Bold,\n keys: [\"Mod\", \"B\"],\n isActive: (e) => e.isActive(\"bold\"),\n run: (e) => e.chain().focus().toggleBold().run(),\n },\n {\n id: \"italic\",\n icon: Italic,\n keys: [\"Mod\", \"I\"],\n isActive: (e) => e.isActive(\"italic\"),\n run: (e) => e.chain().focus().toggleItalic().run(),\n },\n {\n id: \"underline\",\n icon: Underline,\n keys: [\"Mod\", \"U\"],\n isActive: (e) => e.isActive(\"underline\"),\n run: (e) => e.chain().focus().toggleUnderline().run(),\n },\n];\n\nconst heading = (level: RichTextHeadingLevel, icon: ToggleDef[\"icon\"]): ToggleDef => ({\n id: `heading${level}` as RichTextToolbarItem,\n icon,\n keys: [\"Mod\", \"Alt\", String(level)],\n isActive: (e) => e.isActive(\"heading\", { level }),\n run: (e) => e.chain().focus().toggleHeading({ level }).run(),\n});\n\nconst BLOCKS: ToggleDef[] = [\n heading(2, Heading2),\n heading(3, Heading3),\n heading(4, Heading4),\n {\n id: \"bulletList\",\n icon: List,\n keys: [\"Mod\", \"Shift\", \"8\"],\n isActive: (e) => e.isActive(\"bulletList\"),\n run: (e) => e.chain().focus().toggleBulletList().run(),\n },\n {\n id: \"orderedList\",\n icon: ListOrdered,\n keys: [\"Mod\", \"Shift\", \"7\"],\n isActive: (e) => e.isActive(\"orderedList\"),\n run: (e) => e.chain().focus().toggleOrderedList().run(),\n },\n {\n id: \"blockquote\",\n icon: Quote,\n keys: [\"Mod\", \"Shift\", \"B\"],\n isActive: (e) => e.isActive(\"blockquote\"),\n run: (e) => e.chain().focus().toggleBlockquote().run(),\n },\n];\n\nconst ALL_TOGGLES = [...MARKS, ...BLOCKS];\n\n// The rules Tiptap would inject as a <style> tag (`injectCSS: false` turns\n// that off for strict CSPs), as classes on the editable element. The gap\n// cursor uses the foreground token instead of black and does not blink.\nconst PROSEMIRROR_BASE = cn(\n \"relative break-words whitespace-break-spaces [font-variant-ligatures:none] [font-feature-settings:'liga'_0]\",\n \"[&_[contenteditable=false]]:whitespace-normal [&_[contenteditable=false]_[contenteditable=true]]:whitespace-pre-wrap [&_pre]:whitespace-pre-wrap\",\n \"[&_img.ProseMirror-separator]:!inline [&_img.ProseMirror-separator]:!m-0 [&_img.ProseMirror-separator]:!h-0 [&_img.ProseMirror-separator]:!w-0 [&_img.ProseMirror-separator]:!border-0\",\n \"[&_.ProseMirror-gapcursor]:pointer-events-none [&_.ProseMirror-gapcursor]:absolute [&_.ProseMirror-gapcursor]:m-0 [&_.ProseMirror-gapcursor]:hidden [&.ProseMirror-focused_.ProseMirror-gapcursor]:block\",\n \"[&_.ProseMirror-gapcursor]:after:absolute [&_.ProseMirror-gapcursor]:after:-top-0.5 [&_.ProseMirror-gapcursor]:after:block [&_.ProseMirror-gapcursor]:after:w-5 [&_.ProseMirror-gapcursor]:after:border-t [&_.ProseMirror-gapcursor]:after:border-foreground [&_.ProseMirror-gapcursor]:after:content-['']\",\n \"[&.ProseMirror-hideselection_*]:caret-transparent [&.ProseMirror-hideselection_*]:selection:bg-transparent\",\n);\n\nconst PRESSED_CLASS =\"h-8 w-8 px-0 aria-pressed:bg-accent aria-pressed:text-accent-foreground\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Detect Apple platforms after mount, so SSR and first paint agree (\"Ctrl\"). */\nfunction useIsApple(): boolean {\n const [apple, setApple] = React.useState(false);\n React.useEffect(() => {\n const nav = navigator as Navigator & { userAgentData?: { platform?: string } };\n const platform = nav.userAgentData?.platform ?? nav.platform ?? \"\";\n setApple(/mac|iphone|ipad|ipod/i.test(platform));\n }, []);\n return apple;\n}\n\nfunction keyLabel(key: string, apple: boolean): string {\n if (key === \"Mod\") return apple ? \"⌘\" : \"Ctrl\";\n if (key === \"Alt\") return apple ? \"⌥\" : \"Alt\";\n if (key === \"Shift\") return apple ? \"⇧\" : \"Shift\";\n return key;\n}\n\nfunction ariaKeys(keys: Keys, apple: boolean): string {\n return keys\n .map((k) => (k === \"Mod\" ? (apple ? \"Meta\" : \"Control\") : k))\n .join(\"+\");\n}\n\nfunction ShortcutHint({ label, keys, apple }: { label: string; keys?: Keys; apple: boolean }) {\n return (\n <span className=\"inline-flex items-center gap-2\">\n {label}\n {keys && (\n <span className=\"inline-flex items-center gap-0.5\">\n {keys.map((k) => (\n <Kbd key={k}>{keyLabel(k, apple)}</Kbd>\n ))}\n </span>\n )}\n </span>\n );\n}\n\nfunction initialContent(\n value: RichTextEditorValue | undefined,\n opts: SanitizeRichTextOptions,\n): RichTextDoc | string {\n if (typeof value === \"string\") return value;\n return sanitizeRichTextDoc(value ?? null, opts);\n}\n\nfunction detailsFor(doc: RichTextDoc, characters: () => number, opts: SanitizeRichTextOptions): RichTextChangeDetails {\n let html: string | undefined;\n let text: string | undefined;\n return {\n get html() {\n return (html ??= richTextToHtml(doc, opts));\n },\n get text() {\n return (text ??= richTextToPlainText(doc));\n },\n get isEmpty() {\n return isRichTextEmpty(doc);\n },\n get characters() {\n return characters();\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\n/**\n * RichTextEditor — formatted text input for lessons, notes and other\n * long-form content.\n *\n * - **Value:** JSON is canonical (`RichTextDoc`). `onChange` hands you the\n * sanitized document plus lazily derived `html`/`text`. Store the JSON;\n * on the server re-run `sanitizeRichTextDoc` and derive HTML with\n * `richTextToHtml` (both from `/rich-text`, no DOM needed).\n * - **Security:** output goes through the same allow-list as `RichText`;\n * links keep only http(s)/mailto/tel/relative URLs; embeds are rebuilt\n * from a validated YouTube/Vimeo/Loom id.\n * - **SSR:** the editor mounts on the client only (Tiptap\n * `immediatelyRender: false`). Until then a JSON value renders read-only,\n * so server HTML shows the content instead of an empty box.\n * - **Keyboard:** standard shortcuts (⌘/Ctrl+B, I, U, K for link,\n * ⌘/Ctrl+Alt+2/3 for headings, ⌘/Ctrl+Shift+7/8 for lists, ⌘/Ctrl+Shift+B\n * for quote, ⌘/Ctrl+Z / Shift+Z), shown in each toolbar tooltip. The\n * toolbar is one tab stop with arrow-key navigation (Radix Toolbar).\n *\n * @stability Beta\n */\nexport const RichTextEditor = React.forwardRef<RichTextEditorHandle, RichTextEditorProps>(\n function RichTextEditor(props, ref) {\n const {\n value,\n defaultValue,\n onChange,\n onFocus,\n onBlur,\n id: idProp,\n name,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n invalid = false,\n placeholder,\n readOnly = false,\n disabled = false,\n autoFocus = false,\n headingLevels = [2, 3],\n embeds = false,\n maxLength,\n showCharacterCount,\n toolbar,\n labels: labelsProp,\n className,\n contentClassName,\n testID,\n } = props;\n\n const labels = React.useMemo(() => ({ ...DEFAULT_LABELS, ...labelsProp }), [labelsProp]);\n const generatedId = React.useId();\n const editorId = idProp ?? `rte-${generatedId}`;\n const countId = `${editorId}-count`;\n const apple = useIsApple();\n\n // Mount-time configuration. The schema (heading levels, embeds) and the\n // character limit are fixed for the editor's lifetime; changing them\n // means remounting (give the component a new `key`).\n const [config] = React.useState(() => ({\n opts: { headingLevels, embeds } satisfies SanitizeRichTextOptions,\n maxLength,\n }));\n const { opts } = config;\n\n const onChangeRef = React.useRef(onChange);\n const onFocusRef = React.useRef(onFocus);\n const onBlurRef = React.useRef(onBlur);\n const placeholderRef = React.useRef(placeholder);\n const stringControlledRef = React.useRef(typeof value === \"string\");\n const openLinkRef = React.useRef<() => boolean>(() => false);\n React.useEffect(() => {\n onChangeRef.current = onChange;\n onFocusRef.current = onFocus;\n onBlurRef.current = onBlur;\n placeholderRef.current = placeholder;\n stringControlledRef.current = typeof value === \"string\";\n });\n\n // The last document we emitted (reference and HTML), so a controlled\n // parent echoing it back does not reset the selection.\n const lastEmitted = React.useRef<{ doc: RichTextDoc | null; html: string | null }>({\n doc: null,\n html: null,\n });\n const [initial] = React.useState(() => initialContent(value ?? defaultValue, opts));\n const [formValue, setFormValue] = React.useState(() =>\n isRichTextDoc(initial) ? JSON.stringify(initial) : \"\",\n );\n\n const extensions = React.useMemo(\n () => [\n StarterKit.configure({\n code: false,\n codeBlock: false,\n strike: false,\n horizontalRule: false,\n heading: { levels: [...opts.headingLevels] },\n link: {\n openOnClick: false,\n autolink: true,\n linkOnPaste: true,\n defaultProtocol: \"https\",\n // Same rule as the sanitizer, so a link the editor shows is a link\n // that survives `onChange`.\n isAllowedUri: (url, ctx) => ctx.defaultValidate(url) && isSafeUrl(url),\n },\n }),\n Placeholder.configure({ placeholder: () => placeholderRef.current ?? \"\" }),\n CharacterCount.configure({ limit: config.maxLength ?? null }),\n ...(opts.embeds ? [VideoEmbed] : []),\n Extension.create({\n name: \"genesisLinkShortcut\",\n addKeyboardShortcuts: () => ({\n // Only claims the shortcut when the link control is there to open.\n \"Mod-k\": () => openLinkRef.current(),\n }),\n }),\n ],\n // Mount-time only, by design (see `config` above).\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n\n const editor = useEditor({\n extensions,\n content: initial,\n immediatelyRender: false,\n // Tiptap's base styles are in PROSEMIRROR_BASE instead of an injected\n // <style> tag, so the editor works under a strict style-src CSP.\n injectCSS: false,\n shouldRerenderOnTransaction: false,\n editable: !readOnly && !disabled,\n autofocus: autoFocus ? \"end\" : false,\n onUpdate: ({ editor: e }) => {\n const doc = sanitizeRichTextDoc(e.getJSON(), opts);\n const details = detailsFor(doc, () => e.storage.characterCount.characters(), opts);\n lastEmitted.current = { doc, html: null };\n if (name) setFormValue(JSON.stringify(doc));\n const cb = onChangeRef.current;\n if (cb) {\n cb(doc, details);\n // Only serialize HTML for string-controlled parents.\n if (stringControlledRef.current) lastEmitted.current.html = details.html;\n }\n },\n onFocus: () => onFocusRef.current?.(),\n onBlur: () => onBlurRef.current?.(),\n });\n\n const state = useEditorState({\n editor,\n // Reads the `editor` from this render rather than the snapshot's: the\n // snapshot only refreshes on a transaction, so right after mount it\n // still holds `null` and the toolbar (and count) would start blank.\n selector: () => {\n const e = editor;\n if (!e) return null;\n const active: Partial<Record<RichTextToolbarItem, boolean>> = {};\n for (const def of ALL_TOGGLES) active[def.id] = def.isActive(e);\n return {\n active,\n link: e.isActive(\"link\"),\n canUndo: e.can().undo(),\n canRedo: e.can().redo(),\n characters: e.storage.characterCount.characters() as number,\n };\n },\n });\n\n // Once mounted: the hidden form value reflects the parsed document (an\n // HTML defaultValue is only parsed now), and a string-controlled value is\n // recorded as already applied so the first render does not reset the caret.\n React.useEffect(() => {\n if (!editor) return;\n if (typeof initial === \"string\") {\n lastEmitted.current = { doc: null, html: initial };\n setFormValue(JSON.stringify(sanitizeRichTextDoc(editor.getJSON(), opts)));\n }\n }, [editor, initial, opts]);\n\n // `<label htmlFor={id}>`: name the editor and focus it on click.\n const [labelId, setLabelId] = React.useState<string | undefined>(undefined);\n React.useEffect(() => {\n if (!editor || ariaLabel || ariaLabelledBy || typeof document === \"undefined\") return;\n const label = document.querySelector<HTMLLabelElement>(`label[for=\"${CSS.escape(editorId)}\"]`);\n if (!label) return;\n if (!label.id) label.id = `${editorId}-label`;\n setLabelId(label.id);\n const onClick = (event: MouseEvent) => {\n event.preventDefault();\n editor.commands.focus();\n };\n label.addEventListener(\"click\", onClick);\n return () => label.removeEventListener(\"click\", onClick);\n }, [editor, editorId, ariaLabel, ariaLabelledBy]);\n\n // Editable follows readOnly/disabled.\n React.useEffect(() => {\n editor?.setEditable(!readOnly && !disabled, false);\n }, [editor, readOnly, disabled]);\n\n // Controlled value: apply only values that differ from what we emitted.\n React.useEffect(() => {\n if (!editor || value === undefined) return;\n const last = lastEmitted.current;\n if (typeof value === \"string\") {\n if (value === last.html) return;\n } else if (value === last.doc) {\n return;\n }\n const next = initialContent(value, opts);\n if (\n typeof next !== \"string\" &&\n JSON.stringify(sanitizeRichTextDoc(editor.getJSON(), opts)) === JSON.stringify(next)\n ) {\n return;\n }\n editor.commands.setContent(next, { emitUpdate: false });\n const doc = sanitizeRichTextDoc(editor.getJSON(), opts);\n lastEmitted.current = { doc: typeof value === \"string\" ? null : value, html: typeof value === \"string\" ? value : null };\n if (name) setFormValue(JSON.stringify(doc));\n }, [editor, value, opts, name]);\n\n // ARIA and classes on the editable element follow props.\n const countVisible = showCharacterCount ?? config.maxLength !== undefined;\n const describedBy = [ariaDescribedBy, countVisible ? countId : null].filter(Boolean).join(\" \") || undefined;\n const contentClasses = cn(\n richTextClassName,\n PROSEMIRROR_BASE,\n \"min-h-32 px-3 py-2 outline-none\",\n // Placeholder (Tiptap marks the empty first node with data-placeholder).\n \"[&_.is-editor-empty:first-child]:before:pointer-events-none [&_.is-editor-empty:first-child]:before:float-left [&_.is-editor-empty:first-child]:before:h-0 [&_.is-editor-empty:first-child]:before:text-muted-foreground [&_.is-editor-empty:first-child]:before:content-[attr(data-placeholder)]\",\n // Embeds are selected and deleted as a whole while editing.\n \"[&_[data-video-embed]_iframe]:pointer-events-none [&_.ProseMirror-selectednode]:ring-2 [&_.ProseMirror-selectednode]:ring-ring\",\n contentClassName,\n );\n React.useEffect(() => {\n if (!editor) return;\n const attributes: Record<string, string> = {\n id: editorId,\n role: \"textbox\",\n \"aria-multiline\": \"true\",\n class: contentClasses,\n };\n if (ariaLabel) attributes[\"aria-label\"] = ariaLabel;\n if (ariaLabelledBy ?? labelId) attributes[\"aria-labelledby\"] = (ariaLabelledBy ?? labelId)!;\n if (describedBy) attributes[\"aria-describedby\"] = describedBy;\n if (invalid) attributes[\"aria-invalid\"] = \"true\";\n if (readOnly) attributes[\"aria-readonly\"] = \"true\";\n if (disabled) attributes[\"aria-disabled\"] = \"true\";\n if (placeholder) attributes[\"aria-placeholder\"] = placeholder;\n editor.setOptions({ editorProps: { ...editor.options.editorProps, attributes } });\n }, [editor, editorId, contentClasses, ariaLabel, ariaLabelledBy, labelId, describedBy, invalid, readOnly, disabled, placeholder]);\n\n React.useImperativeHandle(\n ref,\n () => ({\n focus: () => editor?.commands.focus(),\n clear: () => {\n editor?.commands.clearContent(true);\n },\n getJSON: () => sanitizeRichTextDoc(editor?.getJSON() ?? initial, opts),\n getHTML: () => richTextToHtml(editor?.getJSON() ?? initial, opts),\n get editor() {\n return editor;\n },\n }),\n [editor, initial, opts],\n );\n\n // ----- Link and video popovers ---------------------------------------\n const [linkOpen, setLinkOpen] = React.useState(false);\n // Opened with Mod-K from the text: Escape should return there too.\n const [linkFromShortcut, setLinkFromShortcut] = React.useState(false);\n const [videoOpen, setVideoOpen] = React.useState(false);\n const interactive = !!editor && !readOnly && !disabled;\n\n const items = React.useMemo(() => {\n const levels = opts.headingLevels as readonly number[];\n const defaults: RichTextToolbarItem[] = [\n \"heading2\",\n \"heading3\",\n \"heading4\",\n \"bold\",\n \"italic\",\n \"underline\",\n \"bulletList\",\n \"orderedList\",\n \"blockquote\",\n \"link\",\n \"video\",\n \"undo\",\n \"redo\",\n ];\n return new Set(\n (toolbar || defaults).filter((item) => {\n if (item.startsWith(\"heading\")) return levels.includes(Number(item.slice(7)));\n if (item === \"video\") return opts.embeds;\n return true;\n }),\n );\n }, [toolbar, opts]);\n\n const renderToggleGroup = (defs: ToggleDef[], groupLabel: string) => {\n const shown = defs.filter((d) => items.has(d.id));\n if (shown.length === 0) return null;\n const activeIds = shown.filter((d) => state?.active[d.id]).map((d) => d.id);\n return (\n <ToolbarToggleGroup\n type=\"multiple\"\n aria-label={groupLabel}\n value={activeIds}\n disabled={!interactive}\n onValueChange={(next: string[]) => {\n if (!editor) return;\n for (const def of shown) {\n if (next.includes(def.id) !== activeIds.includes(def.id)) def.run(editor);\n }\n }}\n >\n {shown.map((def) => {\n const Icon = def.icon;\n const label = labels[def.id as keyof RichTextEditorLabels] as string;\n return (\n <Tooltip key={def.id} delayDuration={300} content={<ShortcutHint label={label} keys={def.keys} apple={apple} />}>\n <ToolbarToggleItem\n value={def.id}\n aria-label={label}\n aria-keyshortcuts={ariaKeys(def.keys, apple)}\n // Pressed styling keys off aria-pressed, not data-state:\n // the Tooltip trigger wrapping this item writes its own\n // data-state (closed / delayed-open) over the toggle's.\n className={PRESSED_CLASS}\n >\n <Icon className=\"size-4\" aria-hidden />\n </ToolbarToggleItem>\n </Tooltip>\n );\n })}\n </ToolbarToggleGroup>\n );\n };\n\n const groups: React.ReactNode[] = [];\n const blockGroup = renderToggleGroup(BLOCKS, labels.blockGroup);\n const markGroup = renderToggleGroup(MARKS, labels.markGroup);\n if (blockGroup) groups.push(<React.Fragment key=\"blocks\">{blockGroup}</React.Fragment>);\n if (markGroup) groups.push(<React.Fragment key=\"marks\">{markGroup}</React.Fragment>);\n if (items.has(\"link\") || items.has(\"video\")) {\n groups.push(\n <div key=\"insert\" className=\"flex items-center gap-1\">\n {items.has(\"link\") && (\n <LinkPopover\n editor={editor}\n open={linkOpen}\n onOpenChange={setLinkOpen}\n returnToEditor={linkFromShortcut}\n onClosed={() => setLinkFromShortcut(false)}\n disabled={!interactive}\n pressed={!!state?.link}\n labels={labels}\n apple={apple}\n />\n )}\n {items.has(\"video\") && (\n <VideoPopover\n editor={editor}\n open={videoOpen}\n onOpenChange={setVideoOpen}\n disabled={!interactive}\n labels={labels}\n />\n )}\n </div>,\n );\n }\n if (items.has(\"undo\") || items.has(\"redo\")) {\n groups.push(\n <div key=\"history\" className=\"flex items-center gap-1\">\n {items.has(\"undo\") && (\n <Tooltip delayDuration={300} content={<ShortcutHint label={labels.undo} keys={[\"Mod\", \"Z\"]} apple={apple} />}>\n <ToolbarButton\n aria-label={labels.undo}\n aria-keyshortcuts={ariaKeys([\"Mod\", \"Z\"], apple)}\n className=\"h-8 w-8 px-0\"\n disabled={!interactive || !state?.canUndo}\n onClick={() => editor?.chain().focus().undo().run()}\n >\n <Undo2 className=\"size-4\" aria-hidden />\n </ToolbarButton>\n </Tooltip>\n )}\n {items.has(\"redo\") && (\n <Tooltip\n delayDuration={300}\n content={<ShortcutHint label={labels.redo} keys={[\"Mod\", \"Shift\", \"Z\"]} apple={apple} />}\n >\n <ToolbarButton\n aria-label={labels.redo}\n aria-keyshortcuts={ariaKeys([\"Mod\", \"Shift\", \"Z\"], apple)}\n className=\"h-8 w-8 px-0\"\n disabled={!interactive || !state?.canRedo}\n onClick={() => editor?.chain().focus().redo().run()}\n >\n <Redo2 className=\"size-4\" aria-hidden />\n </ToolbarButton>\n </Tooltip>\n )}\n </div>,\n );\n }\n\n const showToolbar = toolbar !== false && !readOnly && groups.length > 0;\n const linkAvailable = interactive && showToolbar && items.has(\"link\");\n React.useLayoutEffect(() => {\n openLinkRef.current = () => {\n if (!linkAvailable) return false;\n setLinkFromShortcut(true);\n setLinkOpen(true);\n return true;\n };\n }, [linkAvailable]);\n\n return (\n <div\n data-testid={testID}\n data-disabled={disabled ? \"\" : undefined}\n data-invalid={invalid ? \"\" : undefined}\n className={cn(\n \"w-full overflow-hidden rounded-md border border-input bg-background ring-offset-background\",\n \"focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2\",\n invalid && \"border-destructive\",\n disabled && \"cursor-not-allowed opacity-50\",\n readOnly && \"border-transparent\",\n className,\n )}\n >\n {showToolbar && (\n <Toolbar\n aria-label={labels.toolbar}\n aria-controls={editorId}\n className=\"flex-wrap rounded-none border-0 border-b border-border\"\n >\n {groups.flatMap((group, i) =>\n i === 0 ? [group] : [<ToolbarSeparator key={`sep-${i}`} />, group],\n )}\n </Toolbar>\n )}\n {editor ? (\n <EditorContent editor={editor} />\n ) : (\n // Server render and first client paint: show the content read-only\n // so the page is not blank (or shifting) while the editor mounts.\n <RichText\n value={isRichTextDoc(initial) ? initial : null}\n aria-busy=\"true\"\n className={cn(\"min-h-32 px-3 py-2\", contentClassName)}\n />\n )}\n {countVisible && (\n <div id={countId} className=\"border-t border-border px-3 py-1 text-right text-xs text-muted-foreground\">\n {labels.characterCount(state?.characters ?? 0, config.maxLength)}\n </div>\n )}\n {name && <input type=\"hidden\" name={name} value={formValue} />}\n </div>\n );\n },\n);\n\n// ---------------------------------------------------------------------------\n// Popovers\n// ---------------------------------------------------------------------------\n\ninterface PopoverProps {\n editor: Editor | null;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n disabled: boolean;\n labels: RichTextEditorLabels;\n}\n\nfunction LinkPopover({\n editor,\n open,\n onOpenChange,\n disabled,\n pressed,\n labels,\n apple,\n returnToEditor,\n onClosed,\n}: PopoverProps & { pressed: boolean; apple: boolean; returnToEditor: boolean; onClosed: () => void }) {\n const inputId = React.useId();\n const errorId = `${inputId}-error`;\n const [url, setUrl] = React.useState(\"\");\n const [error, setError] = React.useState(false);\n\n React.useEffect(() => {\n if (open && editor) {\n setUrl((editor.getAttributes(\"link\").href as string | undefined) ?? \"\");\n setError(false);\n }\n }, [open, editor]);\n\n // After Apply / Remove / Cancel focus returns to the text; after Escape or\n // a click outside, Radix returns it to the toolbar button as usual.\n const toEditor = React.useRef(false);\n const finish = () => {\n toEditor.current = true;\n onOpenChange(false);\n };\n const onCloseAutoFocus = (event: Event) => {\n onClosed();\n if (!toEditor.current && !returnToEditor) return;\n toEditor.current = false;\n event.preventDefault();\n editor?.commands.focus();\n };\n\n const apply = (event: React.FormEvent) => {\n event.preventDefault();\n event.stopPropagation();\n if (!editor) return;\n const href = normalizeLinkUrl(url);\n if (!href) {\n setError(true);\n return;\n }\n const chain = editor.chain().focus().extendMarkRange(\"link\");\n if (editor.state.selection.empty && !editor.isActive(\"link\")) {\n chain.insertContent({ type: \"text\", text: url.trim(), marks: [{ type: \"link\", attrs: { href } }] }).run();\n } else {\n chain.setLink({ href }).run();\n }\n finish();\n };\n\n const remove = () => {\n editor?.chain().focus().extendMarkRange(\"link\").unsetLink().run();\n finish();\n };\n\n return (\n <Popover open={open} onOpenChange={onOpenChange}>\n <Tooltip delayDuration={300} content={<ShortcutHint label={labels.link} keys={[\"Mod\", \"K\"]} apple={apple} />}>\n <PopoverTrigger asChild>\n <ToolbarButton\n aria-label={labels.link}\n aria-pressed={pressed}\n aria-keyshortcuts={ariaKeys([\"Mod\", \"K\"], apple)}\n className={PRESSED_CLASS}\n disabled={disabled}\n >\n <LinkIcon className=\"size-4\" aria-hidden />\n </ToolbarButton>\n </PopoverTrigger>\n </Tooltip>\n <PopoverContent align=\"start\" className=\"w-80\" onCloseAutoFocus={onCloseAutoFocus}>\n <form onSubmit={apply} className=\"space-y-3\" noValidate>\n <div className=\"space-y-1.5\">\n <Label htmlFor={inputId}>{labels.linkUrl}</Label>\n <Input\n id={inputId}\n value={url}\n autoFocus\n inputMode=\"url\"\n autoComplete=\"off\"\n placeholder=\"https://\"\n aria-invalid={error || undefined}\n aria-describedby={error ? errorId : undefined}\n onChange={(e) => {\n setUrl(e.target.value);\n setError(false);\n }}\n />\n {error && (\n <p id={errorId} role=\"alert\" className=\"text-xs text-destructive\">\n {labels.linkInvalid}\n </p>\n )}\n </div>\n <div className=\"flex justify-end gap-2\">\n {pressed && (\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={remove}>\n {labels.linkRemove}\n </Button>\n )}\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={finish}>\n {labels.cancel}\n </Button>\n <Button type=\"submit\" size=\"sm\">\n {labels.linkApply}\n </Button>\n </div>\n </form>\n </PopoverContent>\n </Popover>\n );\n}\n\nfunction VideoPopover({ editor, open, onOpenChange, disabled, labels }: PopoverProps) {\n const urlId = React.useId();\n const titleId = React.useId();\n const errorId = `${urlId}-error`;\n const [url, setUrl] = React.useState(\"\");\n const [title, setTitle] = React.useState(\"\");\n const [error, setError] = React.useState(false);\n\n React.useEffect(() => {\n if (open) {\n setUrl(\"\");\n setTitle(\"\");\n setError(false);\n }\n }, [open]);\n\n // After Apply / Remove / Cancel focus returns to the text; after Escape or\n // a click outside, Radix returns it to the toolbar button as usual.\n const toEditor = React.useRef(false);\n const finish = () => {\n toEditor.current = true;\n onOpenChange(false);\n };\n const onCloseAutoFocus = (event: Event) => {\n if (!toEditor.current) return;\n toEditor.current = false;\n event.preventDefault();\n editor?.commands.focus();\n };\n\n const insert = (event: React.FormEvent) => {\n event.preventDefault();\n event.stopPropagation();\n if (!editor) return;\n if (!parseVideoUrl(url)) {\n setError(true);\n return;\n }\n const ok = editor\n .chain()\n .focus()\n .setVideoEmbed({ url, ...(title.trim() ? { title: title.trim() } : {}) })\n .run();\n if (!ok) {\n setError(true);\n return;\n }\n finish();\n };\n\n return (\n <Popover open={open} onOpenChange={onOpenChange}>\n <Tooltip delayDuration={300} content={labels.video}>\n <PopoverTrigger asChild>\n <ToolbarButton aria-label={labels.video} className=\"h-8 w-8 px-0\" disabled={disabled}>\n <Video className=\"size-4\" aria-hidden />\n </ToolbarButton>\n </PopoverTrigger>\n </Tooltip>\n <PopoverContent align=\"start\" className=\"w-80\" onCloseAutoFocus={onCloseAutoFocus}>\n <form onSubmit={insert} className=\"space-y-3\" noValidate>\n <div className=\"space-y-1.5\">\n <Label htmlFor={urlId}>{labels.videoUrl}</Label>\n <Input\n id={urlId}\n value={url}\n autoFocus\n inputMode=\"url\"\n autoComplete=\"off\"\n placeholder=\"https://\"\n aria-invalid={error || undefined}\n aria-describedby={error ? errorId : undefined}\n onChange={(e) => {\n setUrl(e.target.value);\n setError(false);\n }}\n />\n {error && (\n <p id={errorId} role=\"alert\" className=\"text-xs text-destructive\">\n {labels.videoInvalid}\n </p>\n )}\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor={titleId}>{labels.videoTitle}</Label>\n <Input id={titleId} value={title} maxLength={200} onChange={(e) => setTitle(e.target.value)} />\n </div>\n <div className=\"flex justify-end gap-2\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={finish}>\n {labels.cancel}\n </Button>\n <Button type=\"submit\" size=\"sm\">\n {labels.videoInsert}\n </Button>\n </div>\n </form>\n </PopoverContent>\n </Popover>\n );\n}\n"]}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { R as RichTextDoc, a as RichTextHeadingLevel } from '../../rich-text-doc-C54fME2C.js';
|
|
3
|
+
export { b as RichTextLimitError, c as RichTextMark, d as RichTextNode, e as RichTextToHtmlOptions, S as SanitizeRichTextOptions, V as VIDEO_IFRAME_ATTRS, f as VideoEmbedAttrs, g as VideoProvider, h as emptyRichTextDoc, i as escapeHtml, j as isRichTextDoc, k as isRichTextEmpty, l as isSafeUrl, n as normalizeLinkUrl, p as parseVideoUrl, r as richTextToHtml, m as richTextToPlainText, s as sanitizeRichTextDoc, o as sanitizeVideoEmbedAttrs, v as videoEmbedSrc, q as videoEmbedTitle, t as videoWatchUrl } from '../../rich-text-doc-C54fME2C.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* RichText — read-only rendering of a rich text document (the JSON that
|
|
7
|
+
* `RichTextEditor` produces), plus the server-safe helpers for that JSON.
|
|
8
|
+
*
|
|
9
|
+
* This subpath has no editor dependency and no `"use client"`: it renders in
|
|
10
|
+
* a React Server Component, during SSR, or on the client, and a server can
|
|
11
|
+
* import the helpers on their own to sanitize posted JSON and derive HTML.
|
|
12
|
+
*
|
|
13
|
+
* @stability Beta
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Typography for rendered rich text, shared by `RichText` and the editor's
|
|
18
|
+
* editable area so a document looks the same while writing and reading.
|
|
19
|
+
* Exported for apps that render stored HTML themselves.
|
|
20
|
+
*/
|
|
21
|
+
declare const richTextClassName: string;
|
|
22
|
+
interface RichTextProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "children"> {
|
|
23
|
+
/**
|
|
24
|
+
* The document to render (the editor's JSON). Untrusted input is fine: it
|
|
25
|
+
* is sanitized before rendering, and nothing is set as raw HTML.
|
|
26
|
+
* `null`/`undefined` render an empty container.
|
|
27
|
+
*/
|
|
28
|
+
value: RichTextDoc | null | undefined;
|
|
29
|
+
/** Render video embeds as players (`true`, default) or as plain links. */
|
|
30
|
+
embeds?: boolean;
|
|
31
|
+
/** Heading levels to keep; others move to the nearest kept level. Default `[2, 3, 4]`. */
|
|
32
|
+
headingLevels?: readonly RichTextHeadingLevel[];
|
|
33
|
+
/** Stable test/automation selector (emitted as `data-testid`). */
|
|
34
|
+
testID?: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* RichText — renders a rich text document as React elements.
|
|
38
|
+
*
|
|
39
|
+
* The document is passed through `sanitizeRichTextDoc` first, and rendering
|
|
40
|
+
* never uses `dangerouslySetInnerHTML`: text is React-escaped, links keep
|
|
41
|
+
* only http(s)/mailto/tel/relative URLs, and the only iframes are YouTube,
|
|
42
|
+
* Vimeo and Loom players rebuilt from a validated id. That makes it safe for
|
|
43
|
+
* stored or user-supplied JSON.
|
|
44
|
+
*
|
|
45
|
+
* Server-component safe (no hooks, no `"use client"`).
|
|
46
|
+
*
|
|
47
|
+
* @stability Beta
|
|
48
|
+
*/
|
|
49
|
+
declare function RichText({ value, embeds, headingLevels, className, testID, ...props }: RichTextProps): React.JSX.Element;
|
|
50
|
+
|
|
51
|
+
export { RichText, RichTextDoc, RichTextHeadingLevel, type RichTextProps, richTextClassName };
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { RichText, RichTextLimitError, VIDEO_IFRAME_ATTRS, emptyRichTextDoc, escapeHtml, isRichTextDoc, isRichTextEmpty, isSafeUrl, normalizeLinkUrl, parseVideoUrl, richTextClassName, richTextToHtml, richTextToPlainText, sanitizeRichTextDoc, sanitizeVideoEmbedAttrs, videoEmbedSrc, videoEmbedTitle, videoWatchUrl } from '../../chunk-ZDHWNQTR.js';
|
|
2
|
+
import '../../chunk-NZ5WBA4R.js';
|
|
3
|
+
//# sourceMappingURL=rich-text.js.map
|
|
4
|
+
//# sourceMappingURL=rich-text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"rich-text.js"}
|
|
@@ -10,7 +10,18 @@ declare const AlertDialogHeader: ({ className, ...props }: React.HTMLAttributes<
|
|
|
10
10
|
declare const AlertDialogFooter: ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => React.JSX.Element;
|
|
11
11
|
declare const AlertDialogTitle: React.ForwardRefExoticComponent<Omit<AlertDialog$1.AlertDialogTitleProps & React.RefAttributes<HTMLHeadingElement>, "ref"> & React.RefAttributes<HTMLHeadingElement>>;
|
|
12
12
|
declare const AlertDialogDescription: React.ForwardRefExoticComponent<Omit<AlertDialog$1.AlertDialogDescriptionProps & React.RefAttributes<HTMLParagraphElement>, "ref"> & React.RefAttributes<HTMLParagraphElement>>;
|
|
13
|
-
declare const
|
|
13
|
+
declare const ALERT_ACTION_VARIANT: {
|
|
14
|
+
readonly destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90";
|
|
15
|
+
readonly default: "bg-primary text-primary-foreground hover:bg-primary/90";
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* The confirming button. `variant` defaults to `"destructive"` (red), the
|
|
19
|
+
* right colour for deleting; pass `"default"` when the action is not
|
|
20
|
+
* dangerous (publish, send, continue).
|
|
21
|
+
*/
|
|
22
|
+
declare const AlertDialogAction: React.ForwardRefExoticComponent<Omit<AlertDialog$1.AlertDialogActionProps & React.RefAttributes<HTMLButtonElement>, "ref"> & {
|
|
23
|
+
variant?: keyof typeof ALERT_ACTION_VARIANT | undefined;
|
|
24
|
+
} & React.RefAttributes<HTMLButtonElement>>;
|
|
14
25
|
declare const AlertDialogCancel: React.ForwardRefExoticComponent<Omit<AlertDialog$1.AlertDialogCancelProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
|
|
15
26
|
|
|
16
27
|
export { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger } from '../../chunk-
|
|
1
|
+
export { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger } from '../../chunk-4C4ESW6O.js';
|
|
2
2
|
import '../../chunk-NZ5WBA4R.js';
|
|
3
3
|
//# sourceMappingURL=alert-dialog.js.map
|
|
4
4
|
//# sourceMappingURL=alert-dialog.js.map
|
package/dist/hooks/index.d.ts
CHANGED
|
@@ -2,13 +2,14 @@ export { UseOneOptions, UseResourceFormOptions, UseResourceFormReturn, UseResour
|
|
|
2
2
|
export { FilterDef, FilterDefs, FilterValues, UseDataFiltersOptions, useDataFilters } from './use-data-filters.js';
|
|
3
3
|
export { KeyboardNavOptions, KeyboardNavResult, useKeyboardNavigation } from './use-keyboard-navigation.js';
|
|
4
4
|
export { useIsMobile } from './use-mobile.js';
|
|
5
|
-
export { useViewPreference } from './use-view-preference.js';
|
|
5
|
+
export { ResponsiveViewMode, ViewModeDefault, useViewPreference } from './use-view-preference.js';
|
|
6
6
|
export { Density, ViewSettings, useViewSettings } from './use-view-settings.js';
|
|
7
7
|
export { UseSavedViewsReturn, useSavedViews } from './use-saved-views.js';
|
|
8
8
|
export { RouteMap, createPrefetch } from './use-prefetch.js';
|
|
9
|
-
export {
|
|
9
|
+
export { ResourceUrlParams, ResourceUrlState, ResourceUrlStateOptions, useResourceUrlState } from './use-resource-url-state.js';
|
|
10
|
+
export { R as ResourceActions, a as ResourceColumnDef, U as UseResourcePageProps, b as UseResourcePageReturn, u as useResourcePage } from '../use-resource-page-BDnnCssE.js';
|
|
10
11
|
export { CommandPalette, CommandPaletteItem, CommandPaletteProps, useCommandPaletteHotkey } from '../components/ui/command-palette.js';
|
|
11
|
-
import '../navigation-
|
|
12
|
+
import '../navigation-Bha0R3Fu.js';
|
|
12
13
|
import 'react';
|
|
13
14
|
import '../view-toggle-CahQ87PW.js';
|
|
14
15
|
import '@marktiderman/genesis-core/provider';
|
package/dist/hooks/index.js
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
export { useResourcePage } from '../chunk-
|
|
1
|
+
export { useResourcePage } from '../chunk-RKPS7ERS.js';
|
|
2
|
+
export { useResourceUrlState } from '../chunk-DIV4BYXX.js';
|
|
2
3
|
export { useSavedViews } from '../chunk-GCQFVMPI.js';
|
|
3
|
-
export { useViewPreference } from '../chunk-
|
|
4
|
+
export { useViewPreference } from '../chunk-PKFDGGZV.js';
|
|
4
5
|
export { useViewSettings } from '../chunk-OZ7ZAYCS.js';
|
|
5
6
|
export { CommandPalette, useCommandPaletteHotkey } from '../chunk-CNTWQSUT.js';
|
|
6
7
|
import '../chunk-SEFK4NZV.js';
|
|
7
8
|
import '../chunk-7XMZVISM.js';
|
|
8
9
|
import '../chunk-NZ5WBA4R.js';
|
|
9
|
-
export { useDataFilters } from '../chunk-
|
|
10
|
-
import '../chunk-
|
|
10
|
+
export { useDataFilters } from '../chunk-OITWCIG2.js';
|
|
11
|
+
import '../chunk-WGMEVX3Y.js';
|
|
11
12
|
export { useKeyboardNavigation } from '../chunk-YJ6MPS6U.js';
|
|
12
13
|
export { useIsMobile } from '../chunk-VFO3I7PV.js';
|
|
13
14
|
export { createPrefetch } from '../chunk-HSHIZHYR.js';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { S as SearchParamsAdapter } from '../navigation-
|
|
1
|
+
import { S as SearchParamsAdapter } from '../navigation-Bha0R3Fu.js';
|
|
2
2
|
import 'react';
|
|
3
3
|
|
|
4
4
|
type FilterType = "string" | "multi";
|
|
@@ -16,8 +16,10 @@ type FilterValues<T extends FilterDefs> = {
|
|
|
16
16
|
interface UseDataFiltersOptions {
|
|
17
17
|
/**
|
|
18
18
|
* Injectable URL search-params adapter. Defaults to a browser History-API
|
|
19
|
-
* implementation (no router). Router consumers
|
|
20
|
-
*
|
|
19
|
+
* implementation (no router). Router consumers pass their router's adapter
|
|
20
|
+
* for full SPA integration: `useReactRouterSearchParams()` from
|
|
21
|
+
* `@marktiderman/genesis-ui/router/react-router` or
|
|
22
|
+
* `useTanStackRouterSearchParams()` from `/router/tanstack-router`.
|
|
21
23
|
*/
|
|
22
24
|
searchParams?: SearchParamsAdapter;
|
|
23
25
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { useDataFilters } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
1
|
+
export { useDataFilters } from '../chunk-OITWCIG2.js';
|
|
2
|
+
import '../chunk-WGMEVX3Y.js';
|
|
3
3
|
//# sourceMappingURL=use-data-filters.js.map
|
|
4
4
|
//# sourceMappingURL=use-data-filters.js.map
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import 'react';
|
|
2
|
-
export { R as ResourceActions, a as ResourceColumnDef, U as UseResourcePageProps, b as UseResourcePageReturn, t as titleCase, u as useResourcePage } from '../use-resource-page-
|
|
2
|
+
export { R as ResourceActions, a as ResourceColumnDef, U as UseResourcePageProps, b as UseResourcePageReturn, t as titleCase, u as useResourcePage } from '../use-resource-page-BDnnCssE.js';
|
|
3
3
|
import '../view-toggle-CahQ87PW.js';
|
|
4
4
|
import '@marktiderman/genesis-core/provider';
|
|
5
|
+
import './use-view-preference.js';
|
|
5
6
|
import './use-view-settings.js';
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export { titleCase, useResourcePage } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
1
|
+
export { titleCase, useResourcePage } from '../chunk-RKPS7ERS.js';
|
|
2
|
+
import '../chunk-PKFDGGZV.js';
|
|
3
|
+
import '../chunk-VFO3I7PV.js';
|
|
3
4
|
//# sourceMappingURL=use-resource-page.js.map
|
|
4
5
|
//# sourceMappingURL=use-resource-page.js.map
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { S as SearchParamsAdapter } from '../navigation-Bha0R3Fu.js';
|
|
2
|
+
import { SortParam } from '@marktiderman/genesis-core/provider';
|
|
3
|
+
import 'react';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The query-string names a list keeps its state under. Rename one when two
|
|
7
|
+
* lists share a page, or when `id` already means something in your routes.
|
|
8
|
+
*
|
|
9
|
+
* @stability Beta
|
|
10
|
+
*/
|
|
11
|
+
interface ResourceUrlParams {
|
|
12
|
+
/** The open record's key. Default `"id"`. */
|
|
13
|
+
detail?: string;
|
|
14
|
+
/** The page number (from 1). Default `"page"`. */
|
|
15
|
+
page?: string;
|
|
16
|
+
/** `field:asc` or `field:desc`. Default `"sort"`. */
|
|
17
|
+
sort?: string;
|
|
18
|
+
/** The search text. Default `"q"`. */
|
|
19
|
+
q?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Where a list's state lives in the URL: the router's search params, plus
|
|
23
|
+
* optional names for each value.
|
|
24
|
+
*
|
|
25
|
+
* @stability Beta
|
|
26
|
+
*/
|
|
27
|
+
interface ResourceUrlStateOptions {
|
|
28
|
+
searchParams: SearchParamsAdapter;
|
|
29
|
+
params?: ResourceUrlParams;
|
|
30
|
+
}
|
|
31
|
+
/** @stability Beta */
|
|
32
|
+
interface ResourceUrlState {
|
|
33
|
+
/** The open record's key, or null when no record is open. */
|
|
34
|
+
detailId: string | null;
|
|
35
|
+
/** Open a record (a new history entry, so Back closes it) or close it (null; replaces). */
|
|
36
|
+
setDetailId: (id: string | null) => void;
|
|
37
|
+
/** The page from the URL, or null when absent or not a positive integer. */
|
|
38
|
+
page: number | null;
|
|
39
|
+
/** The sort from the URL, or null. */
|
|
40
|
+
sort: SortParam | null;
|
|
41
|
+
/** The search text from the URL ("" when absent). */
|
|
42
|
+
q: string;
|
|
43
|
+
/**
|
|
44
|
+
* Write page, sort and search. Replaces the history entry (typing a search
|
|
45
|
+
* shouldn't fill Back with every keystroke). A default value (page 1, no
|
|
46
|
+
* sort, empty search) is dropped from the URL; `undefined` leaves a value as is.
|
|
47
|
+
*/
|
|
48
|
+
write: (next: {
|
|
49
|
+
page?: number | null;
|
|
50
|
+
sort?: SortParam | null;
|
|
51
|
+
q?: string;
|
|
52
|
+
}) => void;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* A list's peek, page, sort and search, kept in the URL through any
|
|
56
|
+
* {@link SearchParamsAdapter} (the browser's, React Router's or TanStack
|
|
57
|
+
* Router's). The URL is the source of truth: a copied link reopens the same
|
|
58
|
+
* record on the same page, and Back closes a record that was opened.
|
|
59
|
+
*
|
|
60
|
+
* `ResourcePage` uses it when given `urlState`; a server-controlled page
|
|
61
|
+
* that owns its own page/sort/search can call it directly.
|
|
62
|
+
*
|
|
63
|
+
* @stability Beta
|
|
64
|
+
*/
|
|
65
|
+
declare function useResourceUrlState(options: ResourceUrlStateOptions): ResourceUrlState;
|
|
66
|
+
declare function useResourceUrlState(options: ResourceUrlStateOptions | undefined): ResourceUrlState | undefined;
|
|
67
|
+
|
|
68
|
+
export { type ResourceUrlParams, type ResourceUrlState, type ResourceUrlStateOptions, useResourceUrlState };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"use-resource-url-state.js"}
|
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
import { V as ViewMode } from '../view-toggle-CahQ87PW.js';
|
|
2
2
|
import 'react';
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* A default view that depends on the viewport: cards on a phone, a table on
|
|
6
|
+
* a desktop. Only the DEFAULT is responsive — once the user picks a view it
|
|
7
|
+
* is theirs on every screen size.
|
|
8
|
+
*
|
|
9
|
+
* @stability Beta
|
|
10
|
+
*/
|
|
11
|
+
interface ResponsiveViewMode {
|
|
12
|
+
/** Below the mobile breakpoint (768px). */
|
|
13
|
+
mobile: ViewMode;
|
|
14
|
+
/** At or above the mobile breakpoint. */
|
|
15
|
+
desktop: ViewMode;
|
|
16
|
+
}
|
|
17
|
+
/** @stability Beta */
|
|
18
|
+
type ViewModeDefault = ViewMode | ResponsiveViewMode;
|
|
19
|
+
declare function useViewPreference(key: string, defaultMode?: ViewModeDefault): [ViewMode, (mode: ViewMode) => void];
|
|
5
20
|
|
|
6
|
-
export { useViewPreference };
|
|
21
|
+
export { type ResponsiveViewMode, type ViewModeDefault, useViewPreference };
|
package/dist/index.d.ts
CHANGED
|
@@ -24,7 +24,7 @@ export { Label } from './components/ui/label.js';
|
|
|
24
24
|
export { Textarea } from './components/ui/textarea.js';
|
|
25
25
|
export { Switch } from './components/ui/switch.js';
|
|
26
26
|
export { SettingsRow, SettingsRowProps } from './components/patterns/settings-row.js';
|
|
27
|
-
export { SortableList, SortableListItemContext, SortableListProps } from './components/patterns/sortable-list.js';
|
|
27
|
+
export { SortableList, SortableListItemContext, SortableListProps, SortableListReorder } from './components/patterns/sortable-list.js';
|
|
28
28
|
export { ToggleRow, ToggleRowProps } from './components/patterns/toggle-row.js';
|
|
29
29
|
export { RadioGroup, RadioGroupItem } from './components/ui/radio-group.js';
|
|
30
30
|
export { Alert, AlertDescription, AlertTitle, alertVariants } from './components/ui/alert.js';
|
|
@@ -68,7 +68,7 @@ export { DetailPage, DetailPageProps } from './components/layout/detail-page.js'
|
|
|
68
68
|
export { FormPage, FormPageProps } from './components/layout/form-page.js';
|
|
69
69
|
export { SettingsPage, SettingsPageProps, SettingsPageSection } from './components/layout/settings-page.js';
|
|
70
70
|
export { cn } from './utils.js';
|
|
71
|
-
export { D as DefaultLink, G as GenesisLinkProps, I as IsPathActiveOptions, L as LinkComponent,
|
|
71
|
+
export { D as DefaultLink, G as GenesisLinkProps, I as IsPathActiveOptions, L as LinkComponent, a as NavigateFn, N as NavigationNode, R as ResolvedNavigation, S as SearchParamsAdapter, d as defaultNavigate, i as isPathActive, r as resolveNavigation, u as useBrowserSearchParams } from './navigation-Bha0R3Fu.js';
|
|
72
72
|
export { S as SlotOverride, a as SlotPropsFor, b as Slots, r as renderSlot } from './slots-tR0wf89f.js';
|
|
73
73
|
export { toast } from 'sonner';
|
|
74
74
|
import 'class-variance-authority/types';
|
package/dist/index.js
CHANGED
|
@@ -1,75 +1,75 @@
|
|
|
1
|
-
export { Toolbar, ToolbarButton, ToolbarLink, ToolbarSeparator, ToolbarToggleGroup, ToolbarToggleItem, toolbarVariants } from './chunk-YYEGAFUE.js';
|
|
2
|
-
export { Tooltip } from './chunk-G5YKBPBF.js';
|
|
3
|
-
export { H1, H2, H3, H4, Large, Lead, Muted, P, Small } from './chunk-HVQCZFJ7.js';
|
|
4
1
|
export { VisuallyHidden } from './chunk-SY62XJFA.js';
|
|
5
|
-
export { Toaster, toast } from './chunk-4RAZJ6LL.js';
|
|
6
2
|
export { Tabs, TabsContent, TabsList, TabsTrigger } from './chunk-VXFYETRK.js';
|
|
7
3
|
export { ToggleGroup, ToggleGroupItem } from './chunk-NUXW6NPP.js';
|
|
8
|
-
export {
|
|
9
|
-
export { RadioGroup, RadioGroupItem } from './chunk-ZZ7H7VVX.js';
|
|
10
|
-
export { ResizableHandle, ResizablePanel, ResizablePanelGroup } from './chunk-TAP3PBQT.js';
|
|
11
|
-
export { ScrollArea } from './chunk-6KHY647C.js';
|
|
4
|
+
export { H1, H2, H3, H4, Large, Lead, Muted, P, Small } from './chunk-HVQCZFJ7.js';
|
|
12
5
|
export { Slider } from './chunk-PSR47JRA.js';
|
|
13
|
-
export { Kbd } from './chunk-FFSDFQQN.js';
|
|
14
|
-
export { Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger } from './chunk-AL5TMEZQ.js';
|
|
15
6
|
export { NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, navigationMenuTriggerStyle } from './chunk-THD3YOOZ.js';
|
|
16
7
|
export { Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious } from './chunk-IJCT5IJD.js';
|
|
17
8
|
export { PasswordToggleField, PasswordToggleFieldIcon, PasswordToggleFieldInput, PasswordToggleFieldSlot, PasswordToggleFieldToggle } from './chunk-SRIT4NFQ.js';
|
|
18
|
-
export {
|
|
19
|
-
export {
|
|
9
|
+
export { RadioGroup, RadioGroupItem } from './chunk-ZZ7H7VVX.js';
|
|
10
|
+
export { ResizableHandle, ResizablePanel, ResizablePanelGroup } from './chunk-TAP3PBQT.js';
|
|
11
|
+
export { ScrollArea } from './chunk-6KHY647C.js';
|
|
20
12
|
export { HoverCard, HoverCardContent, HoverCardTrigger } from './chunk-P3ZL6FGR.js';
|
|
21
13
|
export { InputGroup, InputGroupInput, InputGroupPrefix, InputGroupSuffix } from './chunk-GJ6XSCNF.js';
|
|
22
14
|
export { InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot } from './chunk-K23AQNOM.js';
|
|
23
|
-
export {
|
|
24
|
-
export { ChartContainer, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent } from './chunk-QCJAASJT.js';
|
|
15
|
+
export { Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger } from './chunk-AL5TMEZQ.js';
|
|
25
16
|
export { ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger } from './chunk-6TVMQH6M.js';
|
|
26
|
-
export {
|
|
17
|
+
export { DatePicker } from './chunk-6XPMU65K.js';
|
|
18
|
+
export { Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger } from './chunk-JYPENH7T.js';
|
|
27
19
|
export { Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator } from './chunk-2MQKBZBJ.js';
|
|
28
20
|
export { ButtonGroup } from './chunk-K4YLKVMX.js';
|
|
29
21
|
export { Calendar, CalendarDayButton } from './chunk-J6FBA7PH.js';
|
|
22
|
+
export { Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious } from './chunk-AOZGQM6W.js';
|
|
23
|
+
export { ChartContainer, ChartLegend, ChartLegendContent, ChartStyle, ChartTooltip, ChartTooltipContent } from './chunk-QCJAASJT.js';
|
|
30
24
|
export { AccessibleIcon } from './chunk-JAMLFMDS.js';
|
|
31
25
|
export { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from './chunk-YWFPMND7.js';
|
|
32
|
-
export {
|
|
33
|
-
export {
|
|
34
|
-
export { FormPage } from './chunk-PLIYF6KI.js';
|
|
35
|
-
export { Alert, AlertDescription, AlertTitle, alertVariants } from './chunk-OZZTPE7F.js';
|
|
36
|
-
export { Section, SettingsPage, sectionHeadingVariants } from './chunk-P64MFQXZ.js';
|
|
37
|
-
export { SortableList } from './chunk-TXOZMKNW.js';
|
|
26
|
+
export { AspectRatio } from './chunk-6Q6CLLJ4.js';
|
|
27
|
+
export { SortableList } from './chunk-S7NXD37O.js';
|
|
38
28
|
export { StatusBadge, statusBadgeVariants } from './chunk-XMK3T4TA.js';
|
|
39
29
|
export { ToggleRow } from './chunk-6M4NHHKG.js';
|
|
30
|
+
export { SettingsRow } from './chunk-A7AHVDG7.js';
|
|
40
31
|
export { UserAvatar, userAvatarVariants } from './chunk-XBX6QMR5.js';
|
|
41
32
|
export { Avatar, AvatarFallback, AvatarImage } from './chunk-LNFF2RBD.js';
|
|
42
|
-
export {
|
|
33
|
+
export { Toolbar, ToolbarButton, ToolbarLink, ToolbarSeparator, ToolbarToggleGroup, ToolbarToggleItem, toolbarVariants } from './chunk-YYEGAFUE.js';
|
|
34
|
+
export { Toggle, toggleVariants } from './chunk-C46ITXE4.js';
|
|
35
|
+
export { Tooltip } from './chunk-G5YKBPBF.js';
|
|
36
|
+
export { Kbd } from './chunk-FFSDFQQN.js';
|
|
43
37
|
export { renderSlot } from './chunk-7S7LKQBD.js';
|
|
44
38
|
export { Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow } from './chunk-N2ZFNOOT.js';
|
|
45
39
|
export { Textarea } from './chunk-YETMISCE.js';
|
|
46
40
|
export { Separator } from './chunk-SXSCHWZU.js';
|
|
47
41
|
export { Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger } from './chunk-XCGZPFT7.js';
|
|
48
42
|
export { Skeleton } from './chunk-QFM4Z2SS.js';
|
|
43
|
+
export { Toaster, toast } from './chunk-4RAZJ6LL.js';
|
|
49
44
|
export { Progress } from './chunk-W5Y3LG5K.js';
|
|
50
|
-
export { Input } from './chunk-QSXVL5UB.js';
|
|
51
|
-
export { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from './chunk-FN3FZVUR.js';
|
|
52
45
|
export { Checkbox } from './chunk-SEBU6JCK.js';
|
|
46
|
+
export { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from './chunk-FN3FZVUR.js';
|
|
47
|
+
export { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger } from './chunk-4C4ESW6O.js';
|
|
48
|
+
export { PageLoading, pageLoadingVariants } from './chunk-YRYQXU3G.js';
|
|
49
|
+
export { Spinner } from './chunk-OVU3Z2MT.js';
|
|
50
|
+
export { Input } from './chunk-QSXVL5UB.js';
|
|
51
|
+
export { Container, Stack, containerVariants, stackVariants } from './chunk-4CQHPWJD.js';
|
|
53
52
|
export { Collapsible, CollapsibleContent, CollapsibleTrigger } from './chunk-B2GIBUQD.js';
|
|
54
53
|
export { Badge } from './chunk-NPNADZHM.js';
|
|
55
54
|
export { Select, SelectContent, SelectGroup, SelectItem, SelectScrollDownButton, SelectScrollUpButton, SelectTrigger, SelectValue } from './chunk-FK42ZGGV.js';
|
|
56
|
-
export { Popover, PopoverContent, PopoverTrigger } from './chunk-22XB3Q6H.js';
|
|
57
55
|
export { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger } from './chunk-QJ6P2DW6.js';
|
|
58
56
|
export { Switch } from './chunk-27ELYTGE.js';
|
|
59
|
-
export {
|
|
60
|
-
export { Button } from './chunk-NWSCYLPT.js';
|
|
61
|
-
export { PageLoading, pageLoadingVariants } from './chunk-YRYQXU3G.js';
|
|
62
|
-
export { Spinner } from './chunk-OVU3Z2MT.js';
|
|
63
|
-
export { FormDescription, FormError, FormField, FormLabel } from './chunk-R7QFP6EL.js';
|
|
64
|
-
export { Label } from './chunk-F47U5KNW.js';
|
|
57
|
+
export { Popover, PopoverContent, PopoverTrigger } from './chunk-22XB3Q6H.js';
|
|
65
58
|
export { DashboardPage, Grid, gridVariants } from './chunk-ARJI2JUV.js';
|
|
66
59
|
export { DetailPage } from './chunk-AFZ76Q26.js';
|
|
60
|
+
export { FormPage } from './chunk-MPI33I4K.js';
|
|
61
|
+
export { Alert, AlertDescription, AlertTitle, alertVariants } from './chunk-OZZTPE7F.js';
|
|
62
|
+
export { Section, SettingsPage, sectionHeadingVariants } from './chunk-P64MFQXZ.js';
|
|
67
63
|
export { Split, splitVariants } from './chunk-D2LIXA2Y.js';
|
|
68
64
|
export { GAP_CLASSES, spaceScale } from './chunk-AVFZ4P4B.js';
|
|
65
|
+
export { EmptyState, NoFeaturesFound, NoFeedbackFound, NoSearchResults } from './chunk-65SPT7EA.js';
|
|
66
|
+
export { Button } from './chunk-NWSCYLPT.js';
|
|
67
|
+
export { FormDescription, FormError, FormField, FormLabel } from './chunk-R7QFP6EL.js';
|
|
68
|
+
export { Label } from './chunk-F47U5KNW.js';
|
|
69
69
|
export { CommandPalette, useCommandPaletteHotkey } from './chunk-CNTWQSUT.js';
|
|
70
70
|
export { Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut } from './chunk-SEFK4NZV.js';
|
|
71
71
|
export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger } from './chunk-7XMZVISM.js';
|
|
72
72
|
export { cn } from './chunk-NZ5WBA4R.js';
|
|
73
|
-
export { DefaultLink, defaultNavigate, isPathActive, resolveNavigation, useBrowserSearchParams } from './chunk-
|
|
73
|
+
export { DefaultLink, defaultNavigate, isPathActive, resolveNavigation, useBrowserSearchParams } from './chunk-WGMEVX3Y.js';
|
|
74
74
|
//# sourceMappingURL=index.js.map
|
|
75
75
|
//# sourceMappingURL=index.js.map
|