@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 +1 @@
1
- {"version":3,"sources":["../src/components/Modal/Modal.tsx"],"names":["cva","React","useMotionRuntime","useFocusTrap","useEscapeKey","isStorybookDocsMode","jsx","AnimatedPresence","jsxs","Animated","cn"],"mappings":"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","file":"chunk-XEHD2HA5.cjs","sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport { isStorybookDocsMode } from '../../utils/environment';\nimport { useFocusTrap } from '../../hooks/useFocusTrap';\nimport { useEscapeKey } from '../../hooks/useEscapeKey';\nimport { Animated, AnimatedPresence, useMotionRuntime } from '../../motion';\n\n/**\n * Modal scroll lock state manager.\n * Uses a singleton pattern with ref-like storage to track open modals\n * and manage body scroll locking across multiple modal instances.\n * Includes reset capability for testing environments.\n */\nconst scrollLockState = {\n count: 0,\n originalOverflow: null as string | null,\n reset() {\n this.count = 0;\n this.originalOverflow = null;\n },\n};\n\n// Export for testing environments\nexport const __resetScrollLockState = () => scrollLockState.reset();\n\nconst modalOverlayVariants = cva(\n ['fixed inset-0', 'bg-black/50 backdrop-blur-sm'],\n {\n variants: {},\n defaultVariants: {},\n }\n);\n\n/**\n * Entry keyframes for the CSS path only.\n *\n * Kept out of the `cva` base so they never run alongside the motion runtime —\n * both drive opacity and transform, and applied together they fight.\n *\n * Entry only: there is no CSS exit. The component unmounts the moment `open`\n * flips to false, so `data-state` is hardcoded `\"open\"` and closed keyframes\n * would be unreachable dead code. That missing exit is the clearest thing the\n * motion opt-in buys back.\n */\nconst MODAL_OVERLAY_FALLBACK_ANIMATION = 'animate-in fade-in-0';\n\nconst MODAL_CONTENT_FALLBACK_ANIMATION =\n 'duration-200 animate-in fade-in-0 zoom-in-95';\n\nconst modalContentVariants = cva(\n [\n 'relative w-full bg-card text-card-foreground',\n 'border border-border shadow-lg',\n // Full-screen on mobile, rounded on larger screens\n 'rounded-none sm:rounded-xl',\n 'flex flex-col',\n // Full viewport height on mobile, constrained on larger screens\n 'max-h-dvh sm:max-h-[calc(100dvh-2rem)]',\n 'min-h-dvh sm:min-h-0',\n // Full-screen on mobile covers the status bar and home indicator, so\n // clear the safe areas there. Overridable for tests and native shells.\n 'pt-[var(--mieweb-safe-area-top,env(safe-area-inset-top))] sm:pt-0',\n 'pb-[var(--mieweb-safe-area-bottom,env(safe-area-inset-bottom))] sm:pb-0',\n // If a <form> is used as a direct child (wrapping ModalBody + ModalFooter),\n // make it participate in the flex column layout so overflow constraints work.\n '[&>form]:flex [&>form]:flex-col [&>form]:flex-1 [&>form]:min-h-0',\n 'focus:outline-none',\n ],\n {\n variants: {\n size: {\n sm: 'sm:max-w-sm',\n md: 'sm:max-w-md',\n lg: 'sm:max-w-lg',\n xl: 'sm:max-w-xl',\n '2xl': 'sm:max-w-2xl',\n '3xl': 'sm:max-w-3xl',\n '4xl': 'sm:max-w-4xl',\n full: 'max-w-[calc(100vw-2rem)]',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n }\n);\n\nexport interface ModalProps extends VariantProps<typeof modalContentVariants> {\n /** Whether the modal is open */\n open: boolean;\n /** Callback when the modal should close */\n onOpenChange: (open: boolean) => void;\n /** Modal content */\n children: React.ReactNode;\n /** Whether to close when clicking the overlay */\n closeOnOverlayClick?: boolean;\n /** Whether to close when pressing Escape */\n closeOnEscape?: boolean;\n /** Additional class name for the modal content */\n className?: string;\n /** ID for the modal, used for accessibility */\n id?: string;\n /** Accessible label for the modal */\n 'aria-label'?: string;\n /** ID of the element that labels the modal */\n 'aria-labelledby'?: string;\n /** ID of the element that describes the modal */\n 'aria-describedby'?: string;\n}\n\n/**\n * An accessible modal/dialog component.\n *\n * @example\n * ```tsx\n * <Modal open={isOpen} onOpenChange={setIsOpen} size=\"lg\">\n * <ModalHeader>\n * <ModalTitle>Confirm Action</ModalTitle>\n * <ModalClose />\n * </ModalHeader>\n * <ModalBody>\n * Are you sure you want to continue?\n * </ModalBody>\n * <ModalFooter>\n * <Button variant=\"secondary\" onClick={() => setIsOpen(false)}>Cancel</Button>\n * <Button onClick={handleConfirm}>Confirm</Button>\n * </ModalFooter>\n * </Modal>\n * ```\n */\nfunction Modal({\n open,\n onOpenChange,\n children,\n size,\n closeOnOverlayClick = true,\n closeOnEscape = true,\n className,\n id,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n 'aria-describedby': ariaDescribedBy,\n}: ModalProps) {\n const generatedId = React.useId();\n const modalId = id || generatedId;\n\n /*\n * The dialog outlives `open`.\n *\n * With a motion runtime, `AnimatedPresence` keeps the subtree on screen until\n * its exit animation finishes. Guards keyed on `open` alone would therefore\n * release while a `role=\"dialog\" aria-modal=\"true\"` element is still visible:\n * Tab could reach the page behind it and body scrolling would resume under\n * it. `isGuarded` stays true until presence reports the exit is done.\n *\n * Only tracked when a runtime is actually animating. Without one the subtree\n * unmounts on the same frame, and `onExitComplete` would never fire to clear\n * the flag.\n */\n const runtime = useMotionRuntime();\n const animatesExit = Boolean(runtime?.enabled);\n const [isExiting, setIsExiting] = React.useState(false);\n const [prevOpen, setPrevOpen] = React.useState(open);\n\n // Derived synchronously during render (React's \"adjust state when props\n // change\" pattern), not in an effect. An effect runs after commit, which\n // would leave one committed frame with the dialog still on screen but\n // `isGuarded` false — the focus trap would tear down, restore focus, then\n // re-arm and yank focus into the closing dialog, with the scroll lock\n // flickering alongside. Setting state during render re-renders before\n // commit, so the guards never observe the gap.\n if (prevOpen !== open) {\n setPrevOpen(open);\n if (!open && animatesExit) {\n setIsExiting(true);\n }\n }\n\n // If the runtime disappears or is disabled mid-exit, `onExitComplete` will\n // never fire — the subtree is already gone. Without this reset the guards\n // (and the body scroll lock with them) would be held forever.\n React.useEffect(() => {\n if (!animatesExit && isExiting) {\n setIsExiting(false);\n }\n }, [animatesExit, isExiting]);\n\n const isGuarded = open || isExiting;\n\n // Focus trap. Typed as `HTMLElement` because the content element is supplied\n // by `Animated`, which is element-agnostic.\n const focusTrapRef = useFocusTrap<HTMLElement>(isGuarded);\n\n // Handle escape key\n useEscapeKey(() => {\n if (closeOnEscape && open) {\n onOpenChange(false);\n }\n }, open);\n\n // Handle overlay click\n const handleOverlayClick = React.useCallback(\n (e: React.MouseEvent) => {\n if (closeOnOverlayClick && e.target === e.currentTarget) {\n onOpenChange(false);\n }\n },\n [closeOnOverlayClick, onOpenChange]\n );\n\n // Prevent body scroll while the modal is on screen (handles multiple modals).\n // Keyed on `isGuarded`, not `open`, so scrolling does not resume underneath a\n // dialog that is still animating out.\n // Skip scroll lock in Storybook docs mode where multiple stories render inline\n React.useEffect(() => {\n // Skip scroll lock entirely in Storybook docs mode\n if (!isGuarded || isStorybookDocsMode()) {\n return undefined;\n }\n\n scrollLockState.count++;\n // Only capture and set overflow when first modal opens\n if (scrollLockState.count === 1) {\n scrollLockState.originalOverflow = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n }\n\n return () => {\n scrollLockState.count--;\n // Only restore overflow when last modal closes\n if (\n scrollLockState.count === 0 &&\n scrollLockState.originalOverflow !== null\n ) {\n document.body.style.overflow = scrollLockState.originalOverflow;\n scrollLockState.originalOverflow = null;\n }\n };\n }, [isGuarded]);\n\n return (\n <ModalContext.Provider\n value={{ onClose: () => onOpenChange(false), modalId }}\n >\n {/*\n The `open` check lives inside `AnimatedPresence` rather than as an early\n `return null` above. On the CSS path this is identical — the tree\n unmounts immediately. With a motion runtime the subtree is held on\n screen until the overlay and content finish their exit animations.\n */}\n <AnimatedPresence onExitComplete={() => setIsExiting(false)}>\n {open && (\n <div\n key=\"modal-root\"\n data-slot=\"modal-root\"\n className=\"fixed inset-0 z-50\"\n >\n {/* Overlay backdrop */}\n <Animated\n preset=\"overlay\"\n mode=\"presence\"\n className={cn(modalOverlayVariants())}\n fallbackClassName={MODAL_OVERLAY_FALLBACK_ANIMATION}\n data-state=\"open\"\n aria-hidden=\"true\"\n />\n {/* Scrollable centering container — click outside to close */}\n <div className=\"fixed inset-0 overflow-y-auto\">\n {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */}\n <div\n className=\"flex min-h-full items-center justify-center p-0 sm:p-4\"\n onClick={handleOverlayClick}\n >\n {/* Content */}\n <Animated\n ref={focusTrapRef}\n preset=\"modalContent\"\n mode=\"presence\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy || `${modalId}-title`}\n aria-describedby={ariaDescribedBy}\n id={modalId}\n tabIndex={-1}\n data-state=\"open\"\n data-slot=\"modal\"\n className={cn(modalContentVariants({ size }), className)}\n fallbackClassName={MODAL_CONTENT_FALLBACK_ANIMATION}\n onClick={(e) => e.stopPropagation()}\n >\n {children}\n </Animated>\n </div>\n </div>\n </div>\n )}\n </AnimatedPresence>\n </ModalContext.Provider>\n );\n}\n\nModal.displayName = 'Modal';\n\n// ============================================================================\n// Modal Context\n// ============================================================================\n\ninterface ModalContextValue {\n onClose: () => void;\n modalId: string;\n}\n\nconst ModalContext = React.createContext<ModalContextValue | undefined>(\n undefined\n);\n\nfunction useModalContext() {\n const context = React.useContext(ModalContext);\n if (!context) {\n throw new Error('Modal components must be used within a Modal');\n }\n return context;\n}\n\n// ============================================================================\n// Modal Header\n// ============================================================================\n\nexport type ModalHeaderProps = React.HTMLAttributes<HTMLDivElement>;\n\n/**\n * Header section of a Modal.\n */\nconst ModalHeader = React.forwardRef<HTMLDivElement, ModalHeaderProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"modal-header\"\n className={cn(\n 'flex shrink-0 items-center justify-between',\n 'border-border border-b px-6 py-4',\n className\n )}\n {...props}\n />\n )\n);\n\nModalHeader.displayName = 'ModalHeader';\n\n// ============================================================================\n// Modal Title\n// ============================================================================\n\nexport type ModalTitleProps = React.HTMLAttributes<HTMLHeadingElement>;\n\n/**\n * Title for a Modal.\n */\nconst ModalTitle = React.forwardRef<HTMLHeadingElement, ModalTitleProps>(\n ({ className, children, ...props }, ref) => {\n const { modalId } = useModalContext();\n return (\n <h2\n ref={ref}\n id={`${modalId}-title`}\n data-slot=\"modal-title\"\n className={cn(\n 'text-lg leading-none font-semibold tracking-tight',\n className\n )}\n {...props}\n >\n {children}\n </h2>\n );\n }\n);\n\nModalTitle.displayName = 'ModalTitle';\n\n// ============================================================================\n// Modal Close Button\n// ============================================================================\n\nexport type ModalCloseProps = React.ButtonHTMLAttributes<HTMLButtonElement>;\n\n/**\n * Close button for a Modal.\n */\nconst ModalClose = React.forwardRef<HTMLButtonElement, ModalCloseProps>(\n ({ className, children, onClick, ...props }, ref) => {\n const { onClose } = useModalContext();\n\n const handleClick = React.useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e);\n if (!e.defaultPrevented) {\n onClose();\n }\n },\n [onClick, onClose]\n );\n\n return (\n <button\n ref={ref}\n type=\"button\"\n onClick={handleClick}\n data-slot=\"modal-close\"\n className={cn(\n 'inline-flex h-8 w-8 items-center justify-center rounded-lg',\n 'text-muted-foreground hover:text-foreground',\n 'hover:bg-muted transition-colors',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none',\n className\n )}\n aria-label=\"Close\"\n {...props}\n >\n {children || <CloseIcon />}\n </button>\n );\n }\n);\n\nModalClose.displayName = 'ModalClose';\n\n// ============================================================================\n// Modal Body\n// ============================================================================\n\nexport type ModalBodyProps = React.HTMLAttributes<HTMLDivElement>;\n\n/**\n * Main content area of a Modal.\n */\nconst ModalBody = React.forwardRef<HTMLDivElement, ModalBodyProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"modal-body\"\n className={cn('min-h-0 flex-1 overflow-y-auto px-6 py-4', className)}\n {...props}\n />\n )\n);\n\nModalBody.displayName = 'ModalBody';\n\n// ============================================================================\n// Modal Footer\n// ============================================================================\n\nexport type ModalFooterProps = React.HTMLAttributes<HTMLDivElement>;\n\n/**\n * Footer section of a Modal, typically for action buttons.\n */\nconst ModalFooter = React.forwardRef<HTMLDivElement, ModalFooterProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"modal-footer\"\n className={cn(\n 'flex shrink-0 items-center justify-end gap-3',\n 'border-border border-t px-6 py-4',\n className\n )}\n {...props}\n />\n )\n);\n\nModalFooter.displayName = 'ModalFooter';\n\n// ============================================================================\n// Close Icon\n// ============================================================================\n\nfunction CloseIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n );\n}\n\nexport {\n Modal,\n ModalHeader,\n ModalTitle,\n ModalClose,\n ModalBody,\n ModalFooter,\n modalContentVariants,\n modalOverlayVariants,\n};\n"]}
1
+ {"version":3,"sources":["../src/components/Modal/Modal.tsx"],"names":["cva","React","useMotionRuntime","useFocusTrap","useEscapeKey","isStorybookDocsMode","jsx","AnimatedPresence","jsxs","Animated","cn"],"mappings":"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","file":"chunk-FRPELUI5.cjs","sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport { isStorybookDocsMode } from '../../utils/environment';\nimport { useFocusTrap } from '../../hooks/useFocusTrap';\nimport { useEscapeKey } from '../../hooks/useEscapeKey';\nimport { Animated, AnimatedPresence, useMotionRuntime } from '../../motion';\n\n/**\n * Modal scroll lock state manager.\n * Uses a singleton pattern with ref-like storage to track open modals\n * and manage body scroll locking across multiple modal instances.\n * Includes reset capability for testing environments.\n */\nconst scrollLockState = {\n count: 0,\n originalOverflow: null as string | null,\n reset() {\n this.count = 0;\n this.originalOverflow = null;\n },\n};\n\n// Export for testing environments\nexport const __resetScrollLockState = () => scrollLockState.reset();\n\nconst modalOverlayVariants = cva(\n ['fixed inset-0', 'bg-black/50 backdrop-blur-sm'],\n {\n variants: {},\n defaultVariants: {},\n }\n);\n\n/**\n * Entry keyframes for the CSS path only.\n *\n * Kept out of the `cva` base so they never run alongside the motion runtime —\n * both drive opacity and transform, and applied together they fight.\n *\n * Entry only: there is no CSS exit. The component unmounts the moment `open`\n * flips to false, so `data-state` is hardcoded `\"open\"` and closed keyframes\n * would be unreachable dead code. That missing exit is the clearest thing the\n * motion opt-in buys back.\n */\nconst MODAL_OVERLAY_FALLBACK_ANIMATION = 'animate-in fade-in-0';\n\nconst MODAL_CONTENT_FALLBACK_ANIMATION =\n 'duration-200 animate-in fade-in-0 zoom-in-95';\n\nconst modalContentVariants = cva(\n [\n 'relative w-full bg-card text-card-foreground',\n 'border border-border shadow-lg',\n // Full-screen on mobile, rounded on larger screens\n 'rounded-none sm:rounded-xl',\n 'flex flex-col',\n // Full viewport height on mobile, constrained on larger screens\n 'max-h-dvh sm:max-h-[calc(100dvh-2rem)]',\n 'min-h-dvh sm:min-h-0',\n // Full-screen on mobile covers the status bar and home indicator, so\n // clear the safe areas there. Overridable for tests and native shells.\n 'pt-[var(--mieweb-safe-area-top,env(safe-area-inset-top))] sm:pt-0',\n 'pb-[var(--mieweb-safe-area-bottom,env(safe-area-inset-bottom))] sm:pb-0',\n // If a <form> is used as a direct child (wrapping ModalBody + ModalFooter),\n // make it participate in the flex column layout so overflow constraints work.\n '[&>form]:flex [&>form]:flex-col [&>form]:flex-1 [&>form]:min-h-0',\n 'focus:outline-none',\n ],\n {\n variants: {\n size: {\n sm: 'sm:max-w-sm',\n md: 'sm:max-w-md',\n lg: 'sm:max-w-lg',\n xl: 'sm:max-w-xl',\n '2xl': 'sm:max-w-2xl',\n '3xl': 'sm:max-w-3xl',\n '4xl': 'sm:max-w-4xl',\n full: 'max-w-[calc(100vw-2rem)]',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n }\n);\n\nexport interface ModalProps extends VariantProps<typeof modalContentVariants> {\n /** Whether the modal is open */\n open: boolean;\n /** Callback when the modal should close */\n onOpenChange: (open: boolean) => void;\n /** Modal content */\n children: React.ReactNode;\n /** Whether to close when clicking the overlay */\n closeOnOverlayClick?: boolean;\n /** Whether to close when pressing Escape */\n closeOnEscape?: boolean;\n /** Additional class name for the modal content */\n className?: string;\n /** ID for the modal, used for accessibility */\n id?: string;\n /** Accessible label for the modal */\n 'aria-label'?: string;\n /** ID of the element that labels the modal */\n 'aria-labelledby'?: string;\n /** ID of the element that describes the modal */\n 'aria-describedby'?: string;\n}\n\n/**\n * An accessible modal/dialog component.\n *\n * @example\n * ```tsx\n * <Modal open={isOpen} onOpenChange={setIsOpen} size=\"lg\">\n * <ModalHeader>\n * <ModalTitle>Confirm Action</ModalTitle>\n * <ModalClose />\n * </ModalHeader>\n * <ModalBody>\n * Are you sure you want to continue?\n * </ModalBody>\n * <ModalFooter>\n * <Button variant=\"secondary\" onClick={() => setIsOpen(false)}>Cancel</Button>\n * <Button onClick={handleConfirm}>Confirm</Button>\n * </ModalFooter>\n * </Modal>\n * ```\n */\nfunction Modal({\n open,\n onOpenChange,\n children,\n size,\n closeOnOverlayClick = true,\n closeOnEscape = true,\n className,\n id,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n 'aria-describedby': ariaDescribedBy,\n}: ModalProps) {\n const generatedId = React.useId();\n const modalId = id || generatedId;\n\n /*\n * The dialog outlives `open`.\n *\n * With a motion runtime, `AnimatedPresence` keeps the subtree on screen until\n * its exit animation finishes. Guards keyed on `open` alone would therefore\n * release while a `role=\"dialog\" aria-modal=\"true\"` element is still visible:\n * Tab could reach the page behind it and body scrolling would resume under\n * it. `isGuarded` stays true until presence reports the exit is done.\n *\n * Only tracked when a runtime is actually animating. Without one the subtree\n * unmounts on the same frame, and `onExitComplete` would never fire to clear\n * the flag.\n */\n const runtime = useMotionRuntime();\n const animatesExit = Boolean(runtime?.enabled);\n const [isExiting, setIsExiting] = React.useState(false);\n const [prevOpen, setPrevOpen] = React.useState(open);\n\n // Derived synchronously during render (React's \"adjust state when props\n // change\" pattern), not in an effect. An effect runs after commit, which\n // would leave one committed frame with the dialog still on screen but\n // `isGuarded` false — the focus trap would tear down, restore focus, then\n // re-arm and yank focus into the closing dialog, with the scroll lock\n // flickering alongside. Setting state during render re-renders before\n // commit, so the guards never observe the gap.\n if (prevOpen !== open) {\n setPrevOpen(open);\n if (!open && animatesExit) {\n setIsExiting(true);\n }\n }\n\n // If the runtime disappears or is disabled mid-exit, `onExitComplete` will\n // never fire — the subtree is already gone. Without this reset the guards\n // (and the body scroll lock with them) would be held forever.\n React.useEffect(() => {\n if (!animatesExit && isExiting) {\n setIsExiting(false);\n }\n }, [animatesExit, isExiting]);\n\n const isGuarded = open || isExiting;\n\n // Focus trap. Typed as `HTMLElement` because the content element is supplied\n // by `Animated`, which is element-agnostic.\n const focusTrapRef = useFocusTrap<HTMLElement>(isGuarded);\n\n // Handle escape key\n useEscapeKey(() => {\n if (closeOnEscape && open) {\n onOpenChange(false);\n }\n }, open);\n\n // Handle overlay click\n const handleOverlayClick = React.useCallback(\n (e: React.MouseEvent) => {\n if (closeOnOverlayClick && e.target === e.currentTarget) {\n onOpenChange(false);\n }\n },\n [closeOnOverlayClick, onOpenChange]\n );\n\n // Prevent body scroll while the modal is on screen (handles multiple modals).\n // Keyed on `isGuarded`, not `open`, so scrolling does not resume underneath a\n // dialog that is still animating out.\n // Skip scroll lock in Storybook docs mode where multiple stories render inline\n React.useEffect(() => {\n // Skip scroll lock entirely in Storybook docs mode\n if (!isGuarded || isStorybookDocsMode()) {\n return undefined;\n }\n\n scrollLockState.count++;\n // Only capture and set overflow when first modal opens\n if (scrollLockState.count === 1) {\n scrollLockState.originalOverflow = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n }\n\n return () => {\n scrollLockState.count--;\n // Only restore overflow when last modal closes\n if (\n scrollLockState.count === 0 &&\n scrollLockState.originalOverflow !== null\n ) {\n document.body.style.overflow = scrollLockState.originalOverflow;\n scrollLockState.originalOverflow = null;\n }\n };\n }, [isGuarded]);\n\n return (\n <ModalContext.Provider\n value={{ onClose: () => onOpenChange(false), modalId }}\n >\n {/*\n The `open` check lives inside `AnimatedPresence` rather than as an early\n `return null` above. On the CSS path this is identical — the tree\n unmounts immediately. With a motion runtime the subtree is held on\n screen until the overlay and content finish their exit animations.\n */}\n <AnimatedPresence onExitComplete={() => setIsExiting(false)}>\n {open && (\n <div\n key=\"modal-root\"\n data-slot=\"modal-root\"\n className=\"fixed inset-0 z-50\"\n >\n {/* Overlay backdrop */}\n <Animated\n preset=\"overlay\"\n mode=\"presence\"\n className={cn(modalOverlayVariants())}\n fallbackClassName={MODAL_OVERLAY_FALLBACK_ANIMATION}\n data-state=\"open\"\n aria-hidden=\"true\"\n />\n {/* Scrollable centering container — click outside to close */}\n <div className=\"fixed inset-0 overflow-y-auto\">\n {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */}\n <div\n className=\"flex min-h-full items-center justify-center p-0 sm:p-4\"\n onClick={handleOverlayClick}\n >\n {/* Content */}\n <Animated\n ref={focusTrapRef}\n preset=\"modalContent\"\n mode=\"presence\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy || `${modalId}-title`}\n aria-describedby={ariaDescribedBy}\n id={modalId}\n tabIndex={-1}\n data-state=\"open\"\n data-slot=\"modal\"\n className={cn(modalContentVariants({ size }), className)}\n fallbackClassName={MODAL_CONTENT_FALLBACK_ANIMATION}\n onClick={(e) => e.stopPropagation()}\n >\n {children}\n </Animated>\n </div>\n </div>\n </div>\n )}\n </AnimatedPresence>\n </ModalContext.Provider>\n );\n}\n\nModal.displayName = 'Modal';\n\n// ============================================================================\n// Modal Context\n// ============================================================================\n\ninterface ModalContextValue {\n onClose: () => void;\n modalId: string;\n}\n\nconst ModalContext = React.createContext<ModalContextValue | undefined>(\n undefined\n);\n\nfunction useModalContext() {\n const context = React.useContext(ModalContext);\n if (!context) {\n throw new Error('Modal components must be used within a Modal');\n }\n return context;\n}\n\n// ============================================================================\n// Modal Header\n// ============================================================================\n\nexport type ModalHeaderProps = React.HTMLAttributes<HTMLDivElement>;\n\n/**\n * Header section of a Modal.\n */\nconst ModalHeader = React.forwardRef<HTMLDivElement, ModalHeaderProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"modal-header\"\n className={cn(\n 'flex shrink-0 items-center justify-between',\n 'border-border border-b px-6 py-4',\n className\n )}\n {...props}\n />\n )\n);\n\nModalHeader.displayName = 'ModalHeader';\n\n// ============================================================================\n// Modal Title\n// ============================================================================\n\nexport type ModalTitleProps = React.HTMLAttributes<HTMLHeadingElement>;\n\n/**\n * Title for a Modal.\n */\nconst ModalTitle = React.forwardRef<HTMLHeadingElement, ModalTitleProps>(\n ({ className, children, ...props }, ref) => {\n const { modalId } = useModalContext();\n return (\n <h2\n ref={ref}\n id={`${modalId}-title`}\n data-slot=\"modal-title\"\n className={cn(\n 'text-lg leading-none font-semibold tracking-tight',\n className\n )}\n {...props}\n >\n {children}\n </h2>\n );\n }\n);\n\nModalTitle.displayName = 'ModalTitle';\n\n// ============================================================================\n// Modal Close Button\n// ============================================================================\n\nexport type ModalCloseProps = React.ButtonHTMLAttributes<HTMLButtonElement>;\n\n/**\n * Close button for a Modal.\n */\nconst ModalClose = React.forwardRef<HTMLButtonElement, ModalCloseProps>(\n ({ className, children, onClick, ...props }, ref) => {\n const { onClose } = useModalContext();\n\n const handleClick = React.useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e);\n if (!e.defaultPrevented) {\n onClose();\n }\n },\n [onClick, onClose]\n );\n\n return (\n <button\n ref={ref}\n type=\"button\"\n onClick={handleClick}\n data-slot=\"modal-close\"\n className={cn(\n 'inline-flex h-8 w-8 items-center justify-center rounded-lg',\n 'text-muted-foreground hover:text-foreground',\n 'hover:bg-muted transition-colors',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none',\n className\n )}\n aria-label=\"Close\"\n {...props}\n >\n {children || <CloseIcon />}\n </button>\n );\n }\n);\n\nModalClose.displayName = 'ModalClose';\n\n// ============================================================================\n// Modal Body\n// ============================================================================\n\nexport type ModalBodyProps = React.HTMLAttributes<HTMLDivElement>;\n\n/**\n * Main content area of a Modal.\n */\nconst ModalBody = React.forwardRef<HTMLDivElement, ModalBodyProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"modal-body\"\n className={cn('min-h-0 flex-1 overflow-y-auto px-6 py-4', className)}\n {...props}\n />\n )\n);\n\nModalBody.displayName = 'ModalBody';\n\n// ============================================================================\n// Modal Footer\n// ============================================================================\n\nexport type ModalFooterProps = React.HTMLAttributes<HTMLDivElement>;\n\n/**\n * Footer section of a Modal, typically for action buttons.\n */\nconst ModalFooter = React.forwardRef<HTMLDivElement, ModalFooterProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"modal-footer\"\n className={cn(\n 'flex shrink-0 items-center justify-end gap-3',\n 'border-border border-t px-6 py-4',\n className\n )}\n {...props}\n />\n )\n);\n\nModalFooter.displayName = 'ModalFooter';\n\n// ============================================================================\n// Close Icon\n// ============================================================================\n\nfunction CloseIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n );\n}\n\nexport {\n Modal,\n ModalHeader,\n ModalTitle,\n ModalClose,\n ModalBody,\n ModalFooter,\n modalContentVariants,\n modalOverlayVariants,\n};\n"]}
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=chunk-G4VQEQGW.js.map
3
+ //# sourceMappingURL=chunk-G4VQEQGW.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-RISZWWEQ.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-G4VQEQGW.js"}
@@ -1,12 +1,12 @@
1
1
  'use strict';
