@neuravision/construct 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +227 -0
  3. package/components/README.md +566 -0
  4. package/components/_keyframes.css +23 -0
  5. package/components/_shared.css +120 -0
  6. package/components/accordion.css +124 -0
  7. package/components/alert.css +67 -0
  8. package/components/avatar.css +127 -0
  9. package/components/badge.css +67 -0
  10. package/components/banner.css +247 -0
  11. package/components/breadcrumbs.css +152 -0
  12. package/components/button.css +145 -0
  13. package/components/card.css +76 -0
  14. package/components/checkbox.css +120 -0
  15. package/components/chip.css +361 -0
  16. package/components/combobox.css +385 -0
  17. package/components/components.css +2 -0
  18. package/components/data-table.css +93 -0
  19. package/components/datepicker.css +268 -0
  20. package/components/divider.css +73 -0
  21. package/components/drawer.css +167 -0
  22. package/components/dropdown.css +401 -0
  23. package/components/empty-state.css +97 -0
  24. package/components/field.css +42 -0
  25. package/components/file-upload.css +111 -0
  26. package/components/icon.css +31 -0
  27. package/components/index.css +49 -0
  28. package/components/input.css +64 -0
  29. package/components/list.css +474 -0
  30. package/components/modal.css +164 -0
  31. package/components/navbar.css +587 -0
  32. package/components/pagination.css +131 -0
  33. package/components/popover.css +231 -0
  34. package/components/progress-bar.css +56 -0
  35. package/components/select-menu.css +267 -0
  36. package/components/select.css +30 -0
  37. package/components/sidebar.css +183 -0
  38. package/components/skeleton.css +38 -0
  39. package/components/skip-link.css +38 -0
  40. package/components/slider.css +305 -0
  41. package/components/spinner.css +72 -0
  42. package/components/switch.css +82 -0
  43. package/components/table.css +139 -0
  44. package/components/tabs.css +147 -0
  45. package/components/textarea.css +16 -0
  46. package/components/toast.css +71 -0
  47. package/components/toggle-group.css +196 -0
  48. package/components/toolbar.css +222 -0
  49. package/components/tooltip.css +124 -0
  50. package/docs/guidelines.md +141 -0
  51. package/foundations.css +299 -0
  52. package/package.json +66 -0
  53. package/tokens/README.md +179 -0
  54. package/tokens/tokens.css +434 -0
  55. package/tokens/tokens.js +1188 -0
  56. package/tokens/tokens.json +810 -0
  57. package/tokens/tokens.ts +1188 -0
