@crewlethq/ui 0.12.0 → 0.14.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 (157) hide show
  1. package/README.md +82 -5
  2. package/dist/AppShell/index.js +2 -1
  3. package/dist/Avatar/index.js +1 -1
  4. package/dist/{Avatar-QHYOFID3.css → Avatar-BPJ36QZR.css} +1 -1
  5. package/dist/AvatarPicker/index.js +5 -5
  6. package/dist/Breadcrumb/Breadcrumb.d.ts +68 -0
  7. package/dist/Breadcrumb/index.d.ts +3 -0
  8. package/dist/Breadcrumb/index.js +3 -0
  9. package/dist/Breadcrumb-YMWVM3SV.css +193 -0
  10. package/dist/ChoiceButtons/ChoiceButtons.d.ts +43 -0
  11. package/dist/ChoiceButtons/index.d.ts +3 -0
  12. package/dist/ChoiceButtons/index.js +3 -0
  13. package/dist/ChoiceButtons-DJ5EOGUA.css +127 -0
  14. package/dist/Combobox/index.js +2 -2
  15. package/dist/CommandPalette/CommandPalette.d.ts +48 -1
  16. package/dist/CommandPalette/index.js +3 -3
  17. package/dist/{CommandPalette-C5AMKGN2.css → CommandPalette-HBTNKHZQ.css} +55 -2
  18. package/dist/DataTable/index.js +4 -4
  19. package/dist/DataView/index.js +11 -11
  20. package/dist/DateTimePicker/index.js +2 -2
  21. package/dist/{DateTimePicker-4AZBTODT.css → DateTimePicker-NJ6XH2TE.css} +4 -3
  22. package/dist/Document/Document.d.ts +56 -0
  23. package/dist/Document/index.d.ts +3 -0
  24. package/dist/Document/index.js +2 -0
  25. package/dist/Document-PQGXJHB7.css +288 -0
  26. package/dist/EntityChip/index.js +1 -1
  27. package/dist/Highlight/Highlight.d.ts +45 -0
  28. package/dist/Highlight/index.d.ts +3 -0
  29. package/dist/Highlight/index.js +2 -0
  30. package/dist/Highlight-DXLV2R6L.css +29 -0
  31. package/dist/HuePicker/index.js +3 -3
  32. package/dist/ImageUpload/index.js +2 -2
  33. package/dist/{ImageUpload-L2GE4JUM.css → ImageUpload-NVGMN7DP.css} +9 -6
  34. package/dist/InboxList/InboxList.d.ts +116 -0
  35. package/dist/InboxList/index.d.ts +3 -0
  36. package/dist/InboxList/index.js +5 -0
  37. package/dist/InboxList-YMFWKGGS.css +252 -0
  38. package/dist/KeyChip/KeyChip.d.ts +21 -0
  39. package/dist/KeyChip/index.d.ts +3 -0
  40. package/dist/KeyChip/index.js +2 -0
  41. package/dist/KeyChip-4XJU4BBE.css +30 -0
  42. package/dist/Link/Link.d.ts +17 -2
  43. package/dist/Link/index.js +1 -1
  44. package/dist/{Link-6BEFNMN2.css → Link-WPMVLKLY.css} +36 -1
  45. package/dist/Listbox/index.d.ts +2 -0
  46. package/dist/Listbox/index.js +1 -1
  47. package/dist/Listbox/useHighlightRest.d.ts +35 -0
  48. package/dist/MarkdownEditor/MarkdownEditor.d.ts +93 -0
  49. package/dist/MarkdownEditor/format.d.ts +34 -0
  50. package/dist/MarkdownEditor/index.d.ts +5 -0
  51. package/dist/MarkdownEditor/index.js +12 -0
  52. package/dist/MarkdownEditor-ZLSHTOIZ.css +146 -0
  53. package/dist/Modal/Modal.d.ts +5 -1
  54. package/dist/Modal/index.js +1 -1
  55. package/dist/{Modal-BNT3TDV2.css → Modal-RQAYGG4L.css} +34 -1
  56. package/dist/OrgLabel/index.js +1 -1
  57. package/dist/OrgNode/index.js +1 -1
  58. package/dist/OrgTable/index.js +4 -4
  59. package/dist/Outline/Outline.d.ts +72 -0
  60. package/dist/Outline/index.d.ts +3 -0
  61. package/dist/Outline/index.js +2 -0
  62. package/dist/Outline-VCXKKU3E.css +78 -0
  63. package/dist/Popover/Popover.d.ts +21 -1
  64. package/dist/Popover/index.js +1 -1
  65. package/dist/ReadingPane/ReadingPane.d.ts +95 -0
  66. package/dist/ReadingPane/index.d.ts +3 -0
  67. package/dist/ReadingPane/index.js +4 -0
  68. package/dist/ReadingPane-5UOLPWY5.css +194 -0
  69. package/dist/SegmentedControl/SegmentedControl.d.ts +9 -1
  70. package/dist/SegmentedControl/index.js +3 -3
  71. package/dist/{SegmentedControl-76HODRBT.css → SegmentedControl-PKBLJVSA.css} +18 -0
  72. package/dist/Select/Select.d.ts +22 -0
  73. package/dist/Select/index.js +2 -2
  74. package/dist/{Select-4ANVLHUY.css → Select-2P7AWUE4.css} +56 -6
  75. package/dist/SidebarNav/index.js +2 -1
  76. package/dist/{SidebarNav-X5NLZNWA.css → SidebarNav-KF66MLOM.css} +4 -19
  77. package/dist/Switcher/Switcher.d.ts +151 -0
  78. package/dist/Switcher/index.d.ts +3 -0
  79. package/dist/Switcher/index.js +16 -0
  80. package/dist/Switcher-B44Q4WF4.css +346 -0
  81. package/dist/Tabs/Tabs.d.ts +7 -1
  82. package/dist/Tabs/index.js +1 -1
  83. package/dist/{Tabs-5I5Q5KKM.css → Tabs-ITJYJFMU.css} +49 -0
  84. package/dist/TagsInput/index.js +2 -2
  85. package/dist/ThemeGallery/ThemeGallery.d.ts +65 -0
  86. package/dist/ThemeGallery/index.d.ts +3 -0
  87. package/dist/ThemeGallery/index.js +6 -0
  88. package/dist/ThemeGallery-NITASULQ.css +93 -0
  89. package/dist/ThemeSwatch/ThemeSwatch.d.ts +71 -0
  90. package/dist/ThemeSwatch/index.d.ts +3 -0
  91. package/dist/ThemeSwatch/index.js +2 -0
  92. package/dist/ThemeSwatch-4DL457ZB.css +256 -0
  93. package/dist/ThemeSwitcher/ThemeSwitcher.d.ts +5 -1
  94. package/dist/ThemeSwitcher/index.js +4 -4
  95. package/dist/ThemeToggle/ThemeToggle.d.ts +1 -1
  96. package/dist/ThemeToggle/index.js +1 -1
  97. package/dist/TimeWindowPicker/index.js +4 -4
  98. package/dist/{TimeWindowPicker-GBF4JDFI.css → TimeWindowPicker-BZ5HHATU.css} +5 -4
  99. package/dist/Toaster/index.js +1 -1
  100. package/dist/{Toaster-NVDCEIP5.css → Toaster-VZKISP2S.css} +81 -87
  101. package/dist/Tree/index.d.ts +1 -1
  102. package/dist/Tree/index.js +1 -1
  103. package/dist/Tree/useTreeState.d.ts +37 -7
  104. package/dist/TreeCanvas/index.js +2 -2
  105. package/dist/TreeGrid/TreeGrid.d.ts +22 -2
  106. package/dist/TreeGrid/index.js +2 -2
  107. package/dist/{TreeGrid-NSW7VMOX.css → TreeGrid-FBX3MSJA.css} +19 -0
  108. package/dist/{chunk-EBBAAQDY.js → chunk-26PEPONN.js} +3 -1
  109. package/dist/{chunk-GOUKOXJK.js → chunk-3VVKJ7AZ.js} +3 -3
  110. package/dist/{chunk-HV6IZFBK.js → chunk-4FFHJBEN.js} +2 -2
  111. package/dist/{chunk-JHQUT4WJ.js → chunk-4LDTQWS7.js} +1 -1
  112. package/dist/{chunk-GXYNEDNA.js → chunk-4Y7WKXAW.js} +1 -1
  113. package/dist/{chunk-IINFVK3W.js → chunk-5IXMLWGW.js} +6 -6
  114. package/dist/{chunk-MCPKHYMC.js → chunk-6LXMLQUM.js} +17 -4
  115. package/dist/{chunk-3UK4VFSK.js → chunk-6NIZCQUM.js} +1 -1
  116. package/dist/{chunk-ORNOOMVY.js → chunk-6TSZCBID.js} +2 -2
  117. package/dist/{chunk-ZMJHK7DR.js → chunk-75WOCYGC.js} +2 -2
  118. package/dist/chunk-77IEHFY4.js +299 -0
  119. package/dist/chunk-A5YKNRG6.js +94 -0
  120. package/dist/{chunk-JCNUQ3US.js → chunk-AXNQCAFC.js} +2 -2
  121. package/dist/{chunk-UG5ZMAXW.js → chunk-CBZSSKH3.js} +5 -5
  122. package/dist/{chunk-LAQK4V3Z.js → chunk-DJMLHCLD.js} +1 -1
  123. package/dist/{chunk-6MU7HNB4.js → chunk-F73MC7EZ.js} +47 -2
  124. package/dist/{chunk-ZPSOF6VL.js → chunk-FBSEJO2C.js} +1 -1
  125. package/dist/chunk-FYTIJM2T.js +40 -0
  126. package/dist/chunk-H6VKCIWV.js +41 -0
  127. package/dist/{chunk-HLBRPES3.js → chunk-IFM63LAG.js} +3 -3
  128. package/dist/chunk-IG75YMUN.js +22 -0
  129. package/dist/{chunk-SEFMO2EV.js → chunk-IXUU5DLZ.js} +55 -6
  130. package/dist/{chunk-ZHOM65MI.js → chunk-JCO3SIST.js} +1 -1
  131. package/dist/chunk-KLIEPFEZ.js +95 -0
  132. package/dist/{chunk-7LD6P32I.js → chunk-L3CTFFLZ.js} +2 -18
  133. package/dist/chunk-MNFU2RNT.js +74 -0
  134. package/dist/{chunk-S3BCVWTU.js → chunk-MY374UUD.js} +49 -31
  135. package/dist/{chunk-K5Q2DK3P.js → chunk-NXDEPUVG.js} +1 -1
  136. package/dist/{chunk-PDUZO35I.js → chunk-O2ZDZZS7.js} +15 -6
  137. package/dist/{chunk-5WEVLIB6.js → chunk-RZ7RGECB.js} +1 -1
  138. package/dist/{chunk-WEIINZPA.js → chunk-SBRE7IML.js} +6 -2
  139. package/dist/{chunk-TEEJSTFG.js → chunk-TFMJH2E6.js} +1 -1
  140. package/dist/{chunk-IVFJD7WY.js → chunk-UCCC7YVZ.js} +3 -2
  141. package/dist/chunk-VWNC2L6W.js +110 -0
  142. package/dist/chunk-VYY56AMX.js +2 -0
  143. package/dist/chunk-WI6K5M5X.js +24 -0
  144. package/dist/{chunk-XV65NTIT.js → chunk-WYQOHFML.js} +94 -41
  145. package/dist/chunk-XYCADWZN.js +100 -0
  146. package/dist/chunk-Y6NR7QJ3.js +336 -0
  147. package/dist/chunk-YSJC7AZC.js +62 -0
  148. package/dist/chunk-ZAJHGDAW.js +93 -0
  149. package/dist/generated/index.d.ts +12 -0
  150. package/dist/generated/index.js +64 -51
  151. package/dist/index.js +64 -51
  152. package/dist/styles.css +2711 -402
  153. package/dist/utils/highlight.d.ts +17 -0
  154. package/dist/utils/useMediaMatch.d.ts +12 -0
  155. package/package.json +3 -3
  156. package/dist/chunk-UAQIUSSK.js +0 -2
  157. /package/dist/{chunk-74OVQWA5.js → chunk-6AR2T5Y4.js} +0 -0