2
2
 
3
- var chunkGDKOYVX3_cjs = require('./chunk-GDKOYVX3.cjs');
4
- var chunkECKIFQSD_cjs = require('./chunk-ECKIFQSD.cjs');
3
+ var chunkTZKBW4GA_cjs = require('./chunk-TZKBW4GA.cjs');
4
+ var chunkNZUQL42A_cjs = require('./chunk-NZUQL42A.cjs');
5
5
  var chunkGM376OD6_cjs = require('./chunk-GM376OD6.cjs');
6
6
  var chunk4UDEMJE4_cjs = require('./chunk-4UDEMJE4.cjs');
7
7
  var chunkUPWIJC6I_cjs = require('./chunk-UPWIJC6I.cjs');
8
8
  var chunk7AECNMYV_cjs = require('./chunk-7AECNMYV.cjs');
9
- var chunkXEHD2HA5_cjs = require('./chunk-XEHD2HA5.cjs');
9
+ var chunkFRPELUI5_cjs = require('./chunk-FRPELUI5.cjs');
10
10
  var chunkZ5S5JEJD_cjs = require('./chunk-Z5S5JEJD.cjs');
11
11
  var chunkZ3WMDVMR_cjs = require('./chunk-Z3WMDVMR.cjs');
12
12
  var chunkFSARTLUE_cjs = require('./chunk-FSARTLUE.cjs');
