@duckcodeailabs/dql-ui 1.0.1 → 1.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/icons/dql-glyphs.d.ts +19 -0
  2. package/dist/icons/dql-glyphs.d.ts.map +1 -0
  3. package/dist/icons/dql-glyphs.js +23 -0
  4. package/dist/icons/dql-glyphs.js.map +1 -0
  5. package/dist/icons/index.d.ts +3 -0
  6. package/dist/icons/index.d.ts.map +1 -0
  7. package/dist/icons/index.js +9 -0
  8. package/dist/icons/index.js.map +1 -0
  9. package/dist/index.d.ts +7 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +14 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/primitives/CellChrome.d.ts +43 -0
  14. package/dist/primitives/CellChrome.d.ts.map +1 -0
  15. package/dist/primitives/CellChrome.js +46 -0
  16. package/dist/primitives/CellChrome.js.map +1 -0
  17. package/dist/primitives/Kbd.d.ts +12 -0
  18. package/dist/primitives/Kbd.d.ts.map +1 -0
  19. package/dist/primitives/Kbd.js +23 -0
  20. package/dist/primitives/Kbd.js.map +1 -0
  21. package/dist/primitives/PanelFrame.d.ts +67 -0
  22. package/dist/primitives/PanelFrame.d.ts.map +1 -0
  23. package/dist/primitives/PanelFrame.js +27 -0
  24. package/dist/primitives/PanelFrame.js.map +1 -0
  25. package/dist/primitives/PublishedCellChrome.d.ts +20 -0
  26. package/dist/primitives/PublishedCellChrome.d.ts.map +1 -0
  27. package/dist/primitives/PublishedCellChrome.js +47 -0
  28. package/dist/primitives/PublishedCellChrome.js.map +1 -0
  29. package/dist/primitives/SegmentedControl.d.ts +16 -0
  30. package/dist/primitives/SegmentedControl.d.ts.map +1 -0
  31. package/dist/primitives/SegmentedControl.js +33 -0
  32. package/dist/primitives/SegmentedControl.js.map +1 -0
  33. package/dist/primitives/Shell.d.ts +44 -0
  34. package/dist/primitives/Shell.d.ts.map +1 -0
  35. package/dist/primitives/Shell.js +78 -0
  36. package/dist/primitives/Shell.js.map +1 -0
  37. package/dist/primitives/TrustBadge.d.ts +8 -0
  38. package/dist/primitives/TrustBadge.d.ts.map +1 -0
  39. package/dist/primitives/TrustBadge.js +13 -0
  40. package/dist/primitives/TrustBadge.js.map +1 -0
  41. package/dist/tokens/index.d.ts +5 -0
  42. package/dist/tokens/index.d.ts.map +1 -1
  43. package/dist/tokens/index.js +14 -1
  44. package/dist/tokens/index.js.map +1 -1
  45. package/package.json +12 -4
  46. package/src/styles/globals.css +518 -0
  47. package/src/styles/panel.css +448 -0
  48. package/src/styles/tokens.css +1977 -0
