@particle-academy/react-fancy 6.9.0 → 6.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +1 -0
  3. package/dist/autocomplete.cjs +3 -3
  4. package/dist/autocomplete.js +2 -2
  5. package/dist/{chunk-ZUJVGHFW.js → chunk-24RWB7Q3.js} +3 -3
  6. package/dist/{chunk-ZUJVGHFW.js.map → chunk-24RWB7Q3.js.map} +1 -1
  7. package/dist/{chunk-GEQKNV7E.js → chunk-26GRLVCQ.js} +17 -13
  8. package/dist/chunk-26GRLVCQ.js.map +1 -0
  9. package/dist/{chunk-GODJVIIO.js → chunk-3W6BKQVZ.js} +4 -4
  10. package/dist/{chunk-GODJVIIO.js.map → chunk-3W6BKQVZ.js.map} +1 -1
  11. package/dist/{chunk-AZ5DWOQY.cjs → chunk-6B43ARGW.cjs} +4 -4
  12. package/dist/{chunk-AZ5DWOQY.cjs.map → chunk-6B43ARGW.cjs.map} +1 -1
  13. package/dist/{chunk-Q62RDKRA.cjs → chunk-7N7XVBH7.cjs} +6 -6
  14. package/dist/{chunk-Q62RDKRA.cjs.map → chunk-7N7XVBH7.cjs.map} +1 -1
  15. package/dist/{chunk-VGUAIFGE.js → chunk-C2VGO375.js} +3 -3
  16. package/dist/{chunk-VGUAIFGE.js.map → chunk-C2VGO375.js.map} +1 -1
  17. package/dist/{chunk-H7OTLGRD.cjs → chunk-DQWAG7YY.cjs} +4 -4
  18. package/dist/{chunk-H7OTLGRD.cjs.map → chunk-DQWAG7YY.cjs.map} +1 -1
  19. package/dist/{chunk-3KJN3GTB.cjs → chunk-EDIB6V6Y.cjs} +4 -4
  20. package/dist/{chunk-3KJN3GTB.cjs.map → chunk-EDIB6V6Y.cjs.map} +1 -1
  21. package/dist/{chunk-G5MDMQVQ.cjs → chunk-EEFU5BVM.cjs} +6 -6
  22. package/dist/{chunk-G5MDMQVQ.cjs.map → chunk-EEFU5BVM.cjs.map} +1 -1
  23. package/dist/{chunk-IYG436ZY.js → chunk-EW2N52FD.js} +3 -3
  24. package/dist/{chunk-IYG436ZY.js.map → chunk-EW2N52FD.js.map} +1 -1
  25. package/dist/{chunk-RSB2P3JK.js → chunk-FECD3WKN.js} +3 -3
  26. package/dist/{chunk-RSB2P3JK.js.map → chunk-FECD3WKN.js.map} +1 -1
  27. package/dist/{chunk-6RXEWM3V.js → chunk-FNHKZMMI.js} +3 -3
  28. package/dist/{chunk-6RXEWM3V.js.map → chunk-FNHKZMMI.js.map} +1 -1
  29. package/dist/{chunk-M5ER3Y5I.cjs → chunk-FR3V5IAJ.cjs} +4 -4
  30. package/dist/{chunk-M5ER3Y5I.cjs.map → chunk-FR3V5IAJ.cjs.map} +1 -1
  31. package/dist/{chunk-DXLPBLNC.cjs → chunk-FSLEFL4U.cjs} +4 -4
  32. package/dist/{chunk-DXLPBLNC.cjs.map → chunk-FSLEFL4U.cjs.map} +1 -1
  33. package/dist/{chunk-FQCLJZZS.js → chunk-FX37P4KR.js} +3 -3
  34. package/dist/{chunk-FQCLJZZS.js.map → chunk-FX37P4KR.js.map} +1 -1
  35. package/dist/{chunk-HANQYZW2.cjs → chunk-GB2EGMVQ.cjs} +16 -12
  36. package/dist/chunk-GB2EGMVQ.cjs.map +1 -0
  37. package/dist/{chunk-DW2PHLOA.js → chunk-H5LJFN7D.js} +3 -3
  38. package/dist/{chunk-DW2PHLOA.js.map → chunk-H5LJFN7D.js.map} +1 -1
  39. package/dist/{chunk-F3U4AVGF.js → chunk-HCIEXBEB.js} +3 -3
  40. package/dist/{chunk-F3U4AVGF.js.map → chunk-HCIEXBEB.js.map} +1 -1
  41. package/dist/{chunk-QAM6N3VG.cjs → chunk-HEGM5LMZ.cjs} +4 -4
  42. package/dist/{chunk-QAM6N3VG.cjs.map → chunk-HEGM5LMZ.cjs.map} +1 -1
  43. package/dist/chunk-HHCVBIMM.js +21 -0
  44. package/dist/chunk-HHCVBIMM.js.map +1 -0
  45. package/dist/{chunk-KAKKZDCE.js → chunk-J57JSHDC.js} +3 -3
  46. package/dist/{chunk-KAKKZDCE.js.map → chunk-J57JSHDC.js.map} +1 -1
  47. package/dist/{chunk-ZBXJDQXN.js → chunk-JJYMRV62.js} +17 -13
  48. package/dist/chunk-JJYMRV62.js.map +1 -0
  49. package/dist/{chunk-6BCXGP2T.js → chunk-JN5DHZ6I.js} +3 -3
  50. package/dist/{chunk-6BCXGP2T.js.map → chunk-JN5DHZ6I.js.map} +1 -1
  51. package/dist/{chunk-R6O6SLXK.js → chunk-LG2O26CG.js} +13 -8
  52. package/dist/chunk-LG2O26CG.js.map +1 -0
  53. package/dist/chunk-LJCQI6ZS.js +1212 -0
  54. package/dist/chunk-LJCQI6ZS.js.map +1 -0
  55. package/dist/{chunk-JV2HEOCB.cjs → chunk-MAY4NMRI.cjs} +4 -4
  56. package/dist/{chunk-JV2HEOCB.cjs.map → chunk-MAY4NMRI.cjs.map} +1 -1
  57. package/dist/{chunk-BQENLOEV.js → chunk-MD7HUHJB.js} +4 -4
  58. package/dist/{chunk-BQENLOEV.js.map → chunk-MD7HUHJB.js.map} +1 -1
  59. package/dist/{chunk-5U2DZ7AV.js → chunk-MUV7OK3W.js} +8 -6
  60. package/dist/chunk-MUV7OK3W.js.map +1 -0
  61. package/dist/{chunk-EC4ZYZNK.cjs → chunk-NFUKNVB7.cjs} +13 -8
  62. package/dist/chunk-NFUKNVB7.cjs.map +1 -0
  63. package/dist/{chunk-QUZOGRZS.js → chunk-OE4AIUAN.js} +3 -3
  64. package/dist/{chunk-QUZOGRZS.js.map → chunk-OE4AIUAN.js.map} +1 -1
  65. package/dist/chunk-OP7A4SZZ.cjs +1216 -0
  66. package/dist/chunk-OP7A4SZZ.cjs.map +1 -0
  67. package/dist/{chunk-YBBBX5H2.cjs → chunk-OUPHLIXV.cjs} +11 -11
  68. package/dist/{chunk-YBBBX5H2.cjs.map → chunk-OUPHLIXV.cjs.map} +1 -1
  69. package/dist/{chunk-XGGAAG74.cjs → chunk-QQKWI7QP.cjs} +7 -3
  70. package/dist/chunk-QQKWI7QP.cjs.map +1 -0
  71. package/dist/{chunk-XT4WBBCD.cjs → chunk-R4SANV3G.cjs} +11 -11
  72. package/dist/{chunk-XT4WBBCD.cjs.map → chunk-R4SANV3G.cjs.map} +1 -1
  73. package/dist/chunk-RE3PMG47.cjs +23 -0
  74. package/dist/chunk-RE3PMG47.cjs.map +1 -0
  75. package/dist/{chunk-GJWNZMJT.js → chunk-RUEDMYBF.js} +7 -3
  76. package/dist/chunk-RUEDMYBF.js.map +1 -0
  77. package/dist/{chunk-UORN3Z7R.cjs → chunk-TBLKVTJC.cjs} +6 -6
  78. package/dist/{chunk-UORN3Z7R.cjs.map → chunk-TBLKVTJC.cjs.map} +1 -1
  79. package/dist/{chunk-7NRG77U5.cjs → chunk-TXQT6S4D.cjs} +16 -12
  80. package/dist/chunk-TXQT6S4D.cjs.map +1 -0
  81. package/dist/{chunk-TXTRTTG7.cjs → chunk-UOG3O3KP.cjs} +8 -6
  82. package/dist/chunk-UOG3O3KP.cjs.map +1 -0
  83. package/dist/{chunk-L5NDZEL6.cjs → chunk-ZFXCZ2QO.cjs} +9 -9
  84. package/dist/{chunk-L5NDZEL6.cjs.map → chunk-ZFXCZ2QO.cjs.map} +1 -1
  85. package/dist/command.cjs +5 -4
  86. package/dist/command.js +3 -2
  87. package/dist/composer.cjs +6 -6
  88. package/dist/composer.js +4 -4
  89. package/dist/drawer.cjs +5 -4
  90. package/dist/drawer.d.cts +8 -1
  91. package/dist/drawer.d.ts +8 -1
  92. package/dist/drawer.js +3 -2
  93. package/dist/dropdown.cjs +4 -4
  94. package/dist/dropdown.js +2 -2
  95. package/dist/editor.cjs +2 -2
  96. package/dist/editor.js +2 -2
  97. package/dist/index.cjs +111 -97
  98. package/dist/index.cjs.map +1 -1
  99. package/dist/index.d.cts +13 -1
  100. package/dist/index.d.ts +13 -1
  101. package/dist/index.js +27 -25
  102. package/dist/index.js.map +1 -1
  103. package/dist/input.cjs +5 -5
  104. package/dist/input.js +4 -4
  105. package/dist/inputs.cjs +19 -19
  106. package/dist/inputs.js +8 -8
  107. package/dist/json-editor.cjs +17 -17
  108. package/dist/json-editor.js +6 -6
  109. package/dist/mobile-menu.cjs +2 -2
  110. package/dist/mobile-menu.js +2 -2
  111. package/dist/modal.cjs +5 -4
  112. package/dist/modal.d.cts +11 -1
  113. package/dist/modal.d.ts +11 -1
  114. package/dist/modal.js +3 -2
  115. package/dist/number-field.cjs +6 -6
  116. package/dist/number-field.js +5 -5
  117. package/dist/paste-pills.cjs +16 -16
  118. package/dist/paste-pills.js +3 -3
  119. package/dist/phone-input.cjs +39 -0
  120. package/dist/phone-input.cjs.map +1 -0
  121. package/dist/phone-input.d.cts +139 -0
  122. package/dist/phone-input.d.ts +139 -0
  123. package/dist/phone-input.js +22 -0
  124. package/dist/phone-input.js.map +1 -0
  125. package/dist/popover.cjs +4 -4
  126. package/dist/popover.js +2 -2
  127. package/dist/prompt-input.cjs +8 -8
  128. package/dist/prompt-input.js +5 -5
  129. package/dist/reason-tag.cjs +4 -4
  130. package/dist/reason-tag.js +3 -3
  131. package/dist/select.cjs +3 -3
  132. package/dist/select.js +2 -2
  133. package/dist/sidebar.cjs +6 -6
  134. package/dist/sidebar.js +4 -4
  135. package/dist/tooltip.cjs +3 -3
  136. package/dist/tooltip.js +2 -2
  137. package/docs/PhoneInput.md +104 -0
  138. package/package.json +11 -1
  139. package/dist/chunk-5U2DZ7AV.js.map +0 -1
  140. package/dist/chunk-7NRG77U5.cjs.map +0 -1
  141. package/dist/chunk-EC4ZYZNK.cjs.map +0 -1
  142. package/dist/chunk-GEQKNV7E.js.map +0 -1
  143. package/dist/chunk-GJWNZMJT.js.map +0 -1
  144. package/dist/chunk-HANQYZW2.cjs.map +0 -1
  145. package/dist/chunk-R6O6SLXK.js.map +0 -1
  146. package/dist/chunk-TXTRTTG7.cjs.map +0 -1
  147. package/dist/chunk-XGGAAG74.cjs.map +0 -1
  148. package/dist/chunk-ZBXJDQXN.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Composer/Composer.tsx"],"names":["forwardRef","Composer","useControllableState","useRef","useInlinePaste","useMemo","useCallback","useAcknowledgedSubmit","isImeComposing","jsxs","cn","jsx","paste","withSeparators","endsOf","Fragment","InlinePasteEditor","PastedFilesInput","visuallyHidden"],"mappings":"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","file":"chunk-L5NDZEL6.cjs","sourcesContent":["import { forwardRef, useCallback, useMemo, useRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { isImeComposing } from \"../../utils/ime\";\nimport { visuallyHidden } from \"../../utils/visually-hidden\";\nimport { useAcknowledgedSubmit } from \"../../hooks/use-acknowledged-submit\";\nimport { useControllableState } from \"../../hooks/use-controllable-state\";\nimport {\n endsOf,\n InlinePasteEditor,\n PastedFilesInput,\n useInlinePaste,\n withSeparators,\n type HeldImage,\n type HeldPaste,\n type InlinePasteEditorHandle,\n} from \"../PastePills\";\nimport type { ComposerProps } from \"./Composer.types\";\n\n/** Characters of a held paste shown at each end of the hover preview, unless `previewChars` says otherwise. */\nconst PREVIEW_CHARS = 20;\n\nexport const Composer = forwardRef<HTMLDivElement, ComposerProps>(\n function Composer(\n {\n value: controlledValue,\n defaultValue = \"\",\n onChange,\n onSubmit,\n onSubmitError,\n placeholder = \"Type a message...\",\n actions,\n disabled = false,\n sendDisabled = false,\n name,\n inputId,\n className,\n pasteThreshold,\n pastePlacement = \"above\",\n pasteImages = false,\n previewChars = PREVIEW_CHARS,\n renderPastePreview,\n classNames,\n heldPastes: controlledHeldPastes,\n onHeldPastesChange,\n heldImages: controlledHeldImages,\n onHeldImagesChange,\n pasteFilesName,\n },\n ref,\n ) {\n const inline = pastePlacement === \"inline\";\n const [value, setValue] = useControllableState(\n controlledValue,\n defaultValue,\n onChange,\n );\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const editorRef = useRef<InlinePasteEditorHandle>(null);\n /*\n * The holding logic lives in `usePastePills`, wrapped by `useInlinePaste` for\n * the inline placement — which `PromptInput` shares, so the two components\n * cannot disagree about what a pill means. The rule that must not drift is\n * the one below: a send with pills still closed carries the text.\n */\n const paste = useInlinePaste({\n pasteThreshold,\n pasteImages,\n previewChars,\n renderPastePreview,\n classNames,\n disabled,\n heldPastes: controlledHeldPastes,\n onHeldPastesChange,\n heldImages: controlledHeldImages,\n onHeldImagesChange,\n editorRef,\n });\n const pills = paste.pills;\n const heldPastes = paste.heldPastes;\n const pastedFiles = useMemo(\n () => (inline && pasteImages ? paste.imagesIn(value).map((i) => i.file) : []),\n [inline, pasteImages, paste, value],\n );\n\n const handlePaste = useCallback(\n (e: React.ClipboardEvent<HTMLTextAreaElement>) => {\n // Composable by design, so this reads as a question rather than a handover.\n // Nothing else here wants the paste, so the answer is simply ignored.\n pills.handlePaste(e);\n },\n [pills],\n );\n\n const handleInlineChange = useCallback(\n (next: string) => {\n setValue(next);\n paste.prune(next);\n },\n [setValue, paste],\n );\n\n /** Everything the person believes they are sending, in the order they built it. */\n const composeOutgoing = useCallback(() => {\n if (inline) return paste.expand(value);\n\n return [value, ...heldPastes.map((p) => p.text)].filter(Boolean).join(\"\\n\\n\");\n }, [inline, value, heldPastes, paste]);\n\n const hasContent = value.trim().length > 0 || (!inline && heldPastes.length > 0);\n\n const focusInput = useCallback(() => {\n if (inline) editorRef.current?.focus();\n else textareaRef.current?.focus();\n }, [inline]);\n\n const ack = useAcknowledgedSubmit(onSubmitError);\n const submitting = ack.status === \"submitting\";\n\n /*\n * The draft's REVISION: bumped by every render in which the text, a held\n * paste or a held image differs from the last one seen — the person typing\n * or pasting, or a host moving a controlled `value` / `heldPastes` /\n * `heldImages`. An acknowledged send clears only if the revision is still\n * the one it sent. Comparing content instead (5.70.0) threw away newer\n * drafts that happened to compare equal: an edit typed and undone, a pill\n * whose text the host changed under the same id.\n */\n const heldImages = paste.heldImages;\n const revisionRef = useRef(0);\n const seenRef = useRef({ value, heldPastes, heldImages });\n const seen = seenRef.current;\n if (seen.value !== value || seen.heldPastes !== heldPastes || seen.heldImages !== heldImages) {\n if (\n seen.value !== value ||\n !samePastes(seen.heldPastes, heldPastes) ||\n !sameImages(seen.heldImages, heldImages)\n ) {\n revisionRef.current += 1;\n }\n seenRef.current = { value, heldPastes, heldImages };\n }\n\n const handleSubmit = useCallback(() => {\n if (!hasContent || disabled || sendDisabled || ack.busy()) return;\n\n /*\n * THE DANGEROUS STATE, and the reason this feature needed a spec rather than\n * a guess. A pill reads as \"your paste is attached\" — so a send that drops it\n * means asking a question about a document without the document, and nobody\n * can tell: the sender believes it went, the receiver sees a question about\n * nothing.\n *\n * Above the input, held pastes go out in arrival order after what was typed,\n * because people type the question BEFORE pasting the thing it is about.\n * Inline, every pill goes out exactly where it sits.\n */\n const images = inline ? paste.imagesIn(value) : [];\n\n const result = onSubmit?.(composeOutgoing(), { images });\n const sent = revisionRef.current;\n ack.track(result, () => {\n /*\n * A void `onSubmit` reaches here synchronously, so `sent` is still the\n * current revision and this clears exactly as it always has. An async one\n * reaches here when it resolves: if anything changed the message while it\n * was in flight, that message is newer than the send, even if it reads the\n * same, and throwing it away is the one outcome nobody can undo. So only\n * the revision that was sent is cleared.\n */\n if (revisionRef.current !== sent) return;\n setValue(\"\");\n paste.clear();\n });\n // Focus goes back to the text at once, as before: it stays editable while\n // a send is in flight, and the send button the person may have clicked is\n // about to be disabled.\n focusInput();\n }, [hasContent, disabled, sendDisabled, ack, value, inline, paste, onSubmit, composeOutgoing, setValue, focusInput]);\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n // Enter that confirms an IME composition finishes a word; it is not a send.\n if (e.key === \"Enter\" && !e.shiftKey && !isImeComposing(e)) {\n e.preventDefault();\n handleSubmit();\n }\n };\n\n /** Above the input: click a pill to dump it in, APPENDED to what is already typed. */\n const insertPaste = useCallback(\n (held: HeldPaste) => {\n // `expand` removes it and hands back the text; inserting is this\n // component's job because the hook owns no DOM.\n const text = pills.expand(held.id);\n\n if (text === undefined) return;\n\n setValue((current) => (current ? `${current}\\n\\n${text}` : text));\n textareaRef.current?.focus();\n },\n [pills, setValue],\n );\n\n return (\n <div\n data-react-fancy-composer=\"\"\n // Absent while idle; \"submitting\" while an onSubmit Promise is pending;\n // \"error\" after one was refused, until the next send.\n data-submit-state={ack.status === \"idle\" ? undefined : ack.status}\n ref={ref}\n className={cn(\n \"rounded-xl border border-[color:var(--fancy-border,var(--color-zinc-200))] bg-[color:var(--fancy-surface,var(--color-white))] dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\",\n disabled && \"opacity-50\",\n className,\n )}\n >\n {!inline && heldPastes.length > 0 && (\n <div\n data-react-fancy-composer-paste-pills=\"\"\n className=\"flex flex-wrap gap-1.5 px-3 pt-3\"\n >\n {heldPastes.map((paste) => (\n // `group` + `group-hover` rather than hover state: the preview is\n // presentation, and a useState for it would be one more thing an\n // agent could desynchronise.\n <span key={paste.id} className=\"group relative inline-flex\">\n <button\n type=\"button\"\n data-react-fancy-composer-paste-pill={paste.id}\n onClick={() => insertPaste(paste)}\n disabled={disabled}\n // No `title`. A native tooltip plus the hover preview below\n // renders TWO tooltips on the same hover, at different delays.\n // The label says what clicking does; the preview says what the\n // text is, and it is linked rather than merely adjacent so a\n // screen reader reaches it too.\n aria-label={`Insert this pasted text, ${withSeparators(paste.text.length)} characters`}\n aria-describedby={`${paste.id}-preview`}\n // `pr-7` leaves room for the absolutely-positioned × that sits\n // over this button's right edge. With a smaller right padding the\n // × lands on top of the label.\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-full border border-[color:var(--fancy-border,var(--color-zinc-200))] bg-zinc-50 py-1 ps-2.5 pe-7 text-xs text-zinc-700 transition-colors hover:bg-zinc-100 dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:bg-zinc-800 dark:text-zinc-200 dark:hover:bg-zinc-700\",\n classNames?.pill,\n classNames?.textPill,\n )}\n >\n <span>\n Pasted text · {withSeparators(paste.text.length)} characters\n </span>\n </button>\n\n <button\n type=\"button\"\n data-react-fancy-composer-paste-pill-remove={paste.id}\n onClick={() => pills.remove(paste.id)}\n disabled={disabled}\n aria-label=\"Discard this pasted text\"\n className={cn(\n \"absolute end-1 top-1/2 -translate-y-1/2 rounded-full px-1 text-xs text-zinc-400 transition-colors hover:text-zinc-700 dark:hover:text-zinc-100\",\n classNames?.remove,\n )}\n >\n ×\n </button>\n\n <span\n id={`${paste.id}-preview`}\n data-react-fancy-composer-paste-pill-preview={paste.id}\n role=\"tooltip\"\n className={cn(\n \"pointer-events-none absolute bottom-full start-0 z-10 mb-1 hidden max-w-xs whitespace-pre-wrap break-all rounded-md bg-zinc-900 px-2 py-1 text-xs text-white group-hover:block dark:bg-zinc-100 dark:text-zinc-900\",\n classNames?.preview,\n )}\n >\n {renderPastePreview?.({ kind: \"text\", paste }) ??\n endsOf(paste.text, previewChars)}\n </span>\n </span>\n ))}\n </div>\n )}\n\n {inline ? (\n <>\n <InlinePasteEditor\n ref={editorRef}\n value={value}\n known={paste.known}\n onChange={handleInlineChange}\n onSubmit={handleSubmit}\n onPaste={paste.decidePaste}\n onHostsChange={paste.onHostsChange}\n placeholder={placeholder}\n disabled={disabled}\n id={inputId}\n className={classNames?.input}\n />\n {paste.portals}\n {/* A contenteditable is no form field, so `name` rides on a hidden\n one carrying what a send would carry: the expanded text. */}\n {name && <input type=\"hidden\" name={name} value={composeOutgoing()} />}\n {pasteImages && pasteFilesName && (\n <PastedFilesInput name={pasteFilesName} files={pastedFiles} />\n )}\n </>\n ) : (\n <textarea\n ref={textareaRef}\n // Its own handle, NOT the inline editor's `data-react-fancy-composer-input`:\n // that one already means \"the contenteditable is on\", and a host that\n // tests for it to pick a write path must not be handed a textarea.\n data-react-fancy-composer-textarea=\"\"\n id={inputId}\n name={name}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n placeholder={placeholder}\n disabled={disabled}\n rows={3}\n className={cn(\n \"w-full resize-none bg-transparent px-4 pt-3 text-sm outline-none placeholder:text-zinc-400\",\n classNames?.input,\n )}\n />\n )}\n <div className=\"relative flex items-center justify-between border-t border-zinc-100 px-3 py-2 dark:border-zinc-800\">\n <div className=\"flex items-center gap-1\">{actions}</div>\n {ack.status === \"error\" && (\n // Mounted with its text, as `role=\"alert\"` is announced on insertion.\n <div\n role=\"alert\"\n data-react-fancy-composer-error=\"\"\n className=\"sr-only\"\n style={visuallyHidden}\n >\n {ack.message}\n </div>\n )}\n <button\n type=\"button\"\n data-react-fancy-composer-send=\"\"\n onClick={handleSubmit}\n disabled={disabled || sendDisabled || submitting || !hasContent}\n aria-busy={submitting || undefined}\n className=\"rounded-lg bg-zinc-900 px-3 py-1.5 text-sm font-medium text-white transition-colors hover:bg-zinc-800 disabled:opacity-50 dark:bg-white dark:text-zinc-900 dark:hover:bg-zinc-100\"\n >\n Send\n </button>\n </div>\n </div>\n );\n },\n);\n\nComposer.displayName = \"Composer\";\n\n/** Same pills, same content: a host echoing a copy of what it was told is not a new revision. */\nfunction samePastes(a: HeldPaste[], b: HeldPaste[]): boolean {\n return (\n a.length === b.length &&\n a.every((p, i) => p.id === b[i]!.id && p.text === b[i]!.text && p.label === b[i]!.label)\n );\n}\n\nfunction sameImages(a: HeldImage[], b: HeldImage[]): boolean {\n return (\n a.length === b.length &&\n a.every((img, i) => img.id === b[i]!.id && img.label === b[i]!.label && img.file === b[i]!.file)\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/Composer/Composer.tsx"],"names":["forwardRef","Composer","useControllableState","useRef","useInlinePaste","useMemo","useCallback","useAcknowledgedSubmit","isImeComposing","jsxs","cn","jsx","paste","withSeparators","endsOf","Fragment","InlinePasteEditor","PastedFilesInput","visuallyHidden"],"mappings":"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","file":"chunk-ZFXCZ2QO.cjs","sourcesContent":["import { forwardRef, useCallback, useMemo, useRef } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { isImeComposing } from \"../../utils/ime\";\nimport { visuallyHidden } from \"../../utils/visually-hidden\";\nimport { useAcknowledgedSubmit } from \"../../hooks/use-acknowledged-submit\";\nimport { useControllableState } from \"../../hooks/use-controllable-state\";\nimport {\n endsOf,\n InlinePasteEditor,\n PastedFilesInput,\n useInlinePaste,\n withSeparators,\n type HeldImage,\n type HeldPaste,\n type InlinePasteEditorHandle,\n} from \"../PastePills\";\nimport type { ComposerProps } from \"./Composer.types\";\n\n/** Characters of a held paste shown at each end of the hover preview, unless `previewChars` says otherwise. */\nconst PREVIEW_CHARS = 20;\n\nexport const Composer = forwardRef<HTMLDivElement, ComposerProps>(\n function Composer(\n {\n value: controlledValue,\n defaultValue = \"\",\n onChange,\n onSubmit,\n onSubmitError,\n placeholder = \"Type a message...\",\n actions,\n disabled = false,\n sendDisabled = false,\n name,\n inputId,\n className,\n pasteThreshold,\n pastePlacement = \"above\",\n pasteImages = false,\n previewChars = PREVIEW_CHARS,\n renderPastePreview,\n classNames,\n heldPastes: controlledHeldPastes,\n onHeldPastesChange,\n heldImages: controlledHeldImages,\n onHeldImagesChange,\n pasteFilesName,\n },\n ref,\n ) {\n const inline = pastePlacement === \"inline\";\n const [value, setValue] = useControllableState(\n controlledValue,\n defaultValue,\n onChange,\n );\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const editorRef = useRef<InlinePasteEditorHandle>(null);\n /*\n * The holding logic lives in `usePastePills`, wrapped by `useInlinePaste` for\n * the inline placement — which `PromptInput` shares, so the two components\n * cannot disagree about what a pill means. The rule that must not drift is\n * the one below: a send with pills still closed carries the text.\n */\n const paste = useInlinePaste({\n pasteThreshold,\n pasteImages,\n previewChars,\n renderPastePreview,\n classNames,\n disabled,\n heldPastes: controlledHeldPastes,\n onHeldPastesChange,\n heldImages: controlledHeldImages,\n onHeldImagesChange,\n editorRef,\n });\n const pills = paste.pills;\n const heldPastes = paste.heldPastes;\n const pastedFiles = useMemo(\n () => (inline && pasteImages ? paste.imagesIn(value).map((i) => i.file) : []),\n [inline, pasteImages, paste, value],\n );\n\n const handlePaste = useCallback(\n (e: React.ClipboardEvent<HTMLTextAreaElement>) => {\n // Composable by design, so this reads as a question rather than a handover.\n // Nothing else here wants the paste, so the answer is simply ignored.\n pills.handlePaste(e);\n },\n [pills],\n );\n\n const handleInlineChange = useCallback(\n (next: string) => {\n setValue(next);\n paste.prune(next);\n },\n [setValue, paste],\n );\n\n /** Everything the person believes they are sending, in the order they built it. */\n const composeOutgoing = useCallback(() => {\n if (inline) return paste.expand(value);\n\n return [value, ...heldPastes.map((p) => p.text)].filter(Boolean).join(\"\\n\\n\");\n }, [inline, value, heldPastes, paste]);\n\n const hasContent = value.trim().length > 0 || (!inline && heldPastes.length > 0);\n\n const focusInput = useCallback(() => {\n if (inline) editorRef.current?.focus();\n else textareaRef.current?.focus();\n }, [inline]);\n\n const ack = useAcknowledgedSubmit(onSubmitError);\n const submitting = ack.status === \"submitting\";\n\n /*\n * The draft's REVISION: bumped by every render in which the text, a held\n * paste or a held image differs from the last one seen — the person typing\n * or pasting, or a host moving a controlled `value` / `heldPastes` /\n * `heldImages`. An acknowledged send clears only if the revision is still\n * the one it sent. Comparing content instead (5.70.0) threw away newer\n * drafts that happened to compare equal: an edit typed and undone, a pill\n * whose text the host changed under the same id.\n */\n const heldImages = paste.heldImages;\n const revisionRef = useRef(0);\n const seenRef = useRef({ value, heldPastes, heldImages });\n const seen = seenRef.current;\n if (seen.value !== value || seen.heldPastes !== heldPastes || seen.heldImages !== heldImages) {\n if (\n seen.value !== value ||\n !samePastes(seen.heldPastes, heldPastes) ||\n !sameImages(seen.heldImages, heldImages)\n ) {\n revisionRef.current += 1;\n }\n seenRef.current = { value, heldPastes, heldImages };\n }\n\n const handleSubmit = useCallback(() => {\n if (!hasContent || disabled || sendDisabled || ack.busy()) return;\n\n /*\n * THE DANGEROUS STATE, and the reason this feature needed a spec rather than\n * a guess. A pill reads as \"your paste is attached\" — so a send that drops it\n * means asking a question about a document without the document, and nobody\n * can tell: the sender believes it went, the receiver sees a question about\n * nothing.\n *\n * Above the input, held pastes go out in arrival order after what was typed,\n * because people type the question BEFORE pasting the thing it is about.\n * Inline, every pill goes out exactly where it sits.\n */\n const images = inline ? paste.imagesIn(value) : [];\n\n const result = onSubmit?.(composeOutgoing(), { images });\n const sent = revisionRef.current;\n ack.track(result, () => {\n /*\n * A void `onSubmit` reaches here synchronously, so `sent` is still the\n * current revision and this clears exactly as it always has. An async one\n * reaches here when it resolves: if anything changed the message while it\n * was in flight, that message is newer than the send, even if it reads the\n * same, and throwing it away is the one outcome nobody can undo. So only\n * the revision that was sent is cleared.\n */\n if (revisionRef.current !== sent) return;\n setValue(\"\");\n paste.clear();\n });\n // Focus goes back to the text at once, as before: it stays editable while\n // a send is in flight, and the send button the person may have clicked is\n // about to be disabled.\n focusInput();\n }, [hasContent, disabled, sendDisabled, ack, value, inline, paste, onSubmit, composeOutgoing, setValue, focusInput]);\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n // Enter that confirms an IME composition finishes a word; it is not a send.\n if (e.key === \"Enter\" && !e.shiftKey && !isImeComposing(e)) {\n e.preventDefault();\n handleSubmit();\n }\n };\n\n /** Above the input: click a pill to dump it in, APPENDED to what is already typed. */\n const insertPaste = useCallback(\n (held: HeldPaste) => {\n // `expand` removes it and hands back the text; inserting is this\n // component's job because the hook owns no DOM.\n const text = pills.expand(held.id);\n\n if (text === undefined) return;\n\n setValue((current) => (current ? `${current}\\n\\n${text}` : text));\n textareaRef.current?.focus();\n },\n [pills, setValue],\n );\n\n return (\n <div\n data-react-fancy-composer=\"\"\n // Absent while idle; \"submitting\" while an onSubmit Promise is pending;\n // \"error\" after one was refused, until the next send.\n data-submit-state={ack.status === \"idle\" ? undefined : ack.status}\n ref={ref}\n className={cn(\n \"rounded-xl border border-[color:var(--fancy-border,var(--color-zinc-200))] bg-[color:var(--fancy-surface,var(--color-white))] dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:bg-[color:var(--fancy-surface-dark,var(--color-zinc-900))]\",\n disabled && \"opacity-50\",\n className,\n )}\n >\n {!inline && heldPastes.length > 0 && (\n <div\n data-react-fancy-composer-paste-pills=\"\"\n className=\"flex flex-wrap gap-1.5 px-3 pt-3\"\n >\n {heldPastes.map((paste) => (\n // `group` + `group-hover` rather than hover state: the preview is\n // presentation, and a useState for it would be one more thing an\n // agent could desynchronise.\n <span key={paste.id} className=\"group relative inline-flex\">\n <button\n type=\"button\"\n data-react-fancy-composer-paste-pill={paste.id}\n onClick={() => insertPaste(paste)}\n disabled={disabled}\n // No `title`. A native tooltip plus the hover preview below\n // renders TWO tooltips on the same hover, at different delays.\n // The label says what clicking does; the preview says what the\n // text is, and it is linked rather than merely adjacent so a\n // screen reader reaches it too.\n aria-label={`Insert this pasted text, ${withSeparators(paste.text.length)} characters`}\n aria-describedby={`${paste.id}-preview`}\n // `pr-7` leaves room for the absolutely-positioned × that sits\n // over this button's right edge. With a smaller right padding the\n // × lands on top of the label.\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-full border border-[color:var(--fancy-border,var(--color-zinc-200))] bg-zinc-50 py-1 ps-2.5 pe-7 text-xs text-zinc-700 transition-colors hover:bg-zinc-100 dark:border-[color:var(--fancy-border-dark,var(--color-zinc-700))] dark:bg-zinc-800 dark:text-zinc-200 dark:hover:bg-zinc-700\",\n classNames?.pill,\n classNames?.textPill,\n )}\n >\n <span>\n Pasted text · {withSeparators(paste.text.length)} characters\n </span>\n </button>\n\n <button\n type=\"button\"\n data-react-fancy-composer-paste-pill-remove={paste.id}\n onClick={() => pills.remove(paste.id)}\n disabled={disabled}\n aria-label=\"Discard this pasted text\"\n className={cn(\n \"absolute end-1 top-1/2 -translate-y-1/2 rounded-full px-1 text-xs text-zinc-400 transition-colors hover:text-zinc-700 dark:hover:text-zinc-100\",\n classNames?.remove,\n )}\n >\n ×\n </button>\n\n <span\n id={`${paste.id}-preview`}\n data-react-fancy-composer-paste-pill-preview={paste.id}\n role=\"tooltip\"\n className={cn(\n \"pointer-events-none absolute bottom-full start-0 z-10 mb-1 hidden max-w-xs whitespace-pre-wrap break-all rounded-md bg-zinc-900 px-2 py-1 text-xs text-white group-hover:block dark:bg-zinc-100 dark:text-zinc-900\",\n classNames?.preview,\n )}\n >\n {renderPastePreview?.({ kind: \"text\", paste }) ??\n endsOf(paste.text, previewChars)}\n </span>\n </span>\n ))}\n </div>\n )}\n\n {inline ? (\n <>\n <InlinePasteEditor\n ref={editorRef}\n value={value}\n known={paste.known}\n onChange={handleInlineChange}\n onSubmit={handleSubmit}\n onPaste={paste.decidePaste}\n onHostsChange={paste.onHostsChange}\n placeholder={placeholder}\n disabled={disabled}\n id={inputId}\n className={classNames?.input}\n />\n {paste.portals}\n {/* A contenteditable is no form field, so `name` rides on a hidden\n one carrying what a send would carry: the expanded text. */}\n {name && <input type=\"hidden\" name={name} value={composeOutgoing()} />}\n {pasteImages && pasteFilesName && (\n <PastedFilesInput name={pasteFilesName} files={pastedFiles} />\n )}\n </>\n ) : (\n <textarea\n ref={textareaRef}\n // Its own handle, NOT the inline editor's `data-react-fancy-composer-input`:\n // that one already means \"the contenteditable is on\", and a host that\n // tests for it to pick a write path must not be handed a textarea.\n data-react-fancy-composer-textarea=\"\"\n id={inputId}\n name={name}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n placeholder={placeholder}\n disabled={disabled}\n rows={3}\n className={cn(\n \"w-full resize-none bg-transparent px-4 pt-3 text-sm outline-none placeholder:text-zinc-400\",\n classNames?.input,\n )}\n />\n )}\n <div className=\"relative flex items-center justify-between border-t border-zinc-100 px-3 py-2 dark:border-zinc-800\">\n <div className=\"flex items-center gap-1\">{actions}</div>\n {ack.status === \"error\" && (\n // Mounted with its text, as `role=\"alert\"` is announced on insertion.\n <div\n role=\"alert\"\n data-react-fancy-composer-error=\"\"\n className=\"sr-only\"\n style={visuallyHidden}\n >\n {ack.message}\n </div>\n )}\n <button\n type=\"button\"\n data-react-fancy-composer-send=\"\"\n onClick={handleSubmit}\n disabled={disabled || sendDisabled || submitting || !hasContent}\n aria-busy={submitting || undefined}\n className=\"rounded-lg bg-zinc-900 px-3 py-1.5 text-sm font-medium text-white transition-colors hover:bg-zinc-800 disabled:opacity-50 dark:bg-white dark:text-zinc-900 dark:hover:bg-zinc-100\"\n >\n Send\n </button>\n </div>\n </div>\n );\n },\n);\n\nComposer.displayName = \"Composer\";\n\n/** Same pills, same content: a host echoing a copy of what it was told is not a new revision. */\nfunction samePastes(a: HeldPaste[], b: HeldPaste[]): boolean {\n return (\n a.length === b.length &&\n a.every((p, i) => p.id === b[i]!.id && p.text === b[i]!.text && p.label === b[i]!.label)\n );\n}\n\nfunction sameImages(a: HeldImage[], b: HeldImage[]): boolean {\n return (\n a.length === b.length &&\n a.every((img, i) => img.id === b[i]!.id && img.label === b[i]!.label && img.file === b[i]!.file)\n );\n}\n"]}
