@vobs/ui 0.2.0 → 1.0.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 (208) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +60 -0
  3. package/package.json +52 -102
  4. package/src/activity-rail.ts +125 -0
  5. package/src/alert.ts +65 -0
  6. package/src/assets/icons/alert-circle.svg +1 -0
  7. package/src/assets/icons/alert-triangle.svg +1 -0
  8. package/src/assets/icons/alert.d27e24.svg +1 -0
  9. package/src/assets/icons/alert.svg +1 -0
  10. package/src/assets/icons/apple.svg +1 -0
  11. package/src/assets/icons/arrow-down.svg +1 -0
  12. package/src/assets/icons/arrow-expand.svg +1 -0
  13. package/src/assets/icons/arrow-left.svg +1 -0
  14. package/src/assets/icons/arrow-minimize.svg +1 -0
  15. package/src/assets/icons/arrow-right-to-line.svg +1 -0
  16. package/src/assets/icons/arrow-right.svg +1 -0
  17. package/src/assets/icons/arrow-up-right.svg +1 -0
  18. package/src/assets/icons/arrow-up.0c0c0d.svg +1 -0
  19. package/src/assets/icons/arrow-up.svg +1 -0
  20. package/src/assets/icons/at.svg +1 -0
  21. package/src/assets/icons/atom.0c0c0d.svg +1 -0
  22. package/src/assets/icons/atom.svg +1 -0
  23. package/src/assets/icons/bar.svg +1 -0
  24. package/src/assets/icons/bell.svg +1 -0
  25. package/src/assets/icons/box.svg +1 -0
  26. package/src/assets/icons/bug.svg +1 -0
  27. package/src/assets/icons/calendar.svg +1 -0
  28. package/src/assets/icons/check-circle.33c192.svg +1 -0
  29. package/src/assets/icons/check-circle.svg +1 -0
  30. package/src/assets/icons/check.d1d3db.svg +1 -0
  31. package/src/assets/icons/check.svg +1 -0
  32. package/src/assets/icons/chevron-down.svg +1 -0
  33. package/src/assets/icons/chevron-right.svg +1 -0
  34. package/src/assets/icons/chevron-up.svg +1 -0
  35. package/src/assets/icons/circle.svg +1 -0
  36. package/src/assets/icons/clock.svg +1 -0
  37. package/src/assets/icons/cmd.svg +1 -0
  38. package/src/assets/icons/code.svg +1 -0
  39. package/src/assets/icons/columns.svg +1 -0
  40. package/src/assets/icons/copy.svg +1 -0
  41. package/src/assets/icons/cpu.svg +1 -0
  42. package/src/assets/icons/dashboard.0c0c0d.svg +1 -0
  43. package/src/assets/icons/dashboard.svg +1 -0
  44. package/src/assets/icons/dollar.svg +1 -0
  45. package/src/assets/icons/download.svg +1 -0
  46. package/src/assets/icons/edit.svg +1 -0
  47. package/src/assets/icons/extensions.svg +1 -0
  48. package/src/assets/icons/external.svg +1 -0
  49. package/src/assets/icons/eye.svg +1 -0
  50. package/src/assets/icons/file-text.svg +1 -0
  51. package/src/assets/icons/file.svg +1 -0
  52. package/src/assets/icons/files.svg +1 -0
  53. package/src/assets/icons/filter.svg +1 -0
  54. package/src/assets/icons/folder.svg +1 -0
  55. package/src/assets/icons/gear.svg +1 -0
  56. package/src/assets/icons/git.svg +1 -0
  57. package/src/assets/icons/github.svg +1 -0
  58. package/src/assets/icons/globe.svg +1 -0
  59. package/src/assets/icons/grid-2x2.svg +1 -0
  60. package/src/assets/icons/hash.svg +1 -0
  61. package/src/assets/icons/heart.svg +1 -0
  62. package/src/assets/icons/help.svg +1 -0
  63. package/src/assets/icons/home.svg +1 -0
  64. package/src/assets/icons/image.svg +1 -0
  65. package/src/assets/icons/info-circle.svg +1 -0
  66. package/src/assets/icons/info-square.svg +1 -0
  67. package/src/assets/icons/info.387bff.svg +1 -0
  68. package/src/assets/icons/info.svg +1 -0
  69. package/src/assets/icons/key.svg +1 -0
  70. package/src/assets/icons/layers.svg +1 -0
  71. package/src/assets/icons/layout.svg +1 -0
  72. package/src/assets/icons/link.svg +1 -0
  73. package/src/assets/icons/list.svg +1 -0
  74. package/src/assets/icons/lock.svg +1 -0
  75. package/src/assets/icons/log-out.svg +1 -0
  76. package/src/assets/icons/logo.svg +1 -0
  77. package/src/assets/icons/mail.svg +1 -0
  78. package/src/assets/icons/menu.svg +1 -0
  79. package/src/assets/icons/message-circle.svg +1 -0
  80. package/src/assets/icons/message-plus.svg +1 -0
  81. package/src/assets/icons/message-square.svg +1 -0
  82. package/src/assets/icons/mic.svg +1 -0
  83. package/src/assets/icons/minus.svg +1 -0
  84. package/src/assets/icons/moon.svg +1 -0
  85. package/src/assets/icons/more-h.svg +1 -0
  86. package/src/assets/icons/mouse.svg +1 -0
  87. package/src/assets/icons/palette.svg +1 -0
  88. package/src/assets/icons/panel-bottom.svg +1 -0
  89. package/src/assets/icons/pause.svg +1 -0
  90. package/src/assets/icons/play.svg +1 -0
  91. package/src/assets/icons/plug.svg +1 -0
  92. package/src/assets/icons/plus.0c0c0d.svg +1 -0
  93. package/src/assets/icons/plus.svg +1 -0
  94. package/src/assets/icons/refresh.svg +1 -0
  95. package/src/assets/icons/ruler.svg +1 -0
  96. package/src/assets/icons/scroll-text.svg +1 -0
  97. package/src/assets/icons/search-menu.svg +1 -0
  98. package/src/assets/icons/search.svg +1 -0
  99. package/src/assets/icons/send.0c0c0d.svg +1 -0
  100. package/src/assets/icons/send.svg +1 -0
  101. package/src/assets/icons/settings.0c0c0d.svg +1 -0
  102. package/src/assets/icons/settings.svg +1 -0
  103. package/src/assets/icons/shield.svg +1 -0
  104. package/src/assets/icons/sidebar-left.svg +1 -0
  105. package/src/assets/icons/sidebar-right.svg +1 -0
  106. package/src/assets/icons/sliders.svg +1 -0
  107. package/src/assets/icons/sparkles.32f08c.svg +1 -0
  108. package/src/assets/icons/sparkles.svg +1 -0
  109. package/src/assets/icons/square.svg +1 -0
  110. package/src/assets/icons/star.svg +1 -0
  111. package/src/assets/icons/sun.svg +1 -0
  112. package/src/assets/icons/terminal.svg +1 -0
  113. package/src/assets/icons/trash.svg +1 -0
  114. package/src/assets/icons/trending-down.svg +1 -0
  115. package/src/assets/icons/trending-up.svg +1 -0
  116. package/src/assets/icons/type.svg +1 -0
  117. package/src/assets/icons/upload.svg +1 -0
  118. package/src/assets/icons/user-circle.svg +1 -0
  119. package/src/assets/icons/user.svg +1 -0
  120. package/src/assets/icons/users.svg +1 -0
  121. package/src/assets/icons/wrench.svg +1 -0
  122. package/src/assets/icons/x-circle.svg +1 -0
  123. package/src/assets/icons/x.svg +1 -0
  124. package/src/assets/icons/zap.0c0c0d.svg +1 -0
  125. package/src/assets/icons/zap.svg +1 -0
  126. package/src/avatar.ts +64 -0
  127. package/src/button.ts +88 -0
  128. package/src/card.ts +59 -0
  129. package/src/chat-composer.ts +156 -0
  130. package/src/dialog.ts +127 -0
  131. package/src/drawer.ts +131 -0
  132. package/src/editor-tabs.ts +184 -0
  133. package/src/file-tree.ts +214 -0
  134. package/src/forms.ts +270 -0
  135. package/src/icon.ts +117 -0
  136. package/src/icons.js +165 -0
  137. package/src/index.test.ts +213 -0
  138. package/src/index.ts +94 -0
  139. package/src/kbd.ts +72 -0
  140. package/src/menu.ts +119 -0
  141. package/src/nav-list.ts +157 -0
  142. package/src/overlay.test.ts +66 -0
  143. package/src/overlay.ts +205 -0
  144. package/src/page-header.ts +97 -0
  145. package/src/pagination.ts +163 -0
  146. package/src/second-batch.test.ts +205 -0
  147. package/src/stat-card.ts +92 -0
  148. package/src/status-bar.ts +108 -0
  149. package/src/styles/base.css +240 -0
  150. package/src/styles/components.css +1234 -0
  151. package/{dist → src/styles}/styles.css +2 -0
  152. package/src/styles/toast.css +57 -0
  153. package/src/styles/tokens.css +438 -0
  154. package/src/styles/vui.css +47 -0
  155. package/src/table.ts +191 -0
  156. package/src/tabs.ts +100 -0
  157. package/src/tag.ts +33 -0
  158. package/src/third-batch.test.ts +137 -0
  159. package/src/toast.test.ts +55 -0
  160. package/src/toast.ts +79 -0
  161. package/src/types.ts +25 -0
  162. package/src/utils.ts +221 -0
  163. package/src/workbench-titlebar.ts +137 -0
  164. package/dist/app-shell-dom.d.ts +0 -24
  165. package/dist/app-shell-dom.js +0 -573
  166. package/dist/app-shell.d.ts +0 -199
  167. package/dist/app-shell.js +0 -370
  168. package/dist/base.css +0 -52
  169. package/dist/calendar-picker.d.ts +0 -45
  170. package/dist/calendar-picker.js +0 -217
  171. package/dist/calendar.d.ts +0 -95
  172. package/dist/calendar.js +0 -194
  173. package/dist/complex-inputs.d.ts +0 -300
  174. package/dist/complex-inputs.js +0 -862
  175. package/dist/components.css +0 -4568
  176. package/dist/data-display.d.ts +0 -1063
  177. package/dist/data-display.js +0 -2298
  178. package/dist/feedback.d.ts +0 -88
  179. package/dist/feedback.js +0 -281
  180. package/dist/forms.d.ts +0 -378
  181. package/dist/forms.js +0 -1015
  182. package/dist/icons-config.d.ts +0 -25
  183. package/dist/icons-config.js +0 -14
  184. package/dist/icons.d.ts +0 -41
  185. package/dist/icons.js +0 -185
  186. package/dist/index.d.ts +0 -27
  187. package/dist/index.js +0 -34
  188. package/dist/locale/en-US.d.ts +0 -31
  189. package/dist/locale/en-US.js +0 -20
  190. package/dist/locale/zh-CN.d.ts +0 -31
  191. package/dist/locale/zh-CN.js +0 -20
  192. package/dist/navigation.d.ts +0 -609
  193. package/dist/navigation.js +0 -1707
  194. package/dist/overlay.d.ts +0 -304
  195. package/dist/overlay.js +0 -969
  196. package/dist/primitives.d.ts +0 -268
  197. package/dist/primitives.js +0 -764
  198. package/dist/theme-data.d.ts +0 -363
  199. package/dist/theme-data.js +0 -374
  200. package/dist/theme.d.ts +0 -79
  201. package/dist/theme.js +0 -262
  202. package/dist/tokens.css +0 -449
  203. package/dist/tree.d.ts +0 -144
  204. package/dist/tree.js +0 -469
  205. package/dist/virtual-list.d.ts +0 -190
  206. package/dist/virtual-list.js +0 -521
  207. package/dist/workbench.d.ts +0 -136
  208. package/dist/workbench.js +0 -156