@@ -0,0 +1,518 @@
1
+ @import "tailwindcss";
2
+ @import "./tokens.css";
3
+ @import "./panel.css";
4
+
5
+ /* ──────────────────────────────────────────────────────────────────────────
6
+ DQL — Luna-class design tokens (ported from DataLex).
7
+ Organized by role, not value. Components reference tokens, not literals.
8
+ Luna CSS vars are declared in tokens.css under [data-theme="…"]. The
9
+ @theme block below bridges them into Tailwind 4 utilities so every
10
+ utility class (`bg-bg-primary`, `text-text-secondary`, `border-border-subtle`,
11
+ `bg-accent-blue`) resolves to a Luna var at runtime — switching
12
+ [data-theme] on <html> re-skins every surface simultaneously.
13
+ ────────────────────────────────────────────────────────────────────────── */
14
+
15
+ @theme {
16
+ /* ──────────────────────────────────────────────────────────────────
17
+ Semantic tokens bridge to Luna CSS vars (declared in
18
+ datalex-design.css under [data-theme="…"]). This means every
19
+ Tailwind utility like `bg-bg-secondary`, `text-text-primary`,
20
+ `border-border-primary`, `bg-accent-blue` resolves to a Luna
21
+ variable at runtime — so switching theme updates ALL surfaces
22
+ (panels, dialogs, legacy components) live, not just the root shell.
23
+ ────────────────────────────────────────────────────────────────── */
24
+
25
+ /* Surfaces */
26
+ --color-bg-primary: var(--bg-1);
27
+ --color-bg-secondary: var(--bg-2);
28
+ --color-bg-tertiary: var(--bg-3);
29
+ --color-bg-surface: var(--bg-2);
30
+ --color-bg-elevated: var(--bg-3);
31
+ --color-bg-sunken: var(--bg-0);
32
+ --color-bg-hover: var(--bg-3);
33
+ --color-bg-active: var(--accent-dim);
34
+ --color-bg-card: var(--bg-2);
35
+ --color-bg-toolbar: var(--bg-1);
36
+ --color-bg-canvas: var(--bg-canvas);
37
+ --color-bg-overlay: var(--scrim);
38
+
39
+ /* Borders */
40
+ --color-border-primary: var(--border-default);
41
+ --color-border-secondary: var(--border-strong);
42
+ --color-border-subtle: var(--border-subtle);
43
+ --color-border-strong: var(--border-strong);
44
+ --color-border-accent: var(--accent);
45
+ --color-border-focus: var(--border-focus);
46
+
47
+ /* Text */
48
+ --color-text-primary: var(--text-primary);
49
+ --color-text-secondary: var(--text-secondary);
50
+ --color-text-tertiary: var(--text-tertiary);
51
+ --color-text-muted: var(--text-muted);
52
+ --color-text-subtle: var(--text-muted);
53
+ --color-text-accent: var(--accent);
54
+ --color-text-on-accent: var(--accent-fg);
55
+
56
+ /* Accents */
57
+ --color-accent-blue: var(--accent);
58
+ --color-accent-blue-soft: var(--accent-dim);
59
+ --color-accent-green: var(--cat-billing);
60
+ --color-accent-green-soft: var(--cat-billing-soft);
61
+ --color-accent-yellow: var(--pk);
62
+ --color-accent-yellow-soft: rgba(245, 181, 68, 0.14);
63
+ --color-accent-red: #ef4444;
64
+ --color-accent-red-soft: rgba(239, 68, 68, 0.14);
65
+ --color-accent-purple: var(--cat-users);
66
+ --color-accent-purple-soft: var(--cat-users-soft);
67
+ --color-accent-orange: var(--cat-product);
68
+ --color-accent-orange-soft: var(--cat-product-soft);
69
+ --color-accent-cyan: var(--cat-audit);
70
+ --color-accent-cyan-soft: var(--cat-audit-soft);
71
+ --color-accent-pink: var(--cat-access);
72
+ --color-accent-pink-soft: var(--cat-access-soft);
73
+ --color-accent-teal: var(--idx);
74
+ --color-accent-teal-soft: rgba(78, 201, 176, 0.14);
75
+
76
+ /* Status — resolve to per-theme --status-* vars from tokens.css so paper/white
77
+ surface their tuned tones instead of dark-theme defaults. */
78
+ --color-status-success: var(--status-success);
79
+ --color-status-warning: var(--status-warning);
80
+ --color-status-error: var(--status-error);
81
+ --color-status-info: var(--accent);
82
+
83
+ /* Cardinality (edge colors) */
84
+ --color-cardinality-one-one: #16a34a;
85
+ --color-cardinality-one-many: #2563eb;
86
+ --color-cardinality-many-one: #9333ea;
87
+ --color-cardinality-many-many: #ea580c;
88
+
89
+ /* Object-type glyph colors (left tree icons + node headers) */
90
+ --color-ot-table: #3b82f6;
91
+ --color-ot-view: #8b5cf6;
92
+ --color-ot-enum: #d946ef;
93
+ --color-ot-function: #14b8a6;
94
+ --color-ot-procedure: #0891b2;
95
+ --color-ot-domain: #7c3aed;
96
+ --color-ot-sequence: #f59e0b;
97
+ --color-ot-trigger: #ef4444;
98
+ --color-ot-policy: #64748b;
99
+ --color-ot-rule: #0ea5e9;
100
+ --color-ot-fact: #2563eb;
101
+ --color-ot-dimension: #7c3aed;
102
+ --color-ot-bridge: #db2777;
103
+ --color-ot-hub: #059669;
104
+ --color-ot-link: #f59e0b;
105
+ --color-ot-satellite: #0891b2;
106
+
107
+ /* Shadows */
108
+ --shadow-xs: 0 1px 0 rgba(15, 23, 42, 0.04);
109
+ --shadow-sm: 0 1px 2px rgba(15, 23, 42, 0.06), 0 1px 1px rgba(15, 23, 42, 0.04);
110
+ --shadow-md: 0 4px 8px -2px rgba(15, 23, 42, 0.06), 0 2px 4px -1px rgba(15, 23, 42, 0.04);
111
+ --shadow-lg: 0 10px 20px -4px rgba(15, 23, 42, 0.08), 0 4px 8px -2px rgba(15, 23, 42, 0.04);
112
+ --shadow-xl: 0 20px 40px -8px rgba(15, 23, 42, 0.12);
113
+ --shadow-focus: 0 0 0 2px rgba(59, 130, 246, 0.35);
114
+
115
+ /* Radii (8px grid) */
116
+ --radius-xs: 4px;
117
+ --radius-sm: 6px;
118
+ --radius-md: 8px;
119
+ --radius-lg: 12px;
120
+ --radius-xl: 16px;
121
+ --radius-pill: 999px;
122
+
123
+ /* Spacing (8 px grid) */
124
+ --space-1: 4px;
125
+ --space-2: 8px;
126
+ --space-3: 12px;
127
+ --space-4: 16px;
128
+ --space-5: 20px;
129
+ --space-6: 24px;
130
+ --space-8: 32px;
131
+ --space-10: 40px;
132
+ --space-12: 48px;
133
+
134
+ /* Type scale */
135
+ --text-2xs: 10px;
136
+ --text-xs: 11px;
137
+ --text-sm: 12px;
138
+ --text-base: 13px;
139
+ --text-md: 14px;
140
+ --text-lg: 16px;
141
+ --text-xl: 18px;
142
+ --text-2xl: 22px;
143
+
144
+ /* Font weights */
145
+ --weight-regular: 400;
146
+ --weight-medium: 500;
147
+ --weight-semibold: 600;
148
+ --weight-bold: 700;
149
+
150
+ /* Line heights */
151
+ --leading-tight: 1.2;
152
+ --leading-snug: 1.35;
153
+ --leading-normal: 1.5;
154
+ --leading-relaxed: 1.7;
155
+ }
156
+
157
+ /* ──────────────────────────────────────────────────────────────────────────
158
+ Legacy dark theme — retained for back-compat. Luna themes
159
+ (obsidian/paper/white) live in tokens.css and drive all semantic tokens
160
+ via the var() bridges above.
161
+ ────────────────────────────────────────────────────────────────────────── */
162
+
163
+ /* ──────────────────────────────────────────────────────────────────────────
164
+ Base
165
+ ────────────────────────────────────────────────────────────────────────── */
166
+
167
+ @layer base {
168
+ * {
169
+ box-sizing: border-box;
170
+ }
171
+
172
+ html {
173
+ font-size: 14px;
174
+ }
175
+
176
+ body {
177
+ margin: 0;
178
+ font-family: var(--font-ui);
179
+ font-size: var(--text-base);
180
+ font-weight: var(--weight-regular);
181
+ line-height: var(--leading-normal);
182
+ letter-spacing: -0.005em;
183
+ background: var(--color-bg-primary);
184
+ color: var(--color-text-primary);
185
+ min-height: 100vh;
186
+ -webkit-font-smoothing: antialiased;
187
+ -moz-osx-font-smoothing: grayscale;
188
+ text-rendering: optimizeLegibility;
189
+ font-feature-settings: "cv01", "cv02", "cv03", "ss01";
190
+ }
191
+
192
+ [data-theme="light"] body,
193
+ body:not([data-theme]) {
194
+ background:
195
+ radial-gradient(circle at 0% 0%, rgba(148, 200, 255, 0.14) 0%, transparent 28%),
196
+ radial-gradient(circle at 100% 0%, rgba(176, 237, 255, 0.16) 0%, transparent 34%),
197
+ var(--color-bg-primary);
198
+ }
199
+
200
+ [data-theme="dark"] body {
201
+ background: var(--color-bg-primary);
202
+ }
203
+
204
+ #root {
205
+ min-height: 100vh;
206
+ display: flex;
207
+ flex-direction: column;
208
+ }
209
+
210
+ code,
211
+ pre,
212
+ .font-mono {
213
+ font-family: 'JetBrains Mono', 'SFMono-Regular', Menlo, Monaco, Consolas, monospace;
214
+ font-feature-settings: "liga" 0, "calt" 1;
215
+ }
216
+
217
+ ::-webkit-scrollbar {
218
+ width: 10px;
219
+ height: 10px;
220
+ }
221
+
222
+ ::-webkit-scrollbar-track {
223
+ background: transparent;
224
+ }
225
+
226
+ ::-webkit-scrollbar-thumb {
227
+ background: var(--color-border-secondary);
228
+ border-radius: 5px;
229
+ border: 2px solid transparent;
230
+ background-clip: padding-box;
231
+ }
232
+
233
+ ::-webkit-scrollbar-thumb:hover {
234
+ background: var(--color-border-strong);
235
+ background-clip: padding-box;
236
+ border: 2px solid transparent;
237
+ }
238
+
239
+ ::selection {
240
+ background: rgba(59, 130, 246, 0.22);
241
+ color: var(--color-text-primary);
242
+ }
243
+
244
+ *:focus-visible {
245
+ outline: none;
246
+ box-shadow: var(--shadow-focus);
247
+ border-radius: 4px;
248
+ }
249
+
250
+ /* Remove default focus for buttons that set their own ring */
251
+ button:focus:not(:focus-visible) {
252
+ outline: none;
253
+ }
254
+ }
255
+
256
+ /* ──────────────────────────────────────────────────────────────────────────
257
+ Typography utilities (semantic roles)
258
+ ────────────────────────────────────────────────────────────────────────── */
259
+
260
+ .t-display {
261
+ font-size: var(--text-2xl);
262
+ line-height: var(--leading-tight);
263
+ font-weight: var(--weight-semibold);
264
+ letter-spacing: -0.02em;
265
+ color: var(--color-text-primary);
266
+ }
267
+
268
+ .t-title {
269
+ font-size: var(--text-lg);
270
+ line-height: var(--leading-snug);
271
+ font-weight: var(--weight-semibold);
272
+ letter-spacing: -0.01em;
273
+ color: var(--color-text-primary);
274
+ }
275
+
276
+ .t-subtitle {
277
+ font-size: var(--text-md);
278
+ line-height: var(--leading-snug);
279
+ font-weight: var(--weight-semibold);
280
+ color: var(--color-text-primary);
281
+ }
282
+
283
+ .t-body {
284
+ font-size: var(--text-base);
285
+ line-height: var(--leading-normal);
286
+ font-weight: var(--weight-regular);
287
+ color: var(--color-text-secondary);
288
+ }
289
+
290
+ .t-label {
291
+ font-size: var(--text-sm);
292
+ line-height: var(--leading-snug);
293
+ font-weight: var(--weight-medium);
294
+ color: var(--color-text-primary);
295
+ }
296
+
297
+ .t-caption {
298
+ font-size: var(--text-xs);
299
+ line-height: var(--leading-snug);
300
+ font-weight: var(--weight-regular);
301
+ color: var(--color-text-muted);
302
+ }
303
+
304
+ .t-overline {
305
+ font-size: var(--text-2xs);
306
+ line-height: var(--leading-tight);
307
+ font-weight: var(--weight-semibold);
308
+ letter-spacing: 0.08em;
309
+ text-transform: uppercase;
310
+ color: var(--color-text-muted);
311
+ }
312
+
313
+ .t-mono {
314
+ font-family: 'JetBrains Mono', 'SFMono-Regular', Menlo, Monaco, Consolas, monospace;
315
+ font-size: var(--text-sm);
316
+ color: var(--color-text-secondary);
317
+ }
318
+
319
+ /* ──────────────────────────────────────────────────────────────────────────
320
+ Reusable primitives
321
+ ────────────────────────────────────────────────────────────────────────── */
322
+
323
+ /* Toolbar button — low-contrast icon button used in TopBar groups */
324
+ .dl-toolbar-btn {
325
+ display: inline-flex;
326
+ align-items: center;
327
+ gap: 6px;
328
+ height: 28px;
329
+ padding: 0 8px;
330
+ border-radius: var(--radius-sm);
331
+ border: 1px solid transparent;
332
+ background: transparent;
333
+ color: var(--color-text-secondary);
334
+ font-size: var(--text-sm);
335
+ font-weight: var(--weight-medium);
336
+ line-height: 1;
337
+ cursor: pointer;
338
+ transition: background 120ms ease, color 120ms ease, border-color 120ms ease;
339
+ user-select: none;
340
+ }
341
+
342
+ .dl-toolbar-btn:hover {
343
+ background: var(--color-bg-hover);
344
+ color: var(--color-text-primary);
345
+ }
346
+
347
+ .dl-toolbar-btn:active {
348
+ background: var(--color-bg-active);
349
+ }
350
+
351
+ .dl-toolbar-btn[disabled],
352
+ .dl-toolbar-btn:disabled {
353
+ opacity: 0.4;
354
+ cursor: not-allowed;
355
+ }
356
+
357
+ .dl-toolbar-btn--primary {
358
+ background: var(--color-accent-blue);
359
+ color: var(--color-text-on-accent);
360
+ border-color: var(--color-accent-blue);
361
+ }
362
+
363
+ .dl-toolbar-btn--primary:hover {
364
+ background: #2563eb;
365
+ color: var(--color-text-on-accent);
366
+ }
367
+
368
+ .dl-toolbar-btn--ghost-icon {
369
+ padding: 0;
370
+ width: 28px;
371
+ justify-content: center;
372
+ }
373
+
374
+ /* Toolbar group divider */
375
+ .dl-toolbar-divider {
376
+ width: 1px;
377
+ height: 18px;
378
+ background: var(--color-border-primary);
379
+ margin: 0 4px;
380
+ flex-shrink: 0;
381
+ }
382
+
383
+ /* Chip — small pill for status/meta */
384
+ .dl-chip {
385
+ display: inline-flex;
386
+ align-items: center;
387
+ gap: 4px;
388
+ height: 22px;
389
+ padding: 0 8px;
390
+ border-radius: var(--radius-pill);
391
+ font-size: var(--text-xs);
392
+ font-weight: var(--weight-medium);
393
+ line-height: 1;
394
+ background: var(--color-bg-tertiary);
395
+ color: var(--color-text-secondary);
396
+ border: 1px solid var(--color-border-subtle);
397
+ }
398
+
399
+ .dl-chip--accent {
400
+ background: var(--color-accent-blue-soft);
401
+ color: var(--color-accent-blue);
402
+ border-color: transparent;
403
+ }
404
+
405
+ /* Tree row (ObjectList) */
406
+ .dl-tree-row {
407
+ display: flex;
408
+ align-items: center;
409
+ gap: 6px;
410
+ height: 26px;
411
+ padding: 0 8px 0 6px;
412
+ border-radius: var(--radius-xs);
413
+ font-size: var(--text-sm);
414
+ color: var(--color-text-secondary);
415
+ cursor: pointer;
416
+ user-select: none;
417
+ transition: background 80ms ease, color 80ms ease;
418
+ }
419
+
420
+ .dl-tree-row:hover {
421
+ background: var(--color-bg-hover);
422
+ color: var(--color-text-primary);
423
+ }
424
+
425
+ .dl-tree-row--active {
426
+ background: var(--color-bg-active);
427
+ color: var(--color-text-accent);
428
+ font-weight: var(--weight-medium);
429
+ }
430
+
431
+ .dl-tree-section {
432
+ display: flex;
433
+ align-items: center;
434
+ gap: 6px;
435
+ height: 28px;
436
+ padding: 0 8px 0 4px;
437
+ font-size: var(--text-xs);
438
+ font-weight: var(--weight-semibold);
439
+ text-transform: uppercase;
440
+ letter-spacing: 0.06em;
441
+ color: var(--color-text-muted);
442
+ cursor: pointer;
443
+ user-select: none;
444
+ }
445
+
446
+ .dl-tree-section:hover {
447
+ color: var(--color-text-secondary);
448
+ }
449
+
450
+ /* ──────────────────────────────────────────────────────────────────────────
451
+ CodeMirror + React Flow adapters
452
+
453
+ The YAML editor owns its own theme via EditorView.theme() in
454
+ YamlEditor.jsx and swaps between a light and dark palette based on the
455
+ current Luna theme (obsidian → dark, paper/white → light). We
456
+ only set sizing here — colors, selection, gutters, and cursor are all
457
+ handled in the editor theme so they can vary per Luna theme.
458
+ ────────────────────────────────────────────────────────────────────────── */
459
+
460
+ .cm-editor {
461
+ height: 100% !important;
462
+ font-size: 13px;
463
+ }
464
+
465
+ .react-flow__background {
466
+ background: var(--color-bg-canvas) !important;
467
+ }
468
+
469
+ .react-flow__minimap {
470
+ background: var(--color-bg-surface) !important;
471
+ border: 1px solid var(--color-border-primary) !important;
472
+ border-radius: var(--radius-md) !important;
473
+ box-shadow: var(--shadow-sm);
474
+ }
475
+
476
+ .react-flow__controls {
477
+ border: 1px solid var(--color-border-primary) !important;
478
+ border-radius: var(--radius-md) !important;
479
+ overflow: hidden;
480
+ box-shadow: var(--shadow-sm);
481
+ }
482
+
483
+ .react-flow__controls-button {
484
+ background: var(--color-bg-surface) !important;
485
+ border-bottom: 1px solid var(--color-border-primary) !important;
486
+ fill: var(--color-text-secondary) !important;
487
+ }
488
+
489
+ .react-flow__controls-button:hover {
490
+ background: var(--color-bg-hover) !important;
491
+ }
492
+
493
+ [data-theme="dark"] .react-flow__node {
494
+ color: var(--color-text-primary);
495
+ }
496
+
497
+ [data-theme="dark"] .react-flow__edge-text {
498
+ fill: var(--color-text-secondary) !important;
499
+ }
500
+
501
+ /* Allotment sash colors */
502
+ .sash-container .sash {
503
+ background: var(--color-border-primary) !important;
504
+ }
505
+
506
+ .sash-container .sash:hover {
507
+ background: var(--color-accent-blue) !important;
508
+ }
509
+
510
+ @keyframes dql-drawer-slide-in {
511
+ from { transform: translateX(8px); opacity: 0; }
512
+ to { transform: translateX(0); opacity: 1; }
513
+ }
514
+
515
+ @keyframes dql-modal-fade-in {
516
+ from { opacity: 0; transform: scale(0.98); }
517
+ to { opacity: 1; transform: scale(1); }
518
+ }