@@ -0,0 +1,93 @@
1
+ /*
2
+ * The gallery of themes: each group's heading over a grid of cards.
3
+ *
4
+ * A ROW HOLDS THE SAME NUMBER OF CARDS IN EVERY GROUP (`columns`, three by
5
+ * default), so a group of one draws a card the size of every other card
6
+ * rather than one stretched across the row, and the swatches line up from
7
+ * group to group.
8
+ */
9
+
10
+ .crewlet-theme-gallery__groups {
11
+ display: flex;
12
+ flex-direction: column;
13
+ gap: var(--spacing-3);
14
+ }
15
+
16
+ .crewlet-theme-gallery__group {
17
+ display: flex;
18
+ flex-direction: column;
19
+ gap: var(--spacing-1);
20
+ }
21
+
22
+ .crewlet-theme-gallery__heading {
23
+ color: var(--color-text-tertiary);
24
+ font-size: var(--font-size-2xs);
25
+ line-height: var(--font-line-height-normal);
26
+ }
27
+
28
+ .crewlet-theme-gallery__cards {
29
+ display: grid;
30
+ grid-template-columns: repeat(var(--crewlet-theme-gallery-columns), minmax(0, 1fr));
31
+ gap: var(--spacing-2);
32
+ }
33
+
34
+ /*
35
+ * A CARD IS ITS BORDER. Resting, the plain hairline; under the pointer, the
36
+ * strong one; chosen, the accent. One line round the card in every state, so
37
+ * the chosen card is never a card inside a frame.
38
+ */
39
+ .crewlet-theme-gallery__card {
40
+ display: flex;
41
+ flex-direction: column;
42
+ gap: var(--spacing-1);
43
+ min-width: 0;
44
+ padding: var(--spacing-2);
45
+ border: 1px solid var(--color-border-default);
46
+ border-radius: var(--radius-md);
47
+ background: var(--color-surface-subtle);
48
+ color: var(--color-text-primary);
49
+ font: inherit;
50
+ text-align: left;
51
+ cursor: pointer;
52
+ }
53
+
54
+ /* Not on the chosen card: under the pointer it keeps the accent, or the one
55
+ card that says "this one" would stop saying it while it is being pointed at. */
56
+ .crewlet-theme-gallery__card:hover:not(:disabled):not(.is-chosen) {
57
+ border-color: var(--color-border-strong);
58
+ }
59
+
60
+ .crewlet-theme-gallery__card.is-chosen {
61
+ border-color: var(--color-brand-accent);
62
+ }
63
+
64
+ /* The ring is drawn OVER the border, inset by its width, never a second line outside it. */
65
+ .crewlet-theme-gallery__card:focus-visible {
66
+ outline: 2px solid var(--color-focus);
67
+ outline-offset: -1px;
68
+ }
69
+
70
+ .crewlet-theme-gallery__card:disabled {
71
+ cursor: not-allowed;
72
+ opacity: 0.5;
73
+ }
74
+
75
+ .crewlet-theme-gallery__name {
76
+ overflow: hidden;
77
+ font-size: var(--font-size-xs);
78
+ font-weight: var(--font-weight-medium);
79
+ line-height: var(--font-line-height-tight);
80
+ text-overflow: ellipsis;
81
+ white-space: nowrap;
82
+ }
83
+
84
+ /*
85
+ * FORCED COLORS keeps the border and drops the accent, so the chosen card
86
+ * would look like every other; the system's own selected colour says it.
87
+ */
88
+ @media (forced-colors: active) {
89
+ .crewlet-theme-gallery__card.is-chosen {
90
+ border-color: Highlight;
91
+ border-width: 2px;
92
+ }
93
+ }
@@ -0,0 +1,71 @@
1
+ import type { HTMLAttributes } from 'react';
2
+ /**
3
+ * The colours a theme's thumbnail is drawn with, in one mode: the shape of a
4
+ * `themeRegistry` entry's `swatch.dark` and `swatch.light` in
5
+ * `@crewlethq/tokens`, which the build reads off the sheet that paints the
6
+ * theme.
7
+ */
8
+ export interface ThemeSwatchColours {
9
+ frame: string;
10
+ sheet: string;
11
+ card: string;
12
+ raised: string;
13
+ hairline: string;
14
+ text: string;
15
+ muted: string;
16
+ accent: string;
17
+ onAccent: string;
18
+ info: string;
19
+ warning: string;
20
+ danger: string;
21
+ success: string;
22
+ }
23
+ /** A theme's two palettes, as its registry entry carries them. */
24
+ export interface ThemeSwatchPair {
25
+ dark: ThemeSwatchColours;
26
+ light: ThemeSwatchColours;
27
+ }
28
+ /**
29
+ * How much of the theme is drawn.
30
+ *
31
+ * `chip` is a mark beside a name in a list: each palette's frame with its
32
+ * accent on it. `card` is a picker's thumbnail: a rail, a sheet and a card
33
+ * with the primary action and the four states. `pane` is the same sketch
34
+ * large enough to read as a screen, for a preview beside a picker.
35
+ */
36
+ export type ThemeSwatchSize = 'chip' | 'card' | 'pane';
37
+ export interface ThemeSwatchProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'children'> {
38
+ /** The theme's colours: a `themeRegistry` entry's `swatch`. */
39
+ swatch: ThemeSwatchPair;
40
+ size?: ThemeSwatchSize | undefined;
41
+ /**
42
+ * One palette alone. Without it both are drawn, dark beside light, which is
43
+ * what a theme IS: a pair the mode chooses between.
44
+ */
45
+ mode?: 'dark' | 'light' | undefined;
46
+ /**
47
+ * Names the drawing as an image. Without one it is decoration and hidden
48
+ * from assistive technology, which is right wherever the theme's name is
49
+ * printed beside it.
50
+ */
51
+ label?: string | undefined;
52
+ }
53
+ /**
54
+ * A theme, drawn from its colours: the thumbnail every theme picker shows.
55
+ *
56
+ * DRAWN FROM THE REGISTRY, NOT FROM THE PAGE. A thumbnail has to show a theme
57
+ * that is NOT on screen, so it cannot read the page's custom properties: it
58
+ * paints each half with its own, set from the colours the build read off the
59
+ * theme's sheet. The outline round it is the page's own hairline, because
60
+ * that is where the thumbnail sits.
61
+ *
62
+ * BOTH MODES BY DEFAULT, dark beside light, because a theme is a pair and the
63
+ * reader's mode is a separate choice: a thumbnail of one half would show a
64
+ * light reader a dark theme they would never see, or hide the half they
65
+ * would. `mode` draws one, for a preview that follows the reader's mode.
66
+ *
67
+ * DECORATION UNLESS NAMED. Wherever the theme's name is printed beside it the
68
+ * drawing says nothing a reader needs; given a `label`, it is an image with
69
+ * that name.
70
+ */
71
+ export declare function ThemeSwatch({ swatch, size, mode, label, className, ...rest }: ThemeSwatchProps): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import './ThemeSwatch.css';
2
+ export { ThemeSwatch } from './ThemeSwatch.js';
3
+ export type { ThemeSwatchColours, ThemeSwatchPair, ThemeSwatchProps, ThemeSwatchSize } from './ThemeSwatch.js';
@@ -0,0 +1,2 @@
1
+ export { ThemeSwatch } from '../chunk-MNFU2RNT.js';
2
+ import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,256 @@
1
+ /*
2
+ * A theme's thumbnail.
3
+ *
4
+ * EVERY COLOUR IS THE THEME'S OWN, from the custom properties ThemeSwatch sets
5
+ * on each half (--crewlet-swatch-*), and none is the page's except the
6
+ * outline, which is the page's hairline because the page is where the
7
+ * thumbnail sits. Two halves share the box equally: dark, then light.
8
+ *
9
+ * IT IS A PICTURE, so forced-colors mode leaves it alone: repainted to the
10
+ * system's two colours, every theme would draw the same blank box.
11
+ */
12
+
13
+ .crewlet-theme-swatch {
14
+ display: grid;
15
+ grid-auto-flow: column;
16
+ grid-auto-columns: minmax(0, 1fr);
17
+ flex: none;
18
+ overflow: hidden;
19
+ border: 1px solid var(--color-border-default);
20
+ forced-color-adjust: none;
21
+ }
22
+
23
+ .crewlet-theme-swatch--chip {
24
+ width: 26px;
25
+ height: 16px;
26
+ border-radius: var(--radius-xs);
27
+ }
28
+
29
+ .crewlet-theme-swatch--card {
30
+ width: 100%;
31
+ height: 38px;
32
+ border-radius: var(--radius-sm);
33
+ }
34
+
35
+ .crewlet-theme-swatch--pane {
36
+ width: 100%;
37
+ aspect-ratio: 4 / 3;
38
+ border-radius: var(--radius-md);
39
+ }
40
+
41
+ .crewlet-theme-swatch__half {
42
+ display: grid;
43
+ grid-template-columns: 26% minmax(0, 1fr);
44
+ min-width: 0;
45
+ background: var(--crewlet-swatch-frame);
46
+ }
47
+
48
+ /* ── The chip: each palette's frame, with its accent on it ────────────── */
49
+
50
+ .crewlet-theme-swatch--chip .crewlet-theme-swatch__half {
51
+ grid-template-columns: none;
52
+ place-items: center;
53
+ }
54
+
55
+ .crewlet-theme-swatch__dot {
56
+ width: 6px;
57
+ height: 6px;
58
+ border-radius: var(--radius-circle);
59
+ background: var(--crewlet-swatch-accent);
60
+ }
61
+
62
+ /* ── The card: a rail, a sheet, a card on it ──────────────────────────── */
63
+
64
+ .crewlet-theme-swatch__rail {
65
+ display: flex;
66
+ flex-direction: column;
67
+ gap: 3px;
68
+ padding: 6px 4px;
69
+ min-width: 0;
70
+ }
71
+
72
+ .crewlet-theme-swatch__rail-row {
73
+ display: block;
74
+ width: 80%;
75
+ height: 3px;
76
+ border-radius: var(--radius-pill);
77
+ background: var(--crewlet-swatch-muted);
78
+ }
79
+
80
+ /* The row the reader is on stands on the raised rung, as the rail draws it. */
81
+ .crewlet-theme-swatch__rail-row.is-current {
82
+ width: 100%;
83
+ height: 6px;
84
+ background: var(--crewlet-swatch-raised);
85
+ }
86
+
87
+ .crewlet-theme-swatch__sheet {
88
+ display: flex;
89
+ flex-direction: column;
90
+ min-width: 0;
91
+ margin: 3px 3px 3px 0;
92
+ padding: 3px;
93
+ border-radius: var(--radius-xs);
94
+ background: var(--crewlet-swatch-sheet);
95
+ }
96
+
97
+ .crewlet-theme-swatch__card {
98
+ display: flex;
99
+ flex: 1;
100
+ flex-direction: column;
101
+ justify-content: space-between;
102
+ min-width: 0;
103
+ padding: 4px;
104
+ border: 1px solid var(--crewlet-swatch-hairline);
105
+ border-radius: var(--radius-xs);
106
+ background: var(--crewlet-swatch-card);
107
+ }
108
+
109
+ .crewlet-theme-swatch__line {
110
+ display: block;
111
+ width: 60%;
112
+ height: 3px;
113
+ border-radius: var(--radius-pill);
114
+ background: var(--crewlet-swatch-text);
115
+ }
116
+
117
+ /*
118
+ * THE ACTION GIVES WAY BEFORE IT DISAPPEARS. A narrow thumbnail has less room
119
+ * than the action and the four states take, so the action narrows to a floor
120
+ * and the row clips its last states, rather than the action, which is what a
121
+ * theme is chosen for, shrinking to nothing.
122
+ */
123
+ .crewlet-theme-swatch__row {
124
+ display: flex;
125
+ align-items: center;
126
+ gap: 2px;
127
+ overflow: hidden;
128
+ }
129
+
130
+ /* The primary action: the accent's fill. */
131
+ .crewlet-theme-swatch__action {
132
+ display: block;
133
+ flex: 0 1 14px;
134
+ min-width: 6px;
135
+ height: 6px;
136
+ margin-right: auto;
137
+ border-radius: var(--radius-pill);
138
+ background: var(--crewlet-swatch-accent);
139
+ }
140
+
141
+ /* The four states, in the order the kit names them. */
142
+ .crewlet-theme-swatch__state {
143
+ display: block;
144
+ flex: none;
145
+ width: 4px;
146
+ height: 4px;
147
+ border-radius: var(--radius-circle);
148
+ }
149
+
150
+ .crewlet-theme-swatch__state--info { background: var(--crewlet-swatch-info); }
151
+ .crewlet-theme-swatch__state--warning { background: var(--crewlet-swatch-warning); }
152
+ .crewlet-theme-swatch__state--danger { background: var(--crewlet-swatch-danger); }
153
+ .crewlet-theme-swatch__state--success { background: var(--crewlet-swatch-success); }
154
+
155
+ /* ── The pane: the same sketch, large enough to read as a screen ───────── */
156
+
157
+ .crewlet-theme-swatch--pane .crewlet-theme-swatch__half {
158
+ grid-template-columns: 26% minmax(0, 1fr);
159
+ }
160
+
161
+ .crewlet-theme-swatch--pane .crewlet-theme-swatch__rail {
162
+ gap: 7px;
163
+ padding: 12px 8px;
164
+ }
165
+
166
+ .crewlet-theme-swatch--pane .crewlet-theme-swatch__rail-row {
167
+ height: 5px;
168
+ }
169
+
170
+ .crewlet-theme-swatch--pane .crewlet-theme-swatch__rail-row.is-current {
171
+ height: 12px;
172
+ border: 1px solid var(--crewlet-swatch-hairline);
173
+ border-radius: var(--radius-xs);
174
+ }
175
+
176
+ .crewlet-theme-swatch--pane .crewlet-theme-swatch__sheet {
177
+ gap: 8px;
178
+ margin: 6px 6px 6px 0;
179
+ padding: 10px;
180
+ border-radius: var(--radius-sm);
181
+ }
182
+
183
+ .crewlet-theme-swatch__title {
184
+ display: block;
185
+ flex: none;
186
+ width: 40%;
187
+ height: 6px;
188
+ border-radius: var(--radius-pill);
189
+ background: var(--crewlet-swatch-text);
190
+ }
191
+
192
+ .crewlet-theme-swatch--pane .crewlet-theme-swatch__card {
193
+ flex: none;
194
+ gap: 7px;
195
+ justify-content: flex-start;
196
+ padding: 8px;
197
+ }
198
+
199
+ .crewlet-theme-swatch__item {
200
+ display: flex;
201
+ align-items: center;
202
+ gap: 6px;
203
+ }
204
+
205
+ .crewlet-theme-swatch--pane .crewlet-theme-swatch__state {
206
+ width: 6px;
207
+ height: 6px;
208
+ }
209
+
210
+ .crewlet-theme-swatch--pane .crewlet-theme-swatch__line {
211
+ width: 45%;
212
+ height: 4px;
213
+ }
214
+
215
+ .crewlet-theme-swatch__muted {
216
+ display: block;
217
+ width: 18%;
218
+ height: 4px;
219
+ margin-left: auto;
220
+ border-radius: var(--radius-pill);
221
+ background: var(--crewlet-swatch-muted);
222
+ }
223
+
224
+ .crewlet-theme-swatch__actions {
225
+ display: flex;
226
+ gap: 6px;
227
+ margin-top: auto;
228
+ }
229
+
230
+ .crewlet-theme-swatch--pane .crewlet-theme-swatch__action {
231
+ display: grid;
232
+ flex: none;
233
+ place-items: center;
234
+ width: 40%;
235
+ height: 16px;
236
+ margin-right: 0;
237
+ border-radius: var(--radius-xs);
238
+ }
239
+
240
+ /* The primary action's label, in the colour the theme labels its accent with. */
241
+ .crewlet-theme-swatch__label {
242
+ display: block;
243
+ width: 50%;
244
+ height: 4px;
245
+ border-radius: var(--radius-pill);
246
+ background: var(--crewlet-swatch-on-accent);
247
+ }
248
+
249
+ .crewlet-theme-swatch__secondary {
250
+ display: block;
251
+ width: 26%;
252
+ height: 16px;
253
+ border: 1px solid var(--crewlet-swatch-hairline);
254
+ border-radius: var(--radius-xs);
255
+ background: var(--crewlet-swatch-card);
256
+ }
@@ -31,13 +31,15 @@ export type PreferenceControl<T extends string> = {
31
31
  storageKey?: undefined;
32
32
  };
