@mieweb/ui 0.11.0-dev.35 → 0.11.0-dev.37

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 (224) hide show
  1. package/MIGRATION.md +45 -11
  2. package/agent/skills/mieweb-ui-catalog/SKILL.md +5 -3
  3. package/agent/skills/mieweb-ui-catalog/selection-guidance.md +6 -3
  4. package/dist/{EncounterMdyEditor-73PTTIRY.cjs → EncounterMdyEditor-46WMYRFI.cjs} +6 -6
  5. package/dist/{EncounterMdyEditor-73PTTIRY.cjs.map → EncounterMdyEditor-46WMYRFI.cjs.map} +1 -1
  6. package/dist/{EncounterMdyEditor-3SQY4MK2.js → EncounterMdyEditor-L7RBLE7B.js} +3 -3
  7. package/dist/{EncounterMdyEditor-3SQY4MK2.js.map → EncounterMdyEditor-L7RBLE7B.js.map} +1 -1
  8. package/dist/{chunk-4SUEBKTY.js → chunk-2OTPQPJS.js} +52 -44
  9. package/dist/chunk-2OTPQPJS.js.map +1 -0
  10. package/dist/{chunk-MZR634HI.cjs → chunk-3M2BBOXF.cjs} +9 -9
  11. package/dist/{chunk-MZR634HI.cjs.map → chunk-3M2BBOXF.cjs.map} +1 -1
  12. package/dist/{chunk-TUYWCUKH.js → chunk-4LKAZW2W.js} +7 -3
  13. package/dist/chunk-4LKAZW2W.js.map +1 -0
  14. package/dist/{chunk-JEXEFWEM.js → chunk-5WA6IYZD.js} +68 -2
  15. package/dist/chunk-5WA6IYZD.js.map +1 -0
  16. package/dist/{chunk-DXNVQQYN.cjs → chunk-6L7CTEX2.cjs} +51 -44
  17. package/dist/chunk-6L7CTEX2.cjs.map +1 -0
  18. package/dist/{chunk-DT3X3RBM.js → chunk-7U7SONM5.js} +3 -3
  19. package/dist/{chunk-DT3X3RBM.js.map → chunk-7U7SONM5.js.map} +1 -1
  20. package/dist/{chunk-4M2KE4O5.cjs → chunk-AHYDJN4H.cjs} +506 -125
  21. package/dist/chunk-AHYDJN4H.cjs.map +1 -0
  22. package/dist/{chunk-EX7Q5545.js → chunk-AKC677ZF.js} +5 -5
  23. package/dist/{chunk-EX7Q5545.js.map → chunk-AKC677ZF.js.map} +1 -1
  24. package/dist/{chunk-C4GEPUE7.js → chunk-CKECOCYJ.js} +2 -2
  25. package/dist/{chunk-C4GEPUE7.js.map → chunk-CKECOCYJ.js.map} +1 -1
  26. package/dist/{chunk-V5VPECJI.js → chunk-CRR7AE5D.js} +11 -7
  27. package/dist/chunk-CRR7AE5D.js.map +1 -0
  28. package/dist/chunk-D3FNZMOB.cjs +4 -0
  29. package/dist/{chunk-GLXTVCHN.cjs.map → chunk-D3FNZMOB.cjs.map} +1 -1
  30. package/dist/{chunk-ZK2R6UGF.cjs → chunk-DCV34MEF.cjs} +4 -4
  31. package/dist/{chunk-ZK2R6UGF.cjs.map → chunk-DCV34MEF.cjs.map} +1 -1
  32. package/dist/{chunk-XEHD2HA5.cjs → chunk-FRPELUI5.cjs} +3 -3
  33. package/dist/{chunk-XEHD2HA5.cjs.map → chunk-FRPELUI5.cjs.map} +1 -1
  34. package/dist/chunk-G4VQEQGW.js +3 -0
  35. package/dist/{chunk-RISZWWEQ.js.map → chunk-G4VQEQGW.js.map} +1 -1
  36. package/dist/{chunk-3O3Q3DX7.cjs → chunk-GG3IK5TL.cjs} +26 -26
  37. package/dist/{chunk-3O3Q3DX7.cjs.map → chunk-GG3IK5TL.cjs.map} +1 -1
  38. package/dist/{chunk-DGHS5IVD.js → chunk-GJSLKD4Q.js} +3 -3
  39. package/dist/{chunk-DGHS5IVD.js.map → chunk-GJSLKD4Q.js.map} +1 -1
  40. package/dist/{chunk-VMEVLBI3.js → chunk-GKMMDKYY.js} +3 -3
  41. package/dist/{chunk-VMEVLBI3.js.map → chunk-GKMMDKYY.js.map} +1 -1
  42. package/dist/{chunk-46RYJYN2.cjs → chunk-GU6TPVXF.cjs} +6 -6
  43. package/dist/{chunk-46RYJYN2.cjs.map → chunk-GU6TPVXF.cjs.map} +1 -1
  44. package/dist/{chunk-QHCAWDMG.cjs → chunk-HDZQLTBP.cjs} +7 -3
  45. package/dist/chunk-HDZQLTBP.cjs.map +1 -0
  46. package/dist/chunk-IALTKN3Y.js +1017 -0
  47. package/dist/chunk-IALTKN3Y.js.map +1 -0
  48. package/dist/{chunk-33Y3KQWL.js → chunk-IGRHPZOJ.js} +3 -3
  49. package/dist/{chunk-33Y3KQWL.js.map → chunk-IGRHPZOJ.js.map} +1 -1
  50. package/dist/chunk-JCIQIR5V.js +546 -0
  51. package/dist/chunk-JCIQIR5V.js.map +1 -0
  52. package/dist/{chunk-RTADGBBN.js → chunk-JUY2JLFL.js} +502 -121
  53. package/dist/chunk-JUY2JLFL.js.map +1 -0
  54. package/dist/{chunk-2S76TRBJ.cjs → chunk-JUYBJLPI.cjs} +4 -4
  55. package/dist/{chunk-2S76TRBJ.cjs.map → chunk-JUYBJLPI.cjs.map} +1 -1
  56. package/dist/{chunk-UDUYZDTA.js → chunk-JWMMWNTT.js} +3 -3
  57. package/dist/{chunk-UDUYZDTA.js.map → chunk-JWMMWNTT.js.map} +1 -1
  58. package/dist/{chunk-PLBWZW4F.js → chunk-KAQNYX7B.js} +3 -3
  59. package/dist/{chunk-PLBWZW4F.js.map → chunk-KAQNYX7B.js.map} +1 -1
  60. package/dist/{chunk-SPGP252Q.js → chunk-KB2PLV5Q.js} +4 -4
  61. package/dist/{chunk-SPGP252Q.js.map → chunk-KB2PLV5Q.js.map} +1 -1
  62. package/dist/{chunk-NCPDUJKJ.cjs → chunk-KQXD6BFO.cjs} +4 -4
  63. package/dist/{chunk-NCPDUJKJ.cjs.map → chunk-KQXD6BFO.cjs.map} +1 -1
  64. package/dist/{chunk-4VSK3EE5.cjs → chunk-L77XJPKC.cjs} +3 -3
  65. package/dist/{chunk-4VSK3EE5.cjs.map → chunk-L77XJPKC.cjs.map} +1 -1
  66. package/dist/{chunk-PGJLW2NO.cjs → chunk-LLIG4X6M.cjs} +7 -7
  67. package/dist/{chunk-PGJLW2NO.cjs.map → chunk-LLIG4X6M.cjs.map} +1 -1
  68. package/dist/{chunk-YGSPIDE4.js → chunk-LQ22CY7X.js} +5 -5
  69. package/dist/{chunk-YGSPIDE4.js.map → chunk-LQ22CY7X.js.map} +1 -1
  70. package/dist/{chunk-AKMTPCLC.cjs → chunk-LTCHD3K5.cjs} +2 -2
  71. package/dist/{chunk-AKMTPCLC.cjs.map → chunk-LTCHD3K5.cjs.map} +1 -1
  72. package/dist/{chunk-NW6D6AFL.js → chunk-LWLHCUDP.js} +10 -10
  73. package/dist/{chunk-NW6D6AFL.js.map → chunk-LWLHCUDP.js.map} +1 -1
  74. package/dist/{chunk-YR45POH2.js → chunk-MAEANAAJ.js} +3 -3
  75. package/dist/{chunk-YR45POH2.js.map → chunk-MAEANAAJ.js.map} +1 -1
  76. package/dist/{chunk-X5HLVACK.js → chunk-MLCIINXT.js} +4 -4
  77. package/dist/{chunk-X5HLVACK.js.map → chunk-MLCIINXT.js.map} +1 -1
  78. package/dist/{chunk-PHUTJKHL.cjs → chunk-MXIIPFTA.cjs} +3 -3
  79. package/dist/{chunk-PHUTJKHL.cjs.map → chunk-MXIIPFTA.cjs.map} +1 -1
  80. package/dist/{chunk-QO4A6U73.cjs → chunk-NCG7NJAW.cjs} +93 -30
  81. package/dist/chunk-NCG7NJAW.cjs.map +1 -0
  82. package/dist/{chunk-25MPUVTM.js → chunk-NIE3WBJH.js} +94 -31
  83. package/dist/chunk-NIE3WBJH.js.map +1 -0
  84. package/dist/{chunk-4GSFVD5V.js → chunk-NUHHWELE.js} +3 -3
  85. package/dist/{chunk-4GSFVD5V.js.map → chunk-NUHHWELE.js.map} +1 -1
  86. package/dist/{chunk-GDKOYVX3.cjs → chunk-NZUQL42A.cjs} +11 -7
  87. package/dist/chunk-NZUQL42A.cjs.map +1 -0
  88. package/dist/{chunk-YSIFPHLX.js → chunk-OJQMC426.js} +2 -2
  89. package/dist/{chunk-YSIFPHLX.js.map → chunk-OJQMC426.js.map} +1 -1
  90. package/dist/{chunk-SVC7NPQ6.cjs → chunk-PDLVSJMZ.cjs} +6 -6
  91. package/dist/{chunk-SVC7NPQ6.cjs.map → chunk-PDLVSJMZ.cjs.map} +1 -1
  92. package/dist/chunk-QAEAC7HO.cjs +4 -0
  93. package/dist/chunk-QAEAC7HO.cjs.map +1 -0
  94. package/dist/{chunk-KD7YD6US.cjs → chunk-QOQQVNP3.cjs} +2 -2
  95. package/dist/{chunk-KD7YD6US.cjs.map → chunk-QOQQVNP3.cjs.map} +1 -1
  96. package/dist/{chunk-6O6EYKOG.cjs → chunk-R4QWCP2T.cjs} +65 -65
  97. package/dist/{chunk-6O6EYKOG.cjs.map → chunk-R4QWCP2T.cjs.map} +1 -1
  98. package/dist/chunk-RCTIPBLU.cjs +1039 -0
  99. package/dist/chunk-RCTIPBLU.cjs.map +1 -0
  100. package/dist/{chunk-FSWHZY3T.cjs → chunk-RD2I67C4.cjs} +3 -3
  101. package/dist/{chunk-FSWHZY3T.cjs.map → chunk-RD2I67C4.cjs.map} +1 -1
  102. package/dist/chunk-SCGXD334.js +3 -0
  103. package/dist/chunk-SCGXD334.js.map +1 -0
  104. package/dist/{chunk-2OXNJJHJ.cjs → chunk-TERHGQ73.cjs} +3 -3
  105. package/dist/{chunk-2OXNJJHJ.cjs.map → chunk-TERHGQ73.cjs.map} +1 -1
  106. package/dist/chunk-TZKBW4GA.cjs +578 -0
  107. package/dist/chunk-TZKBW4GA.cjs.map +1 -0
  108. package/dist/{chunk-DO7EED3B.cjs → chunk-WZ7WTIVU.cjs} +3 -3
  109. package/dist/{chunk-DO7EED3B.cjs.map → chunk-WZ7WTIVU.cjs.map} +1 -1
  110. package/dist/{chunk-6UYMO3PF.cjs → chunk-XX6PNPF2.cjs} +68 -2
  111. package/dist/chunk-XX6PNPF2.cjs.map +1 -0
  112. package/dist/{chunk-566FIEPE.js → chunk-YFZNSP7F.js} +3 -3
  113. package/dist/{chunk-566FIEPE.js.map → chunk-YFZNSP7F.js.map} +1 -1
  114. package/dist/{chunk-I6Y2KLTZ.js → chunk-ZP4H5HA4.js} +3 -3
  115. package/dist/{chunk-I6Y2KLTZ.js.map → chunk-ZP4H5HA4.js.map} +1 -1
  116. package/dist/components/ActionPlan/index.cjs +1 -1
  117. package/dist/components/ActionPlan/index.js +1 -1
  118. package/dist/components/AlertDialog/index.cjs +7 -7
  119. package/dist/components/AlertDialog/index.js +3 -3
  120. package/dist/components/AudioPlayer/index.cjs +7 -6
  121. package/dist/components/AudioPlayer/index.js +2 -1
  122. package/dist/components/CustomizableDashboard/index.cjs +1 -1
  123. package/dist/components/CustomizableDashboard/index.js +1 -1
  124. package/dist/components/DateInput/index.cjs +3 -3
  125. package/dist/components/DateInput/index.js +2 -2
  126. package/dist/components/EmailEditor/index.cjs +16 -13
  127. package/dist/components/EmailEditor/index.js +7 -4
  128. package/dist/components/KeyboardShortcutsOverlay/index.cjs +5 -5
  129. package/dist/components/KeyboardShortcutsOverlay/index.js +3 -3
  130. package/dist/components/Markdown/index.cjs +10 -10
  131. package/dist/components/Markdown/index.js +2 -2
  132. package/dist/components/MediaEditor/index.cjs +13 -12
  133. package/dist/components/MediaEditor/index.js +8 -7
  134. package/dist/components/MediaFeed/index.cjs +10 -7
  135. package/dist/components/MediaFeed/index.d.cts +33 -0
  136. package/dist/components/MediaFeed/index.d.ts +33 -0
  137. package/dist/components/MediaFeed/index.js +9 -6
  138. package/dist/components/MediaPlayer/index.cjs +13 -6
  139. package/dist/components/MediaPlayer/index.d.cts +103 -5
  140. package/dist/components/MediaPlayer/index.d.ts +103 -5
  141. package/dist/components/MediaPlayer/index.js +6 -3
  142. package/dist/components/Modal/index.cjs +10 -10
  143. package/dist/components/Modal/index.js +2 -2
  144. package/dist/components/RadialExplorer/index.cjs +3 -3
  145. package/dist/components/RadialExplorer/index.js +2 -2
  146. package/dist/components/RecordHeader/index.cjs +4 -4
  147. package/dist/components/RecordHeader/index.js +2 -2
  148. package/dist/components/RecordLayout/index.cjs +1 -1
  149. package/dist/components/RecordLayout/index.js +1 -1
  150. package/dist/components/Sheet/index.cjs +1 -1
  151. package/dist/components/Sheet/index.js +1 -1
  152. package/dist/components/Slider/index.cjs +5 -5
  153. package/dist/components/Slider/index.d.cts +6 -0
  154. package/dist/components/Slider/index.d.ts +6 -0
  155. package/dist/components/Slider/index.js +1 -1
  156. package/dist/components/SliderCalculator/index.cjs +4 -4
  157. package/dist/components/SliderCalculator/index.js +2 -2
  158. package/dist/components/SuperChat/index.cjs +20 -18
  159. package/dist/components/SuperChat/index.cjs.map +1 -1
  160. package/dist/components/SuperChat/index.d.cts +2 -2
  161. package/dist/components/SuperChat/index.d.ts +2 -2
  162. package/dist/components/SuperChat/index.js +12 -10
  163. package/dist/components/SuperChat/index.js.map +1 -1
  164. package/dist/components/SuperChat/plugins/index.cjs +1 -1
  165. package/dist/components/SuperChat/plugins/index.d.cts +2 -2
  166. package/dist/components/SuperChat/plugins/index.d.ts +2 -2
  167. package/dist/components/SuperChat/plugins/index.js +1 -1
  168. package/dist/components/TagEditor/index.cjs +4 -4
  169. package/dist/components/TagEditor/index.js +2 -2
  170. package/dist/components/Textarea/index.cjs +7 -4
  171. package/dist/components/Textarea/index.js +4 -1
  172. package/dist/esheet.cjs +122 -123
  173. package/dist/esheet.cjs.map +1 -1
  174. package/dist/esheet.js +25 -26
  175. package/dist/esheet.js.map +1 -1
  176. package/dist/hooks/index.cjs +17 -17
  177. package/dist/hooks/index.js +4 -4
  178. package/dist/index.cjs +518 -482
  179. package/dist/index.cjs.map +1 -1
  180. package/dist/index.d.cts +204 -98
  181. package/dist/index.d.ts +204 -98
  182. package/dist/index.js +91 -52
  183. package/dist/index.js.map +1 -1
  184. package/dist/kerebron.cjs +32 -62
  185. package/dist/kerebron.cjs.map +1 -1
  186. package/dist/kerebron.css +145 -8
  187. package/dist/kerebron.d.cts +299 -1
  188. package/dist/kerebron.d.ts +299 -1
  189. package/dist/kerebron.js +22 -63
  190. package/dist/kerebron.js.map +1 -1
  191. package/dist/{model-EFXX5JZN.cjs → model-5PB6KNYH.cjs} +20 -20
  192. package/dist/{model-EFXX5JZN.cjs.map → model-5PB6KNYH.cjs.map} +1 -1
  193. package/dist/{model-TAARSYDY.js → model-OGWTZEXR.js} +6 -6
  194. package/dist/{model-TAARSYDY.js.map → model-OGWTZEXR.js.map} +1 -1
  195. package/dist/styles.css +1 -1
  196. package/dist/tailwind-preset.cjs +4 -4
  197. package/dist/tailwind-preset.js +1 -1
  198. package/dist/templates.cjs +31 -31
  199. package/dist/templates.js +2 -2
  200. package/dist/{types-DSWbrVkM.d.ts → types-BfVolads.d.cts} +33 -0
  201. package/dist/{types-DSWbrVkM.d.cts → types-BfVolads.d.ts} +33 -0
  202. package/dist/utils/index.cjs +5 -5
  203. package/dist/utils/index.d.cts +12 -12
  204. package/dist/utils/index.d.ts +12 -12
  205. package/dist/utils/index.js +1 -1
  206. package/package.json +3 -13
  207. package/dist/chunk-25MPUVTM.js.map +0 -1
  208. package/dist/chunk-4M2KE4O5.cjs.map +0 -1
  209. package/dist/chunk-4SUEBKTY.js.map +0 -1
  210. package/dist/chunk-6UYMO3PF.cjs.map +0 -1
  211. package/dist/chunk-DXNVQQYN.cjs.map +0 -1
  212. package/dist/chunk-ECKIFQSD.cjs +0 -183
  213. package/dist/chunk-ECKIFQSD.cjs.map +0 -1
  214. package/dist/chunk-GDKOYVX3.cjs.map +0 -1
  215. package/dist/chunk-GLXTVCHN.cjs +0 -4
  216. package/dist/chunk-JEXEFWEM.js.map +0 -1
  217. package/dist/chunk-QHCAWDMG.cjs.map +0 -1
  218. package/dist/chunk-QO4A6U73.cjs.map +0 -1
  219. package/dist/chunk-R5P7NAJQ.js +0 -159
  220. package/dist/chunk-R5P7NAJQ.js.map +0 -1
  221. package/dist/chunk-RISZWWEQ.js +0 -3
  222. package/dist/chunk-RTADGBBN.js.map +0 -1
  223. package/dist/chunk-TUYWCUKH.js.map +0 -1
  224. package/dist/chunk-V5VPECJI.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/TextAreaRich/TextAreaRich.tsx","../src/components/TextAreaPlain/TextAreaPlain.tsx","../src/components/Textarea/Textarea.tsx"],"names":["React","jsx","RichTextEditor","cn","cva","React2","RequiredMark","jsxs","React3"],"mappings":"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","file":"chunk-DXNVQQYN.cjs","sourcesContent":["import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { RichTextEditor, type RichTextEditorProps } from '../RichTextEditor';\n\nexport interface TextAreaRichProps extends Omit<\n RichTextEditorProps,\n 'chromeless' | 'blockMenu' | 'defaultToolbar'\n> {\n /**\n * Initial toolbar visibility when `toolbar` is uncontrolled. TextAreaRich\n * is chromeless, so this defaults to `'hidden'`; the block gutter menu's\n * \"Show toolbar\" reveals it on demand.\n */\n defaultToolbar?: 'visible' | 'hidden';\n}\n\n/**\n * A textarea-like rich text surface: looks like the auto-growing `Textarea`\n * (bordered, single Input row tall, grows with content) but is\n * `RichTextEditor` underneath — toolbar hidden until requested, markdown\n * block shortcuts (`##` + space → heading…), the Notion-style block gutter\n * menu, and `.shortcut` macro expansion when `macros` is provided.\n *\n * The value contract is `RichTextEditor`'s: `value`/`onChange` carry **HTML**,\n * not plain text. Need plain text for form posts or native bindings — use\n * `Textarea`. Need the full always-on toolbar — use `RichTextEditor`.\n */\nconst TextAreaRich = React.forwardRef<HTMLDivElement, TextAreaRichProps>(\n (\n { className, markdownShortcuts = true, defaultToolbar = 'hidden', ...rest },\n ref\n ) => (\n <RichTextEditor\n ref={ref}\n chromeless\n blockMenu\n markdownShortcuts={markdownShortcuts}\n defaultToolbar={defaultToolbar}\n className={cn(\n // Textarea's chrome: border, radius, focus ring (on the wrapper via\n // focus-within since the editable sits inside it).\n 'border-input rounded-lg border',\n 'transition-colors duration-200',\n 'focus-within:ring-ring focus-within:border-transparent focus-within:ring-2',\n className\n )}\n {...rest}\n />\n )\n);\n\nTextAreaRich.displayName = 'TextAreaRich';\n\nexport { TextAreaRich };\n","import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport { RequiredMark, type RequiredMarkVariant } from '../Input';\n\nconst textareaVariants = cva(\n [\n 'w-full px-3 py-2',\n 'border border-input rounded-lg',\n 'bg-background text-foreground',\n 'placeholder:text-muted-foreground',\n 'transition-colors duration-200',\n 'focus:outline-none focus:ring-2 focus:ring-ring focus:border-transparent',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'resize-y',\n ],\n {\n variants: {\n size: {\n sm: 'text-sm min-h-[60px]',\n md: 'text-base min-h-[80px]',\n lg: 'text-lg min-h-[100px]',\n },\n hasError: {\n true: 'border-destructive focus:ring-destructive',\n false: '',\n },\n resize: {\n none: 'resize-none',\n vertical: 'resize-y',\n horizontal: 'resize-x',\n both: 'resize',\n },\n labelVariant: {\n stacked: '',\n floating: 'peer placeholder:text-transparent',\n },\n autoResize: {\n true: '',\n false: '',\n },\n },\n compoundVariants: [\n // Floating labels reserve top padding so entered text always starts\n // below the floated label, plus a little extra min-height.\n {\n labelVariant: 'floating',\n size: 'sm',\n className: 'pt-5 min-h-[76px]',\n },\n {\n labelVariant: 'floating',\n size: 'md',\n className: 'pt-6 min-h-[96px]',\n },\n {\n labelVariant: 'floating',\n size: 'lg',\n className: 'pt-7 min-h-[120px]',\n },\n // Auto-growing textareas start at the same visual height as a\n // single-line Input (h-8/h-10/h-12): min-height matches the Input\n // size token and the vertical padding is tuned so one line of text\n // plus padding plus borders lands exactly on that height.\n {\n autoResize: true,\n labelVariant: 'stacked',\n size: 'sm',\n className: 'min-h-8 py-[5px]',\n },\n {\n autoResize: true,\n labelVariant: 'stacked',\n size: 'md',\n className: 'min-h-10 py-[7px]',\n },\n {\n autoResize: true,\n labelVariant: 'stacked',\n size: 'lg',\n className: 'min-h-12 py-[9px]',\n },\n // Floating label + auto-grow: single line below the floated label.\n {\n autoResize: true,\n labelVariant: 'floating',\n size: 'sm',\n className: 'min-h-[50px]',\n },\n {\n autoResize: true,\n labelVariant: 'floating',\n size: 'md',\n className: 'min-h-[58px]',\n },\n {\n autoResize: true,\n labelVariant: 'floating',\n size: 'lg',\n className: 'min-h-[66px]',\n },\n ],\n defaultVariants: {\n size: 'md',\n hasError: false,\n resize: 'vertical',\n labelVariant: 'stacked',\n autoResize: true,\n },\n }\n);\n\nconst floatingLabelVariants = cva(\n [\n 'absolute start-3 pointer-events-none select-none',\n 'transition-all duration-200 ease-out',\n ],\n {\n variants: {\n size: {\n sm: [\n 'text-sm top-3',\n 'peer-focus:top-1 peer-[:not(:placeholder-shown)]:top-1 peer-autofill:top-1',\n 'peer-focus:text-[0.65rem] peer-[:not(:placeholder-shown)]:text-[0.65rem] peer-autofill:text-[0.65rem]',\n ],\n md: [\n 'text-base top-4',\n 'peer-focus:top-1.5 peer-[:not(:placeholder-shown)]:top-1.5 peer-autofill:top-1.5',\n 'peer-focus:text-xs peer-[:not(:placeholder-shown)]:text-xs peer-autofill:text-xs',\n ],\n lg: [\n 'text-lg top-5',\n 'peer-focus:top-2 peer-[:not(:placeholder-shown)]:top-2 peer-autofill:top-2',\n 'peer-focus:text-sm peer-[:not(:placeholder-shown)]:text-sm peer-autofill:text-sm',\n ],\n },\n hasError: {\n true: 'text-destructive',\n false: 'text-muted-foreground',\n },\n },\n defaultVariants: {\n size: 'md',\n hasError: false,\n },\n }\n);\n\nexport interface TextAreaPlainProps\n extends\n Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'size'>,\n Omit<VariantProps<typeof textareaVariants>, 'labelVariant'> {\n /** Label for the textarea */\n label?: string;\n /**\n * How the label is rendered.\n * - `stacked` (default): label above the textarea.\n * - `floating`: label rests inside the textarea like a placeholder and\n * floats to the top (staying inside it) when focused or filled.\n * Ignores `placeholder`; when `hideLabel` is set, falls back to a\n * visually-hidden stacked label.\n */\n labelVariant?: 'stacked' | 'floating';\n /** Whether the label should be visually hidden */\n hideLabel?: boolean;\n /** Error message to display */\n error?: string;\n /** Helper text to display */\n helperText?: string;\n /** Maximum character count */\n maxLength?: number;\n /** Show character count */\n showCount?: boolean;\n /**\n * Grow and shrink with content (default). The empty control matches a\n * single-line `Input`'s height; `rows` sets a taller growth floor, and\n * dragging the native resize handle sets a new floor the same way. Set\n * `false` for a classic fixed-height textarea.\n */\n autoResize?: boolean;\n /**\n * Color of the required asterisk.\n * - `default`: destructive (hard requirement).\n * - `warning`: warning color (soft requirement / recommended).\n */\n requiredVariant?: RequiredMarkVariant;\n}\n\n/**\n * A multi-line text input component with character count and auto-resize.\n *\n * @example\n * ```tsx\n * <TextAreaPlain label=\"Description\" placeholder=\"Enter a description...\" />\n * <TextAreaPlain\n * label=\"Bio\"\n * maxLength={280}\n * showCount\n * helperText=\"Tell us about yourself\"\n * />\n * ```\n */\nconst TextAreaPlain = React.forwardRef<HTMLTextAreaElement, TextAreaPlainProps>(\n (\n {\n className,\n size,\n hasError,\n resize,\n label,\n labelVariant = 'stacked',\n hideLabel,\n error,\n helperText,\n maxLength,\n showCount = false,\n autoResize = true,\n required = false,\n requiredVariant,\n id,\n rows,\n value,\n defaultValue,\n onChange,\n placeholder,\n 'aria-describedby': ariaDescribedBy,\n ...props\n },\n ref\n ) => {\n const internalRef = React.useRef<HTMLTextAreaElement>(null);\n const [internalValue, setInternalValue] = React.useState(\n (defaultValue as string) || ''\n );\n\n const generatedId = React.useId();\n const textareaId = id || generatedId;\n const errorId = `${textareaId}-error`;\n const helperId = `${textareaId}-helper`;\n const countId = `${textareaId}-count`;\n\n // Combine refs\n React.useImperativeHandle(ref, () => internalRef.current!);\n\n // Get current value\n const currentValue = value !== undefined ? String(value) : internalValue;\n const characterCount = currentValue.length;\n\n // Auto-resize logic: collapse to natural height, then grow to fit\n // content. CSS min-height (single-line baseline) and rows (via\n // scrollHeight) act as floors; a consumer-configured initial height\n // (style/class) and dragging the native resize handle set a user floor;\n // a consumer max-height still caps the rendered height.\n const userFloorRef = React.useRef<number | null>(null);\n const expectedHeightRef = React.useRef<number | null>(null);\n const initialFloorCapturedRef = React.useRef(false);\n\n const adjustHeight = React.useCallback(() => {\n const textarea = internalRef.current;\n if (textarea && autoResize) {\n textarea.style.height = 'auto';\n const borders = textarea.offsetHeight - textarea.clientHeight;\n const next = Math.max(\n textarea.scrollHeight + borders,\n userFloorRef.current ?? 0\n );\n textarea.style.height = `${next}px`;\n // Record the actual rendered height (a CSS max-height may clamp the\n // value we set) so clamping is never mistaken for a manual drag.\n expectedHeightRef.current = textarea.offsetHeight || next;\n }\n }, [autoResize]);\n\n // Measures prefilled values on mount and controlled values on update.\n // On mount, a consumer-configured initial height (inline style or a\n // height class) that exceeds the content height becomes the growth\n // floor — auto-sizing must not collapse below a configured baseline.\n React.useEffect(() => {\n const textarea = internalRef.current;\n if (textarea && autoResize && !initialFloorCapturedRef.current) {\n initialFloorCapturedRef.current = true;\n const configured = textarea.offsetHeight;\n adjustHeight();\n if (configured - textarea.offsetHeight > 1) {\n userFloorRef.current = configured;\n textarea.style.height = `${configured}px`;\n expectedHeightRef.current = textarea.offsetHeight || configured;\n }\n return;\n }\n adjustHeight();\n }, [currentValue, adjustHeight, autoResize]);\n\n // Re-measure when the available width changes (wrapping changes), and\n // detect heights we didn't set ourselves — the user dragging the native\n // resize handle — adopting the dragged height as the new growth floor.\n // The drag check runs first so a diagonal resize (width + height in one\n // notification) keeps the dragged height through the re-measure.\n React.useEffect(() => {\n const textarea = internalRef.current;\n if (!autoResize || !textarea || typeof ResizeObserver === 'undefined') {\n return;\n }\n let lastWidth = textarea.offsetWidth;\n const observer = new ResizeObserver(() => {\n const expected = expectedHeightRef.current;\n const height = textarea.offsetHeight;\n if (expected !== null && Math.abs(height - expected) > 1) {\n userFloorRef.current = height;\n expectedHeightRef.current = height;\n }\n if (textarea.offsetWidth !== lastWidth) {\n lastWidth = textarea.offsetWidth;\n adjustHeight();\n }\n });\n observer.observe(textarea);\n return () => observer.disconnect();\n }, [autoResize, adjustHeight]);\n\n // Handle change\n const handleChange = React.useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (value === undefined) {\n setInternalValue(e.target.value);\n }\n onChange?.(e);\n adjustHeight();\n },\n [value, onChange, adjustHeight]\n );\n\n // Build aria-describedby\n const describedByIds = [\n error ? errorId : null,\n helperText && !error ? helperId : null,\n showCount ? countId : null,\n ariaDescribedBy,\n ]\n .filter(Boolean)\n .join(' ');\n\n const isFloating = labelVariant === 'floating' && !!label && !hideLabel;\n\n const requiredMark = required && <RequiredMark variant={requiredVariant} />;\n\n const textareaElement = (\n <textarea\n data-slot=\"textarea\"\n data-auto-resize={autoResize ? 'true' : undefined}\n ref={internalRef}\n id={textareaId}\n value={value}\n defaultValue={value === undefined ? defaultValue : undefined}\n onChange={handleChange}\n maxLength={maxLength}\n aria-invalid={hasError || !!error}\n aria-describedby={describedByIds || undefined}\n required={required}\n // Auto-grow starts at one visible line; an explicit rows raises the\n // floor (scrollHeight never reports less than the rows box).\n rows={autoResize ? (rows ?? 1) : rows}\n // A single-space placeholder keeps :placeholder-shown reliable so the\n // label can float via CSS alone.\n placeholder={isFloating ? ' ' : placeholder}\n className={cn(\n textareaVariants({\n size,\n hasError: hasError || !!error,\n resize,\n labelVariant: isFloating ? 'floating' : 'stacked',\n autoResize,\n }),\n className\n )}\n {...props}\n />\n );\n\n return (\n <div data-slot=\"textarea-wrapper\" className=\"flex flex-col gap-1.5\">\n {label && !isFloating && (\n <label\n data-slot=\"textarea-label\"\n htmlFor={textareaId}\n className={cn(\n 'text-foreground text-sm font-medium',\n hideLabel && 'sr-only'\n )}\n >\n {label}\n {requiredMark}\n </label>\n )}\n {isFloating ? (\n <div className=\"relative\">\n {textareaElement}\n <label\n data-slot=\"textarea-label\"\n htmlFor={textareaId}\n className={floatingLabelVariants({\n size,\n hasError: hasError || !!error,\n })}\n >\n {label}\n {requiredMark}\n </label>\n </div>\n ) : (\n textareaElement\n )}\n <div\n data-slot=\"textarea-footer\"\n className=\"flex items-center justify-between gap-2\"\n >\n <div className=\"flex-1\">\n {error && (\n <p\n id={errorId}\n data-slot=\"textarea-error\"\n className=\"text-destructive-700 dark:text-destructive-400 text-sm\"\n role=\"alert\"\n >\n {error}\n </p>\n )}\n {helperText && !error && (\n <p\n id={helperId}\n data-slot=\"textarea-helper\"\n className=\"text-muted-foreground text-sm\"\n >\n {helperText}\n </p>\n )}\n </div>\n {showCount && (\n <p\n id={countId}\n data-slot=\"textarea-count\"\n className={cn(\n 'text-muted-foreground shrink-0 text-xs',\n maxLength && characterCount >= maxLength && 'text-destructive'\n )}\n >\n {characterCount}\n {maxLength && `/${maxLength}`}\n </p>\n )}\n </div>\n </div>\n );\n }\n);\n\nTextAreaPlain.displayName = 'TextAreaPlain';\n\nexport { TextAreaPlain, textareaVariants };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { RequiredMark } from '../Input';\nimport { TextAreaRich } from '../TextAreaRich';\nimport { TextAreaPlain } from '../TextAreaPlain';\nimport type { TextAreaPlainProps } from '../TextAreaPlain';\n\n/**\n * `Textarea` keeps `TextAreaPlain`'s prop surface so existing call sites\n * compile unchanged while rendering `TextAreaRich` underneath.\n */\nexport interface TextareaProps extends TextAreaPlainProps {\n /**\n * Set `false` to opt out of the rich surface: renders the native\n * `TextAreaPlain` instead — no block gutter menu, no formatting, no HTML —\n * and restores every native textarea behaviour (`maxLength` enforcement,\n * `resize`, `autoResize={false}`, floating labels).\n */\n richText?: boolean;\n}\n\n// --- plain text <-> HTML (lossless round-trip for plain text) --------------\n\nfunction escapeHtml(text: string): string {\n return text\n .replaceAll('&', '&amp;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;');\n}\n\n/**\n * Newline normalization applied to every incoming plain value: a native\n * textarea's API value never contains CR, so CRLF/CR collapse to LF before\n * any conversion. Without this, `'a\\r\\nb'` would leave a literal CR inside a\n * paragraph and gain a blank line on the next round-trip.\n */\nfunction normalizeNewlines(text: string): string {\n return text.replace(/\\r\\n?/g, '\\n');\n}\n\n/**\n * Converts plain text to the editor's HTML: each line becomes a paragraph,\n * empty lines become `<p><br></p>`. Newlines are normalized to LF first\n * (matching native textarea behaviour); after that,\n * `htmlToPlain(plainToHtml(text)) === text` for every string, so stored\n * plain values survive untouched.\n */\nexport function plainToHtml(text: string): string {\n if (!text) return '';\n return normalizeNewlines(text)\n .split('\\n')\n .map((line) => (line ? `<p>${escapeHtml(line)}</p>` : '<p><br></p>'))\n .join('');\n}\n\nconst BLOCK_TAGS = new Set([\n 'P',\n 'DIV',\n 'H1',\n 'H2',\n 'H3',\n 'H4',\n 'H5',\n 'H6',\n 'LI',\n 'UL',\n 'OL',\n 'BLOCKQUOTE',\n 'PRE',\n 'TABLE',\n 'CAPTION',\n 'THEAD',\n 'TBODY',\n 'TFOOT',\n 'TR',\n]);\n\n/** Table cells separate with tabs; their row supplies the newline. */\nconst CELL_TAGS = new Set(['TD', 'TH']);\n\n/**\n * Structural table tags never render text of their own — whitespace-only\n * text nodes directly under them are pretty-printing between cells/rows\n * (`<tr>\\n <td>`), not field content.\n */\nconst TABLE_STRUCTURE_TAGS = new Set([\n 'TABLE',\n 'THEAD',\n 'TBODY',\n 'TFOOT',\n 'TR',\n]);\n\n/** Tags whose text is invisible — contributing it would leak code as text. */\nconst IGNORED_TAGS = new Set(['SCRIPT', 'STYLE', 'TEMPLATE', 'NOSCRIPT']);\n\nfunction nodeListToText(nodes: Iterable<Node>): string {\n let out = '';\n // Cell separators are positional, not content-based: an empty cell still\n // owns a column, so `Drug | (blank) | Dose` must stay `Drug\\t\\tDose`.\n let afterCell = false;\n for (const node of nodes) {\n if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent ?? '';\n const parentTag = node.parentElement?.tagName;\n // Indentation between structural table elements is markup\n // formatting, not content — whitespace inside cells still counts.\n if (!text.trim() && parentTag && TABLE_STRUCTURE_TAGS.has(parentTag)) {\n continue;\n }\n out += text;\n // Inter-cell whitespace from pretty-printed table markup does not\n // break the cell sequence.\n if (text.trim()) afterCell = false;\n continue;\n }\n if (node.nodeType !== Node.ELEMENT_NODE) continue;\n const el = node as Element;\n if (IGNORED_TAGS.has(el.tagName)) continue;\n if (el.tagName === 'BR') {\n afterCell = false;\n out += '\\n';\n continue;\n }\n if (CELL_TAGS.has(el.tagName)) {\n if (afterCell) out += '\\t';\n out += nodeListToText(el.childNodes);\n afterCell = true;\n continue;\n }\n afterCell = false;\n if (BLOCK_TAGS.has(el.tagName)) {\n // A block starts its own line — inline content before it\n // (`a<div>b</div>`) must not fuse with the block's first line.\n if (out && !out.endsWith('\\n')) out += '\\n';\n let inner = nodeListToText(el.childNodes);\n // A lone <br> inside a block is the \"empty paragraph\" convention,\n // not an extra line break.\n if (inner === '\\n') inner = '';\n out += inner;\n // A block ends its own line — but a nested block\n // (`<blockquote><p>a</p></blockquote>`) already supplied the\n // newline; adding another would fabricate a blank line.\n if (inner === '' || !inner.endsWith('\\n')) out += '\\n';\n continue;\n }\n out += nodeListToText(el.childNodes);\n }\n return out;\n}\n\n/** Extracts plain text from editor HTML: blocks and `<br>` become newlines. */\nexport function htmlToPlain(html: string): string {\n if (!html) return '';\n // A <template> is the spec's inert parser: untrusted markup (pasted HTML\n // reaches this extractor) cannot load resources or run handlers like\n // `<img onerror>` while being read — unlike a detached <div>, whose\n // subtree is still \"browsing-context connected\" enough to fetch.\n const root = document.createElement('template');\n root.innerHTML = html;\n const text = nodeListToText(root.content.childNodes);\n return text.endsWith('\\n') ? text.slice(0, -1) : text;\n}\n\n/**\n * Paste/drop insertion policy: clipboard HTML is flattened to escaped plain\n * paragraphs before it reaches the live editable, so clipboard styles, host\n * CSS classes and embedded content never become active inside a field whose\n * contract is plain text.\n */\nfunction sanitizePastedHtml(html: string): string {\n return plainToHtml(htmlToPlain(html));\n}\n\n// --- dev-only one-time warnings for dropped native behaviours ---------------\n\nconst warned = new Set<string>();\nfunction warnOnce(key: string, message: string): void {\n if (process.env.NODE_ENV !== 'production' && !warned.has(key)) {\n warned.add(key);\n console.warn(`[mieweb/ui Textarea] ${message}`);\n }\n}\n\n/**\n * The rich implementation behind `Textarea` (see its docs). Separate\n * component so the `richText={false}` branch never mounts these hooks.\n */\nconst RichTextarea = React.forwardRef<HTMLTextAreaElement, TextAreaPlainProps>(\n (\n {\n label,\n labelVariant = 'stacked',\n hideLabel,\n error,\n helperText,\n maxLength,\n showCount,\n autoResize = true,\n requiredVariant,\n size = 'md',\n hasError,\n resize,\n className,\n value,\n defaultValue,\n onChange,\n onBlur,\n onFocus,\n onKeyDown,\n onKeyUp,\n name,\n form,\n id,\n rows,\n required,\n readOnly,\n disabled,\n placeholder,\n 'aria-describedby': ariaDescribedBy,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n },\n ref\n ) => {\n // One-time upgrade notice: this surface replaced the native <textarea>\n // in 0.12.0 — reaches exactly the developers affected, in dev only.\n warnOnce(\n 'rich-upgrade',\n 'Since 0.12.0 Textarea renders a rich text surface (plain-text value ' +\n 'contract unchanged). Watch for: CSS \"textarea\" selectors, E2E ' +\n 'fill()/type(), and maxLength no longer blocking typing. Opt out per ' +\n 'field with richText={false} or use TextAreaPlain. See MIGRATION.md.'\n );\n if (labelVariant === 'floating') {\n warnOnce(\n 'floating',\n 'labelVariant=\"floating\" is not supported by the rich surface; ' +\n 'falling back to a stacked label. Use TextAreaPlain for floating labels.'\n );\n }\n if (autoResize === false) {\n warnOnce(\n 'autoResize',\n 'autoResize={false} is ignored; the rich surface always grows with ' +\n 'content. Use TextAreaPlain for a fixed-height textarea.'\n );\n }\n if (resize !== undefined) {\n warnOnce(\n 'resize',\n 'resize is ignored; the rich surface has no native resize handle. ' +\n 'Use TextAreaPlain for drag-resizing.'\n );\n }\n if (maxLength !== undefined) {\n warnOnce(\n 'maxLength',\n 'maxLength is not enforced while typing; the character count still ' +\n 'reflects it. Enforce limits in onChange or use TextAreaPlain.'\n );\n }\n\n const reactId = React.useId();\n const errorId = `${reactId}-error`;\n const helperId = `${reactId}-helper`;\n const countId = `${reactId}-count`;\n\n const controlledValue =\n value !== undefined ? normalizeNewlines(String(value)) : undefined;\n\n const [state, setState] = React.useState(() => {\n const plain =\n controlledValue ??\n (defaultValue !== undefined\n ? normalizeNewlines(String(defaultValue))\n : '');\n return { html: plainToHtml(plain), plain };\n });\n\n // Controlled resync: only when the parent hands us a value different from\n // the plain text we last reported — echoing our own value back (the usual\n // controlled round-trip) keeps the user's rich formatting intact.\n if (controlledValue !== undefined && controlledValue !== state.plain) {\n setState({ html: plainToHtml(controlledValue), plain: controlledValue });\n }\n\n const hiddenRef = React.useRef<HTMLTextAreaElement>(null);\n const editorWrapperRef = React.useRef<HTMLDivElement>(null);\n\n // Rejected-edit resync. When a controlled parent refuses an edit, the\n // committed value never changes — the optimistic state above is reverted\n // during the same render — so the editor's [value]-gated sync never\n // fires and its DOM would keep the rejected text. Compare *plain* text\n // (not HTML) so accepted edits keep the user's rich formatting.\n React.useEffect(() => {\n const editable =\n editorWrapperRef.current?.querySelector<HTMLElement>(\n '[role=\"textbox\"]'\n );\n if (editable && htmlToPlain(editable.innerHTML) !== state.plain) {\n editable.innerHTML = state.html;\n }\n });\n\n const focusEditor = React.useCallback(() => {\n editorWrapperRef.current\n ?.querySelector<HTMLElement>('[role=\"textbox\"]')\n ?.focus();\n }, []);\n\n // The forwarded ref is the hidden mirror <textarea> — `ref.current.value`\n // reads the current plain text — with focus/blur redirected to the editor.\n React.useImperativeHandle(ref, () => {\n const node = hiddenRef.current as HTMLTextAreaElement;\n node.focus = focusEditor;\n node.blur = () => {\n const editable =\n editorWrapperRef.current?.querySelector<HTMLElement>(\n '[role=\"textbox\"]'\n );\n if (document.activeElement === editable) editable?.blur();\n };\n return node;\n }, [focusEditor]);\n\n // External-label bridge: existing call sites pair\n // `<Label htmlFor={id}>` with `<Textarea id={id}>`. The id now lands on a\n // contenteditable div, which `htmlFor` neither names nor focuses. Find\n // the external label, point `aria-labelledby` at it (restoring the\n // accessible name) and focus the editor when it is clicked.\n const [externalLabelId, setExternalLabelId] = React.useState<string>();\n React.useEffect(() => {\n if (!id) return;\n const externalLabel = document.querySelector<HTMLLabelElement>(\n `label[for=\"${globalThis.CSS.escape(id)}\"]`\n );\n if (!externalLabel) return;\n if (!externalLabel.id) externalLabel.id = `${reactId}-external-label`;\n setExternalLabelId(externalLabel.id);\n const handleClick = () => focusEditor();\n externalLabel.addEventListener('click', handleClick);\n return () => externalLabel.removeEventListener('click', handleClick);\n }, [id, reactId, focusEditor]);\n\n // Re-targets editor events at the mirror so legacy handlers keep reading\n // `event.target.value` as plain text, like they did on the native\n // textarea. The original event is the prototype — reads and propagation\n // state delegate to it — with only the targets overridden;\n // stopPropagation/preventDefault forward to the original so React's\n // dispatch loop (which checks the original) honours them.\n const retargetEvent = React.useCallback(\n <E extends React.SyntheticEvent>(event: E): E => {\n const node = hiddenRef.current;\n if (!node) return event;\n const retargeted = Object.create(event) as E;\n Object.defineProperties(retargeted, {\n target: { value: node, enumerable: true },\n currentTarget: { value: node, enumerable: true },\n stopPropagation: { value: () => event.stopPropagation() },\n preventDefault: { value: () => event.preventDefault() },\n });\n return retargeted;\n },\n []\n );\n\n type MirrorFocusEvent = React.FocusEvent<HTMLTextAreaElement>;\n type MirrorKeyboardEvent = React.KeyboardEvent<HTMLTextAreaElement>;\n\n // Focus boundary that includes the editor's own portals: the block\n // gutter menu mounts under `document.body` and moves focus to its first\n // item on open, so DOM containment alone would fire the host's blur\n // mid-format (a blur-to-save consumer would commit early). A portal is\n // ours when a trigger inside this wrapper `aria-controls` its menu.\n const focusStaysInside = (\n event: React.FocusEvent<HTMLDivElement>\n ): boolean => {\n const related = event.relatedTarget;\n if (!related) return false;\n if (event.currentTarget.contains(related)) return true;\n const menuId = related\n .closest('[data-slot=\"dropdown-menu\"]')\n ?.querySelector('[role=\"menu\"]')?.id;\n return (\n !!menuId &&\n !!event.currentTarget.querySelector(\n `[aria-controls=\"${globalThis.CSS.escape(menuId)}\"]`\n )\n );\n };\n\n const handleHtmlChange = (html: string) => {\n const plain = htmlToPlain(html);\n setState({ html, plain });\n const node = hiddenRef.current;\n if (onChange && node) {\n node.value = plain;\n const nativeEvent = new Event('change');\n onChange({\n target: node,\n currentTarget: node,\n type: 'change',\n bubbles: false,\n cancelable: false,\n defaultPrevented: false,\n eventPhase: 0,\n isTrusted: false,\n timeStamp: Date.now(),\n nativeEvent,\n preventDefault: () => {},\n stopPropagation: () => {},\n isDefaultPrevented: () => false,\n isPropagationStopped: () => false,\n persist: () => {},\n } as React.ChangeEvent<HTMLTextAreaElement>);\n }\n };\n\n const showError = !!error;\n const invalid = hasError || showError;\n const describedByIds =\n [\n showError ? errorId : null,\n helperText && !showError ? helperId : null,\n showCount ? countId : null,\n ariaDescribedBy,\n ]\n .filter(Boolean)\n .join(' ') || undefined;\n\n const characterCount = state.plain.length;\n\n // The editable's own metrics (RichTextEditor pins `text-base` and a\n // one-row min-height): `size` restyles the font, `rows` restores the\n // size-aware growth floor a native textarea got for free.\n const lineHeightPx = size === 'sm' ? 20 : size === 'lg' ? 28 : 24;\n const editorStyle = rows\n ? // 7px block padding each side, matching the editable's py-[7px].\n { minHeight: `${rows * lineHeightPx + 14}px` }\n : undefined;\n\n return (\n <div data-slot=\"textarea-wrapper\" className=\"flex flex-col gap-1.5\">\n {label && (\n <label\n data-slot=\"textarea-label\"\n className={cn(\n 'text-foreground text-sm font-medium',\n hideLabel && 'sr-only'\n )}\n >\n {label}\n {required && <RequiredMark variant={requiredVariant} />}\n </label>\n )}\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions --\n not interactive itself: delegates events bubbling from the\n contenteditable textbox inside, like a native field's wrapper */}\n <div\n ref={editorWrapperRef}\n className=\"w-full\"\n // Composed like native textarea events: blur/focus only fire when\n // focus actually leaves/enters the field (moves inside the editor\n // chrome — gutter menu, toolbar — don't count), and all events are\n // re-targeted at the mirror so `event.target.value` stays plain.\n onBlur={\n onBlur &&\n ((event: React.FocusEvent<HTMLDivElement>) => {\n if (focusStaysInside(event)) return;\n onBlur(retargetEvent(event) as unknown as MirrorFocusEvent);\n })\n }\n onFocus={\n onFocus &&\n ((event: React.FocusEvent<HTMLDivElement>) => {\n if (focusStaysInside(event)) return;\n onFocus(retargetEvent(event) as unknown as MirrorFocusEvent);\n })\n }\n onKeyDown={\n onKeyDown &&\n ((event: React.KeyboardEvent<HTMLDivElement>) =>\n onKeyDown(retargetEvent(event) as unknown as MirrorKeyboardEvent))\n }\n onKeyUp={\n onKeyUp &&\n ((event: React.KeyboardEvent<HTMLDivElement>) =>\n onKeyUp(retargetEvent(event) as unknown as MirrorKeyboardEvent))\n }\n >\n <TextAreaRich\n value={state.html}\n onChange={handleHtmlChange}\n placeholder={placeholder}\n disabled={disabled}\n readOnly={readOnly}\n id={id}\n sanitizeHtml={sanitizePastedHtml}\n aria-label={ariaLabel ?? label}\n aria-labelledby={ariaLabelledBy ?? externalLabelId}\n aria-describedby={describedByIds}\n aria-invalid={invalid || undefined}\n aria-required={required || undefined}\n editorClassName={cn(\n // A native textarea renders repeated spaces and tabs\n // faithfully; normal HTML layout would collapse them.\n 'whitespace-pre-wrap',\n size === 'sm' && 'text-sm',\n size === 'lg' && 'text-lg'\n )}\n editorStyle={editorStyle}\n className={cn(\n size === 'sm' && 'text-sm',\n size === 'lg' && 'text-lg',\n invalid &&\n 'border-destructive focus-within:ring-destructive focus-within:border-destructive',\n disabled && 'cursor-not-allowed opacity-50',\n className\n )}\n />\n </div>\n {/* Mirrors the plain value for form posts and the forwarded ref. */}\n <textarea\n data-slot=\"textarea-mirror\"\n ref={hiddenRef}\n hidden\n readOnly\n tabIndex={-1}\n aria-hidden=\"true\"\n name={name}\n form={form}\n required={required}\n disabled={disabled}\n value={state.plain}\n />\n <div\n data-slot=\"textarea-footer\"\n className=\"flex items-center justify-between gap-2\"\n >\n <div className=\"flex-1\">\n {showError && (\n <p\n id={errorId}\n data-slot=\"textarea-error\"\n className=\"text-destructive-700 dark:text-destructive-400 text-sm\"\n role=\"alert\"\n >\n {error}\n </p>\n )}\n {helperText && !showError && (\n <p\n id={helperId}\n data-slot=\"textarea-helper\"\n className=\"text-muted-foreground text-sm\"\n >\n {helperText}\n </p>\n )}\n </div>\n {showCount && (\n <p\n id={countId}\n data-slot=\"textarea-count\"\n className={cn(\n 'text-muted-foreground shrink-0 text-xs',\n maxLength && characterCount >= maxLength && 'text-destructive'\n )}\n >\n {characterCount}\n {maxLength && `/${maxLength}`}\n </p>\n )}\n </div>\n </div>\n );\n }\n);\n\nRichTextarea.displayName = 'RichTextarea';\n\n/**\n * A multi-line text input that is rich text underneath. `Textarea` keeps its\n * plain-text contract — `value`, `defaultValue` and `onChange`'s\n * `event.target.value` are plain strings — while rendering `TextAreaRich`\n * (hidden toolbar, markdown shortcuts, block gutter menu) so every note\n * field gets formatting for free.\n *\n * Formatting the user applies is visible while editing but only the plain\n * text is reported through `onChange`; hosts that persist HTML should use\n * `TextAreaRich` directly. Need the native `<textarea>` element (hard\n * `maxLength`, native validation, autofill, drag-resize, floating label) —\n * pass `richText={false}` or use `TextAreaPlain`.\n *\n * A hidden `<textarea>` mirrors the plain value so `name` form posts and\n * `ref.current.value` keep working; `ref.current.focus()` focuses the editor.\n */\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ richText = true, ...props }, ref) =>\n richText ? (\n <RichTextarea ref={ref} {...props} />\n ) : (\n <TextAreaPlain ref={ref} {...props} />\n )\n);\n\nTextarea.displayName = 'Textarea';\n\nexport { Textarea };\n"]}
@@ -1,183 +0,0 @@
1
- 'use strict';
2
-
3
- var chunkQHCAWDMG_cjs = require('./chunk-QHCAWDMG.cjs');
4
- var chunkFSARTLUE_cjs = require('./chunk-FSARTLUE.cjs');
5
- var React = require('react');
6
- var classVarianceAuthority = require('class-variance-authority');
7
- var jsxRuntime = require('react/jsx-runtime');
8
-
9
- function _interopNamespace(e) {
10
- if (e && e.__esModule) return e;
11
- var n = Object.create(null);
12
- if (e) {
13
- Object.keys(e).forEach(function (k) {
14
- if (k !== 'default') {
15
- var d = Object.getOwnPropertyDescriptor(e, k);
16
- Object.defineProperty(n, k, d.get ? d : {
17
- enumerable: true,
18
- get: function () { return e[k]; }
19
- });
20
- }
21
- });
22
- }
23
- n.default = e;
24
- return Object.freeze(n);
25
- }
26
-
27
- var React__namespace = /*#__PURE__*/_interopNamespace(React);
28
-
29
- var mediaPlayerVariants = classVarianceAuthority.cva(
30
- "flex h-full w-full items-center justify-center",
31
- {
32
- variants: {
33
- variant: {
34
- plain: "",
35
- card: "rounded-xl border border-border bg-card text-card-foreground p-2"
36
- }
37
- },
38
- defaultVariants: {
39
- variant: "plain"
40
- }
41
- }
42
- );
43
- var VIDEO_EXTENSIONS = /\.(mp4|mov|avi|webm|mkv|m4v)$/i;
44
- function inferMediaKind(src) {
45
- const path = src.split(/[?#]/, 1)[0];
46
- return VIDEO_EXTENSIONS.test(path) ? "video" : "audio";
47
- }
48
- var MediaPlayer = React__namespace.forwardRef(
49
- ({
50
- src,
51
- kind,
52
- controls = true,
53
- muted,
54
- loop,
55
- poster,
56
- preload,
57
- children,
58
- labels,
59
- variant,
60
- onStateChange,
61
- onEnded,
62
- onError,
63
- onRetry,
64
- onTimeUpdate,
65
- className,
66
- "aria-label": ariaLabel,
67
- mediaElementRef
68
- }, ref) => {
69
- const [error, setError] = React__namespace.useState(null);
70
- React__namespace.useEffect(() => {
71
- setError(null);
72
- }, [src]);
73
- const resolvedKind = kind ?? inferMediaKind(src);
74
- const transport = chunkQHCAWDMG_cjs.useMediaTransport({
75
- onTimeUpdate,
76
- onStateChange,
77
- onEnded,
78
- onError: (err) => {
79
- setError(
80
- labels?.error ?? "Unable to load media. The server may be unavailable."
81
- );
82
- onError?.(err);
83
- },
84
- endedState: "paused",
85
- errorLabel: `media: ${src}`
86
- });
87
- const { setMediaElement, mediaElement } = transport;
88
- const setElement = React__namespace.useCallback(
89
- (el) => {
90
- setMediaElement(el);
91
- if (mediaElementRef) {
92
- mediaElementRef.current = el;
93
- }
94
- },
95
- [setMediaElement, mediaElementRef]
96
- );
97
- React__namespace.useImperativeHandle(
98
- ref,
99
- () => ({
100
- seekToMs: transport.seekToMs,
101
- play: transport.play,
102
- pause: transport.pause,
103
- getCurrentTimeMs: transport.getCurrentTimeMs,
104
- getDurationMs: transport.getDurationMs,
105
- isPaused: transport.isPaused,
106
- setPlaybackRate: transport.setPlaybackRate,
107
- get mediaElement() {
108
- return mediaElement;
109
- }
110
- }),
111
- [transport, mediaElement]
112
- );
113
- const handleRetry = React__namespace.useCallback(() => {
114
- setError(null);
115
- mediaElement?.load();
116
- onRetry?.();
117
- }, [mediaElement, onRetry]);
118
- const sharedMediaProps = {
119
- src,
120
- controls,
121
- muted,
122
- loop,
123
- preload,
124
- "aria-label": ariaLabel
125
- };
126
- if (error) {
127
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: mediaPlayerVariants({ variant, className }), children: /* @__PURE__ */ jsxRuntime.jsxs(
128
- "div",
129
- {
130
- role: "alert",
131
- className: "border-destructive/30 bg-destructive/10 flex min-h-36 flex-col items-center justify-center gap-3 rounded-lg border p-8 text-center",
132
- children: [
133
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-destructive-700 dark:text-destructive-300 m-0 text-sm", children: error }),
134
- /* @__PURE__ */ jsxRuntime.jsx(
135
- chunkFSARTLUE_cjs.Button,
136
- {
137
- variant: "outline",
138
- size: "sm",
139
- className: "bg-background",
140
- onClick: handleRetry,
141
- children: labels?.retry ?? "Retry"
142
- }
143
- )
144
- ]
145
- }
146
- ) });
147
- }
148
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: mediaPlayerVariants({ variant, className }), children: resolvedKind === "video" ? (
149
- // Tracks belong to the caller's media resource and can be supplied as
150
- // children. The feed also supports a custom renderer for captions.
151
- // eslint-disable-next-line jsx-a11y/media-has-caption
152
- /* @__PURE__ */ jsxRuntime.jsx(
153
- "video",
154
- {
155
- ref: setElement,
156
- playsInline: true,
157
- poster,
158
- className: "h-auto max-h-full w-auto max-w-full object-contain",
159
- ...sharedMediaProps,
160
- children
161
- }
162
- )
163
- ) : (
164
- // eslint-disable-next-line jsx-a11y/media-has-caption
165
- /* @__PURE__ */ jsxRuntime.jsx(
166
- "audio",
167
- {
168
- ref: setElement,
169
- className: "my-4 w-[90%] max-w-lg",
170
- ...sharedMediaProps,
171
- children
172
- }
173
- )
174
- ) });
175
- }
176
- );
177
- MediaPlayer.displayName = "MediaPlayer";
178
-
179
- exports.MediaPlayer = MediaPlayer;
180
- exports.inferMediaKind = inferMediaKind;
181
- exports.mediaPlayerVariants = mediaPlayerVariants;
182
- //# sourceMappingURL=chunk-ECKIFQSD.cjs.map
183
- //# sourceMappingURL=chunk-ECKIFQSD.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/MediaPlayer/MediaPlayer.tsx"],"names":["cva","React","useMediaTransport","jsx","jsxs","Button"],"mappings":"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","file":"chunk-ECKIFQSD.cjs","sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { Button } from '../Button';\nimport { useMediaTransport } from '../../hooks/useMediaTransport';\n\n// ============================================================================\n// Types & Interfaces\n// ============================================================================\n\nexport type MediaPlayerState =\n | 'idle'\n | 'loading'\n | 'playing'\n | 'paused'\n | 'error';\n\nexport type MediaKind = 'video' | 'audio';\n\n/** Ref handle for controlling {@link MediaPlayer} programmatically. */\nexport interface MediaPlayerRef {\n /** Seek to a specific time in milliseconds. */\n seekToMs: (timeMs: number) => void;\n /** Start playback. */\n play: () => void;\n /** Pause playback. */\n pause: () => void;\n /** Get current playback time in milliseconds. */\n getCurrentTimeMs: () => number;\n /** Get total duration in milliseconds. */\n getDurationMs: () => number;\n /** Whether playback is currently paused. */\n isPaused: () => boolean;\n /** Set playback speed multiplier. */\n setPlaybackRate: (rate: number) => void;\n /**\n * The underlying media element.\n * Escape hatch for host integrations (e.g. thumbnail capture); prefer the\n * typed methods above for playback control.\n */\n mediaElement: HTMLVideoElement | HTMLAudioElement | null;\n}\n\nexport interface MediaPlayerProps extends VariantProps<\n typeof mediaPlayerVariants\n> {\n /** Media source URL. */\n src: string;\n /** Force the media kind; when omitted it is inferred from the src extension. */\n kind?: MediaKind;\n /** Whether to show native controls (default `true`). */\n controls?: boolean;\n /** Begin muted; native controls can still change the volume. */\n muted?: boolean;\n /** Repeat playback when the media ends. */\n loop?: boolean;\n /** Video thumbnail displayed before playback. */\n poster?: string;\n /** Browser preload hint (default browser behavior when omitted). */\n preload?: 'none' | 'metadata' | 'auto';\n /** Caption/subtitle `<track>` elements. The `src` attribute is always set\n * on the media element, so alternative `<source>` children are ignored. */\n children?: React.ReactNode;\n /** Localized load-error and retry text. */\n labels?: { error?: string; retry?: string };\n /** Callback when playback state changes. */\n onStateChange?: (state: MediaPlayerState) => void;\n /** Callback when playback ends. */\n onEnded?: () => void;\n /** Callback when an error occurs. */\n onError?: (error: Error) => void;\n /** Callback after the user requests a fresh media load on the error surface. */\n onRetry?: () => void;\n /** Callback on time updates (milliseconds). */\n onTimeUpdate?: (currentTimeMs: number, durationMs: number) => void;\n /** Additional class name. */\n className?: string;\n /** Accessible label for the media element. */\n 'aria-label'?: string;\n /**\n * Transitional: exposes the raw media element to legacy consumers.\n * Prefer {@link MediaPlayerRef} for playback control.\n */\n mediaElementRef?: React.RefObject<HTMLVideoElement | HTMLAudioElement | null>;\n}\n\n// ============================================================================\n// Variants\n// ============================================================================\n\nconst mediaPlayerVariants = cva(\n 'flex h-full w-full items-center justify-center',\n {\n variants: {\n variant: {\n plain: '',\n card: 'rounded-xl border border-border bg-card text-card-foreground p-2',\n },\n },\n defaultVariants: {\n variant: 'plain',\n },\n }\n);\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nconst VIDEO_EXTENSIONS = /\\.(mp4|mov|avi|webm|mkv|m4v)$/i;\n\n/** Infer media kind from a URL's file extension; defaults to audio. */\nexport function inferMediaKind(src: string): MediaKind {\n // Strip any query string / fragment before matching. Testing the extension\n // against the full URL required a trailing `.*`, which backtracks\n // polynomially on crafted inputs (ReDoS); splitting first is linear.\n const path = src.split(/[?#]/, 1)[0];\n return VIDEO_EXTENSIONS.test(path) ? 'video' : 'audio';\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Media playback surface for audio and video with a shared imperative handle.\n *\n * Renders a native `<video>` or `<audio>` element (kind inferred from the src\n * extension unless forced) with themed error/retry handling. Playback state and\n * controls come from the shared {@link useMediaTransport} hook and are exposed\n * through {@link MediaPlayerRef} (all times in milliseconds) — consumers should\n * not reach into the DOM element directly.\n */\nexport const MediaPlayer = React.forwardRef<MediaPlayerRef, MediaPlayerProps>(\n (\n {\n src,\n kind,\n controls = true,\n muted,\n loop,\n poster,\n preload,\n children,\n labels,\n variant,\n onStateChange,\n onEnded,\n onError,\n onRetry,\n onTimeUpdate,\n className,\n 'aria-label': ariaLabel,\n mediaElementRef,\n },\n ref\n ) => {\n const [error, setError] = React.useState<string | null>(null);\n\n // A failed load must not outlive its src: clearing on change lets a host\n // swap in a corrected URL without being trapped on the error surface\n // (which unmounts the media element, so the new src would never load).\n React.useEffect(() => {\n setError(null);\n }, [src]);\n const resolvedKind = kind ?? inferMediaKind(src);\n\n const transport = useMediaTransport({\n onTimeUpdate,\n onStateChange,\n onEnded,\n onError: (err) => {\n setError(\n labels?.error ??\n 'Unable to load media. The server may be unavailable.'\n );\n onError?.(err);\n },\n endedState: 'paused',\n errorLabel: `media: ${src}`,\n });\n\n const { setMediaElement, mediaElement } = transport;\n\n const setElement = React.useCallback(\n (el: HTMLVideoElement | HTMLAudioElement | null) => {\n setMediaElement(el);\n if (mediaElementRef) {\n (mediaElementRef as React.MutableRefObject<typeof el>).current = el;\n }\n },\n [setMediaElement, mediaElementRef]\n );\n\n React.useImperativeHandle(\n ref,\n (): MediaPlayerRef => ({\n seekToMs: transport.seekToMs,\n play: transport.play,\n pause: transport.pause,\n getCurrentTimeMs: transport.getCurrentTimeMs,\n getDurationMs: transport.getDurationMs,\n isPaused: transport.isPaused,\n setPlaybackRate: transport.setPlaybackRate,\n get mediaElement() {\n return mediaElement;\n },\n }),\n [transport, mediaElement]\n );\n\n const handleRetry = React.useCallback(() => {\n setError(null);\n mediaElement?.load();\n onRetry?.();\n }, [mediaElement, onRetry]);\n\n const sharedMediaProps = {\n src,\n controls,\n muted,\n loop,\n preload,\n 'aria-label': ariaLabel,\n };\n\n if (error) {\n return (\n <div className={mediaPlayerVariants({ variant, className })}>\n <div\n role=\"alert\"\n className=\"border-destructive/30 bg-destructive/10 flex min-h-36 flex-col items-center justify-center gap-3 rounded-lg border p-8 text-center\"\n >\n {/* destructive-700/300 instead of the base token: #dc2626 on the\n destructive/10 tint is 4.14:1 — below WCAG AA (axe: color-contrast). */}\n <p className=\"text-destructive-700 dark:text-destructive-300 m-0 text-sm\">\n {error}\n </p>\n {/* bg-background: the outline button is transparent, and its text on\n the destructive/10 tint sits exactly at the 4.5:1 AA boundary. */}\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"bg-background\"\n onClick={handleRetry}\n >\n {labels?.retry ?? 'Retry'}\n </Button>\n </div>\n </div>\n );\n }\n\n return (\n <div className={mediaPlayerVariants({ variant, className })}>\n {resolvedKind === 'video' ? (\n // Tracks belong to the caller's media resource and can be supplied as\n // children. The feed also supports a custom renderer for captions.\n // eslint-disable-next-line jsx-a11y/media-has-caption\n <video\n ref={setElement as React.Ref<HTMLVideoElement>}\n playsInline\n poster={poster}\n className=\"h-auto max-h-full w-auto max-w-full object-contain\"\n {...sharedMediaProps}\n >\n {children}\n </video>\n ) : (\n // eslint-disable-next-line jsx-a11y/media-has-caption\n <audio\n ref={setElement as React.Ref<HTMLAudioElement>}\n className=\"my-4 w-[90%] max-w-lg\"\n {...sharedMediaProps}\n >\n {children}\n </audio>\n )}\n </div>\n );\n }\n);\n\nMediaPlayer.displayName = 'MediaPlayer';\n\nexport { mediaPlayerVariants };\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/Slider/Slider.tsx"],"names":["cva","React","isRtl","jsxs","cn","jsx"],"mappings":"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","file":"chunk-GDKOYVX3.cjs","sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport { isRtl } from '../../hooks/useDirection';\n\n// ============================================================================\n// Slider Variants\n// ============================================================================\n\nconst sliderTrackVariants = cva(\n [\n 'relative w-full overflow-hidden rounded-full',\n 'bg-neutral-200 dark:bg-neutral-700',\n 'cursor-pointer',\n 'group-data-[disabled=true]:cursor-not-allowed group-data-[disabled=true]:opacity-50',\n ],\n {\n variants: {\n size: {\n sm: 'h-1',\n md: 'h-2',\n lg: 'h-3',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n }\n);\n\nconst sliderRangeVariants = cva(\n ['absolute start-0 h-full rounded-full transition-all duration-75 ease-out'],\n {\n variants: {\n variant: {\n default: 'bg-primary-800',\n success: 'bg-green-500',\n warning: 'bg-yellow-500',\n danger: 'bg-red-500',\n neutral: 'bg-neutral-500',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n);\n\nconst sliderThumbVariants = cva(\n [\n 'absolute top-1/2 -translate-y-1/2 -translate-x-1/2 rtl:translate-x-1/2',\n 'rounded-full border-2 bg-white',\n 'shadow-md transition-shadow duration-150',\n 'cursor-grab active:cursor-grabbing',\n 'hover:shadow-lg',\n 'active:shadow-xl active:scale-110',\n 'group-focus-visible:outline-none group-focus-visible:ring-2 group-focus-visible:ring-ring group-focus-visible:ring-offset-2',\n 'group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50',\n ],\n {\n variants: {\n size: {\n sm: 'h-3.5 w-3.5',\n md: 'h-5 w-5',\n lg: 'h-6 w-6',\n },\n variant: {\n default: 'border-primary-500',\n success: 'border-green-500',\n warning: 'border-yellow-500',\n danger: 'border-red-500',\n neutral: 'border-neutral-500',\n },\n },\n defaultVariants: {\n size: 'md',\n variant: 'default',\n },\n }\n);\n\n// ============================================================================\n// Slider Component\n// ============================================================================\n\nexport interface SliderProps\n extends\n VariantProps<typeof sliderTrackVariants>,\n VariantProps<typeof sliderRangeVariants> {\n /** Current value (controlled) */\n value?: number;\n /** Default value (uncontrolled) */\n defaultValue?: number;\n /** Minimum value */\n min?: number;\n /** Maximum value */\n max?: number;\n /** Step increment */\n step?: number;\n /** Callback when value changes */\n onValueChange?: (value: number) => void;\n /** Callback when interaction ends (mouseup / touchend) */\n onValueCommit?: (value: number) => void;\n /** Whether the slider is disabled */\n disabled?: boolean;\n /** Label for the slider */\n label?: string;\n /** Show the current value */\n showValue?: boolean;\n /** Format the displayed value */\n formatValue?: (value: number) => string;\n /** Description text below the label */\n description?: string;\n /** Min label displayed below the track (left) */\n minLabel?: string;\n /** Max label displayed below the track (right) */\n maxLabel?: string;\n /** Additional class name for the root container */\n className?: string;\n /** Additional class name for the track */\n trackClassName?: string;\n /** ID for the underlying input */\n id?: string;\n /** Name for form submission */\n name?: string;\n /** Accessible label for the slider */\n 'aria-label'?: string;\n /** ID of the element that labels the slider */\n 'aria-labelledby'?: string;\n}\n\n/**\n * A fully branded, accessible slider/range input component.\n *\n * Uses brand design tokens for colors, border-radius, and sizing.\n * Supports controlled and uncontrolled usage, labels, descriptions,\n * min/max labels, value display, and multiple color variants.\n *\n * @example\n * ```tsx\n * <Slider label=\"Volume\" min={0} max={100} defaultValue={50} />\n * <Slider\n * label=\"Border Radius\"\n * min={0}\n * max={32}\n * value={radius}\n * onValueChange={setRadius}\n * showValue\n * formatValue={(v) => `${v}px`}\n * minLabel=\"Square\"\n * maxLabel=\"Rounded\"\n * />\n * ```\n */\nconst Slider = React.forwardRef<HTMLInputElement, SliderProps>(\n (\n {\n value: controlledValue,\n defaultValue = 0,\n min = 0,\n max = 100,\n step = 1,\n onValueChange,\n onValueCommit,\n disabled = false,\n label,\n showValue = false,\n formatValue,\n description,\n minLabel,\n maxLabel,\n variant,\n size,\n className,\n trackClassName,\n id,\n name,\n 'aria-label': ariaLabelProp,\n 'aria-labelledby': ariaLabelledByProp,\n },\n ref\n ) => {\n const hasExplicitLabel = !!label;\n const labelId = React.useId();\n const descriptionId = React.useId();\n const ariaLabelledBy =\n ariaLabelledByProp ?? (hasExplicitLabel ? labelId : undefined);\n const ariaDescribedBy = description ? descriptionId : undefined;\n const ariaLabel =\n ariaLabelProp ??\n (!hasExplicitLabel && !ariaLabelledByProp ? 'Slider' : undefined);\n const [uncontrolledValue, setUncontrolledValue] =\n React.useState(defaultValue);\n const isControlled = controlledValue !== undefined;\n const currentValue = isControlled ? controlledValue : uncontrolledValue;\n\n // Clamp value to min/max\n const clampedValue = Math.min(Math.max(currentValue, min), max);\n\n // Percentage for visual fill\n const percentage =\n max !== min ? ((clampedValue - min) / (max - min)) * 100 : 0;\n\n const generatedId = React.useId();\n const inputId = id ?? generatedId;\n\n const trackRef = React.useRef<HTMLDivElement>(null);\n const latestValueRef = React.useRef(clampedValue);\n latestValueRef.current = clampedValue;\n\n const safeStep = step > 0 ? step : 1;\n\n const computeValueFromPointer = React.useCallback(\n (clientX: number) => {\n const track = trackRef.current;\n if (!track) return clampedValue;\n const rect = track.getBoundingClientRect();\n // Value grows toward the inline-end edge: left→right in LTR,\n // right→left in RTL.\n const offset = isRtl(track)\n ? rect.right - clientX\n : clientX - rect.left;\n const ratio = Math.min(Math.max(offset / rect.width, 0), 1);\n const raw = min + ratio * (max - min);\n // Snap to step relative to min\n const stepped = min + Math.round((raw - min) / safeStep) * safeStep;\n return Math.min(Math.max(stepped, min), max);\n },\n [min, max, safeStep, clampedValue]\n );\n\n const setValue = React.useCallback(\n (newValue: number) => {\n latestValueRef.current = newValue;\n if (!isControlled) {\n setUncontrolledValue(newValue);\n }\n onValueChange?.(newValue);\n },\n [isControlled, onValueChange]\n );\n\n const handlePointerDown = React.useCallback(\n (e: React.PointerEvent) => {\n if (disabled) return;\n e.preventDefault();\n (e.currentTarget as HTMLElement).focus();\n (e.target as HTMLElement).setPointerCapture(e.pointerId);\n const newValue = computeValueFromPointer(e.clientX);\n setValue(newValue);\n },\n [disabled, computeValueFromPointer, setValue]\n );\n\n const handlePointerMove = React.useCallback(\n (e: React.PointerEvent) => {\n if (disabled) return;\n if (!(e.target as HTMLElement).hasPointerCapture(e.pointerId)) return;\n const newValue = computeValueFromPointer(e.clientX);\n setValue(newValue);\n },\n [disabled, computeValueFromPointer, setValue]\n );\n\n const handlePointerUp = React.useCallback(\n (e: React.PointerEvent) => {\n if (disabled) return;\n (e.target as HTMLElement).releasePointerCapture(e.pointerId);\n onValueCommit?.(latestValueRef.current);\n },\n [disabled, onValueCommit]\n );\n\n const handleLostPointerCapture = React.useCallback(() => {\n onValueCommit?.(latestValueRef.current);\n }, [onValueCommit]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = parseFloat(e.target.value);\n if (!isControlled) {\n setUncontrolledValue(newValue);\n }\n onValueChange?.(newValue);\n };\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent) => {\n if (disabled) return;\n // Horizontal arrows follow the visual direction: in RTL the slider\n // fills right→left, so ArrowLeft increases and ArrowRight decreases.\n const rtl = isRtl(e.currentTarget);\n let newValue: number | null = null;\n switch (e.key) {\n case 'ArrowRight':\n case 'ArrowLeft': {\n const increase = (e.key === 'ArrowRight') !== rtl;\n newValue = increase\n ? Math.min(clampedValue + safeStep, max)\n : Math.max(clampedValue - safeStep, min);\n break;\n }\n case 'ArrowUp':\n newValue = Math.min(clampedValue + safeStep, max);\n break;\n case 'ArrowDown':\n newValue = Math.max(clampedValue - safeStep, min);\n break;\n case 'Home':\n newValue = min;\n break;\n case 'End':\n newValue = max;\n break;\n default:\n return;\n }\n e.preventDefault();\n setValue(newValue);\n onValueCommit?.(newValue);\n },\n [disabled, clampedValue, safeStep, min, max, setValue, onValueCommit]\n );\n\n const displayValue = formatValue\n ? formatValue(clampedValue)\n : String(clampedValue);\n\n return (\n <div\n data-slot=\"slider\"\n className={cn('relative w-full', className)}\n data-disabled={disabled || undefined}\n >\n {/* Label row */}\n {(label || showValue) && (\n <div\n data-slot=\"slider-label-row\"\n className=\"mb-1.5 flex items-baseline justify-between\"\n >\n {label && (\n <label\n id={labelId}\n htmlFor={inputId}\n data-slot=\"slider-label\"\n className={cn(\n 'text-foreground text-sm font-medium',\n disabled && 'opacity-50'\n )}\n >\n {label}\n {showValue && (\n <span\n data-slot=\"slider-value\"\n className=\"text-muted-foreground ms-1\"\n >\n {displayValue}\n </span>\n )}\n </label>\n )}\n {!label && showValue && (\n <span\n data-slot=\"slider-value\"\n className=\"text-muted-foreground text-sm\"\n >\n {displayValue}\n </span>\n )}\n </div>\n )}\n\n {/* Description */}\n {description && (\n <p\n id={descriptionId}\n data-slot=\"slider-description\"\n className={cn(\n 'text-muted-foreground mb-2 text-xs',\n disabled && 'opacity-50'\n )}\n >\n {description}\n </p>\n )}\n\n {/* Track + Thumb */}\n <div\n ref={trackRef}\n data-slot=\"slider-track-wrapper\"\n className=\"group focus-visible:ring-ring relative rounded py-2 outline-none focus-visible:ring-2 focus-visible:ring-offset-2\"\n style={{ touchAction: disabled ? 'auto' : 'none' }}\n role=\"slider\"\n tabIndex={disabled ? -1 : 0}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={clampedValue}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-describedby={ariaDescribedBy}\n aria-disabled={disabled || undefined}\n data-disabled={disabled || undefined}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onLostPointerCapture={handleLostPointerCapture}\n onKeyDown={handleKeyDown}\n >\n {/* Visual track background */}\n <div\n data-slot=\"slider-track\"\n className={cn(sliderTrackVariants({ size }), trackClassName)}\n >\n {/* Filled range */}\n <div\n data-slot=\"slider-range\"\n className={sliderRangeVariants({ variant })}\n style={{ width: `${percentage}%` }}\n />\n </div>\n\n {/* Thumb indicator */}\n <div\n data-slot=\"slider-thumb\"\n className={sliderThumbVariants({ size, variant })}\n style={{ insetInlineStart: `${percentage}%` }}\n aria-hidden=\"true\"\n />\n </div>\n\n {/* Native range input — for form submission only, rendered outside role=\"slider\" to avoid nested-interactive */}\n <input\n ref={ref}\n type=\"range\"\n className=\"pointer-events-none absolute inset-0 h-full w-full opacity-0\"\n tabIndex={-1}\n aria-hidden=\"true\"\n id={inputId}\n name={name}\n min={min}\n max={max}\n step={step}\n value={clampedValue}\n onChange={handleChange}\n disabled={disabled}\n />\n\n {/* Min / Max labels */}\n {(minLabel || maxLabel) && (\n <div\n data-slot=\"slider-minmax\"\n className={cn(\n 'text-muted-foreground mt-1 flex justify-between text-xs',\n disabled && 'opacity-50'\n )}\n >\n <span>{minLabel}</span>\n <span>{maxLabel}</span>\n </div>\n )}\n </div>\n );\n }\n);\n\nSlider.displayName = 'Slider';\n\nexport {\n Slider,\n sliderTrackVariants,\n sliderRangeVariants,\n sliderThumbVariants,\n};\n"]}
@@ -1,4 +0,0 @@
1
- 'use strict';
2
-
3
- //# sourceMappingURL=chunk-GLXTVCHN.cjs.map
4
- //# sourceMappingURL=chunk-GLXTVCHN.cjs.map