package/dist/command.cjs CHANGED
@@ -1,7 +1,8 @@
1
1
  'use strict';
2
2
 
3
- var chunkEC4ZYZNK_cjs = require('./chunk-EC4ZYZNK.cjs');
4
- require('./chunk-TXTRTTG7.cjs');
3
+ var chunkNFUKNVB7_cjs = require('./chunk-NFUKNVB7.cjs');
4
+ require('./chunk-RE3PMG47.cjs');
5
+ require('./chunk-UOG3O3KP.cjs');
5
6
  require('./chunk-FQZE5N2N.cjs');
6
7
  require('./chunk-6V44RRSB.cjs');
7
8
  require('./chunk-MKHYENKR.cjs');
@@ -14,11 +15,11 @@ require('./chunk-ZU5Q77OT.cjs');
14
15
 
15
16
  Object.defineProperty(exports, "Command", {
16
17
  enumerable: true,
17
- get: function () { return chunkEC4ZYZNK_cjs.Command; }
18
+ get: function () { return chunkNFUKNVB7_cjs.Command; }
18
19
  });
19
20
  Object.defineProperty(exports, "useCommand", {
20
21
  enumerable: true,
21
- get: function () { return chunkEC4ZYZNK_cjs.useCommand; }
22
+ get: function () { return chunkNFUKNVB7_cjs.useCommand; }
22
23
  });
