@mirror-physics/fractal-ui 0.2.0-next.9 → 0.2.0-next.90

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/dist/index.css CHANGED
@@ -1,3 +1,54 @@
1
+ /* src/styles/control.css */
2
+ [data-control-size=sm] {
3
+ --control-font-size: var(--control-sm-font-size);
4
+ --control-line-height: var(--control-sm-line-height);
5
+ --control-padding-block: var(--control-sm-padding-block);
6
+ --control-padding-inline: var(--control-sm-padding-inline);
7
+ --control-icon-size: var(--control-sm-icon-size);
8
+ }
9
+ [data-control-size=md] {
10
+ --control-font-size: var(--control-md-font-size);
11
+ --control-line-height: var(--control-md-line-height);
12
+ --control-padding-block: var(--control-md-padding-block);
13
+ --control-padding-inline: var(--control-md-padding-inline);
14
+ --control-icon-size: var(--control-md-icon-size);
15
+ }
16
+ [data-control-size=lg] {
17
+ --control-font-size: var(--control-lg-font-size);
18
+ --control-line-height: var(--control-lg-line-height);
19
+ --control-padding-block: var(--control-lg-padding-block);
20
+ --control-padding-inline: var(--control-lg-padding-inline);
21
+ --control-icon-size: var(--control-lg-icon-size);
22
+ }
23
+ [data-control-size=xl] {
24
+ --control-font-size: var(--control-xl-font-size);
25
+ --control-line-height: var(--control-xl-line-height);
26
+ --control-padding-block: var(--control-xl-padding-block);
27
+ --control-padding-inline: var(--control-xl-padding-inline);
28
+ --control-icon-size: var(--control-xl-icon-size);
29
+ }
30
+ [data-control-size] {
31
+ --control-min-block-size: calc(var(--control-line-height) + 2 * var(--control-padding-block) + 2 * var(--control-border-width));
32
+ }
33
+ .fractal-control {
34
+ box-sizing: border-box;
35
+ height: auto;
36
+ min-block-size: var(--control-min-block-size);
37
+ margin: 0;
38
+ padding: var(--control-padding-block) var(--control-padding-inline);
39
+ font-family: var(--font-sans);
40
+ font-size: var(--control-font-size);
41
+ font-weight: 400;
42
+ line-height: var(--control-line-height);
43
+ letter-spacing: normal;
44
+ }
45
+ .fractal-field {
46
+ display: grid;
47
+ align-content: start;
48
+ gap: var(--control-label-gap);
49
+ min-inline-size: 0;
50
+ }
51
+
1
52
  /* src/components/Button/Button.css */
2
53
  .fractal-button {
3
54
  display: inline-flex;
@@ -6,7 +57,6 @@
6
57
  white-space: nowrap;
7
58
  font-weight: 400;
8
59
  font-family: var(--font-sans);
9
- line-height: 1;
10
60
  text-decoration: none;
11
61
  box-sizing: border-box;
12
62
  transform: scale(1);
@@ -20,7 +70,7 @@
20
70
  }
