@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,448 @@
1
+ /* ──────────────────────────────────────────────────────────────────────────
2
+ PanelFrame primitive styles — ported verbatim from DataLex.
3
+ Root frame + sections + cards + status pills + kv-grid + toolbar +
4
+ panel-table + form primitives. All values are Luna tokens, so panels
5
+ track the active [data-theme] automatically.
6
+ ────────────────────────────────────────────────────────────────────────── */
7
+
8
+ /* Root frame — header + optional toolbar + scrollable body */
9
+ .panel-frame {
10
+ display: flex;
11
+ flex-direction: column;
12
+ height: 100%;
13
+ min-height: 0;
14
+ background: var(--bg-1);
15
+ color: var(--text-primary);
16
+ }
17
+ .panel-frame-header {
18
+ display: flex;
19
+ align-items: flex-start;
20
+ justify-content: space-between;
21
+ gap: 16px;
22
+ padding: 12px 16px;
23
+ border-bottom: 1px solid var(--border-default);
24
+ background: var(--bg-2);
25
+ flex-shrink: 0;
26
+ }
27
+ .panel-frame-heading { display: flex; align-items: flex-start; gap: 10px; min-width: 0; }
28
+ .panel-frame-icon {
29
+ width: 26px; height: 26px;
30
+ display: inline-flex; align-items: center; justify-content: center;
31
+ border-radius: 7px;
32
+ background: var(--accent-dim);
33
+ color: var(--accent);
34
+ flex-shrink: 0;
35
+ }
36
+ .panel-frame-icon svg { width: 14px; height: 14px; }
37
+ .panel-frame-title-col { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
38
+ .panel-frame-eyebrow {
39
+ font-size: 10px; font-weight: 600; letter-spacing: 0.1em;
40
+ text-transform: uppercase; color: var(--text-tertiary);
41
+ }
42
+ .panel-frame-title-row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
43
+ .panel-frame-title {
44
+ font-size: 13px; font-weight: 600; color: var(--text-primary);
45
+ margin: 0; line-height: 1.2;
46
+ }
47
+ .panel-frame-status { display: inline-flex; align-items: center; }
48
+ .panel-frame-subtitle { font-size: 11px; color: var(--text-tertiary); margin-top: 2px; }
49
+ .panel-frame-actions { display: flex; align-items: center; gap: 6px; flex-shrink: 0; }
50
+ .panel-frame-toolbar {
51
+ display: flex; align-items: center; gap: 8px;
52
+ padding: 8px 16px;
53
+ border-bottom: 1px solid var(--border-default);
54
+ background: var(--bg-1);
55
+ flex-shrink: 0;
56
+ }
57
+ .panel-frame-body {
58
+ flex: 1;
59
+ min-height: 0;
60
+ overflow: auto;
61
+ }
62
+
63
+ /* Sections — titled content groups inside a panel */
64
+ .panel-section { margin-bottom: 16px; }
65
+ .panel-section:last-child { margin-bottom: 0; }
66
+ .panel-section-header {
67
+ display: flex; align-items: center; justify-content: space-between; gap: 8px;
68
+ margin-bottom: 8px;
69
+ }
70
+ .panel-section-title-wrap { display: flex; align-items: center; gap: 8px; min-width: 0; }
71
+ .panel-section-icon {
72
+ display: inline-flex; align-items: center; justify-content: center;
73
+ color: var(--text-tertiary); flex-shrink: 0;
74
+ }
75
+ .panel-section-icon svg { width: 12px; height: 12px; }
76
+ .panel-section-title {
77
+ font-size: 10.5px; font-weight: 600; letter-spacing: 0.08em;
78
+ text-transform: uppercase; color: var(--text-tertiary);
79
+ margin: 0; line-height: 1.2;
80
+ }
81
+ .panel-section-count {
82
+ display: inline-flex; align-items: center; justify-content: center;
83
+ min-width: 18px; height: 16px; padding: 0 5px; border-radius: 8px;
84
+ background: var(--bg-3);
85
+ color: var(--text-secondary);
86
+ font-size: 10px; font-weight: 600;
87
+ }
88
+ .panel-section-action { display: flex; align-items: center; gap: 6px; }
89
+ .panel-section-desc { font-size: 11.5px; color: var(--text-tertiary); margin: 0 0 8px 0; }
90
+ .panel-section-body.padded { padding: 0; }
91
+
92
+ /* Cards — labelled surfaces with semantic tones */
93
+ .panel-card {
94
+ background: var(--bg-2);
95
+ border: 1px solid var(--border-default);
96
+ border-left: 3px solid var(--border-default);
97
+ border-radius: 8px;
98
+ padding: 12px 14px;
99
+ transition: background 120ms var(--ease), border-color 120ms var(--ease);
100
+ }
101
+ .panel-card.dense { padding: 8px 10px; }
102
+ .panel-card + .panel-card { margin-top: 8px; }
103
+ .panel-card-header {
104
+ display: flex; align-items: flex-start; justify-content: space-between;
105
+ gap: 10px; margin-bottom: 8px;
106
+ }
107
+ .panel-card-heading { display: flex; align-items: flex-start; gap: 10px; min-width: 0; }
108
+ .panel-card-icon {
109
+ width: 22px; height: 22px;
110
+ display: inline-flex; align-items: center; justify-content: center;
111
+ border-radius: 6px;
112
+ background: var(--bg-3);
113
+ color: var(--text-secondary);
114
+ flex-shrink: 0;
115
+ }
116
+ .panel-card-icon svg { width: 12px; height: 12px; }
117
+ .panel-card-title-col { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
118
+ .panel-card-eyebrow {
119
+ font-size: 9.5px; font-weight: 600; letter-spacing: 0.1em;
120
+ text-transform: uppercase; color: var(--text-tertiary);
121
+ }
122
+ .panel-card-title {
123
+ font-size: 12.5px; font-weight: 600; color: var(--text-primary);
124
+ line-height: 1.3;
125
+ }
126
+ .panel-card-subtitle { font-size: 11px; color: var(--text-tertiary); }
127
+ .panel-card-actions { display: flex; align-items: center; gap: 6px; flex-shrink: 0; }
128
+ .panel-card-body { font-size: 12px; color: var(--text-secondary); }
129
+
130
+ /* Card tone variants */
131
+ .panel-card.tone-neutral { border-left-color: var(--border-strong); }
132
+ .panel-card.tone-accent {
133
+ border-left-color: var(--accent);
134
+ background: linear-gradient(to right, var(--accent-dim), var(--bg-2) 90px);
135
+ }
136
+ .panel-card.tone-info {
137
+ border-left-color: var(--status-info);
138
+ background: linear-gradient(to right, var(--status-info-bg), var(--bg-2) 90px);
139
+ }
140
+ .panel-card.tone-success {
141
+ border-left-color: var(--status-success);
142
+ background: linear-gradient(to right, var(--status-success-bg), var(--bg-2) 90px);
143
+ }
144
+ .panel-card.tone-warning {
145
+ border-left-color: var(--status-warning);
146
+ background: linear-gradient(to right, var(--status-warning-bg), var(--bg-2) 90px);
147
+ }
148
+ .panel-card.tone-error {
149
+ border-left-color: var(--status-error);
150
+ background: linear-gradient(to right, var(--status-error-bg), var(--bg-2) 90px);
151
+ }
152
+
153
+ /* Status pills — small pill badges */
154
+ .status-pill {
155
+ display: inline-flex; align-items: center; gap: 4px;
156
+ padding: 2px 8px; height: 20px;
157
+ border-radius: 10px;
158
+ font-size: 10.5px; font-weight: 600; letter-spacing: 0.02em;
159
+ background: var(--bg-3);
160
+ color: var(--text-secondary);
161
+ border: 1px solid var(--border-default);
162
+ white-space: nowrap;
163
+ line-height: 1;
164
+ }
165
+ .status-pill-icon { display: inline-flex; align-items: center; }
166
+ .status-pill-icon svg { width: 10px; height: 10px; }
167
+ .status-pill.tone-neutral { background: var(--bg-3); color: var(--text-secondary); border-color: var(--border-default); }
168
+ .status-pill.tone-accent { background: var(--accent-dim); color: var(--accent); border-color: var(--status-info-border); }
169
+ .status-pill.tone-info { background: var(--status-info-bg); color: var(--status-info); border-color: var(--status-info-border); }
170
+ .status-pill.tone-success { background: var(--status-success-bg); color: var(--status-success); border-color: var(--status-success-border); }
171
+ .status-pill.tone-warning { background: var(--status-warning-bg); color: var(--status-warning); border-color: var(--status-warning-border); }
172
+ .status-pill.tone-error { background: var(--status-error-bg); color: var(--status-error); border-color: var(--status-error-border); }
173
+
174
+ /* Key/Value grid — responsive 2-column label/value layout */
175
+ .panel-kv-grid {
176
+ display: grid;
177
+ gap: 10px 16px;
178
+ margin: 0;
179
+ }
180
+ .panel-kv-row {
181
+ display: flex;
182
+ flex-direction: column;
183
+ gap: 2px;
184
+ padding: 8px 10px;
185
+ background: var(--bg-2);
186
+ border: 1px solid var(--border-default);
187
+ border-radius: 6px;
188
+ }
189
+ .panel-kv-label {
190
+ font-size: 10px; font-weight: 600; letter-spacing: 0.08em;
191
+ text-transform: uppercase; color: var(--text-tertiary);
192
+ margin: 0;
193
+ }
194
+ .panel-kv-value {
195
+ font-size: 12px; color: var(--text-primary); margin: 0;
196
+ font-feature-settings: "tnum" 1;
197
+ word-break: break-word;
198
+ }
199
+
200
+ /* Panel toolbar — horizontal bar for search / filter controls */
201
+ .panel-toolbar {
202
+ display: flex; align-items: center; justify-content: space-between;
203
+ gap: 10px;
204
+ padding: 8px 10px;
205
+ background: var(--bg-2);
206
+ border: 1px solid var(--border-default);
207
+ border-radius: 8px;
208
+ margin-bottom: 12px;
209
+ }
210
+ .panel-toolbar-left, .panel-toolbar-center, .panel-toolbar-right {
211
+ display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
212
+ }
213
+ .panel-toolbar-left { flex: 1; min-width: 0; }
214
+ .panel-toolbar-center { flex: 2; justify-content: center; }
215
+ .panel-toolbar-right { justify-content: flex-end; }
216
+
217
+ /* Shared panel-table style — sticky header, zebra, hover */
218
+ .panel-table {
219
+ width: 100%;
220
+ border-collapse: collapse;
221
+ font-size: 12px;
222
+ background: var(--bg-1);
223
+ border: 1px solid var(--border-default);
224
+ border-radius: 8px;
225
+ overflow: hidden;
226
+ }
227
+ .panel-table thead th {
228
+ position: sticky; top: 0;
229
+ background: var(--bg-2);
230
+ color: var(--text-tertiary);
231
+ font-size: 10px; font-weight: 600; letter-spacing: 0.08em;
232
+ text-transform: uppercase;
233
+ padding: 8px 10px;
234
+ text-align: left;
235
+ border-bottom: 1px solid var(--border-default);
236
+ z-index: 1;
237
+ }
238
+ .panel-table tbody tr:nth-child(odd) { background: var(--bg-1); }
239
+ .panel-table tbody tr:nth-child(even) { background: var(--bg-2); }
240
+ .panel-table tbody tr:hover { background: var(--bg-3); }
241
+ .panel-table td {
242
+ padding: 6px 10px;
243
+ border-bottom: 1px solid var(--border-subtle);
244
+ color: var(--text-primary);
245
+ vertical-align: top;
246
+ }
247
+ .panel-table tbody tr:last-child td { border-bottom: none; }
248
+
249
+ /* Panel form primitives */
250
+ .panel-form-grid {
251
+ display: grid;
252
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
253
+ gap: 10px 12px;
254
+ }
255
+ .panel-form-row {
256
+ display: flex;
257
+ flex-direction: column;
258
+ gap: 4px;
259
+ min-width: 0;
260
+ }
261
+ .panel-form-label {
262
+ font-size: 10px;
263
+ font-weight: 600;
264
+ letter-spacing: 0.08em;
265
+ text-transform: uppercase;
266
+ color: var(--text-tertiary);
267
+ }
268
+ .panel-form-hint {
269
+ font-size: 10.5px;
270
+ color: var(--text-tertiary);
271
+ line-height: 1.4;
272
+ }
273
+ .panel-input,
274
+ .panel-select,
275
+ .panel-textarea {
276
+ width: 100%;
277
+ padding: 7px 10px;
278
+ background: var(--bg-1);
279
+ border: 1px solid var(--border-default);
280
+ border-radius: 6px;
281
+ font-size: 12px;
282
+ font-family: var(--font-mono, ui-monospace, "SF Mono", Menlo, monospace);
283
+ color: var(--text-primary);
284
+ outline: none;
285
+ transition: border-color 120ms var(--ease, ease), background 120ms var(--ease, ease);
286
+ }
287
+ .panel-input::placeholder,
288
+ .panel-textarea::placeholder {
289
+ color: var(--text-tertiary);
290
+ opacity: 0.8;
291
+ }
292
+ .panel-input:focus,
293
+ .panel-select:focus,
294
+ .panel-textarea:focus {
295
+ border-color: var(--accent);
296
+ background: var(--bg-0);
297
+ box-shadow: 0 0 0 3px var(--accent-dim);
298
+ }
299
+ .panel-input:disabled,
300
+ .panel-select:disabled,
301
+ .panel-textarea:disabled {
302
+ opacity: 0.55;
303
+ cursor: not-allowed;
304
+ }
305
+ .panel-textarea {
306
+ font-family: inherit;
307
+ line-height: 1.45;
308
+ resize: vertical;
309
+ min-height: 64px;
310
+ }
311
+ .panel-select {
312
+ appearance: none;
313
+ -webkit-appearance: none;
314
+ padding-right: 28px;
315
+ cursor: pointer;
316
+ background-image: linear-gradient(45deg, transparent 50%, currentColor 50%),
317
+ linear-gradient(135deg, currentColor 50%, transparent 50%);
318
+ background-position: calc(100% - 14px) 50%, calc(100% - 10px) 50%;
319
+ background-size: 4px 4px, 4px 4px;
320
+ background-repeat: no-repeat;
321
+ color: var(--text-primary);
322
+ position: relative;
323
+ }
324
+ .panel-select option { color: var(--text-primary); background: var(--bg-1); }
325
+ .panel-select:focus { background-color: var(--bg-0); }
326
+
327
+ .panel-btn {
328
+ display: inline-flex;
329
+ align-items: center;
330
+ justify-content: center;
331
+ gap: 6px;
332
+ padding: 7px 12px;
333
+ border-radius: 6px;
334
+ font-size: 11.5px;
335
+ font-weight: 500;
336
+ cursor: pointer;
337
+ border: 1px solid var(--border-default);
338
+ background: var(--bg-1);
339
+ color: var(--text-secondary);
340
+ transition: background 120ms var(--ease, ease), color 120ms var(--ease, ease), border-color 120ms var(--ease, ease);
341
+ white-space: nowrap;
342
+ }
343
+ .panel-btn:hover:not(:disabled) { background: var(--bg-3); color: var(--text-primary); border-color: var(--border-strong); }
344
+ .panel-btn:disabled { opacity: 0.45; cursor: not-allowed; }
345
+ .panel-btn.primary {
346
+ background: var(--accent);
347
+ border-color: var(--accent);
348
+ color: var(--accent-fg);
349
+ }
350
+ .panel-btn.primary:hover:not(:disabled) {
351
+ background: var(--accent-hover, var(--accent));
352
+ border-color: var(--accent-hover, var(--accent));
353
+ color: var(--accent-fg);
354
+ filter: none;
355
+ }
356
+ .panel-btn.danger {
357
+ color: var(--status-error);
358
+ border-color: var(--status-error-border);
359
+ }
360
+ .panel-btn.danger:hover:not(:disabled) {
361
+ background: var(--status-error-bg);
362
+ color: var(--status-error);
363
+ border-color: var(--status-error);
364
+ }
365
+ .panel-btn-row {
366
+ display: flex;
367
+ gap: 6px;
368
+ flex-wrap: wrap;
369
+ align-items: center;
370
+ }
371
+
372
+ /* Chip list */
373
+ .panel-chip-list {
374
+ display: flex;
375
+ flex-wrap: wrap;
376
+ gap: 5px;
377
+ padding: 6px 0 2px;
378
+ }
379
+ .panel-chip {
380
+ display: inline-flex;
381
+ align-items: center;
382
+ padding: 3px 8px;
383
+ border: 1px solid var(--border-default);
384
+ background: var(--bg-1);
385
+ color: var(--text-secondary);
386
+ border-radius: 10px;
387
+ font-size: 10.5px;
388
+ font-family: var(--font-mono, ui-monospace, "SF Mono", Menlo, monospace);
389
+ white-space: nowrap;
390
+ }
391
+ .panel-chip.empty {
392
+ border-style: dashed;
393
+ color: var(--text-tertiary);
394
+ font-style: italic;
395
+ font-family: inherit;
396
+ }
397
+
398
+ /* Summary card */
399
+ .panel-summary-card {
400
+ padding: 10px 12px;
401
+ border: 1px solid var(--border-default);
402
+ background: var(--bg-1);
403
+ border-radius: 8px;
404
+ display: flex;
405
+ flex-direction: column;
406
+ gap: 4px;
407
+ }
408
+ .panel-summary-card .label {
409
+ font-size: 10px;
410
+ font-weight: 600;
411
+ letter-spacing: 0.08em;
412
+ text-transform: uppercase;
413
+ color: var(--text-tertiary);
414
+ }
415
+ .panel-summary-card .value {
416
+ font-size: 20px;
417
+ font-weight: 600;
418
+ color: var(--text-primary);
419
+ line-height: 1;
420
+ font-family: var(--font-mono, ui-monospace, "SF Mono", Menlo, monospace);
421
+ }
422
+
423
+ /* Empty state */
424
+ .panel-empty {
425
+ display: flex;
426
+ flex-direction: column;
427
+ align-items: center;
428
+ justify-content: center;
429
+ gap: 8px;
430
+ padding: 32px 16px;
431
+ text-align: center;
432
+ color: var(--text-tertiary);
433
+ }
434
+ .panel-empty-icon {
435
+ width: 40px; height: 40px;
436
+ display: inline-flex; align-items: center; justify-content: center;
437
+ border-radius: 10px;
438
+ background: var(--bg-2);
439
+ color: var(--text-tertiary);
440
+ }
441
+ .panel-empty-title {
442
+ font-size: 12.5px; font-weight: 600; color: var(--text-secondary);
443
+ margin: 0;
444
+ }
445
+ .panel-empty-desc {
446
+ font-size: 11.5px; color: var(--text-tertiary);
447
+ margin: 0; max-width: 280px; line-height: 1.5;
448
+ }