33
33
  interface ThemeRowProps {
34
- /** Names the group. */
34
+ /** Names the group. Mode by default: the theme is the palette, and this row chooses its light or dark half. */
35
35
  label?: string | undefined;
36
36
  /** What each choice is called out loud. The glyphs say nothing on their own. */
37
37
  lightLabel?: string | undefined;
38
38
  systemLabel?: string | undefined;
39
39
  darkLabel?: string | undefined;
40
40
  size?: 'sm' | 'md' | undefined;
41
+ /** Equal options filling the width given, so the row draws the same box as a Density row beside it. */
42
+ fill?: boolean | undefined;
41
43
  className?: string | undefined;
42
44
  }
43
45
  export type ThemeSwitcherProps = ThemeRowProps & PreferenceControl<ThemePreference>;
@@ -64,6 +66,8 @@ interface DensityRowProps {
64
66
  normalMark?: string | undefined;
65
67
  comfortableMark?: string | undefined;
66
68
  size?: 'sm' | 'md' | undefined;
69
+ /** Equal options filling the width given, so the row draws the same box as a Mode row beside it. */
70
+ fill?: boolean | undefined;
67
71
  className?: string | undefined;
68
72
  }
69
73
  export type DensitySwitcherProps = DensityRowProps & PreferenceControl<DensityPreference>;