23
24
  //# sourceMappingURL=command.cjs.map
24
25
  //# sourceMappingURL=command.cjs.map
package/dist/command.js CHANGED
@@ -1,5 +1,6 @@
1
- export { Command, useCommand } from './chunk-R6O6SLXK.js';
2
- import './chunk-5U2DZ7AV.js';
1
+ export { Command, useCommand } from './chunk-LG2O26CG.js';
2
+ import './chunk-HHCVBIMM.js';
3
+ import './chunk-MUV7OK3W.js';
3
4
  import './chunk-3K2CEAI7.js';
4
5
  import './chunk-S42OGG43.js';
5
6
  import './chunk-5VMILVWD.js';
package/dist/composer.cjs CHANGED
@@ -1,13 +1,13 @@
1
1
  'use strict';
2
2
 
3
- var chunkL5NDZEL6_cjs = require('./chunk-L5NDZEL6.cjs');
3
+ var chunkZFXCZ2QO_cjs = require('./chunk-ZFXCZ2QO.cjs');
4
4
  require('./chunk-JKD6CFIP.cjs');
5
- var chunkUORN3Z7R_cjs = require('./chunk-UORN3Z7R.cjs');
6
- require('./chunk-JV2HEOCB.cjs');
5
+ var chunkTBLKVTJC_cjs = require('./chunk-TBLKVTJC.cjs');
6
+ require('./chunk-MAY4NMRI.cjs');
7
7
  require('./chunk-2C64OVOZ.cjs');
