@crewlethq/ui 0.6.3 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/README.md +109 -0
  2. package/dist/AddPill/index.js +1 -1
  3. package/dist/{AddPill-IJQYCY6C.css → AddPill-V4TQXJ53.css} +23 -22
  4. package/dist/AppShell/index.js +2 -2
  5. package/dist/{AppShell-XARELGIH.css → AppShell-CEVLW4QG.css} +3 -1
  6. package/dist/Button/index.js +1 -1
  7. package/dist/{Button-EXU36DEH.css → Button-UWKBTKYD.css} +18 -0
  8. package/dist/Canvas/Canvas.d.ts +16 -1
  9. package/dist/Canvas/index.d.ts +1 -1
  10. package/dist/Canvas/index.js +3 -3
  11. package/dist/{Canvas-Q6JETCWR.css → Canvas-YVXHMWLN.css} +13 -0
  12. package/dist/Card/index.js +1 -1
  13. package/dist/{Card-GLP7SUV6.css → Card-KJOYHDTJ.css} +5 -1
  14. package/dist/Charts/BarList.d.ts +23 -0
  15. package/dist/Charts/index.d.ts +1 -1
  16. package/dist/Charts/index.js +1 -1
  17. package/dist/{Charts-B3YEF7R4.css → Charts-THPA5BWV.css} +40 -0
  18. package/dist/Checkbox/index.js +1 -1
  19. package/dist/{Checkbox-BOXQ747I.css → Checkbox-UE7TEPAM.css} +9 -1
  20. package/dist/CodeBlock/index.js +4 -4
  21. package/dist/Combobox/index.js +3 -3
  22. package/dist/CommandPalette/index.js +6 -6
  23. package/dist/Copyable/index.js +3 -3
  24. package/dist/DataTable/index.js +6 -6
  25. package/dist/{DataTable-OLHPF7D4.css → DataTable-WZK3V62B.css} +11 -0
  26. package/dist/DataView/index.js +11 -11
  27. package/dist/DateTimePicker/index.js +4 -4
  28. package/dist/{DateTimePicker-22VNXRWC.css → DateTimePicker-4AZBTODT.css} +11 -6
  29. package/dist/ErrorBoundary/index.js +2 -2
  30. package/dist/FilterChip/index.js +1 -1
  31. package/dist/{FilterChip-GTGLLOXE.css → FilterChip-EZ4QMW4E.css} +4 -1
  32. package/dist/IconButton/index.js +1 -1
  33. package/dist/{IconButton-TVEUWK6L.css → IconButton-VYWP6SGW.css} +15 -0
  34. package/dist/ImageUpload/index.js +1 -1
  35. package/dist/{ImageUpload-YCHJMUGX.css → ImageUpload-L2GE4JUM.css} +5 -1
  36. package/dist/Input/index.js +2 -2
  37. package/dist/{Input-2PU5CPKK.css → Input-DRFNI26F.css} +40 -10
  38. package/dist/Kbd/index.js +1 -1
  39. package/dist/{Kbd-JPLDVJIP.css → Kbd-MCWJTRTT.css} +11 -0
  40. package/dist/ListInput/index.js +4 -4
  41. package/dist/Menu/index.js +3 -3
  42. package/dist/Modal/index.js +3 -3
  43. package/dist/NewItemsNotice/index.js +1 -1
  44. package/dist/{NewItemsNotice-T4DSSPVV.css → NewItemsNotice-Q5ED73BQ.css} +3 -1
  45. package/dist/OrgLabel/OrgLabel.d.ts +12 -3
  46. package/dist/OrgLabel/index.js +1 -1
  47. package/dist/{OrgLabel-CR233G34.css → OrgLabel-6WSKJQOT.css} +38 -0
  48. package/dist/OrgNode/OrgNode.d.ts +7 -4
  49. package/dist/OrgNode/index.js +2 -2
  50. package/dist/{OrgNode-BT7T2Q2X.css → OrgNode-TCHJH5FO.css} +89 -45
  51. package/dist/OrgTable/index.js +5 -5
  52. package/dist/{OrgTable-VWMFC3TB.css → OrgTable-JZSYTUIK.css} +28 -4
  53. package/dist/Popover/index.js +1 -1
  54. package/dist/{Popover-WJGCF3ZQ.css → Popover-QCINR7WG.css} +5 -2
  55. package/dist/PricingCard/index.js +2 -2
  56. package/dist/{PricingCard-7EFXRSD2.css → PricingCard-HTAHG4ST.css} +5 -1
  57. package/dist/SearchTrigger/index.js +1 -1
  58. package/dist/{SearchTrigger-Z5D4AAY7.css → SearchTrigger-KIZLWBEH.css} +4 -1
  59. package/dist/SegmentedControl/SegmentedControl.d.ts +19 -1
  60. package/dist/SegmentedControl/index.d.ts +1 -1
  61. package/dist/SegmentedControl/index.js +2 -2
  62. package/dist/SegmentedControl-76HODRBT.css +160 -0
  63. package/dist/Select/index.js +1 -1
  64. package/dist/{Select-E24U5LBC.css → Select-4ANVLHUY.css} +4 -4
  65. package/dist/Switch/index.js +1 -1
  66. package/dist/{Switch-U4OWK4CL.css → Switch-66RAQCRE.css} +8 -5
  67. package/dist/Tabs/index.js +1 -1
  68. package/dist/{Tabs-XCNPHA7B.css → Tabs-BWFQSWY3.css} +12 -0
  69. package/dist/Tag/index.js +1 -1
  70. package/dist/{Tag-4OXGO2DU.css → Tag-4BRQS6GN.css} +28 -1
  71. package/dist/TagGroup/index.js +1 -1
  72. package/dist/{TagGroup-APC2EFH4.css → TagGroup-BCQZD7ZD.css} +4 -1
  73. package/dist/TagsInput/index.js +3 -3
  74. package/dist/{TagsInput-W4P36PRJ.css → TagsInput-P2HS5QL4.css} +2 -2
  75. package/dist/ThemeSwitcher/index.js +3 -3
  76. package/dist/ThemeToggle/index.js +2 -2
  77. package/dist/TimeWindowPicker/index.js +6 -6
  78. package/dist/{TimeWindowPicker-7I7KWCMU.css → TimeWindowPicker-GBF4JDFI.css} +21 -8
  79. package/dist/Tree/layout.d.ts +3 -3
  80. package/dist/TreeCanvas/TreeCanvas.d.ts +7 -5
  81. package/dist/TreeCanvas/index.js +4 -4
  82. package/dist/{TreeCanvas-HVOV4SQN.css → TreeCanvas-L2XYONWL.css} +80 -74
  83. package/dist/TreeGrid/index.js +2 -2
  84. package/dist/{chunk-SVNXOK25.js → chunk-26SCUACK.js} +2 -2
  85. package/dist/{chunk-4UQ7SMPK.js → chunk-4FQT6ZAY.js} +1 -1
  86. package/dist/{chunk-IBYO2IJN.js → chunk-5I56UXBJ.js} +4 -4
  87. package/dist/{chunk-ZFATEERP.js → chunk-5YLON2PW.js} +1 -1
  88. package/dist/{chunk-EFYPAJT3.js → chunk-6DRDCT22.js} +1 -1
  89. package/dist/{chunk-PQNILU27.js → chunk-6HXH57BL.js} +3 -3
  90. package/dist/{chunk-BNCCEER3.js → chunk-6SIG5I72.js} +22 -11
  91. package/dist/{chunk-RJM4QCGG.js → chunk-6VL4LGWC.js} +36 -13
  92. package/dist/{chunk-OM5E3TTK.js → chunk-74WGARJE.js} +5 -2
  93. package/dist/{chunk-EV6IMYJ6.js → chunk-A722MUNR.js} +1 -1
  94. package/dist/{chunk-WOFOMTGB.js → chunk-B47YUQGM.js} +6 -2
  95. package/dist/{chunk-MV2E3QZM.js → chunk-BTHX2FS3.js} +2 -2
  96. package/dist/{chunk-2QLOH454.js → chunk-BXPLX7YU.js} +3 -3
  97. package/dist/{chunk-V34H2YCY.js → chunk-CEOXFO3E.js} +1 -1
  98. package/dist/{chunk-KKLITCMF.js → chunk-CHG7VT2M.js} +8 -8
  99. package/dist/{chunk-QY7UU5ZB.js → chunk-DRHXRGB6.js} +1 -1
  100. package/dist/{chunk-V2XMNLMS.js → chunk-E6UWRXNM.js} +1 -1
  101. package/dist/{chunk-NQ2HQ6P5.js → chunk-HVPC2GHY.js} +6 -6
  102. package/dist/{chunk-FFKYL7Z3.js → chunk-L7THQMFB.js} +4 -2
  103. package/dist/{chunk-PAWGBSHU.js → chunk-LOECRMHA.js} +1 -1
  104. package/dist/{chunk-LSJZUA5V.js → chunk-LSB3EHBW.js} +2 -2
  105. package/dist/{chunk-ERHSECG2.js → chunk-MORLKUGM.js} +1 -1
  106. package/dist/{chunk-UWQWTGQH.js → chunk-MPXI6FM6.js} +3 -3
  107. package/dist/{chunk-DHPUMOTX.js → chunk-N5KCGFWI.js} +8 -4
  108. package/dist/{chunk-ZAO4HHXI.js → chunk-OG6CL3EB.js} +1 -1
  109. package/dist/{chunk-C5WJUZVR.js → chunk-ORNOOMVY.js} +1 -1
  110. package/dist/{chunk-WUVZDFHS.js → chunk-OVLJEVQS.js} +2 -2
  111. package/dist/{chunk-AUS5FNQE.js → chunk-PDUZO35I.js} +1 -1
  112. package/dist/{chunk-YLYOWZ4V.js → chunk-PXU6HOZB.js} +1 -1
  113. package/dist/{chunk-AGQ3YLA5.js → chunk-QJZ3Y6WW.js} +6 -6
  114. package/dist/{chunk-S7KW47IQ.js → chunk-RHHGLTXJ.js} +1 -1
  115. package/dist/{chunk-SJQ546ID.js → chunk-SEFMO2EV.js} +1 -1
  116. package/dist/{chunk-KJ34ZBBI.js → chunk-SMBKXWML.js} +1 -1
  117. package/dist/{chunk-FIFNP6PL.js → chunk-SX2DFTQV.js} +1 -1
  118. package/dist/{chunk-L6XZOCP4.js → chunk-UCYIRDND.js} +2 -2
  119. package/dist/{chunk-D6EVJUGU.js → chunk-UYK72NOS.js} +1 -1
  120. package/dist/{chunk-TIWAHZZ6.js → chunk-VCOELPCT.js} +2 -2
  121. package/dist/{chunk-2HY7I3NT.js → chunk-VE6LD3KM.js} +5 -3
  122. package/dist/{chunk-CAIHUYXV.js → chunk-W4GQWFRX.js} +1 -1
  123. package/dist/{chunk-BWIPKSWA.js → chunk-XX2VQE55.js} +1 -1
  124. package/dist/{chunk-UA7O3KKJ.js → chunk-YCTMKKRA.js} +1 -1
  125. package/dist/{chunk-DSUY5F4E.js → chunk-ZGX2DP7F.js} +2 -2
  126. package/dist/generated/index.js +44 -44
  127. package/dist/index.js +44 -44
  128. package/dist/styles.css +662 -223
  129. package/package.json +3 -3
  130. package/dist/SegmentedControl-X3BI3XU4.css +0 -68