@@ -1,8 +1,8 @@
1
- export { DensitySwitcher, ThemeSwitcher } from '../chunk-WEIINZPA.js';
1
+ export { DensitySwitcher, ThemeSwitcher } from '../chunk-SBRE7IML.js';
2
2
  export { applyDensity, applyStoredPreferences, applyTheme, resolveTheme, useDensityPreference, useSystemTheme, useThemePreference } from '../chunk-K3OWD7BJ.js';
3
- import '../chunk-UAQIUSSK.js';
4
- import '../chunk-EBBAAQDY.js';
5
- import '../chunk-JHQUT4WJ.js';
3
+ import '../chunk-VYY56AMX.js';
4
+ import '../chunk-26PEPONN.js';
5
+ import '../chunk-4LDTQWS7.js';
6
6
  import '../chunk-CBOICT64.js';
7
7
  import '../chunk-BHHIIK3M.js';
8
8
  import '../chunk-BZFWDIV6.js';
@@ -30,7 +30,7 @@ export type ThemeToggleProps = ToggleButtonProps & PreferenceControl<ThemePrefer
30
30
  * full `ThemeSwitcher`, which is where a settings screen offers it.
31
31
  *
32
32
  * NAMED FOR THE ACTION, drawn as the destination. The name changes with the
33
- * palette ("Switch to the light theme" on a dark page), so a screen reader
33
+ * mode ("Switch to light mode" on a dark page), so a screen reader
34
34
  * hears what a press will do, and the glyph is the palette it goes to: a sun
