@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.
- package/agent/skills/mieweb-ui-catalog/selection-guidance.md +1 -1
- package/dist/ag-grid.cjs +2 -2
- package/dist/ag-grid.js +1 -1
- package/dist/{chunk-AHYDJN4H.cjs → chunk-2XHPPOXY.cjs} +32 -32
- package/dist/{chunk-AHYDJN4H.cjs.map → chunk-2XHPPOXY.cjs.map} +1 -1
- package/dist/{chunk-3IKIRGHI.cjs → chunk-3H6BQV2D.cjs} +6 -6
- package/dist/{chunk-3IKIRGHI.cjs.map → chunk-3H6BQV2D.cjs.map} +1 -1
- package/dist/{chunk-IIV5GNSK.cjs → chunk-3PT4B4JT.cjs} +4 -4
- package/dist/{chunk-IIV5GNSK.cjs.map → chunk-3PT4B4JT.cjs.map} +1 -1
- package/dist/{chunk-GLG6UE2H.cjs → chunk-3SEQVGLH.cjs} +4 -4
- package/dist/{chunk-GLG6UE2H.cjs.map → chunk-3SEQVGLH.cjs.map} +1 -1
- package/dist/{chunk-JUY2JLFL.js → chunk-3XDU7XIC.js} +3 -3
- package/dist/{chunk-JUY2JLFL.js.map → chunk-3XDU7XIC.js.map} +1 -1
- package/dist/{chunk-LQ22CY7X.js → chunk-46ZUORUE.js} +5 -5
- package/dist/{chunk-LQ22CY7X.js.map → chunk-46ZUORUE.js.map} +1 -1
- package/dist/{chunk-CKECOCYJ.js → chunk-4IOIDS2Z.js} +3 -3
- package/dist/{chunk-CKECOCYJ.js.map → chunk-4IOIDS2Z.js.map} +1 -1
- package/dist/{chunk-F7SZSOB3.js → chunk-6PCA5H47.js} +3 -3
- package/dist/{chunk-F7SZSOB3.js.map → chunk-6PCA5H47.js.map} +1 -1
- package/dist/{chunk-ULEX7OOJ.js → chunk-6Y6W5DUY.js} +4 -4
- package/dist/{chunk-ULEX7OOJ.js.map → chunk-6Y6W5DUY.js.map} +1 -1
- package/dist/{chunk-S7AMZ4RD.cjs → chunk-7K6SW4VB.cjs} +4 -4
- package/dist/{chunk-S7AMZ4RD.cjs.map → chunk-7K6SW4VB.cjs.map} +1 -1
- package/dist/{chunk-KY67AMQ5.cjs → chunk-7MF3O3BU.cjs} +4 -4
- package/dist/{chunk-KY67AMQ5.cjs.map → chunk-7MF3O3BU.cjs.map} +1 -1
- package/dist/{chunk-Z3WMDVMR.cjs → chunk-7QNBPB7F.cjs} +9 -5
- package/dist/chunk-7QNBPB7F.cjs.map +1 -0
- package/dist/{chunk-YFWDS6MX.js → chunk-AB24H2RM.js} +3 -3
- package/dist/{chunk-YFWDS6MX.js.map → chunk-AB24H2RM.js.map} +1 -1
- package/dist/{chunk-DSGFWT4D.js → chunk-AQBZEN43.js} +5 -5
- package/dist/{chunk-DSGFWT4D.js.map → chunk-AQBZEN43.js.map} +1 -1
- package/dist/{chunk-2W73UQ3T.js → chunk-BPYI7BDC.js} +3 -3
- package/dist/{chunk-2W73UQ3T.js.map → chunk-BPYI7BDC.js.map} +1 -1
- package/dist/{chunk-7U7SONM5.js → chunk-CVCUQ2MZ.js} +3 -3
- package/dist/{chunk-7U7SONM5.js.map → chunk-CVCUQ2MZ.js.map} +1 -1
- package/dist/{chunk-PWXDRFJL.cjs → chunk-DHEOWRIE.cjs} +6 -6
- package/dist/{chunk-PWXDRFJL.cjs.map → chunk-DHEOWRIE.cjs.map} +1 -1
- package/dist/{chunk-OYUIEJPN.js → chunk-GTRYDFMT.js} +38 -10
- package/dist/chunk-GTRYDFMT.js.map +1 -0
- package/dist/{chunk-2FZYZ4HT.cjs → chunk-HDSYYQYM.cjs} +4 -4
- package/dist/{chunk-2FZYZ4HT.cjs.map → chunk-HDSYYQYM.cjs.map} +1 -1
- package/dist/{chunk-MM32RSX4.cjs → chunk-HOE2U27V.cjs} +185 -18
- package/dist/chunk-HOE2U27V.cjs.map +1 -0
- package/dist/{chunk-JCIQIR5V.js → chunk-IGUDEWIW.js} +4 -4
- package/dist/{chunk-JCIQIR5V.js.map → chunk-IGUDEWIW.js.map} +1 -1
- package/dist/{chunk-GGLISETW.cjs → chunk-IKHK4GTF.cjs} +4 -4
- package/dist/{chunk-GGLISETW.cjs.map → chunk-IKHK4GTF.cjs.map} +1 -1
- package/dist/{chunk-YVKBXNPK.js → chunk-JBNQ2L3K.js} +10 -6
- package/dist/chunk-JBNQ2L3K.js.map +1 -0
- package/dist/{chunk-GU6TPVXF.cjs → chunk-JK2IWOI7.cjs} +6 -6
- package/dist/{chunk-GU6TPVXF.cjs.map → chunk-JK2IWOI7.cjs.map} +1 -1
- package/dist/{chunk-TZKBW4GA.cjs → chunk-K76UNS22.cjs} +6 -6
- package/dist/{chunk-TZKBW4GA.cjs.map → chunk-K76UNS22.cjs.map} +1 -1
- package/dist/{chunk-DAAJ3B2T.js → chunk-KP72MDFB.js} +4 -4
- package/dist/{chunk-DAAJ3B2T.js.map → chunk-KP72MDFB.js.map} +1 -1
- package/dist/{chunk-MLCIINXT.js → chunk-LBUXS6FJ.js} +4 -4
- package/dist/{chunk-MLCIINXT.js.map → chunk-LBUXS6FJ.js.map} +1 -1
- package/dist/{chunk-GG3IK5TL.cjs → chunk-MQK2D6I6.cjs} +9 -9
- package/dist/{chunk-GG3IK5TL.cjs.map → chunk-MQK2D6I6.cjs.map} +1 -1
- package/dist/{chunk-67X7L7JX.js → chunk-MQSGJB2B.js} +173 -6
- package/dist/chunk-MQSGJB2B.js.map +1 -0
- package/dist/{chunk-2GBVJHWN.cjs → chunk-NH5JOZLG.cjs} +13 -13
- package/dist/{chunk-2GBVJHWN.cjs.map → chunk-NH5JOZLG.cjs.map} +1 -1
- package/dist/{chunk-NWU634SO.cjs → chunk-O2EAHOXM.cjs} +4 -4
- package/dist/{chunk-NWU634SO.cjs.map → chunk-O2EAHOXM.cjs.map} +1 -1
- package/dist/{chunk-JUYBJLPI.cjs → chunk-O7Y56J4R.cjs} +4 -4
- package/dist/{chunk-JUYBJLPI.cjs.map → chunk-O7Y56J4R.cjs.map} +1 -1
- package/dist/{chunk-BQSREBF2.cjs → chunk-OJ2NCQ2R.cjs} +14 -14
- package/dist/{chunk-BQSREBF2.cjs.map → chunk-OJ2NCQ2R.cjs.map} +1 -1
- package/dist/{chunk-GLRKXJCR.js → chunk-OX32ITWC.js} +3 -3
- package/dist/{chunk-GLRKXJCR.js.map → chunk-OX32ITWC.js.map} +1 -1
- package/dist/{chunk-L4APW65W.cjs → chunk-PJ4XEBMU.cjs} +4 -4
- package/dist/{chunk-L4APW65W.cjs.map → chunk-PJ4XEBMU.cjs.map} +1 -1
- package/dist/{chunk-OZKJYLN6.js → chunk-PSCSU63K.js} +3 -3
- package/dist/{chunk-OZKJYLN6.js.map → chunk-PSCSU63K.js.map} +1 -1
- package/dist/{chunk-EI4JU5JF.js → chunk-RKM4VGAN.js} +3 -3
- package/dist/{chunk-EI4JU5JF.js.map → chunk-RKM4VGAN.js.map} +1 -1
- package/dist/{chunk-ME7EVT6F.js → chunk-RYGVILUR.js} +3 -3
- package/dist/{chunk-ME7EVT6F.js.map → chunk-RYGVILUR.js.map} +1 -1
- package/dist/{chunk-EGPDT7SM.js → chunk-S7NJV335.js} +3 -3
- package/dist/{chunk-EGPDT7SM.js.map → chunk-S7NJV335.js.map} +1 -1
- package/dist/{chunk-AHT2HRHC.cjs → chunk-TNRANQVI.cjs} +16 -16
- package/dist/{chunk-AHT2HRHC.cjs.map → chunk-TNRANQVI.cjs.map} +1 -1
- package/dist/{chunk-TERHGQ73.cjs → chunk-U7XWWU5H.cjs} +5 -5
- package/dist/{chunk-TERHGQ73.cjs.map → chunk-U7XWWU5H.cjs.map} +1 -1
- package/dist/{chunk-G35LXI2A.js → chunk-UIFN2LYT.js} +3 -3
- package/dist/{chunk-G35LXI2A.js.map → chunk-UIFN2LYT.js.map} +1 -1
- package/dist/{chunk-IYDPGQJA.js → chunk-UQAWXY6R.js} +3 -3
- package/dist/{chunk-IYDPGQJA.js.map → chunk-UQAWXY6R.js.map} +1 -1
- package/dist/{chunk-YWCHUUY3.js → chunk-VOPRL4RF.js} +7 -7
- package/dist/{chunk-YWCHUUY3.js.map → chunk-VOPRL4RF.js.map} +1 -1
- package/dist/{chunk-KB2PLV5Q.js → chunk-VQGRMCVT.js} +4 -4
- package/dist/{chunk-KB2PLV5Q.js.map → chunk-VQGRMCVT.js.map} +1 -1
- package/dist/{chunk-AWJBJYLZ.cjs → chunk-X6THHGTZ.cjs} +37 -37
- package/dist/{chunk-AWJBJYLZ.cjs.map → chunk-X6THHGTZ.cjs.map} +1 -1
- package/dist/{chunk-Q6QLGCL7.cjs → chunk-XCCH5KHW.cjs} +9 -9
- package/dist/{chunk-Q6QLGCL7.cjs.map → chunk-XCCH5KHW.cjs.map} +1 -1
- package/dist/{chunk-KQXD6BFO.cjs → chunk-XM3D4KAF.cjs} +9 -9
- package/dist/{chunk-KQXD6BFO.cjs.map → chunk-XM3D4KAF.cjs.map} +1 -1
- package/dist/{chunk-PINIBEIU.cjs → chunk-XRXOGMMG.cjs} +39 -11
- package/dist/chunk-XRXOGMMG.cjs.map +1 -0
- package/dist/{chunk-XPWFIDZM.cjs → chunk-XU3X2AUL.cjs} +4 -4
- package/dist/{chunk-XPWFIDZM.cjs.map → chunk-XU3X2AUL.cjs.map} +1 -1
- package/dist/{chunk-3A4N5E6P.js → chunk-XZ65FX6T.js} +3 -3
- package/dist/{chunk-3A4N5E6P.js.map → chunk-XZ65FX6T.js.map} +1 -1
- package/dist/{chunk-CRR7AE5D.js → chunk-Z6I4XFPC.js} +3 -3
- package/dist/{chunk-CRR7AE5D.js.map → chunk-Z6I4XFPC.js.map} +1 -1
- package/dist/{chunk-LTCHD3K5.cjs → chunk-Z7ZOSENN.cjs} +5 -5
- package/dist/{chunk-LTCHD3K5.cjs.map → chunk-Z7ZOSENN.cjs.map} +1 -1
- package/dist/{chunk-NZUQL42A.cjs → chunk-ZDA6FEKA.cjs} +5 -5
- package/dist/{chunk-NZUQL42A.cjs.map → chunk-ZDA6FEKA.cjs.map} +1 -1
- package/dist/{chunk-UY2EZYIC.js → chunk-ZSBG6C3P.js} +3 -3
- package/dist/{chunk-UY2EZYIC.js.map → chunk-ZSBG6C3P.js.map} +1 -1
- package/dist/{chunk-KAQNYX7B.js → chunk-ZVRJVUFX.js} +3 -3
- package/dist/{chunk-KAQNYX7B.js.map → chunk-ZVRJVUFX.js.map} +1 -1
- package/dist/components/AudioPlayer/index.cjs +7 -7
- package/dist/components/AudioPlayer/index.js +2 -2
- package/dist/components/BoardView/index.cjs +5 -5
- package/dist/components/BoardView/index.js +2 -2
- package/dist/components/CollabStatus/index.cjs +5 -5
- package/dist/components/CollabStatus/index.js +2 -2
- package/dist/components/Dropdown/index.cjs +9 -9
- package/dist/components/Dropdown/index.d.cts +6 -1
- package/dist/components/Dropdown/index.d.ts +6 -1
- package/dist/components/Dropdown/index.js +2 -2
- package/dist/components/EmailEditor/index.cjs +16 -16
- package/dist/components/EmailEditor/index.js +7 -7
- package/dist/components/MediaEditor/index.cjs +10 -10
- package/dist/components/MediaEditor/index.js +5 -5
- package/dist/components/MediaFeed/index.cjs +6 -6
- package/dist/components/MediaFeed/index.js +5 -5
- package/dist/components/MediaPlayer/index.cjs +8 -8
- package/dist/components/MediaPlayer/index.js +4 -4
- package/dist/components/MegaMenu/index.cjs +5 -5
- package/dist/components/MegaMenu/index.js +2 -2
- package/dist/components/RecordHeader/index.cjs +5 -5
- package/dist/components/RecordHeader/index.js +3 -3
- package/dist/components/RecordLayout/index.cjs +5 -5
- package/dist/components/RecordLayout/index.js +3 -3
- package/dist/components/RichTextEditor/index.cjs +6 -6
- package/dist/components/RichTextEditor/index.js +3 -3
- package/dist/components/Slider/index.cjs +6 -6
- package/dist/components/Slider/index.js +2 -2
- package/dist/components/SliderCalculator/index.cjs +5 -5
- package/dist/components/SliderCalculator/index.js +3 -3
- package/dist/components/SuperChat/index.cjs +23 -23
- package/dist/components/SuperChat/index.js +8 -8
- package/dist/components/SuperChat/plugins/index.cjs +5 -5
- package/dist/components/SuperChat/plugins/index.js +4 -4
- package/dist/components/Tabs/index.cjs +8 -8
- package/dist/components/Tabs/index.js +2 -2
- package/dist/components/Textarea/index.cjs +8 -8
- package/dist/components/Textarea/index.js +5 -5
- package/dist/components/ThemeProvider/index.cjs +9 -9
- package/dist/components/ThemeProvider/index.js +3 -3
- package/dist/components/Tooltip/index.cjs +3 -3
- package/dist/components/Tooltip/index.js +2 -2
- package/dist/components/ViewSet/index.cjs +5 -5
- package/dist/components/ViewSet/index.js +4 -4
- package/dist/components/ViewSwitcher/index.cjs +4 -4
- package/dist/components/ViewSwitcher/index.js +2 -2
- package/dist/deck.cjs +3 -3
- package/dist/deck.js +1 -1
- package/dist/esheet.cjs +107 -107
- package/dist/esheet.js +10 -10
- package/dist/hooks/index.cjs +5 -5
- package/dist/hooks/index.js +1 -1
- package/dist/index.cjs +284 -284
- package/dist/index.d.cts +6 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.js +40 -40
- package/dist/kerebron.cjs +6 -6
- package/dist/kerebron.js +4 -4
- package/dist/{model-5PB6KNYH.cjs → model-2TISYEYF.cjs} +20 -20
- package/dist/{model-5PB6KNYH.cjs.map → model-2TISYEYF.cjs.map} +1 -1
- package/dist/{model-OGWTZEXR.js → model-BCS5BUK3.js} +6 -6
- package/dist/{model-OGWTZEXR.js.map → model-BCS5BUK3.js.map} +1 -1
- package/dist/org-chart.cjs +2 -2
- package/dist/org-chart.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-67X7L7JX.js.map +0 -1
- package/dist/chunk-MM32RSX4.cjs.map +0 -1
- package/dist/chunk-OYUIEJPN.js.map +0 -1
- package/dist/chunk-PINIBEIU.cjs.map +0 -1
- package/dist/chunk-YVKBXNPK.js.map +0 -1
- 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
|
|
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 =
|
|
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-
|
|
454
|
-
//# sourceMappingURL=chunk-
|
|
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
|
|
4
|
+
var chunkTNRANQVI_cjs = require('./chunk-TNRANQVI.cjs');
|
|
5
5
|
var chunkFSLI5IKP_cjs = require('./chunk-FSLI5IKP.cjs');
|
|
6
|
-
var
|
|
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
|
|
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 =
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
989
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkXRXOGMMG_cjs.DropdownSeparator, {}),
|
|
884
990
|
hasMacros && macros && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
885
991
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
886
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
1041
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkXRXOGMMG_cjs.DropdownSeparator, {})
|
|
936
1042
|
] }),
|
|
937
1043
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
938
|
-
|
|
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
|
-
|
|
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-
|
|
1039
|
-
//# sourceMappingURL=chunk-
|
|
1205
|
+
//# sourceMappingURL=chunk-HOE2U27V.cjs.map
|
|
1206
|
+
//# sourceMappingURL=chunk-HOE2U27V.cjs.map
|