@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,742 @@
1
+ /* The chart kit: a legend, a ranked bar list, a stacked bar, stacked
2
+ columns, an activity strip, a time series and the reading layer they share. Hand-drawn rather than a charting library, for one reason that
3
+ decides it: every mark here reads tokens, in two themes, at the contrast
4
+ floors the palette suite measures, and a library's theming surface is a
5
+ second design system to keep in step with this one. */
6
+
7
+ /* ─── Legend ──────────────────────────────────────────────────── */
8
+ .crewlet-legend {
9
+ display: flex;
10
+ flex-wrap: wrap;
11
+ align-items: center;
12
+ gap: var(--spacing-1) var(--spacing-3);
13
+ margin: 0;
14
+ padding: 0;
15
+ list-style: none;
16
+ font-size: var(--font-size-xs);
17
+ color: var(--color-text-tertiary);
18
+ }
19
+
20
+ .crewlet-legend__item {
21
+ display: inline-flex;
22
+ align-items: center;
23
+ gap: var(--spacing-1);
24
+ min-width: 0;
25
+ }
26
+
27
+ /*
28
+ * A ROUNDED SQUARE, NOT A DOT. At the smallest radius step an 8px swatch is a
29
+ * circle, and a circle in this system is a StatusDot: a legend beside a chart
30
+ * was reading as a row of live states. Half that step keeps the corner soft
31
+ * and the shape square, and it is written as half a step rather than as 2px so
32
+ * it is still a value off the scale.
33
+ */
34
+ .crewlet-legend__swatch {
35
+ width: 8px;
36
+ height: 8px;
37
+ flex: none;
38
+ border-radius: calc(var(--radius-xs) / 2);
39
+ background: var(--crewlet-legend-swatch-color, var(--color-data-other));
40
+ }
41
+
42
+ .crewlet-legend__label {
43
+ overflow: hidden;
44
+ text-overflow: ellipsis;
45
+ white-space: nowrap;
46
+ }
47
+
48
+ .crewlet-legend__value {
49
+ color: var(--color-text-secondary);
50
+ font-variant-numeric: tabular-nums;
51
+ }
52
+
53
+ /* ─── Bar list ────────────────────────────────────────────────── */
54
+ .crewlet-bar-list {
55
+ display: flex;
56
+ flex-direction: column;
57
+ gap: var(--spacing-2);
58
+ margin: 0;
59
+ padding: 0;
60
+ list-style: none;
61
+ }
62
+
63
+ .crewlet-bar-list__item {
64
+ min-width: 0;
65
+ }
66
+
67
+ .crewlet-bar-list__row {
68
+ display: flex;
69
+ flex-direction: column;
70
+ gap: var(--spacing-1);
71
+ width: 100%;
72
+ padding: 0;
73
+ border: none;
74
+ background: none;
75
+ color: inherit;
76
+ font: inherit;
77
+ text-align: left;
78
+ text-decoration: none;
79
+ }
80
+
81
+ .crewlet-bar-list__row--pressable {
82
+ cursor: pointer;
83
+ }
84
+
85
+ .crewlet-bar-list__row--pressable:hover .crewlet-bar-list__label {
86
+ color: var(--color-text-primary);
87
+ }
88
+
89
+ .crewlet-bar-list__row--pressable:focus-visible {
90
+ outline: 2px solid var(--color-focus);
91
+ outline-offset: 2px;
92
+ border-radius: var(--radius-xs);
93
+ }
94
+
95
+ .crewlet-bar-list__head {
96
+ display: flex;
97
+ align-items: baseline;
98
+ gap: var(--spacing-2);
99
+ min-width: 0;
100
+ }
101
+
102
+ .crewlet-bar-list__label {
103
+ flex: 1;
104
+ min-width: 0;
105
+ overflow: hidden;
106
+ text-overflow: ellipsis;
107
+ white-space: nowrap;
108
+ font-size: var(--font-size-compact);
109
+ color: var(--color-text-primary);
110
+ }
111
+
112
+ .crewlet-bar-list__value {
113
+ font-size: var(--font-size-compact);
114
+ color: var(--color-text-secondary);
115
+ /* Tabular, so a column of numbers lines up on its digits and a push that
116
+ changes one of them does not move the rest. */
117
+ font-variant-numeric: tabular-nums;
118
+ }
119
+
120
+ /*
121
+ * A BAR IS ROUNDED AT ITS VALUE END ONLY. The start is the baseline every row
122
+ * shares, so it is square and the bars read as measured from one line; the end
123
+ * is where the value is, and the smallest radius step marks it as an end
124
+ * rather than a cut. The track is the scale at full length, so it takes the
125
+ * same shape: a bar at the top of the scale is exactly the track.
126
+ *
127
+ * Written as LOGICAL corners, because the value end is the inline end: in a
128
+ * right-to-left document the bars grow leftward and their value end is the
129
+ * left one.
130
+ */
131
+ .crewlet-bar-list__track {
132
+ display: block;
133
+ height: 5px;
134
+ border-start-start-radius: 0;
135
+ border-end-start-radius: 0;
136
+ border-start-end-radius: var(--radius-xs);
137
+ border-end-end-radius: var(--radius-xs);
138
+ background: var(--color-surface-inset);
139
+ overflow: hidden;
140
+ }
141
+
142
+ .crewlet-bar-list__bar {
143
+ display: block;
144
+ height: 100%;
145
+ border-start-start-radius: 0;
146
+ border-end-start-radius: 0;
147
+ border-start-end-radius: var(--radius-xs);
148
+ border-end-end-radius: var(--radius-xs);
149
+ background: var(--crewlet-bar-list-bar-color, var(--color-data-other));
150
+ }
151
+
152
+ /*
153
+ * THE CAPTION STEP. These are sentences a reader actually reads (what a row is
154
+ * besides its name, how long the tail is, that there is nothing here at all),
155
+ * and the 11px step is the MICRO-LABEL register: it is for a word above a
156
+ * column, not for a line of prose.
157
+ */
158
+ .crewlet-bar-list__sub,
159
+ .crewlet-bar-list__more,
160
+ .crewlet-bar-list__empty {
161
+ font-size: var(--font-size-xs);
162
+ color: var(--color-text-tertiary);
163
+ }
164
+
165
+ /*
166
+ * THE SENTENCE STARTS WHERE THE BARS WOULD HAVE. It stands in for them, so it
167
+ * takes the inset the panel holding it gives every other row and none of its
168
+ * own.
169
+ *
170
+ * It carried the panel's own step for a while, which was a repair applied at
171
+ * the wrong end: the sentence was landing against a card's border because the
172
+ * CARD was drawing its content with no inset at all, and a padding here moved
173
+ * this one line while every sibling in the same card stayed against the edge.
174
+ * A card draws its own content in a body now, so a padding here is the panel's
175
+ * inset a second time.
176
+ */
177
+ .crewlet-bar-list__empty {
178
+ margin: 0;
179
+ padding: 0;
180
+ }
181
+
182
+ .crewlet-bar-list__sub {
183
+ overflow: hidden;
184
+ text-overflow: ellipsis;
185
+ white-space: nowrap;
186
+ }
187
+
188
+ /*
189
+ * BESIDE: the design's ranked figure. The words in a column of their own, the
190
+ * bar, and the value at the bar's end, one row 30px tall: the design's, and
191
+ * the control step's, --size-control-md, so it follows the density. Two
192
+ * component variables set its geometry, because both depend on what a screen
193
+ * puts in it rather than on the kit:
194
+ *
195
+ * --crewlet-bar-list-label-width, the words' column (128px, the Home card's):
196
+ * one width for every row, so the bars share one baseline.
197
+ *
198
+ * --crewlet-bar-list-value-room, what the scale keeps free at its end for the
199
+ * value of the longest bar (6ch of tabular figures and the gap before them,
200
+ * "412.3k"). The SCALE is the plot less that room, a bar is its share of the
201
+ * scale, and the value follows the bar, so the longest bar's value stands in
202
+ * the room and every shorter bar's value just past its own end.
203
+ *
204
+ * The bar is 12px thick, the design's, and square on its baseline with the
205
+ * value end rounded, as the stacked register's is. It has no track: the
206
+ * longest bar IS the end of the scale, and a track under the rest would be a
207
+ * second baseline to read against.
208
+ */
209
+ .crewlet-bar-list--beside {
210
+ --crewlet-bar-list-label-width: 128px;
211
+ --crewlet-bar-list-value-room: calc(6ch + var(--spacing-2));
212
+
213
+ gap: calc(var(--spacing-1) * 1.5);
214
+ }
215
+
216
+ .crewlet-bar-list--beside .crewlet-bar-list__row {
217
+ flex-direction: row;
218
+ align-items: center;
219
+ gap: var(--spacing-3);
220
+ min-height: var(--size-control-md);
221
+ }
222
+
223
+ .crewlet-bar-list__names {
224
+ display: flex;
225
+ flex: none;
226
+ flex-direction: column;
227
+ width: var(--crewlet-bar-list-label-width);
228
+ min-width: 0;
229
+ line-height: var(--font-line-height-tight);
230
+ }
231
+
232
+ .crewlet-bar-list--beside .crewlet-bar-list__label {
233
+ flex: none;
234
+ color: var(--color-text-secondary);
235
+ }
236
+
237
+ .crewlet-bar-list--beside .crewlet-bar-list__row--pressable:hover .crewlet-bar-list__label {
238
+ color: var(--color-text-primary);
239
+ }
240
+
241
+ .crewlet-bar-list__plot {
242
+ display: block;
243
+ flex: 1 1 auto;
244
+ min-width: 0;
245
+ }
246
+
247
+ .crewlet-bar-list__scale {
248
+ display: flex;
249
+ align-items: center;
250
+ gap: var(--spacing-2);
251
+ width: calc(100% - var(--crewlet-bar-list-value-room));
252
+ }
253
+
254
+ .crewlet-bar-list--beside .crewlet-bar-list__bar {
255
+ flex: none;
256
+ height: 12px;
257
+ }
258
+
259
+ /* What the row is, under its name at the micro step, as the design sets it:
260
+ in a column 128px wide a caption at the list's own step wrapped a word. */
261
+ .crewlet-bar-list--beside .crewlet-bar-list__sub {
262
+ font-size: var(--font-size-2xs);
263
+ }
264
+
265
+ /* The number the row is about: the primary ink, a step heavier than the name. */
266
+ .crewlet-bar-list--beside .crewlet-bar-list__value {
267
+ flex: none;
268
+ color: var(--color-text-primary);
269
+ font-size: var(--font-size-xs);
270
+ font-weight: var(--font-weight-medium);
271
+ white-space: nowrap;
272
+ }
273
+
274
+ /* ─── Stacked bar ─────────────────────────────────────────────── */
275
+
276
+ /*
277
+ * THE PARTS STAND 2PX APART. Butted together, two neighbouring hues meet at an
278
+ * edge the eye reads as one mark in two colours; the gap is the ground showing
279
+ * through, which is what makes each part a part. Two pixels, the approved
280
+ * artboard's own, and not a spacing step, because it is a hairline of ground
281
+ * rather than a space and a density setting must not widen it. Each part GROWS
282
+ * by its value (a style property on the part), so the gaps come out of the
283
+ * parts and the whole still fills the track exactly.
284
+ *
285
+ * The value end is rounded and the start is square, as a bar list's bar is.
286
+ */
287
+ .crewlet-stacked-bar__track {
288
+ display: flex;
289
+ gap: 2px;
290
+ height: 6px;
291
+ border-start-start-radius: 0;
292
+ border-end-start-radius: 0;
293
+ border-start-end-radius: var(--radius-xs);
294
+ border-end-end-radius: var(--radius-xs);
295
+ background: var(--color-surface-inset);
296
+ overflow: hidden;
297
+ }
298
+
299
+ .crewlet-stacked-bar__segment {
300
+ flex-grow: 0;
301
+ flex-shrink: 1;
302
+ flex-basis: 0;
303
+ min-width: 0;
304
+ height: 100%;
305
+ background: var(--crewlet-stacked-bar-segment-color, var(--color-data-other));
306
+ }
307
+
308
+ /* ─── Stacked columns ─────────────────────────────────────────── */
309
+
310
+ /*
311
+ * The scale's words stand in a column of their own at the start, sized by the
312
+ * widest of them, and the time under the plot starts where the plot does.
313
+ */
314
+ .crewlet-stacked-columns {
315
+ display: grid;
316
+ grid-template-columns: auto minmax(0, 1fr);
317
+ column-gap: var(--spacing-2);
318
+ row-gap: var(--spacing-1);
319
+ margin: 0;
320
+ min-width: 0;
321
+ }
322
+
323
+ /*
324
+ * EACH WORD IS A BOX OF NO HEIGHT, spread from the top of the plot to its
325
+ * baseline, with the word centred on it: so every word stands exactly on the
326
+ * line it names, whatever the plot's height, with nothing measured.
327
+ */
328
+ .crewlet-stacked-columns__axis {
329
+ display: flex;
330
+ flex-direction: column;
331
+ justify-content: space-between;
332
+ align-items: flex-end;
333
+ }
334
+
335
+ .crewlet-stacked-columns__tick {
336
+ display: flex;
337
+ align-items: center;
338
+ height: 0;
339
+ font-family: var(--font-family-mono);
340
+ font-size: var(--font-size-2xs);
341
+ color: var(--color-text-tertiary);
342
+ font-variant-numeric: tabular-nums;
343
+ white-space: nowrap;
344
+ }
345
+
346
+ .crewlet-stacked-columns__plot {
347
+ position: relative;
348
+ display: flex;
349
+ align-items: stretch;
350
+ }
351
+
352
+ .crewlet-stacked-columns__grid {
353
+ position: absolute;
354
+ inset: 0;
355
+ display: flex;
356
+ flex-direction: column;
357
+ justify-content: space-between;
358
+ pointer-events: none;
359
+ }
360
+
361
+ /* The scale's lines: hairlines, because they are where a value is read against
362
+ rather than something to read. The last is the baseline. */
363
+ .crewlet-stacked-columns__grid-line {
364
+ display: block;
365
+ height: 0;
366
+ border-top: 1px solid var(--color-border-default);
367
+ }
368
+
369
+ /*
370
+ * A SLOT IS THE COLUMN'S WHOLE SHARE OF THE WIDTH, and the pointer's target:
371
+ * the gaps between columns belong to a column, so the reading never drops out
372
+ * as the pointer crosses one. The column stands in its middle at the approved
373
+ * artboard's proportion, 14 of a 22.2 slot, and never wider than a finger's
374
+ * worth, so a week of seven buckets does not draw seven slabs.
375
+ */
376
+ .crewlet-stacked-columns__slot {
377
+ position: relative;
378
+ display: flex;
379
+ flex: 1 1 0;
380
+ min-width: 0;
381
+ align-items: flex-end;
382
+ justify-content: center;
383
+ border-radius: var(--radius-xs);
384
+ }
385
+
386
+ .crewlet-stacked-columns__slot.is-active {
387
+ background: var(--color-surface-hover);
388
+ }
389
+
390
+ /*
391
+ * THE COLUMN IS ITS TOTAL'S HEIGHT (a style property), and its parts share it
392
+ * by value, first series at the baseline. They stand 2px apart for the reason
393
+ * a stacked bar's do, and the gap comes out of the parts.
394
+ */
395
+ .crewlet-stacked-columns__column {
396
+ display: flex;
397
+ flex-direction: column-reverse;
398
+ gap: 2px;
399
+ width: 63%;
400
+ max-width: var(--spacing-7);
401
+ }
402
+
403
+ .crewlet-stacked-columns__segment {
404
+ display: block;
405
+ flex-grow: 0;
406
+ flex-shrink: 1;
407
+ flex-basis: 0;
408
+ min-height: 0;
409
+ background: var(--crewlet-stacked-columns-segment-color, var(--color-data-other));
410
+ }
411
+
412
+ /* The VALUE END: the top of the topmost part, rounded at the smallest step.
413
+ The foot stays square on the baseline every column shares. */
414
+ .crewlet-stacked-columns__segment:last-child {
415
+ border-top-left-radius: var(--radius-xs);
416
+ border-top-right-radius: var(--radius-xs);
417
+ }
418
+
419
+ .crewlet-stacked-columns__scale {
420
+ position: relative;
421
+ grid-column: 2;
422
+ display: flex;
423
+ justify-content: space-between;
424
+ gap: var(--spacing-2);
425
+ min-width: 0;
426
+ font-size: var(--font-size-xs);
427
+ color: var(--color-text-tertiary);
428
+ font-variant-numeric: tabular-nums;
429
+ }
430
+
431
+ /*
432
+ * THE HEAD AND THE LEGEND span both of the figure's columns, the axis's and
433
+ * the plot's. The head is one row: what the chart is at its start, and the
434
+ * legend at its END, top right, where the design's Spend card draws it; the
435
+ * legend is flushed to the end of that row and wraps from there. Below, the
436
+ * legend starts under the axis, a step clear of the dates.
437
+ */
438
+ .crewlet-stacked-columns__head {
439
+ grid-column: 1 / -1;
440
+ display: flex;
441
+ align-items: flex-start;
442
+ gap: var(--spacing-4);
443
+ margin-bottom: var(--spacing-3);
444
+ min-width: 0;
445
+ }
446
+
447
+ .crewlet-stacked-columns__heading {
448
+ flex: 1 1 auto;
449
+ min-width: 0;
450
+ }
451
+
452
+ .crewlet-stacked-columns__legend--head {
453
+ flex: 0 1 auto;
454
+ justify-content: flex-end;
455
+ margin-inline-start: auto;
456
+ }
457
+
458
+ .crewlet-stacked-columns__legend--below {
459
+ grid-column: 1 / -1;
460
+ margin-top: var(--spacing-2);
461
+ }
462
+
463
+ /* The middle label stands on the column it names (a style property). */
464
+ .crewlet-stacked-columns__middle {
465
+ position: absolute;
466
+ top: 0;
467
+ transform: translateX(-50%);
468
+ white-space: nowrap;
469
+ }
470
+
471
+ /* ─── The reading layer: a focusable plot and its tooltip ─────── */
472
+
473
+ /*
474
+ * THE PLOT IS ONE TAB STOP, and the positioning context its tooltip stands in.
475
+ * Its ring is drawn on `:focus-visible` only, so a keyboard reader sees it and
476
+ * a click that focuses the plot on the way to a pointer reading draws none.
477
+ */
478
+ .crewlet-chart-frame {
479
+ position: relative;
480
+ min-width: 0;
481
+ border-radius: var(--radius-xs);
482
+ }
483
+
484
+ .crewlet-chart-frame:focus-visible {
485
+ outline: 2px solid var(--color-focus);
486
+ outline-offset: 2px;
487
+ }
488
+
489
+ /*
490
+ * The box stands beside the mark, at the top of the plot. Its one varying
491
+ * value, `left`, is a style property on the element (see ChartTooltip); the
492
+ * side it stands on is a class, and the gap between it and the mark is a step.
493
+ * It never takes the pointer, so it can never steal the reading from the mark
494
+ * under it.
495
+ *
496
+ * IT STANDS OVER THE DATA, BY DESIGN, and that decides its ground. A kit
497
+ * Tooltip or Popover floats over interface; this one floats over the columns
498
+ * next to the one being read and over the lines and areas of a time series. So
499
+ * it is not the card: in the marketing palette the card is a 5% white wash,
500
+ * and every data hue showed through it, taking the title to 1.12:1 and the
501
+ * values to 2.77:1. It is the GLASS, frosted by --blur-sm, which the palette
502
+ * suite holds every text step over 4.5:1 on in every palette with each data
503
+ * hue, the residual and the inverse ground behind it (the inverse being the far
504
+ * end of the palette from the glass, and so the worst backdrop anything can
505
+ * put there). The hairline and the medium shadow are the kit's overlay edge,
506
+ * and every word is a TEXT step.
507
+ */
508
+ .crewlet-chart-tooltip {
509
+ position: absolute;
510
+ top: 0;
511
+ z-index: var(--z-index-raised);
512
+ display: flex;
513
+ flex-direction: column;
514
+ gap: var(--spacing-1);
515
+ min-width: 140px;
516
+ max-width: 260px;
517
+ padding: var(--spacing-2);
518
+ background: var(--color-surface-glass);
519
+ backdrop-filter: blur(var(--blur-sm));
520
+ color: var(--color-text-primary);
521
+ border: 1px solid var(--color-border-default);
522
+ border-radius: var(--radius-md);
523
+ box-shadow: var(--shadow-md);
524
+ font-size: var(--font-size-xs);
525
+ line-height: var(--font-line-height-snug);
526
+ pointer-events: none;
527
+ white-space: nowrap;
528
+ }
529
+
530
+ .crewlet-chart-tooltip--after {
531
+ transform: translateX(var(--spacing-2));
532
+ }
533
+
534
+ .crewlet-chart-tooltip--before {
535
+ transform: translateX(calc(-100% - var(--spacing-2)));
536
+ }
537
+
538
+ .crewlet-chart-tooltip__title {
539
+ margin: 0;
540
+ color: var(--color-text-tertiary);
541
+ }
542
+
543
+ .crewlet-chart-tooltip__rows {
544
+ display: flex;
545
+ flex-direction: column;
546
+ gap: var(--spacing-1);
547
+ margin: 0;
548
+ padding: 0;
549
+ list-style: none;
550
+ }
551
+
552
+ .crewlet-chart-tooltip__row,
553
+ .crewlet-chart-tooltip__total {
554
+ display: flex;
555
+ align-items: center;
556
+ gap: var(--spacing-2);
557
+ margin: 0;
558
+ }
559
+
560
+ /* The key to the series: a swatch, drawn as the legend's is. It is the one
561
+ place a data hue appears in the tooltip, and it is a mark, never a word. */
562
+ .crewlet-chart-tooltip__swatch {
563
+ width: 8px;
564
+ height: 8px;
565
+ flex: none;
566
+ border-radius: calc(var(--radius-xs) / 2);
567
+ background: var(--crewlet-chart-tooltip-swatch-color, var(--color-data-other));
568
+ }
569
+
570
+ .crewlet-chart-tooltip__name {
571
+ flex: 1;
572
+ min-width: 0;
573
+ color: var(--color-text-secondary);
574
+ }
575
+
576
+ .crewlet-chart-tooltip__value {
577
+ color: var(--color-text-primary);
578
+ font-variant-numeric: tabular-nums;
579
+ }
580
+
581
+ .crewlet-chart-tooltip__total {
582
+ padding-top: var(--spacing-1);
583
+ border-top: 1px solid var(--color-border-default);
584
+ }
585
+
586
+ .crewlet-chart-tooltip__total .crewlet-chart-tooltip__value {
587
+ font-weight: var(--font-weight-semibold);
588
+ }
589
+
590
+ /* ─── Activity strip ──────────────────────────────────────────── */
591
+ .crewlet-activity-strip {
592
+ display: flex;
593
+ align-items: flex-end;
594
+ gap: var(--crewlet-activity-strip-gap, 2px);
595
+ height: var(--crewlet-activity-strip-height, 26px);
596
+ width: 100%;
597
+ }
598
+
599
+ .crewlet-activity-strip__cell {
600
+ flex: 1;
601
+ min-width: var(--crewlet-activity-strip-cell-min-width, 2px);
602
+ height: var(--crewlet-activity-strip-fill, 10%);
603
+ /*
604
+ * A quarter of the smallest step. A cell is two pixels wide, so at the step
605
+ * itself every mark was a capsule and the strip read as a row of pills
606
+ * rather than as a shape.
607
+ */
608
+ border-radius: calc(var(--radius-xs) / 4);
609
+ /* An empty bucket is a neutral hairline: the bucket happened, and nothing
610
+ happened in it. That is a different fact from a quiet one, so it takes a
611
+ different colour rather than a fainter version of the same one. */
612
+ background: var(--color-border-default);
613
+ }
614
+
615
+ .crewlet-activity-strip__cell.is-active {
616
+ background: var(--color-data-1);
617
+ }
618
+
619
+ /* ─── Time series, and the sparkline beside a number ──────────── */
620
+
621
+ /*
622
+ * The plot fills the width it is given and does not clip: a line that touches
623
+ * the top of its own box is a peak, and a box that clipped it would silently
624
+ * flatten exactly the moment a reader is looking for.
625
+ */
626
+ .crewlet-time-series {
627
+ margin: 0;
628
+ min-width: 0;
629
+ }
630
+
631
+ .crewlet-chart {
632
+ display: block;
633
+ width: 100%;
634
+ overflow: visible;
635
+ }
636
+
637
+ /* The baseline: a hairline, because it is where the plot sits rather than
638
+ something to read. */
639
+ .crewlet-chart__axis-line {
640
+ stroke: var(--color-border-default);
641
+ stroke-width: 1;
642
+ }
643
+
644
+ /*
645
+ * The grid is DASHED, which is what keeps three horizontal lines from reading
646
+ * as three series. They carry no values of their own: the peak under the plot
647
+ * is the scale, and a chart this size cannot label four gridlines legibly.
648
+ */
649
+ .crewlet-chart__grid-line {
650
+ stroke: var(--color-border-default);
651
+ stroke-width: 1;
652
+ stroke-dasharray: 2 4;
653
+ }
654
+
655
+ /*
656
+ * The series line. It is painted with the colour passed on the element,
657
+ * because a series' hue is data rather than style; the shape of the stroke is
658
+ * the one thing that is the same for all of them. Two pixels, which is what a
659
+ * line a reader follows across a plot is drawn at; a sparkline's quieter
660
+ * stroke is its own, below.
661
+ */
662
+ .crewlet-chart__series {
663
+ fill: none;
664
+ stroke-width: 2;
665
+ stroke-linejoin: round;
666
+ stroke-linecap: round;
667
+ }
668
+
669
+ /* The reading's crosshair: a hairline in the strong border, from the top of
670
+ the plot to its baseline, on the instant being read. */
671
+ .crewlet-chart__crosshair {
672
+ stroke: var(--color-border-strong);
673
+ stroke-width: 1;
674
+ pointer-events: none;
675
+ }
676
+
677
+ /* The window's two ends and its peak, under the plot: the scale, as words. */
678
+ .crewlet-time-series__scale {
679
+ display: flex;
680
+ justify-content: space-between;
681
+ gap: var(--spacing-2);
682
+ min-width: 0;
683
+ font-size: var(--font-size-xs);
684
+ color: var(--color-text-tertiary);
685
+ font-variant-numeric: tabular-nums;
686
+ }
687
+
688
+ /*
689
+ * THE SPARKLINE: the plot stretched to the box, and, with `current`, one
690
+ * accent point on the last value.
691
+ *
692
+ * The point is the approved design's: an accent disc 5px across, cut out of
693
+ * the ground by a 2px ring in that ground's colour, so where the line runs
694
+ * into it the line stops a ring short of the disc rather than crossing it.
695
+ * The ring is `--crewlet-spark-ground`, the CARD, because a sparkline stands
696
+ * beside a number on a card; one on another rung sets the variable.
697
+ *
698
+ * THE PLOT GIVES UP ITS END TO THE POINT. With a point, the box keeps the
699
+ * disc's half and its ring back at its inline end, so the whole point stands
700
+ * inside the box beside whatever follows it, and the line's last value lands
701
+ * exactly under the disc's centre.
702
+ */
703
+ .crewlet-spark {
704
+ --crewlet-spark-ground: var(--color-surface-subtle);
705
+ --crewlet-spark-point: 5px;
706
+ --crewlet-spark-ring: 2px;
707
+
708
+ position: relative;
709
+ display: block;
710
+ box-sizing: border-box;
711
+ width: 100%;
712
+ overflow: visible;
713
+ }
714
+
715
+ .crewlet-spark__plot {
716
+ display: block;
717
+ width: 100%;
718
+ height: 100%;
719
+ overflow: visible;
720
+ }
721
+
722
+ /* A shape beside a number is drawn quieter than a plot's line: the approved
723
+ design's 1.75 stroke, under the 2 a line across a plot takes. */
724
+ .crewlet-spark__plot .crewlet-chart__series {
725
+ stroke-width: 1.75;
726
+ }
727
+
728
+ .crewlet-spark--current {
729
+ padding-inline-end: calc(var(--crewlet-spark-point) / 2 + var(--crewlet-spark-ring));
730
+ }
731
+
732
+ .crewlet-spark__current {
733
+ position: absolute;
734
+ inset-inline-end: var(--crewlet-spark-ring);
735
+ width: var(--crewlet-spark-point);
736
+ height: var(--crewlet-spark-point);
737
+ border-radius: var(--radius-circle);
738
+ background: var(--color-brand-accent);
739
+ box-shadow: 0 0 0 var(--crewlet-spark-ring) var(--crewlet-spark-ground);
740
+ transform: translateY(-50%);
741
+ pointer-events: none;
742
+ }