@crewlethq/ui 0.4.3 → 0.5.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 (237) hide show
  1. package/README.md +888 -24
  2. package/dist/Accordion/index.js +2 -2
  3. package/dist/AddPill/index.js +1 -1
  4. package/dist/{AddPill-DFWXYLIQ.css → AddPill-IJQYCY6C.css} +9 -0
  5. package/dist/AppShell/AppShell.d.ts +26 -5
  6. package/dist/AppShell/index.js +3 -3
  7. package/dist/{AppShell-NVE6LHNI.css → AppShell-XARELGIH.css} +178 -25
  8. package/dist/Avatar/Avatar.d.ts +85 -40
  9. package/dist/Avatar/AvatarStack.d.ts +76 -0
  10. package/dist/Avatar/index.d.ts +5 -2
  11. package/dist/Avatar/index.js +1 -1
  12. package/dist/Avatar-XID7Z74C.css +200 -0
  13. package/dist/AvatarStack-GEJBNV7E.css +72 -0
  14. package/dist/BrandLockup/index.js +1 -1
  15. package/dist/{BrandLockup-6ISDEHPJ.css → BrandLockup-JKGXFCZF.css} +25 -19
  16. package/dist/Button/Button.d.ts +7 -2
  17. package/dist/Button/index.js +1 -1
  18. package/dist/{Button-D4J6B4MA.css → Button-X4B2TJAQ.css} +50 -19
  19. package/dist/Callout/index.js +1 -1
  20. package/dist/Canvas/index.js +4 -4
  21. package/dist/Card/Card.d.ts +9 -5
  22. package/dist/Card/index.js +1 -1
  23. package/dist/{Card-RLR254LD.css → Card-GLP7SUV6.css} +25 -18
  24. package/dist/Charts/BarList.d.ts +18 -1
  25. package/dist/Charts/ChartTooltip.d.ts +68 -0
  26. package/dist/Charts/StackedBar.d.ts +25 -7
  27. package/dist/Charts/StackedColumns.d.ts +112 -0
  28. package/dist/Charts/TimeSeries.d.ts +33 -2
  29. package/dist/Charts/dataColor.d.ts +22 -14
  30. package/dist/Charts/index.d.ts +6 -0
  31. package/dist/Charts/index.js +1 -1
  32. package/dist/Charts/useChartHover.d.ts +56 -0
  33. package/dist/Charts-B3YEF7R4.css +742 -0
  34. package/dist/Checkbox/index.js +1 -1
  35. package/dist/{Checkbox-VGW26YLQ.css → Checkbox-BOXQ747I.css} +2 -2
  36. package/dist/CodeBlock/index.js +4 -4
  37. package/dist/Combobox/index.js +5 -5
  38. package/dist/CommandPalette/CommandPalette.d.ts +97 -6
  39. package/dist/CommandPalette/index.d.ts +1 -1
  40. package/dist/CommandPalette/index.js +9 -7
  41. package/dist/CommandPalette-C5AMKGN2.css +259 -0
  42. package/dist/Copyable/index.js +3 -3
  43. package/dist/DataTable/index.js +7 -7
  44. package/dist/{DataTable-ITNACQ2X.css → DataTable-OLHPF7D4.css} +44 -43
  45. package/dist/DataView/index.js +14 -14
  46. package/dist/{DataView-256YF32J.css → DataView-N6JX464S.css} +5 -4
  47. package/dist/DateTimePicker/index.js +5 -5
  48. package/dist/DiffList/index.js +1 -1
  49. package/dist/Disclosure/index.js +2 -2
  50. package/dist/EntityChip/EntityChip.d.ts +9 -12
  51. package/dist/EntityChip/index.d.ts +1 -1
  52. package/dist/EntityChip/index.js +2 -2
  53. package/dist/ErrorBoundary/index.js +2 -2
  54. package/dist/{ErrorBoundary-ME36CQTA.css → ErrorBoundary-U2PA3LY2.css} +4 -4
  55. package/dist/IconButton/index.js +1 -1
  56. package/dist/{IconButton-VQGNMJDI.css → IconButton-TVEUWK6L.css} +2 -2
  57. package/dist/ImageUpload/ImageUpload.d.ts +10 -7
  58. package/dist/ImageUpload/index.js +2 -2
  59. package/dist/{ImageUpload-HKFIZR6D.css → ImageUpload-YCHJMUGX.css} +24 -10
  60. package/dist/Input/index.js +2 -2
  61. package/dist/Kbd/Kbd.d.ts +14 -4
  62. package/dist/Kbd/index.js +1 -1
  63. package/dist/Kbd-JPLDVJIP.css +71 -0
  64. package/dist/Layer/index.js +1 -1
  65. package/dist/Link/index.js +1 -1
  66. package/dist/List/index.js +1 -1
  67. package/dist/{List-XTHESXLR.css → List-MYJIV6MP.css} +12 -2
  68. package/dist/ListInput/index.js +5 -5
  69. package/dist/Listbox/index.js +2 -2
  70. package/dist/Listbox/useListbox.d.ts +16 -0
  71. package/dist/Listbox/useOptionKeys.d.ts +12 -1
  72. package/dist/{Listbox-X2DOTSQA.css → Listbox-6WJNJQVQ.css} +60 -7
  73. package/dist/Menu/index.js +4 -4
  74. package/dist/{Menu-6DE7I66I.css → Menu-BT5PMFJI.css} +15 -0
  75. package/dist/Meter/Meter.d.ts +103 -16
  76. package/dist/Meter/index.d.ts +2 -2
  77. package/dist/Meter/index.js +1 -1
  78. package/dist/{Meter-SKOOXQBC.css → Meter-5VCSFMZW.css} +46 -7
  79. package/dist/Modal/index.js +4 -4
  80. package/dist/{Modal-XYQJ4BL6.css → Modal-JAYBS2KS.css} +13 -4
  81. package/dist/OrgLabel/OrgLabel.d.ts +60 -24
  82. package/dist/OrgLabel/index.d.ts +1 -1
  83. package/dist/OrgLabel/index.js +2 -1
  84. package/dist/{OrgLabel-D7U6QJZD.css → OrgLabel-CR233G34.css} +9 -18
  85. package/dist/OrgNode/index.js +3 -2
  86. package/dist/OrgTable/OrgTable.d.ts +2 -2
  87. package/dist/OrgTable/index.js +8 -7
  88. package/dist/Popover/index.js +2 -2
  89. package/dist/PricingCard/index.js +3 -3
  90. package/dist/{PricingCard-JFI7RYXP.css → PricingCard-7EFXRSD2.css} +4 -5
  91. package/dist/SearchTrigger/SearchTrigger.d.ts +23 -4
  92. package/dist/SearchTrigger/index.d.ts +1 -1
  93. package/dist/SearchTrigger/index.js +1 -1
  94. package/dist/SearchTrigger-Z5D4AAY7.css +112 -0
  95. package/dist/SegmentedControl/index.js +2 -2
  96. package/dist/SegmentedMeter/SegmentedMeter.d.ts +107 -0
  97. package/dist/SegmentedMeter/index.d.ts +3 -0
  98. package/dist/SegmentedMeter/index.js +2 -0
  99. package/dist/SegmentedMeter-KQNML2TW.css +109 -0
  100. package/dist/Select/index.js +3 -3
  101. package/dist/{Select-2X77FSWR.css → Select-E24U5LBC.css} +34 -0
  102. package/dist/Shortcut/index.js +2 -2
  103. package/dist/SidebarNav/SidebarNav.d.ts +85 -25
  104. package/dist/SidebarNav/index.d.ts +1 -1
  105. package/dist/SidebarNav/index.js +1 -1
  106. package/dist/SidebarNav-X5NLZNWA.css +424 -0
  107. package/dist/StatCard/StatCard.d.ts +59 -12
  108. package/dist/StatCard/index.d.ts +1 -1
  109. package/dist/StatCard/index.js +1 -1
  110. package/dist/StatCard-KPAFD4E2.css +204 -0
  111. package/dist/StatGroup/index.js +1 -1
  112. package/dist/{StatGroup-TGB6AEKM.css → StatGroup-HVG6O62W.css} +8 -9
  113. package/dist/StatusDot/StatusDot.d.ts +24 -6
  114. package/dist/StatusDot/index.js +1 -1
  115. package/dist/StatusDot-7OMCQCZF.css +186 -0
  116. package/dist/Stepper/Stepper.d.ts +78 -0
  117. package/dist/Stepper/index.d.ts +3 -0
  118. package/dist/Stepper/index.js +4 -0
  119. package/dist/Stepper-HW4JM3YH.css +176 -0
  120. package/dist/Table/index.js +1 -1
  121. package/dist/{Table-MDOLVUAW.css → Table-TGCS4C3F.css} +14 -4
  122. package/dist/Tabs/index.js +1 -1
  123. package/dist/{Tabs-VLICJFVB.css → Tabs-XCNPHA7B.css} +79 -27
  124. package/dist/Tag/Tag.d.ts +29 -22
  125. package/dist/Tag/index.js +2 -2
  126. package/dist/{Tag-VNZEYLB6.css → Tag-GBE7LQJP.css} +82 -83
  127. package/dist/TagsInput/index.js +6 -6
  128. package/dist/ThemeSwitcher/ThemeSwitcher.d.ts +53 -21
  129. package/dist/ThemeSwitcher/index.d.ts +3 -3
  130. package/dist/ThemeSwitcher/index.js +4 -3
  131. package/dist/ThemeSwitcher/preferences.d.ts +19 -5
  132. package/dist/ThemeToggle/ThemeToggle.d.ts +40 -0
  133. package/dist/ThemeToggle/index.d.ts +2 -0
  134. package/dist/ThemeToggle/index.js +5 -0
  135. package/dist/TimeWindowPicker/index.js +8 -8
  136. package/dist/Toaster/index.js +2 -2
  137. package/dist/Toolbar/index.js +2 -2
  138. package/dist/{Toolbar-IP6LXN45.css → Toolbar-HUOSMNTH.css} +3 -1
  139. package/dist/Tooltip/index.js +2 -2
  140. package/dist/Tree/index.d.ts +2 -2
  141. package/dist/Tree/index.js +1 -1
  142. package/dist/Tree/layout.d.ts +103 -28
  143. package/dist/TreeCanvas/TreeCanvas.d.ts +60 -14
  144. package/dist/TreeCanvas/index.d.ts +1 -1
  145. package/dist/TreeCanvas/index.js +6 -6
  146. package/dist/TreeCanvas/motion.d.ts +3 -2
  147. package/dist/{TreeCanvas-WBNQPHC7.css → TreeCanvas-HVOV4SQN.css} +154 -30
  148. package/dist/TreeGrid/index.js +4 -4
  149. package/dist/{chunk-F6OE5FH3.js → chunk-2FPENTCF.js} +1 -1
  150. package/dist/chunk-4AK52VHB.js +88 -0
  151. package/dist/{chunk-7EM5T4ME.js → chunk-4IQD3HUQ.js} +2 -2
  152. package/dist/{chunk-YODNNSZL.js → chunk-4PZ6FJKW.js} +43 -13
  153. package/dist/{chunk-F27EPQ7D.js → chunk-4UQ7SMPK.js} +1 -1
  154. package/dist/chunk-5QWIJSQM.js +73 -0
  155. package/dist/{chunk-GTOUGQQK.js → chunk-6MU7HNB4.js} +13 -10
  156. package/dist/{chunk-S2XHHEW4.js → chunk-74KMX7YH.js} +4 -4
  157. package/dist/{chunk-WNI2WSJF.js → chunk-7KBNFFM3.js} +1 -1
  158. package/dist/{chunk-DD5BBGBE.js → chunk-AUS5FNQE.js} +9 -5
  159. package/dist/{chunk-CMEE37QJ.js → chunk-BMYPGGPV.js} +4 -4
  160. package/dist/{chunk-H4FBTAYS.js → chunk-BNCCEER3.js} +8 -8
  161. package/dist/chunk-C5WJUZVR.js +56 -0
  162. package/dist/{chunk-5WS6L6FA.js → chunk-CAIHUYXV.js} +9 -9
  163. package/dist/{chunk-XV6WRMBC.js → chunk-CQY5NTRS.js} +4 -1
  164. package/dist/{chunk-UOGSZKLT.js → chunk-D6EVJUGU.js} +2 -2
  165. package/dist/{chunk-6ZFVFA56.js → chunk-DHPUMOTX.js} +2 -2
  166. package/dist/{chunk-HZ5XZNPS.js → chunk-DS2C73RJ.js} +3 -3
  167. package/dist/{chunk-O6232G37.js → chunk-DSUY5F4E.js} +17 -5
  168. package/dist/{chunk-Q4ZPPART.js → chunk-EFYPAJT3.js} +3 -3
  169. package/dist/{chunk-WQX73TWF.js → chunk-ERVO6OUF.js} +18 -17
  170. package/dist/{chunk-BZYDZBAN.js → chunk-ETYEBKR4.js} +3 -3
  171. package/dist/{chunk-34VGEDVV.js → chunk-FD5UEN6X.js} +30 -30
  172. package/dist/{chunk-5SDBMKUO.js → chunk-FIFNP6PL.js} +3 -3
  173. package/dist/{chunk-7HPRF5XN.js → chunk-FUF52K7E.js} +98 -16
  174. package/dist/{chunk-5KPQ6D7N.js → chunk-FZVJDJFN.js} +2 -2
  175. package/dist/chunk-IA232OTU.js +156 -0
  176. package/dist/{chunk-2EOKFKHX.js → chunk-IG27QX7Q.js} +7 -7
  177. package/dist/chunk-IKB6HFGK.js +55 -0
  178. package/dist/{chunk-FBZAKNSX.js → chunk-IPVQKAHO.js} +10 -7
  179. package/dist/{chunk-3EYF6HKB.js → chunk-IVFJD7WY.js} +28 -9
  180. package/dist/{chunk-WOYYD2YR.js → chunk-JGRNTBF2.js} +11 -11
  181. package/dist/chunk-K3OWD7BJ.js +121 -0
  182. package/dist/{chunk-BJSKPEZI.js → chunk-KD4H66L6.js} +7 -20
  183. package/dist/{chunk-SFZOKW2G.js → chunk-KJ34ZBBI.js} +8 -3
  184. package/dist/{chunk-HQNHV7D6.js → chunk-LFHCXZO5.js} +6 -6
  185. package/dist/{chunk-LWKJQTOM.js → chunk-MICH6QSJ.js} +1 -1
  186. package/dist/chunk-N3DPO6HG.js +226 -0
  187. package/dist/{chunk-S4GZWSKR.js → chunk-OM5E3TTK.js} +1 -1
  188. package/dist/{chunk-3QRYCPXQ.js → chunk-OPKIKM35.js} +6 -6
  189. package/dist/{chunk-5EKIWVOR.js → chunk-PGRPNDWM.js} +2 -2
  190. package/dist/{chunk-LFJ6UJTI.js → chunk-PQNILU27.js} +9 -9
  191. package/dist/{chunk-QNCVHRZL.js → chunk-QVAFL2LE.js} +1 -1
  192. package/dist/{chunk-QEUY3A5P.js → chunk-QY7UU5ZB.js} +3 -2
  193. package/dist/{chunk-ITHXJHBB.js → chunk-R25RGPUB.js} +1 -0
  194. package/dist/{chunk-KLJCCMF3.js → chunk-R6735B37.js} +2 -2
  195. package/dist/{chunk-3ZP55QZE.js → chunk-R6FBDTP3.js} +4 -4
  196. package/dist/{chunk-7FZ53WDJ.js → chunk-RIAZM6L3.js} +1 -1
  197. package/dist/chunk-RJM4QCGG.js +550 -0
  198. package/dist/{chunk-NTRZGNEX.js → chunk-S3BCVWTU.js} +215 -46
  199. package/dist/chunk-S7KW47IQ.js +121 -0
  200. package/dist/{chunk-OFHBK7RI.js → chunk-SJQ546ID.js} +34 -14
  201. package/dist/{chunk-D35VTV2Z.js → chunk-SV7QAONL.js} +1 -1
  202. package/dist/{chunk-IAJLHVUA.js → chunk-TIWAHZZ6.js} +1 -1
  203. package/dist/{chunk-2PRH365R.js → chunk-UA7O3KKJ.js} +1 -1
  204. package/dist/{chunk-NPZY6YYL.js → chunk-UG5ZMAXW.js} +6 -6
  205. package/dist/{chunk-FEFTGVMF.js → chunk-V2N3BMOT.js} +7 -2
  206. package/dist/{chunk-NDCATSW7.js → chunk-V34H2YCY.js} +1 -1
  207. package/dist/chunk-WIATRXEJ.js +22 -0
  208. package/dist/{chunk-5C5YMZQU.js → chunk-WOFOMTGB.js} +16 -10
  209. package/dist/{chunk-QYOFACSP.js → chunk-WSOFKOLP.js} +3 -3
  210. package/dist/{chunk-MNAXYY3R.js → chunk-WUVZDFHS.js} +31 -11
  211. package/dist/{chunk-UG46QBLT.js → chunk-YIMOT5OO.js} +10 -10
  212. package/dist/{chunk-2ZQMA2WB.js → chunk-ZPSOF6VL.js} +2 -2
  213. package/dist/generated/index.d.ts +3 -0
  214. package/dist/generated/index.js +66 -62
  215. package/dist/index.js +66 -62
  216. package/dist/styles.css +2719 -799
  217. package/dist/utils/index.d.ts +1 -1
  218. package/dist/utils/tone.d.ts +7 -12
  219. package/package.json +4 -4
  220. package/scripts/check-css-literals.mjs +159 -23
  221. package/scripts/check-css-variables.mjs +5 -3
  222. package/scripts/css-source.mjs +97 -5
  223. package/dist/Avatar-P2KRQM2B.css +0 -156
  224. package/dist/Charts-D7G2BSXH.css +0 -277
  225. package/dist/CommandPalette-CSJDUCQA.css +0 -115
  226. package/dist/Kbd-W66MXQI5.css +0 -61
  227. package/dist/SearchTrigger-QXOYAUUY.css +0 -79
  228. package/dist/SidebarNav-QGSFKZYA.css +0 -319
  229. package/dist/StatCard-KYPKZUWX.css +0 -111
  230. package/dist/StatusDot-HA2L2FSX.css +0 -84
  231. package/dist/chunk-22O7LAW2.js +0 -41
  232. package/dist/chunk-2HQR4U4D.js +0 -143
  233. package/dist/chunk-ESCO4XYW.js +0 -144
  234. package/dist/chunk-F4PJZ4ED.js +0 -245
  235. package/dist/chunk-PNFASD6F.js +0 -98
  236. package/dist/chunk-PZSWF74H.js +0 -15
  237. /package/dist/{chunk-ZCR6YGQ4.js → chunk-PKIN4IMB.js} +0 -0