@@ -264,11 +264,38 @@
264
264
  box-shadow: inset 0 0 0 1px var(--crewlet-tag-ink);
265
265
  }
266
266
 
267
+ /*
268
+ * ONE RING, ON THE PILL'S OWN EDGE, never off it. A pill draws a border
269
+ * whenever it is neutral, pointed at or pressed, and a ring standing off that
270
+ * border is two edges with a gap between them, which reads as a second
271
+ * outline rather than as focus. So every control here rings over the pill's
272
+ * border, and the offset that puts it there is each control's own, because
273
+ * the three boxes meet that border in different places:
274
+ *
275
+ * - a whole actionable tag IS the pill, so -1px covers the border and one
276
+ * pixel outside it;
277
+ * - the press half of a split pill stops at the border's inside edge, so 0
278
+ * puts its ring on the same two pixels;
279
+ * - the remove reaches over the border at the top and the bottom (see its
280
+ * rule below), so -1px puts its ring there as well.
281
+ *
282
+ * ONE PIXEL INTO THE PILL AT MOST, not a field's two, because a pressed tag
283
+ * says so in an ink line just inside its border: a ring two pixels deep would
284
+ * cover the one change that pressing it makes.
285
+ */
267
286
  .crewlet-tag--actionable:focus-visible,
