@mieweb/ui 0.11.0-dev.43 → 0.11.0-dev.45

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 (186) hide show
  1. package/agent/skills/mieweb-ui-catalog/selection-guidance.md +1 -1
  2. package/dist/ag-grid.cjs +2 -2
  3. package/dist/ag-grid.js +1 -1
  4. package/dist/{chunk-AHYDJN4H.cjs → chunk-2XHPPOXY.cjs} +32 -32
  5. package/dist/{chunk-AHYDJN4H.cjs.map → chunk-2XHPPOXY.cjs.map} +1 -1
  6. package/dist/{chunk-3IKIRGHI.cjs → chunk-3H6BQV2D.cjs} +6 -6
  7. package/dist/{chunk-3IKIRGHI.cjs.map → chunk-3H6BQV2D.cjs.map} +1 -1
  8. package/dist/{chunk-IIV5GNSK.cjs → chunk-3PT4B4JT.cjs} +4 -4
  9. package/dist/{chunk-IIV5GNSK.cjs.map → chunk-3PT4B4JT.cjs.map} +1 -1
  10. package/dist/{chunk-GLG6UE2H.cjs → chunk-3SEQVGLH.cjs} +4 -4
  11. package/dist/{chunk-GLG6UE2H.cjs.map → chunk-3SEQVGLH.cjs.map} +1 -1
  12. package/dist/{chunk-JUY2JLFL.js → chunk-3XDU7XIC.js} +3 -3
  13. package/dist/{chunk-JUY2JLFL.js.map → chunk-3XDU7XIC.js.map} +1 -1
  14. package/dist/{chunk-LQ22CY7X.js → chunk-46ZUORUE.js} +5 -5
  15. package/dist/{chunk-LQ22CY7X.js.map → chunk-46ZUORUE.js.map} +1 -1
  16. package/dist/{chunk-CKECOCYJ.js → chunk-4IOIDS2Z.js} +3 -3
  17. package/dist/{chunk-CKECOCYJ.js.map → chunk-4IOIDS2Z.js.map} +1 -1
  18. package/dist/{chunk-F7SZSOB3.js → chunk-6PCA5H47.js} +3 -3
  19. package/dist/{chunk-F7SZSOB3.js.map → chunk-6PCA5H47.js.map} +1 -1
  20. package/dist/{chunk-ULEX7OOJ.js → chunk-6Y6W5DUY.js} +4 -4
  21. package/dist/{chunk-ULEX7OOJ.js.map → chunk-6Y6W5DUY.js.map} +1 -1
  22. package/dist/{chunk-S7AMZ4RD.cjs → chunk-7K6SW4VB.cjs} +4 -4
  23. package/dist/{chunk-S7AMZ4RD.cjs.map → chunk-7K6SW4VB.cjs.map} +1 -1
  24. package/dist/{chunk-KY67AMQ5.cjs → chunk-7MF3O3BU.cjs} +4 -4
  25. package/dist/{chunk-KY67AMQ5.cjs.map → chunk-7MF3O3BU.cjs.map} +1 -1
  26. package/dist/{chunk-Z3WMDVMR.cjs → chunk-7QNBPB7F.cjs} +9 -5
  27. package/dist/chunk-7QNBPB7F.cjs.map +1 -0
  28. package/dist/{chunk-YFWDS6MX.js → chunk-AB24H2RM.js} +3 -3
  29. package/dist/{chunk-YFWDS6MX.js.map → chunk-AB24H2RM.js.map} +1 -1
  30. package/dist/{chunk-DSGFWT4D.js → chunk-AQBZEN43.js} +5 -5
  31. package/dist/{chunk-DSGFWT4D.js.map → chunk-AQBZEN43.js.map} +1 -1
  32. package/dist/{chunk-2W73UQ3T.js → chunk-BPYI7BDC.js} +3 -3
  33. package/dist/{chunk-2W73UQ3T.js.map → chunk-BPYI7BDC.js.map} +1 -1
  34. package/dist/{chunk-7U7SONM5.js → chunk-CVCUQ2MZ.js} +3 -3
  35. package/dist/{chunk-7U7SONM5.js.map → chunk-CVCUQ2MZ.js.map} +1 -1
  36. package/dist/{chunk-PWXDRFJL.cjs → chunk-DHEOWRIE.cjs} +6 -6
  37. package/dist/{chunk-PWXDRFJL.cjs.map → chunk-DHEOWRIE.cjs.map} +1 -1
  38. package/dist/{chunk-OYUIEJPN.js → chunk-GTRYDFMT.js} +38 -10
  39. package/dist/chunk-GTRYDFMT.js.map +1 -0
  40. package/dist/{chunk-2FZYZ4HT.cjs → chunk-HDSYYQYM.cjs} +4 -4
  41. package/dist/{chunk-2FZYZ4HT.cjs.map → chunk-HDSYYQYM.cjs.map} +1 -1
  42. package/dist/{chunk-MM32RSX4.cjs → chunk-HOE2U27V.cjs} +185 -18
  43. package/dist/chunk-HOE2U27V.cjs.map +1 -0
  44. package/dist/{chunk-JCIQIR5V.js → chunk-IGUDEWIW.js} +4 -4
  45. package/dist/{chunk-JCIQIR5V.js.map → chunk-IGUDEWIW.js.map} +1 -1
  46. package/dist/{chunk-GGLISETW.cjs → chunk-IKHK4GTF.cjs} +4 -4
  47. package/dist/{chunk-GGLISETW.cjs.map → chunk-IKHK4GTF.cjs.map} +1 -1
  48. package/dist/{chunk-YVKBXNPK.js → chunk-JBNQ2L3K.js} +10 -6
  49. package/dist/chunk-JBNQ2L3K.js.map +1 -0
  50. package/dist/{chunk-GU6TPVXF.cjs → chunk-JK2IWOI7.cjs} +6 -6
  51. package/dist/{chunk-GU6TPVXF.cjs.map → chunk-JK2IWOI7.cjs.map} +1 -1
  52. package/dist/{chunk-TZKBW4GA.cjs → chunk-K76UNS22.cjs} +6 -6
  53. package/dist/{chunk-TZKBW4GA.cjs.map → chunk-K76UNS22.cjs.map} +1 -1
  54. package/dist/{chunk-DAAJ3B2T.js → chunk-KP72MDFB.js} +4 -4
  55. package/dist/{chunk-DAAJ3B2T.js.map → chunk-KP72MDFB.js.map} +1 -1
  56. package/dist/{chunk-MLCIINXT.js → chunk-LBUXS6FJ.js} +4 -4
  57. package/dist/{chunk-MLCIINXT.js.map → chunk-LBUXS6FJ.js.map} +1 -1
  58. package/dist/{chunk-GG3IK5TL.cjs → chunk-MQK2D6I6.cjs} +9 -9
  59. package/dist/{chunk-GG3IK5TL.cjs.map → chunk-MQK2D6I6.cjs.map} +1 -1
  60. package/dist/{chunk-67X7L7JX.js → chunk-MQSGJB2B.js} +173 -6
  61. package/dist/chunk-MQSGJB2B.js.map +1 -0
  62. package/dist/{chunk-2GBVJHWN.cjs → chunk-NH5JOZLG.cjs} +13 -13
  63. package/dist/{chunk-2GBVJHWN.cjs.map → chunk-NH5JOZLG.cjs.map} +1 -1
  64. package/dist/{chunk-NWU634SO.cjs → chunk-O2EAHOXM.cjs} +4 -4
  65. package/dist/{chunk-NWU634SO.cjs.map → chunk-O2EAHOXM.cjs.map} +1 -1
  66. package/dist/{chunk-JUYBJLPI.cjs → chunk-O7Y56J4R.cjs} +4 -4
  67. package/dist/{chunk-JUYBJLPI.cjs.map → chunk-O7Y56J4R.cjs.map} +1 -1
  68. package/dist/{chunk-BQSREBF2.cjs → chunk-OJ2NCQ2R.cjs} +14 -14
  69. package/dist/{chunk-BQSREBF2.cjs.map → chunk-OJ2NCQ2R.cjs.map} +1 -1
  70. package/dist/{chunk-GLRKXJCR.js → chunk-OX32ITWC.js} +3 -3
  71. package/dist/{chunk-GLRKXJCR.js.map → chunk-OX32ITWC.js.map} +1 -1
  72. package/dist/{chunk-L4APW65W.cjs → chunk-PJ4XEBMU.cjs} +4 -4
  73. package/dist/{chunk-L4APW65W.cjs.map → chunk-PJ4XEBMU.cjs.map} +1 -1
  74. package/dist/{chunk-OZKJYLN6.js → chunk-PSCSU63K.js} +3 -3
  75. package/dist/{chunk-OZKJYLN6.js.map → chunk-PSCSU63K.js.map} +1 -1
  76. package/dist/{chunk-EI4JU5JF.js → chunk-RKM4VGAN.js} +3 -3
  77. package/dist/{chunk-EI4JU5JF.js.map → chunk-RKM4VGAN.js.map} +1 -1
  78. package/dist/{chunk-ME7EVT6F.js → chunk-RYGVILUR.js} +3 -3
  79. package/dist/{chunk-ME7EVT6F.js.map → chunk-RYGVILUR.js.map} +1 -1
  80. package/dist/{chunk-EGPDT7SM.js → chunk-S7NJV335.js} +3 -3
  81. package/dist/{chunk-EGPDT7SM.js.map → chunk-S7NJV335.js.map} +1 -1
  82. package/dist/{chunk-AHT2HRHC.cjs → chunk-TNRANQVI.cjs} +16 -16
  83. package/dist/{chunk-AHT2HRHC.cjs.map → chunk-TNRANQVI.cjs.map} +1 -1
  84. package/dist/{chunk-TERHGQ73.cjs → chunk-U7XWWU5H.cjs} +5 -5
  85. package/dist/{chunk-TERHGQ73.cjs.map → chunk-U7XWWU5H.cjs.map} +1 -1
  86. package/dist/{chunk-G35LXI2A.js → chunk-UIFN2LYT.js} +3 -3
  87. package/dist/{chunk-G35LXI2A.js.map → chunk-UIFN2LYT.js.map} +1 -1
  88. package/dist/{chunk-IYDPGQJA.js → chunk-UQAWXY6R.js} +3 -3
  89. package/dist/{chunk-IYDPGQJA.js.map → chunk-UQAWXY6R.js.map} +1 -1
  90. package/dist/{chunk-YWCHUUY3.js → chunk-VOPRL4RF.js} +7 -7
  91. package/dist/{chunk-YWCHUUY3.js.map → chunk-VOPRL4RF.js.map} +1 -1
  92. package/dist/{chunk-KB2PLV5Q.js → chunk-VQGRMCVT.js} +4 -4
  93. package/dist/{chunk-KB2PLV5Q.js.map → chunk-VQGRMCVT.js.map} +1 -1
  94. package/dist/{chunk-AWJBJYLZ.cjs → chunk-X6THHGTZ.cjs} +37 -37
  95. package/dist/{chunk-AWJBJYLZ.cjs.map → chunk-X6THHGTZ.cjs.map} +1 -1
  96. package/dist/{chunk-Q6QLGCL7.cjs → chunk-XCCH5KHW.cjs} +9 -9
  97. package/dist/{chunk-Q6QLGCL7.cjs.map → chunk-XCCH5KHW.cjs.map} +1 -1
  98. package/dist/{chunk-KQXD6BFO.cjs → chunk-XM3D4KAF.cjs} +9 -9
  99. package/dist/{chunk-KQXD6BFO.cjs.map → chunk-XM3D4KAF.cjs.map} +1 -1
  100. package/dist/{chunk-PINIBEIU.cjs → chunk-XRXOGMMG.cjs} +39 -11
  101. package/dist/chunk-XRXOGMMG.cjs.map +1 -0
  102. package/dist/{chunk-XPWFIDZM.cjs → chunk-XU3X2AUL.cjs} +4 -4
  103. package/dist/{chunk-XPWFIDZM.cjs.map → chunk-XU3X2AUL.cjs.map} +1 -1
  104. package/dist/{chunk-3A4N5E6P.js → chunk-XZ65FX6T.js} +3 -3
  105. package/dist/{chunk-3A4N5E6P.js.map → chunk-XZ65FX6T.js.map} +1 -1
  106. package/dist/{chunk-CRR7AE5D.js → chunk-Z6I4XFPC.js} +3 -3
  107. package/dist/{chunk-CRR7AE5D.js.map → chunk-Z6I4XFPC.js.map} +1 -1
  108. package/dist/{chunk-LTCHD3K5.cjs → chunk-Z7ZOSENN.cjs} +5 -5
  109. package/dist/{chunk-LTCHD3K5.cjs.map → chunk-Z7ZOSENN.cjs.map} +1 -1
  110. package/dist/{chunk-NZUQL42A.cjs → chunk-ZDA6FEKA.cjs} +5 -5
  111. package/dist/{chunk-NZUQL42A.cjs.map → chunk-ZDA6FEKA.cjs.map} +1 -1
  112. package/dist/{chunk-UY2EZYIC.js → chunk-ZSBG6C3P.js} +3 -3
  113. package/dist/{chunk-UY2EZYIC.js.map → chunk-ZSBG6C3P.js.map} +1 -1
  114. package/dist/{chunk-KAQNYX7B.js → chunk-ZVRJVUFX.js} +3 -3
  115. package/dist/{chunk-KAQNYX7B.js.map → chunk-ZVRJVUFX.js.map} +1 -1
  116. package/dist/components/AudioPlayer/index.cjs +7 -7
  117. package/dist/components/AudioPlayer/index.js +2 -2
  118. package/dist/components/BoardView/index.cjs +5 -5
  119. package/dist/components/BoardView/index.js +2 -2
  120. package/dist/components/CollabStatus/index.cjs +5 -5
  121. package/dist/components/CollabStatus/index.js +2 -2
  122. package/dist/components/Dropdown/index.cjs +9 -9
  123. package/dist/components/Dropdown/index.d.cts +6 -1
  124. package/dist/components/Dropdown/index.d.ts +6 -1
  125. package/dist/components/Dropdown/index.js +2 -2
  126. package/dist/components/EmailEditor/index.cjs +16 -16
  127. package/dist/components/EmailEditor/index.js +7 -7
  128. package/dist/components/MediaEditor/index.cjs +10 -10
  129. package/dist/components/MediaEditor/index.js +5 -5
  130. package/dist/components/MediaFeed/index.cjs +6 -6
  131. package/dist/components/MediaFeed/index.js +5 -5
  132. package/dist/components/MediaPlayer/index.cjs +8 -8
  133. package/dist/components/MediaPlayer/index.js +4 -4
  134. package/dist/components/MegaMenu/index.cjs +5 -5
  135. package/dist/components/MegaMenu/index.js +2 -2
  136. package/dist/components/RecordHeader/index.cjs +5 -5
  137. package/dist/components/RecordHeader/index.js +3 -3
  138. package/dist/components/RecordLayout/index.cjs +5 -5
  139. package/dist/components/RecordLayout/index.js +3 -3
  140. package/dist/components/RichTextEditor/index.cjs +6 -6
  141. package/dist/components/RichTextEditor/index.js +3 -3
  142. package/dist/components/Slider/index.cjs +6 -6
  143. package/dist/components/Slider/index.js +2 -2
  144. package/dist/components/SliderCalculator/index.cjs +5 -5
  145. package/dist/components/SliderCalculator/index.js +3 -3
  146. package/dist/components/SuperChat/index.cjs +23 -23
  147. package/dist/components/SuperChat/index.js +8 -8
  148. package/dist/components/SuperChat/plugins/index.cjs +5 -5
  149. package/dist/components/SuperChat/plugins/index.js +4 -4
  150. package/dist/components/Tabs/index.cjs +8 -8
  151. package/dist/components/Tabs/index.js +2 -2
  152. package/dist/components/Textarea/index.cjs +8 -8
  153. package/dist/components/Textarea/index.js +5 -5
  154. package/dist/components/ThemeProvider/index.cjs +9 -9
  155. package/dist/components/ThemeProvider/index.js +3 -3
  156. package/dist/components/Tooltip/index.cjs +3 -3
  157. package/dist/components/Tooltip/index.js +2 -2
  158. package/dist/components/ViewSet/index.cjs +5 -5
  159. package/dist/components/ViewSet/index.js +4 -4
  160. package/dist/components/ViewSwitcher/index.cjs +4 -4
  161. package/dist/components/ViewSwitcher/index.js +2 -2
  162. package/dist/deck.cjs +3 -3
  163. package/dist/deck.js +1 -1
  164. package/dist/esheet.cjs +107 -107
  165. package/dist/esheet.js +10 -10
  166. package/dist/hooks/index.cjs +5 -5
  167. package/dist/hooks/index.js +1 -1
  168. package/dist/index.cjs +284 -284
  169. package/dist/index.d.cts +6 -1
  170. package/dist/index.d.ts +6 -1
  171. package/dist/index.js +40 -40
  172. package/dist/kerebron.cjs +6 -6
  173. package/dist/kerebron.js +4 -4
  174. package/dist/{model-5PB6KNYH.cjs → model-2TISYEYF.cjs} +20 -20
  175. package/dist/{model-5PB6KNYH.cjs.map → model-2TISYEYF.cjs.map} +1 -1
  176. package/dist/{model-OGWTZEXR.js → model-BCS5BUK3.js} +6 -6
  177. package/dist/{model-OGWTZEXR.js.map → model-BCS5BUK3.js.map} +1 -1
  178. package/dist/org-chart.cjs +2 -2
  179. package/dist/org-chart.js +1 -1
  180. package/package.json +1 -1
  181. package/dist/chunk-67X7L7JX.js.map +0 -1
  182. package/dist/chunk-MM32RSX4.cjs.map +0 -1
  183. package/dist/chunk-OYUIEJPN.js.map +0 -1
  184. package/dist/chunk-PINIBEIU.cjs.map +0 -1
  185. package/dist/chunk-YVKBXNPK.js.map +0 -1
  186. package/dist/chunk-Z3WMDVMR.cjs.map +0 -1