@@ -0,0 +1,78 @@
1
+ import type { HTMLAttributes, ReactNode } from 'react';
2
+ import type { Tone } from '../utils/tone.js';
3
+ /**
4
+ * The state the CURRENT step is in, drawn as its chip's soft tint under its
5
+ * ink. `info` is the default: work under way, the design's working step. A
6
+ * run parked on a question is `warning`, one that stopped at this step is
7
+ * `danger`, and `brand` is where the reader is, for a sequence the reader is
8
+ * walking themselves.
9
+ *
10
+ * NOT `neutral`. The quiet chip is what every step that is not current already
11
+ * is, so a neutral current step would be told from its neighbours by nothing
12
+ * but `aria-current`, which nobody sees.
13
+ */
14
+ export type StepperTone = Exclude<Tone, 'neutral'>;
15
+ /** One step of the sequence. */
16
+ export interface StepperStep {
17
+ /** What tells two steps apart, unique within the stepper: `execute`, `review`. */
18
+ id: string;
19
+ /**
20
+ * The step's words, and anything the step carries beside them: "Execute ·
21
+ * round 7 of 25", "Context 0.8s".
22
+ */
23
+ label: ReactNode;
24
+ }
25
+ export interface StepperProps extends Omit<HTMLAttributes<HTMLOListElement>, 'children'> {
26
+ /** Every step, in order. */
27
+ steps: readonly StepperStep[];
28
+ /**
29
+ * The step under way, by its id. Every step before it is done and every
30
+ * step after it is still to come. `null` once EVERY step is done, which is
31
+ * how a finished run is drawn: a turn's history in a task's timeline reads
32
+ * "Execute ✓ — Review ✓" with nothing current.
33
+ */
34
+ current: string | null;
35
+ /**
36
+ * What the sequence is, for a screen reader: "Turn progress". REQUIRED,
37
+ * because a list of four short words with nothing to say what they are the
38
+ * steps OF is a riddle to somebody who cannot see the row it stands in.
39
+ */
40
+ label: string;
41
+ /** The current step's state. `info` by default. */
42
+ tone?: StepperTone | undefined;
43
+ /**
44
+ * The current step's dot breathes, for a step still under way: the approved
45
+ * design pulses a working turn's. It is `StatusDot`'s own pulse, so it
46
+ * never fades the dot, never touches it, and is held still under a reduced
47
+ * motion preference.
48
+ */
49
+ pulse?: boolean | undefined;
50
+ /**
51
+ * Said before a finished step's words, where the check glyph stands for a
52
+ * reader who sees it: "Done Context".
53
+ */
54
+ doneLabel?: string | undefined;
55
+ }
56
+ /**
57
+ * Where a sequence has got to: the phases of a turn, the stages of a run.
58
+ *
59
+ * AN ORDERED LIST, because the order IS the information: a step's position
60
+ * says whether it is behind the current one or ahead of it, and a list says
61
+ * how many there are before a reader has heard any of them. The step under
62
+ * way carries `aria-current="step"`, the one value ARIA gives this exact
63
+ * meaning, and it is on exactly one step while the sequence is running and on
64
+ * none once it has finished.
65
+ *
66
+ * THREE STATES, EACH DRAWN TWO WAYS, so colour is never the only carrier. A
67
+ * finished step is the secondary ink with a check, and says "Done" before its
68
+ * words to a screen reader, where the check stands for a reader who sees it.
69
+ * The current step is its tone's soft tint under the tone's ink with the
70
+ * tone's dot, and is `aria-current`. A step still to come is the tertiary ink
71
+ * and nothing else. The hairline round the chips, and the short rule between
72
+ * two of them, are the design's quiet furniture.
73
+ *
74
+ * THE TONE IS DRAWN, NEVER SPOKEN: a reader hears which step is current, not
75
+ * that it is in the warning hue. A current step whose state is anything but
76
+ * ordinary work says so in its own words ("Review · sent back").
77
+ */
78
+ export declare function Stepper({ steps, current, label, tone, pulse, doneLabel, className, ...rest }: StepperProps): import("react").JSX.Element | null;
@@ -0,0 +1,3 @@
1
+ import './Stepper.css';
2
+ export { Stepper } from './Stepper.js';
3
+ export type { StepperProps, StepperStep, StepperTone } from './Stepper.js';
@@ -0,0 +1,4 @@
1
+ export { Stepper } from '../chunk-5QWIJSQM.js';
2
+ import '../chunk-WIATRXEJ.js';
3
+ import '../chunk-BZFWDIV6.js';
4
+ import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,176 @@
1
+ /*
2
+ * The stepper: where a sequence has got to (Stepper.tsx).
3
+ *
4
+ * THE APPROVED DESIGN'S STEP ROW. Each step is a 20px pill inside the default
5
+ * hairline, the 11px step at the medium weight, 8px inside each end and 5px
6
+ * between a mark and the word; two pills are joined by a 10px rule in the
7
+ * strong hairline's colour with 6px either side of it. A finished step is the
8
+ * secondary ink behind a check, the current step its tone's soft tint under
9
+ * its ink behind its dot, and a step still to come the tertiary ink.
10
+ *
11
+ * EVERY INK IS A MEASURED PAIR. The secondary and tertiary steps are held to
12
+ * 4.5:1 on every opaque rung, and each tone's ink to 4.5:1 on its own soft
13
+ * tint over every rung, by the palette suite in @crewlethq/tokens; the pill
14
+ * draws nothing else. The current pill is the design's `work-soft` under
15
+ * `work-ink` in the default tone, and a Tag's colours in every tone, which is
16
+ * what a chip naming a state is in this kit.
17
+ */
18
+
19
+ .crewlet-stepper {
20
+ display: flex;
21
+ flex-wrap: wrap;
22
+ align-items: center;
23
+ /* The design's 6px between a pill and the rule beside it: a step and a half. */
24
+ gap: calc(var(--spacing-1) * 1.5);
25
+ min-width: 0;
26
+ margin: 0;
27
+ padding: 0;
28
+ list-style: none;
29
+ }
30
+
31
+ .crewlet-stepper__step {
32
+ display: inline-flex;
33
+ align-items: center;
34
+ gap: calc(var(--spacing-1) * 1.5);
35
+ min-width: 0;
36
+ }
37
+
38
+ /*
39
+ * THE RULE BETWEEN TWO STEPS is drawn by the second of them, so a sequence of
40
+ * one draws none and nothing trails the last. A pseudo-element, because it is
41
+ * furniture: it carries nothing a reader has to be told, and the list already
42
+ * says the steps are in order. 10px by a hairline, the measure of this one
43
+ * mark, and fixed at every density as a hairline is.
44
+ */
45
+ .crewlet-stepper__step + .crewlet-stepper__step::before {
46
+ content: '';
47
+ flex: none;
48
+ width: 10px;
49
+ height: 1px;
50
+ background: var(--color-border-strong);
51
+ }
52
+
53
+ .crewlet-stepper__chip {
54
+ display: inline-flex;
55
+ align-items: center;
56
+ /* The design's 5px between the check or the dot and the word. */
57
+ gap: calc(var(--spacing-1) * 1.25);
58
+ box-sizing: border-box;
59
+ /* The design's 20px pill, which follows the density with every other step
60
+ height in the kit. It labels and takes no press, so the 24px target floor
61
+ is not its to clear. */
62
+ height: calc(20px * var(--density, 1));
63
+ max-width: 100%;
64
+ padding: 0 var(--spacing-2);
65
+ border: 1px solid var(--color-border-default);
66
+ border-radius: var(--radius-pill);
67
+ color: var(--color-text-tertiary);
68
+ font-family: var(--font-family-sans);
69
+ font-size: var(--font-size-2xs);
70
+ font-weight: var(--font-weight-medium);
71
+ line-height: 1;
72
+ white-space: nowrap;
73
+ }
74
+
75
+ .crewlet-stepper__label {
76
+ min-width: 0;
77
+ overflow: hidden;
78
+ text-overflow: ellipsis;
79
+ }
80
+
81
+ .crewlet-stepper__check {
82
+ flex: none;
83
+ }
84
+
85
+ .crewlet-stepper__step--done > .crewlet-stepper__chip {
86
+ color: var(--color-text-secondary);
87
+ }
88
+
89
+ /*
90
+ * THE CURRENT STEP, in its tone. The hairline goes transparent rather than
91
+ * away, so the pill keeps its box and the row does not move by a pixel as the
92
+ * current step advances along it, and so forced-colors mode, which draws a
93
+ * transparent border in the system's own colour, still outlines it.
94
+ */
95
+ .crewlet-stepper--info .crewlet-stepper__step--current > .crewlet-stepper__chip {
96
+ border-color: transparent;
97
+ background: var(--color-feedback-info-soft);
98
+ color: var(--color-feedback-info-ink);
99
+ }
100
+
101
+ .crewlet-stepper--success .crewlet-stepper__step--current > .crewlet-stepper__chip {
102
+ border-color: transparent;
103
+ background: var(--color-feedback-success-soft);
104
+ color: var(--color-feedback-success-ink);
105
+ }
106
+
107
+ .crewlet-stepper--warning .crewlet-stepper__step--current > .crewlet-stepper__chip {
108
+ border-color: transparent;
109
+ background: var(--color-feedback-warning-soft);
110
+ color: var(--color-feedback-warning-ink);
111
+ }
112
+
113
+ .crewlet-stepper--danger .crewlet-stepper__step--current > .crewlet-stepper__chip {
114
+ border-color: transparent;
115
+ background: var(--color-feedback-danger-soft);
116
+ color: var(--color-feedback-danger-ink);
117
+ }
118
+
119
+ .crewlet-stepper--brand .crewlet-stepper__step--current > .crewlet-stepper__chip {
120
+ border-color: transparent;
121
+ background: var(--color-brand-accent-soft);
122
+ color: var(--color-brand-accent-ink);
123
+ }
124
+
125
+ /*
126
+ * INSIDE THE PILL THE DOT IS THE PILL'S OWN INK, as a Tag's is, and for the
127
+ * Tag's reason: StatusDot paints the fill step, measured as a mark on the
128
+ * opaque rungs, and here it stands on the tone's soft tint instead, where
129
+ * nothing measures it. The ink is the step that IS measured on that tint, at
130
+ * 4.5:1, and the colour of the word beside it. A pulsing dot keeps
131
+ * StatusDot's halo, the same soft step drawn once more over the pill, which
132
+ * stands dE 3.92 off it at the least (the light warning pill on the frame).
133
+ *
134
+ * Two classes deep, so it beats StatusDot's own tone rule whichever order the
135
+ * bundle writes the two files in.
136
+ */
137
+ .crewlet-stepper .crewlet-stepper__dot {
138
+ background: currentColor;
139
+ }
140
+
141
+ /*
142
+ * FORCED COLORS repaints every background to Canvas, which takes the current
143
+ * step's tint and its dot, so the one step the row is about would read like
144
+ * any other. The current pill is drawn as the system draws a selection,
145
+ * HighlightText on Highlight, with its dot in the same ink, and the rule
146
+ * between two steps in GrayText; the chips' hairlines are borders, which the
147
+ * mode keeps in its own colour.
148
+ *
149
+ * THE CURRENT PILL OPTS OUT OF THE ADJUSTMENT, which is safe only because
150
+ * every colour it draws in that mode is a system colour. Left to it, Chromium
151
+ * paints a Canvas backplate behind every run of text, and HighlightText is
152
+ * written for Highlight, not for Canvas: in a dark high-contrast theme the
153
+ * step's words drew black on black (measured in Chromium 153 with the mode
154
+ * emulated). Opting out also keeps shadows, so the pulsing dot's halo, which
155
+ * is the tone's soft tint and no system colour, is held still inside it.
156
+ */
157
+ @media (forced-colors: active) {
158
+ .crewlet-stepper .crewlet-stepper__step--current > .crewlet-stepper__chip {
159
+ forced-color-adjust: none;
160
+ border-color: Highlight;
161
+ background: Highlight;
162
+ color: HighlightText;
163
+ }
164
+
165
+ .crewlet-stepper .crewlet-stepper__dot {
166
+ background: HighlightText;
167
+ }
168
+
169
+ .crewlet-stepper .crewlet-stepper__dot.is-pulsing::after {
170
+ animation: none;
171
+ }
172
+
173
+ .crewlet-stepper__step + .crewlet-stepper__step::before {
174
+ background: GrayText;
175
+ }
176
+ }
@@ -1,3 +1,3 @@
1
- export { Table } from '../chunk-FEFTGVMF.js';
1
+ export { Table } from '../chunk-V2N3BMOT.js';
2
2
  import '../chunk-BZFWDIV6.js';
