@alfadocs/ui-kit-debug 1.43.0 → 1.44.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/dist/_chunks/{calendar-ChJQzRw-.js → calendar-U6N0F99w.js} +383 -359
- package/dist/_chunks/calendar-U6N0F99w.js.map +1 -0
- package/dist/_chunks/calendar-workspace-DBYAtdyd.js +12161 -0
- package/dist/_chunks/calendar-workspace-DBYAtdyd.js.map +1 -0
- package/dist/_chunks/{face-scheme-Dg6ZyLKb.js → face-scheme-Bm6pe7R8.js} +265 -275
- package/dist/_chunks/face-scheme-Bm6pe7R8.js.map +1 -0
- package/dist/_chunks/help-me-write-templates-GUeEn3Ff.js +741 -0
- package/dist/_chunks/help-me-write-templates-GUeEn3Ff.js.map +1 -0
- package/dist/_chunks/{notes-panel-CRAovkjx.js → notes-panel-CY4KmDo-.js} +159 -152
- package/dist/_chunks/notes-panel-CY4KmDo-.js.map +1 -0
- package/dist/_chunks/{panel-subview-PMBRPFOa.js → panel-subview-CYnuX-KR.js} +61 -40
- package/dist/_chunks/panel-subview-CYnuX-KR.js.map +1 -0
- package/dist/_chunks/rich-text-editor-BYE6kK4u.js +3839 -0
- package/dist/_chunks/rich-text-editor-BYE6kK4u.js.map +1 -0
- package/dist/_chunks/undo-2-CYNAzclj.js +26 -0
- package/dist/_chunks/undo-2-CYNAzclj.js.map +1 -0
- package/dist/_chunks/variables-menu-vXUaSBj4.js +401 -0
- package/dist/_chunks/variables-menu-vXUaSBj4.js.map +1 -0
- package/dist/agent-catalog.json +84 -3
- package/dist/agent-i18n/en.json +14 -3
- package/dist/components/calendar/calendar.d.ts +6 -0
- package/dist/components/calendar/calendar.d.ts.map +1 -1
- package/dist/components/calendar/index.js +1 -1
- package/dist/components/face-scheme/index.js +1 -1
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/notes-panel/index.js +1 -1
- package/dist/components/notes-panel/notes-panel.d.ts +4 -0
- package/dist/components/notes-panel/notes-panel.d.ts.map +1 -1
- package/dist/components/panel-subview/index.js +1 -1
- package/dist/components/panel-subview/panel-subview.d.ts +6 -0
- package/dist/components/panel-subview/panel-subview.d.ts.map +1 -1
- package/dist/components/rich-text-editor/editor-toolbar.d.ts +35 -3
- package/dist/components/rich-text-editor/editor-toolbar.d.ts.map +1 -1
- package/dist/components/rich-text-editor/index.d.ts +1 -1
- package/dist/components/rich-text-editor/index.d.ts.map +1 -1
- package/dist/components/rich-text-editor/index.js +1 -1
- package/dist/components/rich-text-editor/rich-text-editor.agent.d.ts.map +1 -1
- package/dist/components/rich-text-editor/rich-text-editor.d.ts +98 -15
- package/dist/components/rich-text-editor/rich-text-editor.d.ts.map +1 -1
- package/dist/components/variables-menu/index.d.ts +4 -0
- package/dist/components/variables-menu/index.d.ts.map +1 -0
- package/dist/components/variables-menu/index.js +6 -0
- package/dist/components/variables-menu/index.js.map +1 -0
- package/dist/components/variables-menu/variables-menu.agent.d.ts +10 -0
- package/dist/components/variables-menu/variables-menu.agent.d.ts.map +1 -0
- package/dist/components/variables-menu/variables-menu.d.ts +53 -0
- package/dist/components/variables-menu/variables-menu.d.ts.map +1 -0
- package/dist/host-compat.css +5 -5
- package/dist/i18n/locales/ar.d.ts +77 -6
- package/dist/i18n/locales/ar.d.ts.map +1 -1
- package/dist/i18n/locales/ar.js +78 -7
- package/dist/i18n/locales/ar.js.map +1 -1
- package/dist/i18n/locales/de.d.ts +77 -6
- package/dist/i18n/locales/de.d.ts.map +1 -1
- package/dist/i18n/locales/de.js +78 -7
- package/dist/i18n/locales/de.js.map +1 -1
- package/dist/i18n/locales/el.d.ts +77 -6
- package/dist/i18n/locales/el.d.ts.map +1 -1
- package/dist/i18n/locales/el.js +78 -7
- package/dist/i18n/locales/el.js.map +1 -1
- package/dist/i18n/locales/en.d.ts +77 -6
- package/dist/i18n/locales/en.d.ts.map +1 -1
- package/dist/i18n/locales/en.js +85 -7
- package/dist/i18n/locales/en.js.map +1 -1
- package/dist/i18n/locales/es.d.ts +77 -6
- package/dist/i18n/locales/es.d.ts.map +1 -1
- package/dist/i18n/locales/es.js +78 -7
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.d.ts +77 -6
- package/dist/i18n/locales/fr.d.ts.map +1 -1
- package/dist/i18n/locales/fr.js +78 -7
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hi.d.ts +77 -6
- package/dist/i18n/locales/hi.d.ts.map +1 -1
- package/dist/i18n/locales/hi.js +78 -7
- package/dist/i18n/locales/hi.js.map +1 -1
- package/dist/i18n/locales/it.d.ts +77 -6
- package/dist/i18n/locales/it.d.ts.map +1 -1
- package/dist/i18n/locales/it.js +78 -7
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/ja.d.ts +77 -6
- package/dist/i18n/locales/ja.d.ts.map +1 -1
- package/dist/i18n/locales/ja.js +78 -7
- package/dist/i18n/locales/ja.js.map +1 -1
- package/dist/i18n/locales/nl.d.ts +77 -6
- package/dist/i18n/locales/nl.d.ts.map +1 -1
- package/dist/i18n/locales/nl.js +78 -7
- package/dist/i18n/locales/nl.js.map +1 -1
- package/dist/i18n/locales/pl.d.ts +77 -6
- package/dist/i18n/locales/pl.d.ts.map +1 -1
- package/dist/i18n/locales/pl.js +78 -7
- package/dist/i18n/locales/pl.js.map +1 -1
- package/dist/i18n/locales/pt.d.ts +77 -6
- package/dist/i18n/locales/pt.d.ts.map +1 -1
- package/dist/i18n/locales/pt.js +78 -7
- package/dist/i18n/locales/pt.js.map +1 -1
- package/dist/i18n/locales/ro.d.ts +77 -6
- package/dist/i18n/locales/ro.d.ts.map +1 -1
- package/dist/i18n/locales/ro.js +78 -7
- package/dist/i18n/locales/ro.js.map +1 -1
- package/dist/i18n/locales/ru.d.ts +77 -6
- package/dist/i18n/locales/ru.d.ts.map +1 -1
- package/dist/i18n/locales/ru.js +78 -7
- package/dist/i18n/locales/ru.js.map +1 -1
- package/dist/i18n/locales/sq.d.ts +77 -6
- package/dist/i18n/locales/sq.d.ts.map +1 -1
- package/dist/i18n/locales/sq.js +78 -7
- package/dist/i18n/locales/sq.js.map +1 -1
- package/dist/i18n/locales/sv.d.ts +77 -6
- package/dist/i18n/locales/sv.d.ts.map +1 -1
- package/dist/i18n/locales/sv.js +78 -7
- package/dist/i18n/locales/sv.js.map +1 -1
- package/dist/i18n/locales/tr.d.ts +77 -6
- package/dist/i18n/locales/tr.d.ts.map +1 -1
- package/dist/i18n/locales/tr.js +78 -7
- package/dist/i18n/locales/tr.js.map +1 -1
- package/dist/i18n/locales/zh.d.ts +77 -6
- package/dist/i18n/locales/zh.d.ts.map +1 -1
- package/dist/i18n/locales/zh.js +78 -7
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/index.js +916 -913
- package/dist/index.js.map +1 -1
- package/dist/locales/ar.json +78 -7
- package/dist/locales/de.json +78 -7
- package/dist/locales/el.json +78 -7
- package/dist/locales/en.json +78 -7
- package/dist/locales/es.json +78 -7
- package/dist/locales/fr.json +78 -7
- package/dist/locales/hi.json +78 -7
- package/dist/locales/it.json +78 -7
- package/dist/locales/ja.json +78 -7
- package/dist/locales/nl.json +78 -7
- package/dist/locales/pl.json +78 -7
- package/dist/locales/pt.json +78 -7
- package/dist/locales/ro.json +78 -7
- package/dist/locales/ru.json +78 -7
- package/dist/locales/sq.json +78 -7
- package/dist/locales/sv.json +78 -7
- package/dist/locales/tr.json +78 -7
- package/dist/locales/zh.json +78 -7
- package/dist/patterns/calendar/calendar-bookings-panel.d.ts +8 -3
- package/dist/patterns/calendar/calendar-bookings-panel.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar-care-rules.d.ts +49 -0
- package/dist/patterns/calendar/calendar-care-rules.d.ts.map +1 -0
- package/dist/patterns/calendar/calendar-task-editor.d.ts +31 -0
- package/dist/patterns/calendar/calendar-task-editor.d.ts.map +1 -0
- package/dist/patterns/calendar/calendar-waiting-list-panel.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar-workspace.d.ts +8 -1
- package/dist/patterns/calendar/calendar-workspace.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar-workspace.model.d.ts +39 -12
- package/dist/patterns/calendar/calendar-workspace.model.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar.data.d.ts +9 -0
- package/dist/patterns/calendar/calendar.data.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar.journey.d.ts +35 -3
- package/dist/patterns/calendar/calendar.journey.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar.model.d.ts +23 -1
- package/dist/patterns/calendar/calendar.model.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar.sheets.d.ts +21 -3
- package/dist/patterns/calendar/calendar.sheets.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar.surface.d.ts +6 -1
- package/dist/patterns/calendar/calendar.surface.d.ts.map +1 -1
- package/dist/patterns/calendar/calendar.types.d.ts +32 -1
- package/dist/patterns/calendar/calendar.types.d.ts.map +1 -1
- package/dist/patterns/calendar/index.js +1 -1
- package/dist/patterns/help-me-write-templates/help-me-write-templates.d.ts +58 -26
- package/dist/patterns/help-me-write-templates/help-me-write-templates.d.ts.map +1 -1
- package/dist/patterns/help-me-write-templates/index.d.ts +1 -1
- package/dist/patterns/help-me-write-templates/index.d.ts.map +1 -1
- package/dist/patterns/help-me-write-templates/index.js +1 -1
- package/dist/tokens.css +6 -6
- package/package.json +5 -1
- package/dist/_chunks/calendar-ChJQzRw-.js.map +0 -1
- package/dist/_chunks/calendar-workspace-DhXqqu-D.js +0 -11392
- package/dist/_chunks/calendar-workspace-DhXqqu-D.js.map +0 -1
- package/dist/_chunks/face-scheme-Dg6ZyLKb.js.map +0 -1
- package/dist/_chunks/help-me-write-templates-B-m7zgJa.js +0 -775
- package/dist/_chunks/help-me-write-templates-B-m7zgJa.js.map +0 -1
- package/dist/_chunks/highlighter-DSkckT2Q.js +0 -15
- package/dist/_chunks/highlighter-DSkckT2Q.js.map +0 -1
- package/dist/_chunks/notes-panel-CRAovkjx.js.map +0 -1
- package/dist/_chunks/panel-subview-PMBRPFOa.js.map +0 -1
- package/dist/_chunks/rich-text-editor-DUMeifwc.js +0 -3176
- package/dist/_chunks/rich-text-editor-DUMeifwc.js.map +0 -1
- package/dist/_chunks/wand-sparkles-DAjKyhz7.js +0 -27
- package/dist/_chunks/wand-sparkles-DAjKyhz7.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help-me-write-templates-GUeEn3Ff.js","sources":["../../src/patterns/help-me-write-templates/help-me-write-templates.tsx"],"sourcesContent":["/**\n * Help me write templates (HTP-6383) — practice-shared AI templates in the\n * RichTextEditor.\n *\n * Runtime pattern: real consuming apps mount this in production (surfaced via\n * `src/patterns/index.ts` and the `./patterns/help-me-write-templates`\n * subpath). Templates are an AI action of the editor itself, next to\n * spelling and auto-format: a Templates segment in the AI pill and in the\n * selection bubble (`aiTemplates`). Picking one rewrites the selection, else\n * the whole note, then this pattern offers Undo. The editor keeps the\n * patient AI-consent gate and resume-after-grant for all of it.\n *\n * Parts, usable on their own or wired together by `useHelpMeWriteTemplates`:\n * - `HelpMeWriteTemplatesBar` — the Help-me-write bar (`renderHelpMeWrite`):\n * a free prompt with an optional mic, the draft and Insert.\n * - `AiTemplateManager` — the dialog to list, create, edit and delete\n * templates and pick the default.\n * - `AiCreditsExhaustedNotice` — the out-of-credits state the bar shows when\n * an AI call rejects with `AiCreditsExhaustedError`, from the bar or the pill.\n * - `HelpMeWriteUndoNotice` — the success notice with Undo after a template\n * rewrote the note.\n *\n * The host owns the templates (list + persistence) and the AI call. The kit\n * never talks to a backend.\n */\nimport {\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type DragEvent,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { cva } from 'class-variance-authority';\nimport {\n ArrowLeft,\n Astroid,\n GripVertical,\n Mic,\n Pencil,\n Plus,\n RotateCcw,\n Send,\n Square,\n Trash2,\n TrendingUp,\n X,\n} from 'lucide-react';\n\nimport { Alert } from '../../components/alert';\nimport { Button, IconButton } from '../../components/button';\nimport { Dialog } from '../../components/dialog';\nimport { EditorOverlay } from '../../components/editor-overlay';\nimport { EmptyState } from '../../components/empty-state';\nimport { FormField } from '../../components/form-field';\nimport { Progress } from '../../components/progress';\nimport type {\n HelpMeWriteRenderContext,\n RichTextEditorAiApplied,\n RichTextEditorAiTemplates,\n} from '../../components/rich-text-editor';\nimport { Spinner } from '../../components/spinner';\nimport { TextArea } from '../../components/text-area';\nimport { TextInput } from '../../components/text-input';\nimport { SafeHtml } from '../../components/_shared/safe-html';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\n/** A practice-shared AI template. */\nexport interface AiTemplate {\n id: string;\n /** Up to 100 characters, unique within the practice. */\n name: string;\n /** One line under the name in the Templates menu. */\n description?: string;\n /** The instructions sent to the AI, up to 4000 characters. */\n prompt: string;\n /**\n * @deprecated The list order is the menu order: the first template is the\n * one most people use. Ignored; reorder with `onReorderTemplates`.\n */\n isDefault?: boolean;\n}\n\n/** What the manager hands `onSaveTemplate`: `id` is absent for a new one. */\nexport type AiTemplateDraft = Omit<AiTemplate, 'id'> & { id?: string };\n\n/** One Help-me-write request. `template` is absent for a free prompt. */\nexport interface HelpMeWriteRequest {\n template?: AiTemplate;\n /** The free prompt, or extra instructions for a template. May be ''. */\n prompt: string;\n /**\n * The context, as plain text. For a template, the text it rewrites. For\n * the free prompt, what the draft is about. From the AI pill it is the\n * whole note; from the selection bubble, the selected text.\n */\n sourceText: string;\n /** Where `sourceText` came from. */\n scope?: 'document' | 'selection';\n signal: AbortSignal;\n}\n\n/**\n * Throw (or reject with) this from `onGenerate` when the practice is out of\n * AI credits (the platform endpoint's 402), and the bar shows the\n * out-of-credits notice instead of a generic error.\n */\nexport class AiCreditsExhaustedError extends Error {\n constructor(message = 'AI credits exhausted') {\n super(message);\n this.name = 'AiCreditsExhaustedError';\n }\n}\n\n/** The practice's allowance, for the out-of-credits notice. All optional. */\nexport interface AiCreditsInfo {\n remaining?: number;\n limit?: number;\n /** When the monthly allowance returns. */\n resetsOn?: Date;\n /**\n * Shows a \"Buy AI credits\" button and \"add credits\" wording. Omit while\n * credits cannot be bought: the notice then only says when AI returns.\n */\n onBuyCredits?: () => void;\n /** Shows a \"See what each action costs\" link. */\n onSeeCosts?: () => void;\n}\n\nexport type HelpMeWriteApplyMode = 'replace' | 'below' | 'insert';\n\n/** Fired after a draft lands in the editor. */\nexport interface HelpMeWriteApplied {\n mode: HelpMeWriteApplyMode;\n template?: AiTemplate;\n /** The editor's HTML before the change. */\n previousHtml: string;\n /** Puts `previousHtml` back in the editor (what Undo does). */\n undo: () => void;\n}\n\n/* ------------------------------------------------------------------ */\n/* Shared classes */\n/* ------------------------------------------------------------------ */\n\n// Match the composer's input height (--min-target-size), like the kit bar.\nconst ACTION_SIZE = 'ds:!size-[var(--min-target-size)]';\nconst BRAND_ACTION = `${ACTION_SIZE} ds:bg-[image:var(--gradient-brand)] ds:rounded-full`;\n// The recording mic goes solid destructive, as in the kit's own bar.\nconst RECORDING_MIC =\n 'ds:aria-pressed:!bg-[var(--destructive)] ds:aria-pressed:!text-[var(--destructive-foreground)]';\nconst metaClass =\n 'ds:m-0 ds:text-[length:var(--font-size-sm)] ds:text-[color:var(--muted-foreground)]';\nconst eyebrowClass =\n 'type-eyebrow ds:m-0 ds:text-[color:var(--muted-foreground)]';\nconst previewClass = [\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-[color:var(--border)]',\n 'ds:bg-[color-mix(in_srgb,var(--background)_70%,transparent)]',\n 'ds:p-[var(--spacing-sm)] ds:[max-block-size:14rem] ds:overflow-y-auto',\n 'ds:text-[length:var(--font-size-sm)] ds:text-[color:var(--foreground)]',\n 'ds:[&_ul]:list-disc ds:[&_ul]:ps-[var(--spacing-md)]',\n 'ds:[&_h3]:font-medium ds:[&_h3]:[margin-block-start:var(--spacing-xs)]',\n 'ds:[&_p]:[margin-block-end:var(--spacing-xs)]',\n 'ds:[&>:first-child]:[margin-block-start:0]',\n].join(' ');\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\n// Default template first, then the rest in their saved order.\n\n// Join dictated text onto the prompt with a single space.\nfunction joinWith(base: string, extra: string): string {\n if (!extra) return base;\n if (!base) return extra;\n return /\\s$/.test(base) ? `${base}${extra}` : `${base} ${extra}`;\n}\n\nfunction isAbort(err: unknown): boolean {\n return (\n typeof err === 'object' &&\n err !== null &&\n 'name' in err &&\n (err as { name?: string }).name === 'AbortError'\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* AiCreditsExhaustedNotice */\n/* ------------------------------------------------------------------ */\n\nexport interface AiCreditsExhaustedNoticeProps {\n credits?: AiCreditsInfo;\n /** Shows a Back button (the bar uses it to return to the prompt). */\n onBack?: () => void;\n}\n\n/** The out-of-credits state: what happened, the allowance, and the ways on. */\nexport function AiCreditsExhaustedNotice({\n credits,\n onBack,\n}: AiCreditsExhaustedNoticeProps): React.JSX.Element {\n const { t, i18n } = useTranslation();\n const limit = credits?.limit;\n const remaining = credits?.remaining ?? 0;\n const remainingText =\n limit !== undefined\n ? t('helpMeWriteTemplates.credits.remaining', { remaining, limit })\n : undefined;\n const resetsOn = credits?.resetsOn\n ? new Intl.DateTimeFormat(i18n.language, {\n day: 'numeric',\n month: 'long',\n }).format(credits.resetsOn)\n : undefined;\n return (\n <div\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\"\n data-component=\"ai-credits-exhausted-notice\"\n >\n <Alert variant=\"promo\" icon={<Astroid aria-hidden=\"true\" />}>\n <Alert.Title as=\"h2\">\n {t('helpMeWriteTemplates.credits.title')}\n </Alert.Title>\n <Alert.Description>\n {/* Without a way to buy credits, only say when AI comes back. */}\n {credits?.onBuyCredits\n ? resetsOn\n ? t('helpMeWriteTemplates.credits.bodyResets', { date: resetsOn })\n : t('helpMeWriteTemplates.credits.body')\n : resetsOn\n ? t('helpMeWriteTemplates.credits.bodyWaitResets', {\n date: resetsOn,\n })\n : t('helpMeWriteTemplates.credits.bodyWait')}\n </Alert.Description>\n {limit !== undefined && remainingText ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-2xs)] ds:[margin-block-start:var(--spacing-sm)]\">\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n <span className=\"type-label\">\n {t('helpMeWriteTemplates.credits.meterLabel')}\n </span>\n <span className=\"type-label ds:ms-auto ds:tabular-nums\">\n {remainingText}\n </span>\n </div>\n <Progress\n value={Math.max(0, limit - remaining)}\n max={limit}\n size=\"sm\"\n ariaLabel={t('helpMeWriteTemplates.credits.meterLabel')}\n ariaValueText={remainingText}\n />\n </div>\n ) : null}\n {credits?.onBuyCredits || credits?.onSeeCosts ? (\n <Alert.Action>\n {credits.onBuyCredits ? (\n <Button\n intent=\"tonal\"\n size=\"sm\"\n startIcon={<TrendingUp aria-hidden=\"true\" />}\n onClick={credits.onBuyCredits}\n >\n {t('helpMeWriteTemplates.credits.cta')}\n </Button>\n ) : null}\n {credits.onSeeCosts ? (\n <Button intent=\"link\" size=\"sm\" onClick={credits.onSeeCosts}>\n {t('helpMeWriteTemplates.credits.secondary')}\n </Button>\n ) : null}\n </Alert.Action>\n ) : null}\n </Alert>\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]\">\n {onBack ? (\n <Button intent=\"ghost\" startIcon={<ArrowLeft />} onClick={onBack}>\n {t('helpMeWriteTemplates.credits.back')}\n </Button>\n ) : null}\n <p className={metaClass}>{t('helpMeWriteTemplates.credits.kept')}</p>\n </div>\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* HelpMeWriteTemplatesBar */\n/* ------------------------------------------------------------------ */\n\nexport interface HelpMeWriteTemplatesBarProps {\n /** What `RichTextEditor`'s `renderHelpMeWrite` hands its host. */\n context: HelpMeWriteRenderContext;\n /**\n * @deprecated Templates run from the editor's AI pill (`aiTemplates`),\n * not from this bar. Ignored.\n */\n templates?: AiTemplate[];\n /** The AI call. Reject with `AiCreditsExhaustedError` when out of credits. */\n onGenerate: (request: HelpMeWriteRequest) => Promise<string>;\n /** @deprecated The manager opens from the pill's Templates menu. Ignored. */\n onManageTemplates?: (mode: 'list' | 'create') => void;\n /** After a draft lands. */\n onApplied?: (applied: HelpMeWriteApplied) => void;\n /** Shown in the out-of-credits notice. */\n credits?: AiCreditsInfo;\n /** Show the mic in the prompt when the editor has `onDictate`. Default true. */\n enableDictation?: boolean;\n /** Ignore Escape (e.g. while the manager dialog above it is open). */\n suspendClose?: boolean;\n}\n\n/**\n * The Help-me-write bar, docked in the editor's AI slot: a free prompt with\n * an optional mic, then the draft and Insert. It also shows the\n * out-of-credits notice, including when a pill action ran out.\n */\nexport function HelpMeWriteTemplatesBar({\n context,\n onGenerate,\n onApplied,\n credits,\n enableDictation = true,\n suspendClose = false,\n}: HelpMeWriteTemplatesBarProps): React.JSX.Element {\n const { t } = useTranslation();\n const { open } = context;\n const draftId = useId();\n const errorId = useId();\n const [prompt, setPrompt] = useState('');\n const [loading, setLoading] = useState(false);\n const [errored, setErrored] = useState(false);\n const [outOfCredits, setOutOfCredits] = useState(false);\n const [draft, setDraft] = useState<string | null>(null);\n const abortRef = useRef<AbortController | null>(null);\n const onDictate = enableDictation ? context.onDictate : undefined;\n\n /* ---- Mic in the prompt (the editor's own dictation seam) ---- */\n const [isDictating, setIsDictating] = useState(false);\n const [interim, setInterim] = useState('');\n const [announcement, setAnnouncement] = useState('');\n const dictateAbortRef = useRef<AbortController | null>(null);\n const stopDictation = useCallback(() => dictateAbortRef.current?.abort(), []);\n const toggleDictation = useCallback(() => {\n if (isDictating) {\n stopDictation();\n return;\n }\n if (!onDictate) return;\n const controller = new AbortController();\n dictateAbortRef.current = controller;\n setIsDictating(true);\n setAnnouncement(t('helpMeWriteTemplates.bar.listening'));\n onDictate({\n signal: controller.signal,\n onPartialTranscript: (text) => {\n if (!controller.signal.aborted) setInterim(text);\n },\n onFinalTranscript: (text) => {\n if (controller.signal.aborted) return;\n setInterim('');\n const trimmed = text.trim();\n if (trimmed) {\n setPrompt((p) => joinWith(p, trimmed));\n setAnnouncement(trimmed);\n }\n },\n })\n .catch((err: unknown) => {\n // Out of credits shows the notice; other dictation errors are\n // non-fatal (the user can type instead).\n if (err instanceof AiCreditsExhaustedError) setOutOfCredits(true);\n })\n .finally(() => {\n setInterim('');\n if (dictateAbortRef.current === controller) {\n dictateAbortRef.current = null;\n setIsDictating(false);\n setAnnouncement('');\n }\n });\n }, [isDictating, onDictate, stopDictation, t]);\n\n // Each open starts fresh.\n useEffect(() => {\n if (open) {\n setPrompt('');\n setLoading(false);\n setErrored(false);\n // Opened because an AI call ran out of credits: start on the notice.\n setOutOfCredits(context.creditsExhausted);\n setDraft(null);\n } else {\n abortRef.current?.abort();\n dictateAbortRef.current?.abort();\n }\n // Only on open/close; `context` is a fresh object every editor render.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n useEffect(\n () => () => {\n abortRef.current?.abort();\n dictateAbortRef.current?.abort();\n },\n [],\n );\n\n const run = useCallback(() => {\n if (loading || !prompt.trim()) return;\n stopDictation();\n abortRef.current?.abort();\n const controller = new AbortController();\n abortRef.current = controller;\n setErrored(false);\n setLoading(true);\n const onSelection = context.scope === 'selection';\n onGenerate({\n prompt: prompt.trim(),\n sourceText: onSelection ? context.selectionText : context.getText(),\n scope: onSelection ? 'selection' : 'document',\n signal: controller.signal,\n })\n .then((result) => {\n if (controller.signal.aborted) return;\n setDraft(result);\n setLoading(false);\n })\n .catch((err: unknown) => {\n if (controller.signal.aborted || isAbort(err)) return;\n if (err instanceof AiCreditsExhaustedError) setOutOfCredits(true);\n else setErrored(true);\n setLoading(false);\n });\n // `context` is a fresh object every editor render; read it at call time.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [loading, prompt, onGenerate, stopDictation]);\n\n const { onClose: contextClose } = context;\n const close = useCallback(() => {\n if (suspendClose) return;\n contextClose();\n }, [suspendClose, contextClose]);\n\n const insert = () => {\n if (draft === null) return;\n const previousHtml = context.getHTML();\n context.insertAtSelection(draft);\n context.onClose();\n const { setContent } = context;\n onApplied?.({\n mode: context.scope === 'selection' ? 'replace' : 'insert',\n previousHtml,\n undo: () => setContent(previousHtml),\n });\n };\n\n let body: ReactNode;\n if (outOfCredits) {\n body = (\n <AiCreditsExhaustedNotice\n credits={credits}\n onBack={() => setOutOfCredits(false)}\n />\n );\n } else if (draft !== null) {\n body = (\n <>\n <section\n aria-labelledby={draftId}\n className=\"ds:flex ds:min-w-0 ds:flex-col ds:gap-[var(--spacing-2xs)]\"\n >\n <h2 id={draftId} className={eyebrowClass}>\n {t('helpMeWriteTemplates.bar.after')}\n </h2>\n <SafeHtml\n html={draft}\n profile=\"rich-text\"\n className={previewClass}\n tabIndex={0}\n />\n </section>\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]\">\n <Button intent=\"ghost\" startIcon={<X />} onClick={context.onClose}>\n {t('helpMeWriteTemplates.bar.discard')}\n </Button>\n <Button\n intent=\"ghost\"\n startIcon={<RotateCcw />}\n onClick={() => {\n setDraft(null);\n run();\n }}\n >\n {t('helpMeWriteTemplates.bar.retry')}\n </Button>\n <span className=\"ds:flex-1\" aria-hidden=\"true\" />\n <Button intent=\"primary\" onClick={insert}>\n {context.scope === 'selection'\n ? t('helpMeWriteTemplates.bar.replace')\n : t('helpMeWriteTemplates.bar.insert')}\n </Button>\n </div>\n </>\n );\n } else {\n // While dictating the field shows the committed prompt plus live interim\n // text, read-only so the stream is not fought over by typing.\n const fieldValue = isDictating ? joinWith(prompt, interim) : prompt;\n body = (\n <>\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-sm)]\">\n <IconButton\n size=\"md\"\n intent=\"outline\"\n className={ACTION_SIZE}\n icon={<X />}\n aria-label={t('helpMeWriteTemplates.bar.close')}\n onClick={context.onClose}\n />\n <div className=\"ds:min-w-0 ds:flex-1\">\n <TextArea\n size=\"md\"\n value={fieldValue}\n onChange={(event) => setPrompt(event.target.value)}\n placeholder={t('editor.ai.promptPlaceholder')}\n aria-label={t('editor.ai.promptLabel')}\n autoResize\n minRows={1}\n maxRows={3}\n readOnly={loading || isDictating}\n tone={errored ? 'error' : 'default'}\n aria-describedby={errored ? errorId : undefined}\n />\n </div>\n {onDictate ? (\n <IconButton\n size=\"md\"\n intent=\"outline\"\n className={\n isDictating ? `${ACTION_SIZE} ${RECORDING_MIC}` : ACTION_SIZE\n }\n icon={\n isDictating ? <Square className=\"ds:fill-current\" /> : <Mic />\n }\n aria-pressed={isDictating}\n aria-label={\n isDictating\n ? t('helpMeWriteTemplates.bar.dictateStop')\n : t('helpMeWriteTemplates.bar.dictateStart')\n }\n disabled={loading}\n onClick={toggleDictation}\n />\n ) : null}\n <IconButton\n size=\"md\"\n intent=\"primary\"\n className={BRAND_ACTION}\n icon={loading ? <Spinner size=\"sm\" variant=\"pulse\" /> : <Send />}\n disabled={loading || !prompt.trim()}\n aria-busy={loading || undefined}\n aria-label={t('helpMeWriteTemplates.bar.write')}\n onClick={run}\n />\n </div>\n {onDictate ? (\n <p className=\"ds:sr-only\" role=\"status\" aria-live=\"polite\">\n {announcement}\n </p>\n ) : null}\n {errored ? (\n <p id={errorId} role=\"alert\" className={metaClass}>\n {t('helpMeWriteTemplates.bar.error')}\n </p>\n ) : null}\n <p className={metaClass}>\n {context.scope === 'selection'\n ? t('helpMeWriteTemplates.bar.contextSelection')\n : t('helpMeWriteTemplates.bar.contextDocument')}{' '}\n {context.privacyNotice}\n </p>\n </>\n );\n }\n\n return (\n <EditorOverlay\n open={open}\n onClose={close}\n ariaLabel={t('editor.ai.helpMeWrite')}\n >\n <div className=\"ds:contents\" data-component=\"help-me-write-templates-bar\">\n {body}\n </div>\n </EditorOverlay>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* AiTemplateManager */\n/* ------------------------------------------------------------------ */\n\n/* The kit's list-reorder idiom (Sidebar favourites, anamnesis): HTML5 drag\n on the row, a grip handle that also moves with Alt+Arrow / Alt+Home /\n Alt+End, and a polite announcement of every move. Rows are keyed, so the\n moved row's handle keeps focus. */\nconst reorderRowClass = cva('', {\n variants: {\n dragging: { true: 'ds:opacity-60', false: '' },\n dropTarget: {\n true: 'ds:outline-[length:var(--focus-ring-width)] ds:outline-dashed ds:outline-[var(--primary)] ds:outline-offset-[-2px]',\n false: '',\n },\n },\n defaultVariants: { dragging: false, dropTarget: false },\n});\n\nfunction useReorder(\n templates: AiTemplate[],\n onReorder: ((orderedIds: string[]) => void | Promise<void>) | undefined,\n) {\n const { t } = useTranslation();\n const [dragSource, setDragSource] = useState<number | null>(null);\n const [dropTarget, setDropTarget] = useState<number | null>(null);\n const [message, setMessage] = useState('');\n // Toggle an invisible suffix so a repeated move is announced again.\n const toggle = useRef(false);\n\n const move = (from: number, to: number): void => {\n const target = Math.max(0, Math.min(templates.length - 1, to));\n if (!onReorder || target === from) return;\n const ids = templates.map((tpl) => tpl.id);\n const [moved] = ids.splice(from, 1);\n ids.splice(target, 0, moved);\n void onReorder(ids);\n toggle.current = !toggle.current;\n const text = t('helpMeWriteTemplates.manager.reorderAnnounce', {\n label: templates[from].name,\n to: target + 1,\n total: templates.length,\n });\n setMessage(toggle.current ? text : `${text}\\u200b`);\n };\n\n const rowProps = (index: number) =>\n onReorder\n ? {\n draggable: true as const,\n onDragStart: (event: DragEvent<HTMLElement>) => {\n setDragSource(index);\n event.dataTransfer.effectAllowed = 'move';\n // Firefox needs data to start a drag.\n event.dataTransfer.setData('text/plain', String(index));\n },\n onDragEnd: () => {\n setDragSource(null);\n setDropTarget(null);\n },\n onDragOver: (event: DragEvent<HTMLElement>) => {\n if (dragSource === null) return;\n event.preventDefault();\n event.dataTransfer.dropEffect = 'move';\n setDropTarget(index);\n },\n onDragLeave: () => setDropTarget(null),\n onDrop: (event: DragEvent<HTMLElement>) => {\n event.preventDefault();\n const source = dragSource;\n setDragSource(null);\n setDropTarget(null);\n if (source !== null) move(source, index);\n },\n }\n : {};\n\n const rowClass = (index: number): string =>\n reorderRowClass({\n dragging: dragSource === index,\n dropTarget: dropTarget === index && dragSource !== index,\n });\n\n const handle = (index: number, name: string): ReactNode => (\n <IconButton\n size=\"sm\"\n intent=\"ghost\"\n icon={<GripVertical aria-hidden=\"true\" />}\n aria-label={t('helpMeWriteTemplates.manager.reorderHandle', {\n label: name,\n })}\n className=\"ds:cursor-grab ds:active:cursor-grabbing\"\n onKeyDown={(event: KeyboardEvent<HTMLButtonElement>) => {\n if (!event.altKey) return;\n const to =\n event.key === 'ArrowUp'\n ? index - 1\n : event.key === 'ArrowDown'\n ? index + 1\n : event.key === 'Home'\n ? 0\n : event.key === 'End'\n ? templates.length - 1\n : null;\n if (to === null) return;\n event.preventDefault();\n move(index, to);\n }}\n />\n );\n\n const liveRegion = (\n <span role=\"status\" aria-live=\"polite\" className=\"ds:sr-only\">\n {message}\n </span>\n );\n\n return { rowProps, rowClass, handle, liveRegion };\n}\n\nexport interface AiTemplateManagerProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** Open on the list (default) or straight on a new-template form. */\n initialMode?: 'list' | 'create';\n templates: AiTemplate[];\n /** Persist a new (no `id`) or edited template. A rejection keeps the form open. */\n onSaveTemplate: (draft: AiTemplateDraft) => void | Promise<void>;\n /** Omit to hide Delete. */\n onDeleteTemplate?: (id: string) => void | Promise<void>;\n /**\n * Persist a new order (every template id, first to last): the order of\n * the Templates menu. Omit to hide the drag handles.\n */\n onReorderTemplates?: (orderedIds: string[]) => void | Promise<void>;\n}\n\ninterface FormState {\n id?: string;\n name: string;\n description: string;\n prompt: string;\n submitted: boolean;\n}\n\nconst EMPTY_FORM: FormState = {\n name: '',\n description: '',\n prompt: '',\n submitted: false,\n};\n\n/** List, create, edit and delete the practice's templates. */\nexport function AiTemplateManager({\n open,\n onOpenChange,\n initialMode = 'list',\n templates,\n onSaveTemplate,\n onDeleteTemplate,\n onReorderTemplates,\n}: AiTemplateManagerProps): React.JSX.Element {\n const { t } = useTranslation();\n const reorder = useReorder(templates, onReorderTemplates);\n const [form, setForm] = useState<FormState | null>(null);\n const [saving, setSaving] = useState(false);\n const [saveFailed, setSaveFailed] = useState(false);\n const [pendingDelete, setPendingDelete] = useState<AiTemplate | null>(null);\n const [deleting, setDeleting] = useState(false);\n const [deleteFailed, setDeleteFailed] = useState(false);\n\n // Wait for the host: the confirmation stays open (busy) until the delete\n // settles, and shows an error if it fails.\n const confirmDelete = async () => {\n if (!pendingDelete || deleting) return;\n setDeleting(true);\n setDeleteFailed(false);\n try {\n await onDeleteTemplate?.(pendingDelete.id);\n setPendingDelete(null);\n } catch {\n setDeleteFailed(true);\n } finally {\n setDeleting(false);\n }\n };\n\n useEffect(() => {\n if (open) {\n setSaveFailed(false);\n setForm(initialMode === 'create' ? { ...EMPTY_FORM } : null);\n }\n // Only when it opens; `templates` changing mid-edit keeps the form.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n const nameTaken = (name: string, id?: string): boolean =>\n templates.some(\n (tpl) => tpl.id !== id && tpl.name.toLowerCase() === name.toLowerCase(),\n );\n\n const nameError = (() => {\n if (!form?.submitted) return undefined;\n const name = form.name.trim();\n if (!name) return t('helpMeWriteTemplates.manager.nameRequired');\n return nameTaken(name, form.id)\n ? t('helpMeWriteTemplates.manager.nameTaken')\n : undefined;\n })();\n const promptError =\n form?.submitted && !form.prompt.trim()\n ? t('helpMeWriteTemplates.manager.promptRequired')\n : undefined;\n\n const save = async () => {\n if (!form || saving) return;\n const next = { ...form, submitted: true };\n setForm(next);\n const name = next.name.trim();\n const prompt = next.prompt.trim();\n if (!name || !prompt || nameTaken(name, next.id)) return;\n setSaving(true);\n setSaveFailed(false);\n try {\n await onSaveTemplate({\n id: next.id,\n name,\n description: next.description.trim() || undefined,\n prompt,\n });\n setForm(null);\n } catch {\n setSaveFailed(true);\n } finally {\n setSaving(false);\n }\n };\n\n const title = form\n ? form.id\n ? t('helpMeWriteTemplates.manager.formEdit')\n : t('helpMeWriteTemplates.manager.formNew')\n : t('helpMeWriteTemplates.manager.title');\n\n return (\n <>\n <Dialog open={open} onOpenChange={onOpenChange}>\n <Dialog.Content size=\"lg\">\n <div className=\"ds:contents\" data-component=\"ai-template-manager\">\n <Dialog.Header>\n <Dialog.Title>{title}</Dialog.Title>\n <Dialog.Description>\n {t('helpMeWriteTemplates.manager.description')}\n </Dialog.Description>\n </Dialog.Header>\n <Dialog.Body>\n {form ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\">\n {saveFailed ? (\n <Alert variant=\"error\">\n {t('helpMeWriteTemplates.manager.saveError')}\n </Alert>\n ) : null}\n <FormField\n label={t('helpMeWriteTemplates.manager.name')}\n error={nameError}\n required\n >\n <TextInput\n value={form.name}\n maxLength={100}\n placeholder={t(\n 'helpMeWriteTemplates.manager.namePlaceholder',\n )}\n onChange={(event) =>\n setForm({ ...form, name: event.target.value })\n }\n />\n </FormField>\n <FormField\n label={t('helpMeWriteTemplates.manager.descLabel')}\n description={t('helpMeWriteTemplates.manager.descHint')}\n optional\n >\n <TextInput\n value={form.description}\n maxLength={120}\n onChange={(event) =>\n setForm({ ...form, description: event.target.value })\n }\n />\n </FormField>\n <FormField\n label={t('helpMeWriteTemplates.manager.prompt')}\n description={t(\n 'helpMeWriteTemplates.manager.promptDescription',\n )}\n error={promptError}\n required\n >\n <TextArea\n value={form.prompt}\n maxLength={4000}\n autoResize\n minRows={4}\n maxRows={10}\n onChange={(event) =>\n setForm({ ...form, prompt: event.target.value })\n }\n />\n </FormField>\n </div>\n ) : templates.length === 0 ? (\n <EmptyState\n variant=\"first-use\"\n size=\"sm\"\n title={t('helpMeWriteTemplates.manager.emptyTitle')}\n description={t(\n 'helpMeWriteTemplates.manager.emptyDescription',\n )}\n primaryAction={{\n label: t('helpMeWriteTemplates.manager.new'),\n onClick: () => setForm({ ...EMPTY_FORM }),\n }}\n />\n ) : (\n <ul\n aria-label={t('helpMeWriteTemplates.manager.listLabel')}\n className=\"ds:m-0 ds:flex ds:list-none ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-0\"\n >\n {templates.map((tpl, index) => (\n <li\n key={tpl.id}\n {...reorder.rowProps(index)}\n className={`ds:flex ds:items-start ds:gap-[var(--spacing-sm)] ds:rounded-[var(--radius-md)] ds:border ds:border-[color:var(--border)] ds:p-[var(--spacing-sm)] ${reorder.rowClass(index)}`}\n >\n {onReorderTemplates\n ? reorder.handle(index, tpl.name)\n : null}\n <div className=\"ds:flex ds:min-w-0 ds:flex-1 ds:flex-col ds:gap-[var(--spacing-2xs)]\">\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-xs)]\">\n <span className=\"type-title-item ds:text-[color:var(--foreground)]\">\n {tpl.name}\n </span>\n </div>\n <p className={`${metaClass} ds:line-clamp-2`}>\n {tpl.description || tpl.prompt}\n </p>\n </div>\n <IconButton\n size=\"sm\"\n intent=\"ghost\"\n icon={<Pencil />}\n aria-label={t('helpMeWriteTemplates.manager.edit', {\n name: tpl.name,\n })}\n onClick={() =>\n setForm({\n id: tpl.id,\n name: tpl.name,\n description: tpl.description ?? '',\n prompt: tpl.prompt,\n submitted: false,\n })\n }\n />\n {onDeleteTemplate ? (\n <IconButton\n size=\"sm\"\n intent=\"ghost\"\n icon={<Trash2 />}\n aria-label={t('helpMeWriteTemplates.manager.delete', {\n name: tpl.name,\n })}\n onClick={() => setPendingDelete(tpl)}\n />\n ) : null}\n </li>\n ))}\n </ul>\n )}\n {reorder.liveRegion}\n </Dialog.Body>\n <Dialog.Footer>\n {form ? (\n <>\n <Button intent=\"secondary\" onClick={() => setForm(null)}>\n {t('helpMeWriteTemplates.manager.cancel')}\n </Button>\n <Button\n intent=\"primary\"\n loading={saving}\n onClick={() => void save()}\n >\n {t('helpMeWriteTemplates.manager.save')}\n </Button>\n </>\n ) : (\n <>\n {templates.length > 0 ? (\n <Button\n intent=\"outline\"\n startIcon={<Plus />}\n onClick={() => setForm({ ...EMPTY_FORM })}\n >\n {t('helpMeWriteTemplates.manager.new')}\n </Button>\n ) : null}\n <Dialog.Close asChild>\n <Button intent=\"primary\">\n {t('helpMeWriteTemplates.manager.done')}\n </Button>\n </Dialog.Close>\n </>\n )}\n </Dialog.Footer>\n </div>\n </Dialog.Content>\n </Dialog>\n <Dialog\n open={pendingDelete != null}\n onOpenChange={(next) => {\n if (!next && !deleting) {\n setPendingDelete(null);\n setDeleteFailed(false);\n }\n }}\n >\n <Dialog.Content size=\"sm\" variant=\"alert\">\n <Dialog.Header>\n <Dialog.Title>\n {t('helpMeWriteTemplates.manager.deleteTitle', {\n name: pendingDelete?.name ?? '',\n })}\n </Dialog.Title>\n <Dialog.Description>\n {t('helpMeWriteTemplates.manager.deleteDescription')}\n </Dialog.Description>\n </Dialog.Header>\n {deleteFailed ? (\n <Dialog.Body>\n <Alert variant=\"error\">\n {t('helpMeWriteTemplates.manager.deleteError')}\n </Alert>\n </Dialog.Body>\n ) : null}\n <Dialog.Footer>\n <Dialog.Close asChild>\n <Button intent=\"secondary\" disabled={deleting}>\n {t('helpMeWriteTemplates.manager.cancel')}\n </Button>\n </Dialog.Close>\n <Button\n intent=\"destructive\"\n loading={deleting}\n onClick={() => void confirmDelete()}\n >\n {t('helpMeWriteTemplates.manager.deleteConfirm')}\n </Button>\n </Dialog.Footer>\n </Dialog.Content>\n </Dialog>\n </>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* HelpMeWriteUndoNotice */\n/* ------------------------------------------------------------------ */\n\nexport interface HelpMeWriteUndoNoticeProps {\n /** The change to offer Undo for; `null` hides the notice. */\n applied: HelpMeWriteApplied | null;\n onUndo: () => void;\n onDismiss: () => void;\n}\n\n/** \"Note rewritten with …\" plus Undo; takes focus when it appears. */\nexport function HelpMeWriteUndoNotice({\n applied,\n onUndo,\n onDismiss,\n}: HelpMeWriteUndoNoticeProps): React.JSX.Element | null {\n const { t } = useTranslation();\n const undoRef = useRef<HTMLButtonElement>(null);\n useEffect(() => {\n if (applied) undoRef.current?.focus();\n }, [applied]);\n if (!applied?.template) return null;\n const name = applied.template.name;\n return (\n <Alert\n variant=\"success\"\n dismissible\n onOpenChange={(isOpen) => {\n if (!isOpen) onDismiss();\n }}\n data-component=\"help-me-write-undo-notice\"\n >\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]\">\n <span>\n {applied.mode === 'below'\n ? t('helpMeWriteTemplates.undo.addedBelow', { name })\n : t('helpMeWriteTemplates.undo.replaced', { name })}\n </span>\n <Button ref={undoRef} intent=\"outline\" size=\"sm\" onClick={onUndo}>\n {t('helpMeWriteTemplates.undo.undo')}\n </Button>\n </div>\n </Alert>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* useHelpMeWriteTemplates — the whole thing in one call */\n/* ------------------------------------------------------------------ */\n\nexport interface UseHelpMeWriteTemplatesOptions {\n templates: AiTemplate[];\n /** The AI call, for both templates (from the pill) and the free prompt. */\n onGenerate: HelpMeWriteTemplatesBarProps['onGenerate'];\n /** Enables the manager (create / edit). Omit for read-only template users. */\n onSaveTemplate?: AiTemplateManagerProps['onSaveTemplate'];\n /** Enables Delete in the manager. */\n onDeleteTemplate?: AiTemplateManagerProps['onDeleteTemplate'];\n /** Enables drag-and-drop reordering in the manager (the menu order). */\n onReorderTemplates?: AiTemplateManagerProps['onReorderTemplates'];\n credits?: AiCreditsInfo;\n /** Mic in the bar's prompt when the editor has `onDictate`. Default true. */\n enableDictation?: boolean;\n /** Also told about every applied draft (e.g. for analytics). */\n onApplied?: (applied: HelpMeWriteApplied) => void;\n}\n\n/** The `RichTextEditor` props the hook drives; spread them on the editor. */\nexport interface HelpMeWriteTemplatesEditorProps {\n renderHelpMeWrite: (context: HelpMeWriteRenderContext) => ReactNode;\n aiTemplates: RichTextEditorAiTemplates;\n onAiApplied: (applied: RichTextEditorAiApplied) => void;\n}\n\nexport interface UseHelpMeWriteTemplatesResult extends HelpMeWriteTemplatesEditorProps {\n /** All three editor props at once: `<RichTextEditor {...hmw.editorProps} />`. */\n editorProps: HelpMeWriteTemplatesEditorProps;\n /** Mount once, anywhere (a portalled dialog); `null` without `onSaveTemplate`. */\n manager: ReactNode;\n /** Place where the Undo notice should show, e.g. above the editor. */\n undoNotice: ReactNode;\n openManager: (mode?: 'list' | 'create') => void;\n}\n\n/**\n * Wires templates, the Help-me-write bar, the manager and Undo into the\n * editor. Templates run from the editor's AI pill and selection bubble;\n * the bar is the free prompt. Usage:\n *\n * const hmw = useHelpMeWriteTemplates({ templates, onGenerate, onSaveTemplate });\n * {hmw.undoNotice}\n * <RichTextEditor {...hmw.editorProps} … />\n * {hmw.manager}\n */\nexport function useHelpMeWriteTemplates({\n templates,\n onGenerate,\n onSaveTemplate,\n onDeleteTemplate,\n onReorderTemplates,\n credits,\n enableDictation,\n onApplied,\n}: UseHelpMeWriteTemplatesOptions): UseHelpMeWriteTemplatesResult {\n const [manager, setManager] = useState<{\n open: boolean;\n mode: 'list' | 'create';\n }>({ open: false, mode: 'list' });\n const [applied, setApplied] = useState<HelpMeWriteApplied | null>(null);\n const openManager = useCallback(\n (mode: 'list' | 'create' = 'list') => setManager({ open: true, mode }),\n [],\n );\n\n const renderHelpMeWrite = useCallback(\n (context: HelpMeWriteRenderContext): ReactNode => (\n <HelpMeWriteTemplatesBar\n context={context}\n onGenerate={onGenerate}\n credits={credits}\n enableDictation={enableDictation}\n suspendClose={manager.open}\n onApplied={onApplied}\n />\n ),\n [onGenerate, credits, enableDictation, manager.open, onApplied],\n );\n\n // The editor runs templates; the host's full template (with its prompt)\n // goes to `onGenerate`, looked up by id.\n const aiTemplates = useMemo<RichTextEditorAiTemplates>(() => {\n const byId = new Map(templates.map((tpl) => [tpl.id, tpl]));\n return {\n templates,\n onRun: ({ template, text, scope, signal }): Promise<string> => {\n const full = byId.get(template.id);\n if (!full) return Promise.reject(new Error('Unknown template'));\n return onGenerate({\n template: full,\n prompt: '',\n sourceText: text,\n scope,\n signal,\n });\n },\n onManage: onSaveTemplate ? openManager : undefined,\n };\n }, [templates, onGenerate, onSaveTemplate, openManager]);\n\n const onAiApplied = useCallback(\n (event: RichTextEditorAiApplied): void => {\n if (event.action !== 'template' || !event.template) return;\n const template = templates.find((tpl) => tpl.id === event.template?.id);\n const change: HelpMeWriteApplied = {\n mode: 'replace',\n template,\n previousHtml: event.previousHtml,\n undo: event.undo,\n };\n setApplied(template ? change : null);\n onApplied?.(change);\n },\n [templates, onApplied],\n );\n\n const managerNode = useMemo(\n () =>\n onSaveTemplate ? (\n <AiTemplateManager\n open={manager.open}\n initialMode={manager.mode}\n onOpenChange={(isOpen) => setManager((m) => ({ ...m, open: isOpen }))}\n templates={templates}\n onSaveTemplate={onSaveTemplate}\n onDeleteTemplate={onDeleteTemplate}\n onReorderTemplates={onReorderTemplates}\n />\n ) : null,\n [manager, templates, onSaveTemplate, onDeleteTemplate, onReorderTemplates],\n );\n\n const undoNotice = (\n <HelpMeWriteUndoNotice\n applied={applied}\n onUndo={() => {\n applied?.undo();\n setApplied(null);\n }}\n onDismiss={() => setApplied(null)}\n />\n );\n\n const editorProps = useMemo<HelpMeWriteTemplatesEditorProps>(\n () => ({ renderHelpMeWrite, aiTemplates, onAiApplied }),\n [renderHelpMeWrite, aiTemplates, onAiApplied],\n );\n\n return {\n ...editorProps,\n editorProps,\n manager: managerNode,\n undoNotice,\n openManager,\n };\n}\n"],"names":["AiCreditsExhaustedError","message","ACTION_SIZE","BRAND_ACTION","RECORDING_MIC","metaClass","eyebrowClass","previewClass","joinWith","base","extra","isAbort","err","AiCreditsExhaustedNotice","credits","onBack","t","i18n","useTranslation","limit","remaining","remainingText","resetsOn","jsxs","Alert","Astroid","jsx","Progress","Button","TrendingUp","ArrowLeft","HelpMeWriteTemplatesBar","context","onGenerate","onApplied","enableDictation","suspendClose","open","draftId","useId","errorId","prompt","setPrompt","useState","loading","setLoading","errored","setErrored","outOfCredits","setOutOfCredits","draft","setDraft","abortRef","useRef","onDictate","isDictating","setIsDictating","interim","setInterim","announcement","setAnnouncement","dictateAbortRef","stopDictation","useCallback","_a","toggleDictation","controller","text","trimmed","p","useEffect","_b","run","onSelection","result","contextClose","close","insert","previousHtml","setContent","body","Fragment","SafeHtml","X","RotateCcw","fieldValue","IconButton","TextArea","event","Square","Mic","Spinner","Send","EditorOverlay","reorderRowClass","cva","useReorder","templates","onReorder","dragSource","setDragSource","dropTarget","setDropTarget","setMessage","toggle","move","from","to","target","ids","tpl","moved","index","source","name","GripVertical","EMPTY_FORM","AiTemplateManager","onOpenChange","initialMode","onSaveTemplate","onDeleteTemplate","onReorderTemplates","reorder","form","setForm","saving","setSaving","saveFailed","setSaveFailed","pendingDelete","setPendingDelete","deleting","setDeleting","deleteFailed","setDeleteFailed","confirmDelete","nameTaken","id","nameError","promptError","save","next","title","Dialog","FormField","TextInput","EmptyState","Pencil","Trash2","Plus","HelpMeWriteUndoNotice","applied","onUndo","onDismiss","undoRef","isOpen","useHelpMeWriteTemplates","manager","setManager","setApplied","openManager","mode","renderHelpMeWrite","aiTemplates","useMemo","byId","template","scope","signal","full","onAiApplied","change","managerNode","m","undoNotice","editorProps"],"mappings":"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"}
|