@@ -0,0 +1,385 @@
1
+ /* ─── Combobox ───────────────────────────────────────────────────── */
2
+
3
+ .ct-combobox {
4
+ --ct-combobox-height: var(--control-height-md);
5
+ --ct-combobox-font-size: var(--font-size-md);
6
+ --ct-combobox-line-height: var(--line-height-md);
7
+ --ct-combobox-padding-x: var(--space-5);
8
+ --ct-combobox-listbox-max-height: 240px;
9
+ --ct-combobox-option-padding-x: var(--space-4);
10
+ --ct-combobox-option-padding-y: var(--space-3);
11
+
12
+ position: relative;
13
+ display: inline-flex;
14
+ flex-direction: column;
15
+ width: 100%;
16
+ }
17
+
18
+ /* ── Input wrapper ─────────────────────────────────────────────── */
19
+
20
+ .ct-combobox__input-wrap {
21
+ position: relative;
22
+ display: flex;
23
+ align-items: center;
24
+ }
25
+
26
+ .ct-combobox__input {
27
+ width: 100%;
28
+ height: var(--ct-combobox-height);
29
+ padding: 0 var(--ct-combobox-padding-x);
30
+ padding-inline-end: calc(var(--ct-combobox-padding-x) + var(--icon-md) + var(--space-2));
31
+ border: var(--border-thin) solid var(--ct-control-border);
32
+ border-radius: var(--ct-control-radius);
33
+ background: var(--ct-control-bg);
34
+ color: var(--ct-control-text);
35
+ font-size: var(--ct-combobox-font-size);
36
+ line-height: var(--ct-combobox-line-height);
37
+ transition: var(--ct-control-transition);
38
+ }
39
+
40
+ .ct-combobox__input::placeholder {
41
+ color: var(--ct-control-placeholder);
42
+ }
43
+
44
+ @media (hover: hover) {
45
+ .ct-combobox__input:hover {
46
+ border-color: var(--ct-control-border-hover);
47
+ }
48
+ }
49
+
50
+ .ct-combobox__input:focus-visible {
51
+ border-color: var(--ct-control-border-focus);
52
+ outline: 2px solid var(--color-focus-ring);
53
+ outline-offset: -1px;
54
+ }
55
+
56
+ .ct-combobox__input:disabled,
57
+ .ct-combobox__input[aria-disabled='true'] {
58
+ background: var(--ct-control-bg-disabled);
59
+ border-color: var(--color-border-subtle);
60
+ color: var(--color-text-muted);
61
+ pointer-events: none;
62
+ }
63
+
64
+ .ct-combobox__input[aria-invalid='true'] {
65
+ border-color: var(--color-state-danger);
66
+ }
67
+
68
+ .ct-combobox__input[aria-invalid='true']:focus-visible {
69
+ outline-color: var(--color-state-danger);
70
+ }
71
+
72
+ /* ── Trigger button ──────────────────────────────────────────── */
73
+
74
+ .ct-combobox__trigger {
75
+ appearance: none;
76
+ position: absolute;
77
+ inset-inline-end: var(--space-2);
78
+ display: inline-flex;
79
+ align-items: center;
80
+ justify-content: center;
81
+ width: var(--icon-lg);
82
+ height: var(--icon-lg);
83
+ padding: 0;
84
+ border: none;
85
+ border-radius: var(--radius-sm);
86
+ background: transparent;
87
+ color: var(--color-text-muted);
88
+ cursor: pointer;
89
+ transition: color var(--duration-fast) var(--easing-standard),
90
+ background var(--duration-fast) var(--easing-standard);
91
+ }
92
+
93
+ @media (hover: hover) {
94
+ .ct-combobox__trigger:hover {
95
+ color: var(--color-text-secondary);
96
+ background: var(--color-bg-muted);
97
+ }
98
+ }
99
+
100
+ .ct-combobox__trigger:focus-visible {
101
+ outline: 2px solid var(--color-focus-ring);
102
+ outline-offset: 2px;
103
+ }
104
+
105
+ .ct-combobox__trigger-icon {
106
+ width: var(--icon-sm);
107
+ height: var(--icon-sm);
108
+ transition: transform var(--duration-fast) var(--easing-standard);
109
+ }
110
+
111
+ .ct-combobox[data-state='open'] .ct-combobox__trigger-icon {
112
+ transform: rotate(180deg);
113
+ }
114
+
115
+ /* ── Listbox ─────────────────────────────────────────────────── */
116
+
117
+ .ct-combobox__listbox {
118
+ position: absolute;
119
+ inset-inline-start: 0;
120
+ inset-inline-end: 0;
121
+ inset-block-start: calc(100% + var(--space-2));
122
+ z-index: var(--z-dropdown);
123
+ max-height: var(--ct-combobox-listbox-max-height);
124
+ overflow-y: auto;
125
+ padding: var(--space-2);
126
+ border-radius: var(--radius-md);
127
+ border: var(--border-thin) solid var(--color-border-subtle);
128
+ background: var(--color-bg-elevated);
129
+ box-shadow: var(--shadow-dropdown);
130
+ opacity: 0;
131
+ visibility: hidden;
132
+ transform: translateY(4px);
133
+ transition: opacity var(--duration-fast) var(--easing-standard),
134
+ transform var(--duration-fast) var(--easing-standard),
135
+ visibility 0s linear var(--duration-fast);
136
+ }
137
+
138
+ .ct-combobox[data-state='open'] .ct-combobox__listbox {
139
+ opacity: 1;
140
+ visibility: visible;
141
+ transform: translateY(0);
142
+ transition: opacity var(--duration-fast) var(--easing-standard),
143
+ transform var(--duration-fast) var(--easing-standard),
144
+ visibility 0s linear 0s;
145
+ }
146
+
147
+ /* Flip above when data-side="top" */
148
+
149
+ .ct-combobox[data-side='top'] .ct-combobox__listbox {
150
+ inset-block-start: auto;
151
+ inset-block-end: calc(100% + var(--space-2));
152
+ transform: translateY(-4px);
153
+ }
154
+
155
+ .ct-combobox[data-side='top'][data-state='open'] .ct-combobox__listbox {
156
+ transform: translateY(0);
157
+ }
158
+
159
+ /* ── Option ──────────────────────────────────────────────────── */
160
+
161
+ .ct-combobox__option {
162
+ display: flex;
163
+ align-items: center;
164
+ gap: var(--space-3);
165
+ padding: var(--ct-combobox-option-padding-y) var(--ct-combobox-option-padding-x);
166
+ border-radius: var(--radius-sm);
167
+ color: var(--color-text-primary);
168
+ font-size: var(--ct-combobox-font-size);
169
+ line-height: var(--ct-combobox-line-height);
170
+ cursor: pointer;
171
+ transition: background var(--duration-fast) var(--easing-standard),
172
+ color var(--duration-fast) var(--easing-standard);
173
+ }
174
+
175
+ @media (hover: hover) {
176
+ .ct-combobox__option:hover {
177
+ background: var(--color-bg-muted);
178
+ }
179
+ }
180
+
181
+ .ct-combobox__option[data-highlighted] {
182
+ background: var(--color-bg-muted);
183
+ outline: var(--border-medium) solid var(--color-brand-primary);
184
+ outline-offset: -2px;
185
+ }
186
+
187
+ .ct-combobox__option[aria-selected='true'] {
188
+ color: var(--color-brand-primary);
189
+ font-weight: var(--font-weight-medium);
190
+ }
191
+
192
+ .ct-combobox__option[aria-selected='true'] .ct-combobox__option-check {
193
+ opacity: 1;
194
+ }
195
+
196
+ .ct-combobox__option[aria-disabled='true'] {
197
+ opacity: var(--opacity-disabled);
198
+ pointer-events: none;
199
+ cursor: not-allowed;
200
+ }
201
+
202
+ .ct-combobox__option-check {
203
+ width: var(--icon-sm);
204
+ height: var(--icon-sm);
205
+ flex-shrink: 0;
206
+ opacity: 0;
207
+ color: var(--color-brand-primary);
208
+ display: inline-flex;
209
+ align-items: center;
210
+ justify-content: center;
211
+ }
212
+
213
+ .ct-combobox__option-label {
214
+ flex: 1;
215
+ min-width: 0;
216
+ }
217
+
218
+ .ct-combobox__option-description {
219
+ font-size: var(--font-size-xs);
220
+ color: var(--color-text-muted);
221
+ }
222
+
223
+ /* ── Group ───────────────────────────────────────────────────── */
224
+
225
+ .ct-combobox__group {
226
+ padding: var(--space-1) 0;
227
+ }
228
+
229
+ .ct-combobox__group + .ct-combobox__group {
230
+ border-top: var(--border-thin) solid var(--color-border-subtle);
231
+ }
232
+
233
+ .ct-combobox__group-label {
234
+ padding: var(--space-2) var(--ct-combobox-option-padding-x);
235
+ font-size: var(--font-size-xs);
236
+ font-weight: var(--font-weight-semibold);
237
+ color: var(--color-text-muted);
238
+ text-transform: uppercase;
239
+ letter-spacing: var(--letter-spacing-wide);
240
+ }
241
+
242
+ /* ── Empty state ─────────────────────────────────────────────── */
243
+
244
+ .ct-combobox__empty {
245
+ padding: var(--space-6) var(--ct-combobox-option-padding-x);
246
+ text-align: center;
247
+ color: var(--color-text-muted);
248
+ font-size: var(--font-size-sm);
249
+ }
250
+
251
+ /* ── Loading state ───────────────────────────────────────────── */
252
+
253
+ .ct-combobox__loading {
254
+ display: flex;
255
+ align-items: center;
256
+ justify-content: center;
257
+ gap: var(--space-3);
258
+ padding: var(--space-6) var(--ct-combobox-option-padding-x);
259
+ color: var(--color-text-muted);
260
+ font-size: var(--font-size-sm);
261
+ }
262
+
263
+ /* ── Live region for screen reader announcements ─────────────── */
264
+
265
+ .ct-combobox__status {
266
+ position: absolute;
267
+ width: 1px;
268
+ height: 1px;
269
+ padding: 0;
270
+ margin: -1px;
271
+ overflow: hidden;
272
+ clip: rect(0 0 0 0);
273
+ border: 0;
274
+ }
275
+
276
+ /* ── Sizes ───────────────────────────────────────────────────── */
277
+
278
+ .ct-combobox--sm {
279
+ --ct-combobox-height: var(--control-height-sm);
280
+ --ct-combobox-font-size: var(--font-size-sm);
281
+ --ct-combobox-line-height: var(--line-height-sm);
282
+ --ct-combobox-padding-x: var(--space-4);
283
+ --ct-combobox-option-padding-y: var(--space-2);
284
+ }
285
+
286
+ .ct-combobox--lg {
287
+ --ct-combobox-height: var(--control-height-lg);
288
+ --ct-combobox-font-size: var(--font-size-lg);
289
+ --ct-combobox-line-height: var(--line-height-lg);
290
+ --ct-combobox-padding-x: var(--space-6);
291
+ --ct-combobox-option-padding-y: var(--space-4);
292
+ }
293
+
294
+ /* ── Multi-select variant ────────────────────────────────────── */
295
+
296
+ .ct-combobox--multi .ct-combobox__input-wrap {
297
+ flex-wrap: wrap;
298
+ gap: var(--space-2);
299
+ padding: var(--space-2) var(--ct-combobox-padding-x);
300
+ padding-inline-end: calc(var(--ct-combobox-padding-x) + var(--icon-md) + var(--space-2));
301
+ min-height: var(--ct-combobox-height);
302
+ border: var(--border-thin) solid var(--ct-control-border);
303
+ border-radius: var(--ct-control-radius);
304
+ background: var(--ct-control-bg);
305
+ transition: var(--ct-control-transition);
306
+ }
307
+
308
+ @media (hover: hover) {
309
+ .ct-combobox--multi .ct-combobox__input-wrap:hover {
310
+ border-color: var(--ct-control-border-hover);
311
+ }
312
+ }
313
+
314
+ .ct-combobox--multi .ct-combobox__input-wrap:focus-within {
315
+ border-color: var(--ct-control-border-focus);
316
+ outline: 2px solid var(--color-focus-ring);
317
+ outline-offset: -1px;
318
+ }
319
+
320
+ .ct-combobox--multi .ct-combobox__input-wrap[aria-invalid='true'] {
321
+ border-color: var(--color-state-danger);
322
+ }
323
+
324
+ .ct-combobox--multi .ct-combobox__input {
325
+ border: none;
326
+ padding: 0;
327
+ padding-inline-end: 0;
328
+ height: auto;
329
+ min-height: calc(var(--ct-combobox-height) - var(--space-4));
330
+ flex: 1;
331
+ min-width: 80px;
332
+ background: transparent;
333
+ outline: none;
334
+ }
335
+
336
+ .ct-combobox--multi .ct-combobox__input:focus-visible {
337
+ outline: none;
338
+ }
339
+
340
+ /* ── Inline variant (command-palette style) ──────────────────── */
341
+
342
+ .ct-combobox--inline .ct-combobox__listbox {
343
+ position: static;
344
+ opacity: 1;
345
+ visibility: visible;
346
+ transform: none;
347
+ transition: none;
348
+ border-top: var(--border-thin) solid var(--color-border-subtle);
349
+ border-radius: 0 0 var(--radius-md) var(--radius-md);
350
+ box-shadow: none;
351
+ border-left: none;
352
+ border-right: none;
353
+ border-bottom: none;
354
+ }
355
+
356
+ .ct-combobox--inline .ct-combobox__input {
357
+ border-radius: var(--radius-md) var(--radius-md) 0 0;
358
+ }
359
+
360
+ .ct-combobox--inline {
361
+ border-radius: var(--radius-md);
362
+ border: var(--border-thin) solid var(--color-border-subtle);
363
+ background: var(--color-bg-elevated);
364
+ box-shadow: var(--shadow-dropdown);
365
+ overflow: hidden;
366
+ }
367
+
368
+ .ct-combobox--inline .ct-combobox__input {
369
+ border: none;
370
+ border-radius: 0;
371
+ }
372
+
373
+ .ct-combobox--inline .ct-combobox__input:focus-visible {
374
+ outline: none;
375
+ border-color: transparent;
376
+ }
377
+
378
+ /* ── Reduced motion ──────────────────────────────────────────── */
379
+
380
+ @media (prefers-reduced-motion: reduce) {
381
+ .ct-combobox__listbox,
382
+ .ct-combobox__trigger-icon {
383
+ transition: none;
384
+ }
385
+ }
@@ -0,0 +1,2 @@
1
+ /* Redirect — use components/index.css or individual component imports */
2
+ @import './index.css';
@@ -0,0 +1,93 @@
1
+ .ct-data-table {
2
+ border: var(--border-thin) solid var(--color-border-subtle);
3
+ border-radius: var(--radius-lg);
4
+ background: var(--color-bg-elevated);
5
+ overflow: hidden;
6
+ display: grid;
7
+ }
8
+
9
+ .ct-data-table__header,
10
+ .ct-data-table__toolbar,
11
+ .ct-data-table__footer {
12
+ padding: var(--space-4) var(--space-6);
13
+ }
14
+
15
+ .ct-data-table__header {
16
+ display: flex;
17
+ flex-wrap: wrap;
18
+ align-items: center;
19
+ justify-content: space-between;
20
+ gap: var(--space-4);
21
+ border-bottom: var(--border-thin) solid var(--color-border-subtle);
22
+ }
23
+
24
+ .ct-data-table__title {
25
+ display: grid;
26
+ gap: var(--space-1);
27
+ }
28
+
29
+ .ct-data-table__title h3 {
30
+ margin: 0;
31
+ }
32
+
33
+ .ct-data-table__meta {
34
+ font-size: var(--font-size-sm);
35
+ color: var(--color-text-muted);
36
+ }
37
+
38
+ .ct-data-table__toolbar {
39
+ display: flex;
40
+ flex-wrap: wrap;
41
+ align-items: center;
42
+ justify-content: space-between;
43
+ gap: var(--space-4);
44
+ background: var(--color-bg-surface);
45
+ border-bottom: var(--border-thin) solid var(--color-border-subtle);
46
+ }
47
+
48
+ .ct-data-table__filters,
49
+ .ct-data-table__actions {
50
+ display: flex;
51
+ flex-wrap: wrap;
52
+ align-items: center;
53
+ gap: var(--space-3);
54
+ }
55
+
56
+ .ct-data-table__search {
57
+ min-width: 240px;
58
+ }
59
+
60
+ .ct-data-table__table {
61
+ overflow-x: auto;
62
+ -webkit-overflow-scrolling: touch;
63
+ }
64
+
65
+ .ct-data-table__table .ct-table {
66
+ min-width: 720px;
67
+ }
68
+
69
+ .ct-data-table__footer {
70
+ display: flex;
71
+ flex-wrap: wrap;
72
+ align-items: center;
73
+ justify-content: space-between;
74
+ gap: var(--space-4);
75
+ background: var(--color-bg-surface);
76
+ border-top: var(--border-thin) solid var(--color-border-subtle);
77
+ color: var(--color-text-muted);
78
+ font-size: var(--font-size-sm);
79
+ }
80
+
81
+ .ct-data-table__footer-actions {
82
+ display: flex;
83
+ flex-wrap: wrap;
84
+ align-items: center;
85
+ gap: var(--space-4);
86
+ }
87
+
88
+ .ct-data-table__page-size {
89
+ display: inline-flex;
90
+ align-items: center;
91
+ gap: var(--space-2);
92
+ }
93
+