3
3
  import '../chunk-ODEQTPFM.js';
@@ -29,10 +29,20 @@
29
29
  .crewlet-table__container {
30
30
  /* The overflow is a safety net for a cell that cannot wrap (a long token, a
31
31
  hash); the fixed layout below is what keeps a table inside the width it is
32
- given. A `maxHeight` turns this into the vertical scroller the sticky
33
- header needs, which is the only way a long table keeps its column names. */
34
- overflow-x: auto;
35
- overflow-y: var(--crewlet-table-overflow-y, visible);
32
+ given. A `maxHeight` gives it something to scroll vertically, which is
33
+ what the sticky header needs and the only way a long table keeps its
34
+ column names.
35
+
36
+ BOTH AXES, STATED. This was `overflow-y: var(--crewlet-table-overflow-y,
37
+ visible)`, and the fallback was unreachable: per CSS Overflow, when one
38
+ axis is not `visible` the other computes to `auto`, so the unconditional
39
+ `overflow-x: auto` beside it made this box a scrollport in both
40
+ directions in every state. The variable had exactly one reachable value —
41
+ the `auto` Table.tsx wrote beside the max-height — so it read as a knob
42
+ with a default nothing could ever select. Without a max-height there is
43
+ simply nothing to scroll to, which is what made the difference invisible
44
+ rather than what made it absent. */
45
+ overflow: auto;
36
46
  max-height: var(--crewlet-table-max-height, none);
37
47
  overscroll-behavior-x: contain;
38
48
  flex: 1;
@@ -1,4 +1,4 @@
1
- export { TabPanel, Tabs, tabId } from '../chunk-QEUY3A5P.js';
1
+ export { TabPanel, Tabs, tabId } from '../chunk-QY7UU5ZB.js';
2
2
  import '../chunk-BHHIIK3M.js';
3
3
  import '../chunk-BZFWDIV6.js';
4
4
  import '../chunk-ODEQTPFM.js';
@@ -50,7 +50,21 @@
50
50
  */
51
51
  content: '';
52
52
  position: absolute;
53
- bottom: -1px;
53
+ /*
54
+ * ON THE PADDING EDGE, NOT BELOW IT. This is an absolutely positioned child
55
+ * of the row, and the row is a scroll container: `overflow-x: auto` makes
56
+ * `overflow-y` compute to `auto` as well, so there is no axis on which it
57
+ * does not clip. Clipping is to the PADDING edge and the row's own 1px
58
+ * `border-bottom` lies outside it, so at `bottom: -1px` a 2px bar was cut in
59
+ * half — and the half removed was the lower one, the half meant to sit on
60
+ * the baseline rule and replace it. `scrollbar-width: none` above then hid
61
+ * the 1px vertical scrollbar that would have given the game away.
62
+ *
63
+ * `overflow: visible` is not the way out: the horizontal scrolling is the
64
+ * row's whole contract. The bar sits at 0 instead and paints over the row's
65
+ * last two pixels, which is where a reader sees it anyway.
66
+ */
67
+ bottom: 0;
54
68
  /*
55
69
  * Under the LABEL, not under the tab's box: the measurement is the button,
56
70
  * which carries the small side pad an inset focus ring needs, and a bar
@@ -70,21 +84,29 @@
70
84
 
71
85
  /* ─── Pill (segmented control) ────────────────────────────────── */
72
86
  /*
73
- * A WELL WITH CHIPS IN IT, not a panel with buttons in it. The container is
74
- * the inset surface and carries no boundary of its own: the chip that is on
75
- * is what the reader looks for, and it is found by being the one thing lifted
76
- * off the well rather than by a border around the whole set.
87
+ * A WELL WITH CHIPS IN IT, not a panel with buttons in it: the approved
88
+ * design's segmented control. The well is the RAISED rung inside the default
89
+ * hairline, and the chip that is on is the CARD's own ground, lifted by a
90
+ * hairline and a small shadow, so it is found by being the one thing that
91
+ * matches the panel the row sits on.
92
+ *
93
+ * A RUNG AND A HAIRLINE, NOT A TRANSLUCENT WELL. The inset overlay it used to
94
+ * be stands almost nowhere off a card, so the well had no extent and the
95
+ * chips floated; the raised rung is held a visible step above the card by the
96
+ * palette suite, and the hairline finds it on any other ground.
77
97
  *
78
98
  * The inset is 2px, which is smaller than the scale's first step on purpose:
79
- * it is the gap a chip needs to read as sitting IN the well, and a 4px one
80
- * makes the row a control step taller than the button beside it.
99
+ * it is the gap a chip needs to read as sitting IN the well. With the 1px
100
+ * boundary it is three pixels a side, and a 24px chip makes a 30px row: the
101
+ * medium control step, the height of the button beside it.
81
102
  */
82
103
  .crewlet-tabs--pill {
83
104
  --crewlet-tabs-pill-inset: 2px;
84
105
 
85
106
  gap: var(--crewlet-tabs-pill-inset);
86
107
  padding: var(--crewlet-tabs-pill-inset);
87
- background: var(--color-surface-inset);
108
+ background: var(--color-surface-elevated);
109
+ border: 1px solid var(--color-border-default);
88
110
  border-radius: var(--radius-md);
89
111
  width: fit-content;
90
112
  }
@@ -108,6 +130,24 @@
108
130
  align-items: center;
109
131
  justify-content: center;
110
132
  gap: var(--spacing-1);
133
+ /*
134
+ * A TAB IS NEVER SQUEEZED, which is what makes the row above it SCROLL.
135
+ *
136
+ * `.crewlet-tabs--underline` is a `width: 100%` flex row with
137
+ * `overflow-x: auto`, and its own comment states the contract: the row
138
+ * scrolls rather than overflowing the page. That behaviour came entirely
139
+ * from each tab's automatic minimum resolving to its `nowrap` label, which
140
+ * is what makes the line unable to fit — and the explicit `min-width` below
141
+ * REPLACES that automatic minimum with a flat 24px for every item, not just
142
+ * the narrow ones the floor is for. With the default `flex-shrink: 1` the
143
+ * tabs were squeezed toward 24px until the line fitted, the strip stopped
144
+ * scrolling, and the labels — `nowrap`, with `min-width: 0` and no clip —
145
+ * spilled out of their buttons over their neighbours.
146
+ *
147
+ * `flex: none` is what the comment above already claims: "a tab whose label
148
+ * is wider than the floor is untouched".
149
+ */
150
+ flex: none;
111
151
  /* Never under the 24px target floor, at any density. */
112
152
  min-height: var(--size-control-sm);
113
153
  min-width: var(--size-target-min);
@@ -154,19 +194,22 @@
154
194
 
155
195
  /*
156
196
  * A CHIP STANDS SHORTER THAN THE CONTROL IT SITS BESIDE, and it is the row
157
- * that has to match: the well adds its inset above and below every chip, so a
158
- * chip at a full control step makes the whole segmented row taller than the
159
- * button next to it. Six pixels off the md step and four off the sm one is
160
- * what the engine's own segmented row has always drawn.
197
+ * that has to match: the well adds its boundary and its inset above and below
198
+ * every chip, so a chip at a full control step makes the whole segmented row
199
+ * taller than the button next to it. Six pixels off the md step is exactly
200
+ * that boundary and inset, and it leaves the design's 24px chip in a 30px row.
161
201
  *
162
- * AND THE FLOOR IS TAKEN AGAIN AFTER THE SUBTRACTION. --size-control-sm
163
- * carries a 24px floor of its own, but subtracting from a step subtracts from
164
- * its floor too: at compact density `calc(var(--size-control-sm) - 4px)` is
165
- * 20px, under the target a finger can hit. max() against --size-target-min
166
- * leaves the value exactly 24px at density 1 and reachable at every other.
202
+ * AND THE FLOOR IS TAKEN AGAIN AFTER THE SUBTRACTION. Subtracting from a step
203
+ * subtracts from its floor too: at compact density
204
+ * `calc(var(--size-control-md) - 6px)` is 18.6px, under the target a finger
205
+ * can hit. max() against --size-target-min holds every density at 24px or
206
+ * more, and at density 1 the two agree.
167
207
  *
168
- * The corner is one hairline tighter than the well around it rather than a
169
- * step of its own, which is what reads as a chip sitting IN the well.
208
+ * The corner is the small radius, the design's: the well's 8px less its 1px
209
+ * boundary and 2px inset is 5px, and a chip a pixel rounder than that
210
+ * concentric curve is what reads as a chip sitting IN the well rather than a
211
+ * second well inside it. The side pad is the design's 10px, two steps and a
212
+ * half.
170
213
  *
171
214
  * AND THE CONTENT IS CENTRED IN THE CHIP. It was aligned to the start, for a
172
215
  * chip stretched on a grid track, which is a case the pill chrome's own
@@ -180,8 +223,9 @@
180
223
  */
181
224
  .crewlet-tabs--pill .crewlet-tabs__tab {
182
225
  min-height: max(var(--size-target-min), calc(var(--size-control-md) - 6px));
183
- padding: 0 var(--spacing-3);
184
- border-radius: var(--radius-chip);
226
+ padding: 0 calc(var(--spacing-2) + var(--spacing-1) / 2);
227
+ border-radius: var(--radius-sm);
228
+ color: var(--color-text-secondary);
185
229
  font-size: var(--font-size-xs);
186
230
  }
187
231
 
@@ -189,12 +233,12 @@
189
233
  * THE SMALL CHIP IS THE QUIET ONE. It is the register the rail's foot wears,
190
234
  * where a theme row and a density row sit beside a status pill and are read
191
235
  * past rather than read, so its side pad is the scale's first step rather
192
- * than its second and its glyph is the step under the label register's.
236
+ * than two and a half and its glyph is the step under the label register's.
193
237
  *
194
- * The height does not follow: at the reader's default density this chip is
195
- * already exactly --size-target-min, so a shorter one would be a target a
196
- * finger misses. The whole reduction comes out of the width, where the pad is
197
- * spent, and the floor above catches what is left.
238
+ * The height does not follow: the medium chip is already exactly
239
+ * --size-target-min at the reader's default density, so a shorter one would be
240
+ * a target a finger misses. The whole reduction comes out of the width, where
241
+ * the pad is spent, and the floor catches what the subtraction leaves.
198
242
  */
199
243
  .crewlet-tabs--pill.crewlet-tabs--sm .crewlet-tabs__tab {
200
244
  min-height: max(var(--size-target-min), calc(var(--size-control-sm) - 4px));
@@ -221,9 +265,17 @@
221
265
  color: var(--color-text-primary);
222
266
  }
223
267
 
268
+ /*
269
+ * The chip that is on: the CARD's ground and the primary ink, lifted by the
270
+ * default hairline drawn round it and the smallest shadow under it, the
271
+ * design's chip. The hairline is the half that finds it: on a dark palette a
272
+ * shadow over a dark well is nearly invisible. Both are one shadow list, and
273
+ * neither token in it is ever `none`, which would drop the whole list.
274
+ */
224
275
  .crewlet-tabs--pill .crewlet-tabs__tab.is-active {
225
276
  background: var(--color-surface-subtle);
226
- box-shadow: var(--shadow-xs);
277
+ color: var(--color-text-primary);
278
+ box-shadow: var(--shadow-xs), 0 0 0 1px var(--color-border-default);
227
279
  }
228
280
 
229
281
  /*
package/dist/Tag/Tag.d.ts CHANGED
@@ -1,17 +1,20 @@
1
1
  import type { HTMLAttributes, MouseEvent, ReactNode } from 'react';
2
- import type { PhaseTone, Tone } from '../utils/tone.js';
2
+ import type { Tone } from '../utils/tone.js';
3
3
  /**
4
- * Which vocabulary a tag speaks: a state, or a phase. Both, because the same
5
- * pill draws "failed" on the Model screen and "execute" on the turn beside it,
6
- * and a second component for the second vocabulary would be one recipe spelled
7
- * twice.
4
+ * What a tag's colour says: a state, the accent, or nothing at all.
5
+ *
6
+ * The same pill draws "failed" on the Model screen and "execute" on the turn
7
+ * beside it, and only the first is a state. The second is a CATEGORY, a phase,
8
+ * and a category is the neutral tag with its word: a hue per phase was a second
9
+ * colour vocabulary that said nothing the word did not, spent from the hues the
10
+ * states are held apart in.
8
11
  */
9
- export type TagVariant = Tone | PhaseTone;
12
+ export type TagVariant = Tone;
10
13
  /**
11
- * How much room the pill takes. The engine draws ONE badge and spends its
12
- * variation on tone, so these are three heights of that badge rather than
13
- * three different marks: `sm` is the engine's own geometry and the default,
14
- * `xs` a denser mark for a packed row, `md` a small control's height for a
14
+ * How much room the pill takes. The design draws ONE pill and spends its
15
+ * variation on tone, so these are three heights of that pill rather than
16
+ * three different marks: `sm` is the design's 22px pill and the default, `xs`
17
+ * the 18px count pill for a packed row, `md` a small control's height for a
15
18
  * toolbar.
16
19
  */
17
20
  export type TagSize = 'xs' | 'sm' | 'md';
@@ -26,7 +29,7 @@ export type TagSize = 'xs' | 'sm' | 'md';
26
29
  export type InteractiveTagSize = Exclude<TagSize, 'xs'>;
27
30
  export type TagAppearance = 'soft' | 'outline';
28
31
  interface TagLook {
29
- /** The state or the phase this tag names. Neutral by default. */
32
+ /** The state this tag names. Neutral by default, which is what a category such as a phase takes. */
30
33
  variant?: TagVariant | undefined;
31
34
  /** A tinted fill, or a boundary over the surface beneath. */
32
35
  appearance?: TagAppearance | undefined;
@@ -79,7 +82,7 @@ export interface InteractiveTagProps extends TagLook, Omit<HTMLAttributes<HTMLEl
79
82
  }
80
83
  export type TagProps = StaticTagProps | InteractiveTagProps;
81
84
  /**
82
- * A small pill that names a state, a phase or a value.
85
+ * A small pill that names a state, a category or a value.
83
86
  *
84
87
  * COLOUR IS NEVER THE ONLY CARRIER. Every tag renders its label, in every
85
88
  * variant, so a reader who cannot separate the warning hue from the danger one
@@ -90,18 +93,22 @@ export type TagProps = StaticTagProps | InteractiveTagProps;
90
93
  * under the tone's `ink`, never the solid fill with a label on it: the fill
91
94
  * step is measured as a MARK, at 3:1, and putting text on it would put that
92
95
  * text under the 4.5:1 it has to clear. 0.2.0 spelled five dark-theme literals
93
- * here instead, which measured between 1.14:1 and 1.58:1 on a light page.
96
+ * here instead, which measured between 1.14:1 and 1.58:1 on a light page. The
97
+ * neutral tag, which names no state, is the raised rung under the secondary
98
+ * ink, inside the strong hairline: its fill is a surface, and on a raised
99
+ * ground a borderless one would draw nothing.
94
100
  *
95
- * ITS LINE BOX IS FIXED. The height comes from the size step rather than from
96
- * the content, so a cell that holds a tag on one row and nothing on the next
97
- * is the same height on both and a table does not ripple as states arrive.
101
+ * IT IS A PILL, the approved design's: 22px with round ends at the caption
102
+ * step. Its line box is fixed. The height comes from the size step rather
103
+ * than from the content, so a cell that holds a tag on one row and nothing on
104
+ * the next is the same height on both and a table does not ripple as states
105
+ * arrive.
98
106
  *
99
- * A TAG THAT ACTS IS FOUR PIXELS TALLER THAN ONE THAT LABELS, and that is the
100
- * one place this pill departs from the engine's badge. The engine draws its
101
- * actionable badge at the inert one's 20px, which is a pointer target under
102
- * the 24px WCAG 2.2 accepts; everything else about the two, the tint, the ink,
103
- * the radius, the type and the padding, is identical, so a row still reads as
104
- * one set.
107
+ * A TAG THAT ACTS IS TWO PIXELS TALLER THAN ONE THAT LABELS, and that is the
108
+ * one place this pill departs from the design. The design draws its pill at
109
+ * 22px whatever it does, which is a pointer target under the 24px WCAG 2.2
110
+ * accepts; everything else about the two, the tint, the ink, the radius, the
111
+ * type and the padding, is identical, so a row still reads as one set.
105
112
  */
106
113
  export declare function Tag(props: TagProps): import("react").JSX.Element;
107
114
  export {};
package/dist/Tag/index.js CHANGED
@@ -1,3 +1,3 @@
1
- export { Tag } from '../chunk-S2XHHEW4.js';
2
- import '../chunk-PZSWF74H.js';
1
+ export { Tag } from '../chunk-74KMX7YH.js';
2
+ import '../chunk-WIATRXEJ.js';
3
3
  import '../chunk-ODEQTPFM.js';