@dybo-ai/design 1.2.0 → 2.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.
package/theme.css CHANGED
@@ -1,342 +1,441 @@
1
1
  /* =========================================================================
2
- DYBO Design System — CSS Custom Properties
3
- Source: Figma "DYBO" (file ZHtkvTEeTYlNVbSncLyI1a)
4
- Style: Glassmorphism (translucent surfaces + backdrop blur)
5
- Font: Urbanist load from Google Fonts:
2
+ DYBO Design System — CSS Custom Properties (v2 default)
3
+ Source of truth: fig-teste/designSystem/tokens.css the real system DYBO's
4
+ product screens are designed against. Promoted here from what used to be a
5
+ side "portal" namespace; the OLD theme is preserved verbatim at
6
+ `@dybo-ai/design/legacy-theme.css` for anything that still needs it.
7
+ Style: glassmorphism — translucent surfaces, `backdrop-blur-sm`, white
8
+ stroke in light mode. Full light + dark support via a `.dark` class on
9
+ `<html>` (never `data-theme`).
10
+ Font: Urbanist — load from Google Fonts or self-host (`@fontsource/urbanist`):
6
11
  <link href="https://fonts.googleapis.com/css2?family=Urbanist:wght@400;500;600;700&display=swap" rel="stylesheet">
7
12
  ========================================================================= */
8
13
 
14
+ /* ---- LIGHT MODE (default) ---- */
9
15
  :root {
10
- /* ---- Brand ---- */
11
- --dybo-color-brand-logo: #1d335c;
12
- --dybo-color-brand-blue-yonder: #5878a7;
13
- --dybo-color-brand-dark-orb: #141927;
14
- --dybo-color-brand-cultured: #f3f6fa;
15
- --dybo-color-brand-gainsboro: #dbdfe5;
16
- --dybo-color-brand-dandelion: #e9d72f;
17
-
18
- /* ---- Portal (ticket-management / client portal) ---- */
19
- --dybo-portal-surface-operator: #e4e4e4;
20
- --dybo-portal-surface-card-high: rgba(240, 241, 244, 0.92);
21
- --dybo-portal-surface-card-high-dark: rgba(18, 26, 45, 0.92);
22
- --dybo-portal-shadow-level-1: 0px 4px 8px #1419271f;
23
- --dybo-portal-shadow-level-2: 0px 8px 28px #14192729;
24
- --dybo-portal-feedback-success-light: #90eabd;
25
- --dybo-portal-feedback-success-bg: #d6f0e3;
26
- --dybo-portal-feedback-warning: #cc6600;
27
- --dybo-portal-feedback-warning-bg: #fff2e5;
28
- --dybo-portal-feedback-destructive: #fa3848;
29
- --dybo-portal-feedback-info-bg: #d9e3f0;
30
- --dybo-portal-priority-urgent-bg: rgba(250, 56, 72, 0.12);
31
- --dybo-portal-priority-urgent-fg: #c81e2c;
32
- --dybo-portal-priority-high-bg: rgba(255, 128, 0, 0.15);
33
- --dybo-portal-priority-high-fg: #a85400;
34
- --dybo-portal-priority-medium-bg: rgba(242, 185, 13, 0.2);
35
- --dybo-portal-priority-medium-fg: #9d6607;
36
- --dybo-portal-priority-low-bg: rgba(151, 163, 180, 0.24);
37
- --dybo-portal-priority-low-fg: #50627c;
38
- --dybo-portal-priority-none-bg: rgba(192, 198, 206, 0.35);
39
- --dybo-portal-priority-none-fg: #677283;
40
- --dybo-portal-ticket-open-bg: #d9e3f2;
41
- --dybo-portal-ticket-open-fg: #2e5b9e;
42
- --dybo-portal-ticket-pending-bg: #e9dff6;
43
- --dybo-portal-ticket-pending-fg: #7146aa;
44
- --dybo-portal-ticket-snoozed-bg: #d7dde5;
45
- --dybo-portal-ticket-snoozed-fg: #58687e;
46
- --dybo-portal-ticket-resolved-bg: #d6f0e3;
47
- --dybo-portal-ticket-resolved-fg: #1a6640;
48
- --dybo-icon-rail-width: 80px;
16
+ /* Semantic */
17
+ --background: 216 25% 92%; /* cool blue-grey — page background */
18
+ --foreground: 218 56% 9%; /* near-black navy — primary text */
19
+
20
+ --card: 214 41% 97%; /* near-white, faint blue — card surface */
21
+ --card-foreground: 218 56% 9%;
22
+
23
+ --popover: 0 0% 100%;
24
+ --popover-foreground: 218 56% 9%;
25
+
26
+ --primary: 218 56% 9%; /* near-black navy — primary action */
27
+ --primary-foreground: 0 0% 100%;
28
+
29
+ --secondary: 0 0% 100%; /* white — secondary action */
30
+ --secondary-foreground: 218 56% 9%;
31
+
32
+ --muted: 216 16% 88%;
33
+ --muted-foreground: 216 31% 50%;
34
+
35
+ --accent: 219 52% 24%;
36
+ --accent-foreground: 214 41% 97%;
37
+
38
+ --destructive: 355 95% 60%; /* red — reserved for BLOCKING errors only */
39
+ --destructive-foreground: 0 0% 100%;
40
+
41
+ --border: 0 0% 100%; /* white — light-mode card border */
42
+ --input: 240 14% 96%;
43
+ --ring: 219 52% 24%;
44
+
45
+ /* Status */
46
+ --success: 150 68% 74%;
47
+ --success-foreground: 218 56% 9%;
48
+ --success-background: 151 45% 89%;
49
+
50
+ --warning: 30 100% 40%; /* amber — cautionary, non-blocking */
51
+ --warning-foreground: 218 56% 9%;
52
+ --warning-background: 30 100% 95%;
53
+
54
+ --error: 30 100% 40%; /* NOTE: same as --warning — the real red is --destructive */
55
+ --error-foreground: 0 0% 100%;
56
+ --error-background: 30 100% 95%;
57
+
58
+ --info: 216 31% 50%;
59
+ --info-foreground: 218 56% 9%;
60
+ --info-background: 216 31% 89%;
61
+
62
+ /* Category tags (a different axis than status) */
63
+ --tag-amber-background: 35 100% 95%;
64
+ --tag-amber-foreground: 30 100% 24%;
65
+ --tag-purple-background: 269 100% 95%;
66
+ --tag-purple-foreground: 273 67% 39%;
67
+ --tag-red-background: 355 100% 95%;
68
+ --tag-red-foreground: 353 78% 32%;
69
+
70
+ /* Modal/drawer scrim base */
71
+ --overlay-scrim: 224 32% 12%;
72
+
73
+ /* Brand */
74
+ --brand-dark-orb: 224 32% 12%;
75
+ --brand-indigo: 219 52% 24%; /* inactive nav icon, light mode */
76
+ --brand-blue-yonder: 216 31% 50%; /* inactive nav icon, dark mode */
77
+ --brand-gainsboro: 216 16% 88%;
78
+ --brand-cultured: 214 41% 97%;
79
+ --brand-dandelion: 54 81% 55%;
80
+ --brand-black: 0 0% 0%;
81
+ --brand-white: 0 0% 100%;
49
82
 
50
- /* ---- Text ---- */
51
- --dybo-color-text-primary: #0a1323;
52
- --dybo-color-text-secondary: #f4f4f6;
53
- --dybo-color-text-muted: #545f74;
54
- --dybo-color-text-gray: #868686;
55
-
56
- /* ---- Neutral ---- */
57
- --dybo-color-black: #000000;
58
- --dybo-color-white: #ffffff;
59
- --dybo-color-grayish-blue-50: #f4f4f6;
60
- --dybo-color-grayish-blue-300: #c2c7cf;
61
- --dybo-color-midnight-sky-300: #e6e7f7;
62
- --dybo-color-midnight-sky-700: #48495d;
63
-
64
- /* ---- Surfaces (glass) ---- */
65
- --dybo-surface-page: #e6eaf0;
66
- --dybo-surface-card: rgba(240, 241, 244, 0.7);
67
- --dybo-surface-card-solid: rgba(240, 241, 244, 0.9);
68
- --dybo-surface-input: rgba(244, 244, 246, 0.7);
69
-
70
- /* ---- Lines & shadows ---- */
71
- --dybo-line-stroke: #ffffff;
72
- --dybo-shadow-key: rgba(10, 19, 35, 0.1);
73
- --dybo-shadow-ambient: rgba(170, 180, 192, 0.73);
74
- --dybo-elevation-card:
75
- 0 8px 24px rgba(10, 19, 35, 0.1), 0 2px 8px rgba(170, 180, 192, 0.35);
76
- --dybo-drop-shadow: 0 4px 4px rgba(10, 19, 35, 0.1);
77
-
78
- /* ---- Semantic (recommended mapping) ---- */
79
- --dybo-success: #20a156;
80
- --dybo-success-bright: #28ca6b;
81
- --dybo-success-bg: #eafbf1;
82
- --dybo-warning: #f16c24;
83
- --dybo-warning-bg: #ffe5d8;
84
- --dybo-danger: #a21a17;
85
- --dybo-danger-bg: #fffbfb;
86
- --dybo-info: #0399ae;
87
- --dybo-info-bg: #d3f7fc;
88
-
89
- /* ---- Status / priority (DYBO domain) ---- */
90
- --dybo-status-resolved-fg: #0399ae;
91
- --dybo-status-resolved-bg: #d3f7fc;
92
- --dybo-status-high-priority-fg: #682a5d;
93
- --dybo-status-high-priority-bg: #eee0ec;
94
- --dybo-status-medium-priority-fg: #f16c24;
95
- --dybo-status-medium-priority-bg: #ffe5d8;
96
- --dybo-status-brand-fg: #0a1323;
97
- --dybo-status-brand-bg: #d0d3fe;
98
-
99
- /* ---- Typography ---- */
100
- --dybo-font-family: "Urbanist", sans-serif;
83
+ /* Radius */
84
+ --radius-none: 0px;
85
+ --radius-sm: 12px; /* inputs, selects, cards */
86
+ --radius-md: 20px; /* dropdown panels, pill buttons */
87
+ --radius-full: 999px; /* pills, avatars */
88
+ --radius: var(--radius-md);
89
+
90
+ /* Opacity */
91
+ --opacity-semi-opaque: 0.4; /* disabled */
92
+ --opacity-intense: 0.64; /* secondary text/labels */
93
+ --opacity-medium: 0.32; /* "coming soon" elements */
94
+ --opacity-light: 0.16;
95
+ --opacity-semi-transparent: 0.08;
96
+
97
+ /* Shadows */
98
+ --shadow-level-1: 0px 4px 8px #1419271f; /* cards, sidebar pill */
99
+ --shadow-level-2: 0px 8px 28px #14192729; /* modals, drawers */
100
+
101
+ /* Dense-card surface */
102
+ --card-bg-with-opacity: rgba(240, 241, 244, 0.92);
103
+
104
+ /* Typography */
105
+ --font-display: "Urbanist", sans-serif;
106
+ --dybo-font-size-xs: 12px;
107
+ --dybo-font-size-sm: 14px;
108
+ --dybo-font-size-md: 16px;
109
+ --dybo-font-size-lg: 18px;
110
+ --dybo-font-size-xl: 24px;
101
111
  --dybo-font-weight-regular: 400;
102
112
  --dybo-font-weight-medium: 500;
103
113
  --dybo-font-weight-semibold: 600;
104
114
  --dybo-font-weight-bold: 700;
105
115
 
106
- --dybo-font-size-xs: 12px; /* Uppercase / Tiny */
107
- --dybo-font-size-sm: 14px; /* Small body / H6 / links / placeholder */
108
- --dybo-font-size-md: 16px; /* Body / Link */
109
- --dybo-font-size-lg: 18px; /* Subtitle */
110
- --dybo-font-size-xl: 24px; /* Medium Title */
111
-
112
- /* ---- Spacing ---- */
113
- --dybo-space-000: 0;
114
- --dybo-space-050: 4px;
115
- --dybo-space-100: 8px;
116
- --dybo-space-150: 12px;
117
- --dybo-space-200: 16px;
118
- --dybo-space-250: 20px;
119
- --dybo-space-400: 32px;
120
-
121
- /* ---- Radius ---- */
122
- --dybo-radius-sm: 12px;
123
- --dybo-radius-alt: 16px;
124
- --dybo-radius-md: 20px;
125
- --dybo-radius-full: 999px;
126
-
127
- /* ---- Opacity ---- */
128
- --dybo-opacity-light: 0.16;
129
- --dybo-opacity-medium: 0.32;
130
- --dybo-opacity-intense: 0.64;
131
- --dybo-opacity-semi-opaque: 0.4;
132
- --dybo-opacity-semi-transparent: 0.08;
133
-
134
- /* ---- Border ---- */
135
- --dybo-border-sm: 1px;
136
-
137
- /* ---- Glass ---- */
138
- --dybo-glass-blur: 4px;
139
-
140
- /* ---- Sidebar ---- */
141
- --dybo-sidebar-bg: #1d2433;
142
- --dybo-sidebar-hover: #273043;
143
- --dybo-sidebar-text: #c9cdd6;
144
- --dybo-sidebar-width: 240px;
145
- --dybo-topbar-height: 60px;
116
+ /* Compatibility: 80px icon rail width, used by IconRail */
117
+ --dybo-icon-rail-width: 80px;
118
+ }
119
+
120
+ /* ---- DARK MODE ---- */
121
+ .dark {
122
+ --card-bg-with-opacity: rgba(18, 26, 45, 0.92);
123
+ --background: 218 56% 9%;
124
+ --foreground: 244 20% 96%;
125
+
126
+ --card: 218 35% 13%;
127
+ --card-foreground: 244 20% 96%;
128
+
129
+ --popover: 218 15% 12%;
130
+ --popover-foreground: 244 20% 96%;
131
+
132
+ --primary: 244 20% 96%; /* inverted: light on dark */
133
+ --primary-foreground: 218 56% 9%;
134
+
135
+ --secondary: 218 35% 13%;
136
+ --secondary-foreground: 244 20% 96%;
137
+
138
+ --muted: 210 15% 30%;
139
+ --muted-foreground: 244 20% 80%;
140
+
141
+ --accent: 216 31% 50%;
142
+ --accent-foreground: 244 20% 96%;
143
+
144
+ --destructive: 0 78% 55%;
145
+ --destructive-foreground: 244 20% 96%;
146
+
147
+ --border: 210 15% 30%; /* dark grey visible border in dark mode */
148
+ --input: 218 35% 13%;
149
+ --ring: 244 20% 96%;
150
+
151
+ --success-background: 150 68% 26%;
152
+ --warning-background: 30 100% 22%;
153
+ --error-background: 30 100% 22%;
154
+ --info-background: 216 31% 28%;
155
+
156
+ --tag-amber-background: 37 64% 18%;
157
+ --tag-amber-foreground: 34 100% 83%;
158
+ --tag-purple-background: 274 53% 22%;
159
+ --tag-purple-foreground: 269 100% 92%;
160
+ --tag-red-background: 352 63% 18%;
161
+ --tag-red-foreground: 354 100% 88%;
146
162
  }