8
8
  require('./chunk-6V44RRSB.cjs');
9
9
  require('./chunk-MKHYENKR.cjs');
10
- require('./chunk-XGGAAG74.cjs');
10
+ require('./chunk-QQKWI7QP.cjs');
11
11
  require('./chunk-36IC3NDN.cjs');
12
12
  require('./chunk-TI7D4QDM.cjs');
13
13
  require('./chunk-57FQGQJK.cjs');
@@ -19,11 +19,11 @@ require('./chunk-ZU5Q77OT.cjs');
19
19
 
20
20
  Object.defineProperty(exports, "Composer", {
21
21
  enumerable: true,
22
- get: function () { return chunkL5NDZEL6_cjs.Composer; }
22
+ get: function () { return chunkZFXCZ2QO_cjs.Composer; }
23
23
  });
24
24
  Object.defineProperty(exports, "pasteMarker", {
25
25
  enumerable: true,
26
- get: function () { return chunkUORN3Z7R_cjs.pasteMarker; }
26
+ get: function () { return chunkTBLKVTJC_cjs.pasteMarker; }
27
27
  });
28
28
  //# sourceMappingURL=composer.cjs.map
29
29
  //# sourceMappingURL=composer.cjs.map
package/dist/composer.js CHANGED
@@ -1,11 +1,11 @@
1
- export { Composer } from './chunk-KAKKZDCE.js';
1
+ export { Composer } from './chunk-J57JSHDC.js';
2
2
  import './chunk-J6IQHJET.js';