268
287
  .crewlet-tag__press:focus-visible,
269
288
  .crewlet-tag__remove:focus-visible {
270
289
  outline: 2px solid var(--color-focus);
271
- outline-offset: 2px;
290
+ }
291
+
292
+ .crewlet-tag--actionable:focus-visible,
293
+ .crewlet-tag__remove:focus-visible {
294
+ outline-offset: -1px;
295
+ }
296
+
297
+ .crewlet-tag__press:focus-visible {
298
+ outline-offset: 0;
272
299
  }
273
300
 
274
301
  /* ── the pill that holds two controls ──────────────────────────────────── */
@@ -1,4 +1,4 @@
1
- export { TagGroup } from '../chunk-V2XMNLMS.js';
1
+ export { TagGroup } from '../chunk-E6UWRXNM.js';
2
2
  import '../chunk-RSAQOKH3.js';
3
3
  import '../chunk-BZFWDIV6.js';
4
4
  import '../chunk-ODEQTPFM.js';
@@ -63,9 +63,12 @@
63
63
  color: var(--color-text-primary);
64
64
  }
65
65
 
66
+ /* One ring, over the dashed boundary rather than 2px off it, which is two
67
+ edges with a gap between them: the rule every field keeps (see Input.css).
68
+ The list above has no edge of its own, so its ring stays outset. */
66
69
  .crewlet-tag-group__more:focus-visible {
67
70
  outline: 2px solid var(--color-focus);
68
- outline-offset: 2px;
71
+ outline-offset: var(--size-focus-ring-inset-offset);
69
72
  }
70
73
 