21
71
  .fractal-button:focus-visible {
22
72
  outline: none;
23
- box-shadow: 0 0 0 2px var(--bg-canvas, #fff), 0 0 0 4px var(--border-focus, var(--blue-500));
73
+ box-shadow: 0 0 0 2px var(--bg-canvas, #fff), 0 0 0 4px var(--border-focus);
24
74
  }
25
75
  .fractal-button:disabled {
26
76
  opacity: 0.5;
@@ -31,6 +81,207 @@
31
81
  transition-duration: 0.01ms;
32
82
  }
33
83
  }
84
+ .fractal-button {
85
+ gap: var(--control-icon-gap);
86
+ }
87
+ .fractal-button svg {
88
+ inline-size: var(--control-icon-size);
89
+ block-size: var(--control-icon-size);
90
+ flex-shrink: 0;
91
+ }
92
+ .fractal-button[data-icon-only] {
93
+ inline-size: var(--control-min-block-size);
94
+ padding-inline: 0;
95
+ }
96
+ .fractal-button--primary:not(:disabled) {
97
+ background-color: var(--button-primary-bg, var(--fg-primary));
98
+ color: var(--button-primary-fg, var(--fg-inverse));
99
+ }
100
+ .fractal-button--primary:not(:disabled):hover {
101
+ background-color: var(--button-primary-hover, var(--fg-secondary));
102
+ }
103
+ .fractal-button--primary:not(:disabled):active {
104
+ background-color: var(--button-primary-active, var(--fg-primary));
105
+ }
106
+ .fractal-button__shortcut {
107
+ display: inline-flex;
108
+ align-items: center;
109
+ gap: 2px;
110
+ padding: 1px 4px;
111
+ border: 1px solid color-mix(in srgb, currentColor 20%, transparent);
112
+ border-radius: var(--radius-sm, 4px);
113
+ background: color-mix(in srgb, currentColor 10%, transparent);
114
+ color: inherit;
115
+ font-family: var(--font-sans);
116
+ font-size: 0.6875rem;
117
+ font-weight: 500;
118
+ line-height: 1.2;
119
+ }
120
+ .fractal-button .fractal-button__shortcut svg {
121
+ inline-size: 12px;
122
+ block-size: 12px;
123
+ }
124
+
125
+ /* src/components/CodeBlock/CodeBlock.css */
126
+ .fractal-code-block {
127
+ position: relative;
128
+ min-width: 0;
129
+ overflow: hidden;
130
+ border: 1px solid var(--border-subtle);
131
+ border-radius: var(--radius-md, 8px);
132
+ background: var(--bg-canvas);
133
+ color: var(--fg-primary);
134
+ font-family: var(--font-sans);
135
+ }
136
+ .fractal-code-block:focus-within {
137
+ border-color: var(--border-focus);
138
+ box-shadow: 0 0 0 1px var(--border-focus);
139
+ }
140
+ .fractal-code-block__toolbar {
141
+ display: flex;
142
+ min-height: 32px;
143
+ align-items: center;
144
+ justify-content: space-between;
145
+ gap: var(--space-3, 12px);
146
+ padding: 4px 6px 4px 12px;
147
+ border-bottom: 1px solid var(--border-subtle);
148
+ background: var(--bg-surface-1);
149
+ }
150
+ .fractal-code-block__identity {
151
+ display: flex;
152
+ min-width: 0;
153
+ align-items: center;
154
+ gap: var(--space-2, 8px);
155
+ }
156
+ .fractal-code-block__label {
157
+ overflow: hidden;
158
+ color: var(--fg-secondary);
159
+ font: 500 0.6875rem/1.4 var(--font-mono);
160
+ text-overflow: ellipsis;
161
+ white-space: nowrap;
162
+ }
163
+ .fractal-code-block__language,
164
+ .fractal-code-block__mode {
165
+ flex: 0 0 auto;
166
+ color: var(--fg-tertiary);
167
+ font-size: 0.6875rem;
168
+ line-height: 1.4;
169
+ }
170
+ .fractal-code-block__language::before {
171
+ margin-right: var(--space-2, 8px);
172
+ color: var(--border-strong);
173
+ content: "\b7";
174
+ }
175
+ .fractal-code-block__mode {
176
+ padding: 1px 6px;
177
+ border-radius: var(--radius-full, 9999px);
178
+ background: var(--accent-surface);
179
+ color: var(--accent-text);
180
+ }
181
+ .fractal-code-block__copy {
182
+ display: inline-flex;
183
+ min-height: 24px;
184
+ flex: 0 0 auto;
185
+ align-items: center;
186
+ gap: 5px;
187
+ padding: 3px 7px;
188
+ border: 0;
189
+ border-radius: var(--radius-sm, 4px);
190
+ background: transparent;
191
+ color: var(--fg-tertiary);
192
+ font: 500 0.6875rem/1 var(--font-sans);
193
+ cursor: pointer;
194
+ }
195
+ .fractal-code-block__copy:hover {
196
+ background: var(--hover-surface);
197
+ color: var(--fg-primary);
198
+ }
199
+ .fractal-code-block__copy:focus-visible {
200
+ outline: 2px solid var(--border-focus);
201
+ outline-offset: 1px;
202
+ }
203
+ .fractal-code-block__copy svg {
204
+ flex: 0 0 auto;
205
+ }
206
+ .fractal-code-block__surface {
207
+ min-width: 0;
208
+ background: var(--bg-canvas);
209
+ }
210
+ .fractal-code-block__surface .cm-editor {
211
+ min-width: 0;
212
+ }
213
+ .fractal-code-block--no-line-numbers .cm-content {
214
+ padding-block: 10px;
215
+ }
216
+ .fractal-code-block__status {
217
+ position: absolute;
218
+ width: 1px;
219
+ height: 1px;
220
+ overflow: hidden;
221
+ clip: rect(0 0 0 0);
222
+ clip-path: inset(50%);
223
+ white-space: nowrap;
224
+ }
225
+ @media (prefers-reduced-motion: reduce) {
226
+ .fractal-code-block,
227
+ .fractal-code-block__copy {
228
+ transition: none;
229
+ }
230
+ }
231
+
232
+ /* src/components/Breadcrumbs/Breadcrumbs.css */
233
+ .fractal-breadcrumbs {
234
+ min-width: 0;
235
+ color: var(--fg-primary);
236
+ font-family: var(--font-sans);
237
+ font-size: 0.875rem;
238
+ line-height: 1.4;
239
+ }
240
+ .fractal-breadcrumbs__list {
241
+ display: flex;
242
+ min-width: 0;
243
+ align-items: center;
244
+ margin: 0;
245
+ padding: 0;
246
+ list-style: none;
247
+ }
248
+ .fractal-breadcrumbs__item {
249
+ display: flex;
250
+ min-width: 0;
251
+ align-items: center;
252
+ gap: var(--space-1);
253
+ }
254
+ .fractal-breadcrumbs__separator {
255
+ display: inline-grid;
256
+ flex: 0 0 auto;
257
+ place-items: center;
258
+ color: var(--fg-tertiary);
259
+ }
260
+ .fractal-breadcrumbs__link,
261
+ .fractal-breadcrumbs__current {
262
+ min-width: 0;
263
+ overflow: hidden;
264
+ text-overflow: ellipsis;
265
+ white-space: nowrap;
266
+ }
267
+ .fractal-breadcrumbs__link {
268
+ color: var(--fg-tertiary);
269
+ font: inherit;
270
+ text-decoration: none;
271
+ transition: color 120ms ease;
272
+ }
273
+ .fractal-breadcrumbs__link:hover {
274
+ color: var(--fg-primary);
275
+ }
276
+ .fractal-breadcrumbs__link:focus-visible {
277
+ border-radius: var(--radius-sm);
278
+ outline: 2px solid var(--border-focus);
279
+ outline-offset: 2px;
280
+ }
281
+ .fractal-breadcrumbs__current {
282
+ color: var(--fg-primary);
283
+ font-weight: 500;
284
+ }
34
285
 
35
286
  /* src/components/Card/Card.css */
36
287
  .fractal-card {
@@ -38,7 +289,7 @@
38
289
  border: 1px solid var(--border-subtle);
39
290
  background-color: var(--bg-surface-1);
40
291
  color: var(--fg-primary);
41
- box-shadow: var(--shadow-xs);
292
+ box-shadow: none;
42
293
  font-family: var(--font-sans);
43
294
  }
44
295
  .fractal-card-header {
@@ -208,7 +459,7 @@
208
459
  }
209
460
  .fractal-prompt-card:focus-visible {
210
461
  outline: none;
211
- box-shadow: 0 0 0 2px var(--bg-canvas, #fff), 0 0 0 4px var(--border-focus, var(--blue-500));
462
+ box-shadow: 0 0 0 2px var(--bg-canvas, #fff), 0 0 0 4px var(--border-focus);
212
463
  }
213
464
  .fractal-prompt-card__icon {
214
465
  width: 40px;
@@ -334,18 +585,14 @@
334
585
 
335
586
  /* src/components/Input/Input.css */
336
587
  .fractal-input {
337
- display: flex;
338
- height: 40px;
588
+ display: block;
589
+ min-width: 0;
339
590
  width: 100%;
340
591
  border-radius: var(--radius-sm, 4px);
341
592
  border: 1px solid var(--border-default);
342
593
  background-color: var(--bg-canvas);
343
- padding: 8px 12px;
344
- font-size: 0.875rem;
345
- font-family: var(--font-sans);
346
- line-height: 1.5;
347
594
  color: var(--fg-primary);
348
- transition: border-color 0.15s ease, box-shadow 0.15s ease;
595
+ transition: border-color var(--duration-fast) var(--ease-out);
349
596
  box-sizing: border-box;
350
597
  }
351
598
  .fractal-input::placeholder {
@@ -354,7 +601,7 @@
354
601
  .fractal-input:focus-visible {
355
602
  outline: none;
356
603
  border-color: var(--border-focus);
357
- box-shadow: 0 0 0 2px var(--accent-surface);
604
+ box-shadow: 0 0 0 3px var(--focus-surface);
358
605
  }
359
606
  .fractal-input:disabled {
360
607
  cursor: not-allowed;
@@ -366,102 +613,625 @@
366
613
  background: transparent;
367
614
  font-size: 0.875rem;
368
615
  height: auto;
616
+ min-block-size: 0;
369
617
  padding: 0;
370
618
  }
371
619
 
372
- /* src/components/Label/Label.css */
373
- .fractal-label {
374
- font-size: 0.875rem;
375
- font-weight: 500;
376
- line-height: 1;
620
+ /* src/styles/floating-field.css */
621
+ .fractal-floating-field {
622
+ position: relative;
623
+ min-width: 0;
624
+ width: 100%;
625
+ --field-label-inset: var(--control-padding-inline);
626
+ }
627
+ .fractal-floating-field__label {
628
+ position: absolute;
629
+ z-index: 2;
630
+ top: 0;
631
+ left: calc(var(--field-label-inset, var(--control-padding-inline)) - 4px);
632
+ max-width: calc(100% - var(--field-label-inset, var(--control-padding-inline)) - var(--control-padding-inline));
633
+ padding-inline: 4px;
634
+ overflow: hidden;
635
+ white-space: nowrap;
636
+ text-overflow: ellipsis;
637
+ font-family: var(--font-sans);
638
+ font-size: var(--control-font-size);
639
+ line-height: var(--control-line-height);
640
+ font-weight: 400;
377
641
  color: var(--fg-primary);
642
+ transform-origin: left center;
643
+ transform: translateY(calc((var(--control-min-block-size) - 100%) / 2));
644
+ transition: transform var(--duration-normal) var(--ease-out), color var(--duration-fast) var(--ease-out);
645
+ cursor: text;
378
646
  }
379
- .fractal-label[data-disabled] {
647
+ .fractal-floating-field:where(:focus-within, [data-filled=true], [data-open=true], [data-always-float=true], :has(input:not(:placeholder-shown)), :has(textarea:not(:placeholder-shown))) > .fractal-floating-field__label {
648
+ transform: translateY(-50%) scale(0.75);
649
+ color: var(--fg-secondary);
650
+ }
651
+ .fractal-floating-field:is(:focus-within, [data-open=true]) > .fractal-floating-field__label {
652
+ color: var(--fg-primary);
653
+ }
654
+ .fractal-floating-field:has(:disabled) > .fractal-floating-field__label {
655
+ color: var(--fg-disabled);
380
656
  cursor: not-allowed;
381
- opacity: 0.7;
382
657
  }
383
-
384
- /* src/components/Alert/Alert.css */
385
- .fractal-alert {
386
- display: flex;
387
- align-items: flex-start;
388
- gap: 12px;
389
- width: 100%;
390
- border-radius: var(--radius-sm, 4px);
391
- border: 1px solid;
392
- padding: var(--space-3, 12px) var(--space-4, 16px);
393
- font-family: var(--font-sans);
658
+ .fractal-floating-field:not(:focus-within) input:placeholder-shown::placeholder,
659
+ .fractal-floating-field:not(:focus-within) textarea:placeholder-shown::placeholder {
660
+ color: transparent;
394
661
  }
395
- .fractal-alert-icon {
396
- flex-shrink: 0;
662
+ .fractal-floating-field[data-always-float=true] input::placeholder {
663
+ color: var(--fg-placeholder);
664
+ }
665
+ .fractal-floating-field--dropdown:not(:focus-within):not([data-open=true]):not([data-filled=true]) .fractal-dropdown-field-value {
666
+ opacity: 0;
667
+ }
668
+ .fractal-dropdown-field-value {
397
669
  display: flex;
398
670
  align-items: center;
399
- justify-content: center;
400
- width: 18px;
401
- height: 18px;
402
- font-size: 0.75rem;
403
- font-weight: 600;
404
- border-radius: 50%;
405
- margin-top: 1px;
406
- }
407
- .fractal-alert-content {
408
- flex: 1;
671
+ gap: var(--control-icon-gap);
409
672
  min-width: 0;
673
+ overflow: hidden;
410
674
  }
411
- .fractal-alert-title {
412
- margin: 0 0 4px 0;
413
- font-size: 0.875rem;
414
- font-weight: 500;
415
- line-height: 1.4;
675
+ .fractal-floating-field--dropdown > .fractal-floating-field__label {
676
+ cursor: pointer;
677
+ max-width: calc(100% - 2 * var(--control-padding-inline) - var(--control-icon-size) - var(--control-icon-gap));
416
678
  }
417
- .fractal-alert-description {
418
- font-size: 0.875rem;
419
- line-height: 1.5;
679
+ .fractal-floating-field--textarea {
680
+ --control-min-block-size: calc(var(--control-line-height) + 2 * var(--space-3) + 2px);
681
+ --field-label-inset: var(--space-3);
420
682
  }
421
- .fractal-alert--default {
422
- background-color: var(--bg-canvas);
423
- border-color: var(--border-default);
424
- color: var(--fg-primary);
683
+ @media (prefers-reduced-motion: reduce) {
684
+ .fractal-floating-field__label {
685
+ transition: none;
686
+ }
425
687
  }
426
- .fractal-alert--default .fractal-alert-icon {
427
- background: var(--bg-surface-2);
428
- color: var(--fg-secondary);
688
+ .fractal-floating-field--dropdown > .fractal-dropdown-trigger {
689
+ width: 100%;
429
690
  }
430
- .fractal-alert--info {
431
- background-color: var(--accent-surface);
432
- border-color: var(--accent-default);
433
- color: var(--fg-primary);
691
+ .fractal-floating-field > textarea {
692
+ box-sizing: border-box;
434
693
  }
435
- .fractal-alert--info .fractal-alert-icon {
436
- background: var(--accent-default);
437
- color: var(--fg-inverse);
694
+ .fractal-floating-field > :is(.fractal-input, .fractal-textarea, .fractal-dropdown-trigger) {
695
+ border-color: transparent;
438
696
  }
439
- .fractal-alert--success {
440
- background-color: var(--success-surface);
441
- border-color: var(--success-default);
442
- color: var(--fg-primary);
697
+ .fractal-floating-field__border {
698
+ position: absolute;
699
+ pointer-events: none;
700
+ inset: calc(var(--control-line-height) * -0.375) 0 0;
701
+ min-width: 0;
702
+ margin: 0;
703
+ padding: 0 calc(var(--field-label-inset) - 4px);
704
+ border: 1px solid var(--border-default);
705
+ border-radius: var(--radius-sm);
443
706
  }
444
- .fractal-alert--success .fractal-alert-icon {
445
- background: var(--success-default);
446
- color: var(--fg-inverse);
707
+ .fractal-floating-field--dropdown > .fractal-floating-field__border,
708
+ .fractal-floating-field--textarea > .fractal-floating-field__border {
709
+ border-color: var(--border-subtle);
710
+ border-radius: var(--radius-md);
447
711
  }
448
- .fractal-alert--warning {
449
- background-color: var(--warning-surface);
450
- border-color: var(--warning-default);
451
- color: var(--fg-primary);
712
+ .fractal-floating-field__border legend {
713
+ float: none;
714
+ width: 0;
715
+ max-width: 100%;
716
+ height: calc(var(--control-line-height) * 0.75);
717
+ padding: 0;
718
+ overflow: hidden;
719
+ white-space: nowrap;
720
+ font: 400 calc(var(--control-font-size) * 0.75) / 1 var(--font-sans);
721
+ visibility: hidden;
452
722
  }
453
- .fractal-alert--warning .fractal-alert-icon {
454
- background: var(--warning-default);
455
- color: var(--fg-inverse);
723
+ .fractal-floating-field__border legend span {
724
+ padding-inline: 3px;
456
725
  }
457
- .fractal-alert--error {
458
- background-color: var(--error-surface);
459
- border-color: var(--error-default);
460
- color: var(--fg-primary);
726
+ .fractal-floating-field:where(:focus-within, [data-filled=true], [data-open=true], [data-always-float=true], :has(input:not(:placeholder-shown)), :has(textarea:not(:placeholder-shown))) > .fractal-floating-field__border legend {
727
+ width: auto;
461
728
  }
462
- .fractal-alert--error .fractal-alert-icon {
463
- background: var(--error-default);
464
- color: var(--fg-inverse);
729
+ .fractal-floating-field:has(:is(input, textarea):focus-visible) > .fractal-floating-field__border {
730
+ border-color: var(--border-focus);
731
+ }
732
+ .fractal-floating-field:has(:is(input, textarea):disabled) > .fractal-floating-field__border {
733
+ opacity: 0.5;
734
+ }
735
+ .fractal-floating-field:has(.fractal-dropdown-trigger--tertiary) > .fractal-floating-field__border {
736
+ border-color: transparent;
737
+ }
738
+
739
+ /* src/components/TableSearch/TableSearch.css */
740
+ .fractal-table-search {
741
+ position: relative;
742
+ width: 100%;
743
+ }
744
+ .fractal-table-search__icon {
745
+ position: absolute;
746
+ z-index: 1;
747
+ top: 50%;
748
+ left: calc(var(--control-padding-inline) + var(--control-border-width));
749
+ width: var(--control-icon-size);
750
+ height: var(--control-icon-size);
751
+ color: var(--fg-secondary);
752
+ pointer-events: none;
753
+ transform: translateY(-50%);
754
+ }
755
+ .fractal-table-search__input {
756
+ padding-left: calc(var(--control-padding-inline) + var(--control-icon-size) + var(--control-icon-gap));
757
+ }
758
+ .fractal-table-search__input::-webkit-search-cancel-button {
759
+ display: none;
760
+ -webkit-appearance: none;
761
+ appearance: none;
762
+ }
763
+ .fractal-table-search .fractal-floating-field {
764
+ --field-label-inset: calc(var(--control-padding-inline) + var(--control-icon-size) + var(--control-icon-gap));
765
+ }
766
+
767
+ /* src/components/NumberInput/NumberInput.css */
768
+ .fractal-number-input {
769
+ position: relative;
770
+ width: 100%;
771
+ font-family: var(--font-sans);
772
+ font-size: var(--control-font-size);
773
+ line-height: var(--control-line-height);
774
+ font-variant-numeric: tabular-nums;
775
+ align-self: start;
776
+ }
777
+ .fractal-number-input .fractal-input {
778
+ padding-right: calc(2 * var(--control-min-block-size) + var(--control-padding-inline));
779
+ appearance: textfield;
780
+ font-variant-numeric: tabular-nums;
781
+ }
782
+ .fractal-number-input .fractal-input::-webkit-inner-spin-button,
783
+ .fractal-number-input .fractal-input::-webkit-outer-spin-button {
784
+ margin: 0;
785
+ appearance: none;
786
+ }
787
+ .fractal-number-input-controls {
788
+ position: absolute;
789
+ top: 1px;
790
+ right: 1px;
791
+ bottom: 1px;
792
+ display: flex;
793
+ align-items: stretch;
794
+ overflow: hidden;
795
+ border-radius: 0 calc(var(--radius-sm, 4px) - 1px) calc(var(--radius-sm, 4px) - 1px) 0;
796
+ background: var(--bg-canvas);
797
+ }
798
+ .fractal-number-input-unit {
799
+ position: absolute;
800
+ top: 50%;
801
+ color: var(--fg-secondary);
802
+ font-size: var(--control-font-size);
803
+ margin-left: var(--space-1);
804
+ line-height: var(--control-line-height);
805
+ pointer-events: none;
806
+ transform: translateY(-50%);
807
+ user-select: none;
808
+ }
809
+ .fractal-number-input-step {
810
+ display: grid;
811
+ width: var(--control-min-block-size);
812
+ place-items: center;
813
+ padding: 0;
814
+ border: 0;
815
+ border-left: 1px solid var(--border-subtle);
816
+ background: transparent;
817
+ color: var(--fg-tertiary);
818
+ cursor: pointer;
819
+ }
820
+ .fractal-number-input-step:hover:not(:disabled) {
821
+ background: var(--bg-surface-1);
822
+ color: var(--fg-primary);
823
+ }
824
+ .fractal-number-input-step:focus-visible {
825
+ position: relative;
826
+ z-index: 1;
827
+ outline: 2px solid var(--border-focus);
828
+ outline-offset: -2px;
829
+ }
830
+ .fractal-number-input-step:disabled {
831
+ color: var(--fg-disabled);
832
+ cursor: not-allowed;
833
+ }
834
+ .fractal-number-input-step svg {
835
+ width: var(--control-icon-size);
836
+ height: var(--control-icon-size);
837
+ }
838
+ .fractal-number-input:has(.fractal-floating-field input:placeholder-shown):not(:focus-within) .fractal-number-input-unit {
839
+ visibility: hidden;
840
+ }
841
+ .fractal-number-input .fractal-floating-field__label {
842
+ max-width: calc(100% - 2 * var(--control-min-block-size) - 2 * var(--control-padding-inline));
843
+ }
844
+
845
+ /* src/components/Slider/Slider.css */
846
+ .fractal-slider {
847
+ display: grid;
848
+ width: 100%;
849
+ min-width: 120px;
850
+ gap: var(--space-1, 4px);
851
+ }
852
+ .fractal-slider-values {
853
+ display: flex;
854
+ min-height: 1.2em;
855
+ justify-content: space-between;
856
+ color: var(--fg-primary);
857
+ font-size: 0.75rem;
858
+ font-variant-numeric: tabular-nums;
859
+ font-weight: 500;
860
+ line-height: 1.2;
861
+ }
862
+ .fractal-slider[data-knobs="1"] .fractal-slider-values {
863
+ justify-content: flex-end;
864
+ }
865
+ .fractal-slider-control {
866
+ position: relative;
867
+ height: 24px;
868
+ }
869
+ .fractal-slider-track,
870
+ .fractal-slider-selection {
871
+ position: absolute;
872
+ top: 10px;
873
+ height: 4px;
874
+ border-radius: var(--radius-full, 9999px);
875
+ pointer-events: none;
876
+ }
877
+ .fractal-slider-track {
878
+ right: 0;
879
+ left: 0;
880
+ background: var(--bg-surface-2);
881
+ }
882
+ .fractal-slider-selection {
883
+ right: calc(100% - var(--fractal-slider-selection-end));
884
+ left: var(--fractal-slider-selection-start);
885
+ background: var(--accent-default);
886
+ }
887
+ .fractal-slider-control > input[type=range] {
888
+ position: absolute;
889
+ inset: 0;
890
+ z-index: 1;
891
+ width: 100%;
892
+ height: 24px;
893
+ margin: 0;
894
+ appearance: none;
895
+ background: transparent;
896
+ pointer-events: none;
897
+ }
898
+ .fractal-slider-control > input[type=range]::-webkit-slider-runnable-track {
899
+ height: 4px;
900
+ background: transparent;
901
+ }
902
+ .fractal-slider-control > input[type=range]::-webkit-slider-thumb {
903
+ width: 14px;
904
+ height: 14px;
905
+ margin-top: -5px;
906
+ appearance: none;
907
+ border: 2px solid var(--bg-canvas);
908
+ border-radius: 50%;
909
+ background: var(--accent-default);
910
+ box-shadow: 0 0 0 1px var(--accent-default);
911
+ cursor: grab;
912
+ pointer-events: auto;
913
+ }
914
+ .fractal-slider-control > input[type=range]::-moz-range-track {
915
+ height: 4px;
916
+ background: transparent;
917
+ }
918
+ .fractal-slider-control > input[type=range]::-moz-range-thumb {
919
+ width: 12px;
920
+ height: 12px;
921
+ border: 2px solid var(--bg-canvas);
922
+ border-radius: 50%;
923
+ background: var(--accent-default);
924
+ box-shadow: 0 0 0 1px var(--accent-default);
925
+ cursor: grab;
926
+ pointer-events: auto;
927
+ }
928
+ .fractal-slider-control > input[type=range]:focus-visible::-webkit-slider-thumb {
929
+ outline: 2px solid var(--border-focus);
930
+ outline-offset: 2px;
931
+ }
932
+ .fractal-slider-control > input[type=range]:focus-visible::-moz-range-thumb {
933
+ outline: 2px solid var(--border-focus);
934
+ outline-offset: 2px;
935
+ }
936
+ .fractal-slider-control > input[type=range]:active::-webkit-slider-thumb {
937
+ cursor: grabbing;
938
+ }
939
+ .fractal-slider-control > input[type=range]:active::-moz-range-thumb {
940
+ cursor: grabbing;
941
+ }
942
+ .fractal-slider--disabled {
943
+ opacity: 0.5;
944
+ }
945
+ .fractal-slider--disabled .fractal-slider-control > input[type=range]::-webkit-slider-thumb,
946
+ .fractal-slider--disabled .fractal-slider-control > input[type=range]::-moz-range-thumb {
947
+ cursor: not-allowed;
948
+ }
949
+
950
+ /* src/components/PasswordInput/PasswordInput.css */
951
+ .fractal-password-input {
952
+ position: relative;
953
+ width: 100%;
954
+ align-self: start;
955
+ }
956
+ .fractal-password-input-field {
957
+ padding-right: calc(var(--control-min-block-size) + var(--control-padding-inline));
958
+ }
959
+ .fractal-password-input-toggle {
960
+ position: absolute;
961
+ top: var(--control-border-width);
962
+ bottom: var(--control-border-width);
963
+ right: var(--control-border-width);
964
+ display: grid;
965
+ width: calc(var(--control-min-block-size) - 2 * var(--control-border-width));
966
+ place-items: center;
967
+ padding: 0;
968
+ border: 0;
969
+ border-radius: var(--radius-sm, 4px);
970
+ background: transparent;
971
+ color: var(--fg-secondary);
972
+ cursor: pointer;
973
+ transition: background-color 150ms ease, color 150ms ease;
974
+ }
975
+ .fractal-password-input-toggle:hover:not(:disabled) {
976
+ background: var(--hover-canvas, var(--bg-surface-1));
977
+ color: var(--fg-primary);
978
+ }
979
+ .fractal-password-input-toggle:focus-visible {
980
+ outline: 2px solid var(--border-focus);
981
+ outline-offset: -2px;
982
+ }
983
+ .fractal-password-input-toggle:disabled {
984
+ color: var(--fg-disabled);
985
+ cursor: not-allowed;
986
+ opacity: 0.5;
987
+ }
988
+ @media (prefers-reduced-motion: reduce) {
989
+ .fractal-password-input-toggle {
990
+ transition-duration: 0.01ms;
991
+ }
992
+ }
993
+ .fractal-password-input-toggle svg {
994
+ width: var(--control-icon-size);
995
+ height: var(--control-icon-size);
996
+ }
997
+ .fractal-password-input .fractal-floating-field__label {
998
+ max-width: calc(100% - var(--control-min-block-size) - 2 * var(--control-padding-inline));
999
+ }
1000
+
1001
+ /* src/components/Label/Label.css */
1002
+ .fractal-label {
1003
+ display: block;
1004
+ margin: 0;
1005
+ font-family: var(--font-sans);
1006
+ font-size: var(--control-font-size);
1007
+ font-weight: 500;
1008
+ line-height: var(--control-line-height);
1009
+ color: var(--fg-primary);
1010
+ }
1011
+ .fractal-label[data-disabled] {
1012
+ cursor: not-allowed;
1013
+ opacity: 0.7;
1014
+ }
1015
+
1016
+ /* src/components/Alert/Alert.css */
1017
+ .fractal-alert {
1018
+ display: flex;
1019
+ align-items: flex-start;
1020
+ gap: 12px;
1021
+ width: 100%;
1022
+ border-radius: var(--radius-sm, 4px);
1023
+ border: 1px solid;
1024
+ padding: var(--space-3, 12px) var(--space-4, 16px);
1025
+ font-family: var(--font-sans);
1026
+ }
1027
+ .fractal-alert-icon {
1028
+ flex-shrink: 0;
1029
+ display: flex;
1030
+ align-items: center;
1031
+ justify-content: center;
1032
+ width: 18px;
1033
+ height: 18px;
1034
+ font-size: 0.75rem;
1035
+ font-weight: 600;
1036
+ margin-top: 1px;
1037
+ }
1038
+ .fractal-alert-icon svg {
1039
+ display: block;
1040
+ }
1041
+ .fractal-alert-content {
1042
+ flex: 1;
1043
+ min-width: 0;
1044
+ }
1045
+ .fractal-alert-title {
1046
+ margin: 0 0 4px 0;
1047
+ font-size: 0.875rem;
1048
+ font-weight: 500;
1049
+ line-height: 1.4;
1050
+ }
1051
+ .fractal-alert-description {
1052
+ color: var(--fg-secondary);
1053
+ font-size: 0.875rem;
1054
+ line-height: 1.5;
1055
+ }
1056
+ .fractal-alert--default {
1057
+ background-color: var(--bg-canvas);
1058
+ border-color: var(--border-subtle);
1059
+ color: var(--fg-primary);
1060
+ }
1061
+ .fractal-alert--default .fractal-alert-icon {
1062
+ color: var(--fg-secondary);
1063
+ }
1064
+ .fractal-alert--info {
1065
+ background-color: var(--accent-surface);
1066
+ border-color: var(--accent-surface-stroke);
1067
+ color: var(--fg-primary);
1068
+ }
1069
+ .fractal-alert--info .fractal-alert-icon {
1070
+ color: var(--accent-default);
1071
+ }
1072
+ .fractal-alert--success {
1073
+ background-color: var(--success-surface);
1074
+ border-color: var(--success-surface-stroke);
1075
+ color: var(--fg-primary);
1076
+ }
1077
+ .fractal-alert--success .fractal-alert-icon {
1078
+ color: var(--success-default);
1079
+ }
1080
+ .fractal-alert--warning {
1081
+ background-color: var(--warning-surface);
1082
+ border-color: var(--warning-surface-stroke);
1083
+ color: var(--fg-primary);
1084
+ }
1085
+ .fractal-alert--warning .fractal-alert-icon {
1086
+ color: var(--warning-default);
1087
+ }
1088
+ .fractal-alert--error {
1089
+ background-color: var(--error-surface);
1090
+ border-color: var(--error-surface-stroke);
1091
+ color: var(--fg-primary);
1092
+ }
1093
+ .fractal-alert--error .fractal-alert-icon {
1094
+ color: var(--error-default);
1095
+ }
1096
+
1097
+ /* src/components/Toast/Toast.css */
1098
+ .fractal-toast-viewport {
1099
+ position: fixed;
1100
+ z-index: 10000;
1101
+ display: flex;
1102
+ width: min(400px, calc(100vw - var(--space-8, 32px)));
1103
+ max-height: calc(100dvh - var(--space-8, 32px));
1104
+ flex-direction: column;
1105
+ gap: var(--space-2, 8px);
1106
+ overflow: visible;
1107
+ pointer-events: none;
1108
+ }
1109
+ .fractal-toast-viewport--top-center {
1110
+ top: var(--space-4, 16px);
1111
+ left: 50%;
1112
+ align-items: center;
1113
+ transform: translateX(-50%);
1114
+ }
1115
+ .fractal-toast-viewport--top-right {
1116
+ top: var(--space-4, 16px);
1117
+ right: var(--space-4, 16px);
1118
+ align-items: flex-end;
1119
+ }
1120
+ .fractal-toast-viewport--bottom-center {
1121
+ bottom: var(--space-4, 16px);
1122
+ left: 50%;
1123
+ align-items: center;
1124
+ transform: translateX(-50%);
1125
+ }
1126
+ .fractal-toast {
1127
+ display: flex;
1128
+ box-sizing: border-box;
1129
+ width: max-content;
1130
+ max-width: 100%;
1131
+ min-height: 40px;
1132
+ align-items: center;
1133
+ gap: var(--space-2, 8px);
1134
+ padding: var(--space-1, 4px) var(--space-1, 4px) var(--space-1, 4px) var(--space-3, 12px);
1135
+ border: 1px solid var(--border-default);
1136
+ border-radius: var(--radius-full, 9999px);
1137
+ background: var(--bg-canvas);
1138
+ box-shadow: var(--shadow-md);
1139
+ color: var(--fg-primary);
1140
+ font-family: var(--font-sans);
1141
+ font-size: 0.8125rem;
1142
+ font-weight: 500;
1143
+ line-height: 1.35;
1144
+ pointer-events: auto;
1145
+ animation: fractal-toast-in-from-top 180ms var(--ease-out, ease-out) both;
1146
+ }
1147
+ .fractal-toast-viewport--bottom-center .fractal-toast {
1148
+ animation-name: fractal-toast-in-from-bottom;
1149
+ }
1150
+ .fractal-toast__icon {
1151
+ display: grid;
1152
+ width: 18px;
1153
+ height: 18px;
1154
+ flex: 0 0 18px;
1155
+ place-items: center;
1156
+ }
1157
+ .fractal-toast--default .fractal-toast__icon {
1158
+ color: var(--fg-secondary);
1159
+ }
1160
+ .fractal-toast--info .fractal-toast__icon {
1161
+ color: var(--accent-default);
1162
+ }
1163
+ .fractal-toast--success .fractal-toast__icon {
1164
+ color: var(--success-default);
1165
+ }
1166
+ .fractal-toast--warning .fractal-toast__icon {
1167
+ color: var(--warning-default);
1168
+ }
1169
+ .fractal-toast--error .fractal-toast__icon {
1170
+ color: var(--error-default);
1171
+ }
1172
+ .fractal-toast__content {
1173
+ min-width: 0;
1174
+ overflow-wrap: anywhere;
1175
+ }
1176
+ .fractal-toast__action {
1177
+ display: flex;
1178
+ flex: 0 0 auto;
1179
+ align-items: center;
1180
+ }
1181
+ .fractal-toast__dismiss {
1182
+ display: grid;
1183
+ box-sizing: border-box;
1184
+ width: 28px;
1185
+ height: 28px;
1186
+ flex: 0 0 28px;
1187
+ padding: 0;
1188
+ border: 0;
1189
+ border-radius: var(--radius-full, 9999px);
1190
+ background: transparent;
1191
+ color: var(--fg-secondary);
1192
+ cursor: pointer;
1193
+ place-items: center;
1194
+ }
1195
+ .fractal-toast__dismiss:hover {
1196
+ background: var(--hover-surface);
1197
+ color: var(--fg-primary);
1198
+ }
1199
+ .fractal-toast__dismiss:focus-visible {
1200
+ outline: 2px solid var(--border-focus);
1201
+ outline-offset: -2px;
1202
+ }
1203
+ @keyframes fractal-toast-in-from-top {
1204
+ from {
1205
+ opacity: 0;
1206
+ transform: translateY(-12px);
1207
+ }
1208
+ to {
1209
+ opacity: 1;
1210
+ transform: translateY(0);
1211
+ }
1212
+ }
1213
+ @keyframes fractal-toast-in-from-bottom {
1214
+ from {
1215
+ opacity: 0;
1216
+ transform: translateY(12px);
1217
+ }
1218
+ to {
1219
+ opacity: 1;
1220
+ transform: translateY(0);
1221
+ }
1222
+ }
1223
+ @media (max-width: 640px) {
1224
+ .fractal-toast-viewport {
1225
+ width: calc(100vw - var(--space-6, 24px));
1226
+ }
1227
+ .fractal-toast-viewport--top-right {
1228
+ right: var(--space-3, 12px);
1229
+ }
1230
+ }
1231
+ @media (prefers-reduced-motion: reduce) {
1232
+ .fractal-toast {
1233
+ animation-duration: 0.01ms;
1234
+ }
465
1235
  }
466
1236
 
467
1237
  /* src/components/Toggle/Toggle.css */
@@ -506,6 +1276,60 @@
506
1276
  user-select: none;
507
1277
  }
508
1278
 
1279
+ /* src/components/UILoader/UILoader.css */
1280
+ .fractal-ui-loader {
1281
+ display: inline-flex;
1282
+ line-height: 0;
1283
+ }
1284
+ .fractal-ui-loader svg {
1285
+ display: block;
1286
+ overflow: visible;
1287
+ }
1288
+ .fractal-ui-loader__stop-start {
1289
+ stop-color: var(--grey-200);
1290
+ }
1291
+ .fractal-ui-loader__stop-end {
1292
+ stop-color: var(--grey-100);
1293
+ }
1294
+ .fractal-ui-loader--blue .fractal-ui-loader__stop-start {
1295
+ stop-color: var(--blue-500);
1296
+ }
1297
+ .fractal-ui-loader--blue .fractal-ui-loader__stop-end {
1298
+ stop-color: var(--blue-300);
1299
+ }
1300
+ .fractal-ui-loader--green .fractal-ui-loader__stop-start {
1301
+ stop-color: var(--green-500);
1302
+ }
1303
+ .fractal-ui-loader--green .fractal-ui-loader__stop-end {
1304
+ stop-color: var(--green-300);
1305
+ }
1306
+ .fractal-ui-loader__shine-axis {
1307
+ transform-box: view-box;
1308
+ transform-origin: 0 0;
1309
+ }
1310
+ .fractal-ui-loader__shine {
1311
+ animation: fractal-ui-loader-shine 2500ms var(--ease-in-out) infinite;
1312
+ transform-box: view-box;
1313
+ transform-origin: 0 0;
1314
+ }
1315
+ @keyframes fractal-ui-loader-shine {
1316
+ 0%, 12% {
1317
+ transform: translateX(-120px);
1318
+ }
1319
+ 48% {
1320
+ transform: translateX(120px);
1321
+ }
1322
+ 49%, 100% {
1323
+ transform: translateX(-120px);
1324
+ }
1325
+ }
1326
+ @media (prefers-reduced-motion: reduce) {
1327
+ .fractal-ui-loader__shine {
1328
+ animation: none;
1329
+ transform: translateX(0);
1330
+ }
1331
+ }
1332
+
509
1333
  /* src/components/Modal/Modal.css */
510
1334
  .fractal-modal-overlay {
511
1335
  position: fixed;
@@ -517,11 +1341,13 @@
517
1341
  z-index: 9998;
518
1342
  }
519
1343
  .fractal-modal-panel {
1344
+ --fractal-modal-panel-padding: var(--space-6, 24px);
1345
+ box-sizing: border-box;
520
1346
  background: var(--bg-canvas);
521
1347
  border: 1px solid var(--border-subtle);
522
1348
  border-radius: var(--radius-lg, 8px);
523
1349
  box-shadow: var(--shadow-lg);
524
- padding: var(--space-6, 24px);
1350
+ padding: var(--fractal-modal-panel-padding);
525
1351
  max-width: 90vw;
526
1352
  font-family: var(--font-sans);
527
1353
  }
@@ -538,6 +1364,12 @@
538
1364
  display: flex;
539
1365
  flex-direction: column;
540
1366
  }
1367
+ .fractal-modal-panel--scrollable {
1368
+ display: flex;
1369
+ max-height: calc(100dvh - 2rem);
1370
+ flex-direction: column;
1371
+ padding-bottom: 0;
1372
+ }
541
1373
  .fractal-modal-panel--danger {
542
1374
  border-color: var(--error-subtle);
543
1375
  }
@@ -550,6 +1382,29 @@
550
1382
  align-items: center;
551
1383
  margin-bottom: var(--space-4, 16px);
552
1384
  }
1385
+ .fractal-modal-title-row--scrollable {
1386
+ position: relative;
1387
+ box-sizing: border-box;
1388
+ width: calc(100% + var(--fractal-modal-panel-padding) + var(--fractal-modal-panel-padding));
1389
+ flex: 0 0 auto;
1390
+ margin: 0 calc(0px - var(--fractal-modal-panel-padding));
1391
+ padding: 0 var(--fractal-modal-panel-padding) var(--space-4, 16px);
1392
+ }
1393
+ .fractal-modal-title-row--scrollable::after {
1394
+ position: absolute;
1395
+ right: 0;
1396
+ bottom: 0;
1397
+ left: 0;
1398
+ height: 1px;
1399
+ background: var(--border-subtle);
1400
+ content: "";
1401
+ opacity: 0;
1402
+ pointer-events: none;
1403
+ transition: opacity 160ms ease;
1404
+ }
1405
+ .fractal-modal-title-row--scrolled::after {
1406
+ opacity: 1;
1407
+ }
553
1408
  .fractal-modal-title {
554
1409
  margin: 0;
555
1410
  font-size: 1rem;
@@ -576,21 +1431,270 @@
576
1431
  color: var(--fg-primary);
577
1432
  background: var(--bg-surface-1);
578
1433
  }
1434
+ .fractal-modal-close:disabled {
1435
+ cursor: not-allowed;
1436
+ opacity: 0.4;
1437
+ }
1438
+ .fractal-modal-close:disabled:hover {
1439
+ color: var(--fg-secondary);
1440
+ background: none;
1441
+ }
579
1442
  .fractal-modal-body {
580
1443
  font-size: 0.875rem;
581
1444
  color: var(--fg-secondary);
582
1445
  }
1446
+ .fractal-modal-body--loading {
1447
+ display: grid;
1448
+ min-height: 168px;
1449
+ place-items: center;
1450
+ }
583
1451
  .fractal-modal-body--lg {
584
1452
  flex: 1;
585
1453
  min-height: 0;
586
1454
  overflow: hidden;
587
1455
  }
1456
+ .fractal-modal-body--scrollable {
1457
+ box-sizing: border-box;
1458
+ width: calc(100% + var(--fractal-modal-panel-padding) + var(--fractal-modal-panel-padding));
1459
+ min-height: 0;
1460
+ margin-inline: calc(0px - var(--fractal-modal-panel-padding));
1461
+ overflow-y: auto;
1462
+ overscroll-behavior: contain;
1463
+ padding-inline: var(--fractal-modal-panel-padding);
1464
+ }
588
1465
  .fractal-modal-footer {
589
1466
  display: flex;
590
1467
  justify-content: flex-end;
591
1468
  gap: var(--space-2, 8px);
592
1469
  margin-top: var(--space-4, 16px);
593
1470
  }
1471
+ .fractal-modal-footer--divided {
1472
+ box-sizing: border-box;
1473
+ width: calc(100% + var(--fractal-modal-panel-padding) + var(--fractal-modal-panel-padding));
1474
+ flex: 0 0 auto;
1475
+ margin-top: 0;
1476
+ margin-inline: calc(0px - var(--fractal-modal-panel-padding));
1477
+ padding: var(--space-4, 16px) var(--fractal-modal-panel-padding);
1478
+ border-top: 1px solid var(--border-subtle);
1479
+ }
1480
+
1481
+ /* src/components/TableLayout/TableLayout.css */
1482
+ .fractal-table-layout {
1483
+ container: fractal-table / inline-size;
1484
+ min-width: 0;
1485
+ max-width: 100%;
1486
+ }
1487
+ .fractal-table-layout .fractal-datatable-surface,
1488
+ .fractal-table-layout .fractal-sortable-table-surface {
1489
+ width: fit-content;
1490
+ max-width: 100%;
1491
+ box-sizing: border-box;
1492
+ }
1493
+ .fractal-table-layout[data-table-layout=fill] .fractal-datatable-surface,
1494
+ .fractal-table-layout[data-table-layout=fill] .fractal-sortable-table-surface {
1495
+ width: 100%;
1496
+ }
1497
+ .fractal-table-viewport {
1498
+ max-width: 100%;
1499
+ overflow: auto;
1500
+ position: relative;
1501
+ }
1502
+ .fractal-table-layout table {
1503
+ width: max-content;
1504
+ table-layout: auto;
1505
+ height: 1px;
1506
+ }
1507
+ .fractal-table-layout[data-table-layout=fill] table {
1508
+ min-width: 100%;
1509
+ }
1510
+ .fractal-table-layout th,
1511
+ .fractal-table-layout td {
1512
+ --table-cell-padding: var(--space-4);
1513
+ white-space: nowrap;
1514
+ overflow-wrap: normal;
1515
+ box-sizing: border-box;
1516
+ }
1517
+ .fractal-datatable--sm :is(th, td),
1518
+ .fractal-sortable-table--sm :is(th, td) {
1519
+ --table-cell-padding: var(--space-3);
1520
+ }
1521
+ .fractal-datatable--lg :is(th, td),
1522
+ .fractal-sortable-table--lg :is(th, td) {
1523
+ --table-cell-padding: var(--space-6);
1524
+ }
1525
+ .fractal-table-cell-scroll {
1526
+ --table-default-cap: var(--table-column-max-wide);
1527
+ --table-cap: var(--table-column-max, var(--table-default-cap));
1528
+ width: var(--table-column-width, auto);
1529
+ height: 100%;
1530
+ min-width: max(100%, calc(min(var(--table-column-min, 0px), var(--table-cap)) - 1px));
1531
+ max-width: max(0px, calc(var(--table-cap) - 1px));
1532
+ overflow-x: auto;
1533
+ overflow-y: hidden;
1534
+ white-space: nowrap;
1535
+ scrollbar-width: none;
1536
+ }
1537
+ .fractal-table-cell-scroll::-webkit-scrollbar {
1538
+ display: none;
1539
+ }
1540
+ .fractal-table-layout :is(th, td):has(> .fractal-table-cell-scroll) {
1541
+ padding: 0;
1542
+ height: 100%;
1543
+ }
1544
+ .fractal-table-cell-content {
1545
+ display: flex;
1546
+ align-items: center;
1547
+ box-sizing: border-box;
1548
+ width: max-content;
1549
+ min-width: 100%;
1550
+ min-height: 100%;
1551
+ padding: var(--table-cell-block-padding) var(--table-cell-padding);
1552
+ gap: var(--space-1);
1553
+ white-space: nowrap;
1554
+ }
1555
+ .fractal-table-cell-content > * {
1556
+ flex-shrink: 0;
1557
+ }
1558
+ .fractal-table-cell-scroll {
1559
+ overscroll-behavior-x: auto;
1560
+ }
1561
+ .fractal-table-viewport:focus-visible,
1562
+ .fractal-table-cell-scroll:focus-visible {
1563
+ outline: 2px solid var(--border-focus);
1564
+ outline-offset: -2px;
1565
+ }
1566
+ .fractal-table-layout .fractal-sortable-table-th--sortable .fractal-table-cell-content {
1567
+ padding: 0;
1568
+ }
1569
+ .fractal-table-layout .fractal-sortable-table-sort-button {
1570
+ width: max-content;
1571
+ min-width: 100%;
1572
+ align-self: stretch;
1573
+ white-space: nowrap;
1574
+ }
1575
+ @container fractal-table (max-width: 1024px) {
1576
+ .fractal-table-cell-scroll {
1577
+ --table-default-cap: var(--table-column-max-medium);
1578
+ }
1579
+ }
1580
+ @container fractal-table (max-width: 640px) {
1581
+ .fractal-table-cell-scroll {
1582
+ --table-default-cap: var(--table-column-max-compact);
1583
+ }
1584
+ }
1585
+ .fractal-table-layout[data-sticky-first=true] [data-pinned-column=data] .fractal-table-cell-scroll {
1586
+ --table-cap: min(var(--table-column-max, var(--table-default-cap)), 55cqi);
1587
+ }
1588
+ .fractal-table-layout[data-sticky-first=true] :is([data-pinned-column=data], [data-pinned-column=selection]) {
1589
+ position: sticky;
1590
+ inset-inline-start: 0;
1591
+ z-index: 2;
1592
+ background: inherit;
1593
+ }
1594
+ .fractal-table-layout[data-sticky-first=true][data-table-selection=true] [data-pinned-column=data] {
1595
+ inset-inline-start: 52px;
1596
+ }
1597
+ .fractal-table-layout[data-sticky-header=true] thead th {
1598
+ position: sticky;
1599
+ top: 0;
1600
+ z-index: 3;
1601
+ background: var(--bg-surface-1);
1602
+ }
1603
+ .fractal-table-layout[data-sticky-first=true] thead [data-pinned-column] {
1604
+ background: var(--bg-surface-1);
1605
+ }
1606
+ .fractal-table-layout[data-sticky-header=true][data-sticky-first=true] thead [data-pinned-column] {
1607
+ z-index: 4;
1608
+ }
1609
+ .fractal-table-layout [data-column-align=right] .fractal-table-cell-content {
1610
+ justify-content: flex-end;
1611
+ }
1612
+ .fractal-table-layout .fractal-table-overflow-cell {
1613
+ position: sticky;
1614
+ inset-inline-end: 0;
1615
+ z-index: 2;
1616
+ width: 48px;
1617
+ min-width: 48px;
1618
+ max-width: 48px;
1619
+ padding: var(--space-2);
1620
+ vertical-align: middle;
1621
+ background: inherit;
1622
+ }
1623
+ .fractal-table-layout thead .fractal-table-overflow-cell {
1624
+ background: var(--bg-surface-1);
1625
+ }
1626
+ .fractal-table-layout[data-sticky-header=true] thead .fractal-table-overflow-cell {
1627
+ z-index: 4;
1628
+ }
1629
+ .fractal-table-layout[data-overflow-menu=true] {
1630
+ --table-trailing-reserve: 48px;
1631
+ }
1632
+ .fractal-table-layout[data-table-selection=true] {
1633
+ --table-leading-reserve: 52px;
1634
+ }
1635
+ .fractal-table-layout[data-sticky-first=true] [data-pinned-column=data] .fractal-table-cell-scroll {
1636
+ --table-cap: min(var(--table-column-max, var(--table-default-cap)), 55cqi, max(0px, calc(100cqi - var(--table-leading-reserve, 0px) - var(--table-trailing-reserve, 0px) - 64px)));
1637
+ }
1638
+ .fractal-table-overflow-trigger {
1639
+ display: flex;
1640
+ align-items: center;
1641
+ justify-content: center;
1642
+ }
1643
+ .fractal-table-overflow-menu {
1644
+ position: fixed;
1645
+ z-index: 10000;
1646
+ box-sizing: border-box;
1647
+ min-width: min(160px, calc(100vw - 16px));
1648
+ max-width: calc(100vw - 16px);
1649
+ max-height: calc(100vh - 16px);
1650
+ overflow: auto;
1651
+ padding: var(--space-1);
1652
+ border: 1px solid var(--border-subtle);
1653
+ border-radius: var(--radius-md);
1654
+ background: var(--bg-canvas);
1655
+ box-shadow: var(--shadow-md);
1656
+ color: var(--fg-primary);
1657
+ font-family: var(--font-sans);
1658
+ font-size: 0.875rem;
1659
+ }
1660
+ .fractal-table-overflow-menu > button {
1661
+ display: flex;
1662
+ align-items: center;
1663
+ gap: var(--space-2);
1664
+ width: 100%;
1665
+ padding: var(--space-2) var(--space-3);
1666
+ border: 0;
1667
+ border-radius: var(--radius-sm);
1668
+ background: transparent;
1669
+ color: inherit;
1670
+ font: inherit;
1671
+ text-align: start;
1672
+ cursor: pointer;
1673
+ }
1674
+ .fractal-table-overflow-menu > button:hover:not(:disabled) {
1675
+ background: var(--hover-surface);
1676
+ }
1677
+ .fractal-table-overflow-menu > button:focus-visible {
1678
+ background: var(--hover-surface);
1679
+ outline: 2px solid var(--border-focus);
1680
+ outline-offset: -2px;
1681
+ }
1682
+ .fractal-table-overflow-menu > button:disabled {
1683
+ color: var(--fg-disabled);
1684
+ cursor: not-allowed;
1685
+ }
1686
+ .fractal-table-overflow-menu > button > span {
1687
+ display: inline-flex;
1688
+ }
1689
+ .fractal-table-layout[data-sticky-first=true] [data-pinned-column=data]::after {
1690
+ content: "";
1691
+ position: absolute;
1692
+ inset-block: 0;
1693
+ inset-inline-end: -1px;
1694
+ width: 1px;
1695
+ background: var(--border-subtle);
1696
+ pointer-events: none;
1697
+ }
594
1698
 
595
1699
  /* src/components/DataTable/DataTable.css */
596
1700
  .fractal-datatable {
@@ -633,15 +1737,14 @@
633
1737
  .fractal-datatable-th {
634
1738
  text-align: left;
635
1739
  padding: 12px 16px;
636
- font-size: 0.75rem;
1740
+ --table-cell-block-padding: 12px;
1741
+ font-size: inherit;
1742
+ line-height: 1.55;
637
1743
  font-weight: 500;
638
1744
  color: var(--fg-secondary);
639
1745
  border-bottom: 1px solid var(--border-subtle);
640
1746
  vertical-align: middle;
641
1747
  }
642
- .fractal-datatable-th + .fractal-datatable-th {
643
- border-left: 1px solid var(--border-subtle);
644
- }
645
1748
  .fractal-datatable-row {
646
1749
  background: var(--bg-canvas);
647
1750
  transition: background 120ms ease;
@@ -651,54 +1754,79 @@
651
1754
  }
652
1755
  .fractal-datatable-td {
653
1756
  padding: 14px 16px;
1757
+ --table-cell-block-padding: 14px;
654
1758
  color: var(--fg-primary);
655
1759
  line-height: 1.55;
656
- vertical-align: top;
1760
+ vertical-align: middle;
657
1761
  overflow-wrap: anywhere;
658
1762
  }
659
- .fractal-datatable-td + .fractal-datatable-td {
660
- border-left: 1px solid var(--border-subtle);
1763
+ .fractal-datatable-td .fractal-dropdown-trigger--icon-only.fractal-dropdown-trigger--tertiary:hover {
1764
+ background: var(--bg-canvas);
661
1765
  }
662
1766
  .fractal-datatable-row + .fractal-datatable-row .fractal-datatable-td {
663
1767
  border-top: 1px solid var(--border-subtle);
664
1768
  }
665
1769
  .fractal-datatable--sm .fractal-datatable-th {
666
1770
  padding: 8px 12px;
1771
+ --table-cell-block-padding: 8px;
667
1772
  }
668
1773
  .fractal-datatable--sm .fractal-datatable-td {
669
1774
  padding: 10px 12px;
1775
+ --table-cell-block-padding: 10px;
670
1776
  }
671
1777
  .fractal-datatable--lg .fractal-datatable-th {
672
1778
  padding: 18px 24px;
1779
+ --table-cell-block-padding: 18px;
673
1780
  }
674
1781
  .fractal-datatable--lg .fractal-datatable-td {
675
1782
  padding: 22px 24px;
1783
+ --table-cell-block-padding: 22px;
1784
+ }
1785
+ .fractal-datatable-th + .fractal-datatable-th,
1786
+ .fractal-datatable-td + .fractal-datatable-td {
1787
+ border-inline-start: 1px solid var(--border-subtle);
676
1788
  }
677
1789
 
678
1790
  /* src/components/Dropdown/Dropdown.css */
679
1791
  .fractal-dropdown {
680
1792
  position: relative;
681
- display: inline-block;
1793
+ display: inline-flex;
1794
+ vertical-align: top;
1795
+ min-width: 0;
682
1796
  }
683
1797
  .fractal-dropdown-trigger {
684
1798
  display: inline-flex;
685
1799
  align-items: center;
686
- gap: 8px;
1800
+ gap: var(--control-icon-gap);
687
1801
  border-radius: var(--radius-md, 6px);
688
1802
  border: 1px solid var(--border-subtle);
689
1803
  background: var(--bg-canvas);
690
- padding: 8px 12px;
691
1804
  text-align: left;
692
- font-size: 0.875rem;
693
1805
  font-family: var(--font-sans);
694
1806
  color: var(--fg-primary);
695
1807
  cursor: pointer;
696
- transition: background-color 0.15s;
1808
+ transition: background-color var(--duration-fast) var(--ease-out);
697
1809
  }
698
- .fractal-dropdown-trigger--sm {
699
- gap: 6px;
700
- padding: 4px 8px;
701
- font-size: 0.75rem;
1810
+ .fractal-dropdown-trigger--vertical {
1811
+ flex-direction: column;
1812
+ justify-content: flex-start;
1813
+ }
1814
+ .fractal-dropdown-trigger--vertical .fractal-dropdown-selected-text {
1815
+ writing-mode: vertical-rl;
1816
+ transform: rotate(180deg);
1817
+ }
1818
+ .fractal-dropdown-trigger--vertical .fractal-dropdown-icon--trigger {
1819
+ writing-mode: vertical-rl;
1820
+ transform: rotate(180deg);
1821
+ }
1822
+ .fractal-dropdown-trigger--vertical .fractal-dropdown-chevron {
1823
+ order: -1;
1824
+ margin: 0 0 auto;
1825
+ }
1826
+ .fractal-dropdown-trigger--icon-only {
1827
+ inline-size: var(--control-min-block-size);
1828
+ justify-content: center;
1829
+ padding-inline: 0;
702
1830
  }
703
1831
  .fractal-dropdown-trigger--tertiary {
704
1832
  border-color: transparent;
@@ -706,8 +1834,19 @@
706
1834
  }
707
1835
  .fractal-dropdown-trigger:hover,
708
1836
  .fractal-dropdown-trigger--tertiary:hover {
1837
+ background: var(--control-hover-bg, var(--hover-canvas));
1838
+ }
1839
+ .fractal-dropdown-trigger:disabled,
1840
+ .fractal-dropdown-trigger:disabled:hover {
1841
+ color: var(--fg-disabled);
1842
+ cursor: not-allowed;
709
1843
  background: var(--bg-surface-1);
710
1844
  }
1845
+ .fractal-dropdown-trigger:disabled .fractal-dropdown-selected-text,
1846
+ .fractal-dropdown-trigger:disabled .fractal-dropdown-chevron,
1847
+ .fractal-dropdown-trigger:disabled .fractal-dropdown-icon {
1848
+ color: var(--fg-disabled);
1849
+ }
711
1850
  .fractal-dropdown-trigger:focus-visible {
712
1851
  outline: none;
713
1852
  box-shadow: 0 0 0 2px var(--bg-canvas), 0 0 0 4px var(--border-focus);
@@ -731,22 +1870,31 @@
731
1870
  .fractal-dropdown-chevron {
732
1871
  display: flex;
733
1872
  flex-shrink: 0;
1873
+ margin-left: auto;
734
1874
  color: var(--fg-secondary);
735
1875
  }
736
1876
  .fractal-dropdown-panel {
737
1877
  position: absolute;
738
1878
  z-index: 999999;
1879
+ width: max-content;
1880
+ max-height: 320px;
1881
+ max-width: calc(100vw - 16px);
1882
+ display: flex;
1883
+ flex-direction: column;
739
1884
  overflow: hidden;
1885
+ overscroll-behavior: contain;
1886
+ box-sizing: border-box;
740
1887
  border-radius: var(--radius-md, 6px);
741
1888
  border: 1px solid var(--border-subtle);
742
1889
  background: var(--bg-canvas);
743
- white-space: nowrap;
1890
+ white-space: normal;
1891
+ overflow-wrap: anywhere;
744
1892
  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
745
1893
  padding: 4px;
746
1894
  }
747
1895
  .fractal-dropdown-label {
748
1896
  width: 100%;
749
- padding: 6px 8px;
1897
+ padding: var(--space-1) var(--control-padding-inline);
750
1898
  font-size: 0.75rem;
751
1899
  font-weight: 500;
752
1900
  color: var(--fg-secondary);
@@ -755,30 +1903,24 @@
755
1903
  .fractal-dropdown-option {
756
1904
  display: flex;
757
1905
  width: 100%;
1906
+ box-sizing: border-box;
758
1907
  align-items: center;
759
1908
  gap: 8px;
760
- padding: 6px 8px;
1909
+ padding: var(--control-padding-block) var(--control-padding-inline);
761
1910
  text-align: left;
762
- font-size: 0.875rem;
1911
+ font-size: var(--control-font-size);
1912
+ line-height: var(--control-line-height);
763
1913
  font-family: var(--font-sans);
764
1914
  background: none;
765
1915
  border: none;
766
1916
  border-radius: var(--radius-sm, 4px);
767
1917
  cursor: pointer;
768
1918
  color: var(--fg-primary);
769
- transition: background-color 0.1s;
770
- }
771
- .fractal-dropdown-panel--sm .fractal-dropdown-label,
772
- .fractal-dropdown-panel--sm .fractal-dropdown-option {
773
- padding: 4px 8px;
774
- font-size: 0.75rem;
775
- }
776
- .fractal-dropdown-panel--sm .fractal-dropdown-option {
777
- gap: 6px;
1919
+ transition: background-color var(--duration-fast) var(--ease-out);
778
1920
  }
779
1921
  .fractal-dropdown-option:hover,
780
1922
  .fractal-dropdown-option:focus-visible {
781
- background: var(--hover-canvas, var(--bg-surface-2));
1923
+ background: var(--hover-surface, var(--bg-surface-2));
782
1924
  outline: none;
783
1925
  }
784
1926
  .fractal-dropdown-separator {
@@ -786,15 +1928,146 @@
786
1928
  margin: 4px -4px;
787
1929
  background: var(--border-subtle);
788
1930
  }
789
- .fractal-dropdown-option-text {
790
- color: var(--fg-primary);
1931
+ .fractal-dropdown-option-text {
1932
+ min-width: 0;
1933
+ color: var(--fg-primary);
1934
+ }
1935
+ .fractal-dropdown-trailing {
1936
+ margin-left: auto;
1937
+ display: flex;
1938
+ align-items: center;
1939
+ padding-left: 8px;
1940
+ color: var(--accent-default);
1941
+ }
1942
+ .fractal-dropdown-trigger {
1943
+ white-space: nowrap;
1944
+ }
1945
+ .fractal-dropdown-icon--trigger svg,
1946
+ .fractal-dropdown-chevron svg {
1947
+ width: var(--control-icon-size);
1948
+ height: var(--control-icon-size);
1949
+ }
1950
+ .fractal-dropdown-options {
1951
+ min-height: 0;
1952
+ overflow-x: hidden;
1953
+ overflow-y: auto;
1954
+ overscroll-behavior: contain;
1955
+ }
1956
+ .fractal-dropdown-search-container {
1957
+ position: relative;
1958
+ flex-shrink: 0;
1959
+ padding-bottom: var(--space-1);
1960
+ background: var(--bg-canvas);
1961
+ }
1962
+ .fractal-dropdown-search-container::after {
1963
+ content: "";
1964
+ position: absolute;
1965
+ bottom: 0;
1966
+ left: calc(-1 * var(--space-1));
1967
+ right: calc(-1 * var(--space-1));
1968
+ height: 1px;
1969
+ background: var(--border-subtle);
1970
+ opacity: 0;
1971
+ pointer-events: none;
1972
+ transition: opacity var(--duration-fast) var(--ease-out);
1973
+ }
1974
+ .fractal-dropdown-search-container[data-scrolled=true]::after {
1975
+ opacity: 1;
1976
+ }
1977
+ .fractal-dropdown-search {
1978
+ display: flex;
1979
+ align-items: center;
1980
+ gap: var(--space-2);
1981
+ padding: var(--control-padding-block) var(--control-padding-inline);
1982
+ border-radius: var(--radius-sm);
1983
+ }
1984
+ .fractal-dropdown-search:focus-within {
1985
+ box-shadow: inset 0 0 0 1px var(--border-focus), 0 0 0 3px var(--focus-surface);
1986
+ }
1987
+ @media (prefers-reduced-motion: reduce) {
1988
+ .fractal-dropdown-search-container::after {
1989
+ transition: none;
1990
+ }
1991
+ }
1992
+ .fractal-dropdown-search > svg {
1993
+ width: var(--control-icon-size);
1994
+ height: var(--control-icon-size);
1995
+ flex-shrink: 0;
1996
+ color: var(--fg-secondary);
1997
+ }
1998
+ .fractal-dropdown-search input {
1999
+ width: 100%;
2000
+ min-width: 0;
2001
+ padding: 0;
2002
+ border: 0;
2003
+ outline: none;
2004
+ box-shadow: none;
2005
+ background: transparent;
2006
+ color: var(--fg-primary);
2007
+ font: inherit;
2008
+ font-size: var(--control-font-size);
2009
+ line-height: var(--control-line-height);
2010
+ }
2011
+ .fractal-dropdown-search input::placeholder {
2012
+ color: var(--fg-placeholder);
2013
+ }
2014
+ .fractal-dropdown-checkbox {
2015
+ display: flex;
2016
+ align-items: center;
2017
+ justify-content: center;
2018
+ width: 16px;
2019
+ height: 16px;
2020
+ box-sizing: border-box;
2021
+ flex-shrink: 0;
2022
+ border: 1px solid var(--fg-secondary);
2023
+ border-radius: var(--radius-sm);
2024
+ }
2025
+ .fractal-dropdown-checkbox[data-checked=true] {
2026
+ background: var(--fg-primary);
2027
+ border-color: var(--fg-primary);
2028
+ color: var(--bg-canvas);
2029
+ }
2030
+ .fractal-dropdown-checkbox svg {
2031
+ width: 14px;
2032
+ height: 14px;
2033
+ }
2034
+ .fractal-dropdown[data-clearable] .fractal-dropdown-trigger {
2035
+ padding-right: calc(var(--control-padding-inline) + var(--control-icon-size) + var(--control-icon-gap) + var(--control-line-height));
791
2036
  }
792
- .fractal-dropdown-trailing {
793
- margin-left: auto;
2037
+ .fractal-dropdown-clear {
2038
+ position: absolute;
2039
+ right: calc(var(--control-padding-inline) + var(--control-icon-size) + var(--control-icon-gap));
2040
+ top: 50%;
2041
+ transform: translateY(-50%);
794
2042
  display: flex;
795
2043
  align-items: center;
796
- padding-left: 8px;
797
- color: var(--accent-default);
2044
+ justify-content: center;
2045
+ width: var(--control-line-height);
2046
+ height: var(--control-line-height);
2047
+ padding: 0;
2048
+ border: 0;
2049
+ border-radius: 50%;
2050
+ background: var(--fg-primary);
2051
+ color: var(--bg-canvas);
2052
+ cursor: pointer;
2053
+ transition: background-color var(--duration-fast) var(--ease-out);
2054
+ }
2055
+ .fractal-dropdown-clear svg {
2056
+ width: calc(var(--control-icon-size) * .75);
2057
+ height: calc(var(--control-icon-size) * .75);
2058
+ }
2059
+ .fractal-dropdown-clear:hover {
2060
+ background: var(--fg-secondary);
2061
+ }
2062
+ .fractal-dropdown-clear:focus-visible {
2063
+ outline: 2px solid var(--border-focus);
2064
+ outline-offset: 2px;
2065
+ }
2066
+ .fractal-dropdown[data-clearable] .fractal-dropdown-chevron {
2067
+ position: absolute;
2068
+ right: var(--control-padding-inline);
2069
+ top: 50%;
2070
+ transform: translateY(-50%);
798
2071
  }
799
2072
 
800
2073
  /* src/components/Link/Link.css */
@@ -837,41 +2110,154 @@
837
2110
  display: inline-flex;
838
2111
  align-items: center;
839
2112
  border-radius: var(--radius-full);
840
- padding: 1px 8px;
841
- font-family: var(--font-mono);
842
- font-size: 0.6875rem;
843
- font-weight: 400;
844
- letter-spacing: -0.01em;
845
- line-height: 1.5;
2113
+ padding: var(--space-1) var(--space-2);
2114
+ font-family: var(--font-sans);
2115
+ font-size: 0.75rem;
2116
+ font-weight: 500;
2117
+ letter-spacing: normal;
2118
+ line-height: 1rem;
846
2119
  white-space: nowrap;
847
- background: var(--bg-surface-2);
848
- border: 1px solid var(--border-subtle);
849
- color: var(--fg-secondary);
2120
+ border: 0;
2121
+ background: var(--tag-neutral-bg);
2122
+ color: var(--tag-neutral-fg);
850
2123
  }
851
2124
  .fractal-chip--neutral {
852
- background: var(--bg-surface-2);
853
- border-color: var(--border-subtle);
854
- color: var(--fg-secondary);
2125
+ background: var(--tag-neutral-bg);
2126
+ color: var(--tag-neutral-fg);
855
2127
  }
856
2128
  .fractal-chip--success {
857
- background: var(--success-surface);
858
- border-color: var(--success-subtle);
859
- color: var(--success-default);
2129
+ background: var(--tag-success-bg);
2130
+ color: var(--tag-success-fg);
860
2131
  }
861
2132
  .fractal-chip--warning {
862
- background: var(--warning-surface);
863
- border-color: var(--warning-subtle);
864
- color: var(--warning-default);
2133
+ background: var(--tag-warning-bg);
2134
+ color: var(--tag-warning-fg);
865
2135
  }
866
2136
  .fractal-chip--error {
867
- background: var(--error-surface);
868
- border-color: var(--error-subtle);
869
- color: var(--error-default);
2137
+ background: var(--tag-error-bg);
2138
+ color: var(--tag-error-fg);
870
2139
  }
871
2140
  .fractal-chip--info {
872
- background: var(--accent-surface);
873
- border-color: var(--accent-subtle);
874
- color: var(--accent-default);
2141
+ background: var(--tag-info-bg);
2142
+ color: var(--tag-info-fg);
2143
+ }
2144
+
2145
+ /* src/components/Checkbox/Checkbox.css */
2146
+ .fractal-checkbox {
2147
+ display: grid;
2148
+ width: 28px;
2149
+ height: 28px;
2150
+ place-items: center;
2151
+ padding: 0;
2152
+ border: 0;
2153
+ border-radius: var(--radius-sm);
2154
+ background: transparent;
2155
+ color: var(--fg-secondary);
2156
+ cursor: pointer;
2157
+ }
2158
+ .fractal-checkbox:hover:not(:disabled) {
2159
+ background: var(--hover-canvas);
2160
+ color: var(--fg-primary);
2161
+ }
2162
+ .fractal-checkbox--checked {
2163
+ color: var(--fg-primary);
2164
+ }
2165
+ .fractal-checkbox__indeterminate-icon {
2166
+ position: relative;
2167
+ display: grid;
2168
+ place-items: center;
2169
+ }
2170
+ .fractal-checkbox__indeterminate-mark {
2171
+ position: absolute;
2172
+ }
2173
+ .fractal-checkbox:focus-visible {
2174
+ outline: 2px solid var(--border-focus);
2175
+ outline-offset: 2px;
2176
+ }
2177
+ .fractal-checkbox:disabled {
2178
+ cursor: not-allowed;
2179
+ color: var(--fg-disabled);
2180
+ }
2181
+
2182
+ /* src/components/Radio/Radio.css */
2183
+ .fractal-radio {
2184
+ position: relative;
2185
+ display: grid;
2186
+ grid-template-columns: 18px minmax(0, 1fr);
2187
+ align-items: start;
2188
+ gap: var(--space-2, 8px);
2189
+ color: var(--fg-primary);
2190
+ cursor: pointer;
2191
+ font-family: var(--font-sans);
2192
+ }
2193
+ .fractal-radio__input {
2194
+ position: absolute;
2195
+ width: 18px;
2196
+ height: 18px;
2197
+ margin: 0;
2198
+ opacity: 0;
2199
+ cursor: inherit;
2200
+ }
2201
+ .fractal-radio__control {
2202
+ display: grid;
2203
+ width: 18px;
2204
+ height: 18px;
2205
+ box-sizing: border-box;
2206
+ place-items: center;
2207
+ border: 1px solid var(--border-strong);
2208
+ border-radius: var(--radius-full, 9999px);
2209
+ background: var(--bg-canvas);
2210
+ transition: border-color 120ms ease, box-shadow 120ms ease;
2211
+ }
2212
+ .fractal-radio__dot {
2213
+ width: 8px;
2214
+ height: 8px;
2215
+ border-radius: var(--radius-full, 9999px);
2216
+ background: var(--accent-default);
2217
+ opacity: 0;
2218
+ transform: scale(0.5);
2219
+ transition: opacity 120ms ease, transform 120ms ease;
2220
+ }
2221
+ .fractal-radio__input:checked + .fractal-radio__control {
2222
+ border-color: var(--accent-default);
2223
+ }
2224
+ .fractal-radio__input:checked + .fractal-radio__control .fractal-radio__dot {
2225
+ opacity: 1;
2226
+ transform: scale(1);
2227
+ }
2228
+ .fractal-radio:hover:not(.fractal-radio--disabled) .fractal-radio__control {
2229
+ border-color: var(--fg-secondary);
2230
+ }
2231
+ .fractal-radio__input:focus-visible + .fractal-radio__control {
2232
+ box-shadow: 0 0 0 2px var(--bg-canvas), 0 0 0 4px var(--border-focus);
2233
+ }
2234
+ .fractal-radio__content {
2235
+ display: grid;
2236
+ min-width: 0;
2237
+ gap: 2px;
2238
+ }
2239
+ .fractal-radio__label {
2240
+ font-size: 0.8125rem;
2241
+ line-height: 18px;
2242
+ }
2243
+ .fractal-radio__description {
2244
+ color: var(--fg-secondary);
2245
+ font-size: 0.75rem;
2246
+ line-height: 1.4;
2247
+ }
2248
+ .fractal-radio--disabled {
2249
+ color: var(--fg-disabled);
2250
+ cursor: not-allowed;
2251
+ }
2252
+ .fractal-radio--disabled .fractal-radio__control {
2253
+ border-color: var(--border-subtle);
2254
+ background: var(--bg-surface-1);
2255
+ }
2256
+ .fractal-radio--disabled .fractal-radio__dot {
2257
+ background: var(--fg-disabled);
2258
+ }
2259
+ .fractal-radio--disabled .fractal-radio__description {
2260
+ color: var(--fg-disabled);
875
2261
  }
876
2262
 
877
2263
  /* src/components/SortableTable/SortableTable.css */
@@ -885,6 +2271,11 @@
885
2271
  border-radius: var(--radius-md, 6px);
886
2272
  background: var(--bg-canvas);
887
2273
  }
2274
+ .fractal-sortable-table--embedded .fractal-sortable-table-surface {
2275
+ border: 0;
2276
+ border-top: 1px solid var(--border-subtle);
2277
+ border-radius: 0;
2278
+ }
888
2279
  .fractal-sortable-table-header {
889
2280
  display: flex;
890
2281
  align-items: center;
@@ -915,16 +2306,15 @@
915
2306
  .fractal-sortable-table-th {
916
2307
  text-align: left;
917
2308
  padding: 12px 16px;
918
- font-size: 0.75rem;
2309
+ --table-cell-block-padding: 12px;
2310
+ font-size: inherit;
2311
+ line-height: 1.55;
919
2312
  font-weight: 500;
920
2313
  color: var(--fg-secondary);
921
2314
  border-bottom: 1px solid var(--border-subtle);
922
2315
  vertical-align: middle;
923
2316
  white-space: nowrap;
924
2317
  }
925
- .fractal-sortable-table-th + .fractal-sortable-table-th {
926
- border-left: 1px solid var(--border-subtle);
927
- }
928
2318
  .fractal-sortable-table-th--sortable {
929
2319
  padding: 0;
930
2320
  }
@@ -980,6 +2370,73 @@
980
2370
  .fractal-sortable-table-row--interactive {
981
2371
  cursor: pointer;
982
2372
  }
2373
+ .fractal-sortable-table-row--disabled {
2374
+ background: var(--bg-surface-1);
2375
+ opacity: 0.55;
2376
+ }
2377
+ .fractal-sortable-table-row--disabled:hover {
2378
+ background: var(--bg-surface-1);
2379
+ }
2380
+ .fractal-sortable-table-selection-cell {
2381
+ position: relative;
2382
+ width: 52px;
2383
+ min-width: 52px;
2384
+ padding: 0 !important;
2385
+ }
2386
+ .fractal-sortable-table-selection-cell > .fractal-checkbox {
2387
+ position: absolute;
2388
+ inset: 0;
2389
+ width: 100%;
2390
+ height: 100%;
2391
+ border-radius: 0;
2392
+ }
2393
+ .fractal-sortable-table-selection-cell > .fractal-checkbox:hover:not(:disabled) {
2394
+ background: var(--hover-surface);
2395
+ }
2396
+ .fractal-sortable-table-selection-cell > .fractal-checkbox:focus-visible {
2397
+ outline-offset: -2px;
2398
+ }
2399
+ .fractal-sortable-table-td--row-action {
2400
+ position: relative;
2401
+ }
2402
+ .fractal-sortable-table-td .fractal-dropdown-trigger--icon-only.fractal-dropdown-trigger--tertiary:hover {
2403
+ background: var(--bg-canvas);
2404
+ }
2405
+ .fractal-sortable-table-row-action {
2406
+ position: absolute;
2407
+ z-index: 1;
2408
+ top: 0;
2409
+ right: -1px;
2410
+ bottom: 0;
2411
+ display: flex;
2412
+ width: min(280px, calc(200% + 32px));
2413
+ align-items: center;
2414
+ justify-content: flex-end;
2415
+ padding-right: var(--space-4);
2416
+ background:
2417
+ linear-gradient(
2418
+ 90deg,
2419
+ transparent 0%,
2420
+ color-mix(in srgb, var(--hover-surface) 72%, transparent) 52%,
2421
+ var(--hover-surface) 100%);
2422
+ opacity: 0;
2423
+ pointer-events: none;
2424
+ transition: opacity 150ms ease-out;
2425
+ }
2426
+ .fractal-sortable-table-row--interactive:hover .fractal-sortable-table-row-action,
2427
+ .fractal-sortable-table-row--interactive:focus-visible .fractal-sortable-table-row-action {
2428
+ opacity: 1;
2429
+ }
2430
+ .fractal-sortable-table-row-action__icon {
2431
+ display: grid;
2432
+ width: 32px;
2433
+ height: 32px;
2434
+ place-items: center;
2435
+ border: 1px solid var(--border-default);
2436
+ border-radius: var(--radius-full);
2437
+ background: var(--bg-canvas);
2438
+ color: var(--fg-primary);
2439
+ }
983
2440
  .fractal-sortable-table-row--interactive:focus-visible {
984
2441
  position: relative;
985
2442
  z-index: 1;
@@ -997,27 +2454,37 @@
997
2454
  }
998
2455
  .fractal-sortable-table-td {
999
2456
  padding: 14px 16px;
2457
+ --table-cell-block-padding: 14px;
1000
2458
  color: var(--fg-primary);
1001
2459
  line-height: 1.55;
1002
- vertical-align: top;
2460
+ vertical-align: middle;
1003
2461
  overflow-wrap: anywhere;
1004
2462
  }
1005
- .fractal-sortable-table-td + .fractal-sortable-table-td {
1006
- border-left: 1px solid var(--border-subtle);
2463
+ .fractal-sortable-table--sm .fractal-sortable-table-th {
2464
+ --table-cell-block-padding: 8px;
1007
2465
  }
1008
- .fractal-sortable-table--sm .fractal-sortable-table-th,
1009
2466
  .fractal-sortable-table--sm .fractal-sortable-table-sort-button {
1010
2467
  padding: 8px 12px;
2468
+ --table-cell-block-padding: 8px;
1011
2469
  }
1012
2470
  .fractal-sortable-table--sm .fractal-sortable-table-td {
1013
2471
  padding: 10px 12px;
2472
+ --table-cell-block-padding: 10px;
2473
+ }
2474
+ .fractal-sortable-table--lg .fractal-sortable-table-th {
2475
+ --table-cell-block-padding: 18px;
1014
2476
  }
1015
- .fractal-sortable-table--lg .fractal-sortable-table-th,
1016
2477
  .fractal-sortable-table--lg .fractal-sortable-table-sort-button {
1017
2478
  padding: 18px 24px;
2479
+ --table-cell-block-padding: 18px;
1018
2480
  }
1019
2481
  .fractal-sortable-table--lg .fractal-sortable-table-td {
1020
2482
  padding: 22px 24px;
2483
+ --table-cell-block-padding: 22px;
2484
+ }
2485
+ .fractal-sortable-table-th + .fractal-sortable-table-th,
2486
+ .fractal-sortable-table-td + .fractal-sortable-table-td {
2487
+ border-inline-start: 1px solid var(--border-subtle);
1021
2488
  }
1022
2489
 
1023
2490
  /* src/components/Tabs/Tabs.css */
@@ -1026,17 +2493,60 @@
1026
2493
  font-size: 0.875rem;
1027
2494
  }
1028
2495
  .fractal-tabs-list {
2496
+ position: relative;
1029
2497
  display: flex;
1030
2498
  gap: 24px;
1031
- border-bottom: 1px solid var(--border-subtle);
1032
2499
  margin-bottom: var(--space-6);
1033
2500
  }
2501
+ .fractal-tabs--divider > .fractal-tabs-list {
2502
+ border-bottom: 1px solid var(--border-subtle);
2503
+ }
2504
+ .fractal-tabs--surface > .fractal-tabs-list {
2505
+ width: 100%;
2506
+ gap: 0;
2507
+ margin-bottom: 0;
2508
+ background: var(--bg-surface-1);
2509
+ }
2510
+ .fractal-tabs--surface > .fractal-tabs-list::before {
2511
+ position: absolute;
2512
+ z-index: 3;
2513
+ right: 0;
2514
+ bottom: 0;
2515
+ left: 0;
2516
+ height: 1px;
2517
+ background: var(--border-subtle);
2518
+ content: "";
2519
+ pointer-events: none;
2520
+ }
2521
+ .fractal-tabs-list::after {
2522
+ position: absolute;
2523
+ bottom: -1px;
2524
+ left: 0;
2525
+ width: var(--fractal-tabs-indicator-width, 0px);
2526
+ height: 2px;
2527
+ background: var(--accent-default);
2528
+ content: "";
2529
+ opacity: 0;
2530
+ transform: translateX(var(--fractal-tabs-indicator-offset, 0px));
2531
+ transition:
2532
+ transform 180ms var(--ease-standard, ease),
2533
+ width 180ms var(--ease-standard, ease),
2534
+ opacity 100ms ease;
2535
+ }
2536
+ .fractal-tabs-list[data-indicator-ready=true]::after {
2537
+ opacity: 1;
2538
+ }
2539
+ .fractal-tabs--surface > .fractal-tabs-list::after {
2540
+ display: none;
2541
+ }
1034
2542
  .fractal-tabs-trigger {
1035
2543
  position: relative;
1036
2544
  display: inline-flex;
2545
+ min-width: 88px;
1037
2546
  align-items: center;
2547
+ justify-content: center;
1038
2548
  gap: 6px;
1039
- padding: 10px 0;
2549
+ padding: 10px 1rem;
1040
2550
  background: none;
1041
2551
  border: 0;
1042
2552
  font: inherit;
@@ -1044,8 +2554,7 @@
1044
2554
  font-weight: 400;
1045
2555
  color: var(--fg-secondary);
1046
2556
  cursor: pointer;
1047
- transition: color 0.15s ease, box-shadow 0.15s ease;
1048
- box-shadow: inset 0 -1px 0 transparent;
2557
+ transition: color 0.15s ease;
1049
2558
  margin-bottom: -1px;
1050
2559
  }
1051
2560
  .fractal-tabs-trigger:hover:not(.fractal-tabs-trigger--active):not(.fractal-tabs-trigger--disabled) {
@@ -1059,7 +2568,21 @@
1059
2568
  .fractal-tabs-trigger--active {
1060
2569
  color: var(--accent-default);
1061
2570
  font-weight: 500;
1062
- box-shadow: inset 0 -1px 0 var(--accent-default);
2571
+ }
2572
+ .fractal-tabs:not(.fractal-tabs--divider):not(.fractal-tabs--surface) > .fractal-tabs-list > .fractal-tabs-trigger:not(.fractal-tabs-trigger--active) {
2573
+ box-shadow: inset 0 -1px 0 var(--border-subtle);
2574
+ }
2575
+ .fractal-tabs--surface > .fractal-tabs-list > .fractal-tabs-trigger {
2576
+ margin-bottom: 0;
2577
+ border-right: 1px solid var(--border-subtle);
2578
+ background: var(--bg-surface-1);
2579
+ }
2580
+ .fractal-tabs--surface > .fractal-tabs-list > .fractal-tabs-trigger:hover:not(.fractal-tabs-trigger--active):not(.fractal-tabs-trigger--disabled) {
2581
+ background: var(--hover-surface);
2582
+ }
2583
+ .fractal-tabs--surface > .fractal-tabs-list > .fractal-tabs-trigger--active {
2584
+ background: var(--bg-canvas);
2585
+ color: var(--fg-primary);
1063
2586
  }
1064
2587
  .fractal-tabs-trigger--disabled {
1065
2588
  color: var(--fg-disabled, var(--fg-secondary));
@@ -1073,6 +2596,94 @@
1073
2596
  .fractal-tabs-panel[hidden] {
1074
2597
  display: none;
1075
2598
  }
2599
+ @media (prefers-reduced-motion: reduce) {
2600
+ .fractal-tabs-list::after {
2601
+ transition: none;
2602
+ }
2603
+ }
2604
+
2605
+ /* src/components/ContentSwitcher/ContentSwitcher.css */
2606
+ .fractal-content-switcher {
2607
+ position: relative;
2608
+ display: inline-flex;
2609
+ gap: 2px;
2610
+ padding: 2px;
2611
+ border: 1px solid color-mix(in srgb, var(--border-subtle) 55%, transparent);
2612
+ border-radius: var(--radius-md);
2613
+ background: var(--bg-surface-subtle);
2614
+ font-family: var(--font-sans);
2615
+ }
2616
+ .fractal-content-switcher__indicator {
2617
+ position: absolute;
2618
+ top: 0;
2619
+ left: 0;
2620
+ width: var(--fractal-content-switcher-indicator-width, 0);
2621
+ height: var(--fractal-content-switcher-indicator-height, 0);
2622
+ border-radius: var(--radius-sm);
2623
+ background: var(--bg-canvas);
2624
+ box-shadow: var(--shadow-sm);
2625
+ opacity: 0;
2626
+ pointer-events: none;
2627
+ transform: translate3d(var(--fractal-content-switcher-indicator-x, 0), var(--fractal-content-switcher-indicator-y, 0), 0);
2628
+ }
2629
+ .fractal-content-switcher[data-indicator-ready=true] .fractal-content-switcher__indicator {
2630
+ opacity: 1;
2631
+ }
2632
+ .fractal-content-switcher[data-indicator-ready=true][data-indicator-animate=true] .fractal-content-switcher__indicator {
2633
+ transition:
2634
+ transform var(--duration-normal) var(--ease-in-out),
2635
+ width var(--duration-normal) var(--ease-in-out),
2636
+ height var(--duration-normal) var(--ease-in-out),
2637
+ opacity var(--duration-fast) var(--ease-out);
2638
+ }
2639
+ .fractal-content-switcher--full-width {
2640
+ display: flex;
2641
+ width: 100%;
2642
+ }
2643
+ .fractal-content-switcher__item {
2644
+ position: relative;
2645
+ z-index: 1;
2646
+ min-width: 128px;
2647
+ min-height: 40px;
2648
+ padding: 0 var(--space-4);
2649
+ border: 0;
2650
+ border-radius: var(--radius-sm);
2651
+ background: transparent;
2652
+ color: var(--fg-secondary);
2653
+ cursor: pointer;
2654
+ font: inherit;
2655
+ font-size: 0.875rem;
2656
+ line-height: 1.25;
2657
+ text-align: center;
2658
+ transition: background-color var(--duration-fast) var(--ease-out), color var(--duration-fast) var(--ease-out);
2659
+ }
2660
+ .fractal-content-switcher--full-width .fractal-content-switcher__item {
2661
+ flex: 1;
2662
+ }
2663
+ .fractal-content-switcher__item:hover:not(:disabled):not(.fractal-content-switcher__item--active) {
2664
+ background: var(--hover-surface);
2665
+ color: var(--fg-primary);
2666
+ }
2667
+ .fractal-content-switcher__item--active {
2668
+ background: transparent;
2669
+ color: var(--fg-primary);
2670
+ }
2671
+ .fractal-content-switcher__item:focus-visible {
2672
+ position: relative;
2673
+ z-index: 1;
2674
+ outline: 2px solid var(--border-focus);
2675
+ outline-offset: -2px;
2676
+ }
2677
+ .fractal-content-switcher__item:disabled {
2678
+ cursor: not-allowed;
2679
+ color: var(--fg-disabled);
2680
+ opacity: 0.5;
2681
+ }
2682
+ @media (prefers-reduced-motion: reduce) {
2683
+ .fractal-content-switcher[data-indicator-ready=true][data-indicator-animate=true] .fractal-content-switcher__indicator {
2684
+ transition: none;
2685
+ }
2686
+ }
1076
2687
 
1077
2688
  /* src/components/Disclosure/Disclosure.css */
1078
2689
  .fractal-disclosure {
@@ -1104,6 +2715,17 @@
1104
2715
  .fractal-disclosure-trigger:hover {
1105
2716
  background: var(--bg-surface-1);
1106
2717
  }
2718
+ .fractal-disclosure--disabled .fractal-disclosure-trigger {
2719
+ color: var(--fg-tertiary);
2720
+ cursor: not-allowed;
2721
+ }
2722
+ .fractal-disclosure--disabled .fractal-disclosure-trigger:hover {
2723
+ background: transparent;
2724
+ }
2725
+ .fractal-disclosure--disabled .fractal-disclosure-icon,
2726
+ .fractal-disclosure--disabled .fractal-disclosure-meta {
2727
+ color: var(--fg-tertiary);
2728
+ }
1107
2729
  .fractal-disclosure-trigger:focus-visible {
1108
2730
  outline: 2px solid var(--border-focus);
1109
2731
  outline-offset: -2px;
@@ -1146,9 +2768,378 @@
1146
2768
  padding: 4px 0 12px 24px;
1147
2769
  }
1148
2770
 
2771
+ /* src/components/LatticeLoader/LatticeLoader.css */
2772
+ .fractal-lattice-loader {
2773
+ display: flex;
2774
+ align-items: center;
2775
+ gap: 6px;
2776
+ width: 100%;
2777
+ height: 12px;
2778
+ overflow: hidden;
2779
+ color: var(--fg-secondary);
2780
+ }
2781
+ .fractal-lattice-loader__cell {
2782
+ position: relative;
2783
+ width: 12px;
2784
+ flex: 0 0 12px;
2785
+ aspect-ratio: 1;
2786
+ background: currentColor;
2787
+ -webkit-mask: url("./lattice-FAYE5KWW.svg") center / contain no-repeat;
2788
+ mask: url("./lattice-FAYE5KWW.svg") center / contain no-repeat;
2789
+ opacity: 0.08;
2790
+ animation: fractal-lattice-wave 3.2s ease-in-out infinite;
2791
+ animation-delay: calc((var(--fractal-lattice-index) * 40ms) - 3.2s);
2792
+ }
2793
+ @keyframes fractal-lattice-wave {
2794
+ 0%, 58%, 100% {
2795
+ opacity: 0.08;
2796
+ }
2797
+ 18% {
2798
+ opacity: 0.28;
2799
+ }
2800
+ 30% {
2801
+ opacity: 1;
2802
+ }
2803
+ 42% {
2804
+ opacity: 0.28;
2805
+ }
2806
+ }
2807
+ @media (prefers-reduced-motion: reduce) {
2808
+ .fractal-lattice-loader__cell {
2809
+ opacity: 0.35;
2810
+ animation: none;
2811
+ }
2812
+ }
2813
+
2814
+ /* src/components/Ghost/Ghost.css */
2815
+ .fractal-ghost {
2816
+ --fractal-ghost-base: var(--bg-surface-1);
2817
+ --fractal-ghost-shine: color-mix(in srgb, var(--bg-canvas) 82%, transparent);
2818
+ position: relative;
2819
+ display: block;
2820
+ min-width: 0;
2821
+ min-height: 1px;
2822
+ overflow: hidden;
2823
+ background: var(--fractal-ghost-base);
2824
+ border-radius: var(--radius-sm);
2825
+ }
2826
+ .fractal-ghost::after {
2827
+ position: absolute;
2828
+ top: 0;
2829
+ bottom: 0;
2830
+ left: -50%;
2831
+ width: 50%;
2832
+ background:
2833
+ linear-gradient(
2834
+ 105deg,
2835
+ transparent 0%,
2836
+ var(--fractal-ghost-shine) 50%,
2837
+ transparent 100%);
2838
+ content: "";
2839
+ pointer-events: none;
2840
+ transform: translate3d(-100%, 0, 0);
2841
+ animation: fractal-ghost-shine var(--duration-ambient) linear infinite;
2842
+ will-change: transform;
2843
+ }
2844
+ .fractal-ghost-line {
2845
+ height: 0.875rem;
2846
+ }
2847
+ .fractal-ghost-line--sm {
2848
+ height: 0.6875rem;
2849
+ }
2850
+ .fractal-ghost-line--lg {
2851
+ height: 1.125rem;
2852
+ }
2853
+ .fractal-ghost-stack {
2854
+ display: grid;
2855
+ gap: var(--space-2);
2856
+ }
2857
+ .fractal-ghost-button {
2858
+ height: var(--control-min-block-size);
2859
+ border-radius: var(--radius-full);
2860
+ }
2861
+ .fractal-ghost-button--sm {
2862
+ width: 84px;
2863
+ }
2864
+ .fractal-ghost-button--md {
2865
+ width: 96px;
2866
+ }
2867
+ .fractal-ghost-button--lg {
2868
+ width: 108px;
2869
+ }
2870
+ .fractal-ghost-button--xl {
2871
+ width: 128px;
2872
+ }
2873
+ .fractal-ghost-button--icon-only {
2874
+ width: var(--control-min-block-size);
2875
+ }
2876
+ .fractal-ghost-card {
2877
+ display: grid;
2878
+ gap: var(--space-4);
2879
+ padding: var(--space-5);
2880
+ border: 1px solid var(--border-subtle);
2881
+ border-radius: var(--radius-md);
2882
+ background: var(--bg-canvas);
2883
+ }
2884
+ .fractal-ghost-table {
2885
+ overflow: hidden;
2886
+ border: 1px solid var(--border-subtle);
2887
+ border-radius: var(--radius-md);
2888
+ background: var(--bg-canvas);
2889
+ }
2890
+ .fractal-ghost-table__table {
2891
+ width: 100%;
2892
+ border-collapse: separate;
2893
+ border-spacing: 0;
2894
+ }
2895
+ .fractal-ghost-table__head-row {
2896
+ background: var(--bg-surface-1);
2897
+ }
2898
+ .fractal-ghost-table th {
2899
+ padding: 12px 16px;
2900
+ border-bottom: 1px solid var(--border-subtle);
2901
+ color: var(--fg-secondary);
2902
+ font-size: 0.75rem;
2903
+ font-weight: 500;
2904
+ text-align: left;
2905
+ }
2906
+ .fractal-ghost-table td {
2907
+ padding: 14px 16px;
2908
+ }
2909
+ .fractal-ghost-table__row + .fractal-ghost-table__row td {
2910
+ border-top: 1px solid var(--border-subtle);
2911
+ }
2912
+ .fractal-ghost-table--sm th {
2913
+ padding: 8px 12px;
2914
+ }
2915
+ .fractal-ghost-table--sm td {
2916
+ padding: 10px 12px;
2917
+ }
2918
+ .fractal-ghost-table--lg th {
2919
+ padding: 18px 24px;
2920
+ }
2921
+ .fractal-ghost-table--lg td {
2922
+ padding: 22px 24px;
2923
+ }
2924
+ .fractal-ghost-field {
2925
+ display: grid;
2926
+ gap: var(--control-label-gap);
2927
+ }
2928
+ .fractal-ghost-field > .fractal-ghost-label {
2929
+ height: var(--control-line-height);
2930
+ }
2931
+ .fractal-ghost-field__control {
2932
+ box-sizing: border-box;
2933
+ width: 100%;
2934
+ height: var(--control-min-block-size);
2935
+ border: 1px solid var(--border-subtle);
2936
+ border-radius: var(--radius-md);
2937
+ }
2938
+ .fractal-ghost-field__control--multiline {
2939
+ height: 112px;
2940
+ }
2941
+ .fractal-ghost-label {
2942
+ border-radius: var(--radius-sm);
2943
+ }
2944
+ .fractal-ghost-alert {
2945
+ display: grid;
2946
+ gap: var(--space-2);
2947
+ padding: var(--space-4);
2948
+ border: 1px solid var(--border-subtle);
2949
+ border-radius: var(--radius-md);
2950
+ }
2951
+ .fractal-ghost-choice {
2952
+ display: flex;
2953
+ align-items: center;
2954
+ gap: var(--space-2);
2955
+ }
2956
+ .fractal-ghost-choice__control {
2957
+ width: 16px;
2958
+ height: 16px;
2959
+ border-radius: var(--radius-sm);
2960
+ }
2961
+ .fractal-ghost-chip {
2962
+ border-radius: var(--radius-full);
2963
+ }
2964
+ .fractal-ghost-link {
2965
+ display: inline-block;
2966
+ }
2967
+ .fractal-ghost-dropdown {
2968
+ display: flex;
2969
+ align-items: center;
2970
+ justify-content: space-between;
2971
+ box-sizing: border-box;
2972
+ width: 220px;
2973
+ height: var(--control-min-block-size);
2974
+ padding: 0 var(--control-padding-inline);
2975
+ border: 1px solid var(--border-subtle);
2976
+ border-radius: var(--radius-md);
2977
+ }
2978
+ .fractal-ghost-dropdown__chevron {
2979
+ width: 14px;
2980
+ height: 14px;
2981
+ border-radius: var(--radius-full);
2982
+ }
2983
+ .fractal-ghost-switcher {
2984
+ display: flex;
2985
+ width: fit-content;
2986
+ gap: 2px;
2987
+ padding: 3px;
2988
+ border-radius: var(--radius-md);
2989
+ background: var(--bg-surface-1);
2990
+ }
2991
+ .fractal-ghost-switcher > .fractal-ghost {
2992
+ width: 76px;
2993
+ height: 32px;
2994
+ border-radius: calc(var(--radius-md) - 2px);
2995
+ }
2996
+ .fractal-ghost-disclosure {
2997
+ display: flex;
2998
+ align-items: center;
2999
+ gap: var(--space-3);
3000
+ padding: var(--space-3) 0;
3001
+ border-bottom: 1px solid var(--border-subtle);
3002
+ }
3003
+ .fractal-ghost-disclosure__icon {
3004
+ width: 16px;
3005
+ height: 16px;
3006
+ border-radius: var(--radius-full);
3007
+ }
3008
+ .fractal-ghost-pagination {
3009
+ display: flex;
3010
+ gap: var(--space-2);
3011
+ }
3012
+ .fractal-ghost-pagination > .fractal-ghost {
3013
+ width: 32px;
3014
+ height: 32px;
3015
+ border-radius: var(--radius-md);
3016
+ }
3017
+ .fractal-ghost-dropzone {
3018
+ display: grid;
3019
+ place-items: center;
3020
+ gap: var(--space-3);
3021
+ min-height: 184px;
3022
+ padding: var(--space-6);
3023
+ border: 1px dashed var(--border-default);
3024
+ border-radius: var(--radius-md);
3025
+ }
3026
+ .fractal-ghost-dropzone__icon {
3027
+ width: 32px;
3028
+ height: 32px;
3029
+ border-radius: var(--radius-full);
3030
+ }
3031
+ .fractal-ghost-prompt-card {
3032
+ min-height: 176px;
3033
+ }
3034
+ .fractal-ghost-conversation {
3035
+ display: flex;
3036
+ width: 100%;
3037
+ min-width: 0;
3038
+ flex-direction: column;
3039
+ gap: var(--space-6);
3040
+ }
3041
+ .fractal-ghost-conversation__message {
3042
+ display: grid;
3043
+ width: min(92%, 42rem);
3044
+ min-width: 0;
3045
+ gap: var(--space-2);
3046
+ }
3047
+ .fractal-ghost-conversation__message--user {
3048
+ width: min(78%, 36rem);
3049
+ align-self: flex-end;
3050
+ }
3051
+ .fractal-ghost-conversation__bubble {
3052
+ --fractal-ghost-base: color-mix(in srgb, var(--accent-text) 12%, transparent);
3053
+ --fractal-ghost-shine: color-mix(in srgb, var(--accent-text) 5%, transparent);
3054
+ display: grid;
3055
+ gap: var(--space-2);
3056
+ padding: var(--space-4);
3057
+ border: 1px solid var(--accent-surface-stroke);
3058
+ border-radius: 12px 12px 4px;
3059
+ background: var(--accent-surface-stroke);
3060
+ }
3061
+ .fractal-ghost-sidebar {
3062
+ display: grid;
3063
+ align-content: start;
3064
+ gap: var(--space-7);
3065
+ width: 248px;
3066
+ min-height: 100%;
3067
+ padding: var(--space-5);
3068
+ border-right: 1px solid var(--border-subtle);
3069
+ background: var(--bg-canvas);
3070
+ }
3071
+ .fractal-ghost-sidebar__brand {
3072
+ width: 112px;
3073
+ height: 24px;
3074
+ }
3075
+ .fractal-ghost-sidebar__items {
3076
+ display: grid;
3077
+ gap: var(--space-2);
3078
+ }
3079
+ .fractal-ghost-sidebar__item {
3080
+ display: flex;
3081
+ align-items: center;
3082
+ gap: var(--space-3);
3083
+ height: 36px;
3084
+ padding: 0 var(--space-2);
3085
+ }
3086
+ .fractal-ghost-sidebar__item > .fractal-ghost {
3087
+ width: 16px;
3088
+ height: 16px;
3089
+ border-radius: var(--radius-sm);
3090
+ }
3091
+ .fractal-ghost-surface {
3092
+ display: grid;
3093
+ gap: var(--space-5);
3094
+ padding: var(--space-6);
3095
+ border: 1px solid var(--border-subtle);
3096
+ border-radius: var(--radius-lg);
3097
+ background: var(--bg-canvas);
3098
+ }
3099
+ .fractal-ghost-modal {
3100
+ width: min(100%, 420px);
3101
+ }
3102
+ .fractal-ghost-side-panel {
3103
+ width: min(100%, 540px);
3104
+ min-height: 480px;
3105
+ }
3106
+ .fractal-ghost-surface__header {
3107
+ display: flex;
3108
+ align-items: center;
3109
+ justify-content: space-between;
3110
+ }
3111
+ .fractal-ghost-surface__close {
3112
+ width: 28px;
3113
+ height: 28px;
3114
+ border-radius: var(--radius-md);
3115
+ }
3116
+ .fractal-ghost-surface__title {
3117
+ color: var(--fg-secondary);
3118
+ font-size: 0.75rem;
3119
+ }
3120
+ @keyframes fractal-ghost-shine {
3121
+ from {
3122
+ transform: translate3d(-100%, 0, 0);
3123
+ }
3124
+ to {
3125
+ transform: translate3d(300%, 0, 0);
3126
+ }
3127
+ }
3128
+ @media (prefers-reduced-motion: reduce) {
3129
+ .fractal-ghost::after {
3130
+ display: none;
3131
+ animation: none;
3132
+ }
3133
+ }
3134
+
1149
3135
  /* src/components/Sidebar/Sidebar.css */
3136
+ .fractal-sidebar:not([data-fractal-border-surface]) {
3137
+ --border-subtle: var(--border-on-surface-1);
3138
+ --border-default: var(--border-subtle);
3139
+ }
1150
3140
  .fractal-sidebar {
1151
3141
  --fractal-sidebar-width: 232px;
3142
+ --fractal-sidebar-compact-width: 56px;
1152
3143
  box-sizing: border-box;
1153
3144
  display: flex;
1154
3145
  width: var(--fractal-sidebar-width);
@@ -1156,42 +3147,117 @@
1156
3147
  min-height: 100%;
1157
3148
  flex-direction: column;
1158
3149
  background: var(--bg-surface-1);
1159
- border-right: 1px solid var(--nav-border);
3150
+ border-right: 1px solid var(--border-subtle);
1160
3151
  color: var(--fg-primary);
1161
3152
  font-family: var(--font-sans);
1162
3153
  }
3154
+ .fractal-sidebar[data-compact] {
3155
+ z-index: 10;
3156
+ width: var(--fractal-sidebar-compact-width);
3157
+ min-width: var(--fractal-sidebar-compact-width);
3158
+ overflow: hidden;
3159
+ transition:
3160
+ width var(--duration-normal) var(--ease-out),
3161
+ min-width var(--duration-normal) var(--ease-out),
3162
+ box-shadow var(--duration-normal) var(--ease-out);
3163
+ }
3164
+ .fractal-sidebar[data-compact]:hover,
3165
+ .fractal-sidebar[data-compact]:focus-within {
3166
+ width: var(--fractal-sidebar-width);
3167
+ min-width: var(--fractal-sidebar-width);
3168
+ box-shadow: var(--shadow-md);
3169
+ }
3170
+ .fractal-shell-header,
1163
3171
  .fractal-sidebar__header {
3172
+ box-sizing: border-box;
1164
3173
  display: flex;
1165
- min-height: 48px;
3174
+ block-size: var(--shell-header-height);
3175
+ min-block-size: var(--shell-header-height);
3176
+ max-block-size: var(--shell-header-height);
3177
+ min-inline-size: 0;
3178
+ flex-shrink: 0;
1166
3179
  align-items: center;
1167
- padding: 0 var(--space-4);
3180
+ padding-block: 0;
1168
3181
  border-bottom: 1px solid var(--border-subtle);
1169
3182
  }
3183
+ .fractal-shell-header {
3184
+ justify-content: space-between;
3185
+ gap: var(--space-4);
3186
+ padding-inline: var(--space-4);
3187
+ }
3188
+ .fractal-sidebar__header {
3189
+ padding-inline: var(--space-2);
3190
+ }
1170
3191
  .fractal-sidebar__brand {
1171
3192
  display: inline-flex;
1172
3193
  min-width: 0;
1173
3194
  align-items: center;
1174
3195
  gap: var(--space-2);
1175
- padding: var(--space-1);
3196
+ padding: var(--space-1);
3197
+ border: 0;
3198
+ border-radius: var(--radius-md);
3199
+ background: transparent;
3200
+ color: var(--fg-primary);
3201
+ cursor: pointer;
3202
+ font: inherit;
3203
+ text-align: left;
3204
+ transition: background-color var(--duration-fast) var(--ease-out), transform var(--duration-fast) var(--ease-out);
3205
+ }
3206
+ .fractal-sidebar__brand:hover {
3207
+ background: var(--nav-hover);
3208
+ }
3209
+ .fractal-sidebar__brand:active {
3210
+ transform: scale(0.98);
3211
+ }
3212
+ .fractal-sidebar__brand:focus-visible,
3213
+ .fractal-sidebar__nav-item:focus-visible,
3214
+ .fractal-sidebar__account-trigger:focus-visible {
3215
+ outline: 2px solid var(--border-focus);
3216
+ outline-offset: 2px;
3217
+ }
3218
+ .fractal-sidebar__account {
3219
+ display: block;
3220
+ width: 100%;
3221
+ }
3222
+ .fractal-sidebar__account-trigger {
3223
+ width: 100%;
3224
+ min-height: 36px;
3225
+ box-sizing: border-box;
3226
+ gap: var(--space-2);
3227
+ padding: 8px 10px;
1176
3228
  border: 0;
1177
- border-radius: var(--radius-md);
1178
3229
  background: transparent;
3230
+ border-radius: var(--radius-md);
1179
3231
  color: var(--fg-primary);
1180
- cursor: pointer;
1181
- font: inherit;
1182
- text-align: left;
1183
- transition: background-color var(--duration-fast) var(--ease-out), transform var(--duration-fast) var(--ease-out);
3232
+ font-weight: 500;
1184
3233
  }
1185
- .fractal-sidebar__brand:hover {
3234
+ .fractal-sidebar__account-trigger:hover,
3235
+ .fractal-sidebar__account-trigger.fractal-dropdown-trigger--tertiary:hover {
1186
3236
  background: var(--nav-hover);
1187
3237
  }
1188
- .fractal-sidebar__brand:active {
1189
- transform: scale(0.98);
3238
+ .fractal-sidebar__account-name {
3239
+ min-width: 0;
3240
+ flex: 1;
3241
+ overflow: hidden;
3242
+ text-overflow: ellipsis;
3243
+ white-space: nowrap;
1190
3244
  }
1191
- .fractal-sidebar__brand:focus-visible,
1192
- .fractal-sidebar__nav-item:focus-visible {
1193
- outline: 2px solid var(--border-focus);
1194
- outline-offset: 2px;
3245
+ .fractal-sidebar__account-icon {
3246
+ display: inline-flex;
3247
+ width: 18px;
3248
+ height: 18px;
3249
+ flex: 0 0 18px;
3250
+ align-items: center;
3251
+ justify-content: center;
3252
+ }
3253
+ .fractal-sidebar__account-icon > img,
3254
+ .fractal-sidebar__account-icon > svg {
3255
+ display: block;
3256
+ width: 18px;
3257
+ height: 18px;
3258
+ }
3259
+ .fractal-sidebar__account-panel {
3260
+ min-width: 100%;
1195
3261
  }
1196
3262
  .fractal-sidebar__nav {
1197
3263
  display: flex;
@@ -1284,6 +3350,7 @@
1284
3350
  border-top: 1px solid var(--border-subtle);
1285
3351
  }
1286
3352
  @media (prefers-reduced-motion: reduce) {
3353
+ .fractal-sidebar[data-compact],
1287
3354
  .fractal-sidebar__brand,
1288
3355
  .fractal-sidebar__nav-item {
1289
3356
  transition: none;
@@ -1298,7 +3365,7 @@
1298
3365
  display: flex;
1299
3366
  justify-content: flex-end;
1300
3367
  background: color-mix(in srgb, var(--fg-primary) 16%, transparent);
1301
- animation: fractal-side-panel-overlay-in 180ms ease-out both;
3368
+ animation: fractal-side-panel-overlay-in var(--duration-normal) var(--ease-out) both;
1302
3369
  }
1303
3370
  .fractal-side-panel {
1304
3371
  display: flex;
@@ -1310,7 +3377,7 @@
1310
3377
  box-shadow: var(--shadow-lg);
1311
3378
  color: var(--fg-primary);
1312
3379
  font-family: var(--font-sans);
1313
- animation: fractal-side-panel-in 180ms cubic-bezier(0.16, 1, 0.3, 1) both;
3380
+ animation: fractal-side-panel-in var(--duration-normal) var(--ease-out) both;
1314
3381
  }
1315
3382
  .fractal-side-panel--sm {
1316
3383
  width: min(100vw, 420px);
@@ -1321,9 +3388,11 @@
1321
3388
  .fractal-side-panel--lg {
1322
3389
  width: min(100vw, 680px);
1323
3390
  }
3391
+ .fractal-side-panel--xl {
3392
+ width: min(100vw, 960px);
3393
+ }
1324
3394
  .fractal-side-panel__header {
1325
3395
  display: flex;
1326
- min-height: 72px;
1327
3396
  align-items: flex-start;
1328
3397
  justify-content: space-between;
1329
3398
  gap: var(--space-4);
@@ -1333,6 +3402,9 @@
1333
3402
  min-width: 0;
1334
3403
  }
1335
3404
  .fractal-side-panel__title {
3405
+ display: flex;
3406
+ min-height: 32px;
3407
+ align-items: center;
1336
3408
  margin: 0;
1337
3409
  font-size: 1rem;
1338
3410
  font-weight: 500;
@@ -1370,12 +3442,42 @@
1370
3442
  overflow: auto;
1371
3443
  padding: var(--space-2) var(--space-6) var(--space-6);
1372
3444
  }
3445
+ .fractal-side-panel__body--loading {
3446
+ display: grid;
3447
+ place-items: center;
3448
+ }
1373
3449
  .fractal-side-panel__footer {
1374
3450
  display: flex;
1375
3451
  justify-content: flex-end;
1376
3452
  gap: var(--space-2);
1377
3453
  padding: var(--space-4) var(--space-6);
1378
- border-top: 1px solid var(--border-subtle);
3454
+ border-top: 1px solid transparent;
3455
+ }
3456
+ .fractal-side-panel__header,
3457
+ .fractal-side-panel__footer {
3458
+ position: relative;
3459
+ flex-shrink: 0;
3460
+ }
3461
+ .fractal-side-panel__header::after,
3462
+ .fractal-side-panel__footer::before {
3463
+ content: "";
3464
+ position: absolute;
3465
+ inset-inline: 0;
3466
+ height: 1px;
3467
+ background: var(--border-subtle);
3468
+ opacity: 0;
3469
+ pointer-events: none;
3470
+ transition: opacity var(--duration-fast) var(--ease-out);
3471
+ }
3472
+ .fractal-side-panel__header::after {
3473
+ bottom: 0;
3474
+ }
3475
+ .fractal-side-panel__footer::before {
3476
+ top: -1px;
3477
+ }
3478
+ .fractal-side-panel__header[data-scroll-divider=true]::after,
3479
+ .fractal-side-panel__footer[data-scroll-divider=true]::before {
3480
+ opacity: 1;
1379
3481
  }
1380
3482
  @media (max-width: 640px) {
1381
3483
  .fractal-side-panel {
@@ -1410,7 +3512,11 @@
1410
3512
  @media (prefers-reduced-motion: reduce) {
1411
3513
  .fractal-side-panel-overlay,
1412
3514
  .fractal-side-panel {
1413
- animation-duration: 0.01ms;
3515
+ animation: none;
3516
+ }
3517
+ .fractal-side-panel__header::after,
3518
+ .fractal-side-panel__footer::before {
3519
+ transition: none;
1414
3520
  }
1415
3521
  }
1416
3522
 
@@ -1420,7 +3526,7 @@
1420
3526
  width: 100%;
1421
3527
  min-height: 120px;
1422
3528
  resize: vertical;
1423
- border: 1px solid var(--border-default);
3529
+ border: 1px solid var(--border-subtle);
1424
3530
  border-radius: var(--radius-md);
1425
3531
  background: var(--bg-canvas);
1426
3532
  padding: var(--space-3);
@@ -1430,19 +3536,74 @@
1430
3536
  .fractal-textarea::placeholder {
1431
3537
  color: var(--fg-placeholder);
1432
3538
  }
1433
- .fractal-textarea:hover {
1434
- border-color: var(--fg-tertiary);
1435
- }
1436
3539
  .fractal-textarea:focus-visible {
1437
3540
  outline: none;
1438
3541
  border-color: var(--border-focus);
1439
- box-shadow: 0 0 0 2px var(--accent-surface);
3542
+ box-shadow: 0 0 0 3px var(--focus-surface);
1440
3543
  }
1441
3544
  .fractal-textarea:disabled {
1442
3545
  cursor: not-allowed;
1443
3546
  opacity: 0.5;
1444
3547
  background: var(--bg-surface-1);
1445
3548
  }
3549
+ .fractal-textarea[data-text-style=prose] {
3550
+ font-family: var(--font-sans);
3551
+ font-size: var(--control-md-font-size);
3552
+ line-height: var(--control-md-line-height);
3553
+ }
3554
+ .fractal-floating-field--textarea > .fractal-floating-field__label {
3555
+ transform: translateY(calc(var(--space-3) + 1px));
3556
+ }
3557
+ .fractal-floating-field--textarea:where(:focus-within, :has(textarea:not(:placeholder-shown))) > .fractal-floating-field__label {
3558
+ transform: translateY(-50%) scale(0.75);
3559
+ }
3560
+
3561
+ /* src/components/TextButton/TextButton.css */
3562
+ .fractal-text-button {
3563
+ display: inline-flex;
3564
+ align-items: center;
3565
+ gap: var(--space-1);
3566
+ border: 0;
3567
+ background: transparent;
3568
+ cursor: pointer;
3569
+ font-family: var(--font-sans);
3570
+ font-weight: 500;
3571
+ line-height: 1.4;
3572
+ padding: 0;
3573
+ text-align: left;
3574
+ transition: color 120ms ease;
3575
+ }
3576
+ .fractal-text-button--primary {
3577
+ color: var(--fg-primary);
3578
+ }
3579
+ .fractal-text-button--primary:hover:not(:disabled) {
3580
+ color: var(--fg-secondary);
3581
+ }
3582
+ .fractal-text-button--secondary {
3583
+ color: var(--fg-secondary);
3584
+ }
3585
+ .fractal-text-button--secondary:hover:not(:disabled) {
3586
+ color: var(--fg-primary);
3587
+ }
3588
+ .fractal-text-button:focus-visible {
3589
+ outline: 2px solid var(--border-focus);
3590
+ outline-offset: 3px;
3591
+ border-radius: var(--radius-sm);
3592
+ }
3593
+ .fractal-text-button:disabled {
3594
+ cursor: not-allowed;
3595
+ opacity: 0.5;
3596
+ }
3597
+ .fractal-text-button--sm {
3598
+ font-size: 0.8125rem;
3599
+ }
3600
+ .fractal-text-button--md {
3601
+ font-size: 0.875rem;
3602
+ }
3603
+ .fractal-text-button__icon {
3604
+ display: inline-grid;
3605
+ place-items: center;
3606
+ }
1446
3607
 
1447
3608
  /* src/components/FileDropzone/FileDropzone.css */
1448
3609
  .fractal-file-dropzone {
@@ -1452,13 +3613,7 @@
1452
3613
  font-family: var(--font-sans);
1453
3614
  }
1454
3615
  .fractal-file-dropzone__input {
1455
- position: absolute;
1456
- width: 1px;
1457
- height: 1px;
1458
- overflow: hidden;
1459
- clip: rect(0 0 0 0);
1460
- clip-path: inset(50%);
1461
- white-space: nowrap;
3616
+ display: none;
1462
3617
  }
1463
3618
  .fractal-file-dropzone__target {
1464
3619
  display: flex;
@@ -1557,4 +3712,238 @@
1557
3712
  cursor: not-allowed;
1558
3713
  opacity: 0.5;
1559
3714
  }
3715
+
3716
+ /* src/components/Pagination/Pagination.css */
3717
+ .fractal-pagination {
3718
+ display: flex;
3719
+ align-items: center;
3720
+ justify-content: space-between;
3721
+ gap: var(--space-3);
3722
+ color: var(--fg-secondary);
3723
+ font-family: var(--font-sans);
3724
+ font-size: 0.8125rem;
3725
+ line-height: 1.4;
3726
+ }
3727
+ .fractal-pagination__controls {
3728
+ display: flex;
3729
+ align-items: center;
3730
+ gap: var(--space-2);
3731
+ }
3732
+ .fractal-pagination__page-size .fractal-dropdown-trigger {
3733
+ padding: 4px 0;
3734
+ border: 0;
3735
+ background: transparent;
3736
+ color: var(--fg-secondary);
3737
+ }
3738
+ .fractal-pagination__page-size .fractal-dropdown-trigger:hover {
3739
+ background: transparent;
3740
+ color: var(--fg-primary);
3741
+ }
3742
+ .fractal-pagination__button {
3743
+ display: grid;
3744
+ width: 28px;
3745
+ height: 28px;
3746
+ place-items: center;
3747
+ border: 1px solid var(--border-default);
3748
+ border-radius: var(--radius-sm);
3749
+ background: var(--bg-canvas);
3750
+ color: var(--fg-secondary);
3751
+ cursor: pointer;
3752
+ }
3753
+ .fractal-pagination__button:hover:not(:disabled) {
3754
+ background: var(--hover-surface);
3755
+ color: var(--fg-primary);
3756
+ }
3757
+ .fractal-pagination__button:focus-visible {
3758
+ outline: 2px solid var(--border-focus);
3759
+ outline-offset: 2px;
3760
+ }
3761
+ .fractal-pagination__button:disabled {
3762
+ cursor: not-allowed;
3763
+ opacity: 0.45;
3764
+ }
3765
+ .fractal-pagination__page {
3766
+ min-width: 44px;
3767
+ text-align: center;
3768
+ white-space: nowrap;
3769
+ }
3770
+
3771
+ /* src/components/ColumnEditor/ColumnEditor.css */
3772
+ .fractal-column-editor {
3773
+ position: relative;
3774
+ }
3775
+ .fractal-column-editor__panel {
3776
+ position: absolute;
3777
+ z-index: 60;
3778
+ top: calc(100% + var(--space-2));
3779
+ right: 0;
3780
+ width: min(440px, calc(100vw - var(--space-7)));
3781
+ box-sizing: border-box;
3782
+ padding: var(--space-4);
3783
+ border: 1px solid var(--border-subtle);
3784
+ border-radius: var(--radius-lg);
3785
+ background: var(--bg-canvas);
3786
+ box-shadow: var(--shadow-md);
3787
+ max-height: 72dvh;
3788
+ overflow-y: auto;
3789
+ font-family: var(--font-sans);
3790
+ font-size: .875rem;
3791
+ }
3792
+ .fractal-column-editor__panel:focus-visible {
3793
+ outline: 2px solid var(--border-focus);
3794
+ outline-offset: 2px;
3795
+ }
3796
+ .fractal-column-editor__list {
3797
+ display: grid;
3798
+ gap: var(--space-2);
3799
+ padding: 0;
3800
+ margin: 0;
3801
+ list-style: none;
3802
+ min-height: var(--space-4);
3803
+ }
3804
+ .fractal-column-editor__row {
3805
+ display: flex;
3806
+ align-items: center;
3807
+ gap: var(--space-2);
3808
+ padding: var(--space-2);
3809
+ border: 1px solid var(--border-subtle);
3810
+ border-radius: var(--radius-md);
3811
+ color: var(--fg-primary);
3812
+ background: var(--bg-canvas);
3813
+ cursor: grab;
3814
+ user-select: none;
3815
+ touch-action: none;
3816
+ transition: background-color var(--duration-fast) var(--ease-out), border-color var(--duration-fast) var(--ease-out);
3817
+ }
3818
+ .fractal-column-editor__row[data-hidden] {
3819
+ color: var(--fg-disabled);
3820
+ background: var(--bg-surface-1);
3821
+ }
3822
+ .fractal-column-editor__row:hover {
3823
+ background: var(--hover-surface);
3824
+ }
3825
+ .fractal-column-editor__row[data-dragging] {
3826
+ cursor: grabbing;
3827
+ background: var(--nav-selected);
3828
+ border-color: var(--border-focus);
3829
+ }
3830
+ .fractal-column-editor__grip {
3831
+ width: 20px;
3832
+ height: 20px;
3833
+ flex-shrink: 0;
3834
+ color: inherit;
3835
+ pointer-events: none;
3836
+ }
3837
+ .fractal-column-editor__name {
3838
+ min-width: 0;
3839
+ pointer-events: none;
3840
+ }
3841
+ .fractal-column-editor__actions {
3842
+ display: flex;
3843
+ flex-shrink: 0;
3844
+ margin-left: auto;
3845
+ cursor: default;
3846
+ }
3847
+ .fractal-column-editor__actions .fractal-button {
3848
+ cursor: pointer !important;
3849
+ color: var(--fg-secondary);
3850
+ }
3851
+ .fractal-column-editor__actions .fractal-button:hover:not(:disabled) {
3852
+ background: var(--bg-surface-2) !important;
3853
+ }
3854
+ .fractal-column-editor__actions .fractal-button:disabled {
3855
+ pointer-events: auto;
3856
+ cursor: pointer !important;
3857
+ }
3858
+ .fractal-column-editor__divider {
3859
+ display: flex;
3860
+ align-items: center;
3861
+ gap: var(--space-3);
3862
+ margin-block: var(--space-6);
3863
+ color: var(--fg-tertiary);
3864
+ }
3865
+ .fractal-column-editor__divider::before,
3866
+ .fractal-column-editor__divider::after {
3867
+ content: "";
3868
+ flex: 1;
3869
+ border-top: 1px solid var(--border-subtle);
3870
+ }
3871
+ .fractal-column-editor__divider > span {
3872
+ display: flex;
3873
+ gap: var(--space-2);
3874
+ align-items: center;
3875
+ white-space: nowrap;
3876
+ }
3877
+ .fractal-column-editor__divider svg {
3878
+ width: 20px;
3879
+ height: 20px;
3880
+ }
3881
+ .fractal-column-editor__empty {
3882
+ margin: 0;
3883
+ padding-block: var(--space-4);
3884
+ color: var(--fg-tertiary);
3885
+ }
3886
+ .fractal-column-editor__announcement {
3887
+ position: absolute;
3888
+ width: 1px;
3889
+ height: 1px;
3890
+ overflow: hidden;
3891
+ clip-path: inset(50%);
3892
+ white-space: nowrap;
3893
+ }
3894
+ @media (prefers-reduced-motion: reduce) {
3895
+ .fractal-column-editor__row {
3896
+ transition: none;
3897
+ }
3898
+ }
3899
+ .fractal-column-editor__panel[data-dragging],
3900
+ .fractal-column-editor__panel[data-dragging] .fractal-column-editor__row {
3901
+ cursor: grabbing;
3902
+ }
3903
+
3904
+ /* src/components/Tooltip/Tooltip.css */
3905
+ .fractal-tooltip {
3906
+ z-index: 10000;
3907
+ box-sizing: border-box;
3908
+ width: max-content;
3909
+ max-width: min(var(--tooltip-max-width), var(--radix-tooltip-content-available-width));
3910
+ padding: var(--space-2) var(--space-3);
3911
+ border: 1px solid transparent;
3912
+ border-radius: var(--radius-sm);
3913
+ background: var(--bg-inverse);
3914
+ color: var(--fg-inverse);
3915
+ font-family: var(--font-sans);
3916
+ font-size: 0.75rem;
3917
+ font-weight: 400;
3918
+ line-height: 1.4;
3919
+ overflow-wrap: anywhere;
3920
+ animation: fractal-tooltip-enter var(--duration-normal) var(--ease-out);
3921
+ }
3922
+ .fractal-tooltip-arrow {
3923
+ fill: var(--bg-inverse);
3924
+ }
3925
+ .fractal-tooltip[data-state=closed] {
3926
+ animation: fractal-tooltip-exit var(--duration-fast) var(--ease-in) forwards;
3927
+ }
3928
+ @keyframes fractal-tooltip-enter {
3929
+ from {
3930
+ opacity: 0;
3931
+ }
3932
+ to {
3933
+ opacity: 1;
3934
+ }
3935
+ }
3936
+ @keyframes fractal-tooltip-exit {
3937
+ from {
3938
+ opacity: 1;
3939
+ }
3940
+ to {
3941
+ opacity: 0;
3942
+ }
3943
+ }
3944
+ @media (prefers-reduced-motion: reduce) {
3945
+ .fractal-tooltip {
3946
+ animation: none;
3947
+ }
3948
+ }
1560
3949
  /*# sourceMappingURL=index.css.map */