package/dist/theme.js DELETED
@@ -1,262 +0,0 @@
1
- /** @license MIT
2
- * Copyright (c) 2026 vobsjs
3
- * @vobs/ui
4
- */
5
- import { brandPresets, contrastRatio, DEFAULT_BRAND_ID, DEFAULT_THEME, deriveBrandTokens, resolveBrandColor, themeTokenValues, } from './theme-data.js';
6
- export { brandPresets, contrastRatio, DEFAULT_BRAND_COLOR, DEFAULT_BRAND_ID, DEFAULT_THEME, deriveBrandTokens, normalizeHexColor, resolveBrandColor, } from './theme-data.js';
7
- const brandVariableNames = [
8
- '--bg-brand',
9
- '--bg-brand-hover',
10
- '--bg-brand-disabled',
11
- '--bg-brand-popup',
12
- '--bg-brand-overlay',
13
- '--text-brand',
14
- '--text-brand-hover',
15
- '--icon-brand',
16
- '--icon-brand-hover',
17
- '--border-brand',
18
- '--text-onbrand',
19
- '--icon-onbrand',
20
- '--color-primary',
21
- '--color-primary-hover',
22
- '--color-primary-disabled',
23
- '--color-primary-soft',
24
- '--color-accent',
25
- '--color-on-primary',
26
- ];
27
- export function createThemeController(options) {
28
- const listeners = new Set();
29
- const persistedTheme = readPersistedTheme(options.persistence);
30
- let followsSystem = persistedTheme === undefined && options.systemPreference !== undefined;
31
- let theme = persistedTheme ?? options.systemPreference?.read() ?? options.initialTheme ?? DEFAULT_THEME;
32
- let brand = readPersistedBrand(options.persistence, options.onWarning) ??
33
- readBrand(options.initialBrand ?? DEFAULT_BRAND_ID, options.onWarning);
34
- let stopSystemPreference;
35
- let destroyed = false;
36
- applyTheme(options.target, theme);
37
- applyBrand(options.target, brand);
38
- if (followsSystem) {
39
- stopSystemPreference = options.systemPreference?.subscribe?.((nextTheme) => {
40
- if (destroyed || !followsSystem)
41
- return;
42
- theme = nextTheme;
43
- applyTheme(options.target, theme);
44
- notify();
45
- });
46
- }
47
- function state() {
48
- return { theme, brand };
49
- }
50
- function notify() {
51
- const value = state();
52
- for (const listener of listeners)
53
- listener(value);
54
- }
55
- function setTheme(nextTheme) {
56
- assertTheme(nextTheme);
57
- followsSystem = false;
58
- stopSystemPreference?.();
59
- stopSystemPreference = undefined;
60
- theme = nextTheme;
61
- applyTheme(options.target, theme);
62
- options.persistence?.writeTheme?.(theme);
63
- notify();
64
- }
65
- return {
66
- get theme() {
67
- return theme;
68
- },
69
- get brand() {
70
- return brand;
71
- },
72
- get state() {
73
- return state();
74
- },
75
- setTheme,
76
- toggleTheme() {
77
- const nextTheme = theme === 'dark' ? 'light' : 'dark';
78
- setTheme(nextTheme);
79
- return nextTheme;
80
- },
81
- setBrand(nextBrand) {
82
- brand = readBrand(nextBrand, options.onWarning);
83
- applyBrand(options.target, brand);
84
- options.persistence?.writeBrand?.(brand);
85
- notify();
86
- return brand;
87
- },
88
- subscribe(listener) {
89
- listeners.add(listener);
90
- return () => listeners.delete(listener);
91
- },
92
- destroy() {
93
- if (destroyed)
94
- return;
95
- destroyed = true;
96
- followsSystem = false;
97
- stopSystemPreference?.();
98
- stopSystemPreference = undefined;
99
- listeners.clear();
100
- },
101
- };
102
- }
103
- export function createStorageThemePersistence(storage, keys = {}) {
104
- const themeKey = keys.theme ?? 'vobs-theme';
105
- const brandKey = keys.brand ?? 'vobs-brand-color';
106
- return {
107
- readTheme() {
108
- return storage.getItem(themeKey);
109
- },
110
- writeTheme(theme) {
111
- storage.setItem(themeKey, theme);
112
- },
113
- readBrand() {
114
- const stored = storage.getItem(brandKey);
115
- if (stored === null)
116
- return undefined;
117
- try {
118
- return JSON.parse(stored);
119
- }
120
- catch {
121
- return stored;
122
- }
123
- },
124
- writeBrand(brand) {
125
- storage.setItem(brandKey, JSON.stringify(brand));
126
- },
127
- };
128
- }
129
- export function createMediaThemePreference(query) {
130
- return {
131
- read() {
132
- return query.matches ? 'light' : 'dark';
133
- },
134
- subscribe(listener) {
135
- const handleChange = (event) => {
136
- listener(event.matches ? 'light' : 'dark');
137
- };
138
- query.addEventListener('change', handleChange);
139
- return () => query.removeEventListener('change', handleChange);
140
- },
141
- };
142
- }
143
- export function createThemeState(theme = DEFAULT_THEME, brand = DEFAULT_BRAND_ID) {
144
- assertTheme(theme);
145
- return { theme, brand: resolveBrandColor(brand) };
146
- }
147
- export function createThemeAttributes(state) {
148
- const attributes = {
149
- 'data-theme': state.theme,
150
- 'data-brand': state.brand.id,
151
- ...(isPresetBrand(state.brand) ? {} : { style: serializeBrandStyle(state.brand) }),
152
- };
153
- return attributes;
154
- }
155
- export function createThemeBootstrapScript(state) {
156
- const attributes = createThemeAttributes(state);
157
- const variables = isPresetBrand(state.brand) ? {} : brandCssVariables(state.brand);
158
- return `(function(){var d=document.documentElement;d.setAttribute("data-theme",${JSON.stringify(attributes['data-theme'])});d.setAttribute("data-brand",${JSON.stringify(attributes['data-brand'])});var v=${JSON.stringify(variables)};for(var k in v){d.style.setProperty(k,v[k])}})()`;
159
- }
160
- function readPersistedTheme(persistence) {
161
- const value = persistence?.readTheme?.();
162
- return value === 'dark' || value === 'light' ? value : undefined;
163
- }
164
- function readPersistedBrand(persistence, onWarning) {
165
- const value = persistence?.readBrand?.();
166
- try {
167
- if (typeof value === 'string')
168
- return readBrand(value, onWarning);
169
- if (isBrandColorInput(value))
170
- return readBrand(value, onWarning);
171
- }
172
- catch {
173
- onWarning?.('Ignored invalid persisted brand color');
174
- return undefined;
175
- }
176
- if (value !== undefined && value !== null)
177
- onWarning?.('Ignored invalid persisted brand color');
178
- return undefined;
179
- }
180
- function readBrand(value, onWarning) {
181
- const brand = resolveBrandColor(value);
182
- if (!isPresetBrand(brand)) {
183
- const darkContrast = contrastRatio(brand.color, themeTokenValues.dark['--bg-base-default']);
184
- const lightContrast = contrastRatio(brand.color, themeTokenValues.light['--bg-base-default']);
185
- if (Math.min(darkContrast, lightContrast) < 3) {
186
- onWarning?.(`Custom brand ${brand.color} has low contrast against a theme background`);
187
- }
188
- }
189
- return brand;
190
- }
191
- function applyTheme(target, theme) {
192
- target.setAttribute('data-theme', theme);
193
- }
194
- function applyBrand(target, brand) {
195
- target.setAttribute('data-brand', brand.id);
196
- if (isPresetBrand(brand)) {
197
- for (const name of brandVariableNames)
198
- target.style.removeProperty(name);
199
- return;
200
- }
201
- for (const [name, value] of Object.entries(brandCssVariables(brand))) {
202
- target.style.setProperty(name, value);
203
- }
204
- }
205
- function brandCssVariables(brand) {
206
- const tokens = deriveBrandTokens(brand.color);
207
- return {
208
- '--bg-brand': tokens.background,
209
- '--bg-brand-hover': tokens.hover,
210
- '--bg-brand-disabled': tokens.disabled,
211
- '--bg-brand-popup': tokens.soft,
212
- '--bg-brand-overlay': tokens.soft,
213
- '--text-brand': tokens.background,
214
- '--text-brand-hover': tokens.hover,
215
- '--icon-brand': tokens.background,
216
- '--icon-brand-hover': tokens.hover,
217
- '--border-brand': tokens.background,
218
- '--text-onbrand': tokens.onBrand,
219
- '--icon-onbrand': tokens.onBrand,
220
- '--color-primary': tokens.background,
221
- '--color-primary-hover': tokens.hover,
222
- '--color-primary-disabled': tokens.disabled,
223
- '--color-primary-soft': tokens.soft,
224
- '--color-accent': tokens.background,
225
- '--color-on-primary': tokens.onBrand,
226
- };
227
- }
228
- function serializeBrandStyle(brand) {
229
- return Object.entries(brandCssVariables(brand))
230
- .map(([name, value]) => `${name}:${value}`)
231
- .join(';');
232
- }
233
- function isPresetBrand(brand) {
234
- return brandPresets.some((preset) => preset.id === brand.id && preset.color === brand.color);
235
- }
236
- function isBrandColorInput(value) {
237
- return (typeof value === 'object' &&
238
- value !== null &&
239
- 'color' in value &&
240
- typeof value.color === 'string' &&
241
- (!('id' in value) || value.id === undefined || typeof value.id === 'string') &&
242
- (!('label' in value) || value.label === undefined || typeof value.label === 'string'));
243
- }
244
- function assertTheme(theme) {
245
- if (theme !== 'dark' && theme !== 'light')
246
- throw new TypeError(`Invalid theme: ${theme}`);
247
- }
248
- /**
249
- * Reads a design-token value (CSS variable) for the active theme, for third-party adapters (contract ui-adapters.md §3.1).
250
- * Data source: tokens.css variables on html[data-theme] (getComputedStyle reads the latest effective value).
251
- * Returns undefined without a document (SSR/non-browser) or when the variable is undefined — adapters must degrade gracefully.
252
- */
253
- export function resolveUiToken(name) {
254
- const doc = globalThis.document;
255
- if (doc === undefined)
256
- return undefined;
257
- const value = doc.defaultView
258
- ?.getComputedStyle(doc.documentElement)
259
- .getPropertyValue(name)
260
- .trim();
261
- return value === undefined || value === '' ? undefined : value;
262
- }
package/dist/tokens.css DELETED
@@ -1,449 +0,0 @@
1
- @layer vobs.tokens, vobs.base, vobs.components, vobs.utilities, vobs.application;
2
- @layer vobs.tokens {
3
- :root {
4
- --radius-2: 2px;
5
- --radius-4: 4px;
6
- --radius-6: 6px;
7
- --radius-8: 8px;
8
- --radius-10: 10px;
9
- --radius-full: 9999px;
10
- --spacer-0: 0px;
11
- --spacer-4: 4px;
12
- --spacer-6: 6px;
13
- --spacer-8: 8px;
14
- --spacer-12: 12px;
15
- --spacer-16: 16px;
16
- --spacer-24: 24px;
17
- --spacer-32: 32px;
18
- --spacer-40: 40px;
19
- --k-icon-xs: 14px;
20
- --k-icon-sm: 16px;
21
- --k-icon-md: 20px;
22
- --k-icon-lg: 24px;
23
- --font-family-default: SF Pro Text;
24
- --font-family-heading: SF Pro;
25
- --font-family-mono: JetBrains Mono;
26
- --font-family-base: var(--font-family-default);
27
- --font-family-heading-alias: var(--font-family-heading);
28
- --font-family-mono-alias: var(--font-family-mono);
29
- --body-xs-font-family: "SF Pro Text", system-ui, -apple-system, sans-serif;
30
- --body-xs-font-size: 10px;
31
- --body-xs-font-weight: 400;
32
- --body-xs-line-height: 14px;
33
- --body-sm-font-family: "SF Pro Text", system-ui, -apple-system, sans-serif;
34
- --body-sm-font-size: 11px;
35
- --body-sm-font-weight: 400;
36
- --body-sm-line-height: 16px;
37
- --body-sm-strong-font-family: "SF Pro Text", system-ui, -apple-system, sans-serif;
38
- --body-sm-strong-font-size: 11px;
39
- --body-sm-strong-font-weight: 500;
40
- --body-sm-strong-line-height: 16px;
41
- --body-md-font-family: "SF Pro Text", system-ui, -apple-system, sans-serif;
42
- --body-md-font-size: 12px;
43
- --body-md-font-weight: 400;
44
- --body-md-line-height: 18px;
45
- --body-md-strong-font-family: "SF Pro Text", system-ui, -apple-system, sans-serif;
46
- --body-md-strong-font-size: 12px;
47
- --body-md-strong-font-weight: 500;
48
- --body-md-strong-line-height: 18px;
49
- --body-base-font-family: "SF Pro Text", system-ui, -apple-system, sans-serif;
50
- --body-base-font-size: 13px;
51
- --body-base-font-weight: 400;
52
- --body-base-line-height: 20px;
53
- --body-base-strong-font-family: "SF Pro Text", system-ui, -apple-system, sans-serif;
54
- --body-base-strong-font-size: 13px;
55
- --body-base-strong-font-weight: 500;
56
- --body-base-strong-line-height: 20px;
57
- --heading-3xs-font-family: "SF Pro Text", system-ui, -apple-system, sans-serif;
58
- --heading-3xs-font-size: 11px;
59
- --heading-3xs-font-weight: 600;
60
- --heading-3xs-line-height: 16px;
61
- --heading-2xs-font-family: "SF Pro Text", system-ui, -apple-system, sans-serif;
62
- --heading-2xs-font-size: 12px;
63
- --heading-2xs-font-weight: 600;
64
- --heading-2xs-line-height: 18px;
65
- --heading-xs-font-family: "SF Pro Text", system-ui, -apple-system, sans-serif;
66
- --heading-xs-font-size: 13px;
67
- --heading-xs-font-weight: 600;
68
- --heading-xs-line-height: 20px;
69
- --heading-sm-font-family: "SF Pro Text", system-ui, -apple-system, sans-serif;
70
- --heading-sm-font-size: 16px;
71
- --heading-sm-font-weight: 600;
72
- --heading-sm-line-height: 24px;
73
- --heading-md-font-family: "SF Pro", system-ui, -apple-system, sans-serif;
74
- --heading-md-font-size: 20px;
75
- --heading-md-font-weight: 600;
76
- --heading-md-line-height: 28px;
77
- --heading-lg-font-family: "SF Pro", system-ui, -apple-system, sans-serif;
78
- --heading-lg-font-size: 22px;
79
- --heading-lg-font-weight: 600;
80
- --heading-lg-line-height: 30px;
81
- --heading-xl-font-family: "SF Pro", system-ui, -apple-system, sans-serif;
82
- --heading-xl-font-size: 24px;
83
- --heading-xl-font-weight: 600;
84
- --heading-xl-line-height: 32px;
85
- --heading-2xl-font-family: "SF Pro", system-ui, -apple-system, sans-serif;
86
- --heading-2xl-font-size: 28px;
87
- --heading-2xl-font-weight: 600;
88
- --heading-2xl-line-height: 36px;
89
- --heading-3xl-font-family: "SF Pro", system-ui, -apple-system, sans-serif;
90
- --heading-3xl-font-size: 32px;
91
- --heading-3xl-font-weight: 600;
92
- --heading-3xl-line-height: 40px;
93
- --code-editor-font-family: "JetBrains Mono", system-ui, -apple-system, sans-serif;
94
- --code-editor-font-size: 13px;
95
- --code-editor-font-weight: 450;
96
- --code-editor-line-height: 20px;
97
- --code-terminal-font-family: "JetBrains Mono", system-ui, -apple-system, sans-serif;
98
- --code-terminal-font-size: 12px;
99
- --code-terminal-font-weight: 450;
100
- --code-terminal-line-height: 18px;
101
- --font-weight-default: 400;
102
- --font-weight-code: 450;
103
- --font-weight-medium: 500;
104
- --font-weight-strong: 600;
105
- --z-index-dropdown: 2000;
106
- --z-index-drawer: 2500;
107
- --z-index-modal: 3000;
108
- --z-index-notification: 3500;
109
- --z-index-tooltip: 4000;
110
- --transition-fast: 0.12s ease;
111
- --transition-normal: 0.2s ease;
112
- --transition-slow: 0.3s ease;
113
- --breakpoint-sm: 576px;
114
- --breakpoint-md: 768px;
115
- --breakpoint-lg: 1024px;
116
- --breakpoint-xl: 1280px;
117
- }
118
-
119
- :root,
120
- [data-theme="dark"] {
121
- color-scheme: dark;
122
- --bg-base-default: #1A1B1D;
123
- --bg-base-secondary: #222427;
124
- --bg-base-tertiary: #2A2D31;
125
- --bg-tooltip: #1A1B1D;
126
- --bg-menu: #202123;
127
- --bg-invert: #DADDE5;
128
- --bg-invert-hover: #EDEFF2;
129
- --bg-invert-active: #979AA4;
130
- --bg-invert-disabled: rgba(224, 226, 242, 0.12);
131
- --bg-overlay-l1: rgba(224, 226, 242, 0.04);
132
- --bg-overlay-l2: rgba(224, 226, 242, 0.06);
133
- --bg-overlay-l3: rgba(224, 226, 242, 0.08);
134
- --bg-overlay-l4: rgba(224, 226, 242, 0.12);
135
- --text-default: #D1D3DB;
136
- --text-default-hover: #F5F9FE;
137
- --text-default-active: #F5F9FE;
138
- --text-secondary: #9599A6;
139
- --text-secondary-hover: #D1D3DB;
140
- --text-secondary-active: #D1D3DB;
141
- --text-tertiary: #666B75;
142
- --text-disabled: #666B75;
143
- --text-onbrand: #0C0C0D;
144
- --text-onaccent: #0C0C0D;
145
- --icon-default: #D1D3DB;
146
- --icon-default-hover: #F5F9FE;
147
- --icon-default-active: #F5F9FE;
148
- --icon-secondary: #9599A6;
149
- --icon-secondary-hover: #D1D3DB;
150
- --icon-secondary-active: #D1D3DB;
151
- --icon-tertiary: #666B75;
152
- --icon-disabled: #666B75;
153
- --icon-onbrand: #0C0C0D;
154
- --icon-onaccent: #0C0C0D;
155
- --border-neutral-l1: rgba(224, 226, 242, 0.1);
156
- --border-neutral-l2: rgba(224, 226, 242, 0.16);
157
- --border-neutral-l3: rgba(224, 226, 242, 0.2);
158
- --border-contrast: #FFFFFF;
159
- --status-primary-default: #387BFF;
160
- --status-primary-hover: #4C88FF;
161
- --status-primary-active: #1759DD;
162
- --status-primary-surface-l1: rgba(53, 121, 255, 0.18);
163
- --status-primary-surface-l2: rgba(53, 121, 255, 0.28);
164
- --status-primary-surface-l3: rgba(53, 121, 255, 0.36);
165
- --status-info-default: var(--status-primary-default);
166
- --status-info-surface-l1: var(--status-primary-surface-l1);
167
- --status-success-default: #33C192;
168
- --status-success-hover: #5ED4AD;
169
- --status-success-active: #27B082;
170
- --status-success-surface-l1: rgba(0, 165, 110, 0.18);
171
- --status-success-surface-l2: rgba(0, 165, 110, 0.28);
172
- --status-success-surface-l3: rgba(0, 165, 110, 0.36);
173
- --status-alert-default: #D29D00;
174
- --status-alert-hover: #DFB949;
175
- --status-alert-active: #AB8820;
176
- --status-alert-surface-l1: rgba(210, 157, 0, 0.16);
177
- --status-alert-surface-l2: rgba(210, 157, 0, 0.28);
178
- --status-alert-surface-l3: rgba(210, 157, 0, 0.36);
179
- --status-warning-default: #D27E24;
180
- --status-warning-hover: #D78B28;
181
- --status-warning-active: #B46510;
182
- --status-warning-surface-l1: rgba(210, 126, 36, 0.16);
183
- --status-warning-surface-l2: rgba(210, 126, 36, 0.28);
184
- --status-warning-surface-l3: rgba(210, 126, 36, 0.36);
185
- --status-error-default: #F65A5A;
186
- --status-error-hover: #F86262;
187
- --status-error-active: #B33636;
188
- --status-error-surface-l1: rgba(246, 70, 70, 0.18);
189
- --status-error-surface-l2: rgba(246, 70, 70, 0.28);
190
- --status-error-surface-l3: rgba(246, 70, 70, 0.36);
191
- --code-text: #E0E3EE;
192
- --code-doc: #7F838C;
193
- --code-link: #3C7EFF;
194
- --code-number: #F48CCA;
195
- --code-action: #B38CFF;
196
- --code-instruction: #F0D8FF;
197
- --code-function: #F29D79;
198
- --code-constant: #80BBFF;
199
- --code-parameter: #82D99F;
200
- --code-attribute: #DED47E;
201
- --code-tag: #F2858C;
202
- --color-background: var(--bg-base-default);
203
- --color-surface: var(--bg-base-secondary);
204
- --color-surface-variant: var(--bg-base-tertiary);
205
- --color-overlay-1: var(--bg-overlay-l1);
206
- --color-overlay-2: var(--bg-overlay-l2);
207
- --color-overlay-3: var(--bg-overlay-l3);
208
- --color-overlay-4: var(--bg-overlay-l4);
209
- --color-card: var(--bg-base-secondary);
210
- --color-tooltip: var(--bg-tooltip);
211
- --color-menu: var(--bg-menu);
212
- --color-foreground: var(--text-default);
213
- --color-foreground-hover: var(--text-default-hover);
214
- --color-on-surface: var(--text-default);
215
- --color-on-surface-variant: var(--text-secondary);
216
- --color-muted-foreground: var(--text-secondary);
217
- --color-disabled-foreground: var(--text-disabled);
218
- --color-border: var(--border-neutral-l1);
219
- --color-border-strong: var(--border-neutral-l2);
220
- --color-border-stronger: var(--border-neutral-l3);
221
- --color-border-contrast: var(--border-contrast);
222
- --color-outline: var(--border-neutral-l1);
223
- --color-primary: var(--bg-brand);
224
- --color-primary-hover: var(--bg-brand-hover);
225
- --color-primary-disabled: var(--bg-brand-disabled);
226
- --color-primary-soft: var(--bg-brand-popup);
227
- --color-accent: var(--bg-brand);
228
- --color-on-primary: var(--text-onbrand);
229
- --color-info: var(--status-primary-default);
230
- --color-success: var(--status-success-default);
231
- --color-warning: var(--status-warning-default);
232
- --color-error: var(--status-error-default);
233
- --color-error-soft: var(--status-error-surface-l1);
234
- }
235
-
236
- [data-theme="light"] {
237
- color-scheme: light;
238
- --bg-base-default: #FFFFFF;
239
- --bg-base-secondary: #F5F6F8;
240
- --bg-base-tertiary: #EDF0F5;
241
- --bg-overlay-l1: rgba(0, 0, 0, 0.04);
242
- --bg-overlay-l2: rgba(0, 0, 0, 0.06);
243
- --bg-overlay-l3: rgba(0, 0, 0, 0.08);
244
- --bg-overlay-l4: rgba(0, 0, 0, 0.12);
245
- --text-default: #0F1117;
246
- --text-secondary: #4B5563;
247
- --text-tertiary: #5B6370;
248
- --text-disabled: #525A68;
249
- --text-onbrand: #FFFFFF;
250
- --icon-default: #0F1117;
251
- --icon-secondary: #4B5563;
252
- --icon-tertiary: #5B6370;
253
- --icon-disabled: #525A68;
254
- --border-neutral-l1: rgba(0, 0, 0, 0.12);
255
- --border-neutral-l2: rgba(0, 0, 0, 0.18);
256
- --border-neutral-l3: rgba(0, 0, 0, 0.25);
257
- --status-success-default: #16A34A;
258
- --status-warning-default: #CA8A04;
259
- --status-error-default: #DC2626;
260
- --status-info-default: #2E69FF;
261
- --status-success-surface-l1: rgba(22, 163, 74, 0.08);
262
- --status-warning-surface-l1: rgba(202, 138, 4, 0.08);
263
- --status-error-surface-l1: rgba(220, 38, 38, 0.08);
264
- --status-info-surface-l1: rgba(46, 105, 255, 0.08);
265
- --color-background: var(--bg-base-default);
266
- --color-surface: var(--bg-base-secondary);
267
- --color-surface-variant: var(--bg-base-tertiary);
268
- --color-overlay-1: var(--bg-overlay-l1);
269
- --color-overlay-2: var(--bg-overlay-l2);
270
- --color-overlay-3: var(--bg-overlay-l3);
271
- --color-overlay-4: var(--bg-overlay-l4);
272
- --color-card: var(--bg-base-secondary);
273
- --color-tooltip: var(--bg-tooltip);
274
- --color-menu: var(--bg-menu);
275
- --color-foreground: var(--text-default);
276
- --color-foreground-hover: var(--text-default-hover);
277
- --color-on-surface: var(--text-default);
278
- --color-on-surface-variant: var(--text-secondary);
279
- --color-muted-foreground: var(--text-secondary);
280
- --color-disabled-foreground: var(--text-disabled);
281
- --color-border: var(--border-neutral-l1);
282
- --color-border-strong: var(--border-neutral-l2);
283
- --color-border-stronger: var(--border-neutral-l3);
284
- --color-border-contrast: var(--border-contrast);
285
- --color-outline: var(--border-neutral-l1);
286
- --color-primary: var(--bg-brand);
287
- --color-primary-hover: var(--bg-brand-hover);
288
- --color-primary-disabled: var(--bg-brand-disabled);
289
- --color-primary-soft: var(--bg-brand-popup);
290
- --color-accent: var(--bg-brand);
291
- --color-on-primary: var(--text-onbrand);
292
- --color-info: var(--status-primary-default);
293
- --color-success: var(--status-success-default);
294
- --color-warning: var(--status-warning-default);
295
- --color-error: var(--status-error-default);
296
- --color-error-soft: var(--status-error-surface-l1);
297
- }
298
-
299
- :root,
300
- [data-brand="green"] {
301
- --bg-brand: #32F08C;
302
- --bg-brand-hover: #0FDC78;
303
- --bg-brand-disabled: rgba(50, 240, 140, 0.2);
304
- --bg-brand-popup: rgba(50, 240, 140, 0.12);
305
- --bg-brand-overlay: rgba(50, 240, 140, 0.12);
306
- --text-brand: #32F08C;
307
- --text-brand-hover: #0FDC78;
308
- --icon-brand: #32F08C;
309
- --icon-brand-hover: #0FDC78;
310
- --border-brand: #32F08C;
311
- --text-onbrand: #0C0C0D;
312
- --icon-onbrand: #0C0C0D;
313
- }
314
-
315
- [data-brand="blue"] {
316
- --bg-brand: #80C1FF;
317
- --bg-brand-hover: #6EA6DB;
318
- --bg-brand-disabled: rgba(128, 193, 255, 0.3);
319
- --bg-brand-popup: rgba(128, 193, 255, 0.12);
320
- --bg-brand-overlay: rgba(128, 193, 255, 0.12);
321
- --text-brand: #80C1FF;
322
- --text-brand-hover: #6EA6DB;
323
- --icon-brand: #80C1FF;
324
- --icon-brand-hover: #6EA6DB;
325
- --border-brand: #80C1FF;
326
- --text-onbrand: #0C0C0D;
327
- --icon-onbrand: #0C0C0D;
328
- }
329
-
330
- [data-brand="purple"] {
331
- --bg-brand: #8E80FF;
332
- --bg-brand-hover: #9E92FF;
333
- --bg-brand-disabled: rgba(142, 128, 255, 0.3);
334
- --bg-brand-popup: rgba(142, 128, 255, 0.12);
335
- --bg-brand-overlay: rgba(142, 128, 255, 0.12);
336
- --text-brand: #8E80FF;
337
- --text-brand-hover: #9E92FF;
338
- --icon-brand: #8E80FF;
339
- --icon-brand-hover: #9E92FF;
340
- --border-brand: #8E80FF;
341
- --text-onbrand: #0C0C0D;
342
- --icon-onbrand: #0C0C0D;
343
- }
344
-
345
- [data-brand="yellow"] {
346
- --bg-brand: #FFD080;
347
- --bg-brand-hover: #DBB36E;
348
- --bg-brand-disabled: rgba(255, 208, 128, 0.3);
349
- --bg-brand-popup: rgba(255, 208, 128, 0.12);
350
- --bg-brand-overlay: rgba(255, 208, 128, 0.12);
351
- --text-brand: #FFD080;
352
- --text-brand-hover: #DBB36E;
353
- --icon-brand: #FFD080;
354
- --icon-brand-hover: #DBB36E;
355
- --border-brand: #FFD080;
356
- --text-onbrand: #0C0C0D;
357
- --icon-onbrand: #0C0C0D;
358
- }
359
-
360
- [data-brand="red"] {
361
- --bg-brand: #FF8080;
362
- --bg-brand-hover: #DB6E6E;
363
- --bg-brand-disabled: rgba(255, 128, 128, 0.3);
364
- --bg-brand-popup: rgba(255, 128, 128, 0.12);
365
- --bg-brand-overlay: rgba(255, 128, 128, 0.12);
366
- --text-brand: #FF8080;
367
- --text-brand-hover: #DB6E6E;
368
- --icon-brand: #FF8080;
369
- --icon-brand-hover: #DB6E6E;
370
- --border-brand: #FF8080;
371
- --text-onbrand: #0C0C0D;
372
- --icon-onbrand: #0C0C0D;
373
- }
374
-
375
- [data-brand="teal"] {
376
- --bg-brand: #2DD288;
377
- --bg-brand-hover: #27B575;
378
- --bg-brand-disabled: rgba(45, 210, 136, 0.3);
379
- --bg-brand-popup: rgba(45, 210, 136, 0.12);
380
- --bg-brand-overlay: rgba(45, 210, 136, 0.12);
381
- --text-brand: #2DD288;
382
- --text-brand-hover: #27B575;
383
- --icon-brand: #2DD288;
384
- --icon-brand-hover: #27B575;
385
- --border-brand: #2DD288;
386
- --text-onbrand: #0C0C0D;
387
- --icon-onbrand: #0C0C0D;
388
- }
389
-
390
- [data-brand="cyan"] {
391
- --bg-brand: #04CBE5;
392
- --bg-brand-hover: #27D2E9;
393
- --bg-brand-disabled: rgba(4, 203, 229, 0.3);
394
- --bg-brand-popup: rgba(4, 203, 229, 0.12);
395
- --bg-brand-overlay: rgba(4, 203, 229, 0.12);
396
- --text-brand: #04CBE5;
397
- --text-brand-hover: #27D2E9;
398
- --icon-brand: #04CBE5;
399
- --icon-brand-hover: #27D2E9;
400
- --border-brand: #04CBE5;
401
- --text-onbrand: #0C0C0D;
402
- --icon-onbrand: #0C0C0D;
403
- }
404
-
405
- [data-brand="violet"] {
406
- --bg-brand: #BFA5FF;
407
- --bg-brand-hover: #A48EDB;
408
- --bg-brand-disabled: rgba(191, 165, 255, 0.3);
409
- --bg-brand-popup: rgba(191, 165, 255, 0.12);
410
- --bg-brand-overlay: rgba(191, 165, 255, 0.12);
411
- --text-brand: #BFA5FF;
412
- --text-brand-hover: #A48EDB;
413
- --icon-brand: #BFA5FF;
414
- --icon-brand-hover: #A48EDB;
415
- --border-brand: #BFA5FF;
416
- --text-onbrand: #0C0C0D;
417
- --icon-onbrand: #0C0C0D;
418
- }
419
-
420
- [data-brand="slate"] {
421
- --bg-brand: #AFB9CF;
422
- --bg-brand-hover: #979FB2;
423
- --bg-brand-disabled: rgba(175, 185, 207, 0.3);
424
- --bg-brand-popup: rgba(175, 185, 207, 0.12);
425
- --bg-brand-overlay: rgba(175, 185, 207, 0.12);
426
- --text-brand: #AFB9CF;
427
- --text-brand-hover: #979FB2;
428
- --icon-brand: #AFB9CF;
429
- --icon-brand-hover: #979FB2;
430
- --border-brand: #AFB9CF;
431
- --text-onbrand: #0C0C0D;
432
- --icon-onbrand: #0C0C0D;
433
- }
434
-
435
- [data-brand="neutral"] {
436
- --bg-brand: #BABABA;
437
- --bg-brand-hover: #A0A0A0;
438
- --bg-brand-disabled: rgba(186, 186, 186, 0.3);
439
- --bg-brand-popup: rgba(186, 186, 186, 0.12);
440
- --bg-brand-overlay: rgba(186, 186, 186, 0.12);
441
- --text-brand: #BABABA;
442
- --text-brand-hover: #A0A0A0;
443
- --icon-brand: #BABABA;
444
- --icon-brand-hover: #A0A0A0;
445
- --border-brand: #BABABA;
446
- --text-onbrand: #0C0C0D;
447
- --icon-onbrand: #0C0C0D;
448
- }
449
- }