@skaile/brand 0.4.0 → 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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skaile/brand",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "Skaile brand: design tokens, CSS custom properties, Tailwind preset, and brand assets",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",
package/src/css/theme.css CHANGED
@@ -22,21 +22,25 @@
22
22
  :root,
23
23
  :root[data-theme="light"],
24
24
  .light {
25
- --color-scheme: light;
25
+ /* The real property, not a custom one: this is what makes the UA paint
26
+ scrollbars, selects and date pickers to match the theme. */
27
+ color-scheme: light;
26
28
 
27
29
  /* Core palette */
28
- /* The page is the lightest surface and a panel sits *into* it, not on it.
29
- That direction is taken from the platform's dark design, and light follows
30
- it so one sentence describes both themes. The 6-point page/panel gap is
31
- the one the previous ramp used; only its sign changed. Neutral throughout,
32
- as the design is: every grey here has zero saturation. */
33
- --background: hsl(0 0% 100%);
30
+ /* Light lifts its panels off the page; dark sets them into it. The two
31
+ directions are deliberate and were chosen against renders of both: on a
32
+ dark ground a panel reads as a recess, on a light one it reads as a card,
33
+ and forcing one rule onto both gave light a set of grey wells. What the
34
+ themes do share is temperature — every grey here has zero saturation, as
35
+ the platform's dark design does. */
36
+ --background: hsl(0 0% 94%);
34
37
  --foreground: hsl(0 0% 11%);
35
- --card: hsl(0 0% 94%);
38
+ --card: hsl(0 0% 100%);
36
39
  --card-foreground: hsl(0 0% 11%);
37
- /* Level with the page, as stock shadcn light is: a popover is told apart by
38
- its border and shadow, which every popover surface in ui-components
39
- draws, not by its fill. */
40
+ /* Level with the panel, not with the page: a popover floats above the page,
41
+ so it takes the panel's surface. Card and popover being the same white is
42
+ deliberate and is what stock shadcn light does — not one of them left
43
+ un-bumped. */
40
44
  --popover: hsl(0 0% 100%);
41
45
  --popover-foreground: hsl(0 0% 11%);
42
46
  --primary: hsl(267 100% 50%);
@@ -55,12 +59,16 @@
55
59
  --border: hsl(0 0% 86%);
56
60
  --input: hsl(0 0% 86%);
57
61
  --ring: hsl(267 100% 50%);
58
- /* Below the panel, as in dark: the strip recedes and an active tab rises out
59
- of it. */
60
- --tab-bar: hsl(0 0% 89%);
62
+ /* Below the page, so an active tab rises out of the strip and meets the
63
+ panel it belongs to. */
64
+ --tab-bar: hsl(0 0% 91%);
61
65
  /* The surface a panel's own content sinks into — the file viewer beside the
62
- tree. Third step of the ramp, below the panel. */
63
- --surface-sunken: hsl(0 0% 91%);
66
+ tree. One step below the panel, which here leaves it between the panel and
67
+ the page rather than below both, as in dark.
68
+ It happens to share 96% with --secondary/--muted/--accent above. That is a
69
+ coincidence of this ramp, not a coupling: those three style UI elements,
70
+ this one is a depth. Moving it need not move them. */
71
+ --surface-sunken: hsl(0 0% 96%);
64
72
 
65
73
  /* Skaile-specific */
66
74
  --color-success: hsl(161.4 93.5% 30.4%);
@@ -69,7 +77,7 @@
69
77
  --color-warning-foreground: hsl(0 0% 11%);
70
78
  --color-ai-accent: hsl(37.7 92.1% 50.2%);
71
79
  --color-primary-bright: hsl(267 100% 63%);
72
- --color-surface: hsl(0 0% 96%);
80
+ --color-surface: hsl(0 0% 100%);
73
81
 
74
82
  /* Chart palette */
75
83
  --chart-1: hsl(267 100% 50%);
@@ -79,17 +87,50 @@
79
87
  --chart-5: hsl(161.4 93.5% 30.4%);
80
88
 
81
89
  /* Sidebar */
82
- /* Tied to the page, as dark ties it. The sidebar is chrome, not a panel, so
83
- it takes the ground the panels sit in. */
84
- --sidebar: hsl(0 0% 100%);
90
+ /* Chrome recesses below the page rather than matching it, so the content
91
+ ground reads as the surface in front. Inferred: every screen of the shell
92
+ design is dark-only. */
93
+ --sidebar: hsl(0 0% 89%);
85
94
  --sidebar-foreground: hsl(0 0% 11%);
86
95
  --sidebar-primary: hsl(267 100% 50%);
87
96
  --sidebar-primary-foreground: hsl(0 0% 100%);
88
- --sidebar-accent: hsl(267 100% 97%);
89
- --sidebar-accent-foreground: hsl(267 100% 50%);
97
+ /* A plain grey lift off the sidebar ground, not a purple tint — that is what
98
+ the design's selected row is. shadcn's SidebarMenuButton binds hover and
99
+ active to this one token; separating the two is the consumer's job. */
100
+ --sidebar-accent: hsl(0 0% 96%);
101
+ --sidebar-accent-foreground: hsl(0 0% 11%);
90
102
  --sidebar-border: hsl(0 0% 86%);
91
103
  --sidebar-ring: hsl(267 100% 50%);
92
104
 
105
+ /* Shell — header, tabs, toolbar chrome */
106
+ /* Two ramps run in opposite directions on the same header: a tab lifts off
107
+ the header ground because it is a piece of the page pulled forward, a
108
+ control sinks into it because it is a well. Hence two families, not one. */
109
+ /* Inferred throughout — the shell design exists only in dark. */
110
+ /* White in both themes: a selection marker rather than a surface. */
111
+ --tab-active: hsl(0 0% 100%);
112
+ --tab-active-foreground: hsl(0 0% 11%);
113
+ /* Steps away from the header ground instead of toward the active tab, since
114
+ white is already spoken for at the top of this ramp: lifting into it left
115
+ inactive chrome at 1.06:1 against the header. */
116
+ /* No companion foreground: an inactive tab keeps --foreground at full
117
+ strength. Only the fill recedes, so the label stays as readable as the
118
+ active one. */
119
+ --tab-inactive: hsl(0 0% 82%);
120
+ --tab-inactive-hover: hsl(0 0% 87%);
121
+ /* Sampled from the design, and the one shell value both themes share. */
122
+ --tab-unread: #005eff;
123
+ --control-surface: hsl(0 0% 88%);
124
+ --control-surface-hover: hsl(0 0% 84%);
125
+ --control-selected: hsl(0 0% 100%);
126
+ /* Deliberately dimmer than --muted-foreground, and held at the 3:1 non-text
127
+ floor against --control-surface — the design samples about 2.3:1, and this
128
+ is the one place we knowingly part from it. */
129
+ --control-icon: hsl(0 0% 49%);
130
+ /* Stronger than --border against the same ground, because it is the only
131
+ line the shell has left. */
132
+ --content-border: hsl(0 0% 82%);
133
+
93
134
  /* Typography */
94
135
  --font-sans: "Inter", sans-serif;
95
136
  --font-serif: "Plus Jakarta Sans", sans-serif;
@@ -118,7 +159,7 @@
118
159
 
119
160
  :root[data-theme="dark"],
120
161
  .dark {
121
- --color-scheme: dark;
162
+ color-scheme: dark;
122
163
 
123
164
  /* Core palette — taken from the platform shell design, and no longer the
124
165
  website's canonical dark: that palette is blue-shifted and lifts a card
@@ -144,10 +185,9 @@
144
185
  --input: #323131;
145
186
  --ring: #7300ff;
146
187
  /* See the light block: the strip behind the page that the tab bar sits on.
147
- It shares a value with --surface-sunken below, which is not a copy-paste:
148
- both sit at the deepest step of the ramp, one behind the page and one
149
- inside a panel. They are free to move apart. */
150
- --tab-bar: #161515;
188
+ It used to share the deepest step with --surface-sunken; --sidebar has
189
+ since taken that step, and the strip now sits one above it. */
190
+ --tab-bar: #1f1e1e;
151
191
  /* The surface a panel's own content sinks into — the file viewer beside the
152
192
  tree. Third step of the ramp, below the panel. */
153
193
  --surface-sunken: #161515;
@@ -169,15 +209,45 @@
169
209
  --chart-5: #10b981;
170
210
 
171
211
  /* Sidebar */
172
- --sidebar: #242424;
212
+ /* Chrome recesses below the page rather than matching it, so the content
213
+ ground reads as the surface in front. Sampled from the shell design; it
214
+ lands on --surface-sunken's value, one behind the page and one inside a
215
+ panel, and the two are free to move apart. */
216
+ --sidebar: #161515;
173
217
  --sidebar-foreground: #f5f5f5;
174
218
  --sidebar-primary: #7300ff;
175
219
  --sidebar-primary-foreground: #ffffff;
176
- --sidebar-accent: #1b1a3f;
177
- --sidebar-accent-foreground: #9b40ff;
220
+ /* A plain grey lift off the sidebar ground, not a purple tint — that is what
221
+ the design's selected row is. shadcn's SidebarMenuButton binds hover and
222
+ active to this one token; separating the two is the consumer's job. */
223
+ --sidebar-accent: #1f1f1f;
224
+ --sidebar-accent-foreground: #f5f5f5;
178
225
  --sidebar-border: #323131;
179
226
  --sidebar-ring: #7300ff;
180
227
 
228
+ /* Shell — header, tabs, toolbar chrome */
229
+ /* Two ramps run in opposite directions on the same header: a tab lifts off
230
+ the header ground because it is a piece of the page pulled forward, a
231
+ control sinks into it because it is a well. Hence two families, not one. */
232
+ /* Sampled from the shell design throughout. */
233
+ /* White in both themes: a selection marker rather than a surface. */
234
+ --tab-active: #ffffff;
235
+ --tab-active-foreground: hsl(0 0% 11%);
236
+ --tab-inactive: #3e3e3e;
237
+ --tab-inactive-hover: #4a4a4a;
238
+ /* The one shell value both themes share. */
239
+ --tab-unread: #005eff;
240
+ --control-surface: #1a1919;
241
+ --control-surface-hover: #2a2929;
242
+ --control-selected: #343434;
243
+ /* Deliberately dimmer than --muted-foreground, and held at the 3:1 non-text
244
+ floor against --control-surface — the design samples about 2.3:1, and this
245
+ is the one place we knowingly part from it. */
246
+ --control-icon: #666666;
247
+ /* Stronger than --border against the same ground, because it is the only
248
+ line the shell has left. */
249
+ --content-border: #3e3e3e;
250
+
181
251
  /* Typography */
182
252
  --font-sans: "Inter", sans-serif;
183
253
  --font-serif: "Plus Jakarta Sans", sans-serif;
package/src/tokens.json CHANGED
@@ -34,26 +34,45 @@
34
34
  "text-dim": "#777777"
35
35
  },
36
36
  "platform-light": {
37
- "background": "hsl(0 0% 100%)",
38
- "tab-bar": "hsl(0 0% 89%)",
39
- "card": "hsl(0 0% 94%)",
37
+ "background": "hsl(0 0% 94%)",
38
+ "tab-bar": "hsl(0 0% 91%)",
39
+ "tab-active": "hsl(0 0% 100%)",
40
+ "tab-active-foreground": "hsl(0 0% 11%)",
41
+ "card": "hsl(0 0% 100%)",
40
42
  "popover": "hsl(0 0% 100%)",
41
- "surface": "hsl(0 0% 96%)",
43
+ "surface": "hsl(0 0% 100%)",
42
44
  "secondary": "hsl(0 0% 96%)",
43
45
  "muted": "hsl(0 0% 96%)",
44
46
  "accent": "hsl(0 0% 96%)",
45
- "surface-sunken": "hsl(0 0% 91%)",
47
+ "surface-sunken": "hsl(0 0% 96%)",
46
48
  "foreground": "hsl(0 0% 11%)",
47
49
  "muted-foreground": "hsl(0 0% 40%)",
48
50
  "border": "hsl(0 0% 86%)",
49
51
  "primary": "hsl(267 100% 50%)",
50
52
  "primary-bright": "hsl(267 100% 63%)",
51
53
  "ring": "hsl(267 100% 50%)",
52
- "sidebar-accent": "hsl(267 100% 97%)"
54
+ "sidebar": "hsl(0 0% 89%)",
55
+ "sidebar-accent": "hsl(0 0% 96%)",
56
+ "tab-inactive": "hsl(0 0% 82%)",
57
+ "tab-inactive-hover": "hsl(0 0% 87%)",
58
+ "tab-unread": "#005eff",
59
+ "control-surface": "hsl(0 0% 88%)",
60
+ "control-surface-hover": "hsl(0 0% 84%)",
61
+ "control-selected": "hsl(0 0% 100%)",
62
+ "control-icon": "hsl(0 0% 49%)",
63
+ "content-border": "hsl(0 0% 82%)",
64
+ "sidebar-foreground": "hsl(0 0% 11%)",
65
+ "sidebar-primary": "hsl(267 100% 50%)",
66
+ "sidebar-primary-foreground": "hsl(0 0% 100%)",
67
+ "sidebar-accent-foreground": "hsl(0 0% 11%)",
68
+ "sidebar-border": "hsl(0 0% 86%)",
69
+ "sidebar-ring": "hsl(267 100% 50%)"
53
70
  },
54
71
  "platform-dark": {
55
72
  "background": "#242424",
56
- "tab-bar": "#161515",
73
+ "tab-bar": "#1f1e1e",
74
+ "tab-active": "#ffffff",
75
+ "tab-active-foreground": "hsl(0 0% 11%)",
57
76
  "card": "#1a1919",
58
77
  "popover": "#2f2f2f",
59
78
  "surface": "#2f2f2f",
@@ -67,7 +86,22 @@
67
86
  "primary": "#7300ff",
68
87
  "primary-bright": "#9b40ff",
69
88
  "ring": "#7300ff",
70
- "sidebar-accent": "#1b1a3f"
89
+ "sidebar": "#161515",
90
+ "sidebar-accent": "#1f1f1f",
91
+ "tab-inactive": "#3e3e3e",
92
+ "tab-inactive-hover": "#4a4a4a",
93
+ "tab-unread": "#005eff",
94
+ "control-surface": "#1a1919",
95
+ "control-surface-hover": "#2a2929",
96
+ "control-selected": "#343434",
97
+ "control-icon": "#666666",
98
+ "content-border": "#3e3e3e",
99
+ "sidebar-foreground": "#f5f5f5",
100
+ "sidebar-primary": "#7300ff",
101
+ "sidebar-primary-foreground": "#ffffff",
102
+ "sidebar-accent-foreground": "#f5f5f5",
103
+ "sidebar-border": "#323131",
104
+ "sidebar-ring": "#7300ff"
71
105
  }
72
106
  }
73
107
  }