@mieweb/ui 0.10.0-dev.16 → 0.10.0-dev.18

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 (172) hide show
  1. package/dist/CsvBlock-FX5YNGNE.cjs +17 -0
  2. package/dist/{CsvBlock-FVOKKWIY.cjs.map → CsvBlock-FX5YNGNE.cjs.map} +1 -1
  3. package/dist/CsvBlock-VLMG7GUO.js +8 -0
  4. package/dist/{CsvBlock-MXZO4W3N.js.map → CsvBlock-VLMG7GUO.js.map} +1 -1
  5. package/dist/HtmlPreviewBlock-5JE7L3GR.js +8 -0
  6. package/dist/{HtmlPreviewBlock-2UGW33SQ.js.map → HtmlPreviewBlock-5JE7L3GR.js.map} +1 -1
  7. package/dist/HtmlPreviewBlock-UO37JQ3K.cjs +17 -0
  8. package/dist/{HtmlPreviewBlock-CZKTQUCL.cjs.map → HtmlPreviewBlock-UO37JQ3K.cjs.map} +1 -1
  9. package/dist/MermaidBlock-3XHFBAMV.js +8 -0
  10. package/dist/{MermaidBlock-QXAEMOAA.js.map → MermaidBlock-3XHFBAMV.js.map} +1 -1
  11. package/dist/MermaidBlock-RZ75RPZA.cjs +17 -0
  12. package/dist/{MermaidBlock-NLDOJZUJ.cjs.map → MermaidBlock-RZ75RPZA.cjs.map} +1 -1
  13. package/dist/SurveyBlock-MUVJ3JUI.js +8 -0
  14. package/dist/{SurveyBlock-M5BEFZGT.js.map → SurveyBlock-MUVJ3JUI.js.map} +1 -1
  15. package/dist/SurveyBlock-VH47YXZC.cjs +17 -0
  16. package/dist/{SurveyBlock-GSHYZMTW.cjs.map → SurveyBlock-VH47YXZC.cjs.map} +1 -1
  17. package/dist/{chunk-77PNQILS.js → chunk-2BARVD4C.js} +3 -3
  18. package/dist/{chunk-77PNQILS.js.map → chunk-2BARVD4C.js.map} +1 -1
  19. package/dist/{chunk-IUQMOBFB.cjs → chunk-3KPDQG5O.cjs} +5 -5
  20. package/dist/{chunk-IUQMOBFB.cjs.map → chunk-3KPDQG5O.cjs.map} +1 -1
  21. package/dist/{chunk-OWLWABAS.js → chunk-4HC2IBOX.js} +3 -3
  22. package/dist/{chunk-OWLWABAS.js.map → chunk-4HC2IBOX.js.map} +1 -1
  23. package/dist/{chunk-R5AFQWR5.js → chunk-673GMFA6.js} +3 -3
  24. package/dist/{chunk-R5AFQWR5.js.map → chunk-673GMFA6.js.map} +1 -1
  25. package/dist/{chunk-UV4IJNSN.js → chunk-7YO7DNUV.js} +3 -3
  26. package/dist/{chunk-UV4IJNSN.js.map → chunk-7YO7DNUV.js.map} +1 -1
  27. package/dist/{chunk-XU2E7MTG.js → chunk-DSB4DKWG.js} +7 -7
  28. package/dist/{chunk-XU2E7MTG.js.map → chunk-DSB4DKWG.js.map} +1 -1
  29. package/dist/{chunk-XFLEW7AT.cjs → chunk-DXEPYK3I.cjs} +8 -4
  30. package/dist/chunk-DXEPYK3I.cjs.map +1 -0
  31. package/dist/{chunk-IBCCFWD4.js → chunk-EK3BCET6.js} +7 -2
  32. package/dist/chunk-EK3BCET6.js.map +1 -0
  33. package/dist/{chunk-WN6A4QOF.js → chunk-FBLVPM2K.js} +3 -3
  34. package/dist/{chunk-WN6A4QOF.js.map → chunk-FBLVPM2K.js.map} +1 -1
  35. package/dist/{chunk-CATY3P2U.js → chunk-FIKO4WR6.js} +3 -3
  36. package/dist/{chunk-CATY3P2U.js.map → chunk-FIKO4WR6.js.map} +1 -1
  37. package/dist/{chunk-FDP6VS5G.js → chunk-FZURBQJ2.js} +3 -3
  38. package/dist/{chunk-FDP6VS5G.js.map → chunk-FZURBQJ2.js.map} +1 -1
  39. package/dist/{chunk-LENW5YOC.js → chunk-GBUVIGD5.js} +46 -17
  40. package/dist/chunk-GBUVIGD5.js.map +1 -0
  41. package/dist/{chunk-O5A4GTTG.cjs → chunk-GU5OS7JJ.cjs} +4 -4
  42. package/dist/{chunk-O5A4GTTG.cjs.map → chunk-GU5OS7JJ.cjs.map} +1 -1
  43. package/dist/{chunk-YEQLSYJO.cjs → chunk-GVBHDRC7.cjs} +5 -5
  44. package/dist/{chunk-YEQLSYJO.cjs.map → chunk-GVBHDRC7.cjs.map} +1 -1
  45. package/dist/{chunk-W5TPBCBM.js → chunk-GVLNXPJX.js} +4 -4
  46. package/dist/{chunk-W5TPBCBM.js.map → chunk-GVLNXPJX.js.map} +1 -1
  47. package/dist/{chunk-AXRRBEER.js → chunk-GVM6DTR5.js} +8 -4
  48. package/dist/chunk-GVM6DTR5.js.map +1 -0
  49. package/dist/{chunk-UKUKBUME.cjs → chunk-GYXUS65N.cjs} +5 -5
  50. package/dist/{chunk-UKUKBUME.cjs.map → chunk-GYXUS65N.cjs.map} +1 -1
  51. package/dist/{chunk-R47H3Y7J.js → chunk-H2IAMSHK.js} +3 -3
  52. package/dist/{chunk-R47H3Y7J.js.map → chunk-H2IAMSHK.js.map} +1 -1
  53. package/dist/{chunk-KM5OQQL5.cjs → chunk-HIZWOAWY.cjs} +8 -8
  54. package/dist/{chunk-KM5OQQL5.cjs.map → chunk-HIZWOAWY.cjs.map} +1 -1
  55. package/dist/{chunk-6GZKQR7P.cjs → chunk-I4LXSHKO.cjs} +4 -4
  56. package/dist/{chunk-6GZKQR7P.cjs.map → chunk-I4LXSHKO.cjs.map} +1 -1
  57. package/dist/{chunk-4LPGJ3ZO.js → chunk-IYWG72DM.js} +4 -4
  58. package/dist/{chunk-4LPGJ3ZO.js.map → chunk-IYWG72DM.js.map} +1 -1
  59. package/dist/{chunk-OZ2LP2VQ.cjs → chunk-JELTRRR5.cjs} +9 -9
  60. package/dist/{chunk-OZ2LP2VQ.cjs.map → chunk-JELTRRR5.cjs.map} +1 -1
  61. package/dist/{chunk-DXCATYEO.js → chunk-K2K2HP35.js} +3 -3
  62. package/dist/{chunk-DXCATYEO.js.map → chunk-K2K2HP35.js.map} +1 -1
  63. package/dist/{chunk-M5NYHH3Z.cjs → chunk-KDW6BD4O.cjs} +4 -4
  64. package/dist/{chunk-M5NYHH3Z.cjs.map → chunk-KDW6BD4O.cjs.map} +1 -1
  65. package/dist/{chunk-VNCIIXGO.js → chunk-KHSFJTEX.js} +3 -3
  66. package/dist/{chunk-VNCIIXGO.js.map → chunk-KHSFJTEX.js.map} +1 -1
  67. package/dist/{chunk-DF7K6DOJ.cjs → chunk-LFPJ3OUM.cjs} +5 -5
  68. package/dist/{chunk-DF7K6DOJ.cjs.map → chunk-LFPJ3OUM.cjs.map} +1 -1
  69. package/dist/{chunk-X2PPZJSL.cjs → chunk-LHBWRMNC.cjs} +46 -16
  70. package/dist/chunk-LHBWRMNC.cjs.map +1 -0
  71. package/dist/{chunk-JX4UZEBZ.cjs → chunk-MQPG3KVK.cjs} +8 -8
  72. package/dist/{chunk-JX4UZEBZ.cjs.map → chunk-MQPG3KVK.cjs.map} +1 -1
  73. package/dist/{chunk-VLBUT2QM.cjs → chunk-N2CJJHHB.cjs} +4 -4
  74. package/dist/{chunk-VLBUT2QM.cjs.map → chunk-N2CJJHHB.cjs.map} +1 -1
  75. package/dist/{chunk-MB5KIIT4.cjs → chunk-N7C4OEP7.cjs} +6 -6
  76. package/dist/{chunk-MB5KIIT4.cjs.map → chunk-N7C4OEP7.cjs.map} +1 -1
  77. package/dist/{chunk-LGIQVSAE.cjs → chunk-NUQSQRG3.cjs} +16 -16
  78. package/dist/{chunk-LGIQVSAE.cjs.map → chunk-NUQSQRG3.cjs.map} +1 -1
  79. package/dist/{chunk-ETCHEURD.js → chunk-OYBJQBLO.js} +4 -4
  80. package/dist/{chunk-ETCHEURD.js.map → chunk-OYBJQBLO.js.map} +1 -1
  81. package/dist/{chunk-VPRKE2YU.cjs → chunk-P5CMZZRZ.cjs} +5 -5
  82. package/dist/{chunk-VPRKE2YU.cjs.map → chunk-P5CMZZRZ.cjs.map} +1 -1
  83. package/dist/{chunk-NEFBVO5W.cjs → chunk-QNDP6PE5.cjs} +7 -2
  84. package/dist/chunk-QNDP6PE5.cjs.map +1 -0
  85. package/dist/{chunk-WBBOH5QF.js → chunk-QOVJ6Z6R.js} +3 -3
  86. package/dist/{chunk-WBBOH5QF.js.map → chunk-QOVJ6Z6R.js.map} +1 -1
  87. package/dist/{chunk-4IETGCMD.js → chunk-R6KPWIGO.js} +4 -4
  88. package/dist/{chunk-4IETGCMD.js.map → chunk-R6KPWIGO.js.map} +1 -1
  89. package/dist/{chunk-GRV4MOEO.cjs → chunk-SVXWO37F.cjs} +26 -26
  90. package/dist/{chunk-GRV4MOEO.cjs.map → chunk-SVXWO37F.cjs.map} +1 -1
  91. package/dist/{chunk-T7U5HHGK.js → chunk-THLIL6PY.js} +3 -3
  92. package/dist/{chunk-T7U5HHGK.js.map → chunk-THLIL6PY.js.map} +1 -1
  93. package/dist/{chunk-PLDJU623.cjs → chunk-TTSSUOEV.cjs} +8 -8
  94. package/dist/{chunk-PLDJU623.cjs.map → chunk-TTSSUOEV.cjs.map} +1 -1
  95. package/dist/{chunk-E2B5BLAF.cjs → chunk-TYE5K5WV.cjs} +4 -4
  96. package/dist/{chunk-E2B5BLAF.cjs.map → chunk-TYE5K5WV.cjs.map} +1 -1
  97. package/dist/{chunk-YIWJTNR5.cjs → chunk-WCDJFMZO.cjs} +7 -7
  98. package/dist/{chunk-YIWJTNR5.cjs.map → chunk-WCDJFMZO.cjs.map} +1 -1
  99. package/dist/{chunk-EQXFDPXV.cjs → chunk-X5KAO35W.cjs} +14 -14
  100. package/dist/{chunk-EQXFDPXV.cjs.map → chunk-X5KAO35W.cjs.map} +1 -1
  101. package/dist/{chunk-2BGS7RFM.cjs → chunk-X6A27RGO.cjs} +4 -4
  102. package/dist/{chunk-2BGS7RFM.cjs.map → chunk-X6A27RGO.cjs.map} +1 -1
  103. package/dist/{chunk-7U5QYH54.js → chunk-XBTKZCZF.js} +3 -3
  104. package/dist/{chunk-7U5QYH54.js.map → chunk-XBTKZCZF.js.map} +1 -1
  105. package/dist/{chunk-TVSGJT6G.cjs → chunk-Y4E2WRUR.cjs} +6 -6
  106. package/dist/{chunk-TVSGJT6G.cjs.map → chunk-Y4E2WRUR.cjs.map} +1 -1
  107. package/dist/{chunk-UXI33QGR.js → chunk-YIV4Y4SK.js} +3 -3
  108. package/dist/{chunk-UXI33QGR.js.map → chunk-YIV4Y4SK.js.map} +1 -1
  109. package/dist/{chunk-VVZALGPI.js → chunk-YU55JD35.js} +3 -3
  110. package/dist/{chunk-VVZALGPI.js.map → chunk-YU55JD35.js.map} +1 -1
  111. package/dist/{chunk-WC25GQZD.js → chunk-ZYL4SNOR.js} +3 -3
  112. package/dist/{chunk-WC25GQZD.js.map → chunk-ZYL4SNOR.js.map} +1 -1
  113. package/dist/components/AlertDialog/index.cjs +4 -4
  114. package/dist/components/AlertDialog/index.js +3 -3
  115. package/dist/components/Button/index.cjs +4 -4
  116. package/dist/components/Button/index.js +2 -2
  117. package/dist/components/CalendarView/index.cjs +5 -5
  118. package/dist/components/CalendarView/index.js +3 -3
  119. package/dist/components/CustomizableDashboard/index.cjs +10 -10
  120. package/dist/components/CustomizableDashboard/index.js +3 -3
  121. package/dist/components/FloatingWindow/index.cjs +5 -5
  122. package/dist/components/FloatingWindow/index.js +3 -3
  123. package/dist/components/ListView/index.cjs +5 -5
  124. package/dist/components/ListView/index.js +3 -3
  125. package/dist/components/Markdown/index.cjs +17 -17
  126. package/dist/components/Markdown/index.js +8 -8
  127. package/dist/components/MediaEditor/index.cjs +9 -9
  128. package/dist/components/MediaEditor/index.js +4 -4
  129. package/dist/components/MediaPlayer/index.cjs +6 -6
  130. package/dist/components/MediaPlayer/index.js +3 -3
  131. package/dist/components/MegaMenu/index.cjs +6 -6
  132. package/dist/components/MegaMenu/index.js +3 -3
  133. package/dist/components/RadialExplorer/index.cjs +4 -4
  134. package/dist/components/RadialExplorer/index.js +3 -3
  135. package/dist/components/RichTextEditor/index.cjs +6 -6
  136. package/dist/components/RichTextEditor/index.js +3 -3
  137. package/dist/components/SectionSpyNav/index.cjs +4 -4
  138. package/dist/components/SectionSpyNav/index.js +3 -3
  139. package/dist/components/ViewSet/index.cjs +6 -6
  140. package/dist/components/ViewSet/index.js +5 -5
  141. package/dist/datavis.cjs +3 -3
  142. package/dist/datavis.js +2 -2
  143. package/dist/esheet.cjs +6 -6
  144. package/dist/esheet.js +3 -3
  145. package/dist/hooks/index.cjs +22 -18
  146. package/dist/hooks/index.d.cts +53 -2
  147. package/dist/hooks/index.d.ts +53 -2
  148. package/dist/hooks/index.js +1 -1
  149. package/dist/index.cjs +360 -356
  150. package/dist/index.d.cts +53 -2
  151. package/dist/index.d.ts +53 -2
  152. package/dist/index.js +30 -30
  153. package/dist/styles.css +1 -1
  154. package/dist/tailwind-preset.cjs +4 -4
  155. package/dist/tailwind-preset.js +1 -1
  156. package/dist/templates.cjs +24 -24
  157. package/dist/templates.js +2 -2
  158. package/package.json +1 -1
  159. package/dist/CsvBlock-FVOKKWIY.cjs +0 -17
  160. package/dist/CsvBlock-MXZO4W3N.js +0 -8
  161. package/dist/HtmlPreviewBlock-2UGW33SQ.js +0 -8
  162. package/dist/HtmlPreviewBlock-CZKTQUCL.cjs +0 -17
  163. package/dist/MermaidBlock-NLDOJZUJ.cjs +0 -17
  164. package/dist/MermaidBlock-QXAEMOAA.js +0 -8
  165. package/dist/SurveyBlock-GSHYZMTW.cjs +0 -17
  166. package/dist/SurveyBlock-M5BEFZGT.js +0 -8
  167. package/dist/chunk-AXRRBEER.js.map +0 -1
  168. package/dist/chunk-IBCCFWD4.js.map +0 -1
  169. package/dist/chunk-LENW5YOC.js.map +0 -1
  170. package/dist/chunk-NEFBVO5W.cjs.map +0 -1
  171. package/dist/chunk-X2PPZJSL.cjs.map +0 -1
  172. package/dist/chunk-XFLEW7AT.cjs.map +0 -1
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkXFLEW7AT_cjs = require('./chunk-XFLEW7AT.cjs');
3
+ var chunkDXEPYK3I_cjs = require('./chunk-DXEPYK3I.cjs');
4
4
  var chunkS5RVSXDV_cjs = require('./chunk-S5RVSXDV.cjs');
5
5
  var React = require('react');
6
6
  var lucideReact = require('lucide-react');