3
- export { pasteMarker } from './chunk-RSB2P3JK.js';
4
- import './chunk-6RXEWM3V.js';
3
+ export { pasteMarker } from './chunk-FECD3WKN.js';
4
+ import './chunk-FNHKZMMI.js';
5
5
  import './chunk-I3LAFKJU.js';
6
6
  import './chunk-S42OGG43.js';
7
7
  import './chunk-5VMILVWD.js';
8
- import './chunk-GJWNZMJT.js';
8
+ import './chunk-RUEDMYBF.js';
9
9
  import './chunk-US5R36TQ.js';
10
10
  import './chunk-RBCMKPBX.js';
11
11
  import './chunk-RGANGU7X.js';
package/dist/drawer.cjs CHANGED
@@ -1,7 +1,8 @@
1
1
  'use strict';
2
2
 
3
- var chunk7NRG77U5_cjs = require('./chunk-7NRG77U5.cjs');
4
- require('./chunk-TXTRTTG7.cjs');
3
+ var chunkTXQT6S4D_cjs = require('./chunk-TXQT6S4D.cjs');
4
+ require('./chunk-RE3PMG47.cjs');
5
+ require('./chunk-UOG3O3KP.cjs');
5
6
  require('./chunk-FQZE5N2N.cjs');
6
7
  require('./chunk-MKHYENKR.cjs');