@@ -167,7 +167,7 @@ var FillerWordsModal = ({
167
167
  );
168
168
  };
169
169
  return /* @__PURE__ */ jsxRuntime.jsxs(
170
- chunkXEHD2HA5_cjs.Modal,
170
+ chunkFRPELUI5_cjs.Modal,
171
171
  {
172
172
  open: isOpen,
173
173
  onOpenChange: (open) => {
@@ -175,11 +175,11 @@ var FillerWordsModal = ({
175
175
  },
176
176
  size: "lg",
177
177
  children: [
178
- /* @__PURE__ */ jsxRuntime.jsxs(chunkXEHD2HA5_cjs.ModalHeader, { children: [
179
- /* @__PURE__ */ jsxRuntime.jsx(chunkXEHD2HA5_cjs.ModalTitle, { children: "Remove Filler Words" }),
180
- /* @__PURE__ */ jsxRuntime.jsx(chunkXEHD2HA5_cjs.ModalClose, { "aria-label": "Close modal" })
178
+ /* @__PURE__ */ jsxRuntime.jsxs(chunkFRPELUI5_cjs.ModalHeader, { children: [
179
+ /* @__PURE__ */ jsxRuntime.jsx(chunkFRPELUI5_cjs.ModalTitle, { children: "Remove Filler Words" }),
180
+ /* @__PURE__ */ jsxRuntime.jsx(chunkFRPELUI5_cjs.ModalClose, { "aria-label": "Close modal" })
181
181
  ] }),
182
- /* @__PURE__ */ jsxRuntime.jsxs(chunkXEHD2HA5_cjs.ModalBody, { className: "flex flex-col gap-3", children: [
182
+ /* @__PURE__ */ jsxRuntime.jsxs(chunkFRPELUI5_cjs.ModalBody, { className: "flex flex-col gap-3", children: [
183
183
  /* @__PURE__ */ jsxRuntime.jsx(
184
184
  chunkZ5S5JEJD_cjs.Input,
185
185
  {
@@ -259,7 +259,7 @@ var FillerWordsModal = ({
259
259
  )
260
260
  ] })
261
261
  ] }),
262
- /* @__PURE__ */ jsxRuntime.jsxs(chunkXEHD2HA5_cjs.ModalFooter, { className: "justify-between", children: [
262
+ /* @__PURE__ */ jsxRuntime.jsxs(chunkFRPELUI5_cjs.ModalFooter, { className: "justify-between", children: [
263
263
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-muted-foreground text-sm", children: [
264
264
  totalMatches,
265
265
  " items \u2022 saves ",
@@ -373,7 +373,7 @@ var WordEditorModal = ({
373
373
  const preview = isSilence ? parseSilenceSplit(inputValue) : null;
374
374
  const applyDisabled = isSilence ? !inputValue.trim() || !!preview?.error || !preview || preview.durations.length === 0 : !inputValue.trim();
375
375
  return /* @__PURE__ */ jsxRuntime.jsxs(
376
- chunkXEHD2HA5_cjs.Modal,
376
+ chunkFRPELUI5_cjs.Modal,
377
377
  {
378
378
  open: isOpen && editableWord !== null,
379
379
  onOpenChange: (open) => {
@@ -381,11 +381,11 @@ var WordEditorModal = ({
381
381
  },
382
382
  size: "md",
383
383
  children: [
384
- /* @__PURE__ */ jsxRuntime.jsxs(chunkXEHD2HA5_cjs.ModalHeader, { children: [
385
- /* @__PURE__ */ jsxRuntime.jsx(chunkXEHD2HA5_cjs.ModalTitle, { children: isSilence ? "Split Silence" : "Edit Word" }),
386
- /* @__PURE__ */ jsxRuntime.jsx(chunkXEHD2HA5_cjs.ModalClose, { "aria-label": "Close editor" })
384
+ /* @__PURE__ */ jsxRuntime.jsxs(chunkFRPELUI5_cjs.ModalHeader, { children: [
385
+ /* @__PURE__ */ jsxRuntime.jsx(chunkFRPELUI5_cjs.ModalTitle, { children: isSilence ? "Split Silence" : "Edit Word" }),
386
+ /* @__PURE__ */ jsxRuntime.jsx(chunkFRPELUI5_cjs.ModalClose, { "aria-label": "Close editor" })
387
387
  ] }),
388
- /* @__PURE__ */ jsxRuntime.jsx(chunkXEHD2HA5_cjs.ModalBody, { className: "flex flex-col gap-2", children: isSilence ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
388
+ /* @__PURE__ */ jsxRuntime.jsx(chunkFRPELUI5_cjs.ModalBody, { className: "flex flex-col gap-2", children: isSilence ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
389
389
  /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-foreground m-0 text-sm", children: [
390
390
  "Silence duration:",
391
391
  " ",
@@ -431,7 +431,7 @@ var WordEditorModal = ({
431
431
  }
432
432
  )
433
433
  ] }) }),
434
- /* @__PURE__ */ jsxRuntime.jsxs(chunkXEHD2HA5_cjs.ModalFooter, { className: "justify-between", children: [
434
+ /* @__PURE__ */ jsxRuntime.jsxs(chunkFRPELUI5_cjs.ModalFooter, { className: "justify-between", children: [
435
435
  /* @__PURE__ */ jsxRuntime.jsx(
436
436
  chunkFSARTLUE_cjs.Button,
437
437
  {
@@ -488,7 +488,7 @@ var SilenceSettingsModal = ({
488
488
  };
489
489
  const formatSeconds = (v) => `${v.toFixed(1)}s`;
490
490
  return /* @__PURE__ */ jsxRuntime.jsxs(
491
- chunkXEHD2HA5_cjs.Modal,
491
+ chunkFRPELUI5_cjs.Modal,
492
492
  {
493
493
  open: isOpen,
494
494
  onOpenChange: (open) => {
@@ -496,14 +496,14 @@ var SilenceSettingsModal = ({
496
496
  },
497
497
  size: "md",
498
498
  children: [
499
- /* @__PURE__ */ jsxRuntime.jsxs(chunkXEHD2HA5_cjs.ModalHeader, { children: [
500
- /* @__PURE__ */ jsxRuntime.jsx(chunkXEHD2HA5_cjs.ModalTitle, { children: "Silence Settings" }),
501
- /* @__PURE__ */ jsxRuntime.jsx(chunkXEHD2HA5_cjs.ModalClose, { "aria-label": "Close modal" })
499
+ /* @__PURE__ */ jsxRuntime.jsxs(chunkFRPELUI5_cjs.ModalHeader, { children: [
500
+ /* @__PURE__ */ jsxRuntime.jsx(chunkFRPELUI5_cjs.ModalTitle, { children: "Silence Settings" }),
501
+ /* @__PURE__ */ jsxRuntime.jsx(chunkFRPELUI5_cjs.ModalClose, { "aria-label": "Close modal" })
502
502
  ] }),
503
- /* @__PURE__ */ jsxRuntime.jsxs(chunkXEHD2HA5_cjs.ModalBody, { className: "flex flex-col gap-6", children: [
503
+ /* @__PURE__ */ jsxRuntime.jsxs(chunkFRPELUI5_cjs.ModalBody, { className: "flex flex-col gap-6", children: [
504
504
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
505
505
  /* @__PURE__ */ jsxRuntime.jsx(
506
- chunkGDKOYVX3_cjs.Slider,
506
+ chunkNZUQL42A_cjs.Slider,
507
507
  {
508
508
  label: "Minimum silence duration",
509
509
  min: 0.1,
@@ -520,7 +520,7 @@ var SilenceSettingsModal = ({
520
520
  ] }),
521
521
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
522
522
  /* @__PURE__ */ jsxRuntime.jsx(
523
- chunkGDKOYVX3_cjs.Slider,
523
+ chunkNZUQL42A_cjs.Slider,
524
524
  {
525
525
  label: "Paragraph break threshold",
526
526
  min: threshold,
@@ -536,7 +536,7 @@ var SilenceSettingsModal = ({
536
536
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground m-0 text-xs", children: "Silences longer than this will create paragraph breaks." })
537
537
  ] })
538
538
  ] }),
539
- /* @__PURE__ */ jsxRuntime.jsxs(chunkXEHD2HA5_cjs.ModalFooter, { children: [
539
+ /* @__PURE__ */ jsxRuntime.jsxs(chunkFRPELUI5_cjs.ModalFooter, { children: [
540
540
  /* @__PURE__ */ jsxRuntime.jsx(chunkFSARTLUE_cjs.Button, { variant: "secondary", size: "sm", onClick: onClose, children: "Cancel" }),
541
541
  /* @__PURE__ */ jsxRuntime.jsx(chunkFSARTLUE_cjs.Button, { variant: "primary", size: "sm", onClick: handleApply, children: "Apply" })
542
542
  ] })
@@ -1733,7 +1733,7 @@ var MediaEditor = React6__namespace.forwardRef(
1733
1733
  {
1734
1734
  className: `border-border bg-background flex min-h-0 shrink-0 ${splitLayout === "vertical" ? "max-h-[55dvh] md:max-h-none md:w-1/2 md:border-e" : "max-h-[55dvh] border-b md:max-h-[50%]"}`,
1735
1735
  children: /* @__PURE__ */ jsxRuntime.jsx(
1736
- chunkECKIFQSD_cjs.MediaPlayer,
1736
+ chunkTZKBW4GA_cjs.MediaPlayer,
1737
1737
  {
1738
1738
  ref: playerRef,
1739
1739
  src,
@@ -2032,5 +2032,5 @@ exports.MediaEditor = MediaEditor;
2032
2032
  exports.SilenceSettingsModal = SilenceSettingsModal;
2033
2033
  exports.SpeedMarkerMenu = SpeedMarkerMenu;
2034
2034
  exports.WordEditorModal = WordEditorModal;
2035
- //# sourceMappingURL=chunk-3O3Q3DX7.cjs.map
2036
- //# sourceMappingURL=chunk-3O3Q3DX7.cjs.map
2035
+ //# sourceMappingURL=chunk-GG3IK5TL.cjs.map
2036
+ //# sourceMappingURL=chunk-GG3IK5TL.cjs.map