147
163
 
148
164
  /* =========================================================================
149
165
  Tailwind V4 — @theme block
150
- Generates utilities: bg-dybo-*, text-dybo-*, rounded-dybo-*, shadow-dybo-*
166
+ Generates utilities: bg-background, text-foreground, bg-card, etc. —
167
+ the same semantic names Tailwind's own config maps in every DYBO prototype.
151
168
  Usage in consuming app:
152
169
  @import "tailwindcss";
153
170
  @import "@dybo-ai/design/theme.css";
154
171
  ========================================================================= */
155
172
  @theme {
156
- /* Colors */
157
- --color-dybo-logo: #1d335c;
158
- --color-dybo-blue: #5878a7;
159
- --color-dybo-dark-orb: #141927;
160
- --color-dybo-cultured: #f3f6fa;
161
- --color-dybo-gainsboro: #dbdfe5;
162
- --color-dybo-ink: #0a1323;
163
- --color-dybo-on-dark: #f4f4f6;
164
- --color-dybo-muted: #545f74;
165
- --color-dybo-gray: #868686;
166
- --color-dybo-page: #e6eaf0;
167
- --color-dybo-stroke: #ffffff;
168
- --color-dybo-line: #c2c7cf;
169
- --color-dybo-success: #20a156;
170
- --color-dybo-success-bg: #eafbf1;
171
- --color-dybo-warning: #f16c24;
172
- --color-dybo-warning-bg: #ffe5d8;
173
- --color-dybo-danger: #a21a17;
174
- --color-dybo-danger-bg: #fffbfb;
175
- --color-dybo-info: #0399ae;
176
- --color-dybo-info-bg: #d3f7fc;
177
- --color-dybo-sidebar: #1d2433;
178
- --color-dybo-dandelion: #e9d72f;
179
- --color-dybo-operator-page: #e4e4e4;
180
-
181
- /* Border radius */
182
- --radius-dybo-sm: 12px;
183
- --radius-dybo-alt: 16px;
184
- --radius-dybo-md: 20px;
185
- --radius-dybo-full: 999px;
186
-
187
- /* Shadows */
188
- --shadow-dybo-card:
189
- 0 8px 24px rgba(10, 19, 35, 0.1), 0 2px 8px rgba(170, 180, 192, 0.35);
190
- --shadow-dybo-drop: 0 4px 4px rgba(10, 19, 35, 0.1);
191
- --shadow-dybo-portal-1: 0px 4px 8px #1419271f;
192
- --shadow-dybo-portal-2: 0px 8px 28px #14192729;
173
+ --color-background: hsl(var(--background));
174
+ --color-foreground: hsl(var(--foreground) / <alpha-value>);
175
+ --color-card: hsl(var(--card));
176
+ --color-card-foreground: hsl(var(--card-foreground));
177
+ --color-popover: hsl(var(--popover));
178
+ --color-popover-foreground: hsl(var(--popover-foreground));
179
+ --color-primary: hsl(var(--primary));
180
+ --color-primary-foreground: hsl(var(--primary-foreground));
181
+ --color-secondary: hsl(var(--secondary));
182
+ --color-secondary-foreground: hsl(var(--secondary-foreground));
183
+ --color-muted: hsl(var(--muted));
184
+ --color-muted-foreground: hsl(var(--muted-foreground));
185
+ --color-accent: hsl(var(--accent));
186
+ --color-accent-foreground: hsl(var(--accent-foreground));
187
+ --color-destructive: hsl(var(--destructive));
188
+ --color-destructive-foreground: hsl(var(--destructive-foreground));
189
+ --color-border: hsl(var(--border) / <alpha-value>);
190
+ --color-input: hsl(var(--input) / <alpha-value>);
191
+ --color-ring: hsl(var(--ring));
192
+ --color-success: hsl(var(--success));
193
+ --color-success-foreground: hsl(var(--success-foreground));
194
+ --color-success-background: hsl(var(--success-background));
195
+ --color-warning: hsl(var(--warning));
196
+ --color-warning-foreground: hsl(var(--warning-foreground));
197
+ --color-warning-background: hsl(var(--warning-background));
198
+ --color-error: hsl(var(--error));
199
+ --color-error-foreground: hsl(var(--error-foreground));
200
+ --color-error-background: hsl(var(--error-background));
201
+ --color-info: hsl(var(--info));
202
+ --color-info-foreground: hsl(var(--info-foreground));
203
+ --color-info-background: hsl(var(--info-background));
204
+ --color-brand-dark-orb: hsl(var(--brand-dark-orb) / <alpha-value>);
205
+ --color-brand-indigo: hsl(var(--brand-indigo) / <alpha-value>);
206
+ --color-brand-blue-yonder: hsl(var(--brand-blue-yonder) / <alpha-value>);
207
+ --color-brand-gainsboro: hsl(var(--brand-gainsboro) / <alpha-value>);
208
+ --color-brand-cultured: hsl(var(--brand-cultured) / <alpha-value>);
209
+ --color-brand-dandelion: hsl(var(--brand-dandelion) / <alpha-value>);
210
+ --color-brand-black: hsl(var(--brand-black) / <alpha-value>);
211
+ --color-brand-white: hsl(var(--brand-white) / <alpha-value>);
193
212
 
194
- /* Backdrop blur */
195
- --blur-dybo: 4px;
213
+ --font-display: var(--font-display);
196
214
 
197
- /* Font */
198
- --font-dybo: "Urbanist", sans-serif;
215
+ --radius-none: 0px;
216
+ --radius-sm: 12px;
217
+ --radius-DEFAULT: 12px;
218
+ --radius-md: 20px;
219
+ --radius-lg: 20px;
220
+ --radius-xl: 24px;
221
+ --radius-2xl: 28px;
222
+ --radius-full: 999px;
199
223
 
200
- /* Spacing extras */
201
- --spacing-dybo-050: 4px;
202
- --spacing-dybo-100: 8px;
203
- --spacing-dybo-150: 12px;
204
- --spacing-dybo-200: 16px;
205
- --spacing-dybo-250: 20px;
206
- --spacing-dybo-400: 32px;
224
+ --shadow-level-1: 0px 4px 8px #1419271f;
225
+ --shadow-level-2: 0px 8px 28px #14192729;
207
226
  }
208
227
 
209
- /* ---- Base + reusable helpers ---------------------------------------- */
228
+ /* ---- Base ------------------------------------------------------------ */
210
229
 
230
+ * {
231
+ border-color: hsl(var(--border));
232
+ box-sizing: border-box;
233
+ }
234
+ html {
235
+ scrollbar-gutter: stable;
236
+ }
211
237
  body {
212
- font-family: var(--dybo-font-family);
213
- color: var(--dybo-color-text-primary);
214
- background: var(--dybo-surface-page);
238
+ font-family: var(--font-display);
239
+ background-color: hsl(var(--background));
240
+ color: hsl(var(--foreground));
241
+ margin: 0;
242
+ line-height: 1.5;
243
+ }
244
+ body,
245
+ [class*="bg-"],
246
+ [class*="text-"],
247
+ [class*="border-"] {
248
+ transition:
249
+ color 0.3s cubic-bezier(0.4, 0, 0.2, 1),
250
+ background-color 0.3s cubic-bezier(0.4, 0, 0.2, 1),
251
+ border-color 0.3s cubic-bezier(0.4, 0, 0.2, 1);
252
+ }
253
+ ::-webkit-scrollbar {
254
+ width: 8px;
255
+ height: 8px;
256
+ }
257
+ ::-webkit-scrollbar-track {
258
+ background: hsl(var(--secondary));
259
+ }
260
+ ::-webkit-scrollbar-thumb {
261
+ border-radius: 999px;
262
+ background: hsl(var(--muted-foreground));
263
+ }
264
+ ::-webkit-scrollbar-thumb:hover {
265
+ background: hsl(var(--foreground));
266
+ }
267
+
268
+ /* Opacity / shadow / font utilities (not Tailwind built-ins) */
269
+ .opacity-intense {
270
+ opacity: var(--opacity-intense);
271
+ }
272
+ .opacity-medium {
273
+ opacity: var(--opacity-medium);
274
+ }
275
+ .opacity-light {
276
+ opacity: var(--opacity-light);
277
+ }
278
+ .opacity-semi-opaque {
279
+ opacity: var(--opacity-semi-opaque);
280
+ }
281
+ .opacity-semi-transparent {
282
+ opacity: var(--opacity-semi-transparent);
283
+ }
284
+ .shadow-level-1 {
285
+ box-shadow: var(--shadow-level-1);
286
+ }
287
+ .shadow-level-2 {
288
+ box-shadow: var(--shadow-level-2);
289
+ }
290
+ .font-display {
291
+ font-family: var(--font-display);
292
+ }
293
+ .font-body {
294
+ font-family: var(--font-display);
295
+ }
296
+ .line-clamp-2 {
297
+ display: -webkit-box;
298
+ -webkit-line-clamp: 2;
299
+ -webkit-box-orient: vertical;
300
+ overflow: hidden;
215
301
  }
216
302
 
217
- /* Glassmorphism card — the signature DYBO surface */
303
+ /* ---- Glassmorphism card — the signature DYBO surface ------------------ */
218
304
  .dybo-glass {
219
- background: var(--dybo-surface-card);
220
- border: var(--dybo-border-sm) solid var(--dybo-line-stroke);
221
- border-radius: var(--dybo-radius-md);
222
- box-shadow: var(--dybo-elevation-card);
223
- backdrop-filter: blur(var(--dybo-glass-blur));
224
- -webkit-backdrop-filter: blur(var(--dybo-glass-blur));
305
+ background: hsl(var(--card) / 0.7);
306
+ border: 1px solid hsl(var(--brand-white));
307
+ border-radius: var(--radius-md);
308
+ backdrop-filter: blur(4px);
309
+ -webkit-backdrop-filter: blur(4px);
310
+ }
311
+ .dark .dybo-glass {
312
+ border-color: hsl(var(--border));
313
+ }
314
+ .dybo-glass--solid {
315
+ background: var(--card-bg-with-opacity);
225
316
  }
226
317
 
227
- /* Buttons */
318
+ /* ---- Buttons ----------------------------------------------------------
319
+ Universal hover rule everywhere: hover:bg-primary + hover:text-primary-foreground
320
+ (per the non-negotiable house rule) — primary/secondary/ghost share it. */
228
321
  .dybo-btn {
229
322
  font-family: inherit;
230
323
  font-size: var(--dybo-font-size-md);
231
324
  font-weight: var(--dybo-font-weight-medium);
232
325
  letter-spacing: 1px;
233
- padding: var(--dybo-space-150) var(--dybo-space-400);
234
- border-radius: var(--dybo-radius-sm);
235
- border: none;
326
+ padding: 12px 32px;
327
+ border-radius: var(--radius-sm);
328
+ border: 1px solid transparent;
236
329
  cursor: pointer;
237
330
  transition:
238
331
  background 0.15s,
332
+ color 0.15s,
239
333
  opacity 0.15s;
240
334
  }
241
335
  .dybo-btn--primary {
242
- background: var(--dybo-color-text-primary);
243
- color: var(--dybo-color-white);
336
+ background: hsl(var(--primary));
337
+ color: hsl(var(--primary-foreground));
244
338
  }
245
339
  .dybo-btn--primary:hover {
246
- background: var(--dybo-color-brand-dark-orb);
340
+ background: hsl(var(--primary) / 0.8);
247
341
  }
248
342
  .dybo-btn--secondary {
249
- background: var(--dybo-color-grayish-blue-50);
250
- color: var(--dybo-color-text-primary);
343
+ background: hsl(var(--secondary));
344
+ color: hsl(var(--secondary-foreground));
345
+ border-color: hsl(var(--border));
251
346
  }
252
347
  .dybo-btn--secondary:hover {
253
- background: var(--dybo-color-brand-gainsboro);
348
+ background: hsl(var(--primary));
349
+ color: hsl(var(--primary-foreground));
254
350
  }
255
351
  .dybo-btn--ghost {
256
352
  background: transparent;
257
- color: var(--dybo-color-text-primary);
258
- border: 1px solid var(--dybo-color-grayish-blue-300);
353
+ color: hsl(var(--foreground));
354
+ border-color: hsl(var(--border));
259
355
  }
260
356
  .dybo-btn--ghost:hover {
261
- background: var(--dybo-color-grayish-blue-50);
357
+ background: hsl(var(--primary));
358
+ color: hsl(var(--primary-foreground));
262
359
  }
263
360
  .dybo-btn--danger {
264
- background: var(--dybo-danger);
265
- color: var(--dybo-color-white);
361
+ background: hsl(var(--destructive));
362
+ color: hsl(var(--destructive-foreground));
266
363
  }
267
364
  .dybo-btn--danger:hover {
268
365
  opacity: 0.88;
269
366
  }
270
367
  .dybo-btn:disabled {
271
- opacity: var(--dybo-opacity-intense);
368
+ opacity: var(--opacity-semi-opaque);
272
369
  cursor: not-allowed;
273
370
  }
371
+ .dybo-btn--sm {
372
+ padding: 8px 20px;
373
+ font-size: var(--dybo-font-size-sm);
374
+ }
375
+ .dybo-btn--lg {
376
+ padding: 14px 40px;
377
+ font-size: var(--dybo-font-size-lg);
378
+ }
274
379
 