7
8
  require('./chunk-TI7D4QDM.cjs');
@@ -12,11 +13,11 @@ require('./chunk-ZU5Q77OT.cjs');
12
13
 
13
14
  Object.defineProperty(exports, "Drawer", {
14
15
  enumerable: true,
15
- get: function () { return chunk7NRG77U5_cjs.Drawer; }
16
+ get: function () { return chunkTXQT6S4D_cjs.Drawer; }
16
17
  });
17
18
  Object.defineProperty(exports, "useDrawer", {
18
19
  enumerable: true,
19
- get: function () { return chunk7NRG77U5_cjs.useDrawer; }
20
+ get: function () { return chunkTXQT6S4D_cjs.useDrawer; }
20
21
  });
21
22
  //# sourceMappingURL=drawer.cjs.map
22
23
  //# sourceMappingURL=drawer.cjs.map
package/dist/drawer.d.cts CHANGED
@@ -55,6 +55,8 @@ interface DrawerHeaderProps {
55
55
  /** Show the close button. Default `true`. */
56
56
  closable?: boolean;
57
57
  className?: string;
58
+ /** Accessible name of the close button. Default `"Close"`; pass your locale's word. */
59
+ closeLabel?: string;
58
60
  }
59
61
  interface DrawerBodyProps {
60
62
  children: ReactNode;
@@ -69,7 +71,12 @@ interface DrawerContainerProps extends HTMLAttributes<HTMLDivElement> {
69
71
  className?: string;
70
72
  }
71
73
 
72
- declare function DrawerHeader({ children, closable, className }: DrawerHeaderProps): react.JSX.Element;
74
+ /**
75
+ * The close button draws at 26px (18px icon + `p-1`) and HITS at 44px (WCAG
76
+ * 2.5.5, AAA): a `::before` overhangs it by 9px, inside the header's `py-3`. The
77
+ * look is unchanged; see ModalHeader for why this over a size option.
78
+ */
79
+ declare function DrawerHeader({ children, closable, className, closeLabel }: DrawerHeaderProps): react.JSX.Element;
73
80
  declare namespace DrawerHeader {
74
81
  var displayName: string;
75
82
  }
package/dist/drawer.d.ts CHANGED
@@ -55,6 +55,8 @@ interface DrawerHeaderProps {
55
55
  /** Show the close button. Default `true`. */
56
56
  closable?: boolean;
57
57
  className?: string;
58
+ /** Accessible name of the close button. Default `"Close"`; pass your locale's word. */
59
+ closeLabel?: string;
58
60
  }
59
61
  interface DrawerBodyProps {
60
62
  children: ReactNode;
@@ -69,7 +71,12 @@ interface DrawerContainerProps extends HTMLAttributes<HTMLDivElement> {
69
71
  className?: string;
70
72
  }
71
73
 
72
- declare function DrawerHeader({ children, closable, className }: DrawerHeaderProps): react.JSX.Element;
74
+ /**
75
+ * The close button draws at 26px (18px icon + `p-1`) and HITS at 44px (WCAG
76
+ * 2.5.5, AAA): a `::before` overhangs it by 9px, inside the header's `py-3`. The
77
+ * look is unchanged; see ModalHeader for why this over a size option.
78
+ */
79
+ declare function DrawerHeader({ children, closable, className, closeLabel }: DrawerHeaderProps): react.JSX.Element;
73
80
  declare namespace DrawerHeader {
74
81
  var displayName: string;
75
82
  }
package/dist/drawer.js CHANGED
@@ -1,5 +1,6 @@
1
- export { Drawer, useDrawer } from './chunk-ZBXJDQXN.js';
2
- import './chunk-5U2DZ7AV.js';
1
+ export { Drawer, useDrawer } from './chunk-JJYMRV62.js';
2
+ import './chunk-HHCVBIMM.js';
3
+ import './chunk-MUV7OK3W.js';
3
4
  import './chunk-3K2CEAI7.js';
4
5
  import './chunk-5VMILVWD.js';
5
6
  import './chunk-RBCMKPBX.js';
package/dist/dropdown.cjs CHANGED
@@ -1,9 +1,9 @@
1
1
  'use strict';
2
2
 
3
- var chunkQAM6N3VG_cjs = require('./chunk-QAM6N3VG.cjs');
3
+ var chunkHEGM5LMZ_cjs = require('./chunk-HEGM5LMZ.cjs');
4
4
  require('./chunk-FQZE5N2N.cjs');
5
5
  require('./chunk-MKHYENKR.cjs');
6
- require('./chunk-XGGAAG74.cjs');
6
+ require('./chunk-QQKWI7QP.cjs');
7
7
  require('./chunk-36IC3NDN.cjs');
8
8
  require('./chunk-TI7D4QDM.cjs');
9
9
  require('./chunk-57FQGQJK.cjs');
@@ -14,11 +14,11 @@ require('./chunk-ZU5Q77OT.cjs');
14
14
 
15
15
  Object.defineProperty(exports, "Dropdown", {
16
16
  enumerable: true,
17
- get: function () { return chunkQAM6N3VG_cjs.Dropdown; }
17
+ get: function () { return chunkHEGM5LMZ_cjs.Dropdown; }
18
18
  });
19
19
  Object.defineProperty(exports, "useDropdown", {
20
20
  enumerable: true,
21
- get: function () { return chunkQAM6N3VG_cjs.useDropdown; }
21
+ get: function () { return chunkHEGM5LMZ_cjs.useDropdown; }
22
22
  });
23
23
  //# sourceMappingURL=dropdown.cjs.map
24
24
  //# sourceMappingURL=dropdown.cjs.map
package/dist/dropdown.js CHANGED
@@ -1,7 +1,7 @@
1
- export { Dropdown, useDropdown } from './chunk-DW2PHLOA.js';
1
+ export { Dropdown, useDropdown } from './chunk-H5LJFN7D.js';
2
2
  import './chunk-3K2CEAI7.js';
3
3
  import './chunk-5VMILVWD.js';
4
- import './chunk-GJWNZMJT.js';
4
+ import './chunk-RUEDMYBF.js';
5
5
  import './chunk-US5R36TQ.js';
6
6
  import './chunk-RBCMKPBX.js';
7
7
  import './chunk-RGANGU7X.js';
package/dist/editor.cjs CHANGED
@@ -5,7 +5,7 @@ require('./chunk-A2JUTNE6.cjs');
5
5
  require('./chunk-T6YELZPJ.cjs');
6
6
  require('./chunk-VQJ5LJJH.cjs');
7
7
  require('./chunk-4GOOSZEK.cjs');
8
- require('./chunk-TXTRTTG7.cjs');
8
+ require('./chunk-UOG3O3KP.cjs');
9
9
  require('./chunk-FQZE5N2N.cjs');
10
10
  require('./chunk-AIA5UNQ5.cjs');
11
11
  require('./chunk-U4KUW3RK.cjs');
@@ -13,7 +13,7 @@ require('./chunk-WOURDD4U.cjs');
13
13
  require('./chunk-2C64OVOZ.cjs');
14
14
  require('./chunk-INC35VEE.cjs');
15
15
  require('./chunk-5WXY3Q6X.cjs');
16
- require('./chunk-XGGAAG74.cjs');
16
+ require('./chunk-QQKWI7QP.cjs');
17
17
  require('./chunk-36IC3NDN.cjs');
18
18
  require('./chunk-TI7D4QDM.cjs');
19
19
  require('./chunk-L3V3BYVS.cjs');
package/dist/editor.js CHANGED
@@ -3,7 +3,7 @@ import './chunk-2BXMMVQS.js';
3
3
  import './chunk-CPY7NHXM.js';
4
4
  import './chunk-RP43ZFZP.js';
5
5
  import './chunk-ZQ3VXRUY.js';
6
- import './chunk-5U2DZ7AV.js';
6
+ import './chunk-MUV7OK3W.js';
7
7
  import './chunk-3K2CEAI7.js';
8
8
  import './chunk-TJ66S5K6.js';
9
9
  import './chunk-ZL5QVNKG.js';
@@ -11,7 +11,7 @@ import './chunk-7GRIO5AZ.js';
11
11
  import './chunk-I3LAFKJU.js';
12
12
  import './chunk-QSRYTWQN.js';
13
13
  import './chunk-2X54BVXG.js';
14
- import './chunk-GJWNZMJT.js';
14
+ import './chunk-RUEDMYBF.js';
15
15
  import './chunk-US5R36TQ.js';
16
16
  import './chunk-RBCMKPBX.js';
17
17
  import './chunk-NRXK42LO.js';