@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.
- package/README.md +888 -24
- package/dist/Accordion/index.js +2 -2
- package/dist/AddPill/index.js +1 -1
- package/dist/{AddPill-DFWXYLIQ.css → AddPill-IJQYCY6C.css} +9 -0
- package/dist/AppShell/AppShell.d.ts +26 -5
- package/dist/AppShell/index.js +3 -3
- package/dist/{AppShell-NVE6LHNI.css → AppShell-XARELGIH.css} +178 -25
- package/dist/Avatar/Avatar.d.ts +85 -40
- package/dist/Avatar/AvatarStack.d.ts +76 -0
- package/dist/Avatar/index.d.ts +5 -2
- package/dist/Avatar/index.js +1 -1
- package/dist/Avatar-XID7Z74C.css +200 -0
- package/dist/AvatarStack-GEJBNV7E.css +72 -0
- package/dist/BrandLockup/index.js +1 -1
- package/dist/{BrandLockup-6ISDEHPJ.css → BrandLockup-JKGXFCZF.css} +25 -19
- package/dist/Button/Button.d.ts +7 -2
- package/dist/Button/index.js +1 -1
- package/dist/{Button-D4J6B4MA.css → Button-X4B2TJAQ.css} +50 -19
- package/dist/Callout/index.js +1 -1
- package/dist/Canvas/index.js +4 -4
- package/dist/Card/Card.d.ts +9 -5
- package/dist/Card/index.js +1 -1
- package/dist/{Card-RLR254LD.css → Card-GLP7SUV6.css} +25 -18
- package/dist/Charts/BarList.d.ts +18 -1
- package/dist/Charts/ChartTooltip.d.ts +68 -0
- package/dist/Charts/StackedBar.d.ts +25 -7
- package/dist/Charts/StackedColumns.d.ts +112 -0
- package/dist/Charts/TimeSeries.d.ts +33 -2
- package/dist/Charts/dataColor.d.ts +22 -14
- package/dist/Charts/index.d.ts +6 -0
- package/dist/Charts/index.js +1 -1
- package/dist/Charts/useChartHover.d.ts +56 -0
- package/dist/Charts-B3YEF7R4.css +742 -0
- package/dist/Checkbox/index.js +1 -1
- package/dist/{Checkbox-VGW26YLQ.css → Checkbox-BOXQ747I.css} +2 -2
- package/dist/CodeBlock/index.js +4 -4
- package/dist/Combobox/index.js +5 -5
- package/dist/CommandPalette/CommandPalette.d.ts +97 -6
- package/dist/CommandPalette/index.d.ts +1 -1
- package/dist/CommandPalette/index.js +9 -7
- package/dist/CommandPalette-C5AMKGN2.css +259 -0
- package/dist/Copyable/index.js +3 -3
- package/dist/DataTable/index.js +7 -7
- package/dist/{DataTable-ITNACQ2X.css → DataTable-OLHPF7D4.css} +44 -43
- package/dist/DataView/index.js +14 -14
- package/dist/{DataView-256YF32J.css → DataView-N6JX464S.css} +5 -4
- package/dist/DateTimePicker/index.js +5 -5
- package/dist/DiffList/index.js +1 -1
- package/dist/Disclosure/index.js +2 -2
- package/dist/EntityChip/EntityChip.d.ts +9 -12
- package/dist/EntityChip/index.d.ts +1 -1
- package/dist/EntityChip/index.js +2 -2
- package/dist/ErrorBoundary/index.js +2 -2
- package/dist/{ErrorBoundary-ME36CQTA.css → ErrorBoundary-U2PA3LY2.css} +4 -4
- package/dist/IconButton/index.js +1 -1
- package/dist/{IconButton-VQGNMJDI.css → IconButton-TVEUWK6L.css} +2 -2
- package/dist/ImageUpload/ImageUpload.d.ts +10 -7
- package/dist/ImageUpload/index.js +2 -2
- package/dist/{ImageUpload-HKFIZR6D.css → ImageUpload-YCHJMUGX.css} +24 -10
- package/dist/Input/index.js +2 -2
- package/dist/Kbd/Kbd.d.ts +14 -4
- package/dist/Kbd/index.js +1 -1
- package/dist/Kbd-JPLDVJIP.css +71 -0
- package/dist/Layer/index.js +1 -1
- package/dist/Link/index.js +1 -1
- package/dist/List/index.js +1 -1
- package/dist/{List-XTHESXLR.css → List-MYJIV6MP.css} +12 -2
- package/dist/ListInput/index.js +5 -5
- package/dist/Listbox/index.js +2 -2
- package/dist/Listbox/useListbox.d.ts +16 -0
- package/dist/Listbox/useOptionKeys.d.ts +12 -1
- package/dist/{Listbox-X2DOTSQA.css → Listbox-6WJNJQVQ.css} +60 -7
- package/dist/Menu/index.js +4 -4
- package/dist/{Menu-6DE7I66I.css → Menu-BT5PMFJI.css} +15 -0
- package/dist/Meter/Meter.d.ts +103 -16
- package/dist/Meter/index.d.ts +2 -2
- package/dist/Meter/index.js +1 -1
- package/dist/{Meter-SKOOXQBC.css → Meter-5VCSFMZW.css} +46 -7
- package/dist/Modal/index.js +4 -4
- package/dist/{Modal-XYQJ4BL6.css → Modal-JAYBS2KS.css} +13 -4
- package/dist/OrgLabel/OrgLabel.d.ts +60 -24
- package/dist/OrgLabel/index.d.ts +1 -1
- package/dist/OrgLabel/index.js +2 -1
- package/dist/{OrgLabel-D7U6QJZD.css → OrgLabel-CR233G34.css} +9 -18
- package/dist/OrgNode/index.js +3 -2
- package/dist/OrgTable/OrgTable.d.ts +2 -2
- package/dist/OrgTable/index.js +8 -7
- package/dist/Popover/index.js +2 -2
- package/dist/PricingCard/index.js +3 -3
- package/dist/{PricingCard-JFI7RYXP.css → PricingCard-7EFXRSD2.css} +4 -5
- package/dist/SearchTrigger/SearchTrigger.d.ts +23 -4
- package/dist/SearchTrigger/index.d.ts +1 -1
- package/dist/SearchTrigger/index.js +1 -1
- package/dist/SearchTrigger-Z5D4AAY7.css +112 -0
- package/dist/SegmentedControl/index.js +2 -2
- package/dist/SegmentedMeter/SegmentedMeter.d.ts +107 -0
- package/dist/SegmentedMeter/index.d.ts +3 -0
- package/dist/SegmentedMeter/index.js +2 -0
- package/dist/SegmentedMeter-KQNML2TW.css +109 -0
- package/dist/Select/index.js +3 -3
- package/dist/{Select-2X77FSWR.css → Select-E24U5LBC.css} +34 -0
- package/dist/Shortcut/index.js +2 -2
- package/dist/SidebarNav/SidebarNav.d.ts +85 -25
- package/dist/SidebarNav/index.d.ts +1 -1
- package/dist/SidebarNav/index.js +1 -1
- package/dist/SidebarNav-X5NLZNWA.css +424 -0
- package/dist/StatCard/StatCard.d.ts +59 -12
- package/dist/StatCard/index.d.ts +1 -1
- package/dist/StatCard/index.js +1 -1
- package/dist/StatCard-KPAFD4E2.css +204 -0
- package/dist/StatGroup/index.js +1 -1
- package/dist/{StatGroup-TGB6AEKM.css → StatGroup-HVG6O62W.css} +8 -9
- package/dist/StatusDot/StatusDot.d.ts +24 -6
- package/dist/StatusDot/index.js +1 -1
- package/dist/StatusDot-7OMCQCZF.css +186 -0
- package/dist/Stepper/Stepper.d.ts +78 -0
- package/dist/Stepper/index.d.ts +3 -0
- package/dist/Stepper/index.js +4 -0
- package/dist/Stepper-HW4JM3YH.css +176 -0
- package/dist/Table/index.js +1 -1
- package/dist/{Table-MDOLVUAW.css → Table-TGCS4C3F.css} +14 -4
- package/dist/Tabs/index.js +1 -1
- package/dist/{Tabs-VLICJFVB.css → Tabs-XCNPHA7B.css} +79 -27
- package/dist/Tag/Tag.d.ts +29 -22
- package/dist/Tag/index.js +2 -2
- package/dist/{Tag-VNZEYLB6.css → Tag-GBE7LQJP.css} +82 -83
- package/dist/TagsInput/index.js +6 -6
- package/dist/ThemeSwitcher/ThemeSwitcher.d.ts +53 -21
- package/dist/ThemeSwitcher/index.d.ts +3 -3
- package/dist/ThemeSwitcher/index.js +4 -3
- package/dist/ThemeSwitcher/preferences.d.ts +19 -5
- package/dist/ThemeToggle/ThemeToggle.d.ts +40 -0
- package/dist/ThemeToggle/index.d.ts +2 -0
- package/dist/ThemeToggle/index.js +5 -0
- package/dist/TimeWindowPicker/index.js +8 -8
- package/dist/Toaster/index.js +2 -2
- package/dist/Toolbar/index.js +2 -2
- package/dist/{Toolbar-IP6LXN45.css → Toolbar-HUOSMNTH.css} +3 -1
- package/dist/Tooltip/index.js +2 -2
- package/dist/Tree/index.d.ts +2 -2
- package/dist/Tree/index.js +1 -1
- package/dist/Tree/layout.d.ts +103 -28
- package/dist/TreeCanvas/TreeCanvas.d.ts +60 -14
- package/dist/TreeCanvas/index.d.ts +1 -1
- package/dist/TreeCanvas/index.js +6 -6
- package/dist/TreeCanvas/motion.d.ts +3 -2
- package/dist/{TreeCanvas-WBNQPHC7.css → TreeCanvas-HVOV4SQN.css} +154 -30
- package/dist/TreeGrid/index.js +4 -4
- package/dist/{chunk-F6OE5FH3.js → chunk-2FPENTCF.js} +1 -1
- package/dist/chunk-4AK52VHB.js +88 -0
- package/dist/{chunk-7EM5T4ME.js → chunk-4IQD3HUQ.js} +2 -2
- package/dist/{chunk-YODNNSZL.js → chunk-4PZ6FJKW.js} +43 -13
- package/dist/{chunk-F27EPQ7D.js → chunk-4UQ7SMPK.js} +1 -1
- package/dist/chunk-5QWIJSQM.js +73 -0
- package/dist/{chunk-GTOUGQQK.js → chunk-6MU7HNB4.js} +13 -10
- package/dist/{chunk-S2XHHEW4.js → chunk-74KMX7YH.js} +4 -4
- package/dist/{chunk-WNI2WSJF.js → chunk-7KBNFFM3.js} +1 -1
- package/dist/{chunk-DD5BBGBE.js → chunk-AUS5FNQE.js} +9 -5
- package/dist/{chunk-CMEE37QJ.js → chunk-BMYPGGPV.js} +4 -4
- package/dist/{chunk-H4FBTAYS.js → chunk-BNCCEER3.js} +8 -8
- package/dist/chunk-C5WJUZVR.js +56 -0
- package/dist/{chunk-5WS6L6FA.js → chunk-CAIHUYXV.js} +9 -9
- package/dist/{chunk-XV6WRMBC.js → chunk-CQY5NTRS.js} +4 -1
- package/dist/{chunk-UOGSZKLT.js → chunk-D6EVJUGU.js} +2 -2
- package/dist/{chunk-6ZFVFA56.js → chunk-DHPUMOTX.js} +2 -2
- package/dist/{chunk-HZ5XZNPS.js → chunk-DS2C73RJ.js} +3 -3
- package/dist/{chunk-O6232G37.js → chunk-DSUY5F4E.js} +17 -5
- package/dist/{chunk-Q4ZPPART.js → chunk-EFYPAJT3.js} +3 -3
- package/dist/{chunk-WQX73TWF.js → chunk-ERVO6OUF.js} +18 -17
- package/dist/{chunk-BZYDZBAN.js → chunk-ETYEBKR4.js} +3 -3
- package/dist/{chunk-34VGEDVV.js → chunk-FD5UEN6X.js} +30 -30
- package/dist/{chunk-5SDBMKUO.js → chunk-FIFNP6PL.js} +3 -3
- package/dist/{chunk-7HPRF5XN.js → chunk-FUF52K7E.js} +98 -16
- package/dist/{chunk-5KPQ6D7N.js → chunk-FZVJDJFN.js} +2 -2
- package/dist/chunk-IA232OTU.js +156 -0
- package/dist/{chunk-2EOKFKHX.js → chunk-IG27QX7Q.js} +7 -7
- package/dist/chunk-IKB6HFGK.js +55 -0
- package/dist/{chunk-FBZAKNSX.js → chunk-IPVQKAHO.js} +10 -7
- package/dist/{chunk-3EYF6HKB.js → chunk-IVFJD7WY.js} +28 -9
- package/dist/{chunk-WOYYD2YR.js → chunk-JGRNTBF2.js} +11 -11
- package/dist/chunk-K3OWD7BJ.js +121 -0
- package/dist/{chunk-BJSKPEZI.js → chunk-KD4H66L6.js} +7 -20
- package/dist/{chunk-SFZOKW2G.js → chunk-KJ34ZBBI.js} +8 -3
- package/dist/{chunk-HQNHV7D6.js → chunk-LFHCXZO5.js} +6 -6
- package/dist/{chunk-LWKJQTOM.js → chunk-MICH6QSJ.js} +1 -1
- package/dist/chunk-N3DPO6HG.js +226 -0
- package/dist/{chunk-S4GZWSKR.js → chunk-OM5E3TTK.js} +1 -1
- package/dist/{chunk-3QRYCPXQ.js → chunk-OPKIKM35.js} +6 -6
- package/dist/{chunk-5EKIWVOR.js → chunk-PGRPNDWM.js} +2 -2
- package/dist/{chunk-LFJ6UJTI.js → chunk-PQNILU27.js} +9 -9
- package/dist/{chunk-QNCVHRZL.js → chunk-QVAFL2LE.js} +1 -1
- package/dist/{chunk-QEUY3A5P.js → chunk-QY7UU5ZB.js} +3 -2
- package/dist/{chunk-ITHXJHBB.js → chunk-R25RGPUB.js} +1 -0
- package/dist/{chunk-KLJCCMF3.js → chunk-R6735B37.js} +2 -2
- package/dist/{chunk-3ZP55QZE.js → chunk-R6FBDTP3.js} +4 -4
- package/dist/{chunk-7FZ53WDJ.js → chunk-RIAZM6L3.js} +1 -1
- package/dist/chunk-RJM4QCGG.js +550 -0
- package/dist/{chunk-NTRZGNEX.js → chunk-S3BCVWTU.js} +215 -46
- package/dist/chunk-S7KW47IQ.js +121 -0
- package/dist/{chunk-OFHBK7RI.js → chunk-SJQ546ID.js} +34 -14
- package/dist/{chunk-D35VTV2Z.js → chunk-SV7QAONL.js} +1 -1
- package/dist/{chunk-IAJLHVUA.js → chunk-TIWAHZZ6.js} +1 -1
- package/dist/{chunk-2PRH365R.js → chunk-UA7O3KKJ.js} +1 -1
- package/dist/{chunk-NPZY6YYL.js → chunk-UG5ZMAXW.js} +6 -6
- package/dist/{chunk-FEFTGVMF.js → chunk-V2N3BMOT.js} +7 -2
- package/dist/{chunk-NDCATSW7.js → chunk-V34H2YCY.js} +1 -1
- package/dist/chunk-WIATRXEJ.js +22 -0
- package/dist/{chunk-5C5YMZQU.js → chunk-WOFOMTGB.js} +16 -10
- package/dist/{chunk-QYOFACSP.js → chunk-WSOFKOLP.js} +3 -3
- package/dist/{chunk-MNAXYY3R.js → chunk-WUVZDFHS.js} +31 -11
- package/dist/{chunk-UG46QBLT.js → chunk-YIMOT5OO.js} +10 -10
- package/dist/{chunk-2ZQMA2WB.js → chunk-ZPSOF6VL.js} +2 -2
- package/dist/generated/index.d.ts +3 -0
- package/dist/generated/index.js +66 -62
- package/dist/index.js +66 -62
- package/dist/styles.css +2719 -799
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/tone.d.ts +7 -12
- package/package.json +4 -4
- package/scripts/check-css-literals.mjs +159 -23
- package/scripts/check-css-variables.mjs +5 -3
- package/scripts/css-source.mjs +97 -5
- package/dist/Avatar-P2KRQM2B.css +0 -156
- package/dist/Charts-D7G2BSXH.css +0 -277
- package/dist/CommandPalette-CSJDUCQA.css +0 -115
- package/dist/Kbd-W66MXQI5.css +0 -61
- package/dist/SearchTrigger-QXOYAUUY.css +0 -79
- package/dist/SidebarNav-QGSFKZYA.css +0 -319
- package/dist/StatCard-KYPKZUWX.css +0 -111
- package/dist/StatusDot-HA2L2FSX.css +0 -84
- package/dist/chunk-22O7LAW2.js +0 -41
- package/dist/chunk-2HQR4U4D.js +0 -143
- package/dist/chunk-ESCO4XYW.js +0 -144
- package/dist/chunk-F4PJZ4ED.js +0 -245
- package/dist/chunk-PNFASD6F.js +0 -98
- package/dist/chunk-PZSWF74H.js +0 -15
- /package/dist/{chunk-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
|
+
}
|