@@ -262,7 +262,7 @@ function MegaMenu({
262
262
  {
263
263
  href: menu.ctaHref,
264
264
  onClick: navigate,
265
- className: chunkXFLEW7AT_cjs.buttonVariants({ size: "sm", effect: "sheen" }),
265
+ className: chunkDXEPYK3I_cjs.buttonVariants({ size: "sm", effect: "sheen" }),
266
266
  children: menu.ctaLabel ?? "Get started"
267
267
  }
268
268
  )
@@ -388,7 +388,7 @@ function FeaturedPanel({
388
388
  href: featured.ctaHref,
389
389
  onClick: onNavigate,
390
390
  className: chunkS5RVSXDV_cjs.cn(
391
- chunkXFLEW7AT_cjs.buttonVariants({ variant: "outline", effect: "sheen" }),
391
+ chunkDXEPYK3I_cjs.buttonVariants({ variant: "outline", effect: "sheen" }),
392
392
  onDark && "border-white/40 text-white hover:border-white hover:bg-white/10 hover:text-white dark:border-white/40 dark:text-white dark:hover:border-white dark:hover:bg-white/10"
393
393
  ),
394
394
  children: [
@@ -432,5 +432,5 @@ function MegaMenuBar({
432
432
  exports.MegaMenu = MegaMenu;
433
433
  exports.MegaMenuBar = MegaMenuBar;
434
434
  exports.normalizePath = normalizePath;
435
- //# sourceMappingURL=chunk-VPRKE2YU.cjs.map
436
- //# sourceMappingURL=chunk-VPRKE2YU.cjs.map
435
+ //# sourceMappingURL=chunk-P5CMZZRZ.cjs.map
436
+ //# sourceMappingURL=chunk-P5CMZZRZ.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/MegaMenu/MegaMenu.tsx"],"names":["React","cn","jsxs","jsx","ChevronDown","ChevronRight","ArrowRight","buttonVariants"],"mappings":"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","file":"chunk-VPRKE2YU.cjs","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { ArrowRight, ChevronDown, ChevronRight } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { buttonVariants } from '../Button';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type MegaMenuTone = 'primary' | 'accent' | 'neutral';\n\n/** The right-column feature panel. */\nexport interface MegaMenuFeatured {\n /** Small caps label, e.g. \"Whitepaper\". */\n eyebrow: string;\n title: string;\n description?: string;\n ctaLabel: string;\n ctaHref: string;\n /** Icon tile above the title. Ignored when `media` is given. */\n icon?: React.ReactNode;\n /** Rich media in place of the icon tile — a `VideoCard variant=\"plate\"`, an image. */\n media?: React.ReactNode;\n /** Panel colour. Default `primary`. */\n tone?: MegaMenuTone;\n}\n\nexport interface MegaMenuItem {\n label: string;\n href: string;\n description?: string;\n icon?: React.ReactNode;\n /**\n * Feature panel to show while this item is hovered/focused. Falls back to\n * the menu-level `featured` when unset — this is what makes the right\n * column contextual instead of static.\n */\n featured?: MegaMenuFeatured;\n external?: boolean;\n}\n\nexport interface MegaMenuGroup {\n label: string;\n /** Makes the group heading a link. */\n href?: string;\n items: MegaMenuItem[];\n}\n\nexport interface MegaMenuConfig {\n /** Stable id — used by `MegaMenuBar` to track the open menu. */\n key: string;\n /** Trigger label. */\n label: string;\n /** Trigger destination. Omit for a pure toggle. */\n href?: string;\n /** Heading inside the panel, e.g. \"Resources & insight\". */\n heading?: string;\n /** Flat 2-column grid of items (icon + label + description). */\n items?: MegaMenuItem[];\n /** Grouped columns of compact items. Takes precedence over `items`. */\n groups?: MegaMenuGroup[];\n /** \"Browse all …\" footer link. */\n allLabel?: string;\n allHref?: string;\n /** Footer CTA button. */\n ctaLabel?: string;\n ctaHref?: string;\n /** Default right-column feature panel. */\n featured?: MegaMenuFeatured;\n}\n\nexport interface MegaMenuProps {\n menu: MegaMenuConfig;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** Current pathname — marks the matching item/group with `aria-current`. */\n currentPath?: string;\n /** Trigger colours for light (on dark header) or dark (on light header) chrome. */\n variant?: 'light' | 'dark';\n /**\n * Override how the feature panel is chosen. Receives the hovered item (or\n * `null` when none) and the menu; return `undefined` to hide the column.\n * Default: `item?.featured ?? menu.featured`.\n */\n resolveFeatured?: (\n item: MegaMenuItem | null,\n menu: MegaMenuConfig\n ) => MegaMenuFeatured | undefined;\n /** Called after any in-panel navigation (close mobile drawers, etc.). */\n onNavigate?: () => void;\n /** Viewport width below which hover-open is disabled (touch/mobile). Default 900. */\n hoverMinWidth?: number;\n className?: string;\n}\n\nconst OPEN_DELAY_MS = 70;\nconst CLOSE_DELAY_MS = 150;\n\n/**\n * Normalize an href for `currentPath` comparison (strips hash, query and\n * trailing slashes). Shared with `SiteHeader`'s mobile drawer so desktop and\n * mobile menu links agree on `aria-current`.\n */\nexport function normalizePath(href: string): string {\n const path = href.split('#')[0].split('?')[0];\n // Trim trailing slashes with a scan: an anchored `\\/+$` is CodeQL's canonical\n // polynomial-backtracking pattern on caller-supplied hrefs full of slashes.\n let end = path.length;\n while (end > 0 && path[end - 1] === '/') end--;\n return path.slice(0, end) || '/';\n}\n\n// =============================================================================\n// MegaMenu\n// =============================================================================\n\n/**\n * A hover/click mega-menu: trigger link + chevron toggle, a panel with a\n * heading, a 2-column item grid (or grouped columns), a footer with\n * \"Browse all\" + CTA, and a right-column feature panel that **follows the\n * hovered item** (`item.featured`) before falling back to the menu default.\n * Marks the current route with `aria-current`. Ported from the Enterprise\n * Health frontdoor nav.\n *\n * Controlled — pair with `MegaMenuBar` to keep one menu open at a time.\n */\nexport function MegaMenu({\n menu,\n open,\n onOpenChange,\n currentPath,\n variant = 'dark',\n resolveFeatured = (item, m) => item?.featured ?? m.featured,\n onNavigate,\n hoverMinWidth = 900,\n className,\n}: MegaMenuProps) {\n const rootRef = React.useRef<HTMLDivElement>(null);\n const panelRef = React.useRef<HTMLDivElement>(null);\n const triggerRef = React.useRef<HTMLElement>(null);\n const openTimer = React.useRef<number | null>(null);\n const closeTimer = React.useRef<number | null>(null);\n const [left, setLeft] = React.useState<number | undefined>();\n const [hovered, setHovered] = React.useState<MegaMenuItem | null>(null);\n const panelId = React.useId();\n\n const isHoverViewport = () =>\n typeof window !== 'undefined' && window.innerWidth >= hoverMinWidth;\n\n const clearTimers = React.useCallback(() => {\n if (openTimer.current !== null) window.clearTimeout(openTimer.current);\n if (closeTimer.current !== null) window.clearTimeout(closeTimer.current);\n openTimer.current = closeTimer.current = null;\n }, []);\n\n const requestOpen = React.useCallback(() => {\n clearTimers();\n openTimer.current = window.setTimeout(\n () => onOpenChange(true),\n OPEN_DELAY_MS\n );\n }, [clearTimers, onOpenChange]);\n\n const requestClose = React.useCallback(() => {\n clearTimers();\n closeTimer.current = window.setTimeout(\n () => onOpenChange(false),\n CLOSE_DELAY_MS\n );\n }, [clearTimers, onOpenChange]);\n\n // Clamp the panel inside the viewport (it's absolutely positioned under the trigger).\n const position = React.useCallback(() => {\n const root = rootRef.current;\n const panel = panelRef.current;\n if (!root || !panel || !isHoverViewport()) {\n setLeft(undefined);\n return;\n }\n const rect = root.getBoundingClientRect();\n const pad = 16;\n const vw = document.documentElement.clientWidth;\n const clamped = Math.min(\n Math.max(rect.left, pad),\n Math.max(pad, vw - pad - panel.offsetWidth)\n );\n setLeft(clamped - rect.left);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [hoverMinWidth]);\n\n const curPath = currentPath ? normalizePath(currentPath) : null;\n const isCurrent = (href: string) =>\n curPath !== null && normalizePath(href) === curPath;\n const featured = resolveFeatured(hovered, menu);\n\n React.useEffect(() => {\n if (open) position();\n else setHovered(null);\n // `featured` is a dep because the feature column swaps the 600px layout\n // for the 880px one after open — the wider panel must be re-clamped or a\n // menu opened near the viewport edge overflows it.\n }, [open, position, featured]);\n\n React.useEffect(() => {\n window.addEventListener('resize', position);\n return () => window.removeEventListener('resize', position);\n }, [position]);\n\n React.useEffect(() => clearTimers, [clearTimers]);\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Escape' && open) {\n e.stopPropagation();\n clearTimers();\n onOpenChange(false);\n triggerRef.current?.focus();\n }\n };\n\n const triggerClass = cn(\n 'inline-flex items-center rounded-lg px-3 py-2 text-sm font-medium transition-colors',\n variant === 'light'\n ? 'text-white/90 hover:bg-white/10 hover:text-white'\n : 'text-foreground/80 hover:bg-muted hover:text-foreground',\n open &&\n (variant === 'light'\n ? 'bg-white/10 text-white'\n : 'bg-muted text-foreground')\n );\n\n const navigate = () => {\n onOpenChange(false);\n onNavigate?.();\n };\n\n return (\n // Hover/focus delegation region only — the trigger, toggle and links inside are the interactive elements.\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n <div\n ref={rootRef}\n data-slot=\"mega-menu\"\n data-state={open ? 'open' : 'closed'}\n className={cn('relative', className)}\n onMouseEnter={() => isHoverViewport() && requestOpen()}\n onMouseLeave={() => isHoverViewport() && requestClose()}\n onFocusCapture={() => {\n if (!isHoverViewport()) return;\n clearTimers();\n onOpenChange(true);\n }}\n onBlurCapture={(e) => {\n if (!isHoverViewport()) return;\n if (!rootRef.current?.contains(e.relatedTarget as Node | null))\n requestClose();\n }}\n onKeyDown={onKeyDown}\n >\n <div className=\"flex items-center\">\n {menu.href ? (\n <a\n ref={triggerRef as React.RefObject<HTMLAnchorElement>}\n href={menu.href}\n className={triggerClass}\n aria-haspopup=\"true\"\n aria-expanded={open}\n aria-controls={panelId}\n aria-current={isCurrent(menu.href) ? 'page' : undefined}\n onClick={navigate}\n >\n {menu.label}\n </a>\n ) : (\n <button\n ref={triggerRef as React.RefObject<HTMLButtonElement>}\n type=\"button\"\n className={triggerClass}\n aria-haspopup=\"true\"\n aria-expanded={open}\n aria-controls={panelId}\n onClick={() => {\n clearTimers();\n onOpenChange(!open);\n }}\n >\n {menu.label}\n </button>\n )}\n <button\n type=\"button\"\n aria-label={`Toggle ${menu.label} menu`}\n aria-expanded={open}\n aria-controls={panelId}\n onClick={() => {\n clearTimers();\n onOpenChange(!open);\n }}\n className={cn(\n '-ms-1 rounded-md p-1 transition-transform',\n variant === 'light'\n ? 'text-white/70 hover:text-white'\n : 'text-muted-foreground hover:text-foreground',\n open && 'rotate-180'\n )}\n >\n <ChevronDown size={16} aria-hidden=\"true\" />\n </button>\n </div>\n\n <div\n id={panelId}\n ref={panelRef}\n role=\"region\"\n aria-label={menu.label}\n data-slot=\"mega-menu-panel\"\n style={{ left }}\n className={cn(\n 'border-border bg-card text-card-foreground absolute top-full z-50 mt-3 origin-top-left rounded-2xl border shadow-xl',\n 'transition-[opacity,transform] duration-200',\n open\n ? 'visible translate-y-0 opacity-100'\n : 'pointer-events-none invisible -translate-y-1 opacity-0',\n featured\n ? 'grid w-[min(880px,calc(100vw-2rem))] grid-cols-[1fr_280px]'\n : 'w-[min(600px,calc(100vw-2rem))]'\n )}\n >\n <div className=\"p-6\">\n {menu.heading && (\n <p className=\"text-muted-foreground mb-4 text-[11px] font-bold tracking-[0.14em] uppercase\">\n {menu.heading}\n </p>\n )}\n\n {menu.groups ? (\n <div className=\"grid gap-6 sm:grid-cols-2 lg:grid-cols-3\">\n {menu.groups.map((g) => (\n <div key={g.label}>\n {g.href ? (\n <a\n href={g.href}\n aria-current={isCurrent(g.href) ? 'page' : undefined}\n onClick={navigate}\n className=\"text-foreground hover:text-primary-700 dark:hover:text-primary-300 mb-2 inline-flex items-center gap-1 text-sm font-semibold\"\n >\n {g.label}\n <ChevronRight size={14} aria-hidden=\"true\" />\n </a>\n ) : (\n <p className=\"text-foreground mb-2 text-sm font-semibold\">\n {g.label}\n </p>\n )}\n <ul className=\"space-y-0.5\">\n {g.items.map((it) => (\n <li key={it.href}>\n <ItemLink\n item={it}\n compact\n current={isCurrent(it.href)}\n onHover={setHovered}\n onNavigate={navigate}\n />\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n ) : (\n <div className=\"grid gap-1 sm:grid-cols-2\">\n {menu.items?.map((it) => (\n <ItemLink\n key={it.href}\n item={it}\n current={isCurrent(it.href)}\n onHover={setHovered}\n onNavigate={navigate}\n />\n ))}\n </div>\n )}\n\n {(menu.allHref || menu.ctaHref) && (\n <div className=\"border-border mt-5 flex items-center justify-between gap-4 border-t pt-4\">\n {menu.allHref ? (\n <a\n href={menu.allHref}\n onClick={navigate}\n className=\"text-foreground hover:text-primary-700 dark:hover:text-primary-300 inline-flex items-center gap-1.5 text-sm font-semibold\"\n >\n {menu.allLabel ?? 'Browse all'}\n <ArrowRight size={16} aria-hidden=\"true\" />\n </a>\n ) : (\n <span />\n )}\n {menu.ctaHref && (\n <a\n href={menu.ctaHref}\n onClick={navigate}\n className={buttonVariants({ size: 'sm', effect: 'sheen' })}\n >\n {menu.ctaLabel ?? 'Get started'}\n </a>\n )}\n </div>\n )}\n </div>\n\n {featured && (\n <FeaturedPanel featured={featured} onNavigate={navigate} />\n )}\n </div>\n </div>\n );\n}\n\n// =============================================================================\n// Pieces\n// =============================================================================\n\nfunction ItemLink({\n item,\n compact,\n current,\n onHover,\n onNavigate,\n}: {\n item: MegaMenuItem;\n compact?: boolean;\n current: boolean;\n onHover: (item: MegaMenuItem | null) => void;\n onNavigate: () => void;\n}) {\n return (\n <a\n href={item.href}\n target={item.external ? '_blank' : undefined}\n rel={item.external ? 'noopener noreferrer' : undefined}\n aria-current={current ? 'page' : undefined}\n data-slot=\"mega-menu-item\"\n onClick={onNavigate}\n onMouseEnter={() => onHover(item)}\n onFocus={() => onHover(item)}\n className={cn(\n 'group flex items-start gap-3 rounded-xl text-start transition-colors',\n compact ? 'px-2 py-1.5' : 'p-3',\n 'hover:bg-primary-500/10 focus-visible:bg-primary-500/10 focus-visible:outline-none',\n current && 'bg-primary-500/10'\n )}\n >\n {item.icon && (\n <span\n className={cn(\n 'inline-flex shrink-0 items-center justify-center rounded-lg transition-colors',\n compact\n ? 'h-7 w-7 [&_svg]:h-4 [&_svg]:w-4'\n : 'h-10 w-10 [&_svg]:h-5 [&_svg]:w-5',\n 'bg-muted text-foreground/70 group-hover:bg-primary-800 group-hover:text-white',\n current && 'bg-primary-800 text-white'\n )}\n >\n {item.icon}\n </span>\n )}\n <span className=\"min-w-0\">\n <span\n className={cn(\n 'text-foreground group-hover:text-primary-800 dark:group-hover:text-primary-200 block font-semibold',\n compact ? 'text-sm' : 'text-base'\n )}\n >\n {item.label}\n </span>\n {!compact && item.description && (\n <span className=\"text-muted-foreground mt-0.5 block text-sm leading-snug\">\n {item.description}\n </span>\n )}\n </span>\n </a>\n );\n}\n\nconst TONE: Record<MegaMenuTone, string> = {\n primary: 'bg-gradient-to-br from-primary-800 to-primary-950 text-white',\n accent:\n 'text-white [background:linear-gradient(160deg,color-mix(in_srgb,var(--mieweb-accent,var(--mieweb-primary-700))_70%,#000)_0%,var(--mieweb-primary-950)_100%)]',\n neutral: 'bg-muted text-foreground',\n};\n\nfunction FeaturedPanel({\n featured,\n onNavigate,\n}: {\n featured: MegaMenuFeatured;\n onNavigate: () => void;\n}) {\n const tone = featured.tone ?? 'primary';\n const onDark = tone !== 'neutral';\n // `key` re-mounts the panel so swapping between items replays the fade-in.\n // A `div`, not `aside`: a complementary landmark nested inside the menu\n // region violates axe landmark-complementary-is-top-level.\n return (\n <div\n data-slot=\"mega-menu-featured\"\n key={featured.title}\n className={cn(\n 'flex flex-col rounded-e-2xl p-6 motion-safe:animate-[mie-fade-in_0.2s_ease-out]',\n TONE[tone]\n )}\n >\n <p\n className={cn(\n 'text-[11px] font-bold tracking-[0.14em] uppercase',\n onDark ? 'text-white/70' : 'text-muted-foreground'\n )}\n >\n {featured.eyebrow}\n </p>\n <div className=\"mt-4\">\n {featured.media ??\n (featured.icon && (\n <span\n className={cn(\n 'inline-flex h-14 w-14 items-center justify-center rounded-xl [&_svg]:h-7 [&_svg]:w-7',\n onDark ? 'bg-white/15 text-white' : 'bg-card text-foreground'\n )}\n >\n {featured.icon}\n </span>\n ))}\n </div>\n <p className=\"mt-4 text-xl leading-tight font-semibold\">\n {featured.title}\n </p>\n {featured.description && (\n <p\n className={cn(\n 'mt-2 text-sm leading-snug',\n onDark ? 'text-white/80' : 'text-muted-foreground'\n )}\n >\n {featured.description}\n </p>\n )}\n <div className=\"mt-auto pt-5\">\n <a\n href={featured.ctaHref}\n onClick={onNavigate}\n className={cn(\n buttonVariants({ variant: 'outline', effect: 'sheen' }),\n onDark &&\n 'border-white/40 text-white hover:border-white hover:bg-white/10 hover:text-white dark:border-white/40 dark:text-white dark:hover:border-white dark:hover:bg-white/10'\n )}\n >\n {featured.ctaLabel}\n <ArrowRight size={16} aria-hidden=\"true\" />\n </a>\n </div>\n </div>\n );\n}\n\n// =============================================================================\n// MegaMenuBar — keeps one menu open at a time\n// =============================================================================\n\nexport interface MegaMenuBarProps extends Pick<\n MegaMenuProps,\n 'currentPath' | 'variant' | 'resolveFeatured' | 'onNavigate' | 'hoverMinWidth'\n> {\n menus: MegaMenuConfig[];\n className?: string;\n 'aria-label'?: string;\n}\n\n/** A row of `MegaMenu` triggers sharing one open-state so only one panel shows. */\nexport function MegaMenuBar({\n menus,\n className,\n 'aria-label': ariaLabel = 'Main navigation',\n ...rest\n}: MegaMenuBarProps) {\n const [openKey, setOpenKey] = React.useState<string | null>(null);\n return (\n <nav\n data-slot=\"mega-menu-bar\"\n aria-label={ariaLabel}\n className={cn('flex items-center gap-1', className)}\n >\n {menus.map((m) => (\n <MegaMenu\n key={m.key}\n menu={m}\n open={openKey === m.key}\n onOpenChange={(o) =>\n setOpenKey(o ? m.key : openKey === m.key ? null : openKey)\n }\n {...rest}\n />\n ))}\n </nav>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/components/MegaMenu/MegaMenu.tsx"],"names":["React","cn","jsxs","jsx","ChevronDown","ChevronRight","ArrowRight","buttonVariants"],"mappings":"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","file":"chunk-P5CMZZRZ.cjs","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { ArrowRight, ChevronDown, ChevronRight } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { buttonVariants } from '../Button';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type MegaMenuTone = 'primary' | 'accent' | 'neutral';\n\n/** The right-column feature panel. */\nexport interface MegaMenuFeatured {\n /** Small caps label, e.g. \"Whitepaper\". */\n eyebrow: string;\n title: string;\n description?: string;\n ctaLabel: string;\n ctaHref: string;\n /** Icon tile above the title. Ignored when `media` is given. */\n icon?: React.ReactNode;\n /** Rich media in place of the icon tile — a `VideoCard variant=\"plate\"`, an image. */\n media?: React.ReactNode;\n /** Panel colour. Default `primary`. */\n tone?: MegaMenuTone;\n}\n\nexport interface MegaMenuItem {\n label: string;\n href: string;\n description?: string;\n icon?: React.ReactNode;\n /**\n * Feature panel to show while this item is hovered/focused. Falls back to\n * the menu-level `featured` when unset — this is what makes the right\n * column contextual instead of static.\n */\n featured?: MegaMenuFeatured;\n external?: boolean;\n}\n\nexport interface MegaMenuGroup {\n label: string;\n /** Makes the group heading a link. */\n href?: string;\n items: MegaMenuItem[];\n}\n\nexport interface MegaMenuConfig {\n /** Stable id — used by `MegaMenuBar` to track the open menu. */\n key: string;\n /** Trigger label. */\n label: string;\n /** Trigger destination. Omit for a pure toggle. */\n href?: string;\n /** Heading inside the panel, e.g. \"Resources & insight\". */\n heading?: string;\n /** Flat 2-column grid of items (icon + label + description). */\n items?: MegaMenuItem[];\n /** Grouped columns of compact items. Takes precedence over `items`. */\n groups?: MegaMenuGroup[];\n /** \"Browse all …\" footer link. */\n allLabel?: string;\n allHref?: string;\n /** Footer CTA button. */\n ctaLabel?: string;\n ctaHref?: string;\n /** Default right-column feature panel. */\n featured?: MegaMenuFeatured;\n}\n\nexport interface MegaMenuProps {\n menu: MegaMenuConfig;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** Current pathname — marks the matching item/group with `aria-current`. */\n currentPath?: string;\n /** Trigger colours for light (on dark header) or dark (on light header) chrome. */\n variant?: 'light' | 'dark';\n /**\n * Override how the feature panel is chosen. Receives the hovered item (or\n * `null` when none) and the menu; return `undefined` to hide the column.\n * Default: `item?.featured ?? menu.featured`.\n */\n resolveFeatured?: (\n item: MegaMenuItem | null,\n menu: MegaMenuConfig\n ) => MegaMenuFeatured | undefined;\n /** Called after any in-panel navigation (close mobile drawers, etc.). */\n onNavigate?: () => void;\n /** Viewport width below which hover-open is disabled (touch/mobile). Default 900. */\n hoverMinWidth?: number;\n className?: string;\n}\n\nconst OPEN_DELAY_MS = 70;\nconst CLOSE_DELAY_MS = 150;\n\n/**\n * Normalize an href for `currentPath` comparison (strips hash, query and\n * trailing slashes). Shared with `SiteHeader`'s mobile drawer so desktop and\n * mobile menu links agree on `aria-current`.\n */\nexport function normalizePath(href: string): string {\n const path = href.split('#')[0].split('?')[0];\n // Trim trailing slashes with a scan: an anchored `\\/+$` is CodeQL's canonical\n // polynomial-backtracking pattern on caller-supplied hrefs full of slashes.\n let end = path.length;\n while (end > 0 && path[end - 1] === '/') end--;\n return path.slice(0, end) || '/';\n}\n\n// =============================================================================\n// MegaMenu\n// =============================================================================\n\n/**\n * A hover/click mega-menu: trigger link + chevron toggle, a panel with a\n * heading, a 2-column item grid (or grouped columns), a footer with\n * \"Browse all\" + CTA, and a right-column feature panel that **follows the\n * hovered item** (`item.featured`) before falling back to the menu default.\n * Marks the current route with `aria-current`. Ported from the Enterprise\n * Health frontdoor nav.\n *\n * Controlled — pair with `MegaMenuBar` to keep one menu open at a time.\n */\nexport function MegaMenu({\n menu,\n open,\n onOpenChange,\n currentPath,\n variant = 'dark',\n resolveFeatured = (item, m) => item?.featured ?? m.featured,\n onNavigate,\n hoverMinWidth = 900,\n className,\n}: MegaMenuProps) {\n const rootRef = React.useRef<HTMLDivElement>(null);\n const panelRef = React.useRef<HTMLDivElement>(null);\n const triggerRef = React.useRef<HTMLElement>(null);\n const openTimer = React.useRef<number | null>(null);\n const closeTimer = React.useRef<number | null>(null);\n const [left, setLeft] = React.useState<number | undefined>();\n const [hovered, setHovered] = React.useState<MegaMenuItem | null>(null);\n const panelId = React.useId();\n\n const isHoverViewport = () =>\n typeof window !== 'undefined' && window.innerWidth >= hoverMinWidth;\n\n const clearTimers = React.useCallback(() => {\n if (openTimer.current !== null) window.clearTimeout(openTimer.current);\n if (closeTimer.current !== null) window.clearTimeout(closeTimer.current);\n openTimer.current = closeTimer.current = null;\n }, []);\n\n const requestOpen = React.useCallback(() => {\n clearTimers();\n openTimer.current = window.setTimeout(\n () => onOpenChange(true),\n OPEN_DELAY_MS\n );\n }, [clearTimers, onOpenChange]);\n\n const requestClose = React.useCallback(() => {\n clearTimers();\n closeTimer.current = window.setTimeout(\n () => onOpenChange(false),\n CLOSE_DELAY_MS\n );\n }, [clearTimers, onOpenChange]);\n\n // Clamp the panel inside the viewport (it's absolutely positioned under the trigger).\n const position = React.useCallback(() => {\n const root = rootRef.current;\n const panel = panelRef.current;\n if (!root || !panel || !isHoverViewport()) {\n setLeft(undefined);\n return;\n }\n const rect = root.getBoundingClientRect();\n const pad = 16;\n const vw = document.documentElement.clientWidth;\n const clamped = Math.min(\n Math.max(rect.left, pad),\n Math.max(pad, vw - pad - panel.offsetWidth)\n );\n setLeft(clamped - rect.left);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [hoverMinWidth]);\n\n const curPath = currentPath ? normalizePath(currentPath) : null;\n const isCurrent = (href: string) =>\n curPath !== null && normalizePath(href) === curPath;\n const featured = resolveFeatured(hovered, menu);\n\n React.useEffect(() => {\n if (open) position();\n else setHovered(null);\n // `featured` is a dep because the feature column swaps the 600px layout\n // for the 880px one after open — the wider panel must be re-clamped or a\n // menu opened near the viewport edge overflows it.\n }, [open, position, featured]);\n\n React.useEffect(() => {\n window.addEventListener('resize', position);\n return () => window.removeEventListener('resize', position);\n }, [position]);\n\n React.useEffect(() => clearTimers, [clearTimers]);\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Escape' && open) {\n e.stopPropagation();\n clearTimers();\n onOpenChange(false);\n triggerRef.current?.focus();\n }\n };\n\n const triggerClass = cn(\n 'inline-flex items-center rounded-lg px-3 py-2 text-sm font-medium transition-colors',\n variant === 'light'\n ? 'text-white/90 hover:bg-white/10 hover:text-white'\n : 'text-foreground/80 hover:bg-muted hover:text-foreground',\n open &&\n (variant === 'light'\n ? 'bg-white/10 text-white'\n : 'bg-muted text-foreground')\n );\n\n const navigate = () => {\n onOpenChange(false);\n onNavigate?.();\n };\n\n return (\n // Hover/focus delegation region only — the trigger, toggle and links inside are the interactive elements.\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n <div\n ref={rootRef}\n data-slot=\"mega-menu\"\n data-state={open ? 'open' : 'closed'}\n className={cn('relative', className)}\n onMouseEnter={() => isHoverViewport() && requestOpen()}\n onMouseLeave={() => isHoverViewport() && requestClose()}\n onFocusCapture={() => {\n if (!isHoverViewport()) return;\n clearTimers();\n onOpenChange(true);\n }}\n onBlurCapture={(e) => {\n if (!isHoverViewport()) return;\n if (!rootRef.current?.contains(e.relatedTarget as Node | null))\n requestClose();\n }}\n onKeyDown={onKeyDown}\n >\n <div className=\"flex items-center\">\n {menu.href ? (\n <a\n ref={triggerRef as React.RefObject<HTMLAnchorElement>}\n href={menu.href}\n className={triggerClass}\n aria-haspopup=\"true\"\n aria-expanded={open}\n aria-controls={panelId}\n aria-current={isCurrent(menu.href) ? 'page' : undefined}\n onClick={navigate}\n >\n {menu.label}\n </a>\n ) : (\n <button\n ref={triggerRef as React.RefObject<HTMLButtonElement>}\n type=\"button\"\n className={triggerClass}\n aria-haspopup=\"true\"\n aria-expanded={open}\n aria-controls={panelId}\n onClick={() => {\n clearTimers();\n onOpenChange(!open);\n }}\n >\n {menu.label}\n </button>\n )}\n <button\n type=\"button\"\n aria-label={`Toggle ${menu.label} menu`}\n aria-expanded={open}\n aria-controls={panelId}\n onClick={() => {\n clearTimers();\n onOpenChange(!open);\n }}\n className={cn(\n '-ms-1 rounded-md p-1 transition-transform',\n variant === 'light'\n ? 'text-white/70 hover:text-white'\n : 'text-muted-foreground hover:text-foreground',\n open && 'rotate-180'\n )}\n >\n <ChevronDown size={16} aria-hidden=\"true\" />\n </button>\n </div>\n\n <div\n id={panelId}\n ref={panelRef}\n role=\"region\"\n aria-label={menu.label}\n data-slot=\"mega-menu-panel\"\n style={{ left }}\n className={cn(\n 'border-border bg-card text-card-foreground absolute top-full z-50 mt-3 origin-top-left rounded-2xl border shadow-xl',\n 'transition-[opacity,transform] duration-200',\n open\n ? 'visible translate-y-0 opacity-100'\n : 'pointer-events-none invisible -translate-y-1 opacity-0',\n featured\n ? 'grid w-[min(880px,calc(100vw-2rem))] grid-cols-[1fr_280px]'\n : 'w-[min(600px,calc(100vw-2rem))]'\n )}\n >\n <div className=\"p-6\">\n {menu.heading && (\n <p className=\"text-muted-foreground mb-4 text-[11px] font-bold tracking-[0.14em] uppercase\">\n {menu.heading}\n </p>\n )}\n\n {menu.groups ? (\n <div className=\"grid gap-6 sm:grid-cols-2 lg:grid-cols-3\">\n {menu.groups.map((g) => (\n <div key={g.label}>\n {g.href ? (\n <a\n href={g.href}\n aria-current={isCurrent(g.href) ? 'page' : undefined}\n onClick={navigate}\n className=\"text-foreground hover:text-primary-700 dark:hover:text-primary-300 mb-2 inline-flex items-center gap-1 text-sm font-semibold\"\n >\n {g.label}\n <ChevronRight size={14} aria-hidden=\"true\" />\n </a>\n ) : (\n <p className=\"text-foreground mb-2 text-sm font-semibold\">\n {g.label}\n </p>\n )}\n <ul className=\"space-y-0.5\">\n {g.items.map((it) => (\n <li key={it.href}>\n <ItemLink\n item={it}\n compact\n current={isCurrent(it.href)}\n onHover={setHovered}\n onNavigate={navigate}\n />\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n ) : (\n <div className=\"grid gap-1 sm:grid-cols-2\">\n {menu.items?.map((it) => (\n <ItemLink\n key={it.href}\n item={it}\n current={isCurrent(it.href)}\n onHover={setHovered}\n onNavigate={navigate}\n />\n ))}\n </div>\n )}\n\n {(menu.allHref || menu.ctaHref) && (\n <div className=\"border-border mt-5 flex items-center justify-between gap-4 border-t pt-4\">\n {menu.allHref ? (\n <a\n href={menu.allHref}\n onClick={navigate}\n className=\"text-foreground hover:text-primary-700 dark:hover:text-primary-300 inline-flex items-center gap-1.5 text-sm font-semibold\"\n >\n {menu.allLabel ?? 'Browse all'}\n <ArrowRight size={16} aria-hidden=\"true\" />\n </a>\n ) : (\n <span />\n )}\n {menu.ctaHref && (\n <a\n href={menu.ctaHref}\n onClick={navigate}\n className={buttonVariants({ size: 'sm', effect: 'sheen' })}\n >\n {menu.ctaLabel ?? 'Get started'}\n </a>\n )}\n </div>\n )}\n </div>\n\n {featured && (\n <FeaturedPanel featured={featured} onNavigate={navigate} />\n )}\n </div>\n </div>\n );\n}\n\n// =============================================================================\n// Pieces\n// =============================================================================\n\nfunction ItemLink({\n item,\n compact,\n current,\n onHover,\n onNavigate,\n}: {\n item: MegaMenuItem;\n compact?: boolean;\n current: boolean;\n onHover: (item: MegaMenuItem | null) => void;\n onNavigate: () => void;\n}) {\n return (\n <a\n href={item.href}\n target={item.external ? '_blank' : undefined}\n rel={item.external ? 'noopener noreferrer' : undefined}\n aria-current={current ? 'page' : undefined}\n data-slot=\"mega-menu-item\"\n onClick={onNavigate}\n onMouseEnter={() => onHover(item)}\n onFocus={() => onHover(item)}\n className={cn(\n 'group flex items-start gap-3 rounded-xl text-start transition-colors',\n compact ? 'px-2 py-1.5' : 'p-3',\n 'hover:bg-primary-500/10 focus-visible:bg-primary-500/10 focus-visible:outline-none',\n current && 'bg-primary-500/10'\n )}\n >\n {item.icon && (\n <span\n className={cn(\n 'inline-flex shrink-0 items-center justify-center rounded-lg transition-colors',\n compact\n ? 'h-7 w-7 [&_svg]:h-4 [&_svg]:w-4'\n : 'h-10 w-10 [&_svg]:h-5 [&_svg]:w-5',\n 'bg-muted text-foreground/70 group-hover:bg-primary-800 group-hover:text-white',\n current && 'bg-primary-800 text-white'\n )}\n >\n {item.icon}\n </span>\n )}\n <span className=\"min-w-0\">\n <span\n className={cn(\n 'text-foreground group-hover:text-primary-800 dark:group-hover:text-primary-200 block font-semibold',\n compact ? 'text-sm' : 'text-base'\n )}\n >\n {item.label}\n </span>\n {!compact && item.description && (\n <span className=\"text-muted-foreground mt-0.5 block text-sm leading-snug\">\n {item.description}\n </span>\n )}\n </span>\n </a>\n );\n}\n\nconst TONE: Record<MegaMenuTone, string> = {\n primary: 'bg-gradient-to-br from-primary-800 to-primary-950 text-white',\n accent:\n 'text-white [background:linear-gradient(160deg,color-mix(in_srgb,var(--mieweb-accent,var(--mieweb-primary-700))_70%,#000)_0%,var(--mieweb-primary-950)_100%)]',\n neutral: 'bg-muted text-foreground',\n};\n\nfunction FeaturedPanel({\n featured,\n onNavigate,\n}: {\n featured: MegaMenuFeatured;\n onNavigate: () => void;\n}) {\n const tone = featured.tone ?? 'primary';\n const onDark = tone !== 'neutral';\n // `key` re-mounts the panel so swapping between items replays the fade-in.\n // A `div`, not `aside`: a complementary landmark nested inside the menu\n // region violates axe landmark-complementary-is-top-level.\n return (\n <div\n data-slot=\"mega-menu-featured\"\n key={featured.title}\n className={cn(\n 'flex flex-col rounded-e-2xl p-6 motion-safe:animate-[mie-fade-in_0.2s_ease-out]',\n TONE[tone]\n )}\n >\n <p\n className={cn(\n 'text-[11px] font-bold tracking-[0.14em] uppercase',\n onDark ? 'text-white/70' : 'text-muted-foreground'\n )}\n >\n {featured.eyebrow}\n </p>\n <div className=\"mt-4\">\n {featured.media ??\n (featured.icon && (\n <span\n className={cn(\n 'inline-flex h-14 w-14 items-center justify-center rounded-xl [&_svg]:h-7 [&_svg]:w-7',\n onDark ? 'bg-white/15 text-white' : 'bg-card text-foreground'\n )}\n >\n {featured.icon}\n </span>\n ))}\n </div>\n <p className=\"mt-4 text-xl leading-tight font-semibold\">\n {featured.title}\n </p>\n {featured.description && (\n <p\n className={cn(\n 'mt-2 text-sm leading-snug',\n onDark ? 'text-white/80' : 'text-muted-foreground'\n )}\n >\n {featured.description}\n </p>\n )}\n <div className=\"mt-auto pt-5\">\n <a\n href={featured.ctaHref}\n onClick={onNavigate}\n className={cn(\n buttonVariants({ variant: 'outline', effect: 'sheen' }),\n onDark &&\n 'border-white/40 text-white hover:border-white hover:bg-white/10 hover:text-white dark:border-white/40 dark:text-white dark:hover:border-white dark:hover:bg-white/10'\n )}\n >\n {featured.ctaLabel}\n <ArrowRight size={16} aria-hidden=\"true\" />\n </a>\n </div>\n </div>\n );\n}\n\n// =============================================================================\n// MegaMenuBar — keeps one menu open at a time\n// =============================================================================\n\nexport interface MegaMenuBarProps extends Pick<\n MegaMenuProps,\n 'currentPath' | 'variant' | 'resolveFeatured' | 'onNavigate' | 'hoverMinWidth'\n> {\n menus: MegaMenuConfig[];\n className?: string;\n 'aria-label'?: string;\n}\n\n/** A row of `MegaMenu` triggers sharing one open-state so only one panel shows. */\nexport function MegaMenuBar({\n menus,\n className,\n 'aria-label': ariaLabel = 'Main navigation',\n ...rest\n}: MegaMenuBarProps) {\n const [openKey, setOpenKey] = React.useState<string | null>(null);\n return (\n <nav\n data-slot=\"mega-menu-bar\"\n aria-label={ariaLabel}\n className={cn('flex items-center gap-1', className)}\n >\n {menus.map((m) => (\n <MegaMenu\n key={m.key}\n menu={m}\n open={openKey === m.key}\n onOpenChange={(o) =>\n setOpenKey(o ? m.key : openKey === m.key ? null : openKey)\n }\n {...rest}\n />\n ))}\n </nav>\n );\n}\n"]}
@@ -868,6 +868,11 @@ var miewebUISafelist = [
868
868
  // Button `effect` variants (sheen/orbit) lift the button on hover; the
869
869
  // mie-fx-* classes themselves are plain CSS in styles/effects.css.
870
870
  "hover:-translate-y-0.5",
871
+ // Button outline variant — dark-mode hover/active fill with lightened
872
+ // label for WCAG AA contrast (issue #511).
873
+ "dark:hover:bg-primary-950",
874
+ "dark:active:bg-primary-900",
875
+ "dark:active:text-primary-100",
871
876
  // VideoCard hover-preview progress bar rounds its leading-fill edge.
872
877
  "rounded-e-full",
873
878
  "hover:text-white",
@@ -1483,5 +1488,5 @@ var tailwind_preset_default = miewebUIPreset;
1483
1488
  exports.miewebUIPreset = miewebUIPreset;
1484
1489
  exports.miewebUISafelist = miewebUISafelist;
1485
1490
  exports.tailwind_preset_default = tailwind_preset_default;
1486
- //# sourceMappingURL=chunk-NEFBVO5W.cjs.map
1487
- //# sourceMappingURL=chunk-NEFBVO5W.cjs.map
1491
+ //# sourceMappingURL=chunk-QNDP6PE5.cjs.map
1492
+ //# sourceMappingURL=chunk-QNDP6PE5.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tailwind-preset.ts"],"names":[],"mappings":"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","file":"chunk-QNDP6PE5.cjs","sourcesContent":["/**\n * @mieweb/ui Tailwind CSS Preset\n *\n * This preset provides the default theme configuration for @mieweb/ui components.\n * Consumers can extend or override these values in their own tailwind.config.js\n *\n * Usage:\n * ```js\n * // tailwind.config.js\n * module.exports = {\n * presets: [require('@mieweb/ui/tailwind-preset')],\n * theme: {\n * extend: {\n * colors: {\n * primary: {\n * 500: '#your-brand-color',\n * },\n * },\n * },\n * },\n * };\n * ```\n */\n\n/**\n * Safelist of classes used by @mieweb/ui components.\n *\n * **Tailwind CSS 3**: These must be safelisted because Tailwind may not detect\n * them when components are imported from node_modules.\n *\n * **Tailwind CSS 4**: The safelist is NOT needed if you add the `@source`\n * directive to your CSS. Add this line to your main CSS file:\n *\n * @source \"../node_modules/@mieweb/ui/dist\";\n *\n * This tells Tailwind 4 to scan @mieweb/ui's dist folder for class names,\n * replacing the need for a manual safelist.\n *\n * @deprecated For Tailwind CSS 4 users — use the `@source` directive instead.\n */\nexport const miewebUISafelist = [\n // CaseManagementHeader — logical spacing, details grid, responsive\n // built-in actions (icon-only below md):\n '-ms-2',\n 'gap-x-10',\n 'hidden',\n 'max-w-[60%]',\n 'md:hidden',\n 'md:inline-flex',\n // Assessment nested order toolbars suppress the concern-row toolbar for\n // fine pointers while an order toolbar is active.\n 'pointer-fine:group-has-[[data-order-id]:hover]:pointer-events-none',\n 'pointer-fine:group-has-[[data-order-id]:hover]:opacity-0',\n 'pointer-fine:group-has-[[data-order-id]:focus-within]:pointer-events-none',\n 'pointer-fine:group-has-[[data-order-id]:focus-within]:opacity-0',\n // ConditionEditor coding rows switch from a stacked mobile layout to a\n // shared column grid at the small breakpoint.\n 'grid-cols-[minmax(8rem,1.1fr)_minmax(7rem,0.9fr)_minmax(10rem,1.5fr)_5.5rem_2.5rem]',\n 'sm:grid-cols-[minmax(8rem,1.1fr)_minmax(7rem,0.9fr)_minmax(10rem,1.5fr)_5.5rem_2.5rem]',\n 'sm:!grid',\n 'border-border/70',\n '[&_[data-slot=radio-group-items]]:gap-2',\n 'sm:[&_[data-slot=radio-group-legend]]:sr-only',\n // PatientHeader showCountBadges={false} — hides CountBadge roots in the\n // actions slot (ui#367):\n '[&_[data-slot=count-badge-root]]:hidden',\n // OzwellChat's compact widget shell and portaled menus. These arbitrary\n // utilities must remain available to Tailwind 3 consumers that do not scan\n // package source files.\n 'max-w-[min(160px,44vw)]',\n 'max-w-[190px]',\n 'max-w-[min(248px,calc(100vw-24px))]',\n 'max-w-[min(260px,calc(100vw-24px))]',\n 'rounded-[10px]',\n 'min-h-[30px]',\n 'animate-ozwell-message-flare',\n 'grid-cols-[22px_minmax(0,1fr)]',\n 'h-[22px]',\n 'w-[22px]',\n 'text-[11px]',\n 'leading-[1.35]',\n 'py-[7px]',\n '[&_[data-slot=\"ai-chat\"]]:min-h-0',\n '[&_[data-slot=\"ai-chat-messages\"]]:min-h-0',\n '[&_[data-slot=\"ai-tool-call\"]]:p-2',\n '[&_[data-slot=\"ai-tool-icon\"]]:h-7',\n '[&_[data-slot=\"ai-tool-icon\"]]:w-7',\n '[&_[data-slot=\"ai-tool-content\"]]:text-sm',\n '[&_[data-slot=\"ai-tool-parameters\"]]:text-xs',\n '[&_[data-slot=\"ai-tool-result\"]]:text-xs',\n '[&_[data-slot=\"ai-message-thinking\"]_button]:px-2.5',\n '[&_[data-slot=\"ai-message-thinking\"]_button]:py-[7px]',\n '[&_[data-slot=\"ai-message\"].flex-row-reverse_[data-slot=\"ai-message-avatar\"]]:hidden',\n '[&_[data-slot=toast-message]]:text-xs',\n '[&_[data-slot=toast-message]]:leading-[1.35]',\n '[&_[data-slot=toast]]:max-w-none',\n '[&_[data-slot=toast]]:min-w-0',\n '[&_[data-slot=toast]]:rounded-lg',\n '[&_[data-slot=toast]]:p-2',\n '[&_[data-slot=toast]]:shadow-none',\n // Media stack (MediaEditor / TranscriptView / MediaPlayer) — opacity-modifier\n // and state variants introduced with the media components (ui#323 finding):\n 'bg-muted/20',\n 'bg-primary-50',\n 'bg-primary-500/20',\n 'bg-primary-500/40',\n 'bg-success/15',\n 'bg-warning/20',\n 'bg-warning/40',\n 'border-primary-600',\n 'border-warning/50',\n 'dark:bg-primary-950',\n 'hover:bg-destructive/20',\n 'hover:bg-muted',\n 'hover:bg-muted/70',\n 'hover:bg-primary-500/15',\n 'hover:bg-primary-500/30',\n 'hover:bg-success/25',\n 'hover:text-destructive',\n // MediaEditor media-surface height cap: the small-screen `dvh` cap, and the\n // md variants that hand desktop back its original percentage cap. Purging\n // these uncaps the player on a phone, which is the bug the cap exists for.\n 'max-h-[55dvh]',\n 'md:max-h-[50%]',\n 'md:max-h-none',\n 'outline-destructive',\n 'outline-primary-500',\n 'outline-warning',\n 'text-primary-500',\n // Semantic colors\n 'border-border',\n 'border-input',\n 'ring-ring',\n 'bg-background',\n 'bg-card',\n 'bg-muted',\n 'bg-primary',\n 'bg-primary-800',\n 'dark:bg-primary-500',\n 'checked:border-primary-500',\n 'dark:checked:border-primary-800',\n 'bg-success',\n 'bg-warning',\n 'bg-destructive',\n 'bg-info',\n // Ozwell brand accent (Hey Ozwell voice components)\n 'bg-ozwell',\n 'hover:bg-ozwell',\n 'active:bg-ozwell',\n 'text-ozwell',\n 'text-ozwell-foreground',\n 'border-ozwell',\n 'focus-visible:ring-ozwell',\n 'text-foreground',\n 'text-card-foreground',\n 'text-muted-foreground',\n 'text-primary',\n 'text-primary-foreground',\n 'text-success',\n 'text-success-foreground',\n 'text-warning',\n 'text-warning-foreground',\n 'text-destructive',\n 'text-destructive-foreground',\n 'text-info',\n 'text-info-foreground',\n 'focus:ring-ring',\n 'focus:ring-primary',\n 'focus:border-transparent',\n 'focus:ring-destructive',\n 'border-primary',\n 'border-destructive',\n 'border-success',\n 'focus:ring-success/20',\n 'focus:ring-destructive/20',\n 'opacity-0',\n // Drag & drop (useDragReorder / dragIndicatorClasses)\n 'opacity-40',\n 'cursor-grab',\n 'active:cursor-grabbing',\n 'shadow-[inset_0_2px_0_0_var(--color-primary-500,#3b82f6)]',\n 'shadow-[inset_0_-2px_0_0_var(--color-primary-500,#3b82f6)]',\n 'group-hover:opacity-100',\n 'focus:opacity-100',\n 'has-[[data-slot=superchat-nitro-table]]:w-full',\n 'has-[[data-slot=superchat-nitro-table]]:max-w-full',\n // RowActionToolbar (per-row action toolbars) reveal/overlay. These use the\n // built-in `pointer-fine` variant, named `group/order` scope, and the\n // `.wcdv-tr` (datavis grid row) arbitrary variant — none of which TW3\n // consumers scan from node_modules, so the toolbar would stay hidden\n // without safelisting them.\n 'pointer-fine:absolute',\n 'pointer-fine:top-1/2',\n 'pointer-fine:right-0',\n 'pointer-fine:-translate-y-1/2',\n 'pointer-fine:top-1.5',\n 'pointer-fine:right-1.5',\n 'pointer-fine:bg-card',\n 'pointer-fine:border-border',\n 'pointer-fine:rounded-md',\n 'pointer-fine:border',\n 'pointer-fine:p-0.5',\n 'pointer-fine:shadow-sm',\n 'pointer-fine:pointer-events-none',\n 'pointer-fine:opacity-0',\n 'rounded-md',\n 'border',\n 'p-0.5',\n 'shadow-sm',\n 'focus-within:pointer-events-auto',\n 'focus-within:opacity-100',\n 'group-hover:pointer-events-auto',\n 'group-focus-within:pointer-events-auto',\n 'group-focus-within:opacity-100',\n 'group-focus:pointer-events-auto',\n 'group-focus:opacity-100',\n 'group-hover/order:pointer-events-auto',\n 'group-hover/order:opacity-100',\n 'group-focus-within/order:pointer-events-auto',\n 'group-focus-within/order:opacity-100',\n 'group-focus/order:pointer-events-auto',\n 'group-focus/order:opacity-100',\n '[.wcdv-tr:hover_&]:pointer-events-auto',\n '[.wcdv-tr:hover_&]:opacity-100',\n '[.wcdv-tr:focus-within_&]:pointer-events-auto',\n '[.wcdv-tr:focus-within_&]:opacity-100',\n // Markdown SurveyBlock\n 'accent-primary-500',\n // Opacity-modifier variants for semantic colors used by components\n 'bg-background/60',\n 'bg-background/80',\n 'bg-background/90',\n 'bg-background/95',\n 'bg-card/80',\n 'bg-destructive/5',\n 'bg-destructive/10',\n 'bg-foreground/50',\n 'bg-info/10',\n 'bg-muted/10',\n 'bg-muted/30',\n 'bg-muted/50',\n 'bg-primary/5',\n 'bg-primary/10',\n 'bg-success/10',\n 'bg-warning/10',\n 'border-border/80',\n 'border-destructive/20',\n 'border-destructive/30',\n 'border-destructive/50',\n 'border-info/30',\n 'border-muted-foreground/25',\n 'border-muted-foreground/40',\n 'border-primary/30',\n 'border-primary/50',\n 'border-success/30',\n 'border-success/50',\n 'border-warning/30',\n 'hover:bg-destructive/10',\n 'hover:bg-muted/10',\n 'hover:bg-muted/20',\n 'hover:bg-muted/50',\n 'hover:bg-muted/80',\n 'hover:bg-primary/5',\n 'hover:bg-primary/10',\n 'hover:bg-primary/20',\n 'hover:bg-primary/90',\n 'hover:border-border/80',\n 'hover:border-muted-foreground/50',\n 'hover:text-destructive/80',\n 'hover:text-primary/80',\n 'text-muted-foreground/30',\n 'text-muted-foreground/40',\n 'text-muted-foreground/50',\n 'text-muted-foreground/60',\n 'text-muted-foreground/70',\n 'text-primary/80',\n 'text-primary-foreground/90',\n 'ring-primary',\n 'ring-2',\n 'ring-offset-2',\n // Grid classes for QuickAction and responsive layouts\n 'grid-cols-1',\n 'grid-cols-2',\n 'grid-cols-3',\n 'grid-cols-4',\n 'grid-cols-6',\n 'sm:grid-cols-1',\n 'sm:grid-cols-2',\n 'sm:grid-cols-3',\n 'sm:grid-cols-4',\n 'sm:grid-cols-6',\n 'md:grid-cols-2',\n 'md:grid-cols-3',\n 'md:grid-cols-4',\n 'lg:grid-cols-2',\n 'lg:grid-cols-3',\n 'lg:grid-cols-4',\n // ── Expanded Color Scales ────────────────────────────────────────\n // Secondary scale\n 'bg-secondary',\n 'bg-secondary-50',\n 'bg-secondary-100',\n 'bg-secondary-500',\n 'bg-secondary-600',\n 'text-secondary',\n 'text-secondary-500',\n 'text-secondary-600',\n 'text-secondary-700',\n 'text-secondary-foreground',\n 'border-secondary',\n 'border-secondary-200',\n // Neutral scale\n 'bg-neutral-50',\n 'bg-neutral-100',\n 'bg-neutral-200',\n 'bg-neutral-300',\n 'bg-neutral-800',\n 'bg-neutral-900',\n 'text-neutral-500',\n 'text-neutral-600',\n 'text-neutral-700',\n 'text-neutral-400',\n 'border-neutral-200',\n 'border-neutral-300',\n 'dark:bg-neutral-700',\n 'dark:bg-neutral-800',\n 'dark:text-neutral-300',\n 'dark:text-neutral-400',\n 'dark:border-neutral-600',\n 'dark:border-neutral-700',\n // Indigo (StripeBadge)\n 'bg-indigo-500/10',\n 'dark:bg-indigo-400/20',\n 'text-indigo-700',\n 'dark:text-indigo-300',\n 'border-indigo-500/30',\n 'hover:text-indigo-700',\n 'dark:hover:text-indigo-300',\n // Destructive scale\n 'bg-destructive-50',\n 'bg-destructive-100',\n 'bg-destructive-500',\n 'bg-destructive-600',\n 'bg-destructive-700',\n 'hover:bg-destructive-800',\n 'text-destructive-500',\n 'text-destructive-600',\n 'text-destructive-700',\n 'text-destructive-800',\n 'text-destructive-900',\n 'border-destructive-200',\n 'border-destructive-300',\n 'dark:bg-destructive-900',\n 'dark:bg-destructive-950',\n 'dark:text-destructive-300',\n 'dark:text-destructive-400',\n // Success scale\n 'bg-success-50',\n 'bg-success-100',\n 'bg-success-500',\n 'bg-success-600',\n 'bg-success-700',\n 'hover:bg-success-800',\n 'text-success-500',\n 'text-success-600',\n 'text-success-700',\n 'text-success-800',\n 'text-success-900',\n 'border-success-200',\n 'border-success-300',\n 'dark:bg-success-900',\n 'dark:bg-success-950',\n 'dark:text-success-300',\n 'dark:text-success-400',\n // Warning scale\n 'bg-warning-50',\n 'bg-warning-100',\n 'bg-warning-500',\n 'bg-warning-600',\n 'bg-warning-700',\n 'text-warning-900',\n 'text-warning-500',\n 'text-warning-600',\n 'text-warning-700',\n 'text-warning-800',\n 'text-warning-900',\n 'border-warning-200',\n 'border-warning-300',\n 'dark:bg-warning-900',\n 'dark:bg-warning-950',\n 'dark:text-warning-200',\n 'dark:text-warning-300',\n 'dark:text-warning-400',\n // Info scale\n 'bg-info-50',\n 'bg-info-100',\n 'bg-info-500',\n 'bg-info-600',\n 'text-info-500',\n 'text-info-600',\n 'text-info-700',\n 'text-info-800',\n 'text-info-900',\n 'border-info-200',\n 'border-info-300',\n 'dark:bg-info-900',\n 'dark:bg-info-950',\n 'dark:text-info-300',\n 'dark:text-info-400',\n // Chart colors\n 'bg-chart-1',\n 'bg-chart-2',\n 'bg-chart-3',\n 'bg-chart-4',\n 'bg-chart-5',\n 'text-chart-1',\n 'text-chart-2',\n 'text-chart-3',\n 'text-chart-4',\n 'text-chart-5',\n 'border-chart-1',\n 'border-chart-2',\n 'border-chart-3',\n 'border-chart-4',\n 'border-chart-5',\n // Switch component\n 'bg-primary-500',\n // Primary scale (a11y contrast)\n 'text-primary-800',\n 'dark:text-primary-300',\n // Text decoration\n 'underline',\n 'h-5',\n 'w-9',\n 'h-6',\n 'w-11',\n 'h-7',\n 'w-14',\n 'h-4',\n 'w-4',\n 'w-5',\n 'w-6',\n 'translate-x-0.5',\n 'translate-x-4',\n 'translate-x-5',\n 'translate-x-7',\n // RTL primitives batch: Badge/Input/Label icon+required markers, Text\n // logical alignment, Switch thumb travel (LTR data-state pairs + rtl mirror)\n 'me-1',\n 'ms-0.5',\n 'ms-1',\n 'text-start',\n 'text-end',\n 'data-[state=checked]:translate-x-4',\n 'data-[state=checked]:translate-x-5',\n 'data-[state=checked]:translate-x-7',\n 'rtl:-translate-x-0.5',\n 'rtl:data-[state=checked]:-translate-x-4',\n 'rtl:data-[state=checked]:-translate-x-5',\n 'rtl:data-[state=checked]:-translate-x-7',\n // RTL layout+nav batch: AppHeader alignment, Card accent/badge positions,\n // Sheet sides, Sidebar off-canvas + paddings, Table cell alignment\n 'me-auto',\n 'ms-auto',\n '-end-1',\n 'start-0',\n 'end-0',\n 'ps-4',\n 'start-2',\n 'end-2',\n 'border-e',\n 'border-s',\n 'me-3',\n 'ms-2',\n 'ps-2',\n '-me-2',\n '-end-3',\n 'start-3',\n 'pe-4',\n 'ps-10',\n 'rtl:translate-x-full',\n 'translate-x-0',\n '-translate-x-full',\n '[&:has([role=checkbox])]:pe-0',\n // RTL messaging+AI batch: bubble tails, composer borders/paddings, corner\n // pins (AIChatModal/AttachmentPicker/MessageList), read-receipt avatar stack\n 'end-1',\n 'end-3',\n 'end-4',\n 'start-4',\n 'me-2',\n 'pe-10',\n 'border-s-4',\n 'rounded-ee-md',\n 'rounded-es-md',\n 'rtl:space-x-reverse',\n // RTL DocScanner+media batch: detection-overlay corner pins, MediaEditor\n // speed-marker accent/pill, ScriptPanel border, transcript alignment\n '-end-0.5',\n '-start-0.5',\n '-start-1',\n 'end-0.5',\n 'rounded-ee',\n 'rounded-ee-lg',\n 'rounded-es',\n 'rounded-es-lg',\n 'rounded-se',\n 'rounded-se-lg',\n 'rounded-ss',\n 'rounded-ss-lg',\n 'border-e-4',\n 'border-s-[3px]',\n 'border-s-warning',\n 'border-s-primary-500',\n 'ps-1.5',\n '-start-px',\n 'md:border-e',\n // RTL billing+invoices batch: invoice tables/headers, search icon inset,\n // button spinners\n '-ms-1',\n 'ps-9',\n 'sm:text-end',\n // RTL services+employer batch: wizard steps, accordion insets, provider\n // selectors, service cards/badges\n 'border-s-0',\n 'border-s-2',\n 'ms-1.5',\n 'ms-3',\n 'ms-4',\n 'ms-6',\n 'pe-3',\n 'pe-8',\n 'pe-16',\n 'ps-0',\n 'ps-3',\n 'ps-7',\n 'ps-8',\n 'rounded-s-md',\n 'rounded-e-md',\n 'bg-right',\n 'rtl:bg-left',\n // RTL scheduling+clinical batch: calendar insets, timeline dots, order forms\n '-start-5',\n 'border-e-0',\n 'md:border-s',\n 'ms-2.5',\n 'pe-2',\n 'ps-1',\n 'ps-6',\n 'rounded-s-none',\n 'start-1',\n 'first:border-s-0',\n 'rtl:origin-right',\n // RTL Phase 2: Toast slide-in animation + RTL mirror\n 'animate-slide-in-right',\n 'rtl:animate-slide-in-left',\n // Motion CSS fallbacks — applied by `<Animated>` only when no motion runtime\n // is active, so the scanner never sees them on a literal element.\n 'animate-fade-in',\n // Scale origin for anchored menus, picked at runtime from the post-flip side.\n 'origin-top',\n 'origin-bottom',\n 'origin-left',\n 'origin-right',\n // RTL Phase 2: directional icon mirroring (chevrons/arrows)\n 'rtl:-scale-x-100',\n // RTL shell/misc batch: command palette, site chrome, superchat, toolbars\n 'end-12',\n 'md:end-4',\n 'md:start-auto',\n 'md:text-start',\n 'me-1.5',\n 'pe-12',\n 'pointer-fine:end-0',\n 'pointer-fine:end-1.5',\n 'ps-11',\n 'ps-12',\n 'rounded-e-lg',\n 'rounded-s-lg',\n 'sm:text-start',\n 'start-5',\n // SchedulePicker / overflow handling\n 'overflow-x-auto',\n 'overflow-hidden',\n // Scrollable floating panels (DateInput calendar, Autocomplete, Select, Table, ScrollArea, …)\n 'overflow-auto',\n // Select component\n 'truncate',\n // AIReconciliationPanel\n 'ring-primary-200',\n 'dark:ring-primary-900',\n 'border-primary-300',\n 'dark:border-primary-700',\n 'bg-primary-50/60',\n 'dark:bg-primary-950/30',\n 'text-primary-700',\n 'dark:text-primary-400',\n 'border-border/60',\n 'bg-muted/40',\n 'bg-muted/60',\n 'divide-border',\n 'max-h-[60vh]',\n 'bg-success-100',\n 'dark:bg-success-900/30',\n 'bg-amber-100',\n 'bg-amber-200',\n 'text-amber-700',\n 'text-amber-800',\n 'text-amber-200',\n 'text-amber-300',\n 'dark:bg-amber-900/30',\n 'dark:bg-amber-900/40',\n 'dark:text-amber-200',\n 'dark:text-amber-300',\n 'ring-1',\n 'last:border-b-0',\n 'border-dashed',\n 'text-[11px]',\n // CodeLookup memory picklist (frequently-used pick count)\n 'text-primary-600',\n // CodeLookup coding-system toggle (segmented radiogroup pills)\n 'flex',\n 'flex-wrap',\n 'items-center',\n 'gap-1',\n 'rounded-full',\n 'px-2.5',\n 'py-0.5',\n 'text-xs',\n 'transition-colors',\n 'focus:ring-2',\n 'focus:outline-none',\n 'border-primary-800',\n 'dark:border-primary-400',\n 'dark:bg-primary-400',\n 'dark:text-primary-950',\n 'text-white',\n 'hover:text-foreground',\n // CollabStatus debug panel (fixed-width portal, definition grid, log grid)\n 'w-[26rem]',\n 'max-w-[calc(100vw-1rem)]',\n 'grid-cols-[auto_1fr]',\n 'grid-cols-[auto_auto_1fr]',\n // SuperChat (participant chips, unread badge, active/hover states)\n 'bg-primary-100',\n 'bg-primary-600',\n 'hover:bg-primary-700',\n 'dark:bg-primary-900/40',\n 'text-primary-900',\n 'dark:text-primary-100',\n 'dark:text-primary-200',\n 'hover:border-primary-300',\n 'focus:border-primary-500',\n 'focus:ring-primary-500',\n 'text-[10px]',\n // SuperChat message actions (footer bar + sticky overflow menu) — arbitrary\n // touch-pointer variants and stacking above rich content (z-50 internals),\n // plus the standard utilities of the sticky wrapper and its footer handoff\n // (`invisible` keeps the hidden trigger out of the tab order).\n '[@media(pointer:coarse)]:opacity-100',\n 'z-[60]',\n 'z-10',\n 'invisible',\n 'transition-opacity',\n 'bottom-2',\n 'mt-auto',\n // Dropdown submenu flyout — preferred width clamped to the viewport.\n 'min-w-[min(10rem,calc(100vw-1rem))]',\n // SuperChat jump-to-bottom (floating scroll-anchoring affordance) and the\n // thread viewport wrapper / content sizer it positions against.\n 'bottom-3',\n 'z-20',\n 'bg-white',\n 'p-2',\n 'shadow-lg',\n 'space-y-4',\n 'hover:bg-neutral-50',\n 'hover:text-neutral-800',\n 'focus-visible:ring-primary-500',\n 'dark:hover:bg-neutral-700',\n 'dark:hover:text-neutral-100',\n // SuperChat mermaid diagram wrapper — arbitrary variants applied to the\n // injected <svg> so the diagram sizes naturally instead of collapsing.\n '[&_svg]:h-auto',\n '[&_svg]:max-w-none',\n // AI pills — CollapsiblePill / MCPToolCall arbitrary utilities\n 'rounded-[8px]',\n 'rounded-[10px]',\n 'px-[11px]',\n 'max-h-0',\n 'max-h-[500px]',\n 'transition-[max-height,opacity]',\n 'overflow-y-auto',\n 'focus-visible:ring-ring',\n 'focus-visible:ring-offset-1',\n // ThinkingBlock (violet reasoning pill)\n 'bg-violet-50',\n 'bg-violet-500',\n 'border-violet-200',\n 'text-violet-600',\n 'hover:bg-violet-100',\n 'focus-visible:ring-violet-500',\n 'animate-pulse',\n 'text-[13px]',\n 'dark:bg-violet-400',\n 'dark:bg-violet-950/30',\n 'dark:border-violet-700',\n 'dark:border-violet-800',\n 'dark:hover:bg-violet-950/50',\n 'dark:text-violet-400',\n // MCPToolCall status pills (green success / red error kept the same)\n 'bg-green-50',\n 'border-green-200',\n 'text-green-700',\n 'dark:bg-green-900/20',\n 'dark:border-green-800',\n 'dark:text-green-300',\n 'bg-red-50',\n 'border-red-200',\n 'text-red-700',\n 'dark:bg-red-900/20',\n 'dark:border-red-800',\n 'dark:text-red-300',\n 'bg-neutral-100',\n 'border-neutral-200',\n 'text-neutral-600',\n 'text-neutral-400',\n 'dark:bg-neutral-800',\n 'dark:border-neutral-700',\n 'dark:text-neutral-400',\n 'bg-primary-50',\n 'border-primary-200',\n 'text-primary-800',\n 'dark:bg-primary-900/20',\n 'dark:border-primary-800',\n 'dark:text-primary-300',\n 'opacity-60',\n // Kbd / KeyboardShortcutsOverlay — key chips and shortcut rows\n 'px-1.5',\n 'font-mono',\n 'mx-0.5',\n 'list-none',\n // FilterSummaryBar — filtered-grid summary bar and clear action\n 'py-1',\n 'h-2.5',\n 'w-2.5',\n 'dark:hover:text-primary-200',\n 'focus-visible:ring-offset-2',\n // Sparkline — bar sizing, gaps, and hover tints (bg-primary-500/40 and\n // focus-visible:ring-offset-1 are already safelisted above)\n 'min-w-[3px]',\n 'gap-[2px]',\n 'hover:bg-primary-500/70',\n 'hover:bg-primary-500/90',\n 'hover:bg-muted-foreground/20',\n 'items-end',\n 'w-16',\n 'pb-0.5',\n 'leading-tight',\n 'tracking-wider',\n 'rounded-sm',\n 'cursor-pointer',\n // ClampedText — collapsed clamp levels and fade gradient\n 'line-clamp-2',\n 'line-clamp-3',\n 'line-clamp-4',\n 'line-clamp-5',\n 'line-clamp-6',\n 'line-clamp-7',\n 'line-clamp-8',\n 'bg-gradient-to-t',\n 'from-card',\n 'from-background',\n 'to-transparent',\n 'break-words',\n 'whitespace-pre-wrap',\n 'hover:underline',\n // FreshnessBadge / FreshnessDot — tinted level chips and dots\n 'dark:bg-success/20',\n 'bg-warning/15',\n 'dark:bg-warning/20',\n 'dark:text-warning',\n 'dark:bg-destructive/20',\n 'bg-muted-foreground/50',\n 'h-2',\n 'w-2',\n 'inline-block',\n 'dark:text-success',\n 'dark:text-destructive',\n // Accordion — grid-rows height animation (arbitrary values TW3 won't scan)\n 'transition-[grid-template-rows]',\n 'grid-rows-[0fr]',\n 'grid-rows-[1fr]',\n 'disabled:opacity-50',\n 'disabled:pointer-events-none',\n 'divide-y',\n 'first:rounded-t-lg',\n 'focus-visible:outline-none',\n 'focus-visible:ring-inset',\n 'gap-3',\n 'grid',\n 'hover:bg-muted/60',\n 'last:rounded-b-lg',\n 'pb-4',\n 'px-5',\n 'py-4',\n 'rotate-180',\n 'transition-transform',\n // GlossaryTooltip hover card — trigger reset, gradient header, chips, footer links\n '[font:inherit]',\n 'appearance-none',\n 'bg-transparent',\n 'bg-white/15',\n 'block',\n 'border-0',\n 'border-t',\n 'dark:hover:text-primary-400',\n 'font-bold',\n 'font-medium',\n 'font-normal',\n 'gap-1.5',\n 'h-3',\n 'hover:border-primary-400',\n 'hover:text-primary-700',\n 'hover:text-primary-800',\n 'inline',\n 'inline-flex',\n 'items-start',\n 'leading-relaxed',\n 'leading-snug',\n 'mb-1',\n 'mt-2',\n 'normal-case',\n 'outline-none',\n 'p-0',\n 'px-2',\n 'text-inherit',\n 'text-white/70',\n 'tracking-normal',\n 'w-3',\n 'z-50',\n\n // SourceTip hover card — trigger affordance, gradient header, ring, scroll cap\n 'cursor-help',\n 'hover:text-primary-500',\n 'dark:hover:text-primary-300',\n 'w-80',\n 'decoration-dashed',\n 'decoration-primary-400/70',\n 'bg-primary-400',\n 'underline-offset-4',\n 'bg-gradient-to-br',\n 'from-primary-700',\n 'to-primary-600',\n 'ring-black/5',\n 'dark:ring-white/10',\n 'ring-1',\n 'overflow-y-auto',\n 'focus-visible:ring-2',\n 'max-h-52',\n 'text-primary-100/90',\n 'text-[10px]',\n 'text-[11px]',\n 'text-[13px]',\n 'px-3.5',\n 'py-2.5',\n 'mt-2.5',\n 'pt-2.5',\n 'mt-0.5',\n 'mt-1.5',\n 'h-1.5',\n 'w-1.5',\n 'border-dashed',\n 'shadow-xl',\n // CopyButton — inline copy-to-clipboard button\n 'p-1',\n\n // ReadingProgressBar — fixed top rail and width-transition fill\n 'inset-x-0',\n 'h-1',\n 'transition-[width]',\n 'duration-150',\n\n // Sidebar — desktop collapse animates the inline size only\n 'transition-[width,min-width]',\n\n // SectionSpyNav — sticky rail, brand tone whites, sliding underline\n 'sticky',\n 'top-0',\n 'z-30',\n 'bg-primary-900',\n 'bg-card/95',\n 'backdrop-blur',\n 'gap-4',\n 'px-4',\n 'shrink-0',\n 'tracking-wide',\n 'uppercase',\n 'text-white/85',\n '[scrollbar-width:none]',\n '[&::-webkit-scrollbar]:hidden',\n 'rounded',\n 'py-2',\n 'whitespace-nowrap',\n // Button label — keep SVG icons passed as children inline (preflight\n // makes SVGs block-level, which would stack them above the label text)\n '[&_svg]:inline-block',\n '[&_svg]:align-middle',\n // Button `effect` variants (sheen/orbit) lift the button on hover; the\n // mie-fx-* classes themselves are plain CSS in styles/effects.css.\n 'hover:-translate-y-0.5',\n // Button outline variant — dark-mode hover/active fill with lightened\n // label for WCAG AA contrast (issue #511).\n 'dark:hover:bg-primary-950',\n 'dark:active:bg-primary-900',\n 'dark:active:text-primary-100',\n // VideoCard hover-preview progress bar rounds its leading-fill edge.\n 'rounded-e-full',\n 'hover:text-white',\n 'h-0.5',\n 'transition-[left,width]',\n 'duration-300',\n 'hover:bg-white/10',\n 'h-3.5',\n 'w-3.5',\n // CustomizableDashboard — responsive column grid, flattened columns,\n // drag handle, drop placeholder\n 'grid-cols-1',\n 'md:grid-cols-2',\n 'lg:grid-cols-3',\n 'max-lg:contents',\n 'max-md:hidden',\n 'min-h-16',\n 'min-h-32',\n 'cursor-grab',\n 'active:cursor-grabbing',\n 'touch-none',\n 'opacity-40',\n 'group-hover/portlet:opacity-100',\n 'focus-visible:opacity-100',\n '[@media(hover:none)]:opacity-100',\n 'group/portlet',\n '[&>:nth-child(2)]:ms-auto',\n 'flex-nowrap',\n 'bg-card/80',\n 'border-dashed',\n 'border-2',\n 'bg-primary-500/10',\n // Modules/Views — accentClasses resolves an Accent token name to a wash, a\n // border and a solid marker, so none of them appear literally in a\n // consumer's own source. The wash and marker classes are listed elsewhere in\n // this file; these borders and the neutral marker are not.\n 'border-primary-500/40',\n 'border-success/40',\n 'border-warning/40',\n 'border-destructive/40',\n 'border-info/40',\n 'bg-muted-foreground',\n 'gap-0.5',\n 'p-0.5',\n // Floating labels (labelVariant=\"floating\" on Input / Textarea / DateInput /\n // Select, ui#406). The peer-* float states, arbitrary font size, and the\n // taller field heights/paddings never appear in consumer markup, so TW3\n // would purge them. (The bare `peer` marker class generates no CSS and\n // needs no safelisting.)\n 'placeholder:text-transparent',\n 'relative',\n 'h-11',\n 'h-14',\n 'h-16',\n 'pt-4',\n 'pt-5',\n 'pt-6',\n 'pt-7',\n 'pb-1',\n 'pb-1.5',\n 'pb-2',\n 'min-h-[76px]',\n 'min-h-[96px]',\n 'min-h-[120px]',\n // Floating-group field boxes (labelVariant=\"floating\" on RadioGroup /\n // CheckboxGroup) share the floating input heights as min-heights. sr-only\n // visually hides the group legend (and the hideLabel input label) while\n // keeping it accessible. mb-1.5 spaces stacked legends (legends ignore\n // fieldset flex gap) and mt-1 spaces floating-group descriptions.\n 'min-h-11',\n 'min-h-14',\n 'min-h-16',\n 'sr-only',\n 'mb-1.5',\n 'mt-1',\n 'absolute',\n 'pointer-events-none',\n 'select-none',\n 'transition-all',\n 'duration-200',\n 'ease-out',\n 'top-0.5',\n 'top-1',\n 'top-1.5',\n 'top-2',\n 'top-3',\n 'top-4',\n 'top-5',\n 'top-1/2',\n '-translate-y-1/2',\n 'translate-y-0',\n 'text-sm',\n 'text-base',\n 'text-lg',\n 'text-[0.65rem]',\n 'peer-focus:top-0.5',\n 'peer-focus:top-1',\n 'peer-focus:top-1.5',\n 'peer-focus:top-2',\n 'peer-focus:text-[0.65rem]',\n 'peer-focus:text-xs',\n 'peer-focus:text-sm',\n 'peer-focus:translate-y-0',\n 'peer-[:not(:placeholder-shown)]:top-0.5',\n 'peer-[:not(:placeholder-shown)]:top-1',\n 'peer-[:not(:placeholder-shown)]:top-1.5',\n 'peer-[:not(:placeholder-shown)]:top-2',\n 'peer-[:not(:placeholder-shown)]:text-[0.65rem]',\n 'peer-[:not(:placeholder-shown)]:text-xs',\n 'peer-[:not(:placeholder-shown)]:text-sm',\n 'peer-[:not(:placeholder-shown)]:translate-y-0',\n 'peer-autofill:top-0.5',\n 'peer-autofill:top-1',\n 'peer-autofill:top-1.5',\n 'peer-autofill:top-2',\n 'peer-autofill:text-[0.65rem]',\n 'peer-autofill:text-xs',\n 'peer-autofill:text-sm',\n 'peer-autofill:translate-y-0',\n // DockablePanel — full-screen dialog that collapses to a bottom-right dock:\n // scrim, dock geometry, panel chrome, clipped full-width content\n 'fixed',\n 'inset-0',\n 'inset-6',\n 'inset-auto',\n 'bg-slate-900/45',\n 'end-0',\n 'end-6',\n 'bottom-0',\n 'top-full',\n 'w-full',\n 'h-full',\n 'w-[26rem]',\n 'max-w-[calc(100vw-3rem)]',\n 'max-w-[90rem]',\n 'w-[min(90rem,100vw-3rem)]',\n 'h-[calc(100vh-4rem)]',\n 'max-sm:inset-0',\n 'max-sm:inset-x-0',\n 'max-sm:w-full',\n 'max-sm:w-screen',\n 'max-sm:max-w-full',\n 'shadow-[0_1.25rem_2.5rem_rgb(15_23_42/0.22)]',\n 'rounded-lg',\n 'rounded-t-lg',\n 'border',\n 'border-b',\n 'border-b-0',\n 'flex',\n 'flex-1',\n 'flex-col',\n 'relative',\n 'absolute',\n 'items-center',\n 'justify-center',\n 'justify-between',\n 'gap-1',\n 'gap-2',\n 'px-3',\n 'py-2.5',\n 'm-0',\n 'min-h-0',\n 'min-w-0',\n 'text-sm',\n 'text-[0.9375rem]',\n 'font-semibold',\n 'capitalize',\n 'sr-only',\n // ChatComposer responsive grid: stacked cells below md, single-row pill\n // (md: overrides) above, plus the card surface\n 'grid-cols-[auto_minmax(0,1fr)_auto]',\n 'col-span-3',\n 'col-start-1',\n 'col-start-3',\n 'row-start-1',\n 'row-start-2',\n 'px-1',\n 'pt-1',\n 'pt-2',\n 'pb-1',\n 'rounded-2xl',\n 'dark:bg-[#1c1c1e]',\n 'dark:border-[#2e2e30]',\n // ChatComposer mobile keyboard: 16px input below sm (no iOS zoom) and\n // tap-to-focus card cursor (text-base is safelisted above)\n 'sm:text-sm',\n 'cursor-text',\n 'md:col-span-1',\n 'md:col-start-2',\n 'md:row-start-1',\n 'md:self-end',\n 'md:p-1.5',\n 'md:py-1.5',\n 'md:px-0',\n 'md:pe-0.5',\n 'md:ps-0.5',\n 'md:gap-0.5',\n // EH frontdoor ports (ui#420) — arbitrary values, opacity modifiers, and\n // variants emitted by MegaMenu / VideoCard / YearTimeline / SliderCalculator /\n // OrbitRing / RadialExplorer / Globe that TW3 consumers can't generate.\n // Shared positioning & typography\n '-translate-x-1/2',\n '-translate-y-1/2',\n 'left-1/2',\n 'top-1/2',\n 'tabular-nums',\n 'aspect-square',\n 'aspect-video',\n 'backdrop-blur-md',\n // SiteHeader mobile drawer — static group labels reuse the link style\n 'hover:bg-transparent',\n // MegaMenu — panel layout, feature column gradient, link states\n '[&_svg]:h-4',\n '[&_svg]:h-5',\n '[&_svg]:h-7',\n '[&_svg]:w-4',\n '[&_svg]:w-5',\n '[&_svg]:w-7',\n '[background:linear-gradient(160deg,color-mix(in_srgb,var(--mieweb-accent,var(--mieweb-primary-700))_70%,#000)_0%,var(--mieweb-primary-950)_100%)]',\n 'grid-cols-[1fr_280px]',\n 'w-[min(600px,calc(100vw-2rem))]',\n 'w-[min(880px,calc(100vw-2rem))]',\n 'transition-[opacity,transform]',\n 'motion-safe:animate-[mie-fade-in_0.2s_ease-out]',\n 'bg-white/10',\n 'border-white/40',\n 'text-foreground/70',\n 'text-foreground/80',\n 'text-white/80',\n 'text-white/90',\n 'hover:bg-primary-500/10',\n 'hover:bg-primary-900',\n 'hover:border-primary-500',\n 'hover:border-white',\n 'group-hover:bg-primary-800',\n 'group-hover:text-primary-800',\n 'group-hover:text-white',\n 'dark:group-hover:text-primary-200',\n 'focus-visible:bg-primary-500/10',\n // VideoCard — hover-preview conic progress ring and play button\n '[-webkit-mask:radial-gradient(farthest-side,transparent_calc(100%-4px),#000_calc(100%-4px))]',\n '[mask:radial-gradient(farthest-side,transparent_calc(100%-4px),#000_calc(100%-4px))]',\n '[background:conic-gradient(from_0deg,transparent_0deg,var(--mieweb-primary-500)_90deg,var(--mieweb-primary-300)_240deg,var(--mieweb-primary-200)_320deg,transparent_360deg)]',\n 'drop-shadow-[0_0_5px_color-mix(in_srgb,var(--mieweb-primary-400)_60%,transparent)]',\n 'bg-white/90',\n 'group-hover:opacity-100',\n 'group-hover:scale-110',\n 'group-focus-visible:opacity-100',\n 'motion-safe:animate-[mie-spin_1.4s_linear_infinite]',\n // YearTimeline — spine gradient, markers, responsive label rail\n 'grid-cols-12',\n 'md:grid',\n 'md:grid-cols-[var(--yt-label)_1fr]',\n 'md:block',\n 'md:inline',\n 'md:pb-4',\n 'md:py-3.5',\n 'md:h-[22px]',\n 'md:border-border/60',\n 'before:absolute',\n 'before:content-[\"\"]',\n 'before:inset-x-0',\n 'before:top-0',\n 'before:left-1/2',\n 'before:-translate-x-1/2',\n 'before:h-1',\n 'before:h-2.5',\n 'before:w-2.5',\n 'before:rounded-full',\n 'before:bg-primary-700',\n 'before:z-[4]',\n 'before:[background:linear-gradient(90deg,var(--mieweb-accent,var(--mieweb-primary-400))_0%,var(--mieweb-primary-500)_50%,var(--mieweb-success)_80%,var(--mieweb-accent,var(--mieweb-primary-400))_100%)]',\n '[background:linear-gradient(180deg,var(--mieweb-primary-700),color-mix(in_srgb,var(--mieweb-primary-700)_15%,transparent))]',\n '[&_svg]:h-3.5',\n '[&_svg]:w-3.5',\n '[text-shadow:0_1px_1px_rgba(0,0,0,0.3)]',\n 'bg-muted/30',\n 'border-border/60',\n 'hover:bg-muted/40',\n 'text-[9px]',\n 'tracking-[0.08em]',\n 'tracking-[0.09em]',\n 'tracking-[0.11em]',\n 'tracking-[0.12em]',\n 'z-[1]',\n 'z-[3]',\n 'z-[5]',\n // SliderCalculator — dark panel gradients and glassy rows\n '[background:linear-gradient(90deg,var(--mieweb-accent,var(--mieweb-primary-300)),var(--mieweb-primary-300))]',\n '[background:radial-gradient(120%_120%_at_100%_0%,var(--mieweb-primary-800),var(--mieweb-primary-950)_70%)]',\n 'lg:grid-cols-[1.1fr_1fr]',\n 'sm:p-8',\n 'sm:text-3xl',\n 'sm:text-6xl',\n 'bg-white/5',\n 'border-white/10',\n 'border-white/15',\n 'text-white/60',\n 'text-white/75',\n 'last:border-0',\n // OrbitRing — attract-loop rotation, pause-on-hover, glow ring\n 'group/orbit',\n 'group/sat',\n '[container-type:size]',\n 'motion-safe:animate-[mie-spin_var(--dur)_linear_infinite]',\n 'group-hover/orbit:[animation-play-state:paused]',\n 'group-focus-within/orbit:[animation-play-state:paused]',\n '[background:radial-gradient(circle_at_50%_38%,#fff_0%,color-mix(in_srgb,var(--mieweb-accent,var(--mieweb-primary-200))_14%,#fff)_52%,color-mix(in_srgb,var(--mieweb-accent,var(--mieweb-primary-200))_30%,#fff)_100%)]',\n '[background:radial-gradient(closest-side,color-mix(in_srgb,var(--mieweb-accent,var(--mieweb-primary-300))_30%,transparent)_0%,color-mix(in_srgb,var(--mieweb-accent,var(--mieweb-primary-300))_12%,transparent)_42%,transparent_78%)]',\n 'shadow-[0_0_0_1px_color-mix(in_srgb,var(--mieweb-accent,var(--mieweb-primary-400))_35%,transparent),0_10px_30px_rgba(0,0,0,0.18),0_0_46px_color-mix(in_srgb,var(--mieweb-accent,var(--mieweb-primary-400))_42%,transparent)]',\n 'dark:border-primary-800',\n // RadialExplorer — dot navigation and reveal animation\n 'motion-safe:animate-[mie-fade-in_0.25s_ease-out]',\n 'text-[15px]',\n 'tracking-[0.14em]',\n // Globe — HTML overlay chrome (TW3 consumers using the /globe entry)\n 'bg-[var(--mieweb-accent,#ffe7b0)]',\n 'shadow-[0_0_8px_var(--mieweb-accent,#ffe7b0)]',\n 'bg-neutral-950/70',\n 'max-w-[min(90%,360px)]',\n 'motion-safe:animate-[mie-fade-in_0.28s_ease]',\n // RadialExplorer / VideoCard / SliderCalculator stragglers\n 'tracking-[0.18em]',\n 'tracking-tight',\n 'start-1/2',\n 'w-[calc(var(--re-r)*2+120px)]',\n 'bg-[linear-gradient(90deg,var(--mieweb-primary-500),var(--mieweb-primary-300))]',\n 'bg-black/55',\n 'bg-black/60',\n 'group-hover:text-primary-700',\n 'dark:group-hover:text-primary-300',\n // SiteHeader — menus/MegaMenuBar row and mobile drawer (touched in ui#420)\n 'bg-black/50',\n 'bg-white/20',\n 'bg-white/80',\n 'border-white/30',\n 'hover:bg-white/90',\n 'hover:bg-gray-100',\n 'hover:bg-red-50',\n 'hover:text-gray-700',\n 'hover:text-gray-900',\n 'max-h-[calc(100dvh-10rem)]',\n 'md:flex',\n 'sm:block',\n 'dark:border-b',\n 'dark:bg-gray-800',\n 'dark:bg-gray-900',\n 'dark:bg-gray-900/80',\n 'dark:bg-primary-900/30',\n 'dark:border-gray-600',\n 'dark:border-gray-700',\n 'dark:border-gray-800',\n 'dark:hover:bg-gray-700',\n 'dark:hover:bg-gray-800',\n 'dark:hover:bg-red-900/20',\n 'dark:hover:text-gray-200',\n 'dark:hover:text-white',\n 'dark:text-gray-300',\n 'dark:text-red-400',\n 'dark:text-white',\n // Badge usages added in ui#420 (VideoCard duration pill, RadialExplorer tag)\n 'dark:bg-black/60',\n 'bg-primary-100',\n 'text-primary-900',\n 'dark:bg-primary-900',\n 'dark:text-primary-100',\n // Templates tier (ui#506) — arbitrary values, opacity modifiers and variants\n '[&::-webkit-details-marker]:hidden',\n '[mask-image:linear-gradient(90deg,transparent,black_10%,black_90%,transparent)]',\n 'inset-x-[25%]',\n 'inset-x-[16.667%]',\n 'inset-x-[12.5%]',\n 'max-w-[9rem]',\n 'min-w-[36rem]',\n 'bg-white/25',\n 'border-white/70',\n 'dark:border-white/70',\n 'dark:bg-primary-800',\n 'dark:bg-primary-900/60',\n 'dark:hover:bg-white/10',\n 'group-open:rotate-180',\n 'rtl:-scale-x-100',\n 'after:absolute',\n 'after:inset-0',\n 'motion-reduce:transition-none',\n 'text-balance',\n 'text-pretty',\n];\n\nexport interface MiewebUIPreset {\n darkMode: ['class', '[data-theme=\"dark\"]'];\n safelist: string[];\n theme: {\n extend: Record<string, unknown>;\n };\n}\n\nexport const miewebUIPreset: MiewebUIPreset = {\n darkMode: ['class', '[data-theme=\"dark\"]'],\n safelist: miewebUISafelist,\n theme: {\n extend: {\n colors: {\n // Primary color scale - easily overridable by consumers\n primary: {\n DEFAULT: 'var(--mieweb-primary, var(--mieweb-primary-500, #27aae1))',\n 50: 'var(--mieweb-primary-50, #e6f7fc)',\n 100: 'var(--mieweb-primary-100, #b3e6f6)',\n 200: 'var(--mieweb-primary-200, #80d5f0)',\n 300: 'var(--mieweb-primary-300, #4dc4ea)',\n 400: 'var(--mieweb-primary-400, #27aae1)',\n 500: 'var(--mieweb-primary-500, #27aae1)',\n 600: 'var(--mieweb-primary-600, #1f98ca)',\n 700: 'var(--mieweb-primary-700, #1786b3)',\n 800: 'var(--mieweb-primary-800, #0f749c)',\n 900: 'var(--mieweb-primary-900, #086285)',\n 950: 'var(--mieweb-primary-950, #00506e)',\n foreground: 'var(--mieweb-primary-foreground, hsl(210 40% 98%))',\n },\n // Ozwell brand accent (the \"Hey Ozwell\" octopus blue) — distinct from the host app primary.\n ozwell: {\n DEFAULT: 'var(--mieweb-ozwell, #0BA0E0)',\n foreground: 'var(--mieweb-ozwell-foreground, hsl(0 0% 100%))',\n },\n // Secondary color scale\n secondary: {\n DEFAULT: 'var(--mieweb-secondary-500, #6366f1)',\n 50: 'var(--mieweb-secondary-50, #eef2ff)',\n 100: 'var(--mieweb-secondary-100, #e0e7ff)',\n 200: 'var(--mieweb-secondary-200, #c7d2fe)',\n 300: 'var(--mieweb-secondary-300, #a5b4fc)',\n 400: 'var(--mieweb-secondary-400, #818cf8)',\n 500: 'var(--mieweb-secondary-500, #6366f1)',\n 600: 'var(--mieweb-secondary-600, #4f46e5)',\n 700: 'var(--mieweb-secondary-700, #4338ca)',\n 800: 'var(--mieweb-secondary-800, #3730a3)',\n 900: 'var(--mieweb-secondary-900, #312e81)',\n 950: 'var(--mieweb-secondary-950, #1e1b4b)',\n foreground: 'var(--mieweb-secondary-foreground, #ffffff)',\n },\n // Neutral / gray scale\n neutral: {\n DEFAULT: 'var(--mieweb-neutral-500, #737373)',\n 50: 'var(--mieweb-neutral-50, #fafafa)',\n 100: 'var(--mieweb-neutral-100, #f5f5f5)',\n 200: 'var(--mieweb-neutral-200, #e5e5e5)',\n 300: 'var(--mieweb-neutral-300, #d4d4d4)',\n 400: 'var(--mieweb-neutral-400, #a3a3a3)',\n 500: 'var(--mieweb-neutral-500, #737373)',\n 600: 'var(--mieweb-neutral-600, #525252)',\n 700: 'var(--mieweb-neutral-700, #404040)',\n 800: 'var(--mieweb-neutral-800, #262626)',\n 900: 'var(--mieweb-neutral-900, #171717)',\n 950: 'var(--mieweb-neutral-950, #0a0a0a)',\n },\n // Semantic colors using CSS variables for theming\n border: 'var(--mieweb-border, hsl(214.3 31.8% 91.4%))',\n input: 'var(--mieweb-input, hsl(214.3 31.8% 91.4%))',\n ring: 'var(--mieweb-ring, hsl(221.2 83.2% 53.3%))',\n background: 'var(--mieweb-background, hsl(0 0% 100%))',\n foreground: 'var(--mieweb-foreground, hsl(222.2 84% 4.9%))',\n // Component-specific semantic colors\n card: {\n DEFAULT: 'var(--mieweb-card, hsl(0 0% 100%))',\n foreground: 'var(--mieweb-card-foreground, hsl(222.2 84% 4.9%))',\n },\n muted: {\n DEFAULT: 'var(--mieweb-muted, hsl(210 40% 96.1%))',\n foreground: 'var(--mieweb-muted-foreground, hsl(215.4 16.3% 46.9%))',\n },\n // Destructive / error scale\n destructive: {\n DEFAULT:\n 'var(--mieweb-destructive, var(--mieweb-destructive-500, #dc2626))',\n 50: 'var(--mieweb-destructive-50, #fef2f2)',\n 100: 'var(--mieweb-destructive-100, #fee2e2)',\n 200: 'var(--mieweb-destructive-200, #fecaca)',\n 300: 'var(--mieweb-destructive-300, #fca5a5)',\n 400: 'var(--mieweb-destructive-400, #f87171)',\n 500: 'var(--mieweb-destructive-500, #dc2626)',\n 600: 'var(--mieweb-destructive-600, #dc2626)',\n 700: 'var(--mieweb-destructive-700, #b91c1c)',\n 800: 'var(--mieweb-destructive-800, #991b1b)',\n 900: 'var(--mieweb-destructive-900, #7f1d1d)',\n 950: 'var(--mieweb-destructive-950, #450a0a)',\n foreground: 'var(--mieweb-destructive-foreground, hsl(210 40% 98%))',\n },\n // Success scale\n success: {\n DEFAULT: 'var(--mieweb-success-500, #22c55e)',\n 50: 'var(--mieweb-success-50, #f0fdf4)',\n 100: 'var(--mieweb-success-100, #dcfce7)',\n 200: 'var(--mieweb-success-200, #bbf7d0)',\n 300: 'var(--mieweb-success-300, #86efac)',\n 400: 'var(--mieweb-success-400, #4ade80)',\n 500: 'var(--mieweb-success-500, #22c55e)',\n 600: 'var(--mieweb-success-600, #16a34a)',\n 700: 'var(--mieweb-success-700, #15803d)',\n 800: 'var(--mieweb-success-800, #166534)',\n 900: 'var(--mieweb-success-900, #14532d)',\n 950: 'var(--mieweb-success-950, #052e16)',\n foreground: 'var(--mieweb-success-foreground, hsl(355.7 100% 97.3%))',\n },\n // Warning scale\n warning: {\n DEFAULT: 'var(--mieweb-warning-500, #f59e0b)',\n 50: 'var(--mieweb-warning-50, #fffbeb)',\n 100: 'var(--mieweb-warning-100, #fef3c7)',\n 200: 'var(--mieweb-warning-200, #fde68a)',\n 300: 'var(--mieweb-warning-300, #fcd34d)',\n 400: 'var(--mieweb-warning-400, #fbbf24)',\n 500: 'var(--mieweb-warning-500, #f59e0b)',\n 600: 'var(--mieweb-warning-600, #d97706)',\n 700: 'var(--mieweb-warning-700, #b45309)',\n 800: 'var(--mieweb-warning-800, #92400e)',\n 900: 'var(--mieweb-warning-900, #78350f)',\n 950: 'var(--mieweb-warning-950, #451a03)',\n foreground: 'var(--mieweb-warning-foreground, hsl(26 83.3% 14.1%))',\n },\n // Info scale\n info: {\n DEFAULT: 'var(--mieweb-info-500, #0ea5e9)',\n 50: 'var(--mieweb-info-50, #f0f9ff)',\n 100: 'var(--mieweb-info-100, #e0f2fe)',\n 200: 'var(--mieweb-info-200, #bae6fd)',\n 300: 'var(--mieweb-info-300, #7dd3fc)',\n 400: 'var(--mieweb-info-400, #38bdf8)',\n 500: 'var(--mieweb-info-500, #0ea5e9)',\n 600: 'var(--mieweb-info-600, #0284c7)',\n 700: 'var(--mieweb-info-700, #0369a1)',\n 800: 'var(--mieweb-info-800, #075985)',\n 900: 'var(--mieweb-info-900, #0c4a6e)',\n 950: 'var(--mieweb-info-950, #082f49)',\n foreground: 'var(--mieweb-info-foreground, #ffffff)',\n },\n // Chart / data visualization\n chart: {\n 1: 'var(--mieweb-chart-1, #27aae1)',\n 2: 'var(--mieweb-chart-2, #22c55e)',\n 3: 'var(--mieweb-chart-3, #f59e0b)',\n 4: 'var(--mieweb-chart-4, #ef4444)',\n 5: 'var(--mieweb-chart-5, #6366f1)',\n },\n },\n fontFamily: {\n sans: [\n 'var(--mieweb-font-sans, ui-sans-serif)',\n 'system-ui',\n 'sans-serif',\n ],\n },\n borderRadius: {\n '2xl': 'var(--mieweb-radius-2xl, 1rem)',\n lg: 'var(--mieweb-radius-lg, 0.75rem)',\n md: 'var(--mieweb-radius-md, 0.5rem)',\n sm: 'var(--mieweb-radius-sm, 0.25rem)',\n xl: 'var(--mieweb-radius-xl, 1rem)',\n },\n boxShadow: {\n card: 'var(--mieweb-shadow-card, 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1))',\n },\n keyframes: {\n 'fade-in': {\n '0%': { opacity: '0' },\n '100%': { opacity: '1' },\n },\n 'fade-out': {\n '0%': { opacity: '1' },\n '100%': { opacity: '0' },\n },\n 'slide-in-from-top': {\n '0%': { transform: 'translateY(-0.5rem)', opacity: '0' },\n '100%': { transform: 'translateY(0)', opacity: '1' },\n },\n 'slide-in-from-bottom': {\n '0%': { transform: 'translateY(0.5rem)', opacity: '0' },\n '100%': { transform: 'translateY(0)', opacity: '1' },\n },\n 'slide-in-right': {\n '0%': { transform: 'translateX(100%)', opacity: '0' },\n '100%': { transform: 'translateX(0)', opacity: '1' },\n },\n 'slide-in-left': {\n '0%': { transform: 'translateX(-100%)', opacity: '0' },\n '100%': { transform: 'translateX(0)', opacity: '1' },\n },\n 'scale-in': {\n '0%': { transform: 'scale(0.95)', opacity: '0' },\n '100%': { transform: 'scale(1)', opacity: '1' },\n },\n 'ozwell-message-flare': {\n '0%': {\n boxShadow:\n '0 0 0 0 color-mix(in srgb, var(--mieweb-primary-700, #1786b3) 34%, transparent)',\n },\n '70%': {\n boxShadow:\n '0 0 0 8px color-mix(in srgb, var(--mieweb-primary-700, #1786b3) 0%, transparent)',\n },\n '100%': {\n boxShadow:\n '0 0 0 0 color-mix(in srgb, var(--mieweb-primary-700, #1786b3) 0%, transparent)',\n },\n },\n },\n animation: {\n 'fade-in': 'fade-in 150ms ease-out',\n 'fade-out': 'fade-out 150ms ease-in',\n 'slide-in-from-top': 'slide-in-from-top 150ms ease-out',\n 'slide-in-from-bottom': 'slide-in-from-bottom 150ms ease-out',\n 'slide-in-right': 'slide-in-right 300ms ease-out',\n 'slide-in-left': 'slide-in-left 300ms ease-out',\n 'scale-in': 'scale-in 150ms ease-out',\n 'ozwell-message-flare': 'ozwell-message-flare 1.8s ease-out',\n },\n // ClampedText supports 7/8-line clamps beyond Tailwind 3's core 1–6 scale\n lineClamp: {\n 7: '7',\n 8: '8',\n },\n },\n },\n};\n\nexport default miewebUIPreset;\n"]}
@@ -1,4 +1,4 @@
1
- import { Button } from './chunk-UV4IJNSN.js';
1
+ import { Button } from './chunk-7YO7DNUV.js';
2
2
  import { Eye, Code, Check, ClipboardCopy } from 'lucide-react';
3
3
  import { useState, useRef, useEffect, useCallback } from 'react';
4
4
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -94,5 +94,5 @@ var FenceBlock = ({
94
94
  };
95
95
 
96
96
  export { FenceBlock };
97
- //# sourceMappingURL=chunk-WBBOH5QF.js.map
98
- //# sourceMappingURL=chunk-WBBOH5QF.js.map
97
+ //# sourceMappingURL=chunk-QOVJ6Z6R.js.map
98
+ //# sourceMappingURL=chunk-QOVJ6Z6R.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Markdown/FenceBlock.tsx"],"names":[],"mappings":"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","file":"chunk-WBBOH5QF.js","sourcesContent":["/**\n * FenceBlock — Base wrapper for code blocks with copy, raw view toggle, and errors.\n */\nimport { Check, ClipboardCopy, Code, Eye } from 'lucide-react';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { Button } from '../Button';\n\nexport interface FenceBlockProps {\n code: string;\n language?: string;\n supportsRawView?: boolean;\n error?: string;\n children: React.ReactNode;\n /** Extra buttons rendered in the header before the copy button */\n headerActions?: React.ReactNode;\n}\n\ntype CopyState = 'idle' | 'copying' | 'success' | 'error';\n\nexport const FenceBlock: React.FC<FenceBlockProps> = ({\n code,\n language,\n supportsRawView = false,\n error,\n children,\n headerActions,\n}) => {\n const [copyState, setCopyState] = useState<CopyState>('idle');\n const [showRaw, setShowRaw] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(\n () => () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n },\n []\n );\n\n const scheduleReset = useCallback(() => {\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => setCopyState('idle'), 2000);\n }, []);\n\n const handleCopy = useCallback(async () => {\n if (copyState === 'copying') return;\n setCopyState('copying');\n try {\n await navigator.clipboard.writeText(code);\n setCopyState('success');\n scheduleReset();\n } catch {\n try {\n const textarea = document.createElement('textarea');\n textarea.value = code;\n textarea.style.position = 'fixed';\n textarea.style.opacity = '0';\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand('copy');\n document.body.removeChild(textarea);\n setCopyState('success');\n } catch {\n setCopyState('error');\n }\n scheduleReset();\n }\n }, [code, copyState, scheduleReset]);\n\n return (\n <div className=\"group relative my-3 overflow-hidden rounded-lg border border-neutral-200 bg-neutral-50 dark:border-neutral-700 dark:bg-[#1a1d24]\">\n <div className=\"flex items-center justify-between border-b border-neutral-200 px-3 py-1.5 dark:border-white/[0.08]\">\n <span className=\"text-xs font-medium text-neutral-500 dark:text-neutral-400\">\n {language\n ? language.charAt(0).toUpperCase() + language.slice(1)\n : 'Text'}\n </span>\n <div className=\"flex items-center gap-1\">\n {headerActions}\n {supportsRawView && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setShowRaw((v) => !v)}\n aria-label={showRaw ? 'Show rendered view' : 'Show raw code'}\n className=\"h-7 w-7 p-0\"\n >\n {showRaw ? (\n <Eye className=\"h-3.5 w-3.5\" />\n ) : (\n <Code className=\"h-3.5 w-3.5\" />\n )}\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleCopy}\n aria-label=\"Copy code\"\n className=\"h-7 w-7 p-0\"\n >\n {copyState === 'success' ? (\n <Check className=\"h-3.5 w-3.5 text-green-500\" />\n ) : (\n <ClipboardCopy className=\"h-3.5 w-3.5\" />\n )}\n </Button>\n </div>\n </div>\n\n {error ? (\n <div className=\"p-3\">\n <div className=\"rounded-md bg-red-50 p-3 text-sm text-red-800 dark:bg-red-900/20 dark:text-red-300\">\n {error}\n </div>\n <pre className=\"mt-2 overflow-x-auto text-xs whitespace-pre-wrap text-neutral-600 dark:text-neutral-400\">\n <code>{code}</code>\n </pre>\n </div>\n ) : showRaw ? (\n <pre\n className=\"overflow-x-auto p-3 text-sm\"\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- scrollable code needs keyboard focus (axe: scrollable-region-focusable)\n tabIndex={0}\n role=\"region\"\n aria-label=\"Raw code\"\n >\n <code>{code}</code>\n </pre>\n ) : (\n <div className=\"overflow-x-auto\">{children}</div>\n )}\n </div>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/components/Markdown/FenceBlock.tsx"],"names":[],"mappings":"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","file":"chunk-QOVJ6Z6R.js","sourcesContent":["/**\n * FenceBlock — Base wrapper for code blocks with copy, raw view toggle, and errors.\n */\nimport { Check, ClipboardCopy, Code, Eye } from 'lucide-react';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { Button } from '../Button';\n\nexport interface FenceBlockProps {\n code: string;\n language?: string;\n supportsRawView?: boolean;\n error?: string;\n children: React.ReactNode;\n /** Extra buttons rendered in the header before the copy button */\n headerActions?: React.ReactNode;\n}\n\ntype CopyState = 'idle' | 'copying' | 'success' | 'error';\n\nexport const FenceBlock: React.FC<FenceBlockProps> = ({\n code,\n language,\n supportsRawView = false,\n error,\n children,\n headerActions,\n}) => {\n const [copyState, setCopyState] = useState<CopyState>('idle');\n const [showRaw, setShowRaw] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(\n () => () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n },\n []\n );\n\n const scheduleReset = useCallback(() => {\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => setCopyState('idle'), 2000);\n }, []);\n\n const handleCopy = useCallback(async () => {\n if (copyState === 'copying') return;\n setCopyState('copying');\n try {\n await navigator.clipboard.writeText(code);\n setCopyState('success');\n scheduleReset();\n } catch {\n try {\n const textarea = document.createElement('textarea');\n textarea.value = code;\n textarea.style.position = 'fixed';\n textarea.style.opacity = '0';\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand('copy');\n document.body.removeChild(textarea);\n setCopyState('success');\n } catch {\n setCopyState('error');\n }\n scheduleReset();\n }\n }, [code, copyState, scheduleReset]);\n\n return (\n <div className=\"group relative my-3 overflow-hidden rounded-lg border border-neutral-200 bg-neutral-50 dark:border-neutral-700 dark:bg-[#1a1d24]\">\n <div className=\"flex items-center justify-between border-b border-neutral-200 px-3 py-1.5 dark:border-white/[0.08]\">\n <span className=\"text-xs font-medium text-neutral-500 dark:text-neutral-400\">\n {language\n ? language.charAt(0).toUpperCase() + language.slice(1)\n : 'Text'}\n </span>\n <div className=\"flex items-center gap-1\">\n {headerActions}\n {supportsRawView && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setShowRaw((v) => !v)}\n aria-label={showRaw ? 'Show rendered view' : 'Show raw code'}\n className=\"h-7 w-7 p-0\"\n >\n {showRaw ? (\n <Eye className=\"h-3.5 w-3.5\" />\n ) : (\n <Code className=\"h-3.5 w-3.5\" />\n )}\n </Button>\n )}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleCopy}\n aria-label=\"Copy code\"\n className=\"h-7 w-7 p-0\"\n >\n {copyState === 'success' ? (\n <Check className=\"h-3.5 w-3.5 text-green-500\" />\n ) : (\n <ClipboardCopy className=\"h-3.5 w-3.5\" />\n )}\n </Button>\n </div>\n </div>\n\n {error ? (\n <div className=\"p-3\">\n <div className=\"rounded-md bg-red-50 p-3 text-sm text-red-800 dark:bg-red-900/20 dark:text-red-300\">\n {error}\n </div>\n <pre className=\"mt-2 overflow-x-auto text-xs whitespace-pre-wrap text-neutral-600 dark:text-neutral-400\">\n <code>{code}</code>\n </pre>\n </div>\n ) : showRaw ? (\n <pre\n className=\"overflow-x-auto p-3 text-sm\"\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- scrollable code needs keyboard focus (axe: scrollable-region-focusable)\n tabIndex={0}\n role=\"region\"\n aria-label=\"Raw code\"\n >\n <code>{code}</code>\n </pre>\n ) : (\n <div className=\"overflow-x-auto\">{children}</div>\n )}\n </div>\n );\n};\n"]}
@@ -1,5 +1,5 @@
1
- import { FenceBlock } from './chunk-WBBOH5QF.js';
2
- import { Button } from './chunk-UV4IJNSN.js';
1
+ import { FenceBlock } from './chunk-QOVJ6Z6R.js';
2
+ import { Button } from './chunk-7YO7DNUV.js';
3
3
  import { Download } from 'lucide-react';
4
4
  import { useState, useEffect, useMemo, useCallback } from 'react';
5
5
  import { jsx, jsxs } from 'react/jsx-runtime';
@@ -178,5 +178,5 @@ var CsvBlock = ({ code, id }) => {
178
178
  };
179
179
 
180
180
  export { CsvBlock };
181
- //# sourceMappingURL=chunk-4IETGCMD.js.map
182
- //# sourceMappingURL=chunk-4IETGCMD.js.map
181
+ //# sourceMappingURL=chunk-R6KPWIGO.js.map
182
+ //# sourceMappingURL=chunk-R6KPWIGO.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Markdown/CsvBlock.tsx"],"names":[],"mappings":"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","file":"chunk-4IETGCMD.js","sourcesContent":["/** CSV data rendered as a sortable table. Requires `papaparse`. */\nimport { Download } from 'lucide-react';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { Button } from '../Button';\nimport { FenceBlock } from './FenceBlock';\n\ninterface CsvBlockProps {\n code: string;\n id: string;\n}\n\ninterface SortConfig {\n column: string;\n direction: 'asc' | 'desc';\n}\n\ntype CsvRow = Record<string, unknown>;\n// Minimal surface of papaparse we actually use, avoiding overload conflicts.\ninterface PapaApi {\n parse(\n input: string,\n config?: Record<string, unknown>\n ): {\n meta: { fields?: string[] };\n data: CsvRow[];\n errors: Array<{ message: string }>;\n };\n unparse(data: unknown): string;\n}\n\nlet papaPromise: Promise<PapaApi> | null = null;\nfunction loadPapa() {\n if (!papaPromise) {\n papaPromise = import(/* @vite-ignore */ 'papaparse')\n .then((mod: { default?: PapaApi } & Partial<PapaApi>) => {\n const api: PapaApi = (mod.default ?? mod) as PapaApi;\n if (!api?.parse) throw new Error('papaparse export not found');\n return api;\n })\n .catch((err) => {\n papaPromise = null;\n throw err as Error;\n });\n }\n return papaPromise;\n}\n\ninterface ParsedCsv {\n headers: string[];\n rows: CsvRow[];\n error: string | null;\n}\n\nexport const CsvBlock: React.FC<CsvBlockProps> = ({ code, id }) => {\n const [sortConfig, setSortConfig] = useState<SortConfig | null>(null);\n const [papa, setPapa] = useState<PapaApi | null>(null);\n const [loadError, setLoadError] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n loadPapa()\n .then((api) => {\n if (!cancelled) setPapa(api);\n })\n .catch(() => {\n if (!cancelled)\n setLoadError(\n 'CSV preview requires the `papaparse` package. Install it with `npm install papaparse`.'\n );\n });\n return () => {\n cancelled = true;\n };\n }, []);\n\n const parsed = useMemo<ParsedCsv>(() => {\n if (!papa) return { headers: [], rows: [], error: null };\n try {\n const result = papa.parse(code, {\n header: true,\n dynamicTyping: true,\n skipEmptyLines: 'greedy',\n });\n if (result.errors?.length) {\n return {\n headers: result.meta.fields ?? [],\n rows: result.data,\n error: result.errors.map((e) => e.message).join('; '),\n };\n }\n return {\n headers: result.meta.fields ?? [],\n rows: result.data,\n error: null,\n };\n } catch (err) {\n return { headers: [], rows: [], error: (err as Error).message };\n }\n }, [code, papa]);\n\n const sortedRows = useMemo(() => {\n if (!sortConfig || parsed.error) return parsed.rows;\n return [...parsed.rows].sort((a, b) => {\n const aVal = a[sortConfig.column];\n const bVal = b[sortConfig.column];\n if (aVal == null && bVal == null) return 0;\n if (aVal == null) return 1;\n if (bVal == null) return -1;\n const cmp =\n typeof aVal === 'number' && typeof bVal === 'number'\n ? aVal - bVal\n : String(aVal).localeCompare(String(bVal));\n return sortConfig.direction === 'asc' ? cmp : -cmp;\n });\n }, [parsed.rows, sortConfig, parsed.error]);\n\n const handleSort = useCallback((column: string) => {\n setSortConfig((prev) => {\n if (prev?.column === column) {\n return prev.direction === 'asc' ? { column, direction: 'desc' } : null;\n }\n return { column, direction: 'asc' };\n });\n }, []);\n\n const handleExportCsv = useCallback(() => {\n if (!papa) return;\n const csvContent = papa.unparse(sortedRows);\n const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = `data-${id}.csv`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n setTimeout(() => URL.revokeObjectURL(url), 100);\n }, [sortedRows, id, papa]);\n\n if (loadError) {\n return (\n <FenceBlock code={code} language=\"csv\" error={loadError}>\n <div />\n </FenceBlock>\n );\n }\n\n if (!papa) {\n return (\n <FenceBlock code={code} language=\"csv\" supportsRawView>\n <div className=\"flex items-center justify-center p-6 text-sm text-neutral-500\">\n Loading CSV parser…\n </div>\n </FenceBlock>\n );\n }\n\n if (parsed.error) {\n return (\n <FenceBlock code={code} language=\"csv\" error={parsed.error}>\n <div />\n </FenceBlock>\n );\n }\n\n return (\n <FenceBlock code={code} language=\"csv\" supportsRawView>\n <div className=\"relative\">\n <div className=\"flex items-center justify-between border-b border-neutral-200 px-3 py-1.5 dark:border-neutral-700\">\n <span className=\"text-xs text-neutral-500 dark:text-neutral-400\">\n {sortedRows.length} row{sortedRows.length !== 1 ? 's' : ''} ×{' '}\n {parsed.headers.length} column\n {parsed.headers.length !== 1 ? 's' : ''}\n </span>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleExportCsv}\n aria-label=\"Export CSV\"\n className=\"h-7 gap-1 px-2 text-xs\"\n >\n <Download className=\"h-3 w-3\" />\n Export\n </Button>\n </div>\n\n <div className=\"max-h-96 overflow-auto\">\n <table className=\"min-w-full text-sm\">\n <thead className=\"sticky top-0 bg-neutral-100 dark:bg-neutral-800\">\n <tr>\n {parsed.headers.map((header) => {\n const isSorted = sortConfig?.column === header;\n const ariaSort = isSorted\n ? sortConfig.direction === 'asc'\n ? 'ascending'\n : 'descending'\n : 'none';\n return (\n <th\n key={header}\n scope=\"col\"\n aria-sort={ariaSort}\n className=\"px-3 py-2 text-start text-xs font-medium whitespace-nowrap text-neutral-600 dark:text-neutral-400\"\n >\n <button\n type=\"button\"\n onClick={() => handleSort(header)}\n className=\"flex w-full cursor-pointer items-center gap-1 text-start font-medium select-none hover:text-neutral-900 dark:hover:text-neutral-200\"\n >\n {header}\n {isSorted && (\n <span aria-hidden=\"true\">\n {sortConfig.direction === 'asc' ? '↑' : '↓'}\n </span>\n )}\n </button>\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody className=\"divide-y divide-neutral-200 dark:divide-neutral-700\">\n {sortedRows.map((row, i) => (\n <tr\n key={i}\n className=\"hover:bg-neutral-50 dark:hover:bg-neutral-800/50\"\n >\n {parsed.headers.map((header) => (\n <td\n key={header}\n className=\"px-3 py-1.5 whitespace-nowrap text-neutral-700 dark:text-neutral-300\"\n >\n {row[header] != null ? String(row[header]) : ''}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n </FenceBlock>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/components/Markdown/CsvBlock.tsx"],"names":[],"mappings":"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","file":"chunk-R6KPWIGO.js","sourcesContent":["/** CSV data rendered as a sortable table. Requires `papaparse`. */\nimport { Download } from 'lucide-react';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { Button } from '../Button';\nimport { FenceBlock } from './FenceBlock';\n\ninterface CsvBlockProps {\n code: string;\n id: string;\n}\n\ninterface SortConfig {\n column: string;\n direction: 'asc' | 'desc';\n}\n\ntype CsvRow = Record<string, unknown>;\n// Minimal surface of papaparse we actually use, avoiding overload conflicts.\ninterface PapaApi {\n parse(\n input: string,\n config?: Record<string, unknown>\n ): {\n meta: { fields?: string[] };\n data: CsvRow[];\n errors: Array<{ message: string }>;\n };\n unparse(data: unknown): string;\n}\n\nlet papaPromise: Promise<PapaApi> | null = null;\nfunction loadPapa() {\n if (!papaPromise) {\n papaPromise = import(/* @vite-ignore */ 'papaparse')\n .then((mod: { default?: PapaApi } & Partial<PapaApi>) => {\n const api: PapaApi = (mod.default ?? mod) as PapaApi;\n if (!api?.parse) throw new Error('papaparse export not found');\n return api;\n })\n .catch((err) => {\n papaPromise = null;\n throw err as Error;\n });\n }\n return papaPromise;\n}\n\ninterface ParsedCsv {\n headers: string[];\n rows: CsvRow[];\n error: string | null;\n}\n\nexport const CsvBlock: React.FC<CsvBlockProps> = ({ code, id }) => {\n const [sortConfig, setSortConfig] = useState<SortConfig | null>(null);\n const [papa, setPapa] = useState<PapaApi | null>(null);\n const [loadError, setLoadError] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n loadPapa()\n .then((api) => {\n if (!cancelled) setPapa(api);\n })\n .catch(() => {\n if (!cancelled)\n setLoadError(\n 'CSV preview requires the `papaparse` package. Install it with `npm install papaparse`.'\n );\n });\n return () => {\n cancelled = true;\n };\n }, []);\n\n const parsed = useMemo<ParsedCsv>(() => {\n if (!papa) return { headers: [], rows: [], error: null };\n try {\n const result = papa.parse(code, {\n header: true,\n dynamicTyping: true,\n skipEmptyLines: 'greedy',\n });\n if (result.errors?.length) {\n return {\n headers: result.meta.fields ?? [],\n rows: result.data,\n error: result.errors.map((e) => e.message).join('; '),\n };\n }\n return {\n headers: result.meta.fields ?? [],\n rows: result.data,\n error: null,\n };\n } catch (err) {\n return { headers: [], rows: [], error: (err as Error).message };\n }\n }, [code, papa]);\n\n const sortedRows = useMemo(() => {\n if (!sortConfig || parsed.error) return parsed.rows;\n return [...parsed.rows].sort((a, b) => {\n const aVal = a[sortConfig.column];\n const bVal = b[sortConfig.column];\n if (aVal == null && bVal == null) return 0;\n if (aVal == null) return 1;\n if (bVal == null) return -1;\n const cmp =\n typeof aVal === 'number' && typeof bVal === 'number'\n ? aVal - bVal\n : String(aVal).localeCompare(String(bVal));\n return sortConfig.direction === 'asc' ? cmp : -cmp;\n });\n }, [parsed.rows, sortConfig, parsed.error]);\n\n const handleSort = useCallback((column: string) => {\n setSortConfig((prev) => {\n if (prev?.column === column) {\n return prev.direction === 'asc' ? { column, direction: 'desc' } : null;\n }\n return { column, direction: 'asc' };\n });\n }, []);\n\n const handleExportCsv = useCallback(() => {\n if (!papa) return;\n const csvContent = papa.unparse(sortedRows);\n const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = `data-${id}.csv`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n setTimeout(() => URL.revokeObjectURL(url), 100);\n }, [sortedRows, id, papa]);\n\n if (loadError) {\n return (\n <FenceBlock code={code} language=\"csv\" error={loadError}>\n <div />\n </FenceBlock>\n );\n }\n\n if (!papa) {\n return (\n <FenceBlock code={code} language=\"csv\" supportsRawView>\n <div className=\"flex items-center justify-center p-6 text-sm text-neutral-500\">\n Loading CSV parser…\n </div>\n </FenceBlock>\n );\n }\n\n if (parsed.error) {\n return (\n <FenceBlock code={code} language=\"csv\" error={parsed.error}>\n <div />\n </FenceBlock>\n );\n }\n\n return (\n <FenceBlock code={code} language=\"csv\" supportsRawView>\n <div className=\"relative\">\n <div className=\"flex items-center justify-between border-b border-neutral-200 px-3 py-1.5 dark:border-neutral-700\">\n <span className=\"text-xs text-neutral-500 dark:text-neutral-400\">\n {sortedRows.length} row{sortedRows.length !== 1 ? 's' : ''} ×{' '}\n {parsed.headers.length} column\n {parsed.headers.length !== 1 ? 's' : ''}\n </span>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleExportCsv}\n aria-label=\"Export CSV\"\n className=\"h-7 gap-1 px-2 text-xs\"\n >\n <Download className=\"h-3 w-3\" />\n Export\n </Button>\n </div>\n\n <div className=\"max-h-96 overflow-auto\">\n <table className=\"min-w-full text-sm\">\n <thead className=\"sticky top-0 bg-neutral-100 dark:bg-neutral-800\">\n <tr>\n {parsed.headers.map((header) => {\n const isSorted = sortConfig?.column === header;\n const ariaSort = isSorted\n ? sortConfig.direction === 'asc'\n ? 'ascending'\n : 'descending'\n : 'none';\n return (\n <th\n key={header}\n scope=\"col\"\n aria-sort={ariaSort}\n className=\"px-3 py-2 text-start text-xs font-medium whitespace-nowrap text-neutral-600 dark:text-neutral-400\"\n >\n <button\n type=\"button\"\n onClick={() => handleSort(header)}\n className=\"flex w-full cursor-pointer items-center gap-1 text-start font-medium select-none hover:text-neutral-900 dark:hover:text-neutral-200\"\n >\n {header}\n {isSorted && (\n <span aria-hidden=\"true\">\n {sortConfig.direction === 'asc' ? '↑' : '↓'}\n </span>\n )}\n </button>\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody className=\"divide-y divide-neutral-200 dark:divide-neutral-700\">\n {sortedRows.map((row, i) => (\n <tr\n key={i}\n className=\"hover:bg-neutral-50 dark:hover:bg-neutral-800/50\"\n >\n {parsed.headers.map((header) => (\n <td\n key={header}\n className=\"px-3 py-1.5 whitespace-nowrap text-neutral-700 dark:text-neutral-300\"\n >\n {row[header] != null ? String(row[header]) : ''}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n </FenceBlock>\n );\n};\n"]}