275
- /* Input field */
276
- .dybo-input {
380
+ /* ---- Input / Select ---------------------------------------------------- */
381
+ .dybo-input,
382
+ .dybo-select {
277
383
  font-family: inherit;
278
384
  font-size: var(--dybo-font-size-sm);
279
- color: var(--dybo-color-text-primary);
280
- background: var(--dybo-surface-input);
281
- border: var(--dybo-border-sm) solid var(--dybo-line-stroke);
282
- border-radius: var(--dybo-radius-sm);
283
- box-shadow: var(--dybo-drop-shadow);
284
- padding: var(--dybo-space-150) var(--dybo-space-200);
385
+ color: hsl(var(--foreground));
386
+ background: hsl(var(--input));
387
+ border: 1px solid hsl(var(--border));
388
+ border-radius: var(--radius-sm);
389
+ padding: 12px 16px;
285
390
  width: 100%;
286
391
  transition:
287
392
  border-color 0.15s,
288
393
  box-shadow 0.15s;
289
394
  }
290
395
  .dybo-input::placeholder {
291
- color: var(--dybo-color-text-muted);
396
+ color: hsl(var(--muted-foreground));
292
397
  letter-spacing: 1px;
293
398
  }
294
- .dybo-input:focus {
399
+ .dybo-input:focus,
400
+ .dybo-select:focus {
295
401
  outline: none;
296
- border-color: var(--dybo-color-brand-blue-yonder);
297
- box-shadow: 0 0 0 3px rgba(88, 120, 167, 0.18);
402
+ border-color: hsl(var(--ring));
403
+ box-shadow: 0 0 0 3px hsl(var(--ring) / 0.18);
404
+ }
405
+ .dybo-input--error,
406
+ .dybo-select--error {
407
+ border-color: hsl(var(--destructive)) !important;
408
+ box-shadow: 0 0 0 1px hsl(var(--destructive) / 0.3);
298
409
  }
299
-
300
- /* Select field */
301
410
  .dybo-select {
302
- font-family: inherit;
303
- font-size: var(--dybo-font-size-sm);
304
- color: var(--dybo-color-text-primary);
305
- background: var(--dybo-surface-input);
306
- border: var(--dybo-border-sm) solid var(--dybo-line-stroke);
307
- border-radius: var(--dybo-radius-sm);
308
- box-shadow: var(--dybo-drop-shadow);
309
- padding: var(--dybo-space-150) var(--dybo-space-200);
310
- width: 100%;
311
411
  cursor: pointer;
312
412
  appearance: none;
313
413
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%23545f74' stroke-width='1.5' fill='none' stroke-linecap='round'/%3E%3C/svg%3E");
314
414
  background-repeat: no-repeat;
315
415
  background-position: right 14px center;
316
416
  padding-right: 36px;
317
- transition:
318
- border-color 0.15s,
319
- box-shadow 0.15s;
320
- }
321
- .dybo-select:focus {
322
- outline: none;
323
- border-color: var(--dybo-color-brand-blue-yonder);
324
- box-shadow: 0 0 0 3px rgba(88, 120, 167, 0.18);
325
417
  }
326
418
 
327
- /* Type presets */
419
+ /* ---- Type presets ------------------------------------------------------
420
+ Card titles are always font-normal — hierarchy comes from size, never weight. */
328
421
  .dybo-title {
329
422
  font-size: var(--dybo-font-size-xl);
330
423
  font-weight: var(--dybo-font-weight-regular);
331
424
  line-height: 1.35;
332
425
  letter-spacing: 1px;
333
426
  }
427
+ .dybo-title.dybo-title--bold {
428
+ font-weight: var(--dybo-font-weight-bold);
429
+ }
334
430
  .dybo-subtitle {
335
431
  font-size: var(--dybo-font-size-lg);
336
432
  font-weight: var(--dybo-font-weight-regular);
337
433
  line-height: 1.35;
338
434
  letter-spacing: 1px;
339
435
  }
436
+ .dybo-subtitle.dybo-subtitle--bold {
437
+ font-weight: var(--dybo-font-weight-bold);
438
+ }
340
439
  .dybo-body {
341
440
  font-size: var(--dybo-font-size-md);
342
441
  font-weight: var(--dybo-font-weight-medium);
@@ -365,91 +464,127 @@ body {
365
464
  letter-spacing: 1px;
366
465
  text-transform: uppercase;
367
466
  }
467
+ .dybo-uppercase.dybo-uppercase--semibold {
468
+ font-weight: var(--dybo-font-weight-semibold);
469
+ }
368
470
 
369
- /* Status badges */
471
+ /* ---- Status badges ------------------------------------------------------
472
+ `resolved`→info, `high`→purple tag, `medium`→amber tag, `brand`→brand tint,
473
+ `success`/`warning`/`danger` map directly to the semantic tokens, `soon`
474
+ backs the "Available Soon" pattern (same look as `warning`). */
370
475
  .dybo-badge {
371
476
  display: inline-block;
372
477
  padding: 2px 10px;
373
- border-radius: var(--dybo-radius-full);
478
+ border-radius: var(--radius-full);
374
479
  font-size: var(--dybo-font-size-xs);
375
480
  font-weight: var(--dybo-font-weight-semibold);
376
481
  letter-spacing: 1px;
377
482
  }
378
483
  .dybo-badge--resolved {
379
- color: var(--dybo-status-resolved-fg);
380
- background: var(--dybo-status-resolved-bg);
484
+ color: hsl(var(--info));
485
+ background: hsl(var(--info-background));
381
486
  }
382
487
  .dybo-badge--high {
383
- color: var(--dybo-status-high-priority-fg);
384
- background: var(--dybo-status-high-priority-bg);
488
+ color: hsl(var(--tag-purple-foreground));
489
+ background: hsl(var(--tag-purple-background));
385
490
  }
386
491
  .dybo-badge--medium {
387
- color: var(--dybo-status-medium-priority-fg);
388
- background: var(--dybo-status-medium-priority-bg);
492
+ color: hsl(var(--tag-amber-foreground));
493
+ background: hsl(var(--tag-amber-background));
389
494
  }
390
495
  .dybo-badge--brand {
391
- color: var(--dybo-status-brand-fg);
392
- background: var(--dybo-status-brand-bg);
496
+ color: hsl(var(--foreground));
497
+ background: hsl(var(--brand-cultured));
498
+ }
499
+ .dark .dybo-badge--brand {
500
+ color: hsl(var(--foreground));
501
+ background: hsl(var(--accent) / 0.35);
393
502
  }
394
503
  .dybo-badge--success {
395
- color: var(--dybo-success);
396
- background: var(--dybo-success-bg);
504
+ color: hsl(var(--success-foreground));
505
+ background: hsl(var(--success-background));
397
506
  }
398
- .dybo-badge--warning {
399
- color: var(--dybo-warning);
400
- background: var(--dybo-warning-bg);
507
+ .dybo-badge--warning,
508
+ .dybo-badge--soon {
509
+ color: hsl(var(--warning));
510
+ background: hsl(var(--warning-background));
401
511
  }
402
512
  .dybo-badge--danger {
403
- color: var(--dybo-danger);
404
- background: var(--dybo-danger-bg);
513
+ color: hsl(var(--destructive));
514
+ background: hsl(var(--destructive) / 0.1);
405
515
  }
406
516
 
407
- /* ---- Alert ---- */
517
+ /* ---- Alert (transient, inline) ------------------------------------------ */
408
518
  .dybo-alert {
409
519
  display: flex;
410
520
  align-items: flex-start;
411
- gap: var(--dybo-space-150);
412
- padding: var(--dybo-space-150) var(--dybo-space-200);
413
- border-radius: var(--dybo-radius-sm);
521
+ gap: 12px;
522
+ padding: 12px 16px;
523
+ border-radius: var(--radius-sm);
414
524
  border-left: 4px solid transparent;
415
525
  font-size: var(--dybo-font-size-sm);
416
526
  font-weight: var(--dybo-font-weight-medium);
417
527
  line-height: 1.5;
418
528
  }
419
529
  .dybo-alert--success {
420
- background: var(--dybo-success-bg);
421
- border-color: var(--dybo-success);
422
- color: #14703b;
530
+ background: hsl(var(--success-background));
531
+ border-color: hsl(var(--success));
532
+ color: hsl(var(--foreground));
423
533
  }
424
534
  .dybo-alert--warning {
425
- background: var(--dybo-warning-bg);
426
- border-color: var(--dybo-warning);
427
- color: #a54a0e;
535
+ background: hsl(var(--warning-background));
536
+ border-color: hsl(var(--warning));
537
+ color: hsl(var(--foreground));
428
538
  }
429
539
  .dybo-alert--danger {
430
- background: var(--dybo-danger-bg);
431
- border-color: var(--dybo-danger);
432
- color: var(--dybo-danger);
540
+ background: hsl(var(--destructive) / 0.06);
541
+ border-color: hsl(var(--destructive));
542
+ color: hsl(var(--foreground));
433
543
  }
434
544
  .dybo-alert--info {
435
- background: var(--dybo-info-bg);
436
- border-color: var(--dybo-info);
437
- color: #026f80;
545
+ background: hsl(var(--info-background));
546
+ border-color: hsl(var(--info));
547
+ color: hsl(var(--foreground));
548
+ }
549
+
550
+ /* ---- Warning / blocking-error banners (persistent, page-level) --------- */
551
+ .dybo-error-banner {
552
+ border-radius: var(--radius-sm);
553
+ padding: 16px;
554
+ display: flex;
555
+ align-items: flex-start;
556
+ gap: 12px;
557
+ background: hsl(var(--destructive) / 0.06);
558
+ border: 1px solid hsl(var(--destructive) / 0.25);
559
+ }
560
+ .dybo-dropzone--error {
561
+ border: 1px dashed hsl(var(--destructive) / 0.55);
562
+ background: hsl(var(--destructive) / 0.05);
563
+ border-radius: var(--radius-sm);
564
+ }
565
+ .dybo-error-link {
566
+ color: hsl(var(--foreground));
567
+ font-weight: 700;
568
+ text-decoration: underline;
569
+ text-underline-offset: 2px;
570
+ cursor: pointer;
438
571
  }
439
572
 
440
- /* ---- App shell layout ---- */
573
+ /* ---- App shell layout ----------------------------------------------------
574
+ Kept for backward compatibility while AppShell/Sidebar/TopBar/NavItem are
575
+ rewritten to the real 80px-icon-rail + 64px-header shell (see IconRail
576
+ below, already correct) — colors repointed, structure unchanged for now. */
441
577
  .dybo-app-shell {
442
578
  display: flex;
443
579
  min-height: 100vh;
444
- background: var(--dybo-surface-page);
580
+ background: hsl(var(--background));
445
581
  }
446
582
 
447
- /* ---- Sidebar ---- */
448
583
  .dybo-sidebar {
449
- width: var(--dybo-sidebar-width);
584
+ width: 240px;
450
585
  flex-shrink: 0;
451
- background: var(--dybo-sidebar-bg);
452
- color: var(--dybo-sidebar-text);
586
+ background: hsl(var(--brand-dark-orb));
587
+ color: hsl(var(--brand-white) / 0.75);
453
588
  display: flex;
454
589
  flex-direction: column;
455
590
  position: sticky;
@@ -459,7 +594,7 @@ body {
459
594
  }
460
595
  .dybo-sidebar__brand {
461
596
  padding: 22px 20px 18px;
462
- border-bottom: 1px solid rgba(255, 255, 255, 0.07);
597
+ border-bottom: 1px solid hsl(var(--brand-white) / 0.07);
463
598
  }
464
599
  .dybo-sidebar__nav {
465
600
  padding: 14px 12px;
@@ -472,26 +607,25 @@ body {
472
607
  font-size: var(--dybo-font-size-xs);
473
608
  text-transform: uppercase;
474
609
  letter-spacing: 1px;
475
- color: rgba(255, 255, 255, 0.45);
610
+ color: hsl(var(--brand-white) / 0.45);
476
611
  padding: 18px 12px 7px;
477
612
  font-weight: var(--dybo-font-weight-bold);
478
613
  }
479
614
  .dybo-sidebar__footer {
480
615
  padding: 14px 16px;
481
- border-top: 1px solid rgba(255, 255, 255, 0.07);
616
+ border-top: 1px solid hsl(var(--brand-white) / 0.07);
482
617
  display: flex;
483
618
  flex-direction: column;
484
619
  gap: 10px;
485
620
  }
486
621
 
487
- /* ---- Nav item ---- */
488
622
  .dybo-nav-item {
489
623
  display: flex;
490
624
  align-items: center;
491
625
  gap: 10px;
492
626
  padding: 9px 12px;
493
- border-radius: 8px;
494
- color: var(--dybo-sidebar-text);
627
+ border-radius: var(--radius-sm);
628
+ color: hsl(var(--brand-white) / 0.75);
495
629
  font-size: var(--dybo-font-size-sm);
496
630
  font-weight: var(--dybo-font-weight-medium);
497
631
  text-decoration: none;
@@ -505,12 +639,12 @@ body {
505
639
  color 0.15s;
506
640
  }
507
641
  .dybo-nav-item:hover {
508
- background: var(--dybo-sidebar-hover);
509
- color: #ffffff;
642
+ background: hsl(var(--brand-white) / 0.08);
643
+ color: hsl(var(--brand-white));
510
644
  }
511
645
  .dybo-nav-item--active {
512
- background: var(--dybo-color-brand-blue-yonder);
513
- color: #ffffff;
646
+ background: hsl(var(--secondary));
647
+ color: hsl(var(--secondary-foreground));
514
648
  }
515
649
  .dybo-nav-item__dot {
516
650
  width: 7px;
@@ -524,26 +658,24 @@ body {
524
658
  opacity: 1;
525
659
  }
526
660
 
527
- /* ---- Top bar ---- */
528
661
  .dybo-topbar {
529
- height: var(--dybo-topbar-height);
530
- background: var(--dybo-sidebar-bg);
531
- border-bottom: 3px solid var(--dybo-color-brand-blue-yonder);
662
+ height: 64px;
663
+ background: hsl(var(--background));
664
+ border-bottom: 1px solid hsl(var(--border));
532
665
  display: flex;
533
666
  align-items: center;
534
- padding: 0 28px;
667
+ padding: 0 24px;
535
668
  gap: 12px;
536
669
  flex-shrink: 0;
537
670
  }
538
671
  .dybo-topbar__title {
539
- font-size: 20px;
540
- font-weight: var(--dybo-font-weight-semibold);
541
- color: #ffffff;
672
+ font-size: var(--dybo-font-size-lg);
673
+ font-weight: var(--dybo-font-weight-bold);
674
+ color: hsl(var(--foreground));
542
675
  letter-spacing: -0.2px;
543
676
  flex-grow: 1;
544
677
  }
545
678
 
546
- /* ---- Main content area ---- */
547
679
  .dybo-main {
548
680
  flex-grow: 1;
549
681
  min-width: 0;
@@ -551,38 +683,57 @@ body {
551
683
  flex-direction: column;
552
684
  }
553
685
  .dybo-content {
554
- padding: 28px;
686
+ padding: 32px 16px;
555
687
  flex-grow: 1;
556
688
  }
557
689
 
558
- /* ---- Data table ---- */
690
+ /* ---- Data table --------------------------------------------------------- */
559
691
  .dybo-table-wrap {
560
692
  overflow-x: auto;
561
- border-radius: var(--dybo-radius-sm);
693
+ border-radius: var(--radius-sm);
694
+ }
695
+ .dybo-table__toolbar {
696
+ display: flex;
697
+ align-items: center;
698
+ gap: 8px;
699
+ padding: 16px;
700
+ flex-wrap: wrap;
701
+ border-bottom: 1px solid hsl(var(--border));
702
+ }
703
+ .dybo-table__sort-btn {
704
+ display: inline-flex;
705
+ align-items: center;
706
+ gap: 6px;
707
+ background: transparent;
708
+ border: none;
709
+ padding: 0;
710
+ font: inherit;
711
+ color: inherit;
712
+ cursor: pointer;
562
713
  }
563
714
  .dybo-table {
564
715
  border-collapse: collapse;
565
716
  width: 100%;
566
717
  font-size: var(--dybo-font-size-sm);
567
- background: var(--dybo-surface-card-solid);
718
+ background: hsl(var(--card) / 0.7);
568
719
  }
569
720
  .dybo-table th,
570
721
  .dybo-table td {
571
722
  padding: 10px 14px;
572
- border-bottom: 1px solid rgba(194, 199, 207, 0.4);
723
+ border-bottom: 1px solid hsl(var(--border) / 0.6);
573
724
  white-space: nowrap;
574
725
  }
575
726
  .dybo-table thead th {
576
727
  position: sticky;
577
728
  top: 0;
578
- background: rgba(230, 234, 240, 0.95);
579
- color: var(--dybo-color-text-muted);
729
+ background: hsl(var(--background) / 0.95);
730
+ color: hsl(var(--foreground) / 0.64);
580
731
  font-weight: var(--dybo-font-weight-semibold);
581
732
  font-size: var(--dybo-font-size-xs);
582
733
  text-transform: uppercase;
583
734
  letter-spacing: 0.5px;
584
735
  text-align: right;
585
- border-bottom: 2px solid rgba(194, 199, 207, 0.6);
736
+ border-bottom: 2px solid hsl(var(--border));
586
737
  }
587
738
  .dybo-table thead th.left,
588
739
  .dybo-table td.left {
@@ -590,35 +741,35 @@ body {
590
741
  }
591
742
  .dybo-table td {
592
743
  text-align: right;
593
- color: var(--dybo-color-text-muted);
744
+ color: hsl(var(--foreground) / 0.64);
594
745
  font-variant-numeric: tabular-nums;
595
746
  }
596
747
  .dybo-table td.left {
597
- color: var(--dybo-color-text-primary);
748
+ color: hsl(var(--foreground));
598
749
  font-weight: var(--dybo-font-weight-medium);
599
750
  }
600
751
  .dybo-table tbody tr:nth-child(even) {
601
- background: rgba(240, 241, 244, 0.45);
752
+ background: hsl(var(--card) / 0.45);
602
753
  }
603
754
  .dybo-table tbody tr:hover {
604
- background: rgba(88, 120, 167, 0.07);
755
+ background: hsl(var(--foreground) / 0.05);
605
756
  }
606
757
  .dybo-table tbody tr.dybo-table__row--clickable {
607
758
  cursor: pointer;
608
759
  }
609
760
 
610
- /* ---- Tabs ---- */
761
+ /* ---- Tabs (retarget candidate — see UnderlineTabs in a later pass) ------ */
611
762
  .dybo-tabs {
612
763
  display: flex;
613
764
  flex-wrap: wrap;
614
765
  gap: 4px;
615
- border-bottom: 2px solid rgba(194, 199, 207, 0.5);
616
- margin-bottom: var(--dybo-space-200);
766
+ border-bottom: 2px solid hsl(var(--border));
767
+ margin-bottom: 16px;
617
768
  }
618
769
  .dybo-tab {
619
770
  border: none;
620
771
  background: transparent;
621
- color: var(--dybo-color-text-muted);
772
+ color: hsl(var(--foreground) / 0.64);
622
773
  font-family: inherit;
623
774
  font-weight: var(--dybo-font-weight-semibold);
624
775
  font-size: var(--dybo-font-size-sm);
@@ -632,25 +783,25 @@ body {
632
783
  background 0.15s;
633
784
  }
634
785
  .dybo-tab:hover {
635
- color: var(--dybo-color-text-primary);
636
- background: rgba(88, 120, 167, 0.07);
786
+ color: hsl(var(--foreground));
787
+ background: hsl(var(--accent) / 0.07);
637
788
  }
638
789
  .dybo-tab--active {
639
- color: var(--dybo-color-text-primary);
640
- border-bottom-color: var(--dybo-color-brand-blue-yonder);
790
+ color: hsl(var(--foreground));
791
+ border-bottom-color: hsl(var(--accent));
641
792
  }
642
793
 
643
- /* ---- Overview grid ---- */
794
+ /* ---- Overview grid ------------------------------------------------------- */
644
795
  .dybo-overview-grid {
645
796
  display: grid;
646
797
  grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
647
798
  gap: 1px;
648
- background: rgba(194, 199, 207, 0.4);
649
- border-radius: var(--dybo-radius-sm);
799
+ background: hsl(var(--border));
800
+ border-radius: var(--radius-sm);
650
801
  overflow: hidden;
651
802
  }
652
803
  .dybo-overview-field {
653
- background: var(--dybo-surface-card-solid);
804
+ background: hsl(var(--card) / 0.9);
654
805
  padding: 12px 18px;
655
806
  display: flex;
656
807
  flex-direction: column;
@@ -660,48 +811,50 @@ body {
660
811
  font-size: var(--dybo-font-size-xs);
661
812
  text-transform: uppercase;
662
813
  letter-spacing: 0.5px;
663
- color: var(--dybo-color-text-muted);
814
+ color: hsl(var(--foreground) / 0.64);
664
815
  font-weight: var(--dybo-font-weight-semibold);
665
816
  }
666
817
  .dybo-overview-field__value {
667
818
  font-size: var(--dybo-font-size-md);
668
- color: var(--dybo-color-text-primary);
819
+ color: hsl(var(--foreground));
669
820
  font-weight: var(--dybo-font-weight-medium);
670
821
  }
671
822
 
672
- /* ---- Login card ---- */
823
+ /* ---- Login card ----------------------------------------------------------- */
673
824
  .dybo-login-wrap {
674
825
  min-height: 100vh;
675
826
  display: flex;
676
827
  align-items: center;
677
828
  justify-content: center;
678
- background: var(--dybo-surface-page);
829
+ background: hsl(var(--background));
679
830
  padding: 24px;
680
831
  }
681
832
  .dybo-login-card {
682
833
  width: 100%;
683
834
  max-width: 380px;
684
835
  padding: 36px 32px;
685
- background: var(--dybo-surface-card);
686
- border: var(--dybo-border-sm) solid var(--dybo-line-stroke);
687
- border-radius: var(--dybo-radius-md);
688
- box-shadow: var(--dybo-elevation-card);
836
+ background: hsl(var(--card) / 0.7);
837
+ border: 1px solid hsl(var(--brand-white));
838
+ border-radius: var(--radius-md);
689
839
  backdrop-filter: blur(16px);
690
840
  -webkit-backdrop-filter: blur(16px);
691
841
  }
842
+ .dark .dybo-login-card {
843
+ border-color: hsl(var(--border));
844
+ }
692
845
  .dybo-login-card__subtitle {
693
846
  text-align: center;
694
- color: var(--dybo-color-text-muted);
847
+ color: hsl(var(--foreground) / 0.64);
695
848
  font-size: var(--dybo-font-size-sm);
696
849
  margin-bottom: 24px;
697
850
  margin-top: 4px;
698
851
  }
699
852
 
700
- /* ---- Modal ---- */
853
+ /* ---- Modal --------------------------------------------------------------- */
701
854
  .dybo-modal-backdrop {
702
855
  position: fixed;
703
856
  inset: 0;
704
- background: rgba(10, 19, 35, 0.45);
857
+ background: hsl(var(--overlay-scrim) / 0.45);
705
858
  backdrop-filter: blur(2px);
706
859
  -webkit-backdrop-filter: blur(2px);
707
860
  display: flex;
@@ -713,34 +866,37 @@ body {
713
866
  .dybo-modal {
714
867
  width: 100%;
715
868
  max-width: 520px;
716
- background: var(--dybo-surface-card-solid);
717
- border: var(--dybo-border-sm) solid var(--dybo-line-stroke);
718
- border-radius: var(--dybo-radius-md);
719
- box-shadow: 0 24px 64px rgba(10, 19, 35, 0.2);
869
+ background: var(--card-bg-with-opacity);
870
+ border: 1px solid hsl(var(--brand-white));
871
+ border-radius: var(--radius-md);
872
+ box-shadow: var(--shadow-level-2);
720
873
  display: flex;
721
874
  flex-direction: column;
722
875
  max-height: calc(100vh - 48px);
723
876
  overflow: hidden;
724
877
  }
878
+ .dark .dybo-modal {
879
+ border-color: hsl(var(--border));
880
+ }
725
881
  .dybo-modal__header {
726
882
  display: flex;
727
883
  align-items: center;
728
884
  justify-content: space-between;
729
885
  padding: 20px 24px 16px;
730
- border-bottom: 1px solid rgba(194, 199, 207, 0.4);
886
+ border-bottom: 1px solid hsl(var(--border) / 0.6);
731
887
  flex-shrink: 0;
732
888
  }
733
889
  .dybo-modal__title {
734
890
  font-size: var(--dybo-font-size-lg);
735
891
  font-weight: var(--dybo-font-weight-semibold);
736
- color: var(--dybo-color-text-primary);
892
+ color: hsl(var(--foreground));
737
893
  margin: 0;
738
894
  }
739
895
  .dybo-modal__close {
740
896
  background: transparent;
741
897
  border: none;
742
898
  cursor: pointer;
743
- color: var(--dybo-color-text-muted);
899
+ color: hsl(var(--foreground) / 0.64);
744
900
  padding: 4px;
745
901
  border-radius: 6px;
746
902
  display: flex;
@@ -751,8 +907,8 @@ body {
751
907
  color 0.15s;
752
908
  }
753
909
  .dybo-modal__close:hover {
754
- background: rgba(194, 199, 207, 0.3);
755
- color: var(--dybo-color-text-primary);
910
+ background: hsl(var(--border) / 0.3);
911
+ color: hsl(var(--foreground));
756
912
  }
757
913
  .dybo-modal__body {
758
914
  padding: 24px;
@@ -761,26 +917,108 @@ body {
761
917
  }
762
918
  .dybo-modal__footer {
763
919
  padding: 16px 24px 20px;
764
- border-top: 1px solid rgba(194, 199, 207, 0.4);
920
+ border-top: 1px solid hsl(var(--border) / 0.6);
765
921
  display: flex;
766
922
  gap: 12px;
767
923
  justify-content: flex-end;
768
924
  flex-shrink: 0;
769
925
  }
926
+ .dybo-modal .dybo-input,
927
+ .dybo-modal .dybo-select,
928
+ .dybo-drawer-panel .dybo-input,
929
+ .dybo-drawer-panel .dybo-select {
930
+ background: hsl(var(--popover));
931
+ }
932
+
933
+ /* ---- Drawer (right/left panel) -------------------------------------------- */
934
+ .dybo-drawer-backdrop {
935
+ position: fixed;
936
+ inset: 0;
937
+ z-index: 1000;
938
+ background: hsl(var(--overlay-scrim) / 0.3);
939
+ }
940
+ .dybo-drawer-panel {
941
+ position: fixed;
942
+ top: 0;
943
+ height: 100%;
944
+ width: min(440px, 90vw);
945
+ max-width: 100%;
946
+ background: hsl(var(--card));
947
+ color: hsl(var(--card-foreground));
948
+ box-shadow: var(--shadow-level-2);
949
+ display: flex;
950
+ flex-direction: column;
951
+ z-index: 1001;
952
+ overflow: hidden;
953
+ }
954
+ .dybo-drawer-panel--right {
955
+ right: 0;
956
+ border-left: 1px solid hsl(var(--border));
957
+ }
958
+ .dybo-drawer-panel--left {
959
+ left: 0;
960
+ border-right: 1px solid hsl(var(--border));
961
+ }
962
+ .dybo-drawer-panel__header {
963
+ display: flex;
964
+ align-items: center;
965
+ justify-content: space-between;
966
+ flex-shrink: 0;
967
+ padding: 16px 20px;
968
+ border-bottom: 1px solid hsl(var(--border));
969
+ }
970
+ .dybo-drawer-panel__title {
971
+ font-size: var(--dybo-font-size-lg);
972
+ font-weight: var(--dybo-font-weight-semibold);
973
+ color: hsl(var(--foreground));
974
+ margin: 0;
975
+ }
976
+ .dybo-drawer-panel__close {
977
+ background: transparent;
978
+ border: none;
979
+ cursor: pointer;
980
+ color: hsl(var(--foreground) / 0.64);
981
+ padding: 4px;
982
+ border-radius: 6px;
983
+ display: flex;
984
+ align-items: center;
985
+ justify-content: center;
986
+ transition:
987
+ background 0.15s,
988
+ color 0.15s;
989
+ }
990
+ .dybo-drawer-panel__close:hover {
991
+ background: hsl(var(--border) / 0.3);
992
+ color: hsl(var(--foreground));
993
+ }
994
+ .dybo-drawer-panel__body {
995
+ flex: 1;
996
+ min-height: 0;
997
+ overflow-y: auto;
998
+ padding: 20px;
999
+ }
1000
+ .dybo-drawer-panel__body--flush {
1001
+ padding: 0;
1002
+ display: flex;
1003
+ flex-direction: column;
1004
+ }
1005
+ .dybo-drawer-panel__footer {
1006
+ flex-shrink: 0;
1007
+ padding: 16px 20px;
1008
+ border-top: 1px solid hsl(var(--border));
1009
+ display: flex;
1010
+ gap: 12px;
1011
+ justify-content: flex-end;
1012
+ }
770
1013
 
771
1014
  /* =========================================================================
772
- Portal / Ticket Management patterns
1015
+ Ticket / operator patterns — priority, ticket status, labels, channels,
1016
+ signals, queue status, all copied verbatim (light + dark) from the
1017
+ canonical designSystem/tokens.css so this is a single source of truth.
773
1018
  ========================================================================= */
774
1019
 
775
1020
  .dybo-surface-operator {
776
- background: var(--dybo-portal-surface-operator);
777
- }
778
-
779
- .dybo-shadow-level-1 {
780
- box-shadow: var(--dybo-portal-shadow-level-1);
781
- }
782
- .dybo-shadow-level-2 {
783
- box-shadow: var(--dybo-portal-shadow-level-2);
1021
+ background: hsl(0 0% 89.4%);
784
1022
  }
785
1023
 
786
1024
  /* Nav tabs — uppercase pill tabs */
@@ -795,17 +1033,17 @@ body {
795
1033
  justify-content: center;
796
1034
  height: 26px;
797
1035
  padding: 0 12px;
798
- border-radius: var(--dybo-radius-md);
1036
+ border-radius: 20px;
799
1037
  font-size: var(--dybo-font-size-xs);
800
1038
  font-weight: var(--dybo-font-weight-medium);
801
1039
  letter-spacing: 1px;
802
1040
  text-transform: uppercase;
803
- color: var(--dybo-color-text-primary);
804
- opacity: var(--dybo-opacity-intense);
1041
+ color: hsl(var(--foreground));
1042
+ opacity: 0.64;
805
1043
  border: 1px solid transparent;
806
1044
  background: transparent;
807
- backdrop-filter: blur(2px);
808
1045
  -webkit-backdrop-filter: blur(2px);
1046
+ backdrop-filter: blur(2px);
809
1047
  transition: all 0.2s;
810
1048
  white-space: nowrap;
811
1049
  cursor: pointer;
@@ -816,19 +1054,23 @@ body {
816
1054
  }
817
1055
  .dybo-navtab--active {
818
1056
  opacity: 1;
819
- background: rgba(244, 244, 246, 0.7);
820
- border-color: var(--dybo-line-stroke);
1057
+ background: hsl(var(--input) / 0.7);
1058
+ border-color: hsl(var(--border));
1059
+ }
1060
+ .dark .dybo-navtab--active {
1061
+ background: hsl(var(--card));
1062
+ border-color: hsl(var(--border));
821
1063
  }
822
1064
 
823
- /* Priority badges */
1065
+ /* Priority badges (semaphore) */
824
1066
  .dybo-priority {
825
1067
  display: inline-flex;
826
1068
  align-items: center;
827
1069
  gap: 5px;
828
1070
  padding: 2px 10px;
829
- border-radius: var(--dybo-radius-full);
1071
+ border-radius: 999px;
830
1072
  font-size: var(--dybo-font-size-xs);
831
- font-weight: var(--dybo-font-weight-semibold);
1073
+ font-weight: 600;
832
1074
  line-height: 1.4;
833
1075
  white-space: nowrap;
834
1076
  }
@@ -836,60 +1078,220 @@ body {
836
1078
  content: "";
837
1079
  width: 6px;
838
1080
  height: 6px;
839
- border-radius: var(--dybo-radius-full);
1081
+ border-radius: 999px;
840
1082
  background: currentColor;
841
1083
  flex-shrink: 0;
842
1084
  }
843
1085
  .dybo-priority--urgent {
844
- background: var(--dybo-portal-priority-urgent-bg);
845
- color: var(--dybo-portal-priority-urgent-fg);
1086
+ background: hsl(355 95% 60% / 0.12);
1087
+ color: hsl(355 74% 45%);
846
1088
  }
847
1089
  .dybo-priority--high {
848
- background: var(--dybo-portal-priority-high-bg);
849
- color: var(--dybo-portal-priority-high-fg);
1090
+ background: hsl(30 100% 50% / 0.15);
1091
+ color: hsl(30 100% 33%);
850
1092
  }
851
1093
  .dybo-priority--medium {
852
- background: var(--dybo-portal-priority-medium-bg);
853
- color: var(--dybo-portal-priority-medium-fg);
1094
+ background: hsl(45 90% 50% / 0.2);
1095
+ color: hsl(38 92% 32%);
854
1096
  }
855
1097
  .dybo-priority--low {
856
- background: var(--dybo-portal-priority-low-bg);
857
- color: var(--dybo-portal-priority-low-fg);
1098
+ background: hsl(216 16% 65% / 0.24);
1099
+ color: hsl(216 22% 40%);
858
1100
  }
859
1101
  .dybo-priority--none {
860
- background: var(--dybo-portal-priority-none-bg);
861
- color: var(--dybo-portal-priority-none-fg);
1102
+ background: hsl(216 12% 78% / 0.35);
1103
+ color: hsl(216 12% 46%);
862
1104
  }
863
1105
  .dybo-priority--none::before {
864
1106
  opacity: 0.45;
865
1107
  }
1108
+ .dark .dybo-priority--urgent {
1109
+ background: hsl(0 78% 55% / 0.22);
1110
+ color: hsl(0 90% 78%);
1111
+ }
1112
+ .dark .dybo-priority--high {
1113
+ background: hsl(30 100% 45% / 0.22);
1114
+ color: hsl(30 100% 72%);
1115
+ }
1116
+ .dark .dybo-priority--medium {
1117
+ background: hsl(45 90% 50% / 0.16);
1118
+ color: hsl(45 92% 70%);
1119
+ }
1120
+ .dark .dybo-priority--low {
1121
+ background: hsl(216 20% 60% / 0.2);
1122
+ color: hsl(216 25% 82%);
1123
+ }
1124
+ .dark .dybo-priority--none {
1125
+ background: hsl(216 12% 50% / 0.25);
1126
+ color: hsl(216 15% 75%);
1127
+ }
866
1128
 
867
- /* Ticket status badges (ChatWoot) */
1129
+ /* Ticket status badges (ChatWoot lifecycle) */
868
1130
  .dybo-ticket-status {
869
1131
  display: inline-flex;
870
1132
  align-items: center;
871
1133
  padding: 2px 10px;
872
- border-radius: var(--dybo-radius-full);
1134
+ border-radius: 999px;
873
1135
  font-size: var(--dybo-font-size-xs);
874
- font-weight: var(--dybo-font-weight-semibold);
1136
+ font-weight: 600;
875
1137
  line-height: 1.4;
876
1138
  white-space: nowrap;
877
1139
  }
878
1140
  .dybo-ticket-status--open {
879
- background: var(--dybo-portal-ticket-open-bg);
880
- color: var(--dybo-portal-ticket-open-fg);
1141
+ background: hsl(216 48% 90%);
1142
+ color: hsl(216 55% 40%);
881
1143
  }
882
1144
  .dybo-ticket-status--pending {
883
- background: var(--dybo-portal-ticket-pending-bg);
884
- color: var(--dybo-portal-ticket-pending-fg);
1145
+ background: hsl(266 55% 92%);
1146
+ color: hsl(266 42% 47%);
885
1147
  }
886
1148
  .dybo-ticket-status--snoozed {
887
- background: var(--dybo-portal-ticket-snoozed-bg);
888
- color: var(--dybo-portal-ticket-snoozed-fg);
1149
+ background: hsl(215 22% 87%);
1150
+ color: hsl(215 18% 42%);
889
1151
  }
890
1152
  .dybo-ticket-status--resolved {
891
- background: var(--dybo-portal-ticket-resolved-bg);
892
- color: var(--dybo-portal-ticket-resolved-fg);
1153
+ background: hsl(151 45% 89%);
1154
+ color: hsl(150 60% 25%);
1155
+ }
1156
+ .dark .dybo-ticket-status--open {
1157
+ background: hsl(216 40% 26%);
1158
+ color: hsl(216 60% 82%);
1159
+ }
1160
+ .dark .dybo-ticket-status--pending {
1161
+ background: hsl(266 32% 30%);
1162
+ color: hsl(266 60% 85%);
1163
+ }
1164
+ .dark .dybo-ticket-status--snoozed {
1165
+ background: hsl(215 18% 30%);
1166
+ color: hsl(215 25% 80%);
1167
+ }
1168
+ .dark .dybo-ticket-status--resolved {
1169
+ background: hsl(150 45% 22%);
1170
+ color: hsl(150 60% 80%);
1171
+ }
1172
+
1173
+ /* Labels (categories — colored dot via --lbl-c) */
1174
+ .dybo-label {
1175
+ display: inline-flex;
1176
+ align-items: center;
1177
+ gap: 6px;
1178
+ padding: 2px 10px;
1179
+ border-radius: 999px;
1180
+ font-size: var(--dybo-font-size-xs);
1181
+ font-weight: 600;
1182
+ white-space: nowrap;
1183
+ background: hsl(216 16% 90%);
1184
+ color: hsl(216 22% 32%);
1185
+ }
1186
+ .dybo-label::before {
1187
+ content: "";
1188
+ width: 7px;
1189
+ height: 7px;
1190
+ border-radius: 999px;
1191
+ background: var(--lbl-c, hsl(216 30% 55%));
1192
+ flex-shrink: 0;
1193
+ }
1194
+ .dark .dybo-label {
1195
+ background: hsl(216 16% 26%);
1196
+ color: hsl(216 22% 82%);
1197
+ }
1198
+
1199
+ /* Channel/inbox badge */
1200
+ .dybo-channel-badge {
1201
+ display: inline-flex;
1202
+ align-items: center;
1203
+ gap: 5px;
1204
+ padding: 2px 9px;
1205
+ border-radius: 999px;
1206
+ font-size: 11px;
1207
+ font-weight: 600;
1208
+ white-space: nowrap;
1209
+ background: hsl(216 16% 90%);
1210
+ color: hsl(216 20% 38%);
1211
+ }
1212
+ .dark .dybo-channel-badge {
1213
+ background: hsl(216 16% 26%);
1214
+ color: hsl(216 22% 80%);
1215
+ }
1216
+
1217
+ /* Signal badges (unread messages, SLA) */
1218
+ .dybo-signal--message {
1219
+ display: inline-flex;
1220
+ align-items: center;
1221
+ padding: 2px 10px;
1222
+ border-radius: 999px;
1223
+ font-size: var(--dybo-font-size-xs);
1224
+ font-weight: 600;
1225
+ line-height: 1.4;
1226
+ white-space: nowrap;
1227
+ background: hsl(28 100% 92%);
1228
+ color: hsl(24 88% 40%);
1229
+ }
1230
+ .dark .dybo-signal--message {
1231
+ background: hsl(28 85% 26%);
1232
+ color: hsl(28 100% 78%);
1233
+ }
1234
+ .dybo-signal--sla {
1235
+ display: inline-flex;
1236
+ align-items: center;
1237
+ gap: 5px;
1238
+ padding: 2px 10px;
1239
+ border-radius: 999px;
1240
+ font-size: var(--dybo-font-size-xs);
1241
+ font-weight: 600;
1242
+ line-height: 1.4;
1243
+ white-space: nowrap;
1244
+ background: hsl(244 55% 93%);
1245
+ color: hsl(244 42% 52%);
1246
+ }
1247
+ .dark .dybo-signal--sla {
1248
+ background: hsl(244 35% 32%);
1249
+ color: hsl(244 65% 84%);
1250
+ }
1251
+
1252
+ /* Queue status badge (onboarding / entity processing) — own family, never
1253
+ mixed with priority/ticket-status. */
1254
+ .dybo-queue-status {
1255
+ display: inline-flex;
1256
+ align-items: center;
1257
+ padding: 2px 10px;
1258
+ border-radius: 999px;
1259
+ font-size: var(--dybo-font-size-xs);
1260
+ font-weight: 500;
1261
+ line-height: 1.4;
1262
+ white-space: nowrap;
1263
+ }
1264
+ .dybo-queue-status--processing {
1265
+ background: hsl(147 60% 95%);
1266
+ color: hsl(150 67% 38%);
1267
+ }
1268
+ .dybo-queue-status--pending {
1269
+ background: hsl(233 43% 93%);
1270
+ color: hsl(236 13% 33%);
1271
+ }
1272
+ .dybo-queue-status--editing {
1273
+ background: hsl(187 79% 91%);
1274
+ color: hsl(187 96% 35%);
1275
+ }
1276
+ .dybo-queue-status--failed {
1277
+ background: hsl(355 95% 60% / 0.12);
1278
+ color: hsl(355 74% 45%);
1279
+ }
1280
+ .dark .dybo-queue-status--processing {
1281
+ background: hsl(150 45% 22%);
1282
+ color: hsl(150 60% 80%);
1283
+ }
1284
+ .dark .dybo-queue-status--pending {
1285
+ background: hsl(236 20% 30%);
1286
+ color: hsl(236 30% 82%);
1287
+ }
1288
+ .dark .dybo-queue-status--editing {
1289
+ background: hsl(187 60% 24%);
1290
+ color: hsl(187 70% 78%);
1291
+ }
1292
+ .dark .dybo-queue-status--failed {
1293
+ background: hsl(0 78% 55% / 0.2);
1294
+ color: hsl(0 90% 80%);
893
1295
  }
894
1296
 
895
1297
  /* Scope tabs — Unassigned / Mine / All */
@@ -897,9 +1299,9 @@ body {
897
1299
  display: inline-flex;
898
1300
  align-items: center;
899
1301
  gap: 4px;
900
- border: 1px solid var(--dybo-color-grayish-blue-300);
901
- background: rgba(244, 244, 246, 0.7);
902
- border-radius: var(--dybo-radius-sm);
1302
+ border: 1px solid hsl(var(--border));
1303
+ background: hsl(var(--input) / 0.7);
1304
+ border-radius: var(--radius-sm);
903
1305
  padding: 4px;
904
1306
  }
905
1307
  .dybo-scope-tab {
@@ -911,8 +1313,8 @@ body {
911
1313
  border-radius: 10px;
912
1314
  font-size: 13px;
913
1315
  font-weight: var(--dybo-font-weight-semibold);
914
- color: var(--dybo-color-text-primary);
915
- opacity: var(--dybo-opacity-intense);
1316
+ color: hsl(var(--foreground));
1317
+ opacity: var(--opacity-intense);
916
1318
  background: transparent;
917
1319
  border: 0;
918
1320
  cursor: pointer;
@@ -925,11 +1327,11 @@ body {
925
1327
  }
926
1328
  .dybo-scope-tab--active {
927
1329
  opacity: 1;
928
- background: var(--dybo-color-text-primary);
929
- color: var(--dybo-color-white);
1330
+ background: hsl(var(--primary));
1331
+ color: hsl(var(--primary-foreground));
930
1332
  }
931
1333
  .dybo-scope-tab:focus-visible {
932
- outline: 2px solid var(--dybo-color-brand-logo);
1334
+ outline: 2px solid hsl(var(--ring));
933
1335
  outline-offset: 2px;
934
1336
  }
935
1337
  .dybo-scope-count {
@@ -939,16 +1341,16 @@ body {
939
1341
  min-width: 22px;
940
1342
  height: 20px;
941
1343
  padding: 0 6px;
942
- border-radius: var(--dybo-radius-full);
1344
+ border-radius: 999px;
943
1345
  font-size: 11px;
944
1346
  font-weight: var(--dybo-font-weight-bold);
945
- background: rgba(10, 19, 35, 0.1);
1347
+ background: hsl(var(--foreground) / 0.1);
946
1348
  }
947
1349
  .dybo-scope-tab--active .dybo-scope-count {
948
- background: rgba(255, 255, 255, 0.24);
1350
+ background: hsl(var(--primary-foreground) / 0.24);
949
1351
  }
950
1352
 
951
- /* Icon rail sidebar */
1353
+ /* Icon rail sidebar (80px), the default app shell's left column */
952
1354
  .dybo-icon-rail {
953
1355
  display: none;
954
1356
  height: 100%;
@@ -956,7 +1358,7 @@ body {
956
1358
  flex-shrink: 0;
957
1359
  flex-direction: column;
958
1360
  align-items: center;
959
- background: var(--dybo-surface-page);
1361
+ background: hsl(var(--background));
960
1362
  padding: 16px 0;
961
1363
  }
962
1364
  @media (min-width: 768px) {
@@ -976,13 +1378,17 @@ body {
976
1378
  }
977
1379
  .dybo-icon-rail__pill {
978
1380
  border-radius: 13px;
979
- border: 1px solid var(--dybo-line-stroke);
980
- background: var(--dybo-surface-card);
1381
+ border: 1px solid hsl(var(--brand-white));
1382
+ background: hsl(var(--card) / 0.7);
981
1383
  padding: 6px;
982
- box-shadow: var(--dybo-portal-shadow-level-1);
1384
+ box-shadow: var(--shadow-level-1);
983
1385
  backdrop-filter: blur(4px);
984
1386
  -webkit-backdrop-filter: blur(4px);
985
1387
  }
1388
+ .dark .dybo-icon-rail__pill {
1389
+ border-color: hsl(var(--border));
1390
+ background: hsl(var(--card));
1391
+ }
986
1392
  .dybo-icon-rail__items {
987
1393
  display: flex;
988
1394
  flex-direction: column;
@@ -997,18 +1403,856 @@ body {
997
1403
  height: 48px;
998
1404
  width: 40px;
999
1405
  border-radius: 11px;
1000
- color: var(--dybo-color-brand-logo);
1001
- opacity: var(--dybo-opacity-intense);
1406
+ color: hsl(var(--brand-indigo));
1407
+ opacity: var(--opacity-intense);
1002
1408
  text-decoration: none;
1003
1409
  transition: all 0.2s;
1004
1410
  }
1411
+ .dark .dybo-icon-rail__item {
1412
+ color: hsl(var(--brand-blue-yonder));
1413
+ }
1005
1414
  .dybo-icon-rail__item:hover {
1006
1415
  opacity: 1;
1007
1416
  }
1008
1417
  .dybo-icon-rail__item--active {
1009
1418
  height: 40px;
1010
1419
  border-radius: 13px;
1011
- background: rgba(20, 25, 39, 0.1);
1420
+ background: hsl(var(--brand-dark-orb) / 0.1);
1012
1421
  opacity: 1;
1013
- color: var(--dybo-color-brand-dark-orb);
1422
+ color: hsl(var(--brand-dark-orb));
1423
+ }
1424
+ .dark .dybo-icon-rail__item--active {
1425
+ background: hsl(var(--brand-cultured) / 0.15);
1426
+ color: hsl(var(--foreground));
1427
+ }
1428
+
1429
+ /* =========================================================================
1430
+ New in 2.0 — components documented in the handoff spec that the package
1431
+ didn't ship yet. Each block cites the section it ports from.
1432
+ ========================================================================= */
1433
+
1434
+ /* Org/entity selector — §5 Navigation & selectors */
1435
+ .dybo-org-selector {
1436
+ display: flex;
1437
+ width: 100%;
1438
+ align-items: center;
1439
+ justify-content: space-between;
1440
+ gap: 8px;
1441
+ border-radius: var(--radius-sm);
1442
+ border: 1px solid hsl(var(--border));
1443
+ background: hsl(var(--input) / 0.7);
1444
+ padding: 12px;
1445
+ font-family: inherit;
1446
+ font-size: var(--dybo-font-size-sm);
1447
+ color: hsl(var(--foreground));
1448
+ cursor: pointer;
1449
+ height: 40px;
1450
+ }
1451
+ .dybo-org-selector:focus-visible {
1452
+ outline: none;
1453
+ box-shadow: 0 0 0 2px hsl(var(--ring)), 0 0 0 4px hsl(var(--ring) / 0.2);
1454
+ }
1455
+ .dybo-org-selector__label {
1456
+ flex: 1;
1457
+ min-width: 0;
1458
+ overflow: hidden;
1459
+ text-overflow: ellipsis;
1460
+ white-space: nowrap;
1461
+ text-align: left;
1462
+ }
1463
+ .dybo-org-selector__chevron {
1464
+ flex-shrink: 0;
1465
+ color: hsl(var(--foreground));
1466
+ }
1467
+
1468
+ /* Theme toggle — §5 */
1469
+ .dybo-theme-toggle {
1470
+ display: flex;
1471
+ align-items: center;
1472
+ gap: 1px;
1473
+ height: 44px;
1474
+ border-radius: var(--radius-sm);
1475
+ border: 1px solid hsl(var(--border));
1476
+ background: transparent;
1477
+ padding: 4px;
1478
+ }
1479
+ .dybo-theme-toggle__btn {
1480
+ height: 32px;
1481
+ width: 32px;
1482
+ border-radius: var(--radius-sm);
1483
+ padding: 8px;
1484
+ color: hsl(var(--foreground));
1485
+ background: transparent;
1486
+ border: none;
1487
+ cursor: pointer;
1488
+ display: flex;
1489
+ align-items: center;
1490
+ justify-content: center;
1491
+ }
1492
+ .dybo-theme-toggle__btn:hover {
1493
+ background: hsl(var(--primary));
1494
+ color: hsl(var(--primary-foreground));
1495
+ }
1496
+ .dybo-theme-toggle__btn--active {
1497
+ background: hsl(var(--primary));
1498
+ color: hsl(var(--primary-foreground));
1499
+ }
1500
+
1501
+ /* Avatar — §5 (44px header) / §5 (24px inline) */
1502
+ .dybo-avatar {
1503
+ display: inline-flex;
1504
+ align-items: center;
1505
+ justify-content: center;
1506
+ flex-shrink: 0;
1507
+ border-radius: var(--radius-sm);
1508
+ background: hsl(var(--primary));
1509
+ color: hsl(var(--primary-foreground));
1510
+ font-family: inherit;
1511
+ font-weight: var(--dybo-font-weight-medium);
1512
+ border: none;
1513
+ cursor: default;
1514
+ }
1515
+ .dybo-avatar--md {
1516
+ height: 44px;
1517
+ width: 44px;
1518
+ font-size: var(--dybo-font-size-md);
1519
+ }
1520
+ .dybo-avatar--sm {
1521
+ height: 24px;
1522
+ width: 24px;
1523
+ border-radius: var(--radius-full);
1524
+ font-size: 11px;
1525
+ font-weight: var(--dybo-font-weight-semibold);
1526
+ }
1527
+ .dybo-avatar--square { border-radius: var(--radius-sm); }
1528
+ .dybo-avatar--circle { border-radius: var(--radius-full); }
1529
+ button.dybo-avatar { cursor: pointer; padding: 0; }
1530
+
1531
+ /* Notifications button — §5 */
1532
+ .dybo-notifications-btn {
1533
+ position: relative;
1534
+ display: inline-flex;
1535
+ align-items: center;
1536
+ justify-content: center;
1537
+ height: 44px;
1538
+ width: 44px;
1539
+ padding: 10px;
1540
+ border-radius: var(--radius-sm);
1541
+ border: 1px solid hsl(var(--border));
1542
+ background: transparent;
1543
+ color: hsl(var(--foreground));
1544
+ cursor: pointer;
1545
+ }
1546
+ .dybo-notifications-btn:hover {
1547
+ background: hsl(var(--primary));
1548
+ color: hsl(var(--primary-foreground));
1549
+ }
1550
+ .dybo-notifications-btn__dot {
1551
+ position: absolute;
1552
+ top: 4px;
1553
+ right: 4px;
1554
+ height: 8px;
1555
+ width: 8px;
1556
+ border-radius: var(--radius-full);
1557
+ background: hsl(var(--destructive));
1558
+ }
1559
+
1560
+ /* Pagination — §5 */
1561
+ .dybo-pagination {
1562
+ display: flex;
1563
+ flex-direction: column;
1564
+ gap: 12px;
1565
+ border-top: 1px solid hsl(var(--border) / 0.6);
1566
+ padding-top: 16px;
1567
+ }
1568
+ @media (min-width: 640px) {
1569
+ .dybo-pagination {
1570
+ flex-direction: row;
1571
+ align-items: center;
1572
+ justify-content: space-between;
1573
+ }
1574
+ }
1575
+ .dybo-pagination__summary {
1576
+ font-size: var(--dybo-font-size-sm);
1577
+ color: hsl(var(--foreground) / 0.7);
1578
+ }
1579
+ .dybo-pagination__controls {
1580
+ display: flex;
1581
+ flex-wrap: wrap;
1582
+ align-items: center;
1583
+ gap: 12px;
1584
+ }
1585
+ .dybo-pagination__size {
1586
+ display: flex;
1587
+ align-items: center;
1588
+ gap: 8px;
1589
+ font-size: var(--dybo-font-size-sm);
1590
+ color: hsl(var(--foreground) / 0.8);
1591
+ }
1592
+ .dybo-pagination__nav {
1593
+ display: flex;
1594
+ align-items: center;
1595
+ gap: 4px;
1596
+ }
1597
+ .dybo-pagination__btn {
1598
+ height: 36px;
1599
+ width: 36px;
1600
+ border-radius: var(--radius-sm);
1601
+ border: 1px solid hsl(var(--border));
1602
+ background: transparent;
1603
+ color: hsl(var(--foreground));
1604
+ display: inline-flex;
1605
+ align-items: center;
1606
+ justify-content: center;
1607
+ cursor: pointer;
1608
+ }
1609
+ .dybo-pagination__btn:disabled {
1610
+ opacity: var(--opacity-semi-opaque);
1611
+ cursor: not-allowed;
1612
+ }
1613
+ .dybo-pagination__btn--active {
1614
+ background: hsl(var(--primary));
1615
+ color: hsl(var(--primary-foreground));
1616
+ border-color: hsl(var(--primary));
1617
+ min-width: 36px;
1618
+ width: auto;
1619
+ padding: 0 8px;
1620
+ }
1621
+
1622
+ /* Empty states — §5 */
1623
+ .dybo-empty {
1624
+ position: relative;
1625
+ height: 240px;
1626
+ border-radius: var(--radius-md);
1627
+ background: hsl(var(--foreground) / 0.05);
1628
+ display: flex;
1629
+ align-items: center;
1630
+ justify-content: center;
1631
+ }
1632
+ .dybo-empty__text {
1633
+ font-size: var(--dybo-font-size-sm);
1634
+ font-weight: var(--dybo-font-weight-medium);
1635
+ color: hsl(var(--foreground) / 0.6);
1636
+ }
1637
+ .dybo-empty--rich {
1638
+ height: 320px;
1639
+ border-radius: var(--radius-md);
1640
+ border: 1px dashed hsl(var(--border) / 0.8);
1641
+ background: hsl(var(--muted) / 0.2);
1642
+ display: flex;
1643
+ align-items: center;
1644
+ justify-content: center;
1645
+ }
1646
+ .dybo-empty--rich .dybo-empty__inner {
1647
+ display: flex;
1648
+ flex-direction: column;
1649
+ align-items: center;
1650
+ text-align: center;
1651
+ padding: 0 24px;
1652
+ }
1653
+ .dybo-empty__icon {
1654
+ margin-bottom: 12px;
1655
+ display: flex;
1656
+ height: 48px;
1657
+ width: 48px;
1658
+ align-items: center;
1659
+ justify-content: center;
1660
+ border-radius: var(--radius-full);
1661
+ border: 1px solid hsl(var(--border));
1662
+ background: hsl(var(--card) / 0.6);
1663
+ color: hsl(var(--foreground) / 0.7);
1664
+ }
1665
+ .dybo-empty__title {
1666
+ font-size: var(--dybo-font-size-md);
1667
+ font-weight: var(--dybo-font-weight-medium);
1668
+ color: hsl(var(--foreground) / 0.9);
1669
+ }
1670
+ .dybo-empty__desc {
1671
+ margin-top: 4px;
1672
+ font-size: var(--dybo-font-size-sm);
1673
+ color: hsl(var(--foreground) / 0.65);
1674
+ }
1675
+ .dybo-empty-row {
1676
+ padding: 64px 0;
1677
+ text-align: center;
1678
+ font-size: var(--dybo-font-size-sm);
1679
+ opacity: var(--opacity-intense);
1680
+ }
1681
+
1682
+ /* KPI cards — §5 */
1683
+ .dybo-kpi {
1684
+ border-radius: 14px;
1685
+ padding: 16px;
1686
+ display: flex;
1687
+ justify-content: space-between;
1688
+ background: hsl(var(--card) / 0.7);
1689
+ border: 1px solid hsl(var(--brand-white));
1690
+ }
1691
+ .dark .dybo-kpi { border-color: hsl(var(--border)); }
1692
+ .dybo-kpi__label { font-size: var(--dybo-font-size-sm); font-weight: var(--dybo-font-weight-medium); }
1693
+ .dybo-kpi__value { font-size: 30px; font-weight: 300; margin-top: 4px; line-height: 1; }
1694
+ .dybo-kpi__icon { opacity: 0.25; display: flex; }
1695
+
1696
+ .dybo-kpi-tile {
1697
+ border-radius: var(--radius-sm);
1698
+ background: hsl(var(--card) / 0.7);
1699
+ border: 1px solid hsl(var(--brand-white));
1700
+ backdrop-filter: blur(4px);
1701
+ -webkit-backdrop-filter: blur(4px);
1702
+ padding: 24px;
1703
+ display: flex;
1704
+ align-items: center;
1705
+ justify-content: space-between;
1706
+ }
1707
+ .dark .dybo-kpi-tile { border-color: hsl(var(--border)); }
1708
+ .dybo-kpi-tile__label { font-size: var(--dybo-font-size-md); font-weight: var(--dybo-font-weight-medium); color: hsl(var(--foreground)); }
1709
+ .dybo-kpi-tile__value { font-size: 30px; font-weight: 700; color: hsl(var(--foreground)); line-height: 1; margin-top: 4px; }
1710
+ .dybo-kpi-tile__icon {
1711
+ display: flex; height: 48px; width: 48px; flex-shrink: 0;
1712
+ align-items: center; justify-content: center; border-radius: var(--radius-sm);
1713
+ background: hsl(var(--destructive) / 0.1); color: hsl(var(--destructive));
1714
+ }
1715
+
1716
+ .dybo-kpi-grid {
1717
+ display: grid;
1718
+ border-radius: var(--radius-sm);
1719
+ background: hsl(var(--card) / 0.7);
1720
+ border: 1px solid hsl(var(--brand-white));
1721
+ overflow: hidden;
1722
+ }
1723
+ .dark .dybo-kpi-grid { border-color: hsl(var(--border)); }
1724
+ .dybo-kpi-grid__cell {
1725
+ padding: 12px 16px;
1726
+ border-right: 1px solid hsl(var(--border));
1727
+ border-bottom: none;
1728
+ }
1729
+ .dybo-kpi-grid__cell:last-child { border-right: none; }
1730
+ .dybo-kpi-grid__label { font-size: var(--dybo-font-size-md); font-weight: var(--dybo-font-weight-medium); color: hsl(var(--foreground) / 0.9); }
1731
+ .dybo-kpi-grid__value { font-size: 24px; line-height: 1; font-weight: var(--dybo-font-weight-semibold); color: hsl(var(--foreground)); margin-top: 8px; }
1732
+ .dybo-kpi-grid__sublabel { font-size: var(--dybo-font-size-sm); color: hsl(var(--foreground) / 0.6); margin-top: 4px; }
1733
+
1734
+ .dybo-kpi-strip { display: flex; flex-wrap: wrap; align-items: center; gap: 1px; }
1735
+ .dybo-kpi-strip__item {
1736
+ flex: 1; min-width: 200px; display: flex; flex-direction: column; gap: 16px;
1737
+ border: 1px solid hsl(var(--border)); background: hsl(var(--card) / 0.4); padding: 16px;
1738
+ }
1739
+ .dybo-kpi-strip__item:first-child { border-top-left-radius: var(--radius-sm); border-bottom-left-radius: var(--radius-sm); }
1740
+ .dybo-kpi-strip__item:last-child { border-top-right-radius: var(--radius-sm); border-bottom-right-radius: var(--radius-sm); }
1741
+ .dybo-kpi-strip__icon {
1742
+ display: flex; height: 40px; width: 40px; align-items: center; justify-content: center;
1743
+ border-radius: 6px; background: hsl(var(--card)); color: hsl(var(--foreground) / 0.7);
1744
+ }
1745
+ .dybo-kpi-strip__row { display: flex; flex-wrap: wrap; align-items: flex-end; justify-content: space-between; gap: 8px; }
1746
+ .dybo-kpi-strip__label { font-size: var(--dybo-font-size-sm); color: hsl(var(--foreground)); display: block; }
1747
+ .dybo-kpi-strip__delta { color: hsl(var(--foreground) / 0.5); font-weight: var(--dybo-font-weight-medium); font-size: var(--dybo-font-size-sm); }
1748
+ .dybo-kpi-strip__value { font-size: var(--dybo-font-size-md); color: hsl(var(--foreground)); }
1749
+
1750
+ /* View toggle — §5 */
1751
+ .dybo-view-toggle {
1752
+ display: flex;
1753
+ align-items: center;
1754
+ gap: 4px;
1755
+ border-radius: var(--radius-sm);
1756
+ border: 1px solid hsl(var(--border));
1757
+ background: hsl(var(--input) / 0.7);
1758
+ padding: 4px;
1759
+ }
1760
+ .dybo-view-toggle__btn {
1761
+ height: 36px;
1762
+ width: 36px;
1763
+ border-radius: 10px;
1764
+ padding: 8px;
1765
+ color: hsl(var(--foreground));
1766
+ background: transparent;
1767
+ border: none;
1768
+ cursor: pointer;
1769
+ display: flex;
1770
+ align-items: center;
1771
+ justify-content: center;
1772
+ }
1773
+ .dybo-view-toggle__btn--active {
1774
+ background: hsl(var(--primary));
1775
+ color: hsl(var(--primary-foreground));
1776
+ }
1777
+
1778
+ /* Metadata badge — §5 */
1779
+ .dybo-metadata-badge {
1780
+ display: inline-flex;
1781
+ align-items: center;
1782
+ justify-content: center;
1783
+ padding: 8px 12px;
1784
+ border-radius: var(--radius-full);
1785
+ background: hsl(var(--foreground) / 0.1);
1786
+ font-size: var(--dybo-font-size-sm);
1787
+ font-weight: var(--dybo-font-weight-medium);
1788
+ color: hsl(var(--foreground));
1789
+ }
1790
+ .dybo-metadata-badge b { font-weight: var(--dybo-font-weight-bold); }
1791
+
1792
+ /* Search field — §5 */
1793
+ .dybo-search { position: relative; width: 100%; }
1794
+ .dybo-search__icon {
1795
+ position: absolute;
1796
+ top: 50%;
1797
+ transform: translateY(-50%);
1798
+ color: hsl(var(--foreground) / 0.5);
1799
+ pointer-events: none;
1800
+ display: flex;
1801
+ }
1802
+ .dybo-search--icon-left .dybo-search__icon { left: 12px; }
1803
+ .dybo-search--icon-right .dybo-search__icon { right: 12px; }
1804
+ .dybo-search__input {
1805
+ width: 100%;
1806
+ border-radius: var(--radius-sm);
1807
+ border: 1px solid hsl(var(--border));
1808
+ background: hsl(var(--input) / 0.7);
1809
+ font-size: var(--dybo-font-size-sm);
1810
+ color: hsl(var(--foreground));
1811
+ }
1812
+ .dybo-search--icon-left .dybo-search__input { height: 48px; padding: 12px 16px 12px 36px; }
1813
+ .dybo-search--icon-right .dybo-search__input { height: 40px; padding: 12px 40px 12px 16px; }
1814
+ .dybo-search__input:focus {
1815
+ outline: none;
1816
+ border-color: hsl(var(--ring));
1817
+ box-shadow: 0 0 0 3px hsl(var(--ring) / 0.18);
1818
+ }
1819
+
1820
+ /* Date range trigger — §5 */
1821
+ .dybo-date-trigger {
1822
+ display: inline-flex;
1823
+ align-items: center;
1824
+ justify-content: center;
1825
+ gap: 8px;
1826
+ height: 40px;
1827
+ padding: 0 12px;
1828
+ border-radius: var(--radius-sm);
1829
+ border: 1px solid hsl(var(--border));
1830
+ background: hsl(var(--input) / 0.7);
1831
+ color: hsl(var(--foreground));
1832
+ font-family: inherit;
1833
+ font-weight: var(--dybo-font-weight-regular);
1834
+ font-size: var(--dybo-font-size-sm);
1835
+ letter-spacing: 1px;
1836
+ cursor: pointer;
1837
+ }
1838
+ .dybo-date-trigger:hover {
1839
+ background: hsl(var(--primary));
1840
+ color: hsl(var(--primary-foreground));
1841
+ border-color: hsl(var(--primary));
1842
+ }
1843
+
1844
+ /* Upload dropzone — §5 */
1845
+ .dybo-dropzone {
1846
+ display: flex;
1847
+ width: 100%;
1848
+ flex-direction: column;
1849
+ align-items: center;
1850
+ justify-content: center;
1851
+ gap: 16px;
1852
+ border-radius: var(--radius-sm);
1853
+ border: 1px dashed hsl(var(--border) / 0.8);
1854
+ background: hsl(var(--muted) / 0.15);
1855
+ padding: 20px 8px;
1856
+ min-height: 154px;
1857
+ cursor: pointer;
1858
+ font-family: inherit;
1859
+ }
1860
+ .dybo-dropzone:hover {
1861
+ background: hsl(var(--muted) / 0.25);
1862
+ }
1863
+ .dybo-dropzone__icon {
1864
+ display: flex;
1865
+ height: 44px;
1866
+ width: 44px;
1867
+ align-items: center;
1868
+ justify-content: center;
1869
+ border-radius: 13px;
1870
+ background: hsl(var(--brand-white) / 0.7);
1871
+ border: 1px solid hsl(var(--foreground) / 0.06);
1872
+ color: hsl(var(--foreground));
1873
+ }
1874
+ .dybo-dropzone__label {
1875
+ font-size: var(--dybo-font-size-md);
1876
+ font-weight: var(--dybo-font-weight-medium);
1877
+ letter-spacing: 0.3px;
1878
+ text-align: center;
1879
+ color: hsl(var(--foreground));
1880
+ }
1881
+
1882
+ /* Step navigator (multi-step form sidebar) — §5 */
1883
+ .dybo-step-nav {
1884
+ border-radius: var(--radius-sm);
1885
+ background: hsl(var(--card) / 0.7);
1886
+ border: 1px solid hsl(var(--brand-white));
1887
+ backdrop-filter: blur(4px);
1888
+ -webkit-backdrop-filter: blur(4px);
1889
+ padding: 24px;
1890
+ }
1891
+ .dark .dybo-step-nav { border-color: hsl(var(--border)); }
1892
+ .dybo-step-nav__title { font-size: var(--dybo-font-size-lg); font-weight: var(--dybo-font-weight-regular); color: hsl(var(--foreground)); margin: 0 0 16px; }
1893
+ .dybo-step-nav__list { display: flex; flex-direction: column; gap: 4px; }
1894
+ .dybo-step-nav__item {
1895
+ width: 100%;
1896
+ text-align: left;
1897
+ border-radius: var(--radius-sm);
1898
+ padding: 10px 12px;
1899
+ display: flex;
1900
+ align-items: center;
1901
+ gap: 12px;
1902
+ background: transparent;
1903
+ border: none;
1904
+ cursor: pointer;
1905
+ font-family: inherit;
1906
+ color: hsl(var(--foreground));
1907
+ }
1908
+ .dybo-step-nav__item--active { background: hsl(var(--muted) / 0.5); }
1909
+ .dybo-step-nav__item-icon { color: hsl(var(--foreground)); display: flex; flex-shrink: 0; }
1910
+ .dybo-step-nav__item-text { display: flex; flex-direction: column; }
1911
+ .dybo-step-nav__item-label { font-weight: var(--dybo-font-weight-medium); color: hsl(var(--foreground)); line-height: 1.2; }
1912
+ .dybo-step-nav__item-sub { font-size: 12px; opacity: var(--opacity-intense); }
1913
+ .dybo-step-nav__status {
1914
+ margin-left: auto;
1915
+ display: inline-flex;
1916
+ align-items: center;
1917
+ justify-content: center;
1918
+ height: 24px;
1919
+ width: 24px;
1920
+ border-radius: var(--radius-full);
1921
+ flex-shrink: 0;
1922
+ }
1923
+ .dybo-step-nav__status--filled { background: hsl(var(--success)); color: hsl(var(--success-foreground)); }
1924
+ .dybo-step-nav__status--extracting { background: hsl(var(--info-background)); color: hsl(var(--info)); }
1925
+ .dybo-step-nav__status--partial { background: hsl(var(--warning)); color: #fff; }
1926
+ .dybo-step-nav__progress {
1927
+ margin-top: 20px;
1928
+ padding-top: 16px;
1929
+ border-top: 1px solid hsl(var(--border) / 0.5);
1930
+ }
1931
+ .dybo-step-nav__progress-row { display: flex; align-items: center; justify-content: space-between; font-size: var(--dybo-font-size-sm); margin-bottom: 6px; }
1932
+ .dybo-step-nav__progress-track { height: 8px; border-radius: var(--radius-full); background: hsl(var(--muted) / 0.6); overflow: hidden; }
1933
+ .dybo-step-nav__progress-fill { height: 100%; background: hsl(var(--primary)); border-radius: var(--radius-full); }
1934
+ .dybo-step-nav__progress-note { font-size: 12px; opacity: var(--opacity-intense); margin-top: 8px; }
1935
+ .dybo-step-nav__actions { margin-top: 20px; display: flex; flex-direction: column; gap: 12px; }
1936
+
1937
+ /* Accordion — §5 */
1938
+ .dybo-accordion {
1939
+ border-radius: var(--radius-sm);
1940
+ background: hsl(var(--card) / 0.7);
1941
+ border: 1px solid hsl(var(--brand-white));
1942
+ backdrop-filter: blur(4px);
1943
+ -webkit-backdrop-filter: blur(4px);
1944
+ }
1945
+ .dark .dybo-accordion { border-color: hsl(var(--border)); }
1946
+ .dybo-accordion > summary {
1947
+ list-style: none;
1948
+ cursor: pointer;
1949
+ display: flex;
1950
+ align-items: center;
1951
+ justify-content: space-between;
1952
+ gap: 16px;
1953
+ padding: 20px;
1954
+ }
1955
+ .dybo-accordion > summary::-webkit-details-marker { display: none; }
1956
+ .dybo-accordion__q { font-size: var(--dybo-font-size-md); font-weight: var(--dybo-font-weight-medium); color: hsl(var(--foreground)); }
1957
+ .dybo-accordion__chevron { flex-shrink: 0; color: hsl(var(--foreground) / 0.5); transition: transform 0.15s; }
1958
+ .dybo-accordion[open] .dybo-accordion__chevron { transform: rotate(180deg); }
1959
+ .dybo-accordion__body { padding: 0 20px 20px; margin-top: -4px; font-size: var(--dybo-font-size-sm); font-weight: var(--dybo-font-weight-medium); opacity: var(--opacity-intense); line-height: 1.6; }
1960
+
1961
+ /* Toast — §5 */
1962
+ .dybo-toast {
1963
+ border-radius: var(--radius-sm);
1964
+ background: hsl(var(--brand-dark-orb));
1965
+ color: hsl(var(--brand-white));
1966
+ padding: 16px 20px;
1967
+ box-shadow: var(--shadow-level-2);
1968
+ display: flex;
1969
+ align-items: flex-start;
1970
+ gap: 12px;
1971
+ }
1972
+ .dybo-toast__icon { flex-shrink: 0; margin-top: 2px; }
1973
+ .dybo-toast__text { font-size: var(--dybo-font-size-sm); font-weight: var(--dybo-font-weight-medium); line-height: 1.4; }
1974
+
1975
+ /* Warning / blocking-error banners — §5 (Banner, distinct from the transient Alert) */
1976
+ .dybo-banner {
1977
+ border-radius: var(--radius-sm);
1978
+ padding: 16px;
1979
+ display: flex;
1980
+ gap: 16px;
1981
+ align-items: flex-start;
1982
+ }
1983
+ .dybo-banner--warning {
1984
+ background: hsl(var(--warning-background));
1985
+ border: 1px solid hsl(var(--warning) / 0.2);
1986
+ color: hsl(var(--warning));
1987
+ }
1988
+ .dybo-banner--error {
1989
+ background: hsl(var(--destructive) / 0.06);
1990
+ border: 1px solid hsl(var(--destructive) / 0.25);
1991
+ }
1992
+ .dybo-banner__icon { flex-shrink: 0; }
1993
+ .dybo-banner--warning .dybo-banner__icon { color: hsl(var(--warning)); }
1994
+ .dybo-banner--error .dybo-banner__icon { color: hsl(var(--destructive)); margin-top: 2px; }
1995
+ .dybo-banner__body { flex: 1; display: flex; flex-direction: column; gap: 8px; }
1996
+ .dybo-banner--warning .dybo-banner__title { font-weight: 700; font-size: var(--dybo-font-size-md); }
1997
+ .dybo-banner--error .dybo-banner__title { font-weight: 700; font-size: var(--dybo-font-size-sm); color: hsl(var(--foreground)); }
1998
+ .dybo-banner--error .dybo-banner__desc { font-size: var(--dybo-font-size-sm); opacity: var(--opacity-intense); color: hsl(var(--foreground)); }
1999
+ .dybo-banner__list { font-size: var(--dybo-font-size-sm); list-style: disc; margin: 0; padding-left: 20px; display: flex; flex-direction: column; gap: 4px; }
2000
+
2001
+ /* File preview card — §5 */
2002
+ .dybo-file-preview-pager {
2003
+ display: inline-flex;
2004
+ align-items: center;
2005
+ gap: 8px;
2006
+ border-radius: 13px;
2007
+ border: 1px solid hsl(var(--border) / 0.6);
2008
+ background: hsl(var(--muted) / 0.3);
2009
+ padding: 4px 8px;
2010
+ }
2011
+ .dybo-file-preview-pager button {
2012
+ border: none;
2013
+ background: transparent;
2014
+ color: hsl(var(--foreground));
2015
+ cursor: pointer;
2016
+ border-radius: 6px;
2017
+ padding: 4px;
2018
+ display: flex;
2019
+ }
2020
+ .dybo-file-preview-pager button:disabled { opacity: 0.4; cursor: not-allowed; }
2021
+ .dybo-file-preview {
2022
+ border-radius: var(--radius-md);
2023
+ border: 1px solid hsl(var(--border) / 0.8);
2024
+ background: linear-gradient(to bottom, hsl(var(--card)), hsl(var(--muted) / 0.4));
2025
+ min-height: 197px;
2026
+ display: flex;
2027
+ flex-direction: column;
2028
+ overflow: hidden;
2029
+ }
2030
+ .dark .dybo-file-preview { border-color: hsl(var(--border) / 0.6); }
2031
+ .dybo-file-preview__name { padding: 20px 20px 0; font-size: var(--dybo-font-size-md); font-weight: 700; color: hsl(var(--foreground)); letter-spacing: 0.3px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
2032
+ .dybo-file-preview__meta { padding: 12px 20px 0; font-size: var(--dybo-font-size-sm); color: hsl(var(--muted-foreground)); font-weight: var(--dybo-font-weight-medium); line-height: 1.6; }
2033
+ .dybo-file-preview__meta p { margin: 0; }
2034
+ .dybo-file-preview__image { margin-top: auto; padding-left: 20px; display: flex; align-items: flex-end; }
2035
+ .dybo-file-preview__image img { height: 118px; width: 118px; object-fit: contain; object-position: left bottom; }
2036
+
2037
+ /* File review row — §5 */
2038
+ .dybo-file-review {
2039
+ border-radius: var(--radius-sm);
2040
+ background: hsl(var(--muted) / 0.2);
2041
+ border: 1px solid hsl(var(--border) / 0.5);
2042
+ padding: 12px;
2043
+ }
2044
+ .dybo-file-review__main { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
2045
+ .dybo-file-review__icon { flex-shrink: 0; display: flex; height: 36px; width: 36px; align-items: center; justify-content: center; border-radius: 9px; background: linear-gradient(to bottom, hsl(var(--card)), hsl(var(--muted) / 0.5)); color: hsl(var(--foreground)); }
2046
+ .dybo-file-review__name-row { display: flex; align-items: center; gap: 8px; }
2047
+ .dybo-file-review__name { font-weight: var(--dybo-font-weight-medium); color: hsl(var(--foreground)); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
2048
+ .dybo-file-review__size { font-size: 12px; opacity: var(--opacity-intense); flex-shrink: 0; }
2049
+ .dybo-file-review__sub { font-size: 12px; opacity: var(--opacity-intense); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; margin-top: 2px; }
2050
+ .dybo-file-review__actions { display: flex; align-items: center; gap: 8px; margin-left: auto; }
2051
+ .dybo-file-review__ic {
2052
+ height: 36px; width: 36px; border-radius: 10px; border: 1px solid hsl(var(--muted-foreground) / 0.25);
2053
+ background: hsl(var(--secondary)); color: hsl(var(--foreground)); cursor: pointer;
2054
+ display: flex; align-items: center; justify-content: center;
2055
+ }
2056
+ .dybo-file-review__ic--approve { color: hsl(var(--success)); }
2057
+ .dybo-file-review__ic--reject { color: hsl(var(--destructive)); }
2058
+
2059
+ /* Rejection reason panel — §5 */
2060
+ .dybo-reject-panel {
2061
+ margin-top: 12px;
2062
+ border-radius: var(--radius-sm);
2063
+ background: hsl(var(--warning-background) / 0.6);
2064
+ border: 1px solid hsl(var(--warning) / 0.25);
2065
+ padding: 12px;
2066
+ display: flex;
2067
+ flex-direction: column;
2068
+ gap: 10px;
2069
+ }
2070
+ .dybo-reject-panel__label { font-size: var(--dybo-font-size-sm); font-weight: var(--dybo-font-weight-medium); color: hsl(var(--foreground)); }
2071
+ .dybo-reason-chips { display: flex; flex-wrap: wrap; gap: 8px; }
2072
+ .dybo-reason-chip {
2073
+ padding: 6px 12px; border-radius: var(--radius-full); border: 1px solid hsl(var(--border));
2074
+ background: hsl(var(--secondary)); color: hsl(var(--secondary-foreground));
2075
+ font-family: inherit; font-size: var(--dybo-font-size-sm); cursor: pointer;
2076
+ }
2077
+ .dybo-reason-chip--on { background: hsl(var(--warning)); color: #fff; border-color: transparent; }
2078
+ .dybo-reject-panel__note {
2079
+ width: 100%; border-radius: var(--radius-sm); border: 1px solid hsl(var(--border));
2080
+ background: hsl(var(--input)); padding: 12px; font-size: var(--dybo-font-size-sm); font-family: inherit;
2081
+ color: hsl(var(--foreground)); resize: vertical;
2082
+ }
2083
+ .dybo-reject-panel__footer { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
2084
+ .dybo-reject-panel__notice { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; opacity: var(--opacity-intense); color: hsl(var(--foreground)); }
2085
+ .dybo-reject-panel__actions { display: flex; gap: 8px; }
2086
+ .dybo-reject-btn {
2087
+ height: 36px; padding: 0 14px; border-radius: var(--radius-sm); border: 1px solid hsl(var(--border));
2088
+ background: hsl(var(--secondary)); color: hsl(var(--secondary-foreground)); font-family: inherit;
2089
+ font-size: var(--dybo-font-size-sm); font-weight: var(--dybo-font-weight-medium); cursor: pointer;
2090
+ }
2091
+ .dybo-reject-btn--solid { background: hsl(var(--destructive)); color: #fff; border-color: transparent; }
2092
+
2093
+ /* Platform switcher — §5 */
2094
+ .dybo-platform-switcher {
2095
+ position: absolute;
2096
+ top: calc(100% + 10px);
2097
+ right: 0;
2098
+ width: min(640px, 90vw);
2099
+ z-index: 60;
2100
+ border-radius: var(--radius-md);
2101
+ padding: 16px;
2102
+ background: hsl(var(--card));
2103
+ border: 1px solid hsl(var(--border));
2104
+ box-shadow: var(--shadow-level-2);
2105
+ }
2106
+ .dybo-platform-switcher__grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 10px; }
2107
+ .dybo-platform-switcher__card {
2108
+ display: flex; gap: 10px; align-items: flex-start; padding: 12px; border-radius: var(--radius-sm);
2109
+ text-decoration: none; color: inherit;
2110
+ }
2111
+ .dybo-platform-switcher__card:hover { background: hsl(var(--muted) / 0.4); }
2112
+ .dybo-platform-switcher__icon {
2113
+ flex-shrink: 0; display: flex; height: 36px; width: 36px; align-items: center; justify-content: center;
2114
+ border-radius: 10px; background: hsl(var(--muted) / 0.6); color: hsl(var(--foreground));
2115
+ }
2116
+ .dybo-platform-switcher__title { font-size: var(--dybo-font-size-sm); font-weight: var(--dybo-font-weight-semibold); color: hsl(var(--foreground)); display: block; }
2117
+ .dybo-platform-switcher__desc { font-size: 12px; opacity: var(--opacity-intense); color: hsl(var(--foreground)); }
2118
+
2119
+ /* Underline tabs — §5 (secondary page-wide nav) */
2120
+ .dybo-underline-tabs { border-bottom: 1px solid hsl(var(--border)); display: flex; align-items: center; gap: 28px; overflow-x: auto; }
2121
+ .dybo-underline-tabs__tab {
2122
+ height: 40px; font-size: 12px; text-transform: uppercase; letter-spacing: 0.08em;
2123
+ opacity: 0.5; background: transparent; border: none; border-bottom: 2px solid transparent;
2124
+ font-family: inherit; font-weight: var(--dybo-font-weight-medium); color: hsl(var(--foreground));
2125
+ cursor: pointer; white-space: nowrap;
2126
+ }
2127
+ .dybo-underline-tabs__tab:hover { opacity: 0.8; }
2128
+ .dybo-underline-tabs__tab[aria-selected="true"] { opacity: 1; border-bottom-color: hsl(var(--brand-dark-orb)); }
2129
+ .dark .dybo-underline-tabs__tab[aria-selected="true"] { border-bottom-color: hsl(var(--foreground)); }
2130
+
2131
+ /* Nested filter pills — §5 */
2132
+ .dybo-filter-pills { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
2133
+ .dybo-filter-pill {
2134
+ height: 32px; padding: 0 14px; border-radius: var(--radius-full); background: hsl(var(--secondary));
2135
+ color: hsl(var(--secondary-foreground)); border: none; font-family: inherit; font-size: var(--dybo-font-size-sm);
2136
+ font-weight: var(--dybo-font-weight-medium); cursor: pointer;
2137
+ }
2138
+ .dybo-filter-pill--active { background: hsl(var(--brand-dark-orb)); color: #fff; }
2139
+ .dark .dybo-filter-pill--active { background: hsl(var(--primary)); color: hsl(var(--primary-foreground)); }
2140
+
2141
+ /* Ticket card — §5 */
2142
+ .dybo-ticket-card {
2143
+ display: flex;
2144
+ flex-direction: column;
2145
+ gap: 16px;
2146
+ border-radius: var(--radius-sm);
2147
+ background: hsl(var(--background) / 0.4);
2148
+ border: 1px solid hsl(var(--brand-white));
2149
+ padding: 20px;
2150
+ text-decoration: none;
2151
+ color: inherit;
2152
+ transition: box-shadow 0.15s;
2153
+ }
2154
+ .dark .dybo-ticket-card { background: hsl(var(--background) / 0.3); border-color: hsl(var(--border)); }
2155
+ .dybo-ticket-card:hover { box-shadow: var(--shadow-level-1); }
2156
+ .dybo-ticket-card--selected { border: 2px solid hsl(var(--primary) / 0.7); background: hsl(var(--card)); box-shadow: var(--shadow-level-1); }
2157
+ .dybo-ticket-card--closed { opacity: 0.6; }
2158
+ .dybo-ticket-card__top { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
2159
+ .dybo-ticket-card__id { font-size: var(--dybo-font-size-sm); font-weight: var(--dybo-font-weight-medium); opacity: var(--opacity-intense); }
2160
+ .dybo-ticket-card__fields { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
2161
+ .dybo-ticket-card__field { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
2162
+ .dybo-ticket-card__field-label { font-size: 12px; font-weight: var(--dybo-font-weight-medium); opacity: var(--opacity-intense); }
2163
+ .dybo-ticket-card__field-value { font-size: var(--dybo-font-size-sm); font-weight: 700; color: hsl(var(--foreground)); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
2164
+
2165
+ /* Chat thread — §5. Viewer always on the right (bg-primary); the other party left (bg-muted). */
2166
+ .dybo-chat-message { display: flex; gap: 12px; max-width: 85%; }
2167
+ .dybo-chat-message--mine { margin-left: auto; flex-direction: row-reverse; }
2168
+ .dybo-chat-message__avatar {
2169
+ flex-shrink: 0; height: 36px; width: 36px; border-radius: var(--radius-full);
2170
+ background: hsl(var(--brand-dark-orb)); color: #fff; font-size: 12px; font-weight: 700;
2171
+ display: flex; align-items: center; justify-content: center;
2172
+ }
2173
+ .dybo-chat-message--mine .dybo-chat-message__avatar { background: hsl(var(--brand-indigo)); }
2174
+ .dybo-chat-message__body { min-width: 0; }
2175
+ .dybo-chat-message__meta { display: flex; align-items: center; gap: 8px; margin-bottom: 4px; }
2176
+ .dybo-chat-message--mine .dybo-chat-message__meta { justify-content: flex-end; }
2177
+ .dybo-chat-message__author { font-size: var(--dybo-font-size-sm); font-weight: 700; color: hsl(var(--foreground)); }
2178
+ .dybo-chat-message__time { font-size: 12px; font-weight: var(--dybo-font-weight-medium); opacity: var(--opacity-intense); }
2179
+ .dybo-chat-message__bubble {
2180
+ border-radius: var(--radius-sm) var(--radius-sm) var(--radius-sm) 4px;
2181
+ background: hsl(var(--muted) / 0.4);
2182
+ padding: 12px 16px;
2183
+ font-size: var(--dybo-font-size-sm);
2184
+ color: hsl(var(--foreground));
2185
+ line-height: 1.6;
2186
+ }
2187
+ .dark .dybo-chat-message__bubble { background: hsl(var(--muted) / 0.2); }
2188
+ .dybo-chat-message--mine .dybo-chat-message__bubble {
2189
+ border-radius: var(--radius-sm) var(--radius-sm) 4px var(--radius-sm);
2190
+ background: hsl(var(--primary));
2191
+ color: hsl(var(--primary-foreground));
2192
+ }
2193
+
2194
+ /* Internal note card — §5 */
2195
+ .dybo-internal-note {
2196
+ border-radius: var(--radius-sm);
2197
+ background: hsl(var(--warning-background) / 0.6);
2198
+ border: 1px solid hsl(var(--warning) / 0.2);
2199
+ padding: 16px;
2200
+ display: flex;
2201
+ flex-direction: column;
2202
+ gap: 8px;
2203
+ }
2204
+ .dybo-internal-note__head { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
2205
+ .dybo-internal-note__author { font-size: var(--dybo-font-size-sm); font-weight: 700; color: hsl(var(--foreground)); }
2206
+ .dybo-internal-note__author span { font-weight: var(--dybo-font-weight-medium); opacity: var(--opacity-intense); }
2207
+ .dybo-internal-note__time { font-size: 12px; font-weight: var(--dybo-font-weight-medium); opacity: var(--opacity-intense); }
2208
+ .dybo-internal-note__body { font-size: var(--dybo-font-size-sm); color: hsl(var(--foreground)); line-height: 1.6; margin: 0; }
2209
+
2210
+ /* Linked app indicator — §5 */
2211
+ .dybo-linked-app { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; font-weight: var(--dybo-font-weight-semibold); color: hsl(var(--brand-indigo)); }
2212
+ .dark .dybo-linked-app { color: hsl(var(--brand-blue-yonder)); }
2213
+ .dybo-linked-app--empty { opacity: var(--opacity-intense); font-weight: var(--dybo-font-weight-regular); }
2214
+
2215
+ /* Document-type selector grid — §5 */
2216
+ .dybo-doc-type-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px; }
2217
+ @media (min-width: 768px) { .dybo-doc-type-grid { grid-template-columns: repeat(4, 1fr); } }
2218
+ .dybo-doc-type-card {
2219
+ position: relative;
2220
+ display: flex;
2221
+ flex-direction: column;
2222
+ align-items: center;
2223
+ justify-content: center;
2224
+ gap: 8px;
2225
+ height: 120px;
2226
+ padding: 16px;
2227
+ border-radius: var(--radius-sm);
2228
+ border: 1px solid hsl(var(--border));
2229
+ background: hsl(var(--card) / 0.7);
2230
+ backdrop-filter: blur(4px);
2231
+ -webkit-backdrop-filter: blur(4px);
2232
+ text-align: center;
2233
+ color: hsl(var(--foreground));
2234
+ cursor: pointer;
2235
+ font-family: inherit;
2236
+ }
2237
+ .dybo-doc-type-card:hover {
2238
+ background: hsl(var(--primary));
2239
+ color: hsl(var(--primary-foreground));
2240
+ }
2241
+ .dybo-doc-type-card--disabled {
2242
+ opacity: var(--opacity-semi-opaque);
2243
+ pointer-events: none;
2244
+ cursor: default;
2245
+ }
2246
+ .dybo-doc-type-card__label { font-size: var(--dybo-font-size-sm); font-weight: var(--dybo-font-weight-medium); }
2247
+
2248
+ /* Read-only computed-value box — §5 */
2249
+ .dybo-readonly-field {
2250
+ border-radius: var(--radius-sm);
2251
+ background: hsl(var(--muted) / 0.4);
2252
+ padding: 16px;
2253
+ display: flex;
2254
+ flex-direction: column;
2255
+ gap: 8px;
1014
2256
  }
2257
+ .dybo-readonly-field__label { font-size: 11px; font-weight: var(--dybo-font-weight-semibold); text-transform: uppercase; letter-spacing: 0.5px; opacity: var(--opacity-intense); }
2258
+ .dybo-readonly-field__value { font-size: var(--dybo-font-size-sm); font-weight: var(--dybo-font-weight-medium); margin-top: 2px; }