71
74
  @media (prefers-reduced-motion: reduce) {
@@ -1,10 +1,10 @@
1
- export { TagsInput } from '../chunk-UWQWTGQH.js';
2
- import '../chunk-PAWGBSHU.js';
1
+ export { TagsInput } from '../chunk-MPXI6FM6.js';
2
+ import '../chunk-LOECRMHA.js';
3
3
  import '../chunk-WIATRXEJ.js';
4
4
  import '../chunk-6MU7HNB4.js';
5
5
  import '../chunk-RSAQOKH3.js';
6
6
  import '../chunk-7RPGY3JE.js';
7
7
  import '../chunk-R25RGPUB.js';
8
- import '../chunk-4UQ7SMPK.js';
8
+ import '../chunk-4FQT6ZAY.js';
9
9
  import '../chunk-BZFWDIV6.js';
10
10
  import '../chunk-ODEQTPFM.js';
@@ -72,8 +72,8 @@
72
72
  * the whole reason they sit above the field instead of inside it.
73
73
  */
74
74
  .crewlet-tags-input__box:focus-visible {
75
- outline: 2px solid var(--color-focus);
76
- outline-offset: var(--size-focus-ring-inset-offset);
75
+ outline: 1px solid var(--color-focus);
76
+ outline-offset: -1px;
77
77
  }
78
78
 
79
79
  .crewlet-tags-input.is-disabled {
@@ -1,7 +1,7 @@
1
- export { DensitySwitcher, ThemeSwitcher } from '../chunk-S7KW47IQ.js';
1
+ export { DensitySwitcher, ThemeSwitcher } from '../chunk-RHHGLTXJ.js';
2
2
  export { applyDensity, applyStoredPreferences, applyTheme, resolveTheme, useDensityPreference, useSystemTheme, useThemePreference } from '../chunk-K3OWD7BJ.js';
3
- import '../chunk-DHPUMOTX.js';
4
- import '../chunk-QY7UU5ZB.js';
3
+ import '../chunk-N5KCGFWI.js';
4
+ import '../chunk-DRHXRGB6.js';
5
5
  import '../chunk-BHHIIK3M.js';
6
6
  import '../chunk-BZFWDIV6.js';
7
7
  import '../chunk-ODEQTPFM.js';
@@ -1,5 +1,5 @@
1
- export { ThemeToggle } from '../chunk-C5WJUZVR.js';
1
+ export { ThemeToggle } from '../chunk-ORNOOMVY.js';
2
2
  import '../chunk-K3OWD7BJ.js';
3
- import '../chunk-4UQ7SMPK.js';
3
+ import '../chunk-4FQT6ZAY.js';
4
4
  import '../chunk-BZFWDIV6.js';
5
5
  import '../chunk-ODEQTPFM.js';
@@ -1,13 +1,13 @@
1
- export { DEFAULT_TIME_WINDOW_LABELS, TIME_WINDOW_SPANS, TimeWindowPicker, describeTimeWindow, isTimeWindowSet, parseTimeWindowDuration, resolveTimeWindow, timeWindowMatchesPreset } from '../chunk-NQ2HQ6P5.js';
2
- import '../chunk-SJQ546ID.js';
3
- import '../chunk-AUS5FNQE.js';
1
+ export { DEFAULT_TIME_WINDOW_LABELS, TIME_WINDOW_SPANS, TimeWindowPicker, describeTimeWindow, isTimeWindowSet, parseTimeWindowDuration, resolveTimeWindow, timeWindowMatchesPreset } from '../chunk-HVPC2GHY.js';
2
+ import '../chunk-SEFMO2EV.js';
3
+ import '../chunk-PDUZO35I.js';
4
4
  import '../chunk-GXQ3B46I.js';
5
5
  import '../chunk-6MU7HNB4.js';
6
- import '../chunk-DSUY5F4E.js';
6
+ import '../chunk-ZGX2DP7F.js';
7
7
  import '../chunk-PQADV6P6.js';
8
8
  import '../chunk-7RPGY3JE.js';
9
9
  import '../chunk-R25RGPUB.js';
10
- import '../chunk-4UQ7SMPK.js';
11
- import '../chunk-ZAO4HHXI.js';
10
+ import '../chunk-4FQT6ZAY.js';
11
+ import '../chunk-OG6CL3EB.js';
12
12
  import '../chunk-BZFWDIV6.js';
13
13
  import '../chunk-ODEQTPFM.js';
@@ -37,11 +37,17 @@
37
37
  border-color: var(--color-border-hover);
38
38
  }
39
39
 
40
+ /*
41
+ * ONE RING, OVER THE BOUNDARY, for focus and for open alike. It stood 2px off
42
+ * the box with the border recoloured to the focus colour as well, which is an
43
+ * accent hairline, a gap and an accent band: two rings from one state. On the
44
+ * inset offset the ring covers the border, and the border keeps its own colour
45
+ * under it, the rule every field keeps (see Input.css).
46
+ */
40
47
  .crewlet-time-window:focus-visible,
41
48
  .crewlet-time-window.is-open {
42
- outline: 2px solid var(--color-focus);
43
- outline-offset: 2px;
44
- border-color: var(--color-focus);
49
+ outline: 1px solid var(--color-focus);
50
+ outline-offset: -1px;
45
51
  }
46
52
 
47
53
  .crewlet-time-window.is-disabled,
@@ -301,11 +307,18 @@ svg.crewlet-time-window__tick {
301
307
  transition: border-color var(--motion-duration-fast) var(--motion-easing-default);
302
308
  }
303
309
 
304
- .crewlet-time-window__masked:focus-within {
305
- outline: 2px solid transparent;
306
- outline-offset: 2px;
307
- border-color: var(--color-focus);
308
- box-shadow: var(--shadow-focus);
310
+ /*
311
+ * THE BOX RINGS ONCE, AS A FIELD DOES. It drew the field register's old
312
+ * indicator: the border recoloured to the focus colour AND --shadow-focus,
313
+ * which is itself a ring (a background-coloured gap, then a band), so a
314
+ * focused box showed two accent edges with a gap between them, and the
315
+ * transparent outline under them was a third that forced-colors mode paints.
316
+ * What is left is the field's one outline on the inset offset, over the box's
317
+ * own boundary (see Input.css), keyed on the box's own input.
318
+ */
319
+ .crewlet-time-window__masked:has(.crewlet-time-window__masked-input:focus-visible) {
320
+ outline: 1px solid var(--color-focus);
321
+ outline-offset: -1px;
309
322
  }
310
323
 
311
324
  .crewlet-time-window__masked-input {
@@ -96,9 +96,9 @@ export interface LayoutGaps {
96
96
  *
97
97
  * IT IS PART OF THE LAYOUT rather than padding on whatever draws it, because
98
98
  * the canvas scrolls and CLIPS: a margin drawn as padding is outside the
99
- * scrollable content, so the outermost card's halo, its focus ring and the
100
- * control hanging under it are cut off at the frame at exactly the moment a
101
- * reader has panned to that card. Unset, none.
99
+ * scrollable content, so the control hanging under the outermost card is cut
100
+ * off at the frame at exactly the moment a reader has panned to that card.
101
+ * Unset, none.
102
102
  */
103
103
  margin?: number | undefined;
104
104
  }
@@ -76,7 +76,7 @@
76
76
  * of its suite.
77
77
  */
78
78
  import { type KeyboardEvent, type MouseEvent, type ReactNode, type Ref } from 'react';
79
- import { type CanvasLabels } from '../Canvas/index.js';
79
+ import { type CanvasGround, type CanvasLabels } from '../Canvas/index.js';
80
80
  import { type TreeConnectorShape, type TreeInput, type TreeItemAction, type LayoutRanks, type TreeModel, type TreeViewHandle } from '../Tree/index.js';
81
81
  /** A card of the layout: its id and the cards nested under it. */
82
82
  export interface TreeCardInput {
@@ -93,9 +93,9 @@ export interface TreeCardInput {
93
93
  * with no such choice derives from a stable identity.
94
94
  *
95
95
  * A NAMED SET RATHER THAN A COLOUR. A caller that could hand in any colour
96
- * would hand in a literal, and the fill, the border, the halo and the ink of a
97
- * tinted card are four measured steps of one hue rather than one value with
98
- * three alphas applied by whoever drew it last.
96
+ * would hand in a literal, and the fill, the border and the ink of a tinted
97
+ * card are measured steps of one hue rather than one value with alphas applied
98
+ * by whoever drew it last.
99
99
  */
100
100
  export type TreeCardTone = 'purple' | 'cyan' | 'green' | 'amber' | 'rose' | 'blue';
101
101
  /**
@@ -417,6 +417,8 @@ export interface TreeCanvasProps {
417
417
  * which says WHICH node the surface is about.
418
418
  */
419
419
  dimmed?: boolean | undefined;
420
+ /** What the field under the chart is drawn as: see [CanvasProps.ground]. */
421
+ ground?: CanvasGround | undefined;
420
422
  /**
421
423
  * A node being composed in the chart rather than in a surface over it: see
422
424
  * [TreeComposing]. Null, and the chart is the data and nothing else.
@@ -427,4 +429,4 @@ export interface TreeCanvasProps {
427
429
  ref?: Ref<TreeCanvasHandle> | undefined;
428
430
  className?: string | undefined;
429
431
  }
430
- export declare function TreeCanvas({ label, nodes, cards, cardOf, renderCard, renderUnder, cardTone, appearance, ranks, connector, groups, onNodeKey, onNodeKeyDown, hasNodeMenu, selectedId, onSelect, anchorNode, overlay, controlsPlacement, controlsExtra, controlsBelow, hint, dimmed, composing, labels, ref, className, }: TreeCanvasProps): import("react").JSX.Element;
432
+ export declare function TreeCanvas({ label, nodes, cards, cardOf, renderCard, renderUnder, cardTone, appearance, ranks, connector, groups, onNodeKey, onNodeKeyDown, hasNodeMenu, selectedId, onSelect, anchorNode, overlay, controlsPlacement, controlsExtra, controlsBelow, hint, dimmed, ground, composing, labels, ref, className, }: TreeCanvasProps): import("react").JSX.Element;
@@ -1,10 +1,10 @@
1
- export { TreeCanvas } from '../chunk-FFKYL7Z3.js';
1
+ export { TreeCanvas } from '../chunk-L7THQMFB.js';
2
2
  import '../chunk-S3BCVWTU.js';
3
- import '../chunk-2HY7I3NT.js';
3
+ import '../chunk-VE6LD3KM.js';
4
4
  import '../chunk-53DVJCVW.js';
5
5
  import '../chunk-7RPGY3JE.js';
6
6
  import '../chunk-R25RGPUB.js';
7
- import '../chunk-4UQ7SMPK.js';
8
- import '../chunk-ZAO4HHXI.js';
7
+ import '../chunk-4FQT6ZAY.js';
8
+ import '../chunk-OG6CL3EB.js';
9
9
  import '../chunk-BZFWDIV6.js';
10
10
  import '../chunk-ODEQTPFM.js';
@@ -103,32 +103,21 @@
103
103
  }
104
104
 
105
105
  /*
106
- * The halo: a hairline ring OUTSIDE the card's own boundary, at the lightest
107
- * of the hue's three alphas. It is what says a card is toned at all from the
108
- * far end of a chart, where the fill is a few pixels of tint; drawn as its own
109
- * ring rather than a second border so it never competes with the boundary that
110
- * says where the card ends. Pointer-transparent, because it is drawn over the
111
- * gap the next card's controls reach into.
112
- */
113
- .crewlet-tree-canvas__card[data-tone]::after {
114
- content: '';
115
- position: absolute;
116
- inset: -3px;
117
- border: 1px solid var(--crewlet-tree-canvas-card-halo);
118
- border-radius: var(--radius-lg);
119
- pointer-events: none;
120
- }
121
-
122
- /*
123
- * The six hues, each as the four steps a toned card draws: the fill it sits
124
- * on, the boundary around it, the halo outside that, and the ink its name is
125
- * written in. The ink is published as a variable rather than applied here
126
- * because WHICH text is the name is the caller's to say.
106
+ * ONE BOUNDARY, AND NO HALO. A toned card used to carry a second hairline ring
107
+ * 3px outside its boundary, at the lightest of the hue's alphas, so a toned
108
+ * card was framed twice: two parallel lines round one node read as a double
109
+ * border, which is the one thing no box in this package draws. The fill and
110
+ * the boundary in the hue already say the card is toned from across a chart.
111
+ *
112
+ * The six hues, each as the steps a toned card draws: the fill it sits on, the
113
+ * boundary around it, the ink its name is written in and the accent its mark
114
+ * takes. The ink and the accent are published as variables rather than applied
115
+ * here because WHICH text is the name and which drawing the mark is are the
116
+ * caller's to say.
127
117
  */
128
118
  .crewlet-tree-canvas__card[data-tone='purple'] {
129
119
  --crewlet-tree-canvas-card-fill: var(--color-node-purple-fill);
130
120
  --crewlet-tree-canvas-card-line: var(--color-node-purple-line);
131
- --crewlet-tree-canvas-card-halo: var(--color-node-purple-halo);
132
121
  --crewlet-tree-canvas-card-ink: var(--color-node-purple-ink);
133
122
  --crewlet-tree-canvas-card-accent: var(--color-node-purple);
134
123
  }
@@ -136,7 +125,6 @@
136
125
  .crewlet-tree-canvas__card[data-tone='cyan'] {
137
126
  --crewlet-tree-canvas-card-fill: var(--color-node-cyan-fill);
138
127
  --crewlet-tree-canvas-card-line: var(--color-node-cyan-line);
139
- --crewlet-tree-canvas-card-halo: var(--color-node-cyan-halo);
140
128
  --crewlet-tree-canvas-card-ink: var(--color-node-cyan-ink);
141
129
  --crewlet-tree-canvas-card-accent: var(--color-node-cyan);
142
130
  }
@@ -144,7 +132,6 @@
144
132
  .crewlet-tree-canvas__card[data-tone='green'] {
145
133
  --crewlet-tree-canvas-card-fill: var(--color-node-green-fill);
146
134
  --crewlet-tree-canvas-card-line: var(--color-node-green-line);
147
- --crewlet-tree-canvas-card-halo: var(--color-node-green-halo);
148
135
  --crewlet-tree-canvas-card-ink: var(--color-node-green-ink);
149
136
  --crewlet-tree-canvas-card-accent: var(--color-node-green);
150
137
  }
@@ -152,7 +139,6 @@
152
139
  .crewlet-tree-canvas__card[data-tone='amber'] {
153
140
  --crewlet-tree-canvas-card-fill: var(--color-node-amber-fill);
154
141
  --crewlet-tree-canvas-card-line: var(--color-node-amber-line);
155
- --crewlet-tree-canvas-card-halo: var(--color-node-amber-halo);
156
142
  --crewlet-tree-canvas-card-ink: var(--color-node-amber-ink);
157
143
  --crewlet-tree-canvas-card-accent: var(--color-node-amber);
158
144
  }
@@ -160,7 +146,6 @@
160
146
  .crewlet-tree-canvas__card[data-tone='rose'] {
161
147
  --crewlet-tree-canvas-card-fill: var(--color-node-rose-fill);
162
148
  --crewlet-tree-canvas-card-line: var(--color-node-rose-line);
163
- --crewlet-tree-canvas-card-halo: var(--color-node-rose-halo);
164
149
  --crewlet-tree-canvas-card-ink: var(--color-node-rose-ink);
165
150
  --crewlet-tree-canvas-card-accent: var(--color-node-rose);
166
151
  }
@@ -168,7 +153,6 @@
168
153
  .crewlet-tree-canvas__card[data-tone='blue'] {
169
154
  --crewlet-tree-canvas-card-fill: var(--color-node-blue-fill);
170
155
  --crewlet-tree-canvas-card-line: var(--color-node-blue-line);
171
- --crewlet-tree-canvas-card-halo: var(--color-node-blue-halo);
172
156
  --crewlet-tree-canvas-card-ink: var(--color-node-blue-ink);
173
157
  --crewlet-tree-canvas-card-accent: var(--color-node-blue);
174
158
  }
@@ -204,18 +188,43 @@
204
188
  * canvas clips, so an outset ring is cut away on the cards nearest the frame.
205
189
  * This component hands out the tab stop, so the indicator is its to draw; left
206
190
  * to the caller it was drawn on some charts and on others not at all.
191
+ *
192
+ * A CARD'S OWN NODE RINGS THE WHOLE CARD. Where the treeitem is the card's
193
+ * direct child, the card's edge IS the node's edge, and a ring drawn on the
194
+ * treeitem did two things wrong: it stopped short of anything the card holds
195
+ * under the node (a unit's lead), and it stood beside the card's boundary as a
196
+ * second line. So the ring is drawn on the card, over its boundary, and the
197
+ * treeitem draws none in any state, the way a field's control leaves its ring
198
+ * to the field. A row deeper inside a card (`*` between the two, because a row
199
+ * is always inside something the caller drew) has no boundary of its own, and
200
+ * keeps its ring.
207
201
  */
208
- .crewlet-tree-canvas__card [role='treeitem']:focus-visible {
202
+ .crewlet-tree-canvas__card * [role='treeitem']:focus-visible,
203
+ .crewlet-tree-canvas__card:has(> [role='treeitem']:focus-visible) {
209
204
  outline: 2px solid var(--color-focus);
210
205
  outline-offset: var(--size-focus-ring-inset-offset);
211
206
  }
212
207
 
208
+ .crewlet-tree-canvas__card > [role='treeitem'] {
209
+ outline: none;
210
+ }
211
+
213
212
  /* The selection is where the reader is, so it takes the accent. Inset, for the
214
213
  same reason the ring is. */
215
214
  .crewlet-tree-canvas__card [role='treeitem'][aria-selected='true'] {
216
215
  box-shadow: inset 0 0 0 1px var(--color-brand-accent);
217
216
  }
218
217
 
218
+ /* On a card's own node the selection IS the card's boundary, in the accent: an
219
+ inset ring beside the boundary drew two lines where one says it. */
220
+ .crewlet-tree-canvas__card:has(> [role='treeitem'][aria-selected='true']) {
221
+ border-color: var(--color-brand-accent);
222
+ }
223
+
224
+ .crewlet-tree-canvas__card > [role='treeitem'][aria-selected='true'] {
225
+ box-shadow: none;
226
+ }
227
+
219
228
  /*
220
229
  * THE POINTER'S CONTROLS, drawn over the end of the card and quiet until it is
221
230
  * reached.
@@ -360,8 +369,8 @@
360
369
  * The space around the whole chart, as a token, for the reason the gaps are
361
370
  * one. None by default: a chart of panels is read inside its own frame, and
362
371
  * the space around it is the page's. The `node` appearance takes the console
363
- * chart's own margin below, which is what keeps the outermost node's halo and
364
- * its focus ring off the canvas's clip.
372
+ * chart's own margin below, which is what keeps the control hanging under the
373
+ * outermost node off the canvas's clip.
365
374
  */
366
375
  .crewlet-tree-canvas__margin {
367
376
  width: var(--spacing-0);
@@ -635,8 +644,8 @@
635
644
  * drawn distance is the same number either way, and the room simply moved
636
645
  * from the card's box into the gap with the control that needs it.
637
646
  * - AROUND: `--spacing-8`, 40px against 36, and deliberately the step above
638
- * rather than below: the canvas CLIPS, and the outermost node's halo and
639
- * focus ring have to clear the frame.
647
+ * rather than below: the canvas CLIPS, and what hangs under the outermost
648
+ * node has to clear the frame.
640
649
  */
641
650
  .crewlet-tree-canvas--node .crewlet-tree-canvas__gap {
642
651
  width: var(--spacing-9);
@@ -980,6 +989,27 @@
980
989
  border-radius: 0;
981
990
  }
982
991
 
992
+ /*
993
+ * AND THEY ANSWER THE POINTER WITH THEIR INK, NOT A GROUND, as the console
994
+ * chart's do: the edit mark turns to the accent and the trash to the critical
995
+ * hue, and nothing is painted under either. A cell is a whole share of the
996
+ * node's corner, so a ground painted over it was a square standing past the
997
+ * card's rounded corner, the one place on a node with no room for a square.
998
+ */
999
+ .crewlet-tree-canvas--node
1000
+ .crewlet-tree-canvas__actions
1001
+ .crewlet-icon-btn:hover:not(:disabled):not([aria-disabled='true']) {
1002
+ background: none;
1003
+ border-color: transparent;
1004
+ color: var(--color-brand-accent-ink);
1005
+ }
1006
+
1007
+ .crewlet-tree-canvas--node
1008
+ .crewlet-tree-canvas__actions
1009
+ .crewlet-icon-btn--ghost-danger:hover:not(:disabled):not([aria-disabled='true']) {
1010
+ color: var(--color-feedback-danger-ink);
1011
+ }
1012
+
983
1013
  /*
984
1014
  * A CONTROL ON AN EDGE IS A DISC: a ground of its own, so the line it sits on,
985
1015
  * or the card it straddles, stops at its edge rather than running through it.
@@ -1081,38 +1111,29 @@
1081
1111
  background-image: linear-gradient(var(--color-surface-subtle), var(--color-surface-subtle));
1082
1112
  border: 1px dashed var(--color-brand-accent-soft-strong);
1083
1113
  box-shadow: var(--shadow-md);
1084
- animation: crewlet-tree-canvas-ghost-card var(--motion-duration-slow) var(--motion-easing-emphasized)
1085
- var(--motion-duration-base) both;
1086
- }
1087
-
1088
- /*
1089
- * THE RING THAT BREATHES, outside the boundary, exactly where a toned card's
1090
- * halo is: it is what says the card is waiting for the reader from the far
1091
- * end of a chart, where a dashed hairline is a few pixels. It is decoration
1092
- * over the gap the next card's controls reach into, so it takes no pointer.
1093
- */
1094
- .crewlet-tree-canvas__card--composing::after {
1095
- content: '';
1096
- position: absolute;
1097
- inset: -3px;
1098
- border: 1px solid var(--color-brand-accent-soft-strong);
1099
- border-radius: var(--radius-lg);
1100
- pointer-events: none;
1114
+ /*
1115
+ * THE BOUNDARY BREATHES, which is what says the card is waiting for the
1116
+ * reader from the far end of a chart, where a dashed hairline is a few
1117
+ * pixels. It used to be a second ring 3px outside the boundary that
1118
+ * breathed instead, two lines round one card where every box in this
1119
+ * package draws one, so the dashed boundary itself moves between the soft
1120
+ * accent and the full one.
1121
+ */
1101
1122
  animation:
1102
- crewlet-tree-canvas-ghost-glow var(--motion-duration-slow) var(--motion-easing-default)
1103
- var(--motion-duration-moderate) both,
1123
+ crewlet-tree-canvas-ghost-card var(--motion-duration-slow) var(--motion-easing-emphasized)
1124
+ var(--motion-duration-base) both,
1104
1125
  /* A BREATH RATHER THAN A TRANSITION, so it is a multiple of the scale's
1105
1126
  longest step (1.8s) rather than a number off it: the scale tops out at
1106
1127
  one UI transition, and a pulse held there would strobe. The console
1107
- chart's own is 2s. It starts where the fade in ends. */
1128
+ chart's own is 2s. It starts where the card's arrival ends. */
1108
1129
  crewlet-tree-canvas-ghost-pulse calc(var(--motion-duration-slow) * 6)
1109
- var(--motion-easing-in-out)
1110
- calc(var(--motion-duration-moderate) + var(--motion-duration-slow)) infinite;
1130
+ var(--motion-easing-in-out) calc(var(--motion-duration-base) + var(--motion-duration-slow))
1131
+ infinite;
1111
1132
  }
1112
1133
 
1113
1134
  /*
1114
1135
  * THE FORM ARRIVES LAST, and from slightly above and behind: the wire, then
1115
- * the card, then the glow, then what is inside it, which is the order a reader
1136
+ * the card, then what is inside it, which is the order a reader
1116
1137
  * follows from the node they pressed to the thing they have to fill in. The
1117
1138
  * caller's own element, whatever it drew, because the ghost's contents are
1118
1139
  * entirely the caller's.
@@ -1156,24 +1177,14 @@
1156
1177
  }
1157
1178
  }
1158
1179
 
1159
- @keyframes crewlet-tree-canvas-ghost-glow {
1160
- from {
1161
- opacity: 0;
1162
- }
1163
-
1164
- to {
1165
- opacity: 1;
1166
- }
1167
- }
1168
-
1169
1180
  @keyframes crewlet-tree-canvas-ghost-pulse {
1170
1181
  0%,
1171
1182
  100% {
1172
- opacity: 0.5;
1183
+ border-color: var(--color-brand-accent-soft-strong);
1173
1184
  }
1174
1185
 
1175
1186
  50% {
1176
- opacity: 1;
1187
+ border-color: var(--color-brand-accent);
1177
1188
  }
1178
1189
  }
1179
1190
 
@@ -1193,8 +1204,8 @@
1193
1204
  * A READER WHO ASKED FOR LESS gets the ghost DRAWN, in place, at once. Nothing
1194
1205
  * about the add is behind the motion: the chart still makes room, the branch
1195
1206
  * is still dashed, the view still moves onto it and focus still lands in the
1196
- * form. Only the arrival, the breath and the rise are dropped, and the ring
1197
- * stays at the bright end of the pulse rather than wherever it was stopped.
1207
+ * form. Only the arrival, the breath and the rise are dropped, and the
1208
+ * boundary rests at the soft step it breathes from.
1198
1209
  */
1199
1210
  @media (prefers-reduced-motion: reduce) {
1200
1211
  /* NOT `transform` on the card itself: its transform is where the layout
@@ -1214,9 +1225,4 @@
1214
1225
  transform: none;
1215
1226
  animation: none;
1216
1227
  }
1217
-
1218
- .crewlet-tree-canvas__card--composing::after {
1219
- opacity: 1;
1220
- animation: none;
1221
- }
1222
1228
  }
@@ -1,8 +1,8 @@
1
- export { TreeGrid } from '../chunk-FIFNP6PL.js';
1
+ export { TreeGrid } from '../chunk-SX2DFTQV.js';
2
2
  import '../chunk-S3BCVWTU.js';
3
3
  import '../chunk-53DVJCVW.js';
4
4
  import '../chunk-7RPGY3JE.js';
5
5
  import '../chunk-R25RGPUB.js';
6
- import '../chunk-4UQ7SMPK.js';
6
+ import '../chunk-4FQT6ZAY.js';
7
7
  import '../chunk-BZFWDIV6.js';
8
8
  import '../chunk-ODEQTPFM.js';
@@ -1,6 +1,6 @@
1
1
  import { useClipboard } from './chunk-5VNUYO76.js';
2
- import { IconButton } from './chunk-4UQ7SMPK.js';
3
- import { Button } from './chunk-ZAO4HHXI.js';
2
+ import { IconButton } from './chunk-4FQT6ZAY.js';
3
+ import { Button } from './chunk-OG6CL3EB.js';
4
4
  import { VisuallyHidden } from './chunk-BZFWDIV6.js';
5
5
  import { cx } from './chunk-ODEQTPFM.js';
6
6
  import './Copyable-5PNRFOLS.css';
@@ -1,6 +1,6 @@
1
1
  import { VisuallyHidden } from './chunk-BZFWDIV6.js';
2
2
  import { cx } from './chunk-ODEQTPFM.js';
3
- import './IconButton-TVEUWK6L.css';
3
+ import './IconButton-VYWP6SGW.css';
4
4
  import { forwardRef, useId, Children, isValidElement, cloneElement } from 'react';
5
5
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
6
6
 
@@ -1,9 +1,9 @@
1
- import { Popover } from './chunk-AUS5FNQE.js';
1
+ import { Popover } from './chunk-PDUZO35I.js';
2
2
  import { today, CalendarGrid, shiftMonth, compareDays } from './chunk-GXQ3B46I.js';
3
- import { IconButton } from './chunk-4UQ7SMPK.js';
4
- import { Button } from './chunk-ZAO4HHXI.js';
3
+ import { IconButton } from './chunk-4FQT6ZAY.js';
4
+ import { Button } from './chunk-OG6CL3EB.js';
5
5
  import { cx } from './chunk-ODEQTPFM.js';
6
- import './DateTimePicker-22VNXRWC.css';
6
+ import './DateTimePicker-4AZBTODT.css';
7
7
  import { useMemo, useState, useEffect } from 'react';
8
8
  import { CalendarGlyph, ChevronDownGlyph, ChevronsLeftGlyph, ChevronLeftGlyph, ChevronRightGlyph, ChevronsRightGlyph } from '@crewlethq/icons/glyphs';
9
9
  import { jsx, jsxs } from 'react/jsx-runtime';
@@ -1,6 +1,6 @@
1
1
  import { VisuallyHidden } from './chunk-BZFWDIV6.js';
2
2
  import { cx } from './chunk-ODEQTPFM.js';
3
- import './FilterChip-GTGLLOXE.css';
3
+ import './FilterChip-EZ4QMW4E.css';
4
4
  import { createContext, useContext, useRef, useId, useCallback, useLayoutEffect } from 'react';
5
5
  import { jsxs, jsx } from 'react/jsx-runtime';
6
6
 
@@ -1,5 +1,5 @@
1
1
  import { cx } from './chunk-ODEQTPFM.js';
2
- import './SearchTrigger-Z5D4AAY7.css';
2
+ import './SearchTrigger-KIZLWBEH.css';
3
3
  import { forwardRef } from 'react';
4
4
  import { SearchGlyph } from '@crewlethq/icons/glyphs';
5
5
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -1,8 +1,8 @@
1
- import { Kbd } from './chunk-KJ34ZBBI.js';
2
- import { FormField, Textarea, Input } from './chunk-DSUY5F4E.js';
1
+ import { Kbd } from './chunk-SMBKXWML.js';
2
+ import { FormField, Textarea, Input } from './chunk-ZGX2DP7F.js';
3
3
  import { announce } from './chunk-RSAQOKH3.js';
4
4
  import { isComposing } from './chunk-R25RGPUB.js';
5
- import { IconButton } from './chunk-4UQ7SMPK.js';
5
+ import { IconButton } from './chunk-4FQT6ZAY.js';
6
6
  import './ListInput-O7LJKOIG.css';
7
7
  import { useState, useRef, useLayoutEffect } from 'react';
8
8
  import { ArrowUpGlyph, ArrowDownGlyph, XGlyph, PlusGlyph } from '@crewlethq/icons/glyphs';