35
35
  * on a dark page, a moon on a light one. It is NOT `aria-pressed`, because
36
36
  * neither palette is the "on" state of the other, and a pressed state beside a
@@ -1,4 +1,4 @@
1
- export { ThemeToggle } from '../chunk-ORNOOMVY.js';
1
+ export { ThemeToggle } from '../chunk-6TSZCBID.js';
2
2
  import '../chunk-K3OWD7BJ.js';
3
3
  import '../chunk-4FQT6ZAY.js';
4
4
  import '../chunk-BZFWDIV6.js';
@@ -1,12 +1,12 @@
1
- export { DEFAULT_TIME_WINDOW_LABELS, TIME_WINDOW_SPANS, TimeWindowPicker, describeTimeWindow, isTimeWindowSet, parseTimeWindowDuration, resolveTimeWindow, timeWindowMatchesPreset } from '../chunk-HLBRPES3.js';
2
- import '../chunk-SEFMO2EV.js';
3
- import '../chunk-6MU7HNB4.js';
1
+ export { DEFAULT_TIME_WINDOW_LABELS, TIME_WINDOW_SPANS, TimeWindowPicker, describeTimeWindow, isTimeWindowSet, parseTimeWindowDuration, resolveTimeWindow, timeWindowMatchesPreset } from '../chunk-IFM63LAG.js';
2
+ import '../chunk-IXUU5DLZ.js';
3
+ import '../chunk-F73MC7EZ.js';
4
4
  import '../chunk-FTEJPHBI.js';