@@ -2,7 +2,7 @@
2
2
 
3
3
  var chunk4NCDU5IG_cjs = require('./chunk-4NCDU5IG.cjs');
4
4
  var chunkXXVUHLQN_cjs = require('./chunk-XXVUHLQN.cjs');
5
- var chunkZ3WMDVMR_cjs = require('./chunk-Z3WMDVMR.cjs');
5
+ var chunk7QNBPB7F_cjs = require('./chunk-7QNBPB7F.cjs');
6
6
  var chunkS5RVSXDV_cjs = require('./chunk-S5RVSXDV.cjs');
7
7
  var React = require('react');
8
8
  var core = require('@dnd-kit/core');
@@ -311,7 +311,7 @@ function BoardView({
311
311
  };
312
312
  const onCardKeyDown = (event, id, columnIndex) => {
313
313
  if (!onMove || !(event.ctrlKey || event.metaKey)) return;
314
- const rtl = chunkZ3WMDVMR_cjs.isRtl(event.currentTarget);
314
+ const rtl = chunk7QNBPB7F_cjs.isRtl(event.currentTarget);
315
315
  let delta = 0;
316
316
  if (event.key === "ArrowRight") delta = rtl ? -1 : 1;
317
317
  else if (event.key === "ArrowLeft") delta = rtl ? 1 : -1;
@@ -450,5 +450,5 @@ function BoardView({
450
450
  exports.BoardView = BoardView;
451
451
  exports.cardVariants = cardVariants;
452
452
  exports.defaultBoardLabels = defaultBoardLabels;
453
- //# sourceMappingURL=chunk-2FZYZ4HT.cjs.map
454
- //# sourceMappingURL=chunk-2FZYZ4HT.cjs.map
453
+ //# sourceMappingURL=chunk-HDSYYQYM.cjs.map
454
+ //# sourceMappingURL=chunk-HDSYYQYM.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/BoardView/BoardView.tsx"],"names":["defaultViewLabels","cva","useDraggable","jsxs","jsx","cn","accentClasses","useDroppable","React","useSensors","useSensor","PointerSensor","isRtl","Spinner","DndContext","pointerWithin","DragOverlay"],"mappings":"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","file":"chunk-2FZYZ4HT.cjs","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport {\n DndContext,\n DragOverlay,\n PointerSensor,\n pointerWithin,\n useDraggable,\n useDroppable,\n useSensor,\n useSensors,\n type DragEndEvent,\n type DragStartEvent,\n} from '@dnd-kit/core';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { isRtl } from '../../hooks/useDirection';\nimport { cn } from '../../utils/cn';\nimport { Spinner } from '../Spinner';\nimport {\n accentClasses,\n defaultViewLabels,\n type Accent,\n type Stage,\n type ViewBaseProps,\n type ViewLabels,\n} from '../../views/types';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type BoardViewSlot =\n | 'column'\n | 'columnHeader'\n | 'card'\n | 'selectedCard'\n | 'state';\n\nexport interface BoardLabels extends ViewLabels {\n /** Accessible name of the scrollable board region. */\n board: string;\n /** Announced when a card starts moving. `{item}` and `{stage}` are substituted. */\n moved: string;\n /** Announced when `onMove` rejects. */\n moveFailed: string;\n /** Hint on a focusable card describing the keyboard move. */\n moveHint: string;\n}\n\nexport const defaultBoardLabels: BoardLabels = {\n ...defaultViewLabels,\n empty: 'Nothing in this stage',\n board: 'Board',\n moved: '{item} moved to {stage}',\n moveFailed: 'Could not move {item}',\n moveHint: 'Press Control with the arrow keys to move between stages',\n};\n\nexport interface BoardViewProps<T>\n extends ViewBaseProps<T>, VariantProps<typeof cardVariants> {\n /** Columns, in order. A board without stages has nothing to draw. */\n stages: readonly Stage[];\n /**\n * Commits a move. The board shows the card in its new column while this is\n * pending and puts it back if the promise rejects, so the caller never has to\n * re-render it home.\n */\n onMove?: (id: string, toStage: string, item: T) => void | Promise<void>;\n labels?: Partial<BoardLabels>;\n classNames?: Partial<Record<BoardViewSlot, string>>;\n /** Heading level for column headers, under the page's own heading. */\n headingLevel?: 'h2' | 'h3' | 'h4';\n}\n\n// =============================================================================\n// Variants\n// =============================================================================\n\nconst cardVariants = cva(\n [\n 'w-full rounded-md border border-border bg-card p-2 text-start',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n ],\n {\n variants: {\n density: {\n comfortable: 'p-3',\n compact: 'p-2',\n },\n interactive: { true: 'hover:border-primary-500/40', false: '' },\n selected: { true: 'ring-2 ring-primary-500/50', false: '' },\n pending: { true: 'opacity-60', false: '' },\n },\n defaultVariants: {\n density: 'comfortable',\n interactive: false,\n selected: false,\n pending: false,\n },\n }\n);\n\nconst fill = (template: string, values: Record<string, string>) =>\n template.replace(/\\{(\\w+)\\}/g, (_, key) => values[key] ?? '');\n\n// =============================================================================\n// Card\n// =============================================================================\n\ninterface CardProps {\n id: string;\n title: string;\n subtitle?: string;\n accent?: Accent;\n selected: boolean;\n pending: boolean;\n draggable: boolean;\n hint?: string;\n href?: string;\n className?: string;\n children?: React.ReactNode;\n onOpen?: () => void;\n onKeyDown?: (event: React.KeyboardEvent) => void;\n}\n\nfunction BoardCard({\n id,\n title,\n subtitle,\n accent,\n selected,\n pending,\n draggable,\n hint,\n href,\n className,\n children,\n onOpen,\n onKeyDown,\n}: CardProps) {\n const { attributes, listeners, setNodeRef, isDragging } = useDraggable({\n id,\n disabled: !draggable,\n });\n\n const body = children ?? (\n <span className=\"flex items-start gap-2\">\n {accent && (\n <span\n aria-hidden\n className={cn(\n 'mt-1.5 size-2 shrink-0 rounded-full',\n accentClasses[accent].marker\n )}\n />\n )}\n <span className=\"min-w-0 flex-1\">\n <span className=\"text-foreground block text-sm font-medium\">\n {title}\n </span>\n {subtitle && (\n <span className=\"text-muted-foreground block truncate text-xs\">\n {subtitle}\n </span>\n )}\n </span>\n </span>\n );\n\n const onCardKeyDown = (event: React.KeyboardEvent) => {\n if (onOpen && !href && (event.key === 'Enter' || event.key === ' ')) {\n // Space is dnd-kit's pick-up key only while dragging; here the card is at\n // rest, so it activates like any other button.\n if (!event.ctrlKey && !event.metaKey) {\n event.preventDefault();\n onOpen();\n return;\n }\n }\n onKeyDown?.(event);\n };\n\n const shared = {\n ref: setNodeRef,\n // Only the pointer listeners are shared. dnd-kit's `attributes` carry\n // `role=\"button\"` and a `tabIndex`, which on an `<a href>` would override\n // the native link role — the card would announce as a button, and the\n // middle-click / \"copy link\" affordance this branch exists to preserve\n // would no longer be what assistive tech describes. The non-link card takes\n // them below, where button semantics are the correct answer.\n ...(draggable ? listeners : {}),\n 'aria-current': selected ? ('true' as const) : undefined,\n 'aria-describedby': hint,\n 'aria-busy': pending || undefined,\n 'data-slot': 'board-view-card',\n className: cn(className, isDragging && 'opacity-40'),\n };\n\n return (\n <li>\n {href ? (\n // An anchor, like every other view: the card stays middle-clickable and\n // \"copy link\" works. dnd-kit's listeners still own the drag.\n <a\n {...shared}\n href={href}\n onKeyDown={onCardKeyDown}\n onClick={(event) => {\n if (\n !onOpen ||\n event.defaultPrevented ||\n event.metaKey ||\n event.ctrlKey ||\n event.shiftKey ||\n event.button !== 0\n )\n return;\n event.preventDefault();\n onOpen();\n }}\n >\n {body}\n </a>\n ) : (\n <div\n {...shared}\n {...(draggable ? attributes : {})}\n role={onOpen ? 'button' : undefined}\n tabIndex={draggable || onOpen ? 0 : undefined}\n onKeyDown={onCardKeyDown}\n onClick={onOpen}\n >\n {body}\n </div>\n )}\n </li>\n );\n}\n\n// =============================================================================\n// Column\n// =============================================================================\n\nfunction BoardColumn({\n stage,\n headerId,\n count,\n headingLevel: Heading,\n droppable,\n classNames,\n children,\n}: {\n stage: Stage;\n droppable: boolean;\n headerId: string;\n count: number;\n headingLevel: 'h2' | 'h3' | 'h4';\n classNames?: BoardViewProps<unknown>['classNames'];\n children: React.ReactNode;\n}) {\n const { setNodeRef, isOver } = useDroppable({\n id: stage.id,\n disabled: !droppable,\n });\n const accent = stage.accent ?? 'neutral';\n return (\n <section\n ref={setNodeRef}\n data-slot=\"board-view-column\"\n data-over={isOver || undefined}\n className={cn(\n 'bg-muted/40 flex min-w-0 flex-col rounded-lg border',\n isOver ? accentClasses[accent].border : 'border-border',\n 'sm:w-72 sm:shrink-0',\n classNames?.column\n )}\n >\n <Heading>\n <span\n id={headerId}\n data-slot=\"board-view-column-header\"\n className={cn(\n 'border-border text-muted-foreground flex items-center gap-2 border-b px-3 py-2 text-xs font-semibold tracking-wide uppercase',\n classNames?.columnHeader\n )}\n >\n <span\n aria-hidden\n className={cn(\n 'size-2 shrink-0 rounded-full',\n accentClasses[accent].marker\n )}\n />\n <span>{stage.label}</span>\n <span className=\"ms-auto font-normal tabular-nums\">{count}</span>\n </span>\n </Heading>\n {children}\n </section>\n );\n}\n\n// =============================================================================\n// Component\n// =============================================================================\n\nexport function BoardView<T>({\n items,\n accessors,\n stages,\n loading = false,\n error = null,\n selectedId = null,\n onOpen,\n getHref,\n onMove,\n renderItem,\n emptyState,\n labels,\n density,\n className,\n classNames,\n headingLevel = 'h3',\n}: BoardViewProps<T>) {\n const text = { ...defaultBoardLabels, ...labels };\n const hintId = React.useId();\n // Ids come from position, not from the stage id: two distinct statuses can\n // normalise to the same string, and a duplicate id makes `aria-labelledby`\n // resolve to the wrong heading.\n const baseId = React.useId();\n const [announcement, setAnnouncement] = React.useState('');\n const [draggingId, setDraggingId] = React.useState<string | null>(null);\n // Where a card is shown while its move is in flight, so the column it landed\n // in is the one the user sees before the caller's data catches up.\n // A Map, not an object. Ids come from the caller's `getId` and are only\n // typed `string`, so a collection keyed by user data can legitimately produce\n // `toString`, `constructor` or `__proto__`. On a plain object `'toString' in\n // pending` is true before anything is pending, which would pin that card as\n // permanently in-flight and make it impossible to move.\n const [pending, setPending] = React.useState<Map<string, string>>(\n () => new Map()\n );\n\n const byId = React.useMemo(() => {\n const map = new Map<string, T>();\n for (const item of items) map.set(accessors.getId(item), item);\n return map;\n }, [items, accessors]);\n\n const stageOf = React.useCallback(\n (item: T) =>\n pending.get(accessors.getId(item)) ?? accessors.getStatus?.(item),\n [pending, accessors]\n );\n\n const columns = React.useMemo(() => {\n const buckets = new Map<string, T[]>(stages.map((s) => [s.id, []]));\n const extra = new Map<string, T[]>();\n for (const item of items) {\n const key = stageOf(item) ?? '';\n const bucket = buckets.get(key);\n if (bucket) bucket.push(item);\n else {\n const spill = extra.get(key);\n if (spill) spill.push(item);\n else extra.set(key, [item]);\n }\n }\n return [\n ...stages.map((stage) => ({\n stage,\n declared: true,\n items: buckets.get(stage.id) ?? [],\n })),\n // Never silently drop a record whose status matches no stage. These are\n // shown so the record stays visible, but they are not drop targets: their\n // ids were never declared, and `onMove` promises a named stage.\n ...[...extra].map(([key, bucket]) => ({\n stage: { id: key, label: key || text.ungrouped } as Stage,\n declared: false,\n items: bucket,\n })),\n ];\n }, [items, stages, stageOf, text.ungrouped]);\n\n const commit = React.useCallback(\n async (id: string, toStage: string) => {\n const item = byId.get(id);\n if (!item || !onMove) return;\n // One move per card at a time: a second would overwrite the first's\n // pending stage, and the first `finally` would then clear it, snapping\n // the card home while the second mutation is still in flight.\n if (pending.has(id)) return;\n const stage = stages.find((s) => s.id === toStage);\n // `onMove` promises a move to a stage the caller declared. Columns\n // synthesized for unknown statuses exist so a record is never silently\n // dropped, not as somewhere to put things — accepting a drop there would\n // hand back an id that was never in `stages`.\n if (!stage) return;\n const from = accessors.getStatus?.(item);\n if (from === toStage) return;\n const title = accessors.getTitle(item);\n\n setPending((prev) => new Map(prev).set(id, toStage));\n setAnnouncement(\n fill(text.moved, { item: title, stage: stage.label ?? toStage })\n );\n try {\n await onMove(id, toStage, item);\n } catch {\n setAnnouncement(fill(text.moveFailed, { item: title }));\n } finally {\n setPending((prev) => {\n const next = new Map(prev);\n next.delete(id);\n return next;\n });\n }\n },\n [byId, onMove, pending, accessors, stages, text.moved, text.moveFailed]\n );\n\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 5 } })\n );\n\n const onDragStart = (event: DragStartEvent) =>\n setDraggingId(String(event.active.id));\n\n const onDragEnd = (event: DragEndEvent) => {\n setDraggingId(null);\n if (event.over) void commit(String(event.active.id), String(event.over.id));\n };\n\n // Pointer drag has no keyboard equivalent that is pleasant to use, so moving\n // by keyboard is its own command on the focused card rather than a simulated\n // drag: Ctrl/Cmd with the arrow keys steps it between adjacent stages.\n const onCardKeyDown = (\n event: React.KeyboardEvent,\n id: string,\n columnIndex: number\n ) => {\n if (!onMove || !(event.ctrlKey || event.metaKey)) return;\n const rtl = isRtl(event.currentTarget);\n let delta = 0;\n if (event.key === 'ArrowRight') delta = rtl ? -1 : 1;\n else if (event.key === 'ArrowLeft') delta = rtl ? 1 : -1;\n else return;\n // Step to the next *declared* stage. A fallback column is not a move\n // target, so stopping on one would strand the card there; skipping it\n // keeps arrowing continuous and still lets a card leave one.\n let target;\n for (\n let i = columnIndex + delta;\n i >= 0 && i < columns.length;\n i += delta\n ) {\n if (columns[i].declared) {\n target = columns[i];\n break;\n }\n }\n if (!target) return;\n event.preventDefault();\n void commit(id, target.stage.id);\n };\n\n const state = (content: React.ReactNode) => (\n <div\n data-slot=\"board-view-state\"\n className={cn(\n 'border-border bg-card text-muted-foreground flex flex-col items-center justify-center gap-2 rounded-lg border px-4 py-10 text-center text-sm',\n classNames?.state\n )}\n >\n {content}\n </div>\n );\n\n if (error) {\n return state(\n <p role=\"alert\" className=\"text-destructive\">\n {text.error}\n </p>\n );\n }\n if (loading) {\n return state(\n <span className=\"flex items-center gap-2\">\n <Spinner size=\"sm\" label={text.loading} />\n <span aria-hidden>{text.loading}</span>\n </span>\n );\n }\n if (items.length === 0 && emptyState) return <>{emptyState}</>;\n\n const draggingItem = draggingId ? byId.get(draggingId) : undefined;\n\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={pointerWithin}\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n onDragCancel={() => setDraggingId(null)}\n >\n <div\n data-slot=\"board-view\"\n // Scrollable content must be keyboard operable (WCAG 2.1.1), which axe\n // enforces as scrollable-region-focusable. jsx-a11y disagrees for\n // non-interactive elements; the success criterion wins.\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex\n tabIndex={0}\n role=\"group\"\n aria-label={text.board}\n className={cn(\n // Columns on one scrolling row once there is room; stacked below it,\n // because five 288px columns on a phone is a horizontal maze.\n 'flex flex-col gap-3 sm:flex-row sm:overflow-x-auto sm:pb-2',\n className\n )}\n >\n {columns.map((column, columnIndex) => (\n <BoardColumn\n key={column.stage.id}\n stage={column.stage}\n droppable={column.declared && Boolean(onMove)}\n headerId={`${baseId}-col-${columnIndex}`}\n count={column.items.length}\n headingLevel={headingLevel}\n classNames={classNames}\n >\n <ul\n aria-labelledby={`${baseId}-col-${columnIndex}`}\n className=\"flex flex-1 flex-col gap-2 p-2\"\n >\n {column.items.map((item) => {\n const id = accessors.getId(item);\n return (\n <BoardCard\n key={id}\n id={id}\n title={accessors.getTitle(item)}\n subtitle={accessors.getSubtitle?.(item)}\n accent={accessors.getAccent?.(item)}\n selected={id === selectedId}\n pending={pending.has(id)}\n draggable={Boolean(onMove)}\n hint={onMove ? hintId : undefined}\n href={getHref?.(id, item)}\n className={cn(\n cardVariants({\n density,\n interactive: Boolean(onOpen),\n selected: id === selectedId,\n pending: pending.has(id),\n }),\n classNames?.card,\n id === selectedId && classNames?.selectedCard\n )}\n onOpen={onOpen ? () => onOpen(id, item) : undefined}\n onKeyDown={(event) => onCardKeyDown(event, id, columnIndex)}\n >\n {renderItem?.(item, { view: 'board' })}\n </BoardCard>\n );\n })}\n {column.items.length === 0 && (\n <li className=\"text-muted-foreground px-1 py-2 text-xs\">\n {text.empty}\n </li>\n )}\n </ul>\n </BoardColumn>\n ))}\n </div>\n\n {onMove && (\n <span id={hintId} className=\"sr-only\">\n {text.moveHint}\n </span>\n )}\n {/* Separate from dnd-kit's own drag live region: this announces moves\n made by keyboard command, which are not drags. */}\n <span\n data-slot=\"board-view-announcer\"\n role=\"status\"\n aria-live=\"polite\"\n className=\"sr-only\"\n >\n {announcement}\n </span>\n\n <DragOverlay>\n {draggingItem && (\n <div className={cn(cardVariants({ density }), 'shadow-lg')}>\n <span className=\"text-foreground block text-sm font-medium\">\n {accessors.getTitle(draggingItem)}\n </span>\n </div>\n )}\n </DragOverlay>\n </DndContext>\n );\n}\n\nexport { cardVariants as boardViewCardVariants };\n"]}
1
+ {"version":3,"sources":["../src/components/BoardView/BoardView.tsx"],"names":["defaultViewLabels","cva","useDraggable","jsxs","jsx","cn","accentClasses","useDroppable","React","useSensors","useSensor","PointerSensor","isRtl","Spinner","DndContext","pointerWithin","DragOverlay"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkDO,IAAM,kBAAA,GAAkC;AAAA,EAC7C,GAAGA,mCAAA;AAAA,EACH,KAAA,EAAO,uBAAA;AAAA,EACP,KAAA,EAAO,OAAA;AAAA,EACP,KAAA,EAAO,yBAAA;AAAA,EACP,UAAA,EAAY,uBAAA;AAAA,EACZ,QAAA,EAAU;AACZ;AAsBA,IAAM,YAAA,GAAeC,0BAAA;AAAA,EACnB;AAAA,IACE,+DAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,WAAA,EAAa,KAAA;AAAA,QACb,OAAA,EAAS;AAAA,OACX;AAAA,MACA,WAAA,EAAa,EAAE,IAAA,EAAM,6BAAA,EAA+B,OAAO,EAAA,EAAG;AAAA,MAC9D,QAAA,EAAU,EAAE,IAAA,EAAM,4BAAA,EAA8B,OAAO,EAAA,EAAG;AAAA,MAC1D,OAAA,EAAS,EAAE,IAAA,EAAM,YAAA,EAAc,OAAO,EAAA;AAAG,KAC3C;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS,aAAA;AAAA,MACT,WAAA,EAAa,KAAA;AAAA,MACb,QAAA,EAAU,KAAA;AAAA,MACV,OAAA,EAAS;AAAA;AACX;AAEJ;AAEA,IAAM,IAAA,GAAO,CAAC,QAAA,EAAkB,MAAA,KAC9B,QAAA,CAAS,OAAA,CAAQ,YAAA,EAAc,CAAC,CAAA,EAAG,GAAA,KAAQ,MAAA,CAAO,GAAG,KAAK,EAAE,CAAA;AAsB9D,SAAS,SAAA,CAAU;AAAA,EACjB,EAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAAc;AACZ,EAAA,MAAM,EAAE,UAAA,EAAY,SAAA,EAAW,UAAA,EAAY,UAAA,KAAeC,iBAAA,CAAa;AAAA,IACrE,EAAA;AAAA,IACA,UAAU,CAAC;AAAA,GACZ,CAAA;AAED,EAAA,MAAM,IAAA,GAAO,QAAA,oBACXC,eAAA,CAAC,MAAA,EAAA,EAAK,WAAU,wBAAA,EACb,QAAA,EAAA;AAAA,IAAA,MAAA,oBACCC,cAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAW,IAAA;AAAA,QACX,SAAA,EAAWC,oBAAA;AAAA,UACT,qCAAA;AAAA,UACAC,+BAAA,CAAc,MAAM,CAAA,CAAE;AAAA;AACxB;AAAA,KACF;AAAA,oBAEFH,eAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EACd,QAAA,EAAA;AAAA,sBAAAC,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2CAAA,EACb,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,MACC,QAAA,oBACCA,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gDACb,QAAA,EAAA,QAAA,EACH;AAAA,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAGF,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAA+B;AACpD,IAAA,IAAI,MAAA,IAAU,CAAC,IAAA,KAAS,KAAA,CAAM,QAAQ,OAAA,IAAW,KAAA,CAAM,QAAQ,GAAA,CAAA,EAAM;AAGnE,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,IAAW,CAAC,MAAM,OAAA,EAAS;AACpC,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,MAAA,EAAO;AACP,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,SAAA,GAAY,KAAK,CAAA;AAAA,EACnB,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,GAAA,EAAK,UAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOL,GAAI,SAAA,GAAY,SAAA,GAAY,EAAC;AAAA,IAC7B,cAAA,EAAgB,WAAY,MAAA,GAAmB,MAAA;AAAA,IAC/C,kBAAA,EAAoB,IAAA;AAAA,IACpB,aAAa,OAAA,IAAW,MAAA;AAAA,IACxB,WAAA,EAAa,iBAAA;AAAA,IACb,SAAA,EAAWC,oBAAA,CAAG,SAAA,EAAW,UAAA,IAAc,YAAY;AAAA,GACrD;AAEA,EAAA,sCACG,IAAA,EAAA,EACE,QAAA,EAAA,IAAA;AAAA;AAAA;AAAA,oBAGCD,cAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACE,GAAG,MAAA;AAAA,QACJ,IAAA;AAAA,QACA,SAAA,EAAW,aAAA;AAAA,QACX,OAAA,EAAS,CAAC,KAAA,KAAU;AAClB,UAAA,IACE,CAAC,MAAA,IACD,KAAA,CAAM,gBAAA,IACN,KAAA,CAAM,OAAA,IACN,KAAA,CAAM,OAAA,IACN,KAAA,CAAM,QAAA,IACN,KAAA,CAAM,MAAA,KAAW,CAAA;AAEjB,YAAA;AACF,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,MAAA,EAAO;AAAA,QACT,CAAA;AAAA,QAEC,QAAA,EAAA;AAAA;AAAA;AACH,sBAEAA,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,MAAA;AAAA,MACH,GAAI,SAAA,GAAY,UAAA,GAAa,EAAC;AAAA,MAC/B,IAAA,EAAM,SAAS,QAAA,GAAW,MAAA;AAAA,MAC1B,QAAA,EAAU,SAAA,IAAa,MAAA,GAAS,CAAA,GAAI,MAAA;AAAA,MACpC,SAAA,EAAW,aAAA;AAAA,MACX,OAAA,EAAS,MAAA;AAAA,MAER,QAAA,EAAA;AAAA;AAAA,GACH,EAEJ,CAAA;AAEJ;AAMA,SAAS,WAAA,CAAY;AAAA,EACnB,KAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA,EAAc,OAAA;AAAA,EACd,SAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAQG;AACD,EAAA,MAAM,EAAE,UAAA,EAAY,MAAA,EAAO,GAAIG,iBAAA,CAAa;AAAA,IAC1C,IAAI,KAAA,CAAM,EAAA;AAAA,IACV,UAAU,CAAC;AAAA,GACZ,CAAA;AACD,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,IAAU,SAAA;AAC/B,EAAA,uBACEJ,eAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,UAAA;AAAA,MACL,WAAA,EAAU,mBAAA;AAAA,MACV,aAAW,MAAA,IAAU,MAAA;AAAA,MACrB,SAAA,EAAWE,oBAAA;AAAA,QACT,qDAAA;AAAA,QACA,MAAA,GAASC,+BAAA,CAAc,MAAM,CAAA,CAAE,MAAA,GAAS,eAAA;AAAA,QACxC,qBAAA;AAAA,QACA,UAAA,EAAY;AAAA,OACd;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAF,cAAA,CAAC,OAAA,EAAA,EACC,QAAA,kBAAAD,eAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAI,QAAA;AAAA,YACJ,WAAA,EAAU,0BAAA;AAAA,YACV,SAAA,EAAWE,oBAAA;AAAA,cACT,8HAAA;AAAA,cACA,UAAA,EAAY;AAAA,aACd;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAD,cAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,aAAA,EAAW,IAAA;AAAA,kBACX,SAAA,EAAWC,oBAAA;AAAA,oBACT,8BAAA;AAAA,oBACAC,+BAAA,CAAc,MAAM,CAAA,CAAE;AAAA;AACxB;AAAA,eACF;AAAA,8BACAF,cAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,KAAA,CAAM,KAAA,EAAM,CAAA;AAAA,8BACnBA,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAA,EAAoC,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA,SAC5D,EACF,CAAA;AAAA,QACC;AAAA;AAAA;AAAA,GACH;AAEJ;AAMO,SAAS,SAAA,CAAa;AAAA,EAC3B,KAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,KAAA,GAAQ,IAAA;AAAA,EACR,UAAA,GAAa,IAAA;AAAA,EACb,MAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA,GAAe;AACjB,CAAA,EAAsB;AACpB,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,kBAAA,EAAoB,GAAG,MAAA,EAAO;AAChD,EAAA,MAAM,SAAeI,gBAAA,CAAA,KAAA,EAAM;AAI3B,EAAA,MAAM,SAAeA,gBAAA,CAAA,KAAA,EAAM;AAC3B,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAUA,0BAAS,EAAE,CAAA;AACzD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAUA,0BAAwB,IAAI,CAAA;AAQtE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAUA,gBAAA,CAAA,QAAA;AAAA,IAClC,0BAAU,GAAA;AAAI,GAChB;AAEA,EAAA,MAAM,IAAA,GAAaA,yBAAQ,MAAM;AAC/B,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAe;AAC/B,IAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,GAAA,CAAI,GAAA,CAAI,UAAU,KAAA,CAAM,IAAI,GAAG,IAAI,CAAA;AAC7D,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,EAAG,CAAC,KAAA,EAAO,SAAS,CAAC,CAAA;AAErB,EAAA,MAAM,OAAA,GAAgBA,gBAAA,CAAA,WAAA;AAAA,IACpB,CAAC,IAAA,KACC,OAAA,CAAQ,GAAA,CAAI,SAAA,CAAU,KAAA,CAAM,IAAI,CAAC,CAAA,IAAK,SAAA,CAAU,SAAA,GAAY,IAAI,CAAA;AAAA,IAClE,CAAC,SAAS,SAAS;AAAA,GACrB;AAEA,EAAA,MAAM,OAAA,GAAgBA,yBAAQ,MAAM;AAClC,IAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAiB,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,EAAA,EAAI,EAAE,CAAC,CAAC,CAAA;AAClE,IAAA,MAAM,KAAA,uBAAY,GAAA,EAAiB;AACnC,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,IAAI,CAAA,IAAK,EAAA;AAC7B,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAC9B,MAAA,IAAI,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAAA,WACvB;AACH,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAC3B,QAAA,IAAI,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,aACrB,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,CAAC,IAAI,CAAC,CAAA;AAAA,MAC5B;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL,GAAG,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,QACxB,KAAA;AAAA,QACA,QAAA,EAAU,IAAA;AAAA,QACV,OAAO,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,EAAE,KAAK;AAAC,OACnC,CAAE,CAAA;AAAA;AAAA;AAAA;AAAA,MAIF,GAAG,CAAC,GAAG,KAAK,CAAA,CAAE,IAAI,CAAC,CAAC,GAAA,EAAK,MAAM,CAAA,MAAO;AAAA,QACpC,OAAO,EAAE,EAAA,EAAI,KAAK,KAAA,EAAO,GAAA,IAAO,KAAK,SAAA,EAAU;AAAA,QAC/C,QAAA,EAAU,KAAA;AAAA,QACV,KAAA,EAAO;AAAA,OACT,CAAE;AAAA,KACJ;AAAA,EACF,GAAG,CAAC,KAAA,EAAO,QAAQ,OAAA,EAAS,IAAA,CAAK,SAAS,CAAC,CAAA;AAE3C,EAAA,MAAM,MAAA,GAAeA,gBAAA,CAAA,WAAA;AAAA,IACnB,OAAO,IAAY,OAAA,KAAoB;AACrC,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AACxB,MAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,MAAA,EAAQ;AAItB,MAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA,EAAG;AACrB,MAAA,MAAM,QAAQ,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AAKjD,MAAA,IAAI,CAAC,KAAA,EAAO;AACZ,MAAA,MAAM,IAAA,GAAO,SAAA,CAAU,SAAA,GAAY,IAAI,CAAA;AACvC,MAAA,IAAI,SAAS,OAAA,EAAS;AACtB,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,QAAA,CAAS,IAAI,CAAA;AAErC,MAAA,UAAA,CAAW,CAAC,SAAS,IAAI,GAAA,CAAI,IAAI,CAAA,CAAE,GAAA,CAAI,EAAA,EAAI,OAAO,CAAC,CAAA;AACnD,MAAA,eAAA;AAAA,QACE,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,EAAE,IAAA,EAAM,OAAO,KAAA,EAAO,KAAA,CAAM,KAAA,IAAS,OAAA,EAAS;AAAA,OACjE;AACA,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,CAAO,EAAA,EAAI,OAAA,EAAS,IAAI,CAAA;AAAA,MAChC,CAAA,CAAA,MAAQ;AACN,QAAA,eAAA,CAAgB,KAAK,IAAA,CAAK,UAAA,EAAY,EAAE,IAAA,EAAM,KAAA,EAAO,CAAC,CAAA;AAAA,MACxD,CAAA,SAAE;AACA,QAAA,UAAA,CAAW,CAAC,IAAA,KAAS;AACnB,UAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,UAAA,IAAA,CAAK,OAAO,EAAE,CAAA;AACd,UAAA,OAAO,IAAA;AAAA,QACT,CAAC,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAM,MAAA,EAAQ,OAAA,EAAS,WAAW,MAAA,EAAQ,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,UAAU;AAAA,GACxE;AAEA,EAAA,MAAM,OAAA,GAAUC,eAAA;AAAA,IACdC,cAAA,CAAUC,oBAAe,EAAE,oBAAA,EAAsB,EAAE,QAAA,EAAU,CAAA,IAAK;AAAA,GACpE;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KACnB,aAAA,CAAc,OAAO,KAAA,CAAM,MAAA,CAAO,EAAE,CAAC,CAAA;AAEvC,EAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KAAwB;AACzC,IAAA,aAAA,CAAc,IAAI,CAAA;AAClB,IAAA,IAAI,KAAA,CAAM,IAAA,EAAM,KAAK,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,EAAE,CAAA,EAAG,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,EAC5E,CAAA;AAKA,EAAA,MAAM,aAAA,GAAgB,CACpB,KAAA,EACA,EAAA,EACA,WAAA,KACG;AACH,IAAA,IAAI,CAAC,MAAA,IAAU,EAAE,KAAA,CAAM,OAAA,IAAW,MAAM,OAAA,CAAA,EAAU;AAClD,IAAA,MAAM,GAAA,GAAMC,uBAAA,CAAM,KAAA,CAAM,aAAa,CAAA;AACrC,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,YAAA,EAAc,KAAA,GAAQ,MAAM,EAAA,GAAK,CAAA;AAAA,SAAA,IAC1C,KAAA,CAAM,GAAA,KAAQ,WAAA,EAAa,KAAA,GAAQ,MAAM,CAAA,GAAI,EAAA;AAAA,SACjD;AAIL,IAAA,IAAI,MAAA;AACJ,IAAA,KAAA,IACM,CAAA,GAAI,cAAc,KAAA,EACtB,CAAA,IAAK,KAAK,CAAA,GAAI,OAAA,CAAQ,MAAA,EACtB,CAAA,IAAK,KAAA,EACL;AACA,MAAA,IAAI,OAAA,CAAQ,CAAC,CAAA,CAAE,QAAA,EAAU;AACvB,QAAA,MAAA,GAAS,QAAQ,CAAC,CAAA;AAClB,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,KAAK,MAAA,CAAO,EAAA,EAAI,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA;AAAA,EACjC,CAAA;AAEA,EAAA,MAAM,KAAA,GAAQ,CAAC,OAAA,qBACbR,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,kBAAA;AAAA,MACV,SAAA,EAAWC,oBAAA;AAAA,QACT,8IAAA;AAAA,QACA,UAAA,EAAY;AAAA,OACd;AAAA,MAEC,QAAA,EAAA;AAAA;AAAA,GACH;AAGF,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,OAAO,KAAA;AAAA,qCACJ,GAAA,EAAA,EAAE,IAAA,EAAK,SAAQ,SAAA,EAAU,kBAAA,EACvB,eAAK,KAAA,EACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAO,KAAA;AAAA,sBACLF,eAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EACd,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAACS,yBAAA,EAAA,EAAQ,IAAA,EAAK,IAAA,EAAK,KAAA,EAAO,KAAK,OAAA,EAAS,CAAA;AAAA,wBACxCT,cAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAW,IAAA,EAAE,eAAK,OAAA,EAAQ;AAAA,OAAA,EAClC;AAAA,KACF;AAAA,EACF;AACA,EAAA,IAAI,MAAM,MAAA,KAAW,CAAA,IAAK,UAAA,EAAY,6DAAU,QAAA,EAAA,UAAA,EAAW,CAAA;AAE3D,EAAA,MAAM,YAAA,GAAe,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA,GAAI,MAAA;AAEzD,EAAA,uBACED,eAAA;AAAA,IAACW,eAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,kBAAA,EAAoBC,kBAAA;AAAA,MACpB,WAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA,EAAc,MAAM,aAAA,CAAc,IAAI,CAAA;AAAA,MAEtC,QAAA,EAAA;AAAA,wBAAAX,cAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,WAAA,EAAU,YAAA;AAAA,YAKV,QAAA,EAAU,CAAA;AAAA,YACV,IAAA,EAAK,OAAA;AAAA,YACL,cAAY,IAAA,CAAK,KAAA;AAAA,YACjB,SAAA,EAAWC,oBAAA;AAAA;AAAA;AAAA,cAGT,4DAAA;AAAA,cACA;AAAA,aACF;AAAA,YAEC,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,EAAQ,WAAA,qBACpBD,cAAA;AAAA,cAAC,WAAA;AAAA,cAAA;AAAA,gBAEC,OAAO,MAAA,CAAO,KAAA;AAAA,gBACd,SAAA,EAAW,MAAA,CAAO,QAAA,IAAY,OAAA,CAAQ,MAAM,CAAA;AAAA,gBAC5C,QAAA,EAAU,CAAA,EAAG,MAAM,CAAA,KAAA,EAAQ,WAAW,CAAA,CAAA;AAAA,gBACtC,KAAA,EAAO,OAAO,KAAA,CAAM,MAAA;AAAA,gBACpB,YAAA;AAAA,gBACA,UAAA;AAAA,gBAEA,QAAA,kBAAAD,eAAA;AAAA,kBAAC,IAAA;AAAA,kBAAA;AAAA,oBACC,iBAAA,EAAiB,CAAA,EAAG,MAAM,CAAA,KAAA,EAAQ,WAAW,CAAA,CAAA;AAAA,oBAC7C,SAAA,EAAU,gCAAA;AAAA,oBAET,QAAA,EAAA;AAAA,sBAAA,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AAC1B,wBAAA,MAAM,EAAA,GAAK,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA;AAC/B,wBAAA,uBACEC,cAAA;AAAA,0BAAC,SAAA;AAAA,0BAAA;AAAA,4BAEC,EAAA;AAAA,4BACA,KAAA,EAAO,SAAA,CAAU,QAAA,CAAS,IAAI,CAAA;AAAA,4BAC9B,QAAA,EAAU,SAAA,CAAU,WAAA,GAAc,IAAI,CAAA;AAAA,4BACtC,MAAA,EAAQ,SAAA,CAAU,SAAA,GAAY,IAAI,CAAA;AAAA,4BAClC,UAAU,EAAA,KAAO,UAAA;AAAA,4BACjB,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAAA,4BACvB,SAAA,EAAW,QAAQ,MAAM,CAAA;AAAA,4BACzB,IAAA,EAAM,SAAS,MAAA,GAAS,MAAA;AAAA,4BACxB,IAAA,EAAM,OAAA,GAAU,EAAA,EAAI,IAAI,CAAA;AAAA,4BACxB,SAAA,EAAWC,oBAAA;AAAA,8BACT,YAAA,CAAa;AAAA,gCACX,OAAA;AAAA,gCACA,WAAA,EAAa,QAAQ,MAAM,CAAA;AAAA,gCAC3B,UAAU,EAAA,KAAO,UAAA;AAAA,gCACjB,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,EAAE;AAAA,+BACxB,CAAA;AAAA,8BACD,UAAA,EAAY,IAAA;AAAA,8BACZ,EAAA,KAAO,cAAc,UAAA,EAAY;AAAA,6BACnC;AAAA,4BACA,QAAQ,MAAA,GAAS,MAAM,MAAA,CAAO,EAAA,EAAI,IAAI,CAAA,GAAI,MAAA;AAAA,4BAC1C,WAAW,CAAC,KAAA,KAAU,aAAA,CAAc,KAAA,EAAO,IAAI,WAAW,CAAA;AAAA,4BAEzD,QAAA,EAAA,UAAA,GAAa,IAAA,EAAM,EAAE,IAAA,EAAM,SAAS;AAAA,2BAAA;AAAA,0BAvBhC;AAAA,yBAwBP;AAAA,sBAEJ,CAAC,CAAA;AAAA,sBACA,MAAA,CAAO,MAAM,MAAA,KAAW,CAAA,mCACtB,IAAA,EAAA,EAAG,SAAA,EAAU,yCAAA,EACX,QAAA,EAAA,IAAA,CAAK,KAAA,EACR;AAAA;AAAA;AAAA;AAEJ,eAAA;AAAA,cAhDK,OAAO,KAAA,CAAM;AAAA,aAkDrB;AAAA;AAAA,SACH;AAAA,QAEC,MAAA,mCACE,MAAA,EAAA,EAAK,EAAA,EAAI,QAAQ,SAAA,EAAU,SAAA,EACzB,eAAK,QAAA,EACR,CAAA;AAAA,wBAIFD,cAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,WAAA,EAAU,sBAAA;AAAA,YACV,IAAA,EAAK,QAAA;AAAA,YACL,WAAA,EAAU,QAAA;AAAA,YACV,SAAA,EAAU,SAAA;AAAA,YAET,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,wBAEAA,cAAA,CAACY,oBACE,QAAA,EAAA,YAAA,oBACCZ,cAAA,CAAC,SAAI,SAAA,EAAWC,oBAAA,CAAG,YAAA,CAAa,EAAE,OAAA,EAAS,GAAG,WAAW,CAAA,EACvD,QAAA,kBAAAD,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2CAAA,EACb,oBAAU,QAAA,CAAS,YAAY,CAAA,EAClC,CAAA,EACF,CAAA,EAEJ;AAAA;AAAA;AAAA,GACF;AAEJ","file":"chunk-HDSYYQYM.cjs","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport {\n DndContext,\n DragOverlay,\n PointerSensor,\n pointerWithin,\n useDraggable,\n useDroppable,\n useSensor,\n useSensors,\n type DragEndEvent,\n type DragStartEvent,\n} from '@dnd-kit/core';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { isRtl } from '../../hooks/useDirection';\nimport { cn } from '../../utils/cn';\nimport { Spinner } from '../Spinner';\nimport {\n accentClasses,\n defaultViewLabels,\n type Accent,\n type Stage,\n type ViewBaseProps,\n type ViewLabels,\n} from '../../views/types';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type BoardViewSlot =\n | 'column'\n | 'columnHeader'\n | 'card'\n | 'selectedCard'\n | 'state';\n\nexport interface BoardLabels extends ViewLabels {\n /** Accessible name of the scrollable board region. */\n board: string;\n /** Announced when a card starts moving. `{item}` and `{stage}` are substituted. */\n moved: string;\n /** Announced when `onMove` rejects. */\n moveFailed: string;\n /** Hint on a focusable card describing the keyboard move. */\n moveHint: string;\n}\n\nexport const defaultBoardLabels: BoardLabels = {\n ...defaultViewLabels,\n empty: 'Nothing in this stage',\n board: 'Board',\n moved: '{item} moved to {stage}',\n moveFailed: 'Could not move {item}',\n moveHint: 'Press Control with the arrow keys to move between stages',\n};\n\nexport interface BoardViewProps<T>\n extends ViewBaseProps<T>, VariantProps<typeof cardVariants> {\n /** Columns, in order. A board without stages has nothing to draw. */\n stages: readonly Stage[];\n /**\n * Commits a move. The board shows the card in its new column while this is\n * pending and puts it back if the promise rejects, so the caller never has to\n * re-render it home.\n */\n onMove?: (id: string, toStage: string, item: T) => void | Promise<void>;\n labels?: Partial<BoardLabels>;\n classNames?: Partial<Record<BoardViewSlot, string>>;\n /** Heading level for column headers, under the page's own heading. */\n headingLevel?: 'h2' | 'h3' | 'h4';\n}\n\n// =============================================================================\n// Variants\n// =============================================================================\n\nconst cardVariants = cva(\n [\n 'w-full rounded-md border border-border bg-card p-2 text-start',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n ],\n {\n variants: {\n density: {\n comfortable: 'p-3',\n compact: 'p-2',\n },\n interactive: { true: 'hover:border-primary-500/40', false: '' },\n selected: { true: 'ring-2 ring-primary-500/50', false: '' },\n pending: { true: 'opacity-60', false: '' },\n },\n defaultVariants: {\n density: 'comfortable',\n interactive: false,\n selected: false,\n pending: false,\n },\n }\n);\n\nconst fill = (template: string, values: Record<string, string>) =>\n template.replace(/\\{(\\w+)\\}/g, (_, key) => values[key] ?? '');\n\n// =============================================================================\n// Card\n// =============================================================================\n\ninterface CardProps {\n id: string;\n title: string;\n subtitle?: string;\n accent?: Accent;\n selected: boolean;\n pending: boolean;\n draggable: boolean;\n hint?: string;\n href?: string;\n className?: string;\n children?: React.ReactNode;\n onOpen?: () => void;\n onKeyDown?: (event: React.KeyboardEvent) => void;\n}\n\nfunction BoardCard({\n id,\n title,\n subtitle,\n accent,\n selected,\n pending,\n draggable,\n hint,\n href,\n className,\n children,\n onOpen,\n onKeyDown,\n}: CardProps) {\n const { attributes, listeners, setNodeRef, isDragging } = useDraggable({\n id,\n disabled: !draggable,\n });\n\n const body = children ?? (\n <span className=\"flex items-start gap-2\">\n {accent && (\n <span\n aria-hidden\n className={cn(\n 'mt-1.5 size-2 shrink-0 rounded-full',\n accentClasses[accent].marker\n )}\n />\n )}\n <span className=\"min-w-0 flex-1\">\n <span className=\"text-foreground block text-sm font-medium\">\n {title}\n </span>\n {subtitle && (\n <span className=\"text-muted-foreground block truncate text-xs\">\n {subtitle}\n </span>\n )}\n </span>\n </span>\n );\n\n const onCardKeyDown = (event: React.KeyboardEvent) => {\n if (onOpen && !href && (event.key === 'Enter' || event.key === ' ')) {\n // Space is dnd-kit's pick-up key only while dragging; here the card is at\n // rest, so it activates like any other button.\n if (!event.ctrlKey && !event.metaKey) {\n event.preventDefault();\n onOpen();\n return;\n }\n }\n onKeyDown?.(event);\n };\n\n const shared = {\n ref: setNodeRef,\n // Only the pointer listeners are shared. dnd-kit's `attributes` carry\n // `role=\"button\"` and a `tabIndex`, which on an `<a href>` would override\n // the native link role — the card would announce as a button, and the\n // middle-click / \"copy link\" affordance this branch exists to preserve\n // would no longer be what assistive tech describes. The non-link card takes\n // them below, where button semantics are the correct answer.\n ...(draggable ? listeners : {}),\n 'aria-current': selected ? ('true' as const) : undefined,\n 'aria-describedby': hint,\n 'aria-busy': pending || undefined,\n 'data-slot': 'board-view-card',\n className: cn(className, isDragging && 'opacity-40'),\n };\n\n return (\n <li>\n {href ? (\n // An anchor, like every other view: the card stays middle-clickable and\n // \"copy link\" works. dnd-kit's listeners still own the drag.\n <a\n {...shared}\n href={href}\n onKeyDown={onCardKeyDown}\n onClick={(event) => {\n if (\n !onOpen ||\n event.defaultPrevented ||\n event.metaKey ||\n event.ctrlKey ||\n event.shiftKey ||\n event.button !== 0\n )\n return;\n event.preventDefault();\n onOpen();\n }}\n >\n {body}\n </a>\n ) : (\n <div\n {...shared}\n {...(draggable ? attributes : {})}\n role={onOpen ? 'button' : undefined}\n tabIndex={draggable || onOpen ? 0 : undefined}\n onKeyDown={onCardKeyDown}\n onClick={onOpen}\n >\n {body}\n </div>\n )}\n </li>\n );\n}\n\n// =============================================================================\n// Column\n// =============================================================================\n\nfunction BoardColumn({\n stage,\n headerId,\n count,\n headingLevel: Heading,\n droppable,\n classNames,\n children,\n}: {\n stage: Stage;\n droppable: boolean;\n headerId: string;\n count: number;\n headingLevel: 'h2' | 'h3' | 'h4';\n classNames?: BoardViewProps<unknown>['classNames'];\n children: React.ReactNode;\n}) {\n const { setNodeRef, isOver } = useDroppable({\n id: stage.id,\n disabled: !droppable,\n });\n const accent = stage.accent ?? 'neutral';\n return (\n <section\n ref={setNodeRef}\n data-slot=\"board-view-column\"\n data-over={isOver || undefined}\n className={cn(\n 'bg-muted/40 flex min-w-0 flex-col rounded-lg border',\n isOver ? accentClasses[accent].border : 'border-border',\n 'sm:w-72 sm:shrink-0',\n classNames?.column\n )}\n >\n <Heading>\n <span\n id={headerId}\n data-slot=\"board-view-column-header\"\n className={cn(\n 'border-border text-muted-foreground flex items-center gap-2 border-b px-3 py-2 text-xs font-semibold tracking-wide uppercase',\n classNames?.columnHeader\n )}\n >\n <span\n aria-hidden\n className={cn(\n 'size-2 shrink-0 rounded-full',\n accentClasses[accent].marker\n )}\n />\n <span>{stage.label}</span>\n <span className=\"ms-auto font-normal tabular-nums\">{count}</span>\n </span>\n </Heading>\n {children}\n </section>\n );\n}\n\n// =============================================================================\n// Component\n// =============================================================================\n\nexport function BoardView<T>({\n items,\n accessors,\n stages,\n loading = false,\n error = null,\n selectedId = null,\n onOpen,\n getHref,\n onMove,\n renderItem,\n emptyState,\n labels,\n density,\n className,\n classNames,\n headingLevel = 'h3',\n}: BoardViewProps<T>) {\n const text = { ...defaultBoardLabels, ...labels };\n const hintId = React.useId();\n // Ids come from position, not from the stage id: two distinct statuses can\n // normalise to the same string, and a duplicate id makes `aria-labelledby`\n // resolve to the wrong heading.\n const baseId = React.useId();\n const [announcement, setAnnouncement] = React.useState('');\n const [draggingId, setDraggingId] = React.useState<string | null>(null);\n // Where a card is shown while its move is in flight, so the column it landed\n // in is the one the user sees before the caller's data catches up.\n // A Map, not an object. Ids come from the caller's `getId` and are only\n // typed `string`, so a collection keyed by user data can legitimately produce\n // `toString`, `constructor` or `__proto__`. On a plain object `'toString' in\n // pending` is true before anything is pending, which would pin that card as\n // permanently in-flight and make it impossible to move.\n const [pending, setPending] = React.useState<Map<string, string>>(\n () => new Map()\n );\n\n const byId = React.useMemo(() => {\n const map = new Map<string, T>();\n for (const item of items) map.set(accessors.getId(item), item);\n return map;\n }, [items, accessors]);\n\n const stageOf = React.useCallback(\n (item: T) =>\n pending.get(accessors.getId(item)) ?? accessors.getStatus?.(item),\n [pending, accessors]\n );\n\n const columns = React.useMemo(() => {\n const buckets = new Map<string, T[]>(stages.map((s) => [s.id, []]));\n const extra = new Map<string, T[]>();\n for (const item of items) {\n const key = stageOf(item) ?? '';\n const bucket = buckets.get(key);\n if (bucket) bucket.push(item);\n else {\n const spill = extra.get(key);\n if (spill) spill.push(item);\n else extra.set(key, [item]);\n }\n }\n return [\n ...stages.map((stage) => ({\n stage,\n declared: true,\n items: buckets.get(stage.id) ?? [],\n })),\n // Never silently drop a record whose status matches no stage. These are\n // shown so the record stays visible, but they are not drop targets: their\n // ids were never declared, and `onMove` promises a named stage.\n ...[...extra].map(([key, bucket]) => ({\n stage: { id: key, label: key || text.ungrouped } as Stage,\n declared: false,\n items: bucket,\n })),\n ];\n }, [items, stages, stageOf, text.ungrouped]);\n\n const commit = React.useCallback(\n async (id: string, toStage: string) => {\n const item = byId.get(id);\n if (!item || !onMove) return;\n // One move per card at a time: a second would overwrite the first's\n // pending stage, and the first `finally` would then clear it, snapping\n // the card home while the second mutation is still in flight.\n if (pending.has(id)) return;\n const stage = stages.find((s) => s.id === toStage);\n // `onMove` promises a move to a stage the caller declared. Columns\n // synthesized for unknown statuses exist so a record is never silently\n // dropped, not as somewhere to put things — accepting a drop there would\n // hand back an id that was never in `stages`.\n if (!stage) return;\n const from = accessors.getStatus?.(item);\n if (from === toStage) return;\n const title = accessors.getTitle(item);\n\n setPending((prev) => new Map(prev).set(id, toStage));\n setAnnouncement(\n fill(text.moved, { item: title, stage: stage.label ?? toStage })\n );\n try {\n await onMove(id, toStage, item);\n } catch {\n setAnnouncement(fill(text.moveFailed, { item: title }));\n } finally {\n setPending((prev) => {\n const next = new Map(prev);\n next.delete(id);\n return next;\n });\n }\n },\n [byId, onMove, pending, accessors, stages, text.moved, text.moveFailed]\n );\n\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 5 } })\n );\n\n const onDragStart = (event: DragStartEvent) =>\n setDraggingId(String(event.active.id));\n\n const onDragEnd = (event: DragEndEvent) => {\n setDraggingId(null);\n if (event.over) void commit(String(event.active.id), String(event.over.id));\n };\n\n // Pointer drag has no keyboard equivalent that is pleasant to use, so moving\n // by keyboard is its own command on the focused card rather than a simulated\n // drag: Ctrl/Cmd with the arrow keys steps it between adjacent stages.\n const onCardKeyDown = (\n event: React.KeyboardEvent,\n id: string,\n columnIndex: number\n ) => {\n if (!onMove || !(event.ctrlKey || event.metaKey)) return;\n const rtl = isRtl(event.currentTarget);\n let delta = 0;\n if (event.key === 'ArrowRight') delta = rtl ? -1 : 1;\n else if (event.key === 'ArrowLeft') delta = rtl ? 1 : -1;\n else return;\n // Step to the next *declared* stage. A fallback column is not a move\n // target, so stopping on one would strand the card there; skipping it\n // keeps arrowing continuous and still lets a card leave one.\n let target;\n for (\n let i = columnIndex + delta;\n i >= 0 && i < columns.length;\n i += delta\n ) {\n if (columns[i].declared) {\n target = columns[i];\n break;\n }\n }\n if (!target) return;\n event.preventDefault();\n void commit(id, target.stage.id);\n };\n\n const state = (content: React.ReactNode) => (\n <div\n data-slot=\"board-view-state\"\n className={cn(\n 'border-border bg-card text-muted-foreground flex flex-col items-center justify-center gap-2 rounded-lg border px-4 py-10 text-center text-sm',\n classNames?.state\n )}\n >\n {content}\n </div>\n );\n\n if (error) {\n return state(\n <p role=\"alert\" className=\"text-destructive\">\n {text.error}\n </p>\n );\n }\n if (loading) {\n return state(\n <span className=\"flex items-center gap-2\">\n <Spinner size=\"sm\" label={text.loading} />\n <span aria-hidden>{text.loading}</span>\n </span>\n );\n }\n if (items.length === 0 && emptyState) return <>{emptyState}</>;\n\n const draggingItem = draggingId ? byId.get(draggingId) : undefined;\n\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={pointerWithin}\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n onDragCancel={() => setDraggingId(null)}\n >\n <div\n data-slot=\"board-view\"\n // Scrollable content must be keyboard operable (WCAG 2.1.1), which axe\n // enforces as scrollable-region-focusable. jsx-a11y disagrees for\n // non-interactive elements; the success criterion wins.\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex\n tabIndex={0}\n role=\"group\"\n aria-label={text.board}\n className={cn(\n // Columns on one scrolling row once there is room; stacked below it,\n // because five 288px columns on a phone is a horizontal maze.\n 'flex flex-col gap-3 sm:flex-row sm:overflow-x-auto sm:pb-2',\n className\n )}\n >\n {columns.map((column, columnIndex) => (\n <BoardColumn\n key={column.stage.id}\n stage={column.stage}\n droppable={column.declared && Boolean(onMove)}\n headerId={`${baseId}-col-${columnIndex}`}\n count={column.items.length}\n headingLevel={headingLevel}\n classNames={classNames}\n >\n <ul\n aria-labelledby={`${baseId}-col-${columnIndex}`}\n className=\"flex flex-1 flex-col gap-2 p-2\"\n >\n {column.items.map((item) => {\n const id = accessors.getId(item);\n return (\n <BoardCard\n key={id}\n id={id}\n title={accessors.getTitle(item)}\n subtitle={accessors.getSubtitle?.(item)}\n accent={accessors.getAccent?.(item)}\n selected={id === selectedId}\n pending={pending.has(id)}\n draggable={Boolean(onMove)}\n hint={onMove ? hintId : undefined}\n href={getHref?.(id, item)}\n className={cn(\n cardVariants({\n density,\n interactive: Boolean(onOpen),\n selected: id === selectedId,\n pending: pending.has(id),\n }),\n classNames?.card,\n id === selectedId && classNames?.selectedCard\n )}\n onOpen={onOpen ? () => onOpen(id, item) : undefined}\n onKeyDown={(event) => onCardKeyDown(event, id, columnIndex)}\n >\n {renderItem?.(item, { view: 'board' })}\n </BoardCard>\n );\n })}\n {column.items.length === 0 && (\n <li className=\"text-muted-foreground px-1 py-2 text-xs\">\n {text.empty}\n </li>\n )}\n </ul>\n </BoardColumn>\n ))}\n </div>\n\n {onMove && (\n <span id={hintId} className=\"sr-only\">\n {text.moveHint}\n </span>\n )}\n {/* Separate from dnd-kit's own drag live region: this announces moves\n made by keyboard command, which are not drags. */}\n <span\n data-slot=\"board-view-announcer\"\n role=\"status\"\n aria-live=\"polite\"\n className=\"sr-only\"\n >\n {announcement}\n </span>\n\n <DragOverlay>\n {draggingItem && (\n <div className={cn(cardVariants({ density }), 'shadow-lg')}>\n <span className=\"text-foreground block text-sm font-medium\">\n {accessors.getTitle(draggingItem)}\n </span>\n </div>\n )}\n </DragOverlay>\n </DndContext>\n );\n}\n\nexport { cardVariants as boardViewCardVariants };\n"]}
@@ -1,12 +1,12 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkNCG7NJAW_cjs = require('./chunk-NCG7NJAW.cjs');
4
- var chunkAHT2HRHC_cjs = require('./chunk-AHT2HRHC.cjs');
4
+ var chunkTNRANQVI_cjs = require('./chunk-TNRANQVI.cjs');
5
5
  var chunkFSLI5IKP_cjs = require('./chunk-FSLI5IKP.cjs');
6
- var chunkPINIBEIU_cjs = require('./chunk-PINIBEIU.cjs');
6
+ var chunkXRXOGMMG_cjs = require('./chunk-XRXOGMMG.cjs');
7
7
  var chunkPHYQSCP6_cjs = require('./chunk-PHYQSCP6.cjs');
8
8
  var chunkYW2AKBLS_cjs = require('./chunk-YW2AKBLS.cjs');
9
- var chunkZ3WMDVMR_cjs = require('./chunk-Z3WMDVMR.cjs');
9
+ var chunk7QNBPB7F_cjs = require('./chunk-7QNBPB7F.cjs');
10
10
  var chunkFSARTLUE_cjs = require('./chunk-FSARTLUE.cjs');
11
11
  var chunkIEY3ZJIT_cjs = require('./chunk-IEY3ZJIT.cjs');
12
12
  var chunkS5RVSXDV_cjs = require('./chunk-S5RVSXDV.cjs');
@@ -208,6 +208,7 @@ var TextAreaRichKerebron = React2__namespace.forwardRef(
208
208
  onMacroInsert,
209
209
  macroLabels,
210
210
  onCreateMacro,
211
+ variableGroups,
211
212
  toolbar,
212
213
  defaultToolbar = "hidden",
213
214
  onToolbarChange,
@@ -244,6 +245,8 @@ var TextAreaRichKerebron = React2__namespace.forwardRef(
244
245
  const [editorTop, setEditorTop] = React2__namespace.useState(0);
245
246
  const [blockMenuOpen, setBlockMenuOpen] = React2__namespace.useState(false);
246
247
  const [gutterTop, setGutterTop] = React2__namespace.useState(4);
248
+ const [variablesOpen, setVariablesOpen] = React2__namespace.useState(false);
249
+ const [variablesAnchor, setVariablesAnchor] = React2__namespace.useState(null);
247
250
  const recognitionRef = React2__namespace.useRef(null);
248
251
  const isListeningRef = React2__namespace.useRef(false);
249
252
  const shouldRestartRef = React2__namespace.useRef(false);
@@ -254,16 +257,21 @@ var TextAreaRichKerebron = React2__namespace.forwardRef(
254
257
  const macroPanelId = React2__namespace.useId();
255
258
  const macroSidePanel = chunkPHYQSCP6_cjs.useMediaQuery("(min-width: 768px)");
256
259
  const prefersReducedMotion = chunkYW2AKBLS_cjs.usePrefersReducedMotion();
257
- const direction = chunkZ3WMDVMR_cjs.useDirection(wrapperRef);
260
+ const direction = chunk7QNBPB7F_cjs.useDirection(wrapperRef);
258
261
  const hasMacros = Boolean(macros);
259
262
  const hasMacroEntries = Boolean(
260
263
  macros?.some((group) => group.macros.length > 0)
261
264
  );
265
+ const hasVariables = Boolean(variableGroups && variableGroups.length > 0);
262
266
  const gutterActive = !inert;
263
267
  const macrosRef = React2__namespace.useRef(macros);
264
268
  macrosRef.current = macros;
265
269
  const hasMacrosRef = React2__namespace.useRef(hasMacros);
266
270
  hasMacrosRef.current = hasMacros;
271
+ const hasVariablesRef = React2__namespace.useRef(hasVariables);
272
+ hasVariablesRef.current = hasVariables;
273
+ const variablesOpenRef = React2__namespace.useRef(variablesOpen);
274
+ variablesOpenRef.current = variablesOpen;
267
275
  const onMacroInsertRef = React2__namespace.useRef(onMacroInsert);
268
276
  onMacroInsertRef.current = onMacroInsert;
269
277
  const onChangeRef = React2__namespace.useRef(onChange);
@@ -374,6 +382,45 @@ var TextAreaRichKerebron = React2__namespace.forwardRef(
374
382
  });
375
383
  return true;
376
384
  };
385
+ const insertVariable = (variable) => {
386
+ if (inertRef.current) return;
387
+ const view = currentView();
388
+ if (!view) return;
389
+ view.focus();
390
+ insertPlainText(view, variable.insertValue ?? variable.value);
391
+ };
392
+ const handleVariablesOpenChange = (open) => {
393
+ if (!open && document.activeElement?.closest('[data-slot="dropdown-menu"]')) {
394
+ currentView()?.focus();
395
+ }
396
+ setVariablesOpen(open);
397
+ };
398
+ const openVariablesMenu = () => {
399
+ if (inertRef.current) return;
400
+ const root = wrapperRef.current;
401
+ const frame = gutterWrapperRef.current;
402
+ if (!root || !frame) return;
403
+ const visible = (candidate) => candidate.getBoundingClientRect().width > 0;
404
+ const anchor = Array.from(
405
+ root.querySelectorAll(".tar-menu-variables")
406
+ ).find(visible) ?? Array.from(
407
+ root.querySelectorAll(".kb-custom-menu__overflow-toggle")
408
+ ).find(visible) ?? root.querySelector(".kb-custom-menu");
409
+ if (!anchor) return;
410
+ const rect = anchor.getBoundingClientRect();
411
+ const frameRect = frame.getBoundingClientRect();
412
+ setVariablesAnchor({
413
+ top: rect.top - frameRect.top,
414
+ left: rect.left - frameRect.left,
415
+ width: rect.width,
416
+ height: rect.height
417
+ });
418
+ setVariablesOpen(true);
419
+ };
420
+ const toggleVariablesMenu = () => {
421
+ if (variablesOpenRef.current) handleVariablesOpenChange(false);
422
+ else openVariablesMenu();
423
+ };
377
424
  const resetGutter = () => {
378
425
  hoverBlockRef.current = null;
379
426
  setGutterTop(editorTop + 4);
@@ -506,7 +553,7 @@ var TextAreaRichKerebron = React2__namespace.forwardRef(
506
553
  const view = currentView();
507
554
  if (finalTranscript && view) {
508
555
  view.focus();
509
- insertPlainText(view, chunkAHT2HRHC_cjs.processDictation(finalTranscript) + " ");
556
+ insertPlainText(view, chunkTNRANQVI_cjs.processDictation(finalTranscript) + " ");
510
557
  }
511
558
  };
512
559
  recognition.onerror = (event) => {
@@ -575,11 +622,35 @@ var TextAreaRichKerebron = React2__namespace.forwardRef(
575
622
  React2__namespace.useEffect(() => {
576
623
  if (!toolbarVisible || inert || !enableDictation) stopDictation();
577
624
  }, [toolbarVisible, inert, enableDictation, stopDictation]);
625
+ React2__namespace.useEffect(() => {
626
+ if (!toolbarVisible || inert || !hasVariables) setVariablesOpen(false);
627
+ }, [toolbarVisible, inert, hasVariables]);
628
+ React2__namespace.useEffect(() => {
629
+ if (!variablesOpen) return;
630
+ const toolbar2 = wrapperRef.current?.querySelector(".kb-custom-menu");
631
+ if (!toolbar2 || typeof ResizeObserver === "undefined") return;
632
+ let initial = true;
633
+ const observer = new ResizeObserver(() => {
634
+ if (initial) {
635
+ initial = false;
636
+ return;
637
+ }
638
+ handleVariablesOpenChangeRef.current(false);
639
+ });
640
+ observer.observe(toolbar2);
641
+ return () => observer.disconnect();
642
+ }, [variablesOpen]);
578
643
  React2__namespace.useEffect(() => stopDictation, [stopDictation]);
579
644
  const openBlockMenuAtCaretRef = React2__namespace.useRef(openBlockMenuAtCaret);
580
645
  openBlockMenuAtCaretRef.current = openBlockMenuAtCaret;
581
646
  const expandTypedShortcutRef = React2__namespace.useRef(expandTypedShortcut);
582
647
  expandTypedShortcutRef.current = expandTypedShortcut;
648
+ const toggleVariablesMenuRef = React2__namespace.useRef(toggleVariablesMenu);
649
+ toggleVariablesMenuRef.current = toggleVariablesMenu;
650
+ const handleVariablesOpenChangeRef = React2__namespace.useRef(
651
+ handleVariablesOpenChange
652
+ );
653
+ handleVariablesOpenChangeRef.current = handleVariablesOpenChange;
583
654
  const [menuAddon] = React2__namespace.useState(() => {
584
655
  const macrosItem = new extensionMenu.MenuItem({
585
656
  icon: {
@@ -615,11 +686,28 @@ var TextAreaRichKerebron = React2__namespace.forwardRef(
615
686
  return true;
616
687
  }
617
688
  });
689
+ const variablesItem = new extensionMenu.MenuItem({
690
+ icon: {
691
+ width: 24,
692
+ height: 24,
693
+ // Material Symbols "data object" (Apache-2.0)
694
+ path: "M4 7v2c0 .55-.45 1-1 1H2v4h1c.55 0 1 .45 1 1v2c0 1.65 1.35 3 3 3h3v-2H7c-.55 0-1-.45-1-1v-2c0-1.3-.84-2.42-2-2.83v-.34C5.16 11.42 6 10.3 6 9V7c0-.55.45-1 1-1h3V4H7C5.35 4 4 5.35 4 7zm17 3c-.55 0-1-.45-1-1V7c0-1.65-1.35-3-3-3h-3v2h3c.55 0 1 .45 1 1v2c0 1.3.84 2.42 2 2.83v.34c-1.16.41-2 1.53-2 2.83v2c0 .55-.45 1-1 1h-3v2h3c1.65 0 3-1.35 3-3v-2c0-.55.45-1 1-1h1v-4h-1z"
695
+ },
696
+ title: m("Insert variable"),
697
+ class: "tar-menu-variables",
698
+ select: () => hasVariablesRef.current,
699
+ enable: () => !inertRef.current,
700
+ active: () => variablesOpenRef.current,
701
+ run: () => {
702
+ toggleVariablesMenuRef.current();
703
+ return true;
704
+ }
705
+ });
618
706
  const modifyMenu = (menus) => [
619
707
  ...menus,
620
708
  // The patched MenuItem types `render().dom` as nullable, which no
621
709
  // longer satisfies MenuElement; our items always render a button.
622
- [macrosItem, dictateItem]
710
+ [variablesItem, macrosItem, dictateItem]
623
711
  ];
624
712
  const kit = {
625
713
  getExtensions: () => [
@@ -674,6 +762,22 @@ var TextAreaRichKerebron = React2__namespace.forwardRef(
674
762
  dictateButton.setAttribute("title", title);
675
763
  dictateButton.setAttribute("aria-label", title);
676
764
  }
765
+ for (const variablesButton of root.querySelectorAll(
766
+ ".tar-menu-variables"
767
+ )) {
768
+ variablesButton.style.display = hasVariables ? "" : "none";
769
+ variablesButton.classList.toggle("kb-menu__button--disabled", inert);
770
+ variablesButton.setAttribute("aria-disabled", String(inert));
771
+ variablesButton.classList.toggle(
772
+ "kb-menu__button--active",
773
+ variablesOpen
774
+ );
775
+ variablesButton.setAttribute("aria-haspopup", "menu");
776
+ variablesButton.setAttribute("aria-expanded", String(variablesOpen));
777
+ const title = m("Insert variable");
778
+ variablesButton.setAttribute("title", title);
779
+ variablesButton.setAttribute("aria-label", title);
780
+ }
677
781
  };
678
782
  sync();
679
783
  const observer = new MutationObserver((mutations) => {
@@ -689,6 +793,8 @@ var TextAreaRichKerebron = React2__namespace.forwardRef(
689
793
  hasMacros,
690
794
  macrosOpen,
691
795
  macroLabels,
796
+ hasVariables,
797
+ variablesOpen,
692
798
  enableDictation,
693
799
  speechSupported,
694
800
  isListening,
@@ -846,7 +952,7 @@ var TextAreaRichKerebron = React2__namespace.forwardRef(
846
952
  style: { top: gutterTop },
847
953
  onMouseDown: (event) => event.preventDefault(),
848
954
  children: /* @__PURE__ */ jsxRuntime.jsxs(
849
- chunkPINIBEIU_cjs.Dropdown,
955
+ chunkXRXOGMMG_cjs.Dropdown,
850
956
  {
851
957
  open: blockMenuOpen,
852
958
  onOpenChange: handleBlockMenuOpenChange,
@@ -872,7 +978,7 @@ var TextAreaRichKerebron = React2__namespace.forwardRef(
872
978
  ),
873
979
  children: [
874
980
  BLOCK_FORMAT_ITEMS.map((item, index) => /* @__PURE__ */ jsxRuntime.jsx(
875
- chunkPINIBEIU_cjs.DropdownItem,
981
+ chunkXRXOGMMG_cjs.DropdownItem,
876
982
  {
877
983
  ref: index === 0 ? firstBlockItemRef : void 0,
878
984
  onClick: () => applyBlockFormat(item.command),
@@ -880,19 +986,19 @@ var TextAreaRichKerebron = React2__namespace.forwardRef(
880
986
  },
881
987
  item.key
882
988
  )),
883
- /* @__PURE__ */ jsxRuntime.jsx(chunkPINIBEIU_cjs.DropdownSeparator, {}),
989
+ /* @__PURE__ */ jsxRuntime.jsx(chunkXRXOGMMG_cjs.DropdownSeparator, {}),
884
990
  hasMacros && macros && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
885
991
  /* @__PURE__ */ jsxRuntime.jsx(
886
- chunkPINIBEIU_cjs.DropdownSubmenu,
992
+ chunkXRXOGMMG_cjs.DropdownSubmenu,
887
993
  {
888
994
  label: blockMenuLabels?.insertMacro ?? "Insert macro",
889
995
  disabled: !hasMacroEntries,
890
996
  children: blockMenuOpen && macros.flatMap((group) => [
891
997
  ...macros.length > 1 ? [
892
- /* @__PURE__ */ jsxRuntime.jsx(chunkPINIBEIU_cjs.DropdownLabel, { children: group.label }, `h:${group.id}`)
998
+ /* @__PURE__ */ jsxRuntime.jsx(chunkXRXOGMMG_cjs.DropdownLabel, { children: group.label }, `h:${group.id}`)
893
999
  ] : [],
894
1000
  ...group.macros.map((macro) => /* @__PURE__ */ jsxRuntime.jsx(
895
- chunkPINIBEIU_cjs.DropdownItem,
1001
+ chunkXRXOGMMG_cjs.DropdownItem,
896
1002
  {
897
1003
  className: "[&>[data-slot=dropdown-item-label]]:min-w-0 [&>[data-slot=dropdown-item-label]]:flex-1",
898
1004
  onClick: () => {
@@ -922,7 +1028,7 @@ var TextAreaRichKerebron = React2__namespace.forwardRef(
922
1028
  }
923
1029
  ),
924
1030
  /* @__PURE__ */ jsxRuntime.jsx(
925
- chunkPINIBEIU_cjs.DropdownItem,
1031
+ chunkXRXOGMMG_cjs.DropdownItem,
926
1032
  {
927
1033
  onClick: () => {
928
1034
  setBlockMenuOpen(false);
@@ -932,10 +1038,10 @@ var TextAreaRichKerebron = React2__namespace.forwardRef(
932
1038
  children: blockMenuLabels?.showMacroLibrary ?? "Show macro library"
933
1039
  }
934
1040
  ),
935
- /* @__PURE__ */ jsxRuntime.jsx(chunkPINIBEIU_cjs.DropdownSeparator, {})
1041
+ /* @__PURE__ */ jsxRuntime.jsx(chunkXRXOGMMG_cjs.DropdownSeparator, {})
936
1042
  ] }),
937
1043
  /* @__PURE__ */ jsxRuntime.jsx(
938
- chunkPINIBEIU_cjs.DropdownItem,
1044
+ chunkXRXOGMMG_cjs.DropdownItem,
939
1045
  {
940
1046
  onClick: () => {
941
1047
  setBlockMenuOpen(false);
@@ -992,6 +1098,67 @@ var TextAreaRichKerebron = React2__namespace.forwardRef(
992
1098
  disabled,
993
1099
  readOnly
994
1100
  }
1101
+ ),
1102
+ hasVariables && variablesOpen && variablesAnchor && // Invisible React anchor laid exactly over the toolbar's
1103
+ // Variables button: the Dropdown positions off it, and the
1104
+ // trigger span swallows a toggle-off click before it can
1105
+ // reach the Kerebron button (whose `run` would reopen).
1106
+ // eslint-disable-next-line jsx-a11y/no-static-element-interactions -- mousedown here only guards editor focus (preventDefault); the a11y contract lives on the real toolbar button underneath.
1107
+ /* @__PURE__ */ jsxRuntime.jsx(
1108
+ "div",
1109
+ {
1110
+ "data-slot": "textarea-rich-variables-anchor",
1111
+ className: "absolute z-10",
1112
+ style: variablesAnchor,
1113
+ onMouseDown: (event) => {
1114
+ if (event.currentTarget.contains(event.target)) {
1115
+ event.preventDefault();
1116
+ }
1117
+ },
1118
+ children: /* @__PURE__ */ jsxRuntime.jsx(
1119
+ chunkXRXOGMMG_cjs.Dropdown,
1120
+ {
1121
+ open: variablesOpen,
1122
+ onOpenChange: handleVariablesOpenChange,
1123
+ placement: "bottom-start",
1124
+ width: 240,
1125
+ searchable: true,
1126
+ searchPlaceholder: m("Search variables\u2026"),
1127
+ searchAriaLabel: m("Search template variables"),
1128
+ searchEmptyState: m("No matching variables"),
1129
+ trigger: (
1130
+ // Explicit size: the Dropdown's inline-flex anchor
1131
+ // container sizes to this span, matching the button.
1132
+ /* @__PURE__ */ jsxRuntime.jsx(
1133
+ "span",
1134
+ {
1135
+ "aria-hidden": "true",
1136
+ className: "block",
1137
+ style: {
1138
+ width: variablesAnchor.width,
1139
+ height: variablesAnchor.height
1140
+ }
1141
+ }
1142
+ )
1143
+ ),
1144
+ children: variableGroups.map((group, groupIndex) => /* @__PURE__ */ jsxRuntime.jsxs(React2__namespace.Fragment, { children: [
1145
+ groupIndex > 0 && /* @__PURE__ */ jsxRuntime.jsx(chunkXRXOGMMG_cjs.DropdownSeparator, {}),
1146
+ /* @__PURE__ */ jsxRuntime.jsx(chunkXRXOGMMG_cjs.DropdownLabel, { children: group.label }),
1147
+ group.variables.map((variable) => /* @__PURE__ */ jsxRuntime.jsx(
1148
+ chunkXRXOGMMG_cjs.DropdownItem,
1149
+ {
1150
+ onClick: () => {
1151
+ handleVariablesOpenChange(false);
1152
+ insertVariable(variable);
1153
+ },
1154
+ children: variable.label
1155
+ },
1156
+ variable.value
1157
+ ))
1158
+ ] }, group.label))
1159
+ }
1160
+ )
1161
+ }
995
1162
  )
996
1163
  ]
997
1164
  }
@@ -1007,7 +1174,7 @@ var TextAreaRichKerebron = React2__namespace.forwardRef(
1007
1174
  className: "border-border flex max-h-72 flex-col overflow-hidden border-t md:absolute md:end-0 md:bottom-0 md:max-h-none md:w-72 md:overflow-visible md:border-s md:border-t-0",
1008
1175
  style: { top: editorTop },
1009
1176
  children: /* @__PURE__ */ jsxRuntime.jsx(
1010
- chunkAHT2HRHC_cjs.MacroLibrary,
1177
+ chunkTNRANQVI_cjs.MacroLibrary,
1011
1178
  {
1012
1179
  id: macroPanelId,
1013
1180
  groups: macros,
@@ -1035,5 +1202,5 @@ TextAreaRichKerebron.displayName = "TextAreaRichKerebron";
1035
1202
 
1036
1203
  exports.CodeEditor = CodeEditor;
1037
1204
  exports.TextAreaRichKerebron = TextAreaRichKerebron;
1038
- //# sourceMappingURL=chunk-MM32RSX4.cjs.map
1039
- //# sourceMappingURL=chunk-MM32RSX4.cjs.map
1205
+ //# sourceMappingURL=chunk-HOE2U27V.cjs.map
1206
+ //# sourceMappingURL=chunk-HOE2U27V.cjs.map