@crewlethq/ui 0.4.4 → 0.5.1
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/README.md +888 -24
- package/dist/Accordion/index.js +2 -2
- package/dist/AddPill/index.js +1 -1
- package/dist/{AddPill-DFWXYLIQ.css → AddPill-IJQYCY6C.css} +9 -0
- package/dist/AppShell/AppShell.d.ts +26 -5
- package/dist/AppShell/index.js +3 -3
- package/dist/{AppShell-NVE6LHNI.css → AppShell-XARELGIH.css} +178 -25
- package/dist/Avatar/Avatar.d.ts +85 -40
- package/dist/Avatar/AvatarStack.d.ts +76 -0
- package/dist/Avatar/index.d.ts +5 -2
- package/dist/Avatar/index.js +1 -1
- package/dist/Avatar-XID7Z74C.css +200 -0
- package/dist/AvatarStack-GEJBNV7E.css +72 -0
- package/dist/BrandLockup/index.js +1 -1
- package/dist/{BrandLockup-6ISDEHPJ.css → BrandLockup-JKGXFCZF.css} +25 -19
- package/dist/Button/Button.d.ts +7 -2
- package/dist/Button/index.js +1 -1
- package/dist/{Button-D4J6B4MA.css → Button-X4B2TJAQ.css} +50 -19
- package/dist/Callout/index.js +1 -1
- package/dist/Canvas/index.js +4 -4
- package/dist/Card/Card.d.ts +9 -5
- package/dist/Card/index.js +1 -1
- package/dist/{Card-RLR254LD.css → Card-GLP7SUV6.css} +25 -18
- package/dist/Charts/BarList.d.ts +18 -1
- package/dist/Charts/ChartTooltip.d.ts +68 -0
- package/dist/Charts/StackedBar.d.ts +25 -7
- package/dist/Charts/StackedColumns.d.ts +112 -0
- package/dist/Charts/TimeSeries.d.ts +33 -2
- package/dist/Charts/dataColor.d.ts +22 -14
- package/dist/Charts/index.d.ts +6 -0
- package/dist/Charts/index.js +1 -1
- package/dist/Charts/useChartHover.d.ts +56 -0
- package/dist/Charts-B3YEF7R4.css +742 -0
- package/dist/Checkbox/index.js +1 -1
- package/dist/{Checkbox-VGW26YLQ.css → Checkbox-BOXQ747I.css} +2 -2
- package/dist/CodeBlock/index.js +4 -4
- package/dist/Combobox/index.js +5 -5
- package/dist/CommandPalette/CommandPalette.d.ts +97 -6
- package/dist/CommandPalette/index.d.ts +1 -1
- package/dist/CommandPalette/index.js +9 -7
- package/dist/CommandPalette-C5AMKGN2.css +259 -0
- package/dist/Copyable/index.js +3 -3
- package/dist/DataTable/index.js +7 -7
- package/dist/{DataTable-37UWTRN6.css → DataTable-OLHPF7D4.css} +35 -38
- package/dist/DataView/index.js +16 -16
- package/dist/{DataView-256YF32J.css → DataView-N6JX464S.css} +5 -4
- package/dist/DateTimePicker/index.js +5 -5
- package/dist/DiffList/index.js +1 -1
- package/dist/Disclosure/index.js +2 -2
- package/dist/EntityChip/EntityChip.d.ts +9 -12
- package/dist/EntityChip/index.d.ts +1 -1
- package/dist/EntityChip/index.js +2 -2
- package/dist/ErrorBoundary/index.js +2 -2
- package/dist/{ErrorBoundary-ME36CQTA.css → ErrorBoundary-U2PA3LY2.css} +4 -4
- package/dist/IconButton/index.js +1 -1
- package/dist/{IconButton-VQGNMJDI.css → IconButton-TVEUWK6L.css} +2 -2
- package/dist/ImageUpload/ImageUpload.d.ts +10 -7
- package/dist/ImageUpload/index.js +2 -2
- package/dist/{ImageUpload-HKFIZR6D.css → ImageUpload-YCHJMUGX.css} +24 -10
- package/dist/Input/index.js +2 -2
- package/dist/Kbd/Kbd.d.ts +14 -4
- package/dist/Kbd/index.js +1 -1
- package/dist/Kbd-JPLDVJIP.css +71 -0
- package/dist/Layer/index.js +1 -1
- package/dist/Link/index.js +1 -1
- package/dist/List/index.js +1 -1
- package/dist/{List-XTHESXLR.css → List-MYJIV6MP.css} +12 -2
- package/dist/ListInput/index.js +6 -6
- package/dist/Listbox/index.js +2 -2
- package/dist/Listbox/useListbox.d.ts +2 -0
- package/dist/{Listbox-ZXYYNN6U.css → Listbox-6WJNJQVQ.css} +32 -7
- package/dist/Menu/index.js +4 -4
- package/dist/Meter/Meter.d.ts +103 -16
- package/dist/Meter/index.d.ts +2 -2
- package/dist/Meter/index.js +1 -1
- package/dist/{Meter-SKOOXQBC.css → Meter-5VCSFMZW.css} +46 -7
- package/dist/Modal/index.js +4 -4
- package/dist/{Modal-XYQJ4BL6.css → Modal-JAYBS2KS.css} +13 -4
- package/dist/OrgLabel/OrgLabel.d.ts +60 -24
- package/dist/OrgLabel/index.d.ts +1 -1
- package/dist/OrgLabel/index.js +2 -1
- package/dist/{OrgLabel-D7U6QJZD.css → OrgLabel-CR233G34.css} +9 -18
- package/dist/OrgNode/index.js +3 -2
- package/dist/OrgTable/OrgTable.d.ts +2 -2
- package/dist/OrgTable/index.js +8 -7
- package/dist/Popover/index.js +2 -2
- package/dist/PricingCard/index.js +3 -3
- package/dist/{PricingCard-JFI7RYXP.css → PricingCard-7EFXRSD2.css} +4 -5
- package/dist/SearchTrigger/SearchTrigger.d.ts +23 -4
- package/dist/SearchTrigger/index.d.ts +1 -1
- package/dist/SearchTrigger/index.js +1 -1
- package/dist/SearchTrigger-Z5D4AAY7.css +112 -0
- package/dist/SegmentedControl/index.js +2 -2
- package/dist/SegmentedMeter/SegmentedMeter.d.ts +107 -0
- package/dist/SegmentedMeter/index.d.ts +3 -0
- package/dist/SegmentedMeter/index.js +2 -0
- package/dist/SegmentedMeter-KQNML2TW.css +109 -0
- package/dist/Select/index.js +3 -3
- package/dist/Shortcut/index.js +2 -2
- package/dist/SidebarNav/SidebarNav.d.ts +85 -25
- package/dist/SidebarNav/index.d.ts +1 -1
- package/dist/SidebarNav/index.js +1 -1
- package/dist/SidebarNav-X5NLZNWA.css +424 -0
- package/dist/StatCard/StatCard.d.ts +59 -12
- package/dist/StatCard/index.d.ts +1 -1
- package/dist/StatCard/index.js +1 -1
- package/dist/StatCard-KPAFD4E2.css +204 -0
- package/dist/StatGroup/index.js +1 -1
- package/dist/{StatGroup-TGB6AEKM.css → StatGroup-HVG6O62W.css} +8 -9
- package/dist/StatusDot/StatusDot.d.ts +24 -6
- package/dist/StatusDot/index.js +1 -1
- package/dist/StatusDot-7OMCQCZF.css +186 -0
- package/dist/Stepper/Stepper.d.ts +78 -0
- package/dist/Stepper/index.d.ts +3 -0
- package/dist/Stepper/index.js +4 -0
- package/dist/Stepper-HW4JM3YH.css +176 -0
- package/dist/Tabs/index.js +1 -1
- package/dist/{Tabs-MJ2E3VPK.css → Tabs-XCNPHA7B.css} +46 -26
- package/dist/Tag/Tag.d.ts +29 -22
- package/dist/Tag/index.js +2 -2
- package/dist/{Tag-VNZEYLB6.css → Tag-GBE7LQJP.css} +82 -83
- package/dist/TagsInput/index.js +7 -7
- package/dist/ThemeSwitcher/ThemeSwitcher.d.ts +53 -21
- package/dist/ThemeSwitcher/index.d.ts +3 -3
- package/dist/ThemeSwitcher/index.js +4 -3
- package/dist/ThemeSwitcher/preferences.d.ts +19 -5
- package/dist/ThemeToggle/ThemeToggle.d.ts +40 -0
- package/dist/ThemeToggle/index.d.ts +2 -0
- package/dist/ThemeToggle/index.js +5 -0
- package/dist/TimeWindowPicker/index.js +8 -8
- package/dist/Toaster/index.js +2 -2
- package/dist/Toolbar/index.js +2 -2
- package/dist/{Toolbar-IP6LXN45.css → Toolbar-HUOSMNTH.css} +3 -1
- package/dist/Tooltip/index.js +2 -2
- package/dist/Tree/index.d.ts +2 -2
- package/dist/Tree/index.js +1 -1
- package/dist/Tree/layout.d.ts +103 -28
- package/dist/TreeCanvas/TreeCanvas.d.ts +60 -14
- package/dist/TreeCanvas/index.d.ts +1 -1
- package/dist/TreeCanvas/index.js +6 -6
- package/dist/TreeCanvas/motion.d.ts +3 -2
- package/dist/{TreeCanvas-WBNQPHC7.css → TreeCanvas-HVOV4SQN.css} +154 -30
- package/dist/TreeGrid/index.js +4 -4
- package/dist/{chunk-F6OE5FH3.js → chunk-2FPENTCF.js} +1 -1
- package/dist/chunk-4AK52VHB.js +88 -0
- package/dist/{chunk-7EM5T4ME.js → chunk-4IQD3HUQ.js} +2 -2
- package/dist/{chunk-YODNNSZL.js → chunk-4PZ6FJKW.js} +43 -13
- package/dist/{chunk-F27EPQ7D.js → chunk-4UQ7SMPK.js} +1 -1
- package/dist/chunk-5QWIJSQM.js +73 -0
- package/dist/{chunk-KIC7BZYJ.js → chunk-6MU7HNB4.js} +6 -5
- package/dist/{chunk-S2XHHEW4.js → chunk-74KMX7YH.js} +4 -4
- package/dist/{chunk-WNI2WSJF.js → chunk-7KBNFFM3.js} +1 -1
- package/dist/{chunk-EFSG7HNU.js → chunk-AUS5FNQE.js} +1 -1
- package/dist/{chunk-CMEE37QJ.js → chunk-BMYPGGPV.js} +4 -4
- package/dist/{chunk-H4FBTAYS.js → chunk-BNCCEER3.js} +8 -8
- package/dist/chunk-C5WJUZVR.js +56 -0
- package/dist/{chunk-5WS6L6FA.js → chunk-CAIHUYXV.js} +9 -9
- package/dist/{chunk-5KSRXHOW.js → chunk-CQY5NTRS.js} +1 -1
- package/dist/{chunk-MW356IVK.js → chunk-D6EVJUGU.js} +2 -2
- package/dist/{chunk-7PEFUMQJ.js → chunk-DHPUMOTX.js} +2 -2
- package/dist/{chunk-HZ5XZNPS.js → chunk-DS2C73RJ.js} +3 -3
- package/dist/{chunk-GKHAKGOF.js → chunk-DSUY5F4E.js} +3 -3
- package/dist/{chunk-Q4ZPPART.js → chunk-EFYPAJT3.js} +3 -3
- package/dist/{chunk-PATXSJGR.js → chunk-ERVO6OUF.js} +17 -17
- package/dist/{chunk-BZYDZBAN.js → chunk-ETYEBKR4.js} +3 -3
- package/dist/{chunk-CC67MUUO.js → chunk-FD5UEN6X.js} +30 -30
- package/dist/{chunk-5SDBMKUO.js → chunk-FIFNP6PL.js} +3 -3
- package/dist/{chunk-7HPRF5XN.js → chunk-FUF52K7E.js} +98 -16
- package/dist/{chunk-5KPQ6D7N.js → chunk-FZVJDJFN.js} +2 -2
- package/dist/chunk-IA232OTU.js +156 -0
- package/dist/{chunk-2EOKFKHX.js → chunk-IG27QX7Q.js} +7 -7
- package/dist/chunk-IKB6HFGK.js +55 -0
- package/dist/{chunk-T43A26SD.js → chunk-IPVQKAHO.js} +6 -6
- package/dist/{chunk-3EYF6HKB.js → chunk-IVFJD7WY.js} +28 -9
- package/dist/{chunk-XJWXPRSK.js → chunk-JGRNTBF2.js} +11 -11
- package/dist/chunk-K3OWD7BJ.js +121 -0
- package/dist/{chunk-6KCO2D5C.js → chunk-KD4H66L6.js} +7 -20
- package/dist/{chunk-SFZOKW2G.js → chunk-KJ34ZBBI.js} +8 -3
- package/dist/{chunk-AQTBF4EB.js → chunk-LFHCXZO5.js} +5 -5
- package/dist/{chunk-LWKJQTOM.js → chunk-MICH6QSJ.js} +1 -1
- package/dist/chunk-N3DPO6HG.js +226 -0
- package/dist/{chunk-S4GZWSKR.js → chunk-OM5E3TTK.js} +1 -1
- package/dist/{chunk-3QRYCPXQ.js → chunk-OPKIKM35.js} +6 -6
- package/dist/{chunk-5EKIWVOR.js → chunk-PGRPNDWM.js} +2 -2
- package/dist/{chunk-FSOW3ARP.js → chunk-PQNILU27.js} +9 -9
- package/dist/{chunk-QNCVHRZL.js → chunk-QVAFL2LE.js} +1 -1
- package/dist/{chunk-Q3B66TJM.js → chunk-QY7UU5ZB.js} +1 -1
- package/dist/{chunk-ITHXJHBB.js → chunk-R25RGPUB.js} +1 -0
- package/dist/{chunk-KLJCCMF3.js → chunk-R6735B37.js} +2 -2
- package/dist/{chunk-3ZP55QZE.js → chunk-R6FBDTP3.js} +4 -4
- package/dist/{chunk-7FZ53WDJ.js → chunk-RIAZM6L3.js} +1 -1
- package/dist/chunk-RJM4QCGG.js +550 -0
- package/dist/{chunk-NTRZGNEX.js → chunk-S3BCVWTU.js} +215 -46
- package/dist/chunk-S7KW47IQ.js +121 -0
- package/dist/{chunk-KNYYCWMK.js → chunk-SJQ546ID.js} +4 -4
- package/dist/{chunk-D35VTV2Z.js → chunk-SV7QAONL.js} +1 -1
- package/dist/{chunk-IAJLHVUA.js → chunk-TIWAHZZ6.js} +1 -1
- package/dist/{chunk-2PRH365R.js → chunk-UA7O3KKJ.js} +1 -1
- package/dist/{chunk-NPZY6YYL.js → chunk-UG5ZMAXW.js} +6 -6
- package/dist/{chunk-NDCATSW7.js → chunk-V34H2YCY.js} +1 -1
- package/dist/chunk-WIATRXEJ.js +22 -0
- package/dist/{chunk-5C5YMZQU.js → chunk-WOFOMTGB.js} +16 -10
- package/dist/{chunk-QYOFACSP.js → chunk-WSOFKOLP.js} +3 -3
- package/dist/{chunk-MNAXYY3R.js → chunk-WUVZDFHS.js} +31 -11
- package/dist/{chunk-DB2VDLVR.js → chunk-YIMOT5OO.js} +10 -10
- package/dist/{chunk-2ZQMA2WB.js → chunk-ZPSOF6VL.js} +2 -2
- package/dist/generated/index.d.ts +3 -0
- package/dist/generated/index.js +70 -66
- package/dist/index.js +70 -66
- package/dist/styles.css +2538 -741
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/tone.d.ts +7 -12
- package/package.json +4 -4
- package/scripts/check-css-literals.mjs +159 -23
- package/scripts/check-css-variables.mjs +5 -3
- package/scripts/css-source.mjs +97 -5
- package/dist/Avatar-P2KRQM2B.css +0 -156
- package/dist/Charts-D7G2BSXH.css +0 -277
- package/dist/CommandPalette-CSJDUCQA.css +0 -115
- package/dist/Kbd-W66MXQI5.css +0 -61
- package/dist/SearchTrigger-QXOYAUUY.css +0 -79
- package/dist/SidebarNav-QGSFKZYA.css +0 -319
- package/dist/StatCard-KYPKZUWX.css +0 -111
- package/dist/StatusDot-HA2L2FSX.css +0 -84
- package/dist/chunk-22O7LAW2.js +0 -41
- package/dist/chunk-AJNCATWZ.js +0 -144
- package/dist/chunk-F4PJZ4ED.js +0 -245
- package/dist/chunk-PNFASD6F.js +0 -98
- package/dist/chunk-PZSWF74H.js +0 -15
- package/dist/chunk-R66KLW7S.js +0 -143
- /package/dist/{chunk-ZCR6YGQ4.js → chunk-PKIN4IMB.js} +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { useTreeState, useMeasuredSizes, layoutForest, treeAncestors, useLayoutAnchor, treeExpandable, layoutConnectors, treeItemAction, treeStep, treePosInSet, treeSetSize, treeLevel } from './chunk-
|
|
2
|
-
import { CANVAS_COMPOSE_CONTEXT, CANVAS_FIT_MAX_ZOOM, Canvas } from './chunk-
|
|
3
|
-
import { focusables } from './chunk-
|
|
1
|
+
import { useTreeState, useMeasuredSizes, layoutForest, treeAncestors, useLayoutAnchor, treeExpandable, layoutConnectors, treeItemAction, treeStep, treePosInSet, treeSetSize, treeLevel, placeGroups } from './chunk-S3BCVWTU.js';
|
|
2
|
+
import { CANVAS_COMPOSE_CONTEXT, CANVAS_FIT_MAX_ZOOM, Canvas } from './chunk-BMYPGGPV.js';
|
|
3
|
+
import { focusables } from './chunk-R25RGPUB.js';
|
|
4
4
|
import { cx } from './chunk-ODEQTPFM.js';
|
|
5
|
-
import './TreeCanvas-
|
|
6
|
-
import { useState, useRef, useMemo, useLayoutEffect, useCallback, useImperativeHandle, useSyncExternalStore } from 'react';
|
|
7
|
-
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
5
|
+
import './TreeCanvas-HVOV4SQN.css';
|
|
6
|
+
import { useState, useRef, useMemo, useLayoutEffect, useCallback, useImperativeHandle, useId, useSyncExternalStore } from 'react';
|
|
7
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
8
8
|
|
|
9
9
|
var ENTRANCE_STEP_MS = 60;
|
|
10
10
|
var REFLOW_MS = 350;
|
|
@@ -90,7 +90,14 @@ function useReflow(layout, still) {
|
|
|
90
90
|
return { ...one, x: was.x + (one.x - was.x) * through, y: was.y + (one.y - was.y) * through };
|
|
91
91
|
});
|
|
92
92
|
record(nodes);
|
|
93
|
-
|
|
93
|
+
const byId = new Map(nodes.map((one) => [one.id, one]));
|
|
94
|
+
setDrawn({
|
|
95
|
+
nodes,
|
|
96
|
+
byId,
|
|
97
|
+
groups: placeGroups(byId, layout.groups ?? []),
|
|
98
|
+
...layout.ranks ? { ranks: layout.ranks } : {},
|
|
99
|
+
bounds: layout.bounds
|
|
100
|
+
});
|
|
94
101
|
frame.current = through < 1 ? requestAnimationFrame(tick) : null;
|
|
95
102
|
};
|
|
96
103
|
frame.current = requestAnimationFrame(tick);
|
|
@@ -100,6 +107,8 @@ function useReflow(layout, still) {
|
|
|
100
107
|
}
|
|
101
108
|
var GAP_PROBE = "crewlet:tree-canvas-gap";
|
|
102
109
|
var MARGIN_PROBE = "crewlet:tree-canvas-margin";
|
|
110
|
+
var GROUP_PAD_PROBE = "crewlet:tree-canvas-group-pad";
|
|
111
|
+
var groupHeadKey = (id) => `crewlet:tree-canvas-group:${id}`;
|
|
103
112
|
function TreeCanvas({
|
|
104
113
|
label,
|
|
105
114
|
nodes,
|
|
@@ -107,11 +116,11 @@ function TreeCanvas({
|
|
|
107
116
|
cardOf,
|
|
108
117
|
renderCard,
|
|
109
118
|
renderUnder,
|
|
110
|
-
cardOutline,
|
|
111
119
|
cardTone,
|
|
112
120
|
appearance = "card",
|
|
113
121
|
ranks,
|
|
114
|
-
connector = "
|
|
122
|
+
connector = "elbow",
|
|
123
|
+
groups,
|
|
115
124
|
onNodeKey,
|
|
116
125
|
onNodeKeyDown,
|
|
117
126
|
hasNodeMenu,
|
|
@@ -154,12 +163,27 @@ function TreeCanvas({
|
|
|
154
163
|
cardForest.forEach(walk);
|
|
155
164
|
return out;
|
|
156
165
|
}, [cardForest]);
|
|
166
|
+
const shownGroups = useMemo(() => {
|
|
167
|
+
if (!groups || groups.length === 0) return [];
|
|
168
|
+
const drawnCards = new Set(cardIds);
|
|
169
|
+
return groups.map((group) => ({ group, members: group.memberIds.filter((id) => drawnCards.has(id)) })).filter((one) => one.members.length > 0);
|
|
170
|
+
}, [groups, cardIds]);
|
|
157
171
|
const spacing = ranks ?? (appearance === "node" ? "shared" : "per-parent");
|
|
158
172
|
const previousLayout = useRef(null);
|
|
159
173
|
const layout = useMemo(() => {
|
|
160
|
-
|
|
174
|
+
const probes = [GAP_PROBE, MARGIN_PROBE];
|
|
175
|
+
if (shownGroups.length > 0) {
|
|
176
|
+
probes.push(GROUP_PAD_PROBE, ...shownGroups.map(({ group }) => groupHeadKey(group.id)));
|
|
177
|
+
}
|
|
178
|
+
if (!measured([...cardIds, ...probes])) return previousLayout.current;
|
|
161
179
|
const size = (id) => sizes.get(id);
|
|
162
180
|
const gap = size(GAP_PROBE);
|
|
181
|
+
const pad = shownGroups.length > 0 ? size(GROUP_PAD_PROBE) : null;
|
|
182
|
+
const boxes = shownGroups.map(({ group, members }) => ({
|
|
183
|
+
id: group.id,
|
|
184
|
+
members,
|
|
185
|
+
inset: { x: pad.width, top: size(groupHeadKey(group.id)).height, bottom: pad.height }
|
|
186
|
+
}));
|
|
163
187
|
const toLayout = (card2) => ({
|
|
164
188
|
id: card2.id,
|
|
165
189
|
width: size(card2.id).width,
|
|
@@ -170,9 +194,10 @@ function TreeCanvas({
|
|
|
170
194
|
gapX: gap.width,
|
|
171
195
|
gapY: gap.height,
|
|
172
196
|
ranks: spacing,
|
|
173
|
-
margin: size(MARGIN_PROBE).width
|
|
197
|
+
margin: size(MARGIN_PROBE).width,
|
|
198
|
+
groups: boxes
|
|
174
199
|
});
|
|
175
|
-
}, [cardForest, cardIds, measured, sizes, spacing]);
|
|
200
|
+
}, [cardForest, cardIds, measured, sizes, spacing, shownGroups]);
|
|
176
201
|
previousLayout.current = layout;
|
|
177
202
|
const still = useStillness();
|
|
178
203
|
const drawn = useReflow(layout, still) ?? layout;
|
|
@@ -362,6 +387,16 @@ function TreeCanvas({
|
|
|
362
387
|
items.current.get(id)?.focus({ preventScroll: true });
|
|
363
388
|
}
|
|
364
389
|
});
|
|
390
|
+
const uid = useId();
|
|
391
|
+
const headIds = useMemo(
|
|
392
|
+
() => new Map(shownGroups.map(({ group }, i) => [group.id, `${uid}-group-${i}`])),
|
|
393
|
+
[shownGroups, uid]
|
|
394
|
+
);
|
|
395
|
+
const describedBy = useMemo(() => {
|
|
396
|
+
const out = /* @__PURE__ */ new Map();
|
|
397
|
+
for (const { group, members } of shownGroups) for (const id of members) out.set(id, headIds.get(group.id));
|
|
398
|
+
return out;
|
|
399
|
+
}, [shownGroups, headIds]);
|
|
365
400
|
const card = {
|
|
366
401
|
item: (id) => ({
|
|
367
402
|
role: "treeitem",
|
|
@@ -371,6 +406,7 @@ function TreeCanvas({
|
|
|
371
406
|
"aria-posinset": treePosInSet(model, id),
|
|
372
407
|
"aria-expanded": treeExpandable(model, id) ? expanded.has(id) : void 0,
|
|
373
408
|
"aria-selected": id === selectedId,
|
|
409
|
+
"aria-describedby": describedBy.get(id),
|
|
374
410
|
"data-tree-id": id,
|
|
375
411
|
ref: refFor(id),
|
|
376
412
|
onClick: (event) => {
|
|
@@ -430,6 +466,21 @@ function TreeCanvas({
|
|
|
430
466
|
children: [
|
|
431
467
|
/* @__PURE__ */ jsx("div", { className: "crewlet-tree-canvas__gap", ref: measure(GAP_PROBE), "aria-hidden": "true" }),
|
|
432
468
|
/* @__PURE__ */ jsx("div", { className: "crewlet-tree-canvas__margin", ref: measure(MARGIN_PROBE), "aria-hidden": "true" }),
|
|
469
|
+
shownGroups.length > 0 && /* @__PURE__ */ jsx("div", { className: "crewlet-tree-canvas__group-pad", ref: measure(GROUP_PAD_PROBE), "aria-hidden": "true" }),
|
|
470
|
+
shownGroups.map(({ group, members }) => {
|
|
471
|
+
const placed = drawn?.groups?.find((one) => one.id === group.id);
|
|
472
|
+
return /* @__PURE__ */ jsx(
|
|
473
|
+
"div",
|
|
474
|
+
{
|
|
475
|
+
className: "crewlet-tree-canvas__group",
|
|
476
|
+
"aria-hidden": "true",
|
|
477
|
+
"data-group-id": group.id,
|
|
478
|
+
"data-enter": enterOf(members, arrived),
|
|
479
|
+
style: placedStyle(placed, true)
|
|
480
|
+
},
|
|
481
|
+
group.id
|
|
482
|
+
);
|
|
483
|
+
}),
|
|
433
484
|
drawn && /* @__PURE__ */ jsx(
|
|
434
485
|
"svg",
|
|
435
486
|
{
|
|
@@ -449,6 +500,28 @@ function TreeCanvas({
|
|
|
449
500
|
))
|
|
450
501
|
}
|
|
451
502
|
),
|
|
503
|
+
shownGroups.map(({ group, members }) => {
|
|
504
|
+
const placed = drawn?.groups?.find((one) => one.id === group.id);
|
|
505
|
+
return /* @__PURE__ */ jsxs(
|
|
506
|
+
"div",
|
|
507
|
+
{
|
|
508
|
+
id: headIds.get(group.id),
|
|
509
|
+
ref: measure(groupHeadKey(group.id)),
|
|
510
|
+
className: "crewlet-tree-canvas__group-head",
|
|
511
|
+
"aria-hidden": "true",
|
|
512
|
+
"data-enter": enterOf(members, arrived),
|
|
513
|
+
style: placedStyle(placed, false),
|
|
514
|
+
children: [
|
|
515
|
+
group.lead === void 0 || group.lead === null ? null : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
516
|
+
/* @__PURE__ */ jsx("span", { className: "crewlet-tree-canvas__group-lead", children: group.lead }),
|
|
517
|
+
" "
|
|
518
|
+
] }),
|
|
519
|
+
/* @__PURE__ */ jsx("span", { className: "crewlet-tree-canvas__group-label", children: group.label })
|
|
520
|
+
]
|
|
521
|
+
},
|
|
522
|
+
group.id
|
|
523
|
+
);
|
|
524
|
+
}),
|
|
452
525
|
/* @__PURE__ */ jsx("div", { role: "tree", "aria-label": label, className: "crewlet-tree-canvas__tree", onKeyDown, children: cardIds.filter((id) => id !== composeId).map((id) => {
|
|
453
526
|
const placed = drawn?.byId.get(id);
|
|
454
527
|
return /* @__PURE__ */ jsxs(
|
|
@@ -456,10 +529,7 @@ function TreeCanvas({
|
|
|
456
529
|
{
|
|
457
530
|
role: "none",
|
|
458
531
|
ref: measure(id),
|
|
459
|
-
className:
|
|
460
|
-
"crewlet-tree-canvas__card",
|
|
461
|
-
cardOutline?.(id) && "crewlet-tree-canvas__card--outline"
|
|
462
|
-
),
|
|
532
|
+
className: "crewlet-tree-canvas__card",
|
|
463
533
|
"data-tone": cardTone?.(id),
|
|
464
534
|
"data-enter": arrived === null ? void 0 : arrived.has(id) ? "shown" : "waiting",
|
|
465
535
|
style: placed ? { transform: `translate(${placed.x}px, ${placed.y}px)` } : { visibility: "hidden" },
|
|
@@ -514,6 +584,18 @@ function UnderSlot({
|
|
|
514
584
|
if (content === null || content === void 0 || content === false) return null;
|
|
515
585
|
return /* @__PURE__ */ jsx("div", { className: "crewlet-tree-canvas__under", "aria-hidden": "true", ...card.press(id), children: content });
|
|
516
586
|
}
|
|
587
|
+
function enterOf(members, arrived) {
|
|
588
|
+
if (arrived === null) return void 0;
|
|
589
|
+
return members.some((id) => arrived.has(id)) ? "shown" : "waiting";
|
|
590
|
+
}
|
|
591
|
+
function placedStyle(placed, box) {
|
|
592
|
+
if (!placed) return { visibility: "hidden" };
|
|
593
|
+
return {
|
|
594
|
+
transform: `translate(${placed.x}px, ${placed.y}px)`,
|
|
595
|
+
width: `${placed.width}px`,
|
|
596
|
+
...box ? { height: `${placed.height}px` } : {}
|
|
597
|
+
};
|
|
598
|
+
}
|
|
517
599
|
function offsetWithin(el, container) {
|
|
518
600
|
let top = 0;
|
|
519
601
|
for (let at = el; at && at !== container; at = at.offsetParent) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Count } from './chunk-BHHIIK3M.js';
|
|
2
2
|
import { headingTag } from './chunk-PQADV6P6.js';
|
|
3
3
|
import { cx } from './chunk-ODEQTPFM.js';
|
|
4
|
-
import {
|
|
4
|
+
import { ChevronDownGlyph } from '@crewlethq/icons/glyphs';
|
|
5
5
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
6
6
|
|
|
7
7
|
function DisclosureAnatomy({
|
|
@@ -31,7 +31,7 @@ function DisclosureAnatomy({
|
|
|
31
31
|
onClick: onToggle,
|
|
32
32
|
onKeyDown,
|
|
33
33
|
children: [
|
|
34
|
-
/* @__PURE__ */ jsx(
|
|
34
|
+
/* @__PURE__ */ jsx(ChevronDownGlyph, { className: "crewlet-disclosure__chevron", size: "sm" }),
|
|
35
35
|
/* @__PURE__ */ jsx("span", { className: cx("crewlet-disclosure__title", mono && "crewlet-disclosure__title--mono"), children: title }),
|
|
36
36
|
meta === void 0 ? null : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
37
37
|
" ",
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { cx } from './chunk-ODEQTPFM.js';
|
|
2
|
+
import './Avatar-XID7Z74C.css';
|
|
3
|
+
import './AvatarStack-GEJBNV7E.css';
|
|
4
|
+
import { useState, useEffect } from 'react';
|
|
5
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var AVATAR_SIZES = { xs: 20, sm: 26, md: 32, lg: 40 };
|
|
8
|
+
var AVATAR_CORNER_RATIO = 0.29;
|
|
9
|
+
var getInitials = (name) => {
|
|
10
|
+
if (!name) return "?";
|
|
11
|
+
const words = name.trim().split(/[\s\-_.]+/).filter(Boolean);
|
|
12
|
+
if (words.length === 0) return "?";
|
|
13
|
+
const first = (word2) => (Array.from(word2)[0] ?? "").toUpperCase();
|
|
14
|
+
if (words.length >= 2) return words.slice(0, 2).map(first).join("") || "?";
|
|
15
|
+
const word = words[0];
|
|
16
|
+
const humps = word.split(/(?<=\p{Ll})(?=\p{Lu})/u);
|
|
17
|
+
if (humps.length >= 2) return humps.slice(0, 2).map(first).join("");
|
|
18
|
+
return Array.from(word).slice(0, 2).map((character) => character.toUpperCase()).join("") || "?";
|
|
19
|
+
};
|
|
20
|
+
var TINT_COUNT = 10;
|
|
21
|
+
var avatarTint = (seed) => {
|
|
22
|
+
let hash = 0;
|
|
23
|
+
for (let i = 0; i < seed.length; i += 1) {
|
|
24
|
+
hash = hash * 31 + seed.charCodeAt(i) >>> 0;
|
|
25
|
+
}
|
|
26
|
+
return hash % TINT_COUNT;
|
|
27
|
+
};
|
|
28
|
+
function avatarPixels(size) {
|
|
29
|
+
return typeof size === "number" ? size : AVATAR_SIZES[size];
|
|
30
|
+
}
|
|
31
|
+
function avatarCorner(pixels) {
|
|
32
|
+
return pixels * AVATAR_CORNER_RATIO;
|
|
33
|
+
}
|
|
34
|
+
var Avatar = ({
|
|
35
|
+
src,
|
|
36
|
+
name,
|
|
37
|
+
size = "md",
|
|
38
|
+
kind = "agent",
|
|
39
|
+
tone = "neutral",
|
|
40
|
+
ring,
|
|
41
|
+
decorative = false,
|
|
42
|
+
colorSeed,
|
|
43
|
+
className,
|
|
44
|
+
style,
|
|
45
|
+
...rest
|
|
46
|
+
}) => {
|
|
47
|
+
const [imageFailed, setImageFailed] = useState(false);
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
setImageFailed(false);
|
|
50
|
+
}, [src]);
|
|
51
|
+
const step = typeof size === "number" ? null : size;
|
|
52
|
+
const pixels = avatarPixels(size);
|
|
53
|
+
const measured = step === null ? {
|
|
54
|
+
"--crewlet-avatar-size": `${pixels}px`,
|
|
55
|
+
fontSize: Math.max(9, Math.round(pixels * 0.36))
|
|
56
|
+
} : {};
|
|
57
|
+
const seeded = tone === "seeded" ? avatarTint(colorSeed ?? name ?? "") : null;
|
|
58
|
+
const classes = cx(
|
|
59
|
+
"crewlet-avatar",
|
|
60
|
+
`crewlet-avatar--${kind}`,
|
|
61
|
+
step === null ? null : `crewlet-avatar--${step}`,
|
|
62
|
+
ring === void 0 ? null : `crewlet-avatar--ring-${ring}`,
|
|
63
|
+
className
|
|
64
|
+
);
|
|
65
|
+
if (src && !imageFailed) {
|
|
66
|
+
return /* @__PURE__ */ jsx(
|
|
67
|
+
"img",
|
|
68
|
+
{
|
|
69
|
+
...rest,
|
|
70
|
+
className: cx(classes, "crewlet-avatar--image"),
|
|
71
|
+
style: { ...measured, ...style },
|
|
72
|
+
src,
|
|
73
|
+
alt: decorative ? "" : name ?? "",
|
|
74
|
+
"aria-hidden": decorative ? true : void 0,
|
|
75
|
+
onError: () => setImageFailed(true)
|
|
76
|
+
}
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
return /* @__PURE__ */ jsx(
|
|
80
|
+
"span",
|
|
81
|
+
{
|
|
82
|
+
...rest,
|
|
83
|
+
className: cx(
|
|
84
|
+
classes,
|
|
85
|
+
"crewlet-avatar--fallback",
|
|
86
|
+
`crewlet-avatar--${tone}`,
|
|
87
|
+
seeded === null ? null : `crewlet-avatar--tint-${seeded}`
|
|
88
|
+
),
|
|
89
|
+
style: { ...measured, ...style },
|
|
90
|
+
role: decorative ? void 0 : "img",
|
|
91
|
+
"aria-hidden": decorative ? true : void 0,
|
|
92
|
+
"aria-label": decorative ? void 0 : name ? `${name} avatar` : "Avatar",
|
|
93
|
+
children: getInitials(name)
|
|
94
|
+
}
|
|
95
|
+
);
|
|
96
|
+
};
|
|
97
|
+
function counted(count, one, many) {
|
|
98
|
+
return `${count} ${count === 1 ? one : many}`;
|
|
99
|
+
}
|
|
100
|
+
function avatarStackLabel(members) {
|
|
101
|
+
const humans = members.filter((member) => member.kind === "human").length;
|
|
102
|
+
const agents = members.length - humans;
|
|
103
|
+
const agentWords = counted(agents, "agent", "agents");
|
|
104
|
+
const humanWords = counted(humans, "person", "people");
|
|
105
|
+
const who = humans === 0 ? agentWords : agents === 0 ? humanWords : `${agentWords} and ${humanWords}`;
|
|
106
|
+
return `${who}: ${members.map((member) => member.name).join(", ")}`;
|
|
107
|
+
}
|
|
108
|
+
function AvatarStack({
|
|
109
|
+
members,
|
|
110
|
+
max = 4,
|
|
111
|
+
size = "sm",
|
|
112
|
+
label,
|
|
113
|
+
decorative = false,
|
|
114
|
+
className,
|
|
115
|
+
style,
|
|
116
|
+
...rest
|
|
117
|
+
}) {
|
|
118
|
+
if (!Number.isInteger(max) || max < 1) {
|
|
119
|
+
throw new RangeError(`AvatarStack max must be a whole number of at least 1; it was ${max}`);
|
|
120
|
+
}
|
|
121
|
+
if (members.length === 0) return null;
|
|
122
|
+
const shown = members.slice(0, max);
|
|
123
|
+
const overflow = members.length - shown.length;
|
|
124
|
+
return /* @__PURE__ */ jsxs(
|
|
125
|
+
"span",
|
|
126
|
+
{
|
|
127
|
+
...rest,
|
|
128
|
+
className: cx("crewlet-avatar-stack", className),
|
|
129
|
+
style: { "--crewlet-avatar-stack-size": `${AVATAR_SIZES[size]}px`, ...style },
|
|
130
|
+
role: decorative ? void 0 : "img",
|
|
131
|
+
"aria-label": decorative ? void 0 : label ?? avatarStackLabel(members),
|
|
132
|
+
"aria-hidden": decorative ? true : void 0,
|
|
133
|
+
children: [
|
|
134
|
+
shown.map((member) => /* @__PURE__ */ jsx(
|
|
135
|
+
Avatar,
|
|
136
|
+
{
|
|
137
|
+
className: "crewlet-avatar-stack__member",
|
|
138
|
+
name: member.name,
|
|
139
|
+
kind: member.kind,
|
|
140
|
+
src: member.src,
|
|
141
|
+
ring: member.ring,
|
|
142
|
+
size,
|
|
143
|
+
decorative: true
|
|
144
|
+
},
|
|
145
|
+
member.id ?? member.name
|
|
146
|
+
)),
|
|
147
|
+
overflow > 0 ? /* @__PURE__ */ jsxs("span", { className: "crewlet-avatar-stack__member crewlet-avatar-stack__more", "aria-hidden": "true", children: [
|
|
148
|
+
"+",
|
|
149
|
+
overflow
|
|
150
|
+
] }) : null
|
|
151
|
+
]
|
|
152
|
+
}
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export { AVATAR_CORNER_RATIO, AVATAR_SIZES, Avatar, AvatarStack, avatarCorner, avatarPixels, avatarStackLabel, avatarTint, getInitials };
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { HeadingLevelProvider } from './chunk-PQADV6P6.js';
|
|
2
2
|
import { useLayerContainer } from './chunk-7RPGY3JE.js';
|
|
3
|
-
import { focusables, useModalLayer, useBodyScrollLock } from './chunk-
|
|
4
|
-
import { IconButton } from './chunk-
|
|
5
|
-
import { Button } from './chunk-
|
|
3
|
+
import { focusables, useModalLayer, useBodyScrollLock } from './chunk-R25RGPUB.js';
|
|
4
|
+
import { IconButton } from './chunk-4UQ7SMPK.js';
|
|
5
|
+
import { Button } from './chunk-ETYEBKR4.js';
|
|
6
6
|
import { cx } from './chunk-ODEQTPFM.js';
|
|
7
|
-
import './Modal-
|
|
7
|
+
import './Modal-JAYBS2KS.css';
|
|
8
8
|
import { useId, useRef, useCallback } from 'react';
|
|
9
9
|
import { createPortal } from 'react-dom';
|
|
10
|
-
import {
|
|
10
|
+
import { XGlyph } from '@crewlethq/icons/glyphs';
|
|
11
11
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
12
12
|
|
|
13
13
|
function Modal({ open, ...rest }) {
|
|
@@ -120,7 +120,7 @@ function ModalFrame({
|
|
|
120
120
|
{
|
|
121
121
|
className: "crewlet-modal__close",
|
|
122
122
|
label: closeLabel,
|
|
123
|
-
icon: /* @__PURE__ */ jsx(
|
|
123
|
+
icon: /* @__PURE__ */ jsx(XGlyph, { size: "md" }),
|
|
124
124
|
onClick: onClose,
|
|
125
125
|
disabledReason: dismissable ? void 0 : closeDisabledReason
|
|
126
126
|
}
|
|
@@ -197,7 +197,7 @@ function ConfirmModal({
|
|
|
197
197
|
cancelLabel = "Cancel",
|
|
198
198
|
destructive = false,
|
|
199
199
|
confirmVariant,
|
|
200
|
-
cancelVariant = "
|
|
200
|
+
cancelVariant = "ghost",
|
|
201
201
|
confirmDisabled = false,
|
|
202
202
|
confirmDisabledReason = "Complete the confirmation above to continue.",
|
|
203
203
|
submitting = false,
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { VisuallyHidden } from './chunk-BZFWDIV6.js';
|
|
2
|
+
import { cx } from './chunk-ODEQTPFM.js';
|
|
3
|
+
import './StatCard-KPAFD4E2.css';
|
|
4
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var StatCard = ({
|
|
7
|
+
label,
|
|
8
|
+
value,
|
|
9
|
+
unit,
|
|
10
|
+
sub,
|
|
11
|
+
subTone = "neutral",
|
|
12
|
+
delta,
|
|
13
|
+
trend,
|
|
14
|
+
icon,
|
|
15
|
+
tone = "neutral",
|
|
16
|
+
loading = false,
|
|
17
|
+
loadingLabel = "Loading",
|
|
18
|
+
flush = false,
|
|
19
|
+
className,
|
|
20
|
+
...rest
|
|
21
|
+
}) => {
|
|
22
|
+
const change = loading ? void 0 : delta;
|
|
23
|
+
const said = sub !== void 0 && sub !== null && sub !== false && sub !== "";
|
|
24
|
+
return /* @__PURE__ */ jsxs(
|
|
25
|
+
"div",
|
|
26
|
+
{
|
|
27
|
+
...rest,
|
|
28
|
+
className: cx("crewlet-statcard", `crewlet-statcard--${tone}`, flush && "crewlet-statcard--flush", className),
|
|
29
|
+
"aria-busy": loading || void 0,
|
|
30
|
+
children: [
|
|
31
|
+
/* @__PURE__ */ jsxs("div", { className: "crewlet-statcard__label", children: [
|
|
32
|
+
icon ? /* @__PURE__ */ jsx("span", { className: "crewlet-statcard__icon", "aria-hidden": true, children: icon }) : null,
|
|
33
|
+
label
|
|
34
|
+
] }),
|
|
35
|
+
/* @__PURE__ */ jsxs("div", { className: "crewlet-statcard__reading", children: [
|
|
36
|
+
/* @__PURE__ */ jsx("div", { className: "crewlet-statcard__value", children: loading ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
37
|
+
/* @__PURE__ */ jsx("span", { className: "crewlet-statcard__placeholder", "aria-hidden": true }),
|
|
38
|
+
/* @__PURE__ */ jsx(VisuallyHidden, { children: loadingLabel })
|
|
39
|
+
] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
40
|
+
value,
|
|
41
|
+
unit ? /* @__PURE__ */ jsx("span", { className: "crewlet-statcard__unit", children: unit }) : null
|
|
42
|
+
] }) }),
|
|
43
|
+
trend && !loading ? /* @__PURE__ */ jsx("div", { className: "crewlet-statcard__trend", children: trend }) : null
|
|
44
|
+
] }),
|
|
45
|
+
/* @__PURE__ */ jsxs("div", { className: cx("crewlet-statcard__sub", subTone !== "neutral" && `crewlet-statcard__sub--${subTone}`), children: [
|
|
46
|
+
change ? /* @__PURE__ */ jsx("span", { className: cx("crewlet-statcard__delta", `crewlet-statcard__delta--${change.polarity}`), children: change.value }) : null,
|
|
47
|
+
change && said ? " " : null,
|
|
48
|
+
sub
|
|
49
|
+
] })
|
|
50
|
+
]
|
|
51
|
+
}
|
|
52
|
+
);
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
export { StatCard };
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { useLayerContainer, viewportBounds, LAYER_GAP, outsideBounds, placePopup, LAYER_REPOSITION_EVENT } from './chunk-7RPGY3JE.js';
|
|
2
|
-
import { usePopupLayer } from './chunk-
|
|
3
|
-
import { IconButton } from './chunk-
|
|
4
|
-
import { Button } from './chunk-
|
|
2
|
+
import { usePopupLayer } from './chunk-R25RGPUB.js';
|
|
3
|
+
import { IconButton } from './chunk-4UQ7SMPK.js';
|
|
4
|
+
import { Button } from './chunk-ETYEBKR4.js';
|
|
5
5
|
import { cx } from './chunk-ODEQTPFM.js';
|
|
6
6
|
import './Menu-BT5PMFJI.css';
|
|
7
7
|
import { useId, useState, useRef, useCallback, useLayoutEffect, useEffect } from 'react';
|
|
8
8
|
import { createPortal } from 'react-dom';
|
|
9
|
-
import {
|
|
9
|
+
import { EllipsisVerticalGlyph, CheckGlyph } from '@crewlethq/icons/glyphs';
|
|
10
10
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
11
11
|
|
|
12
12
|
var ITEM_SELECTOR = "[role='menuitem'],[role='menuitemradio']";
|
|
@@ -29,7 +29,7 @@ function Menu({
|
|
|
29
29
|
items,
|
|
30
30
|
icon,
|
|
31
31
|
trigger,
|
|
32
|
-
triggerVariant = "
|
|
32
|
+
triggerVariant = "ghost",
|
|
33
33
|
triggerTabIndex,
|
|
34
34
|
open: controlled,
|
|
35
35
|
onOpenChange,
|
|
@@ -258,7 +258,7 @@ function Menu({
|
|
|
258
258
|
onKeyDown: onTriggerKeyDown
|
|
259
259
|
};
|
|
260
260
|
return /* @__PURE__ */ jsxs("span", { className: "crewlet-menu-anchor", children: [
|
|
261
|
-
trigger === void 0 ? /* @__PURE__ */ jsx(IconButton, { ...shared, label, icon: icon ?? /* @__PURE__ */ jsx(
|
|
261
|
+
trigger === void 0 ? /* @__PURE__ */ jsx(IconButton, { ...shared, label, icon: icon ?? /* @__PURE__ */ jsx(EllipsisVerticalGlyph, {}), size: "sm" }) : /* @__PURE__ */ jsx(Button, { ...shared, variant: triggerVariant, size: "small", leadingIcon: icon, children: trigger }),
|
|
262
262
|
list && container ? createPortal(list, container) : null
|
|
263
263
|
] });
|
|
264
264
|
}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { VisuallyHidden } from './chunk-BZFWDIV6.js';
|
|
2
2
|
import { cx } from './chunk-ODEQTPFM.js';
|
|
3
|
-
import './SidebarNav-
|
|
3
|
+
import './SidebarNav-X5NLZNWA.css';
|
|
4
4
|
import { useId, useState } from 'react';
|
|
5
|
-
import {
|
|
5
|
+
import { ChevronDownGlyph } from '@crewlethq/icons/glyphs';
|
|
6
6
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
7
7
|
|
|
8
8
|
function SidebarNav({ label, className, children }) {
|
|
9
9
|
return /* @__PURE__ */ jsx("nav", { className: cx("crewlet-sidebar-nav", className), "aria-label": label, children });
|
|
10
10
|
}
|
|
11
|
-
function NavGroup({ label, className, children }) {
|
|
11
|
+
function NavGroup({ label, action, className, children }) {
|
|
12
12
|
const id = useId();
|
|
13
13
|
const named = label !== void 0 && label !== null && label !== false && label !== "";
|
|
14
14
|
return /* @__PURE__ */ jsxs(
|
|
@@ -18,17 +18,30 @@ function NavGroup({ label, className, children }) {
|
|
|
18
18
|
role: named ? "group" : void 0,
|
|
19
19
|
"aria-labelledby": named ? id : void 0,
|
|
20
20
|
children: [
|
|
21
|
-
named ? /* @__PURE__ */
|
|
21
|
+
named || action ? /* @__PURE__ */ jsxs("div", { className: "crewlet-nav-group__head", children: [
|
|
22
|
+
named ? /* @__PURE__ */ jsx("span", { className: "crewlet-nav-group__label", id, children: label }) : null,
|
|
23
|
+
action ? /* @__PURE__ */ jsx("button", { type: "button", className: "crewlet-nav-group__action", "aria-label": action.label, onClick: action.onClick, children: /* @__PURE__ */ jsx("span", { className: "crewlet-nav-group__action-icon", "aria-hidden": true, children: action.icon }) }) : null
|
|
24
|
+
] }) : null,
|
|
22
25
|
children
|
|
23
26
|
]
|
|
24
27
|
}
|
|
25
28
|
);
|
|
26
29
|
}
|
|
30
|
+
function Figure({ figure, className, mark }) {
|
|
31
|
+
return /* @__PURE__ */ jsx("span", { className, "aria-hidden": true, children: /* @__PURE__ */ jsxs("span", { className: "crewlet-nav-item__figure", children: [
|
|
32
|
+
mark ? /* @__PURE__ */ jsx("span", { className: "crewlet-nav-item__mark", children: mark }) : null,
|
|
33
|
+
figure.value
|
|
34
|
+
] }) });
|
|
35
|
+
}
|
|
36
|
+
function spoken(figures) {
|
|
37
|
+
return figures.filter((figure) => figure !== void 0).map((figure) => `, ${String(figure.value)} ${figure.label}`).join("");
|
|
38
|
+
}
|
|
27
39
|
function NavItem({
|
|
28
40
|
label,
|
|
29
41
|
icon,
|
|
42
|
+
lead,
|
|
43
|
+
count,
|
|
30
44
|
badge,
|
|
31
|
-
badgeTone = "neutral",
|
|
32
45
|
href,
|
|
33
46
|
current = false,
|
|
34
47
|
disabledReason,
|
|
@@ -53,8 +66,14 @@ function NavItem({
|
|
|
53
66
|
}
|
|
54
67
|
const inside = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
55
68
|
icon ? /* @__PURE__ */ jsx("span", { className: "crewlet-nav-item__icon", "aria-hidden": true, children: icon }) : null,
|
|
56
|
-
/* @__PURE__ */ jsx("span", { className: "crewlet-nav-
|
|
57
|
-
|
|
69
|
+
lead ? /* @__PURE__ */ jsx("span", { className: "crewlet-nav-item__lead", children: lead }) : null,
|
|
70
|
+
lead ? " " : null,
|
|
71
|
+
/* @__PURE__ */ jsxs("span", { className: "crewlet-nav-item__label", children: [
|
|
72
|
+
label,
|
|
73
|
+
count || badge ? /* @__PURE__ */ jsx(VisuallyHidden, { children: spoken([count, badge]) }) : null
|
|
74
|
+
] }),
|
|
75
|
+
count ? /* @__PURE__ */ jsx(Figure, { figure: count, mark: count.mark, className: "crewlet-nav-item__count" }) : null,
|
|
76
|
+
badge ? /* @__PURE__ */ jsx(Figure, { figure: badge, className: "crewlet-nav-item__badge" }) : null
|
|
58
77
|
] });
|
|
59
78
|
const rowClass = "crewlet-nav-item__row";
|
|
60
79
|
let row;
|
|
@@ -96,7 +115,7 @@ function NavItem({
|
|
|
96
115
|
},
|
|
97
116
|
children: [
|
|
98
117
|
inside,
|
|
99
|
-
nested ? /* @__PURE__ */ jsx("span", { className: cx("crewlet-nav-item__chevron", open && "crewlet-nav-item__chevron--open"), "aria-hidden": true, children: /* @__PURE__ */ jsx(
|
|
118
|
+
nested ? /* @__PURE__ */ jsx("span", { className: cx("crewlet-nav-item__chevron", open && "crewlet-nav-item__chevron--open"), "aria-hidden": true, children: /* @__PURE__ */ jsx(ChevronDownGlyph, { size: "sm" }) }) : null
|
|
100
119
|
]
|
|
101
120
|
}
|
|
102
121
|
);
|
|
@@ -120,7 +139,7 @@ function NavItem({
|
|
|
120
139
|
"aria-controls": `${id}-children`,
|
|
121
140
|
"aria-label": expandLabel ?? (typeof label === "string" ? `${label} sections` : "Sections"),
|
|
122
141
|
onClick: toggle,
|
|
123
|
-
children: /* @__PURE__ */ jsx("span", { className: cx("crewlet-nav-item__chevron", open && "crewlet-nav-item__chevron--open"), "aria-hidden": true, children: /* @__PURE__ */ jsx(
|
|
142
|
+
children: /* @__PURE__ */ jsx("span", { className: cx("crewlet-nav-item__chevron", open && "crewlet-nav-item__chevron--open"), "aria-hidden": true, children: /* @__PURE__ */ jsx(ChevronDownGlyph, { size: "sm" }) })
|
|
124
143
|
}
|
|
125
144
|
) : null
|
|
126
145
|
] }),
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { Select } from './chunk-
|
|
2
|
-
import { Popover } from './chunk-
|
|
1
|
+
import { Select } from './chunk-SJQ546ID.js';
|
|
2
|
+
import { Popover } from './chunk-AUS5FNQE.js';
|
|
3
3
|
import { today, shiftMonth, CalendarGrid, compareDays } from './chunk-GXQ3B46I.js';
|
|
4
|
-
import { Input } from './chunk-
|
|
5
|
-
import { isComposing } from './chunk-
|
|
6
|
-
import { IconButton } from './chunk-
|
|
7
|
-
import { Button } from './chunk-
|
|
4
|
+
import { Input } from './chunk-DSUY5F4E.js';
|
|
5
|
+
import { isComposing } from './chunk-R25RGPUB.js';
|
|
6
|
+
import { IconButton } from './chunk-4UQ7SMPK.js';
|
|
7
|
+
import { Button } from './chunk-ETYEBKR4.js';
|
|
8
8
|
import { cx } from './chunk-ODEQTPFM.js';
|
|
9
9
|
import './TimeWindowPicker-7I7KWCMU.css';
|
|
10
10
|
import { useMemo, useState, useRef, useId, useEffect } from 'react';
|
|
11
|
-
import {
|
|
11
|
+
import { ClockGlyph, ChevronDownGlyph, CheckGlyph, ChevronLeftGlyph, ChevronRightGlyph } from '@crewlethq/icons/glyphs';
|
|
12
12
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
13
13
|
|
|
14
14
|
// src/TimeWindowPicker/mask.ts
|
|
@@ -354,9 +354,9 @@ function TimeWindowPicker({
|
|
|
354
354
|
"aria-expanded": open,
|
|
355
355
|
"aria-label": labels.triggerName(ariaLabel, shown),
|
|
356
356
|
children: [
|
|
357
|
-
/* @__PURE__ */ jsx(
|
|
357
|
+
/* @__PURE__ */ jsx(ClockGlyph, { className: "crewlet-time-window__icon", size: "sm" }),
|
|
358
358
|
/* @__PURE__ */ jsx("span", { className: cx("crewlet-time-window__label", !isSet && "is-placeholder"), children: shown }),
|
|
359
|
-
/* @__PURE__ */ jsx(
|
|
359
|
+
/* @__PURE__ */ jsx(ChevronDownGlyph, { className: "crewlet-time-window__chevron", size: "sm" })
|
|
360
360
|
]
|
|
361
361
|
}
|
|
362
362
|
),
|
|
@@ -438,12 +438,12 @@ function Panel({
|
|
|
438
438
|
Button,
|
|
439
439
|
{
|
|
440
440
|
size: "small",
|
|
441
|
-
variant: "
|
|
441
|
+
variant: "ghost",
|
|
442
442
|
onClick: () => setDraft(normalise(defaultValue)),
|
|
443
443
|
children: labels.resetLabel
|
|
444
444
|
}
|
|
445
445
|
) : null,
|
|
446
|
-
/* @__PURE__ */ jsx(Button, { size: "small", variant: "
|
|
446
|
+
/* @__PURE__ */ jsx(Button, { size: "small", variant: "ghost", onClick: close, children: labels.cancelLabel }),
|
|
447
447
|
/* @__PURE__ */ jsx(
|
|
448
448
|
Button,
|
|
449
449
|
{
|