5
5
  import '../chunk-GXQ3B46I.js';
6
6
  import '../chunk-OG6CL3EB.js';
7
7
  import '../chunk-PQADV6P6.js';
8
8
  import '../chunk-4FQT6ZAY.js';
9
- import '../chunk-PDUZO35I.js';
9
+ import '../chunk-O2ZDZZS7.js';
10
10
  import '../chunk-7RPGY3JE.js';
11
11
  import '../chunk-R25RGPUB.js';
12
12
  import '../chunk-BZFWDIV6.js';
@@ -1,8 +1,9 @@
1
1
  /*
2
2
  * TimeWindowPicker: one trigger over one panel.
3
3
  *
4
- * The trigger takes the same geometry as a Select and a DateTimePicker, so the
5
- * three line up in a filter bar. The panel is a RAIL of named windows beside
4
+ * The trigger takes the same geometry and button boundary as a Select and a
5
+ * DateTimePicker (--color-border-strong; see Select.css), so the three line
6
+ * up in a filter bar. The panel is a RAIL of named windows beside
6
7
  * the calendars, rather than two tabs with one of them hidden: the windows a
7
8
  * reader picks by name are the road, and the absolute range is the turning off
8
9
  * it, so both are on screen at once and each shows what the other chose.
@@ -17,7 +18,7 @@
17
18
  /* The side inset only: see DateTimePicker's own trigger. */
18
19
  padding: 0 var(--spacing-2) 0 var(--spacing-3);
19
20
  background: var(--color-surface-subtle);
20
- border: 1px solid var(--color-border-control);
21
+ border: 1px solid var(--color-border-strong);
21
22
  border-radius: var(--radius-md);
22
23
  color: var(--color-text-primary);
23
24
  font-family: inherit;
@@ -34,7 +35,7 @@
34
35
  }
35
36
 
36
37
  .crewlet-time-window:hover:not(:disabled) {
37
- border-color: var(--color-border-hover);
38
+ border-color: var(--color-border-strong-hover);
38
39
  }
39
40
 
40
41
  /*
@@ -1,4 +1,4 @@
1
- export { ToastProvider, Toaster, useToast } from '../chunk-UG5ZMAXW.js';
1
+ export { ToastProvider, Toaster, useToast } from '../chunk-CBZSSKH3.js';
2
2
  import '../chunk-7RPGY3JE.js';
3
3
  import '../chunk-R25RGPUB.js';
4
4
  import '../chunk-BZFWDIV6.js';