@arbidocs/blocks 0.4.16 → 0.4.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/index.cjs +369 -171
- package/dist/agents/index.js +4 -2
- package/dist/agents/tasks/DueDateMenu.d.ts +32 -0
- package/dist/agents/tasks/NewThreadDialog.d.ts +53 -0
- package/dist/agents/tasks/PersonPill.d.ts +22 -0
- package/dist/agents/tasks/PillSelect.d.ts +39 -0
- package/dist/agents/tasks/TaskActivityDialog.d.ts +14 -0
- package/dist/agents/tasks/TaskActivityTimeline.d.ts +54 -0
- package/dist/agents/tasks/TaskComposer.d.ts +6 -106
- package/dist/agents/tasks/TaskMoveDialog.d.ts +25 -0
- package/dist/agents/tasks/TaskOutputsCell.d.ts +23 -0
- package/dist/agents/tasks/TaskPlan.d.ts +4 -2
- package/dist/agents/tasks/TaskReviewActions.d.ts +44 -0
- package/dist/agents/tasks/TaskRowMenu.d.ts +28 -0
- package/dist/agents/tasks/TaskStatusPill.d.ts +24 -0
- package/dist/agents/tasks/TaskTable.d.ts +99 -0
- package/dist/agents/tasks/TaskThreadChip.d.ts +19 -0
- package/dist/agents/tasks/TaskTriggerChip.d.ts +24 -0
- package/dist/agents/tasks/TasksChrome.d.ts +17 -17
- package/dist/agents/tasks/WorkflowComposer.d.ts +10 -0
- package/dist/agents/tasks/WorkflowsTable.d.ts +72 -0
- package/dist/agents/tasks/gridWidth.d.ts +11 -0
- package/dist/agents/tasks/index.d.ts +23 -7
- package/dist/agents/tasks/taskColumns.d.ts +39 -63
- package/dist/agents/tasks/taskComposerTypes.d.ts +217 -0
- package/dist/agents/tasks/taskLabels.d.ts +27 -10
- package/dist/agents/tasks/taskRequest.d.ts +151 -25
- package/dist/agents/tasks/taskRows.d.ts +111 -0
- package/dist/agents/tasks/taskTableLabels.d.ts +64 -0
- package/dist/agents/tasks/workflowColumns.d.ts +23 -0
- package/dist/agents/tasks/workflowRows.d.ts +44 -0
- package/dist/agents/tasks/workflowTableLabels.d.ts +53 -0
- package/dist/agents/workflows/WorkflowConfigDialog.d.ts +5 -0
- package/dist/agents/workflows/index.d.ts +1 -0
- package/dist/agents/workflows/scopeRender.d.ts +10 -0
- package/dist/agents/workflows/types.d.ts +2 -0
- package/dist/chat/AssistantModeToggle.d.ts +25 -0
- package/dist/chat/MentionMenu.d.ts +52 -0
- package/dist/chat/index.cjs +119 -63
- package/dist/chat/index.d.ts +4 -0
- package/dist/chat/index.js +1 -1
- package/dist/chat/mentions.d.ts +64 -0
- package/dist/chat/useMentionAutocomplete.d.ts +33 -0
- package/dist/{chunk-IMA6I73C.js → chunk-ABSII3ND.js} +336 -4
- package/dist/chunk-ABSII3ND.js.map +1 -0
- package/dist/{chunk-22T6KHGB.cjs → chunk-C2V6HQKG.cjs} +348 -2
- package/dist/chunk-C2V6HQKG.cjs.map +1 -0
- package/dist/{chunk-CVFBSUXL.js → chunk-F3F56LOR.js} +4227 -851
- package/dist/chunk-F3F56LOR.js.map +1 -0
- package/dist/chunk-IC2VHFWR.js +158 -0
- package/dist/chunk-IC2VHFWR.js.map +1 -0
- package/dist/{chunk-D6XY3C4O.cjs → chunk-JGZTRLKL.cjs} +207 -139
- package/dist/chunk-JGZTRLKL.cjs.map +1 -0
- package/dist/{chunk-H7OD4CHN.js → chunk-NUPVHEJW.js} +208 -140
- package/dist/chunk-NUPVHEJW.js.map +1 -0
- package/dist/{chunk-67HGXV4I.cjs → chunk-TP7JJAXZ.cjs} +4280 -855
- package/dist/chunk-TP7JJAXZ.cjs.map +1 -0
- package/dist/chunk-ZPERNIMP.cjs +162 -0
- package/dist/chunk-ZPERNIMP.cjs.map +1 -0
- package/dist/connection/ai.d.ts +4 -1
- package/dist/facts/FactRowActions.d.ts +5 -1
- package/dist/facts/factColumns.d.ts +1 -1
- package/dist/facts/index.cjs +19 -10
- package/dist/facts/index.cjs.map +1 -1
- package/dist/facts/index.js +14 -5
- package/dist/facts/index.js.map +1 -1
- package/dist/files/GridView.d.ts +5 -0
- package/dist/files/index.cjs +18 -18
- package/dist/files/index.js +4 -5
- package/dist/files/index.js.map +1 -1
- package/dist/index.cjs +549 -297
- package/dist/index.js +8 -8
- package/dist/settings/ConversationSettingsParts.d.ts +5 -1
- package/dist/settings/index.cjs +8 -3
- package/dist/settings/index.cjs.map +1 -1
- package/dist/settings/index.js +8 -3
- package/dist/settings/index.js.map +1 -1
- package/dist/shell/index.cjs +1 -1
- package/dist/shell/index.js +1 -1
- package/dist/site/index.cjs +12 -12
- package/dist/site/index.js +2 -2
- package/dist/studio/index.cjs +1 -1
- package/dist/studio/index.js +1 -1
- package/dist/workspaces/index.cjs +1 -1
- package/dist/workspaces/index.cjs.map +1 -1
- package/dist/workspaces/index.js +1 -1
- package/dist/workspaces/index.js.map +1 -1
- package/package.json +3 -3
- package/dist/agents/tasks/LiveRunsBanner.d.ts +0 -26
- package/dist/agents/tasks/TaskRowActions.d.ts +0 -43
- package/dist/chunk-22T6KHGB.cjs.map +0 -1
- package/dist/chunk-67HGXV4I.cjs.map +0 -1
- package/dist/chunk-CVFBSUXL.js.map +0 -1
- package/dist/chunk-D6XY3C4O.cjs.map +0 -1
- package/dist/chunk-H7OD4CHN.js.map +0 -1
- package/dist/chunk-IMA6I73C.js.map +0 -1
- package/dist/chunk-NUNKSZKU.js +0 -203
- package/dist/chunk-NUNKSZKU.js.map +0 -1
- package/dist/chunk-V4ISCZJ7.cjs +0 -207
- package/dist/chunk-V4ISCZJ7.cjs.map +0 -1
package/dist/chunk-V4ISCZJ7.cjs
DELETED
|
@@ -1,207 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
'use strict';
|
|
3
|
-
|
|
4
|
-
var chunkPPCATBOY_cjs = require('./chunk-PPCATBOY.cjs');
|
|
5
|
-
var chunkMHVNT4J3_cjs = require('./chunk-MHVNT4J3.cjs');
|
|
6
|
-
var react = require('react');
|
|
7
|
-
var lucideReact = require('lucide-react');
|
|
8
|
-
var ui = require('@arbidocs/react/ui');
|
|
9
|
-
var jsxRuntime = require('react/jsx-runtime');
|
|
10
|
-
|
|
11
|
-
var NARROW_BELOW_PX = 480;
|
|
12
|
-
var DEFAULT_SELECTION_BAR_LABELS = {
|
|
13
|
-
selected: "selected",
|
|
14
|
-
clearSelection: "Clear selection",
|
|
15
|
-
review: "Review",
|
|
16
|
-
selectionActions: "Selection actions"
|
|
17
|
-
};
|
|
18
|
-
function SelectionBar(props) {
|
|
19
|
-
if (props.count === 0 && !props.status) return null;
|
|
20
|
-
return /* @__PURE__ */ jsxRuntime.jsx(SelectionBarInner, { ...props });
|
|
21
|
-
}
|
|
22
|
-
function SelectionBarInner({
|
|
23
|
-
count,
|
|
24
|
-
onClear,
|
|
25
|
-
onReview,
|
|
26
|
-
actions,
|
|
27
|
-
children,
|
|
28
|
-
status,
|
|
29
|
-
selectedLabel,
|
|
30
|
-
labels,
|
|
31
|
-
testIds,
|
|
32
|
-
className
|
|
33
|
-
}) {
|
|
34
|
-
const l = { ...DEFAULT_SELECTION_BAR_LABELS, ...labels };
|
|
35
|
-
const hasSelection = count > 0;
|
|
36
|
-
const rootRef = react.useRef(null);
|
|
37
|
-
const actionsRef = react.useRef(null);
|
|
38
|
-
const [isCompact, setIsCompact] = react.useState(false);
|
|
39
|
-
const [isNarrow, setIsNarrow] = react.useState(false);
|
|
40
|
-
const overflowRootWidthRef = react.useRef(Number.POSITIVE_INFINITY);
|
|
41
|
-
const measureRef = react.useRef(() => {
|
|
42
|
-
});
|
|
43
|
-
measureRef.current = () => {
|
|
44
|
-
const root = rootRef.current;
|
|
45
|
-
const el = actionsRef.current;
|
|
46
|
-
if (!root || !el) return;
|
|
47
|
-
const available = root.parentElement?.clientWidth ?? 0;
|
|
48
|
-
setIsNarrow(available > 0 && available < NARROW_BELOW_PX);
|
|
49
|
-
if (!isCompact) {
|
|
50
|
-
if (el.scrollWidth > el.clientWidth + 1) {
|
|
51
|
-
overflowRootWidthRef.current = root.clientWidth;
|
|
52
|
-
setIsCompact(true);
|
|
53
|
-
}
|
|
54
|
-
} else if (root.clientWidth > overflowRootWidthRef.current + 64) {
|
|
55
|
-
setIsCompact(false);
|
|
56
|
-
}
|
|
57
|
-
};
|
|
58
|
-
react.useLayoutEffect(() => {
|
|
59
|
-
measureRef.current();
|
|
60
|
-
const root = rootRef.current;
|
|
61
|
-
if (!root) return;
|
|
62
|
-
return chunkPPCATBOY_cjs.observeResize(root, () => measureRef.current());
|
|
63
|
-
}, []);
|
|
64
|
-
react.useLayoutEffect(() => {
|
|
65
|
-
measureRef.current();
|
|
66
|
-
const inner = actionsRef.current;
|
|
67
|
-
if (!inner || typeof ResizeObserver === "undefined") return;
|
|
68
|
-
const observer = new ResizeObserver(() => measureRef.current());
|
|
69
|
-
inner.querySelectorAll("button").forEach((button) => observer.observe(button));
|
|
70
|
-
return () => observer.disconnect();
|
|
71
|
-
});
|
|
72
|
-
react.useLayoutEffect(() => {
|
|
73
|
-
let isCancelled = false;
|
|
74
|
-
void document.fonts?.ready.then(() => {
|
|
75
|
-
if (!isCancelled) measureRef.current();
|
|
76
|
-
});
|
|
77
|
-
return () => {
|
|
78
|
-
isCancelled = true;
|
|
79
|
-
};
|
|
80
|
-
}, []);
|
|
81
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
82
|
-
"div",
|
|
83
|
-
{
|
|
84
|
-
"data-slot": "selection-bar",
|
|
85
|
-
className: ui.cn("pointer-events-none sticky bottom-0 z-30 h-0", className),
|
|
86
|
-
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-x-0 bottom-4 flex justify-center px-3", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
87
|
-
"div",
|
|
88
|
-
{
|
|
89
|
-
ref: rootRef,
|
|
90
|
-
role: "toolbar",
|
|
91
|
-
"aria-label": l.selectionActions,
|
|
92
|
-
"data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.toolbar, { testId: "bulk-actions-toolbar" }),
|
|
93
|
-
"data-narrow": isNarrow || void 0,
|
|
94
|
-
className: "pointer-events-auto flex min-h-12 max-w-full items-center rounded-lg border border-border bg-popover px-2 py-1.5 shadow-xl",
|
|
95
|
-
children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-1 items-center gap-2 px-1", children: [
|
|
96
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
97
|
-
"div",
|
|
98
|
-
{
|
|
99
|
-
"data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.count, { testId: "bulk-selected-count" }),
|
|
100
|
-
"aria-live": "polite",
|
|
101
|
-
className: ui.cn(
|
|
102
|
-
"flex shrink-0 items-center rounded-full bg-accent text-sm font-semibold tabular-nums text-accent-foreground",
|
|
103
|
-
isCompact ? "gap-1 px-2.5 py-1" : "gap-2 px-3 py-1"
|
|
104
|
-
),
|
|
105
|
-
children: [
|
|
106
|
-
/* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
107
|
-
count,
|
|
108
|
-
!isCompact && ` ${selectedLabel ?? l.selected}`
|
|
109
|
-
] }),
|
|
110
|
-
hasSelection && /* @__PURE__ */ jsxRuntime.jsx(
|
|
111
|
-
"button",
|
|
112
|
-
{
|
|
113
|
-
type: "button",
|
|
114
|
-
onClick: onClear,
|
|
115
|
-
"aria-label": l.clearSelection,
|
|
116
|
-
"data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.clear, { testId: "bulk-clear-selection-button" }),
|
|
117
|
-
className: "rounded-full p-0.5 transition-colors hover:bg-foreground/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:p-[15px]",
|
|
118
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "size-3.5" })
|
|
119
|
-
}
|
|
120
|
-
)
|
|
121
|
-
]
|
|
122
|
-
}
|
|
123
|
-
),
|
|
124
|
-
onReview && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
125
|
-
"button",
|
|
126
|
-
{
|
|
127
|
-
type: "button",
|
|
128
|
-
onClick: onReview,
|
|
129
|
-
"aria-label": isNarrow ? l.review : void 0,
|
|
130
|
-
"data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.review, { testId: "bulk-review-button" }),
|
|
131
|
-
className: "flex h-8 shrink-0 items-center gap-1.5 rounded-md bg-accent px-2.5 text-sm font-medium text-accent-foreground transition-colors hover:bg-accent/70 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:h-11",
|
|
132
|
-
children: [
|
|
133
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.BookOpen, { className: "size-3.5" }),
|
|
134
|
-
!isNarrow && l.review
|
|
135
|
-
]
|
|
136
|
-
}
|
|
137
|
-
),
|
|
138
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-6 w-px shrink-0 bg-border" }),
|
|
139
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
140
|
-
"div",
|
|
141
|
-
{
|
|
142
|
-
ref: actionsRef,
|
|
143
|
-
className: "flex min-w-0 flex-1 items-center gap-2 overflow-x-auto overscroll-x-contain [scrollbar-width:none]",
|
|
144
|
-
children: [
|
|
145
|
-
status && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex shrink-0 items-center gap-2", children: status }),
|
|
146
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
147
|
-
"div",
|
|
148
|
-
{
|
|
149
|
-
className: ui.cn(
|
|
150
|
-
"flex min-w-0 items-center gap-2",
|
|
151
|
-
!hasSelection && "pointer-events-none opacity-40"
|
|
152
|
-
),
|
|
153
|
-
children: [
|
|
154
|
-
actions?.map((a) => /* @__PURE__ */ jsxRuntime.jsx(SelectionBarAction, { ...a, isCompact }, a.id)),
|
|
155
|
-
typeof children === "function" ? children(isCompact, isNarrow) : children
|
|
156
|
-
]
|
|
157
|
-
}
|
|
158
|
-
)
|
|
159
|
-
]
|
|
160
|
-
}
|
|
161
|
-
)
|
|
162
|
-
] })
|
|
163
|
-
}
|
|
164
|
-
) })
|
|
165
|
-
}
|
|
166
|
-
);
|
|
167
|
-
}
|
|
168
|
-
function SelectionBarAction({
|
|
169
|
-
icon: Icon,
|
|
170
|
-
label,
|
|
171
|
-
onClick,
|
|
172
|
-
disabled = false,
|
|
173
|
-
variant = "ghost",
|
|
174
|
-
tooltip,
|
|
175
|
-
testId,
|
|
176
|
-
className,
|
|
177
|
-
isCompact = false
|
|
178
|
-
}) {
|
|
179
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(ui.Tooltip, { children: [
|
|
180
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
181
|
-
ui.Button,
|
|
182
|
-
{
|
|
183
|
-
variant,
|
|
184
|
-
size: "sm",
|
|
185
|
-
onClick,
|
|
186
|
-
disabled,
|
|
187
|
-
"aria-label": isCompact ? label : void 0,
|
|
188
|
-
"data-testid": testId,
|
|
189
|
-
className: ui.cn(
|
|
190
|
-
"h-8 shrink-0 gap-1.5 whitespace-nowrap px-2 disabled:opacity-50 pointer-coarse:h-11",
|
|
191
|
-
className
|
|
192
|
-
),
|
|
193
|
-
children: [
|
|
194
|
-
/* @__PURE__ */ jsxRuntime.jsx(Icon, { className: "size-4" }),
|
|
195
|
-
!isCompact && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", children: label })
|
|
196
|
-
]
|
|
197
|
-
}
|
|
198
|
-
) }),
|
|
199
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.TooltipContent, { children: /* @__PURE__ */ jsxRuntime.jsx("p", { children: tooltip ?? label }) })
|
|
200
|
-
] });
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
exports.DEFAULT_SELECTION_BAR_LABELS = DEFAULT_SELECTION_BAR_LABELS;
|
|
204
|
-
exports.SelectionBar = SelectionBar;
|
|
205
|
-
exports.SelectionBarAction = SelectionBarAction;
|
|
206
|
-
//# sourceMappingURL=chunk-V4ISCZJ7.cjs.map
|
|
207
|
-
//# sourceMappingURL=chunk-V4ISCZJ7.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/files/SelectionBar.tsx"],"names":["jsx","useRef","useState","useLayoutEffect","observeResize","cn","testIdOr","jsxs","X","BookOpen","Tooltip","TooltipTrigger","Button","TooltipContent"],"mappings":"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","file":"chunk-V4ISCZJ7.cjs","sourcesContent":["import { useLayoutEffect, useRef, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport type { LucideIcon } from 'lucide-react'\nimport { BookOpen, X } from 'lucide-react'\nimport { Button, Tooltip, TooltipContent, TooltipTrigger, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport { observeResize } from '../lib/observe-resize'\n\nexport interface SelectionBarActionItem {\n id: string\n icon: LucideIcon\n label: string\n onClick: () => void\n disabled?: boolean\n variant?: 'default' | 'outline' | 'destructive' | 'ghost' | 'secondary'\n /** Tooltip text; falls back to `label`. */\n tooltip?: string\n testId?: string\n className?: string\n}\n\n/** Container width below which the bar is \"narrow\" (phones): only the essentials stay inline. */\nconst NARROW_BELOW_PX = 480\n\n/** Every fixed string of the selection bar. Pass a partial `labels` to translate or reword. */\nexport interface SelectionBarLabels {\n selected: string\n clearSelection: string\n review: string\n selectionActions: string\n}\n\nexport const DEFAULT_SELECTION_BAR_LABELS: SelectionBarLabels = {\n selected: 'selected',\n clearSelection: 'Clear selection',\n review: 'Review',\n selectionActions: 'Selection actions',\n}\n\nexport interface SelectionBarTestIds {\n toolbar: string\n count: string\n clear: string\n review: string\n}\n\nexport interface SelectionBarProps {\n /** Number of selected rows. The bar renders only while this is > 0 (or `status` is set). */\n count: number\n onClear: () => void\n /** Primary-in-bar \"Review\" shortcut (tonal, not the view's filled primary). */\n onReview?: () => void\n /** Actions as data. Rendered icon-only automatically when the bar is narrow. */\n actions?: SelectionBarActionItem[]\n /**\n * Free-form actions; a function receives `isCompact` (icon-only) and `isNarrow` (a phone-width\n * container: fold secondary actions into an overflow menu). Rendered after `actions`.\n */\n children?: ReactNode | ((isCompact: boolean, isNarrow: boolean) => ReactNode)\n /** Always-legible content before the actions (e.g. a running budget); never dimmed. */\n status?: ReactNode\n /** Singular noun shown after the count; wins over `labels.selected`. */\n selectedLabel?: string\n labels?: Partial<SelectionBarLabels>\n /** Overrides for the control test ids (defaults keep the current ids). */\n testIds?: Partial<SelectionBarTestIds>\n className?: string\n}\n\n/**\n * SelectionBar: the floating bar that appears while rows are selected.\n *\n * Stays on ONE row: when the actions overflow it flips to compact mode (icon-only actions and a\n * count-only badge) instead of wrapping. Sticky zero-height anchor, so showing/hiding it never\n * reflows the content beneath. Every control is always visible (nothing hover-only) and 44px on\n * coarse pointers.\n */\nexport function SelectionBar(props: SelectionBarProps) {\n if (props.count === 0 && !props.status) return null\n return <SelectionBarInner {...props} />\n}\n\nfunction SelectionBarInner({\n count,\n onClear,\n onReview,\n actions,\n children,\n status,\n selectedLabel,\n labels,\n testIds,\n className,\n}: SelectionBarProps) {\n const l = { ...DEFAULT_SELECTION_BAR_LABELS, ...labels }\n const hasSelection = count > 0\n const rootRef = useRef<HTMLDivElement>(null)\n const actionsRef = useRef<HTMLDivElement>(null)\n const [isCompact, setIsCompact] = useState(false)\n const [isNarrow, setIsNarrow] = useState(false)\n // Root width at which the labelled actions last overflowed. Compared against the (stable) root\n // width, never the actions' own width, which changes when we collapse labels and would oscillate.\n const overflowRootWidthRef = useRef(Number.POSITIVE_INFINITY)\n\n const measureRef = useRef<() => void>(() => {})\n measureRef.current = () => {\n const root = rootRef.current\n const el = actionsRef.current\n if (!root || !el) return\n // The bar is content-sized, so judge narrowness by the space it is given (its anchor).\n const available = root.parentElement?.clientWidth ?? 0\n setIsNarrow(available > 0 && available < NARROW_BELOW_PX)\n if (!isCompact) {\n if (el.scrollWidth > el.clientWidth + 1) {\n overflowRootWidthRef.current = root.clientWidth\n setIsCompact(true)\n }\n } else if (root.clientWidth > overflowRootWidthRef.current + 64) {\n setIsCompact(false)\n }\n }\n\n useLayoutEffect(() => {\n measureRef.current()\n const root = rootRef.current\n if (!root) return\n return observeResize(root, () => measureRef.current())\n }, [])\n // The bar is capped by its anchor, so its own size does not change when the actions overflow, and\n // the actions' text widens once the web font loads. Re-measure after every render and whenever\n // an action changes size. The measurement only sets state on a change, so this cannot loop.\n useLayoutEffect(() => {\n measureRef.current()\n const inner = actionsRef.current\n if (!inner || typeof ResizeObserver === 'undefined') return\n const observer = new ResizeObserver(() => measureRef.current())\n inner.querySelectorAll('button').forEach((button) => observer.observe(button))\n return () => observer.disconnect()\n })\n useLayoutEffect(() => {\n let isCancelled = false\n void document.fonts?.ready.then(() => {\n if (!isCancelled) measureRef.current()\n })\n return () => {\n isCancelled = true\n }\n }, [])\n\n return (\n <div\n data-slot=\"selection-bar\"\n className={cn('pointer-events-none sticky bottom-0 z-30 h-0', className)}\n >\n <div className=\"absolute inset-x-0 bottom-4 flex justify-center px-3\">\n <div\n ref={rootRef}\n role=\"toolbar\"\n aria-label={l.selectionActions}\n data-testid={testIdOr(testIds?.toolbar, { testId: 'bulk-actions-toolbar' })}\n data-narrow={isNarrow || undefined}\n className=\"pointer-events-auto flex min-h-12 max-w-full items-center rounded-lg border border-border bg-popover px-2 py-1.5 shadow-xl\"\n >\n <div className=\"flex min-w-0 flex-1 items-center gap-2 px-1\">\n <div\n data-testid={testIdOr(testIds?.count, { testId: 'bulk-selected-count' })}\n aria-live=\"polite\"\n className={cn(\n 'flex shrink-0 items-center rounded-full bg-accent text-sm font-semibold tabular-nums text-accent-foreground',\n isCompact ? 'gap-1 px-2.5 py-1' : 'gap-2 px-3 py-1'\n )}\n >\n <span>\n {count}\n {!isCompact && ` ${selectedLabel ?? l.selected}`}\n </span>\n {hasSelection && (\n <button\n type=\"button\"\n onClick={onClear}\n aria-label={l.clearSelection}\n data-testid={testIdOr(testIds?.clear, { testId: 'bulk-clear-selection-button' })}\n className=\"rounded-full p-0.5 transition-colors hover:bg-foreground/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:p-[15px]\"\n >\n <X className=\"size-3.5\" />\n </button>\n )}\n </div>\n\n {onReview && (\n <button\n type=\"button\"\n onClick={onReview}\n aria-label={isNarrow ? l.review : undefined}\n data-testid={testIdOr(testIds?.review, { testId: 'bulk-review-button' })}\n className=\"flex h-8 shrink-0 items-center gap-1.5 rounded-md bg-accent px-2.5 text-sm font-medium text-accent-foreground transition-colors hover:bg-accent/70 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:h-11\"\n >\n <BookOpen className=\"size-3.5\" />\n {!isNarrow && l.review}\n </button>\n )}\n\n <div className=\"h-6 w-px shrink-0 bg-border\" />\n\n <div\n ref={actionsRef}\n className=\"flex min-w-0 flex-1 items-center gap-2 overflow-x-auto overscroll-x-contain [scrollbar-width:none]\"\n >\n {status && <div className=\"flex shrink-0 items-center gap-2\">{status}</div>}\n <div\n className={cn(\n 'flex min-w-0 items-center gap-2',\n !hasSelection && 'pointer-events-none opacity-40'\n )}\n >\n {actions?.map((a) => (\n <SelectionBarAction key={a.id} {...a} isCompact={isCompact} />\n ))}\n {typeof children === 'function' ? children(isCompact, isNarrow) : children}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n )\n}\n\nexport interface SelectionBarActionProps extends Omit<SelectionBarActionItem, 'id'> {\n /** Icon-only (the bar passes this when narrow). */\n isCompact?: boolean\n}\n\n/** One action button in the bar: icon + label, icon-only when compact, always with a tooltip. */\nexport function SelectionBarAction({\n icon: Icon,\n label,\n onClick,\n disabled = false,\n variant = 'ghost',\n tooltip,\n testId,\n className,\n isCompact = false,\n}: SelectionBarActionProps) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant={variant}\n size=\"sm\"\n onClick={onClick}\n disabled={disabled}\n aria-label={isCompact ? label : undefined}\n data-testid={testId}\n className={cn(\n 'h-8 shrink-0 gap-1.5 whitespace-nowrap px-2 disabled:opacity-50 pointer-coarse:h-11',\n className\n )}\n >\n <Icon className=\"size-4\" />\n {!isCompact && <span className=\"text-sm\">{label}</span>}\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>{tooltip ?? label}</p>\n </TooltipContent>\n </Tooltip>\n )\n}\n"]}
|