@mirror-physics/fractal-ui 0.2.0-next.8 → 0.2.0-next.80

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);
@@ -31,6 +81,189 @@
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
+
107
+ /* src/components/CodeBlock/CodeBlock.css */
108
+ .fractal-code-block {
109
+ position: relative;
110
+ min-width: 0;
111
+ overflow: hidden;
112
+ border: 1px solid var(--border-subtle);
113
+ border-radius: var(--radius-md, 8px);
114
+ background: var(--bg-canvas);
115
+ color: var(--fg-primary);
116
+ font-family: var(--font-sans);
117
+ }
118
+ .fractal-code-block:focus-within {
119
+ border-color: var(--border-focus);
120
+ box-shadow: 0 0 0 1px var(--border-focus);
121
+ }
122
+ .fractal-code-block__toolbar {
123
+ display: flex;
124
+ min-height: 32px;
125
+ align-items: center;
126
+ justify-content: space-between;
127
+ gap: var(--space-3, 12px);
128
+ padding: 4px 6px 4px 12px;
129
+ border-bottom: 1px solid var(--border-subtle);
130
+ background: var(--bg-surface-1);
131
+ }
132
+ .fractal-code-block__identity {
133
+ display: flex;
134
+ min-width: 0;
135
+ align-items: center;
136
+ gap: var(--space-2, 8px);
137
+ }
138
+ .fractal-code-block__label {
139
+ overflow: hidden;
140
+ color: var(--fg-secondary);
141
+ font: 500 0.6875rem/1.4 var(--font-mono);
142
+ text-overflow: ellipsis;
143
+ white-space: nowrap;
144
+ }
145
+ .fractal-code-block__language,
146
+ .fractal-code-block__mode {
147
+ flex: 0 0 auto;
148
+ color: var(--fg-tertiary);
149
+ font-size: 0.6875rem;
150
+ line-height: 1.4;
151
+ }
152
+ .fractal-code-block__language::before {
153
+ margin-right: var(--space-2, 8px);
154
+ color: var(--border-strong);
155
+ content: "\b7";
156
+ }
157
+ .fractal-code-block__mode {
158
+ padding: 1px 6px;
159
+ border-radius: var(--radius-full, 9999px);
160
+ background: var(--accent-surface);
161
+ color: var(--accent-text);
162
+ }
163
+ .fractal-code-block__copy {
164
+ display: inline-flex;
165
+ min-height: 24px;
166
+ flex: 0 0 auto;
167
+ align-items: center;
168
+ gap: 5px;
169
+ padding: 3px 7px;
170
+ border: 0;
171
+ border-radius: var(--radius-sm, 4px);
172
+ background: transparent;
173
+ color: var(--fg-tertiary);
174
+ font: 500 0.6875rem/1 var(--font-sans);
175
+ cursor: pointer;
176
+ }
177
+ .fractal-code-block__copy:hover {
178
+ background: var(--hover-surface);
179
+ color: var(--fg-primary);
180
+ }
181
+ .fractal-code-block__copy:focus-visible {
182
+ outline: 2px solid var(--border-focus);
183
+ outline-offset: 1px;
184
+ }
185
+ .fractal-code-block__copy svg {
186
+ flex: 0 0 auto;
187
+ }
188
+ .fractal-code-block__surface {
189
+ min-width: 0;
190
+ background: var(--bg-canvas);
191
+ }
192
+ .fractal-code-block__surface .cm-editor {
193
+ min-width: 0;
194
+ }
195
+ .fractal-code-block--no-line-numbers .cm-content {
196
+ padding-block: 10px;
197
+ }
198
+ .fractal-code-block__status {
199
+ position: absolute;
200
+ width: 1px;
201
+ height: 1px;
202
+ overflow: hidden;
203
+ clip: rect(0 0 0 0);
204
+ clip-path: inset(50%);
205
+ white-space: nowrap;
206
+ }
207
+ @media (prefers-reduced-motion: reduce) {
208
+ .fractal-code-block,
209
+ .fractal-code-block__copy {
210
+ transition: none;
211
+ }
212
+ }
213
+
214
+ /* src/components/Breadcrumbs/Breadcrumbs.css */
215
+ .fractal-breadcrumbs {
216
+ min-width: 0;
217
+ color: var(--fg-primary);
218
+ font-family: var(--font-sans);
219
+ font-size: 0.875rem;
220
+ line-height: 1.4;
221
+ }
222
+ .fractal-breadcrumbs__list {
223
+ display: flex;
224
+ min-width: 0;
225
+ align-items: center;
226
+ margin: 0;
227
+ padding: 0;
228
+ list-style: none;
229
+ }
230
+ .fractal-breadcrumbs__item {
231
+ display: flex;
232
+ min-width: 0;
233
+ align-items: center;
234
+ gap: var(--space-1);
235
+ }
236
+ .fractal-breadcrumbs__separator {
237
+ display: inline-grid;
238
+ flex: 0 0 auto;
239
+ place-items: center;
240
+ color: var(--fg-tertiary);
241
+ }
242
+ .fractal-breadcrumbs__link,
243
+ .fractal-breadcrumbs__current {
244
+ min-width: 0;
245
+ overflow: hidden;
246
+ text-overflow: ellipsis;
247
+ white-space: nowrap;
248
+ }
249
+ .fractal-breadcrumbs__link {
250
+ color: var(--fg-tertiary);
251
+ font: inherit;
252
+ text-decoration: none;
253
+ transition: color 120ms ease;
254
+ }
255
+ .fractal-breadcrumbs__link:hover {
256
+ color: var(--fg-primary);
257
+ }
258
+ .fractal-breadcrumbs__link:focus-visible {
259
+ border-radius: var(--radius-sm);
260
+ outline: 2px solid var(--border-focus);
261
+ outline-offset: 2px;
262
+ }
263
+ .fractal-breadcrumbs__current {
264
+ color: var(--fg-primary);
265
+ font-weight: 500;
266
+ }
34
267
 
35
268
  /* src/components/Card/Card.css */
36
269
  .fractal-card {
@@ -38,7 +271,7 @@
38
271
  border: 1px solid var(--border-subtle);
39
272
  background-color: var(--bg-surface-1);
40
273
  color: var(--fg-primary);
41
- box-shadow: var(--shadow-xs);
274
+ box-shadow: none;
42
275
  font-family: var(--font-sans);
43
276
  }
44
277
  .fractal-card-header {
@@ -334,16 +567,12 @@
334
567
 
335
568
  /* src/components/Input/Input.css */
336
569
  .fractal-input {
337
- display: flex;
338
- height: 40px;
570
+ display: block;
571
+ min-width: 0;
339
572
  width: 100%;
340
573
  border-radius: var(--radius-sm, 4px);
341
574
  border: 1px solid var(--border-default);
342
575
  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
576
  color: var(--fg-primary);
348
577
  transition: border-color 0.15s ease, box-shadow 0.15s ease;
349
578
  box-sizing: border-box;
@@ -366,125 +595,605 @@
366
595
  background: transparent;
367
596
  font-size: 0.875rem;
368
597
  height: auto;
598
+ min-block-size: 0;
369
599
  padding: 0;
370
600
  }
371
601
 
372
- /* src/components/Label/Label.css */
373
- .fractal-label {
374
- font-size: 0.875rem;
375
- font-weight: 500;
376
- line-height: 1;
602
+ /* src/styles/floating-field.css */
603
+ .fractal-floating-field {
604
+ position: relative;
605
+ min-width: 0;
606
+ width: 100%;
607
+ --field-label-inset: var(--control-padding-inline);
608
+ }
609
+ .fractal-floating-field__label {
610
+ position: absolute;
611
+ z-index: 2;
612
+ top: 0;
613
+ left: calc(var(--field-label-inset, var(--control-padding-inline)) - 4px);
614
+ max-width: calc(100% - var(--field-label-inset, var(--control-padding-inline)) - var(--control-padding-inline));
615
+ padding-inline: 4px;
616
+ overflow: hidden;
617
+ white-space: nowrap;
618
+ text-overflow: ellipsis;
619
+ font-family: var(--font-sans);
620
+ font-size: var(--control-font-size);
621
+ line-height: var(--control-line-height);
622
+ font-weight: 400;
377
623
  color: var(--fg-primary);
624
+ transform-origin: left center;
625
+ transform: translateY(calc((var(--control-min-block-size) - 100%) / 2));
626
+ transition: transform var(--duration-normal) var(--ease-out), color var(--duration-fast) var(--ease-out);
627
+ cursor: text;
378
628
  }
379
- .fractal-label[data-disabled] {
629
+ .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 {
630
+ transform: translateY(-50%) scale(0.75);
631
+ background: var(--bg-canvas);
632
+ color: var(--fg-secondary);
633
+ }
634
+ .fractal-floating-field:is(:focus-within, [data-open=true]) > .fractal-floating-field__label {
635
+ color: var(--fg-primary);
636
+ }
637
+ .fractal-floating-field:has(:disabled) > .fractal-floating-field__label {
638
+ color: var(--fg-disabled);
380
639
  cursor: not-allowed;
381
- opacity: 0.7;
382
640
  }
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);
641
+ .fractal-floating-field:not(:focus-within) input:placeholder-shown::placeholder,
642
+ .fractal-floating-field:not(:focus-within) textarea:placeholder-shown::placeholder {
643
+ color: transparent;
394
644
  }
395
- .fractal-alert-icon {
396
- flex-shrink: 0;
645
+ .fractal-floating-field[data-always-float=true] input::placeholder {
646
+ color: var(--fg-placeholder);
647
+ }
648
+ .fractal-floating-field--dropdown:not(:focus-within):not([data-open=true]):not([data-filled=true]) .fractal-dropdown-field-value {
649
+ opacity: 0;
650
+ }
651
+ .fractal-dropdown-field-value {
397
652
  display: flex;
398
653
  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;
654
+ gap: var(--control-icon-gap);
409
655
  min-width: 0;
656
+ overflow: hidden;
410
657
  }
411
- .fractal-alert-title {
412
- margin: 0 0 4px 0;
413
- font-size: 0.875rem;
414
- font-weight: 500;
415
- line-height: 1.4;
416
- }
417
- .fractal-alert-description {
418
- font-size: 0.875rem;
419
- line-height: 1.5;
420
- }
421
- .fractal-alert--default {
422
- background-color: var(--bg-canvas);
423
- border-color: var(--border-default);
424
- color: var(--fg-primary);
658
+ .fractal-floating-field--dropdown > .fractal-floating-field__label {
659
+ cursor: pointer;
660
+ max-width: calc(100% - 2 * var(--control-padding-inline) - var(--control-icon-size) - var(--control-icon-gap));
425
661
  }
426
- .fractal-alert--default .fractal-alert-icon {
427
- background: var(--bg-surface-2);
428
- color: var(--fg-secondary);
662
+ .fractal-floating-field--textarea {
663
+ --control-min-block-size: calc(var(--control-line-height) + 2 * var(--space-3) + 2px);
664
+ --field-label-inset: var(--space-3);
429
665
  }
430
- .fractal-alert--info {
431
- background-color: var(--accent-surface);
432
- border-color: var(--accent-default);
433
- color: var(--fg-primary);
666
+ @media (prefers-reduced-motion: reduce) {
667
+ .fractal-floating-field__label {
668
+ transition: none;
669
+ }
434
670
  }
435
- .fractal-alert--info .fractal-alert-icon {
436
- background: var(--accent-default);
437
- color: var(--fg-inverse);
671
+ .fractal-floating-field--dropdown > .fractal-dropdown-trigger {
672
+ width: 100%;
438
673
  }
439
- .fractal-alert--success {
440
- background-color: var(--success-surface);
441
- border-color: var(--success-default);
442
- color: var(--fg-primary);
674
+ .fractal-floating-field > textarea {
675
+ box-sizing: border-box;
443
676
  }
444
- .fractal-alert--success .fractal-alert-icon {
445
- background: var(--success-default);
446
- color: var(--fg-inverse);
677
+
678
+ /* src/components/TableSearch/TableSearch.css */
679
+ .fractal-table-search {
680
+ position: relative;
681
+ width: 100%;
447
682
  }
448
- .fractal-alert--warning {
449
- background-color: var(--warning-surface);
450
- border-color: var(--warning-default);
451
- color: var(--fg-primary);
683
+ .fractal-table-search__icon {
684
+ position: absolute;
685
+ z-index: 1;
686
+ top: 50%;
687
+ left: calc(var(--control-padding-inline) + var(--control-border-width));
688
+ width: var(--control-icon-size);
689
+ height: var(--control-icon-size);
690
+ color: var(--fg-secondary);
691
+ pointer-events: none;
692
+ transform: translateY(-50%);
452
693
  }
453
- .fractal-alert--warning .fractal-alert-icon {
454
- background: var(--warning-default);
455
- color: var(--fg-inverse);
694
+ .fractal-table-search__input {
695
+ padding-left: calc(var(--control-padding-inline) + var(--control-icon-size) + var(--control-icon-gap));
456
696
  }
457
- .fractal-alert--error {
458
- background-color: var(--error-surface);
459
- border-color: var(--error-default);
460
- color: var(--fg-primary);
697
+ .fractal-table-search__input::-webkit-search-cancel-button {
698
+ display: none;
699
+ -webkit-appearance: none;
700
+ appearance: none;
461
701
  }
462
- .fractal-alert--error .fractal-alert-icon {
463
- background: var(--error-default);
464
- color: var(--fg-inverse);
702
+ .fractal-table-search .fractal-floating-field {
703
+ --field-label-inset: calc(var(--control-padding-inline) + var(--control-icon-size) + var(--control-icon-gap));
465
704
  }
466
705
 
467
- /* src/components/Toggle/Toggle.css */
468
- .fractal-toggle {
469
- display: inline-flex;
470
- align-items: center;
471
- gap: var(--space-2, 8px);
472
- background: none;
473
- border: none;
474
- cursor: pointer;
475
- padding: 0;
476
- font-family: var(--font-sans);
477
- }
478
- .fractal-toggle-track {
706
+ /* src/components/NumberInput/NumberInput.css */
707
+ .fractal-number-input {
479
708
  position: relative;
480
- width: 32px;
481
- height: 18px;
482
- border-radius: var(--radius-full, 9999px);
483
- background-color: var(--bg-surface-2);
484
- transition: background-color 0.2s;
485
- flex-shrink: 0;
709
+ width: 100%;
710
+ font-family: var(--font-sans);
711
+ font-size: var(--control-font-size);
712
+ line-height: var(--control-line-height);
713
+ font-variant-numeric: tabular-nums;
714
+ align-self: start;
715
+ }
716
+ .fractal-number-input .fractal-input {
717
+ padding-right: calc(2 * var(--control-min-block-size) + var(--control-padding-inline));
718
+ appearance: textfield;
719
+ font-variant-numeric: tabular-nums;
720
+ }
721
+ .fractal-number-input .fractal-input::-webkit-inner-spin-button,
722
+ .fractal-number-input .fractal-input::-webkit-outer-spin-button {
723
+ margin: 0;
724
+ appearance: none;
486
725
  }
487
- .fractal-toggle-track--checked {
726
+ .fractal-number-input-controls {
727
+ position: absolute;
728
+ top: 1px;
729
+ right: 1px;
730
+ bottom: 1px;
731
+ display: flex;
732
+ align-items: stretch;
733
+ overflow: hidden;
734
+ border-radius: 0 calc(var(--radius-sm, 4px) - 1px) calc(var(--radius-sm, 4px) - 1px) 0;
735
+ background: var(--bg-canvas);
736
+ }
737
+ .fractal-number-input-unit {
738
+ position: absolute;
739
+ top: 50%;
740
+ color: var(--fg-secondary);
741
+ font-size: var(--control-font-size);
742
+ margin-left: var(--space-1);
743
+ line-height: var(--control-line-height);
744
+ pointer-events: none;
745
+ transform: translateY(-50%);
746
+ user-select: none;
747
+ }
748
+ .fractal-number-input-step {
749
+ display: grid;
750
+ width: var(--control-min-block-size);
751
+ place-items: center;
752
+ padding: 0;
753
+ border: 0;
754
+ border-left: 1px solid var(--border-subtle);
755
+ background: transparent;
756
+ color: var(--fg-tertiary);
757
+ cursor: pointer;
758
+ }
759
+ .fractal-number-input-step:hover:not(:disabled) {
760
+ background: var(--bg-surface-1);
761
+ color: var(--fg-primary);
762
+ }
763
+ .fractal-number-input-step:focus-visible {
764
+ position: relative;
765
+ z-index: 1;
766
+ outline: 2px solid var(--border-focus);
767
+ outline-offset: -2px;
768
+ }
769
+ .fractal-number-input-step:disabled {
770
+ color: var(--fg-disabled);
771
+ cursor: not-allowed;
772
+ }
773
+ .fractal-number-input-step svg {
774
+ width: var(--control-icon-size);
775
+ height: var(--control-icon-size);
776
+ }
777
+ .fractal-number-input:has(.fractal-floating-field input:placeholder-shown):not(:focus-within) .fractal-number-input-unit {
778
+ visibility: hidden;
779
+ }
780
+ .fractal-number-input .fractal-floating-field__label {
781
+ max-width: calc(100% - 2 * var(--control-min-block-size) - 2 * var(--control-padding-inline));
782
+ }
783
+
784
+ /* src/components/Slider/Slider.css */
785
+ .fractal-slider {
786
+ display: grid;
787
+ width: 100%;
788
+ min-width: 120px;
789
+ gap: var(--space-1, 4px);
790
+ }
791
+ .fractal-slider-values {
792
+ display: flex;
793
+ min-height: 1.2em;
794
+ justify-content: space-between;
795
+ color: var(--fg-primary);
796
+ font-size: 0.75rem;
797
+ font-variant-numeric: tabular-nums;
798
+ font-weight: 500;
799
+ line-height: 1.2;
800
+ }
801
+ .fractal-slider[data-knobs="1"] .fractal-slider-values {
802
+ justify-content: flex-end;
803
+ }
804
+ .fractal-slider-control {
805
+ position: relative;
806
+ height: 24px;
807
+ }
808
+ .fractal-slider-track,
809
+ .fractal-slider-selection {
810
+ position: absolute;
811
+ top: 10px;
812
+ height: 4px;
813
+ border-radius: var(--radius-full, 9999px);
814
+ pointer-events: none;
815
+ }
816
+ .fractal-slider-track {
817
+ right: 0;
818
+ left: 0;
819
+ background: var(--bg-surface-2);
820
+ }
821
+ .fractal-slider-selection {
822
+ right: calc(100% - var(--fractal-slider-selection-end));
823
+ left: var(--fractal-slider-selection-start);
824
+ background: var(--accent-default);
825
+ }
826
+ .fractal-slider-control > input[type=range] {
827
+ position: absolute;
828
+ inset: 0;
829
+ z-index: 1;
830
+ width: 100%;
831
+ height: 24px;
832
+ margin: 0;
833
+ appearance: none;
834
+ background: transparent;
835
+ pointer-events: none;
836
+ }
837
+ .fractal-slider-control > input[type=range]::-webkit-slider-runnable-track {
838
+ height: 4px;
839
+ background: transparent;
840
+ }
841
+ .fractal-slider-control > input[type=range]::-webkit-slider-thumb {
842
+ width: 14px;
843
+ height: 14px;
844
+ margin-top: -5px;
845
+ appearance: none;
846
+ border: 2px solid var(--bg-canvas);
847
+ border-radius: 50%;
848
+ background: var(--accent-default);
849
+ box-shadow: 0 0 0 1px var(--accent-default);
850
+ cursor: grab;
851
+ pointer-events: auto;
852
+ }
853
+ .fractal-slider-control > input[type=range]::-moz-range-track {
854
+ height: 4px;
855
+ background: transparent;
856
+ }
857
+ .fractal-slider-control > input[type=range]::-moz-range-thumb {
858
+ width: 12px;
859
+ height: 12px;
860
+ border: 2px solid var(--bg-canvas);
861
+ border-radius: 50%;
862
+ background: var(--accent-default);
863
+ box-shadow: 0 0 0 1px var(--accent-default);
864
+ cursor: grab;
865
+ pointer-events: auto;
866
+ }
867
+ .fractal-slider-control > input[type=range]:focus-visible::-webkit-slider-thumb {
868
+ outline: 2px solid var(--border-focus);
869
+ outline-offset: 2px;
870
+ }
871
+ .fractal-slider-control > input[type=range]:focus-visible::-moz-range-thumb {
872
+ outline: 2px solid var(--border-focus);
873
+ outline-offset: 2px;
874
+ }
875
+ .fractal-slider-control > input[type=range]:active::-webkit-slider-thumb {
876
+ cursor: grabbing;
877
+ }
878
+ .fractal-slider-control > input[type=range]:active::-moz-range-thumb {
879
+ cursor: grabbing;
880
+ }
881
+ .fractal-slider--disabled {
882
+ opacity: 0.5;
883
+ }
884
+ .fractal-slider--disabled .fractal-slider-control > input[type=range]::-webkit-slider-thumb,
885
+ .fractal-slider--disabled .fractal-slider-control > input[type=range]::-moz-range-thumb {
886
+ cursor: not-allowed;
887
+ }
888
+
889
+ /* src/components/PasswordInput/PasswordInput.css */
890
+ .fractal-password-input {
891
+ position: relative;
892
+ width: 100%;
893
+ align-self: start;
894
+ }
895
+ .fractal-password-input-field {
896
+ padding-right: calc(var(--control-min-block-size) + var(--control-padding-inline));
897
+ }
898
+ .fractal-password-input-toggle {
899
+ position: absolute;
900
+ top: var(--control-border-width);
901
+ bottom: var(--control-border-width);
902
+ right: var(--control-border-width);
903
+ display: grid;
904
+ width: calc(var(--control-min-block-size) - 2 * var(--control-border-width));
905
+ place-items: center;
906
+ padding: 0;
907
+ border: 0;
908
+ border-radius: var(--radius-sm, 4px);
909
+ background: transparent;
910
+ color: var(--fg-secondary);
911
+ cursor: pointer;
912
+ transition: background-color 150ms ease, color 150ms ease;
913
+ }
914
+ .fractal-password-input-toggle:hover:not(:disabled) {
915
+ background: var(--hover-canvas, var(--bg-surface-1));
916
+ color: var(--fg-primary);
917
+ }
918
+ .fractal-password-input-toggle:focus-visible {
919
+ outline: 2px solid var(--border-focus);
920
+ outline-offset: -2px;
921
+ }
922
+ .fractal-password-input-toggle:disabled {
923
+ color: var(--fg-disabled);
924
+ cursor: not-allowed;
925
+ opacity: 0.5;
926
+ }
927
+ @media (prefers-reduced-motion: reduce) {
928
+ .fractal-password-input-toggle {
929
+ transition-duration: 0.01ms;
930
+ }
931
+ }
932
+ .fractal-password-input-toggle svg {
933
+ width: var(--control-icon-size);
934
+ height: var(--control-icon-size);
935
+ }
936
+ .fractal-password-input .fractal-floating-field__label {
937
+ max-width: calc(100% - var(--control-min-block-size) - 2 * var(--control-padding-inline));
938
+ }
939
+
940
+ /* src/components/Label/Label.css */
941
+ .fractal-label {
942
+ display: block;
943
+ margin: 0;
944
+ font-family: var(--font-sans);
945
+ font-size: var(--control-font-size);
946
+ font-weight: 500;
947
+ line-height: var(--control-line-height);
948
+ color: var(--fg-primary);
949
+ }
950
+ .fractal-label[data-disabled] {
951
+ cursor: not-allowed;
952
+ opacity: 0.7;
953
+ }
954
+
955
+ /* src/components/Alert/Alert.css */
956
+ .fractal-alert {
957
+ display: flex;
958
+ align-items: flex-start;
959
+ gap: 12px;
960
+ width: 100%;
961
+ border-radius: var(--radius-sm, 4px);
962
+ border: 1px solid;
963
+ padding: var(--space-3, 12px) var(--space-4, 16px);
964
+ font-family: var(--font-sans);
965
+ }
966
+ .fractal-alert-icon {
967
+ flex-shrink: 0;
968
+ display: flex;
969
+ align-items: center;
970
+ justify-content: center;
971
+ width: 18px;
972
+ height: 18px;
973
+ font-size: 0.75rem;
974
+ font-weight: 600;
975
+ margin-top: 1px;
976
+ }
977
+ .fractal-alert-icon svg {
978
+ display: block;
979
+ }
980
+ .fractal-alert-content {
981
+ flex: 1;
982
+ min-width: 0;
983
+ }
984
+ .fractal-alert-title {
985
+ margin: 0 0 4px 0;
986
+ font-size: 0.875rem;
987
+ font-weight: 500;
988
+ line-height: 1.4;
989
+ }
990
+ .fractal-alert-description {
991
+ color: var(--fg-secondary);
992
+ font-size: 0.875rem;
993
+ line-height: 1.5;
994
+ }
995
+ .fractal-alert--default {
996
+ background-color: var(--bg-canvas);
997
+ border-color: var(--border-subtle);
998
+ color: var(--fg-primary);
999
+ }
1000
+ .fractal-alert--default .fractal-alert-icon {
1001
+ color: var(--fg-secondary);
1002
+ }
1003
+ .fractal-alert--info {
1004
+ background-color: var(--accent-surface);
1005
+ border-color: var(--accent-surface-stroke);
1006
+ color: var(--fg-primary);
1007
+ }
1008
+ .fractal-alert--info .fractal-alert-icon {
1009
+ color: var(--accent-default);
1010
+ }
1011
+ .fractal-alert--success {
1012
+ background-color: var(--success-surface);
1013
+ border-color: var(--success-surface-stroke);
1014
+ color: var(--fg-primary);
1015
+ }
1016
+ .fractal-alert--success .fractal-alert-icon {
1017
+ color: var(--success-default);
1018
+ }
1019
+ .fractal-alert--warning {
1020
+ background-color: var(--warning-surface);
1021
+ border-color: var(--warning-surface-stroke);
1022
+ color: var(--fg-primary);
1023
+ }
1024
+ .fractal-alert--warning .fractal-alert-icon {
1025
+ color: var(--warning-default);
1026
+ }
1027
+ .fractal-alert--error {
1028
+ background-color: var(--error-surface);
1029
+ border-color: var(--error-surface-stroke);
1030
+ color: var(--fg-primary);
1031
+ }
1032
+ .fractal-alert--error .fractal-alert-icon {
1033
+ color: var(--error-default);
1034
+ }
1035
+
1036
+ /* src/components/Toast/Toast.css */
1037
+ .fractal-toast-viewport {
1038
+ position: fixed;
1039
+ z-index: 10000;
1040
+ display: flex;
1041
+ width: min(400px, calc(100vw - var(--space-8, 32px)));
1042
+ max-height: calc(100dvh - var(--space-8, 32px));
1043
+ flex-direction: column;
1044
+ gap: var(--space-2, 8px);
1045
+ overflow: visible;
1046
+ pointer-events: none;
1047
+ }
1048
+ .fractal-toast-viewport--top-center {
1049
+ top: var(--space-4, 16px);
1050
+ left: 50%;
1051
+ align-items: center;
1052
+ transform: translateX(-50%);
1053
+ }
1054
+ .fractal-toast-viewport--top-right {
1055
+ top: var(--space-4, 16px);
1056
+ right: var(--space-4, 16px);
1057
+ align-items: flex-end;
1058
+ }
1059
+ .fractal-toast-viewport--bottom-center {
1060
+ bottom: var(--space-4, 16px);
1061
+ left: 50%;
1062
+ align-items: center;
1063
+ transform: translateX(-50%);
1064
+ }
1065
+ .fractal-toast {
1066
+ display: flex;
1067
+ box-sizing: border-box;
1068
+ width: max-content;
1069
+ max-width: 100%;
1070
+ min-height: 40px;
1071
+ align-items: center;
1072
+ gap: var(--space-2, 8px);
1073
+ padding: var(--space-1, 4px) var(--space-1, 4px) var(--space-1, 4px) var(--space-3, 12px);
1074
+ border: 1px solid var(--border-default);
1075
+ border-radius: var(--radius-full, 9999px);
1076
+ background: var(--bg-canvas);
1077
+ box-shadow: var(--shadow-md);
1078
+ color: var(--fg-primary);
1079
+ font-family: var(--font-sans);
1080
+ font-size: 0.8125rem;
1081
+ font-weight: 500;
1082
+ line-height: 1.35;
1083
+ pointer-events: auto;
1084
+ animation: fractal-toast-in-from-top 180ms var(--ease-out, ease-out) both;
1085
+ }
1086
+ .fractal-toast-viewport--bottom-center .fractal-toast {
1087
+ animation-name: fractal-toast-in-from-bottom;
1088
+ }
1089
+ .fractal-toast__icon {
1090
+ display: grid;
1091
+ width: 18px;
1092
+ height: 18px;
1093
+ flex: 0 0 18px;
1094
+ place-items: center;
1095
+ }
1096
+ .fractal-toast--default .fractal-toast__icon {
1097
+ color: var(--fg-secondary);
1098
+ }
1099
+ .fractal-toast--info .fractal-toast__icon {
1100
+ color: var(--accent-default);
1101
+ }
1102
+ .fractal-toast--success .fractal-toast__icon {
1103
+ color: var(--success-default);
1104
+ }
1105
+ .fractal-toast--warning .fractal-toast__icon {
1106
+ color: var(--warning-default);
1107
+ }
1108
+ .fractal-toast--error .fractal-toast__icon {
1109
+ color: var(--error-default);
1110
+ }
1111
+ .fractal-toast__content {
1112
+ min-width: 0;
1113
+ overflow-wrap: anywhere;
1114
+ }
1115
+ .fractal-toast__action {
1116
+ display: flex;
1117
+ flex: 0 0 auto;
1118
+ align-items: center;
1119
+ }
1120
+ .fractal-toast__dismiss {
1121
+ display: grid;
1122
+ box-sizing: border-box;
1123
+ width: 28px;
1124
+ height: 28px;
1125
+ flex: 0 0 28px;
1126
+ padding: 0;
1127
+ border: 0;
1128
+ border-radius: var(--radius-full, 9999px);
1129
+ background: transparent;
1130
+ color: var(--fg-secondary);
1131
+ cursor: pointer;
1132
+ place-items: center;
1133
+ }
1134
+ .fractal-toast__dismiss:hover {
1135
+ background: var(--hover-surface);
1136
+ color: var(--fg-primary);
1137
+ }
1138
+ .fractal-toast__dismiss:focus-visible {
1139
+ outline: 2px solid var(--border-focus);
1140
+ outline-offset: -2px;
1141
+ }
1142
+ @keyframes fractal-toast-in-from-top {
1143
+ from {
1144
+ opacity: 0;
1145
+ transform: translateY(-12px);
1146
+ }
1147
+ to {
1148
+ opacity: 1;
1149
+ transform: translateY(0);
1150
+ }
1151
+ }
1152
+ @keyframes fractal-toast-in-from-bottom {
1153
+ from {
1154
+ opacity: 0;
1155
+ transform: translateY(12px);
1156
+ }
1157
+ to {
1158
+ opacity: 1;
1159
+ transform: translateY(0);
1160
+ }
1161
+ }
1162
+ @media (max-width: 640px) {
1163
+ .fractal-toast-viewport {
1164
+ width: calc(100vw - var(--space-6, 24px));
1165
+ }
1166
+ .fractal-toast-viewport--top-right {
1167
+ right: var(--space-3, 12px);
1168
+ }
1169
+ }
1170
+ @media (prefers-reduced-motion: reduce) {
1171
+ .fractal-toast {
1172
+ animation-duration: 0.01ms;
1173
+ }
1174
+ }
1175
+
1176
+ /* src/components/Toggle/Toggle.css */
1177
+ .fractal-toggle {
1178
+ display: inline-flex;
1179
+ align-items: center;
1180
+ gap: var(--space-2, 8px);
1181
+ background: none;
1182
+ border: none;
1183
+ cursor: pointer;
1184
+ padding: 0;
1185
+ font-family: var(--font-sans);
1186
+ }
1187
+ .fractal-toggle-track {
1188
+ position: relative;
1189
+ width: 32px;
1190
+ height: 18px;
1191
+ border-radius: var(--radius-full, 9999px);
1192
+ background-color: var(--bg-surface-2);
1193
+ transition: background-color 0.2s;
1194
+ flex-shrink: 0;
1195
+ }
1196
+ .fractal-toggle-track--checked {
488
1197
  background-color: var(--accent-default);
489
1198
  }
490
1199
  .fractal-toggle-thumb {
@@ -506,6 +1215,60 @@
506
1215
  user-select: none;
507
1216
  }
508
1217
 
1218
+ /* src/components/UILoader/UILoader.css */
1219
+ .fractal-ui-loader {
1220
+ display: inline-flex;
1221
+ line-height: 0;
1222
+ }
1223
+ .fractal-ui-loader svg {
1224
+ display: block;
1225
+ overflow: visible;
1226
+ }
1227
+ .fractal-ui-loader__stop-start {
1228
+ stop-color: var(--grey-200);
1229
+ }
1230
+ .fractal-ui-loader__stop-end {
1231
+ stop-color: var(--grey-100);
1232
+ }
1233
+ .fractal-ui-loader--blue .fractal-ui-loader__stop-start {
1234
+ stop-color: var(--blue-500);
1235
+ }
1236
+ .fractal-ui-loader--blue .fractal-ui-loader__stop-end {
1237
+ stop-color: var(--blue-300);
1238
+ }
1239
+ .fractal-ui-loader--green .fractal-ui-loader__stop-start {
1240
+ stop-color: var(--green-500);
1241
+ }
1242
+ .fractal-ui-loader--green .fractal-ui-loader__stop-end {
1243
+ stop-color: var(--green-300);
1244
+ }
1245
+ .fractal-ui-loader__shine-axis {
1246
+ transform-box: view-box;
1247
+ transform-origin: 0 0;
1248
+ }
1249
+ .fractal-ui-loader__shine {
1250
+ animation: fractal-ui-loader-shine 2500ms var(--ease-in-out) infinite;
1251
+ transform-box: view-box;
1252
+ transform-origin: 0 0;
1253
+ }
1254
+ @keyframes fractal-ui-loader-shine {
1255
+ 0%, 12% {
1256
+ transform: translateX(-120px);
1257
+ }
1258
+ 48% {
1259
+ transform: translateX(120px);
1260
+ }
1261
+ 49%, 100% {
1262
+ transform: translateX(-120px);
1263
+ }
1264
+ }
1265
+ @media (prefers-reduced-motion: reduce) {
1266
+ .fractal-ui-loader__shine {
1267
+ animation: none;
1268
+ transform: translateX(0);
1269
+ }
1270
+ }
1271
+
509
1272
  /* src/components/Modal/Modal.css */
510
1273
  .fractal-modal-overlay {
511
1274
  position: fixed;
@@ -517,11 +1280,13 @@
517
1280
  z-index: 9998;
518
1281
  }
519
1282
  .fractal-modal-panel {
1283
+ --fractal-modal-panel-padding: var(--space-6, 24px);
1284
+ box-sizing: border-box;
520
1285
  background: var(--bg-canvas);
521
1286
  border: 1px solid var(--border-subtle);
522
1287
  border-radius: var(--radius-lg, 8px);
523
1288
  box-shadow: var(--shadow-lg);
524
- padding: var(--space-6, 24px);
1289
+ padding: var(--fractal-modal-panel-padding);
525
1290
  max-width: 90vw;
526
1291
  font-family: var(--font-sans);
527
1292
  }
@@ -538,6 +1303,12 @@
538
1303
  display: flex;
539
1304
  flex-direction: column;
540
1305
  }
1306
+ .fractal-modal-panel--scrollable {
1307
+ display: flex;
1308
+ max-height: calc(100dvh - 2rem);
1309
+ flex-direction: column;
1310
+ padding-bottom: 0;
1311
+ }
541
1312
  .fractal-modal-panel--danger {
542
1313
  border-color: var(--error-subtle);
543
1314
  }
@@ -550,6 +1321,29 @@
550
1321
  align-items: center;
551
1322
  margin-bottom: var(--space-4, 16px);
552
1323
  }
1324
+ .fractal-modal-title-row--scrollable {
1325
+ position: relative;
1326
+ box-sizing: border-box;
1327
+ width: calc(100% + var(--fractal-modal-panel-padding) + var(--fractal-modal-panel-padding));
1328
+ flex: 0 0 auto;
1329
+ margin: 0 calc(0px - var(--fractal-modal-panel-padding));
1330
+ padding: 0 var(--fractal-modal-panel-padding) var(--space-4, 16px);
1331
+ }
1332
+ .fractal-modal-title-row--scrollable::after {
1333
+ position: absolute;
1334
+ right: 0;
1335
+ bottom: 0;
1336
+ left: 0;
1337
+ height: 1px;
1338
+ background: var(--border-subtle);
1339
+ content: "";
1340
+ opacity: 0;
1341
+ pointer-events: none;
1342
+ transition: opacity 160ms ease;
1343
+ }
1344
+ .fractal-modal-title-row--scrolled::after {
1345
+ opacity: 1;
1346
+ }
553
1347
  .fractal-modal-title {
554
1348
  margin: 0;
555
1349
  font-size: 1rem;
@@ -576,21 +1370,270 @@
576
1370
  color: var(--fg-primary);
577
1371
  background: var(--bg-surface-1);
578
1372
  }
1373
+ .fractal-modal-close:disabled {
1374
+ cursor: not-allowed;
1375
+ opacity: 0.4;
1376
+ }
1377
+ .fractal-modal-close:disabled:hover {
1378
+ color: var(--fg-secondary);
1379
+ background: none;
1380
+ }
579
1381
  .fractal-modal-body {
580
1382
  font-size: 0.875rem;
581
1383
  color: var(--fg-secondary);
582
1384
  }
1385
+ .fractal-modal-body--loading {
1386
+ display: grid;
1387
+ min-height: 168px;
1388
+ place-items: center;
1389
+ }
583
1390
  .fractal-modal-body--lg {
584
1391
  flex: 1;
585
1392
  min-height: 0;
586
1393
  overflow: hidden;
587
1394
  }
1395
+ .fractal-modal-body--scrollable {
1396
+ box-sizing: border-box;
1397
+ width: calc(100% + var(--fractal-modal-panel-padding) + var(--fractal-modal-panel-padding));
1398
+ min-height: 0;
1399
+ margin-inline: calc(0px - var(--fractal-modal-panel-padding));
1400
+ overflow-y: auto;
1401
+ overscroll-behavior: contain;
1402
+ padding-inline: var(--fractal-modal-panel-padding);
1403
+ }
588
1404
  .fractal-modal-footer {
589
1405
  display: flex;
590
1406
  justify-content: flex-end;
591
1407
  gap: var(--space-2, 8px);
592
1408
  margin-top: var(--space-4, 16px);
593
1409
  }
1410
+ .fractal-modal-footer--divided {
1411
+ box-sizing: border-box;
1412
+ width: calc(100% + var(--fractal-modal-panel-padding) + var(--fractal-modal-panel-padding));
1413
+ flex: 0 0 auto;
1414
+ margin-top: 0;
1415
+ margin-inline: calc(0px - var(--fractal-modal-panel-padding));
1416
+ padding: var(--space-4, 16px) var(--fractal-modal-panel-padding);
1417
+ border-top: 1px solid var(--border-subtle);
1418
+ }
1419
+
1420
+ /* src/components/TableLayout/TableLayout.css */
1421
+ .fractal-table-layout {
1422
+ container: fractal-table / inline-size;
1423
+ min-width: 0;
1424
+ max-width: 100%;
1425
+ }
1426
+ .fractal-table-layout .fractal-datatable-surface,
1427
+ .fractal-table-layout .fractal-sortable-table-surface {
1428
+ width: fit-content;
1429
+ max-width: 100%;
1430
+ box-sizing: border-box;
1431
+ }
1432
+ .fractal-table-layout[data-table-layout=fill] .fractal-datatable-surface,
1433
+ .fractal-table-layout[data-table-layout=fill] .fractal-sortable-table-surface {
1434
+ width: 100%;
1435
+ }
1436
+ .fractal-table-viewport {
1437
+ max-width: 100%;
1438
+ overflow: auto;
1439
+ position: relative;
1440
+ }
1441
+ .fractal-table-layout table {
1442
+ width: max-content;
1443
+ table-layout: auto;
1444
+ height: 1px;
1445
+ }
1446
+ .fractal-table-layout[data-table-layout=fill] table {
1447
+ min-width: 100%;
1448
+ }
1449
+ .fractal-table-layout th,
1450
+ .fractal-table-layout td {
1451
+ --table-cell-padding: var(--space-4);
1452
+ white-space: nowrap;
1453
+ overflow-wrap: normal;
1454
+ box-sizing: border-box;
1455
+ }
1456
+ .fractal-datatable--sm :is(th, td),
1457
+ .fractal-sortable-table--sm :is(th, td) {
1458
+ --table-cell-padding: var(--space-3);
1459
+ }
1460
+ .fractal-datatable--lg :is(th, td),
1461
+ .fractal-sortable-table--lg :is(th, td) {
1462
+ --table-cell-padding: var(--space-6);
1463
+ }
1464
+ .fractal-table-cell-scroll {
1465
+ --table-default-cap: var(--table-column-max-wide);
1466
+ --table-cap: var(--table-column-max, var(--table-default-cap));
1467
+ width: var(--table-column-width, auto);
1468
+ height: 100%;
1469
+ min-width: max(100%, calc(min(var(--table-column-min, 0px), var(--table-cap)) - 1px));
1470
+ max-width: max(0px, calc(var(--table-cap) - 1px));
1471
+ overflow-x: auto;
1472
+ overflow-y: hidden;
1473
+ white-space: nowrap;
1474
+ scrollbar-width: none;
1475
+ }
1476
+ .fractal-table-cell-scroll::-webkit-scrollbar {
1477
+ display: none;
1478
+ }
1479
+ .fractal-table-layout :is(th, td):has(> .fractal-table-cell-scroll) {
1480
+ padding: 0;
1481
+ height: 100%;
1482
+ }
1483
+ .fractal-table-cell-content {
1484
+ display: flex;
1485
+ align-items: center;
1486
+ box-sizing: border-box;
1487
+ width: max-content;
1488
+ min-width: 100%;
1489
+ min-height: 100%;
1490
+ padding: var(--table-cell-block-padding) var(--table-cell-padding);
1491
+ gap: var(--space-1);
1492
+ white-space: nowrap;
1493
+ }
1494
+ .fractal-table-cell-content > * {
1495
+ flex-shrink: 0;
1496
+ }
1497
+ .fractal-table-cell-scroll {
1498
+ overscroll-behavior-x: auto;
1499
+ }
1500
+ .fractal-table-viewport:focus-visible,
1501
+ .fractal-table-cell-scroll:focus-visible {
1502
+ outline: 2px solid var(--border-focus);
1503
+ outline-offset: -2px;
1504
+ }
1505
+ .fractal-table-layout .fractal-sortable-table-th--sortable .fractal-table-cell-content {
1506
+ padding: 0;
1507
+ }
1508
+ .fractal-table-layout .fractal-sortable-table-sort-button {
1509
+ width: max-content;
1510
+ min-width: 100%;
1511
+ align-self: stretch;
1512
+ white-space: nowrap;
1513
+ }
1514
+ @container fractal-table (max-width: 1024px) {
1515
+ .fractal-table-cell-scroll {
1516
+ --table-default-cap: var(--table-column-max-medium);
1517
+ }
1518
+ }
1519
+ @container fractal-table (max-width: 640px) {
1520
+ .fractal-table-cell-scroll {
1521
+ --table-default-cap: var(--table-column-max-compact);
1522
+ }
1523
+ }
1524
+ .fractal-table-layout[data-sticky-first=true] [data-pinned-column=data] .fractal-table-cell-scroll {
1525
+ --table-cap: min(var(--table-column-max, var(--table-default-cap)), 55cqi);
1526
+ }
1527
+ .fractal-table-layout[data-sticky-first=true] :is([data-pinned-column=data], [data-pinned-column=selection]) {
1528
+ position: sticky;
1529
+ inset-inline-start: 0;
1530
+ z-index: 2;
1531
+ background: inherit;
1532
+ }
1533
+ .fractal-table-layout[data-sticky-first=true][data-table-selection=true] [data-pinned-column=data] {
1534
+ inset-inline-start: 52px;
1535
+ }
1536
+ .fractal-table-layout[data-sticky-header=true] thead th {
1537
+ position: sticky;
1538
+ top: 0;
1539
+ z-index: 3;
1540
+ background: var(--bg-surface-1);
1541
+ }
1542
+ .fractal-table-layout[data-sticky-first=true] thead [data-pinned-column] {
1543
+ background: var(--bg-surface-1);
1544
+ }
1545
+ .fractal-table-layout[data-sticky-header=true][data-sticky-first=true] thead [data-pinned-column] {
1546
+ z-index: 4;
1547
+ }
1548
+ .fractal-table-layout [data-column-align=right] .fractal-table-cell-content {
1549
+ justify-content: flex-end;
1550
+ }
1551
+ .fractal-table-layout .fractal-table-overflow-cell {
1552
+ position: sticky;
1553
+ inset-inline-end: 0;
1554
+ z-index: 2;
1555
+ width: 48px;
1556
+ min-width: 48px;
1557
+ max-width: 48px;
1558
+ padding: var(--space-2);
1559
+ vertical-align: middle;
1560
+ background: inherit;
1561
+ }
1562
+ .fractal-table-layout thead .fractal-table-overflow-cell {
1563
+ background: var(--bg-surface-1);
1564
+ }
1565
+ .fractal-table-layout[data-sticky-header=true] thead .fractal-table-overflow-cell {
1566
+ z-index: 4;
1567
+ }
1568
+ .fractal-table-layout[data-overflow-menu=true] {
1569
+ --table-trailing-reserve: 48px;
1570
+ }
1571
+ .fractal-table-layout[data-table-selection=true] {
1572
+ --table-leading-reserve: 52px;
1573
+ }
1574
+ .fractal-table-layout[data-sticky-first=true] [data-pinned-column=data] .fractal-table-cell-scroll {
1575
+ --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)));
1576
+ }
1577
+ .fractal-table-overflow-trigger {
1578
+ display: flex;
1579
+ align-items: center;
1580
+ justify-content: center;
1581
+ }
1582
+ .fractal-table-overflow-menu {
1583
+ position: fixed;
1584
+ z-index: 10000;
1585
+ box-sizing: border-box;
1586
+ min-width: min(160px, calc(100vw - 16px));
1587
+ max-width: calc(100vw - 16px);
1588
+ max-height: calc(100vh - 16px);
1589
+ overflow: auto;
1590
+ padding: var(--space-1);
1591
+ border: 1px solid var(--border-subtle);
1592
+ border-radius: var(--radius-md);
1593
+ background: var(--bg-canvas);
1594
+ box-shadow: var(--shadow-md);
1595
+ color: var(--fg-primary);
1596
+ font-family: var(--font-sans);
1597
+ font-size: 0.875rem;
1598
+ }
1599
+ .fractal-table-overflow-menu > button {
1600
+ display: flex;
1601
+ align-items: center;
1602
+ gap: var(--space-2);
1603
+ width: 100%;
1604
+ padding: var(--space-2) var(--space-3);
1605
+ border: 0;
1606
+ border-radius: var(--radius-sm);
1607
+ background: transparent;
1608
+ color: inherit;
1609
+ font: inherit;
1610
+ text-align: start;
1611
+ cursor: pointer;
1612
+ }
1613
+ .fractal-table-overflow-menu > button:hover:not(:disabled) {
1614
+ background: var(--hover-surface);
1615
+ }
1616
+ .fractal-table-overflow-menu > button:focus-visible {
1617
+ background: var(--hover-surface);
1618
+ outline: 2px solid var(--border-focus);
1619
+ outline-offset: -2px;
1620
+ }
1621
+ .fractal-table-overflow-menu > button:disabled {
1622
+ color: var(--fg-disabled);
1623
+ cursor: not-allowed;
1624
+ }
1625
+ .fractal-table-overflow-menu > button > span {
1626
+ display: inline-flex;
1627
+ }
1628
+ .fractal-table-layout[data-sticky-first=true] [data-pinned-column=data]::after {
1629
+ content: "";
1630
+ position: absolute;
1631
+ inset-block: 0;
1632
+ inset-inline-end: -1px;
1633
+ width: 1px;
1634
+ background: var(--border-subtle);
1635
+ pointer-events: none;
1636
+ }
594
1637
 
595
1638
  /* src/components/DataTable/DataTable.css */
596
1639
  .fractal-datatable {
@@ -633,15 +1676,14 @@
633
1676
  .fractal-datatable-th {
634
1677
  text-align: left;
635
1678
  padding: 12px 16px;
636
- font-size: 0.75rem;
1679
+ --table-cell-block-padding: 12px;
1680
+ font-size: inherit;
1681
+ line-height: 1.55;
637
1682
  font-weight: 500;
638
1683
  color: var(--fg-secondary);
639
1684
  border-bottom: 1px solid var(--border-subtle);
640
1685
  vertical-align: middle;
641
1686
  }
642
- .fractal-datatable-th + .fractal-datatable-th {
643
- border-left: 1px solid var(--border-subtle);
644
- }
645
1687
  .fractal-datatable-row {
646
1688
  background: var(--bg-canvas);
647
1689
  transition: background 120ms ease;
@@ -651,54 +1693,79 @@
651
1693
  }
652
1694
  .fractal-datatable-td {
653
1695
  padding: 14px 16px;
1696
+ --table-cell-block-padding: 14px;
654
1697
  color: var(--fg-primary);
655
1698
  line-height: 1.55;
656
- vertical-align: top;
1699
+ vertical-align: middle;
657
1700
  overflow-wrap: anywhere;
658
1701
  }
659
- .fractal-datatable-td + .fractal-datatable-td {
660
- border-left: 1px solid var(--border-subtle);
1702
+ .fractal-datatable-td .fractal-dropdown-trigger--icon-only.fractal-dropdown-trigger--tertiary:hover {
1703
+ background: var(--bg-canvas);
661
1704
  }
662
1705
  .fractal-datatable-row + .fractal-datatable-row .fractal-datatable-td {
663
1706
  border-top: 1px solid var(--border-subtle);
664
1707
  }
665
1708
  .fractal-datatable--sm .fractal-datatable-th {
666
1709
  padding: 8px 12px;
1710
+ --table-cell-block-padding: 8px;
667
1711
  }
668
1712
  .fractal-datatable--sm .fractal-datatable-td {
669
1713
  padding: 10px 12px;
1714
+ --table-cell-block-padding: 10px;
670
1715
  }
671
1716
  .fractal-datatable--lg .fractal-datatable-th {
672
1717
  padding: 18px 24px;
1718
+ --table-cell-block-padding: 18px;
673
1719
  }
674
1720
  .fractal-datatable--lg .fractal-datatable-td {
675
1721
  padding: 22px 24px;
1722
+ --table-cell-block-padding: 22px;
1723
+ }
1724
+ .fractal-datatable-th + .fractal-datatable-th,
1725
+ .fractal-datatable-td + .fractal-datatable-td {
1726
+ border-inline-start: 1px solid var(--border-subtle);
676
1727
  }
677
1728
 
678
1729
  /* src/components/Dropdown/Dropdown.css */
679
1730
  .fractal-dropdown {
680
1731
  position: relative;
681
- display: inline-block;
1732
+ display: inline-flex;
1733
+ vertical-align: top;
1734
+ min-width: 0;
682
1735
  }
683
1736
  .fractal-dropdown-trigger {
684
1737
  display: inline-flex;
685
1738
  align-items: center;
686
- gap: 8px;
1739
+ gap: var(--control-icon-gap);
687
1740
  border-radius: var(--radius-md, 6px);
688
1741
  border: 1px solid var(--border-subtle);
689
1742
  background: var(--bg-canvas);
690
- padding: 8px 12px;
691
1743
  text-align: left;
692
- font-size: 0.875rem;
693
1744
  font-family: var(--font-sans);
694
1745
  color: var(--fg-primary);
695
1746
  cursor: pointer;
696
1747
  transition: background-color 0.15s;
697
1748
  }
698
- .fractal-dropdown-trigger--sm {
699
- gap: 6px;
700
- padding: 4px 8px;
701
- font-size: 0.75rem;
1749
+ .fractal-dropdown-trigger--vertical {
1750
+ flex-direction: column;
1751
+ justify-content: flex-start;
1752
+ }
1753
+ .fractal-dropdown-trigger--vertical .fractal-dropdown-selected-text {
1754
+ writing-mode: vertical-rl;
1755
+ transform: rotate(180deg);
1756
+ }
1757
+ .fractal-dropdown-trigger--vertical .fractal-dropdown-icon--trigger {
1758
+ writing-mode: vertical-rl;
1759
+ transform: rotate(180deg);
1760
+ }
1761
+ .fractal-dropdown-trigger--vertical .fractal-dropdown-chevron {
1762
+ order: -1;
1763
+ margin: 0 0 auto;
1764
+ }
1765
+ .fractal-dropdown-trigger--icon-only {
1766
+ inline-size: var(--control-min-block-size);
1767
+ justify-content: center;
1768
+ padding-inline: 0;
702
1769
  }
703
1770
  .fractal-dropdown-trigger--tertiary {
704
1771
  border-color: transparent;
@@ -708,6 +1775,17 @@
708
1775
  .fractal-dropdown-trigger--tertiary:hover {
709
1776
  background: var(--bg-surface-1);
710
1777
  }
1778
+ .fractal-dropdown-trigger:disabled,
1779
+ .fractal-dropdown-trigger:disabled:hover {
1780
+ color: var(--fg-disabled);
1781
+ cursor: not-allowed;
1782
+ background: var(--bg-surface-1);
1783
+ }
1784
+ .fractal-dropdown-trigger:disabled .fractal-dropdown-selected-text,
1785
+ .fractal-dropdown-trigger:disabled .fractal-dropdown-chevron,
1786
+ .fractal-dropdown-trigger:disabled .fractal-dropdown-icon {
1787
+ color: var(--fg-disabled);
1788
+ }
711
1789
  .fractal-dropdown-trigger:focus-visible {
712
1790
  outline: none;
713
1791
  box-shadow: 0 0 0 2px var(--bg-canvas), 0 0 0 4px var(--border-focus);
@@ -731,22 +1809,30 @@
731
1809
  .fractal-dropdown-chevron {
732
1810
  display: flex;
733
1811
  flex-shrink: 0;
1812
+ margin-left: auto;
734
1813
  color: var(--fg-secondary);
735
1814
  }
736
1815
  .fractal-dropdown-panel {
737
1816
  position: absolute;
738
1817
  z-index: 999999;
739
- overflow: hidden;
1818
+ width: max-content;
1819
+ max-height: 320px;
1820
+ max-width: calc(100vw - 16px);
1821
+ overflow-x: hidden;
1822
+ overflow-y: auto;
1823
+ overscroll-behavior: contain;
1824
+ box-sizing: border-box;
740
1825
  border-radius: var(--radius-md, 6px);
741
1826
  border: 1px solid var(--border-subtle);
742
1827
  background: var(--bg-canvas);
743
- white-space: nowrap;
1828
+ white-space: normal;
1829
+ overflow-wrap: anywhere;
744
1830
  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
745
1831
  padding: 4px;
746
1832
  }
747
1833
  .fractal-dropdown-label {
748
1834
  width: 100%;
749
- padding: 6px 8px;
1835
+ padding: var(--space-1) var(--control-padding-inline);
750
1836
  font-size: 0.75rem;
751
1837
  font-weight: 500;
752
1838
  color: var(--fg-secondary);
@@ -755,11 +1841,13 @@
755
1841
  .fractal-dropdown-option {
756
1842
  display: flex;
757
1843
  width: 100%;
1844
+ box-sizing: border-box;
758
1845
  align-items: center;
759
1846
  gap: 8px;
760
- padding: 6px 8px;
1847
+ padding: var(--control-padding-block) var(--control-padding-inline);
761
1848
  text-align: left;
762
- font-size: 0.875rem;
1849
+ font-size: var(--control-font-size);
1850
+ line-height: var(--control-line-height);
763
1851
  font-family: var(--font-sans);
764
1852
  background: none;
765
1853
  border: none;
@@ -768,17 +1856,9 @@
768
1856
  color: var(--fg-primary);
769
1857
  transition: background-color 0.1s;
770
1858
  }
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;
778
- }
779
1859
  .fractal-dropdown-option:hover,
780
1860
  .fractal-dropdown-option:focus-visible {
781
- background: var(--hover-canvas, var(--bg-surface-2));
1861
+ background: var(--hover-surface, var(--bg-surface-2));
782
1862
  outline: none;
783
1863
  }
784
1864
  .fractal-dropdown-separator {
@@ -786,15 +1866,78 @@
786
1866
  margin: 4px -4px;
787
1867
  background: var(--border-subtle);
788
1868
  }
789
- .fractal-dropdown-option-text {
1869
+ .fractal-dropdown-option-text {
1870
+ min-width: 0;
1871
+ color: var(--fg-primary);
1872
+ }
1873
+ .fractal-dropdown-trailing {
1874
+ margin-left: auto;
1875
+ display: flex;
1876
+ align-items: center;
1877
+ padding-left: 8px;
1878
+ color: var(--accent-default);
1879
+ }
1880
+ .fractal-dropdown-trigger {
1881
+ white-space: nowrap;
1882
+ }
1883
+ .fractal-dropdown-icon--trigger svg,
1884
+ .fractal-dropdown-chevron svg {
1885
+ width: var(--control-icon-size);
1886
+ height: var(--control-icon-size);
1887
+ }
1888
+ .fractal-dropdown-search {
1889
+ display: flex;
1890
+ align-items: center;
1891
+ gap: var(--space-2);
1892
+ padding: var(--control-padding-block) var(--control-padding-inline);
1893
+ border-bottom: 1px solid var(--border-subtle);
1894
+ margin-bottom: var(--space-1);
1895
+ border-radius: var(--radius-sm);
1896
+ }
1897
+ .fractal-dropdown-search:focus-within {
1898
+ box-shadow: inset 0 0 0 2px var(--border-focus);
1899
+ }
1900
+ .fractal-dropdown-search > svg {
1901
+ width: var(--control-icon-size);
1902
+ height: var(--control-icon-size);
1903
+ flex-shrink: 0;
1904
+ color: var(--fg-secondary);
1905
+ }
1906
+ .fractal-dropdown-search input {
1907
+ width: 100%;
1908
+ min-width: 0;
1909
+ padding: 0;
1910
+ border: 0;
1911
+ outline: none;
1912
+ box-shadow: none;
1913
+ background: transparent;
790
1914
  color: var(--fg-primary);
1915
+ font: inherit;
1916
+ font-size: var(--control-font-size);
1917
+ line-height: var(--control-line-height);
791
1918
  }
792
- .fractal-dropdown-trailing {
793
- margin-left: auto;
1919
+ .fractal-dropdown-search input::placeholder {
1920
+ color: var(--fg-placeholder);
1921
+ }
1922
+ .fractal-dropdown-checkbox {
794
1923
  display: flex;
795
1924
  align-items: center;
796
- padding-left: 8px;
797
- color: var(--accent-default);
1925
+ justify-content: center;
1926
+ width: 16px;
1927
+ height: 16px;
1928
+ box-sizing: border-box;
1929
+ flex-shrink: 0;
1930
+ border: 1px solid var(--fg-secondary);
1931
+ border-radius: var(--radius-sm);
1932
+ }
1933
+ .fractal-dropdown-checkbox[data-checked=true] {
1934
+ background: var(--fg-primary);
1935
+ border-color: var(--fg-primary);
1936
+ color: var(--bg-canvas);
1937
+ }
1938
+ .fractal-dropdown-checkbox svg {
1939
+ width: 14px;
1940
+ height: 14px;
798
1941
  }
799
1942
 
800
1943
  /* src/components/Link/Link.css */
@@ -837,41 +1980,154 @@
837
1980
  display: inline-flex;
838
1981
  align-items: center;
839
1982
  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;
1983
+ padding: var(--space-1) var(--space-2);
1984
+ font-family: var(--font-sans);
1985
+ font-size: 0.75rem;
1986
+ font-weight: 500;
1987
+ letter-spacing: normal;
1988
+ line-height: 1rem;
846
1989
  white-space: nowrap;
847
- background: var(--bg-surface-2);
848
- border: 1px solid var(--border-subtle);
849
- color: var(--fg-secondary);
1990
+ border: 0;
1991
+ background: var(--tag-neutral-bg);
1992
+ color: var(--tag-neutral-fg);
850
1993
  }
851
1994
  .fractal-chip--neutral {
852
- background: var(--bg-surface-2);
853
- border-color: var(--border-subtle);
854
- color: var(--fg-secondary);
1995
+ background: var(--tag-neutral-bg);
1996
+ color: var(--tag-neutral-fg);
855
1997
  }
856
1998
  .fractal-chip--success {
857
- background: var(--success-surface);
858
- border-color: var(--success-subtle);
859
- color: var(--success-default);
1999
+ background: var(--tag-success-bg);
2000
+ color: var(--tag-success-fg);
860
2001
  }
861
2002
  .fractal-chip--warning {
862
- background: var(--warning-surface);
863
- border-color: var(--warning-subtle);
864
- color: var(--warning-default);
2003
+ background: var(--tag-warning-bg);
2004
+ color: var(--tag-warning-fg);
865
2005
  }
866
2006
  .fractal-chip--error {
867
- background: var(--error-surface);
868
- border-color: var(--error-subtle);
869
- color: var(--error-default);
2007
+ background: var(--tag-error-bg);
2008
+ color: var(--tag-error-fg);
870
2009
  }
871
2010
  .fractal-chip--info {
872
- background: var(--accent-surface);
873
- border-color: var(--accent-subtle);
874
- color: var(--accent-default);
2011
+ background: var(--tag-info-bg);
2012
+ color: var(--tag-info-fg);
2013
+ }
2014
+
2015
+ /* src/components/Checkbox/Checkbox.css */
2016
+ .fractal-checkbox {
2017
+ display: grid;
2018
+ width: 28px;
2019
+ height: 28px;
2020
+ place-items: center;
2021
+ padding: 0;
2022
+ border: 0;
2023
+ border-radius: var(--radius-sm);
2024
+ background: transparent;
2025
+ color: var(--fg-secondary);
2026
+ cursor: pointer;
2027
+ }
2028
+ .fractal-checkbox:hover:not(:disabled) {
2029
+ background: var(--hover-canvas);
2030
+ color: var(--fg-primary);
2031
+ }
2032
+ .fractal-checkbox--checked {
2033
+ color: var(--fg-primary);
2034
+ }
2035
+ .fractal-checkbox__indeterminate-icon {
2036
+ position: relative;
2037
+ display: grid;
2038
+ place-items: center;
2039
+ }
2040
+ .fractal-checkbox__indeterminate-mark {
2041
+ position: absolute;
2042
+ }
2043
+ .fractal-checkbox:focus-visible {
2044
+ outline: 2px solid var(--border-focus);
2045
+ outline-offset: 2px;
2046
+ }
2047
+ .fractal-checkbox:disabled {
2048
+ cursor: not-allowed;
2049
+ color: var(--fg-disabled);
2050
+ }
2051
+
2052
+ /* src/components/Radio/Radio.css */
2053
+ .fractal-radio {
2054
+ position: relative;
2055
+ display: grid;
2056
+ grid-template-columns: 18px minmax(0, 1fr);
2057
+ align-items: start;
2058
+ gap: var(--space-2, 8px);
2059
+ color: var(--fg-primary);
2060
+ cursor: pointer;
2061
+ font-family: var(--font-sans);
2062
+ }
2063
+ .fractal-radio__input {
2064
+ position: absolute;
2065
+ width: 18px;
2066
+ height: 18px;
2067
+ margin: 0;
2068
+ opacity: 0;
2069
+ cursor: inherit;
2070
+ }
2071
+ .fractal-radio__control {
2072
+ display: grid;
2073
+ width: 18px;
2074
+ height: 18px;
2075
+ box-sizing: border-box;
2076
+ place-items: center;
2077
+ border: 1px solid var(--border-strong);
2078
+ border-radius: var(--radius-full, 9999px);
2079
+ background: var(--bg-canvas);
2080
+ transition: border-color 120ms ease, box-shadow 120ms ease;
2081
+ }
2082
+ .fractal-radio__dot {
2083
+ width: 8px;
2084
+ height: 8px;
2085
+ border-radius: var(--radius-full, 9999px);
2086
+ background: var(--accent-default);
2087
+ opacity: 0;
2088
+ transform: scale(0.5);
2089
+ transition: opacity 120ms ease, transform 120ms ease;
2090
+ }
2091
+ .fractal-radio__input:checked + .fractal-radio__control {
2092
+ border-color: var(--accent-default);
2093
+ }
2094
+ .fractal-radio__input:checked + .fractal-radio__control .fractal-radio__dot {
2095
+ opacity: 1;
2096
+ transform: scale(1);
2097
+ }
2098
+ .fractal-radio:hover:not(.fractal-radio--disabled) .fractal-radio__control {
2099
+ border-color: var(--fg-secondary);
2100
+ }
2101
+ .fractal-radio__input:focus-visible + .fractal-radio__control {
2102
+ box-shadow: 0 0 0 2px var(--bg-canvas), 0 0 0 4px var(--border-focus);
2103
+ }
2104
+ .fractal-radio__content {
2105
+ display: grid;
2106
+ min-width: 0;
2107
+ gap: 2px;
2108
+ }
2109
+ .fractal-radio__label {
2110
+ font-size: 0.8125rem;
2111
+ line-height: 18px;
2112
+ }
2113
+ .fractal-radio__description {
2114
+ color: var(--fg-secondary);
2115
+ font-size: 0.75rem;
2116
+ line-height: 1.4;
2117
+ }
2118
+ .fractal-radio--disabled {
2119
+ color: var(--fg-disabled);
2120
+ cursor: not-allowed;
2121
+ }
2122
+ .fractal-radio--disabled .fractal-radio__control {
2123
+ border-color: var(--border-subtle);
2124
+ background: var(--bg-surface-1);
2125
+ }
2126
+ .fractal-radio--disabled .fractal-radio__dot {
2127
+ background: var(--fg-disabled);
2128
+ }
2129
+ .fractal-radio--disabled .fractal-radio__description {
2130
+ color: var(--fg-disabled);
875
2131
  }
876
2132
 
877
2133
  /* src/components/SortableTable/SortableTable.css */
@@ -885,6 +2141,11 @@
885
2141
  border-radius: var(--radius-md, 6px);
886
2142
  background: var(--bg-canvas);
887
2143
  }
2144
+ .fractal-sortable-table--embedded .fractal-sortable-table-surface {
2145
+ border: 0;
2146
+ border-top: 1px solid var(--border-subtle);
2147
+ border-radius: 0;
2148
+ }
888
2149
  .fractal-sortable-table-header {
889
2150
  display: flex;
890
2151
  align-items: center;
@@ -915,16 +2176,15 @@
915
2176
  .fractal-sortable-table-th {
916
2177
  text-align: left;
917
2178
  padding: 12px 16px;
918
- font-size: 0.75rem;
2179
+ --table-cell-block-padding: 12px;
2180
+ font-size: inherit;
2181
+ line-height: 1.55;
919
2182
  font-weight: 500;
920
2183
  color: var(--fg-secondary);
921
2184
  border-bottom: 1px solid var(--border-subtle);
922
2185
  vertical-align: middle;
923
2186
  white-space: nowrap;
924
2187
  }
925
- .fractal-sortable-table-th + .fractal-sortable-table-th {
926
- border-left: 1px solid var(--border-subtle);
927
- }
928
2188
  .fractal-sortable-table-th--sortable {
929
2189
  padding: 0;
930
2190
  }
@@ -980,6 +2240,73 @@
980
2240
  .fractal-sortable-table-row--interactive {
981
2241
  cursor: pointer;
982
2242
  }
2243
+ .fractal-sortable-table-row--disabled {
2244
+ background: var(--bg-surface-1);
2245
+ opacity: 0.55;
2246
+ }
2247
+ .fractal-sortable-table-row--disabled:hover {
2248
+ background: var(--bg-surface-1);
2249
+ }
2250
+ .fractal-sortable-table-selection-cell {
2251
+ position: relative;
2252
+ width: 52px;
2253
+ min-width: 52px;
2254
+ padding: 0 !important;
2255
+ }
2256
+ .fractal-sortable-table-selection-cell > .fractal-checkbox {
2257
+ position: absolute;
2258
+ inset: 0;
2259
+ width: 100%;
2260
+ height: 100%;
2261
+ border-radius: 0;
2262
+ }
2263
+ .fractal-sortable-table-selection-cell > .fractal-checkbox:hover:not(:disabled) {
2264
+ background: var(--hover-surface);
2265
+ }
2266
+ .fractal-sortable-table-selection-cell > .fractal-checkbox:focus-visible {
2267
+ outline-offset: -2px;
2268
+ }
2269
+ .fractal-sortable-table-td--row-action {
2270
+ position: relative;
2271
+ }
2272
+ .fractal-sortable-table-td .fractal-dropdown-trigger--icon-only.fractal-dropdown-trigger--tertiary:hover {
2273
+ background: var(--bg-canvas);
2274
+ }
2275
+ .fractal-sortable-table-row-action {
2276
+ position: absolute;
2277
+ z-index: 1;
2278
+ top: 0;
2279
+ right: -1px;
2280
+ bottom: 0;
2281
+ display: flex;
2282
+ width: min(280px, calc(200% + 32px));
2283
+ align-items: center;
2284
+ justify-content: flex-end;
2285
+ padding-right: var(--space-4);
2286
+ background:
2287
+ linear-gradient(
2288
+ 90deg,
2289
+ transparent 0%,
2290
+ color-mix(in srgb, var(--hover-surface) 72%, transparent) 52%,
2291
+ var(--hover-surface) 100%);
2292
+ opacity: 0;
2293
+ pointer-events: none;
2294
+ transition: opacity 150ms ease-out;
2295
+ }
2296
+ .fractal-sortable-table-row--interactive:hover .fractal-sortable-table-row-action,
2297
+ .fractal-sortable-table-row--interactive:focus-visible .fractal-sortable-table-row-action {
2298
+ opacity: 1;
2299
+ }
2300
+ .fractal-sortable-table-row-action__icon {
2301
+ display: grid;
2302
+ width: 32px;
2303
+ height: 32px;
2304
+ place-items: center;
2305
+ border: 1px solid var(--border-default);
2306
+ border-radius: var(--radius-full);
2307
+ background: var(--bg-canvas);
2308
+ color: var(--fg-primary);
2309
+ }
983
2310
  .fractal-sortable-table-row--interactive:focus-visible {
984
2311
  position: relative;
985
2312
  z-index: 1;
@@ -997,27 +2324,37 @@
997
2324
  }
998
2325
  .fractal-sortable-table-td {
999
2326
  padding: 14px 16px;
2327
+ --table-cell-block-padding: 14px;
1000
2328
  color: var(--fg-primary);
1001
2329
  line-height: 1.55;
1002
- vertical-align: top;
2330
+ vertical-align: middle;
1003
2331
  overflow-wrap: anywhere;
1004
2332
  }
1005
- .fractal-sortable-table-td + .fractal-sortable-table-td {
1006
- border-left: 1px solid var(--border-subtle);
2333
+ .fractal-sortable-table--sm .fractal-sortable-table-th {
2334
+ --table-cell-block-padding: 8px;
1007
2335
  }
1008
- .fractal-sortable-table--sm .fractal-sortable-table-th,
1009
2336
  .fractal-sortable-table--sm .fractal-sortable-table-sort-button {
1010
2337
  padding: 8px 12px;
2338
+ --table-cell-block-padding: 8px;
1011
2339
  }
1012
2340
  .fractal-sortable-table--sm .fractal-sortable-table-td {
1013
2341
  padding: 10px 12px;
2342
+ --table-cell-block-padding: 10px;
2343
+ }
2344
+ .fractal-sortable-table--lg .fractal-sortable-table-th {
2345
+ --table-cell-block-padding: 18px;
1014
2346
  }
1015
- .fractal-sortable-table--lg .fractal-sortable-table-th,
1016
2347
  .fractal-sortable-table--lg .fractal-sortable-table-sort-button {
1017
2348
  padding: 18px 24px;
2349
+ --table-cell-block-padding: 18px;
1018
2350
  }
1019
2351
  .fractal-sortable-table--lg .fractal-sortable-table-td {
1020
2352
  padding: 22px 24px;
2353
+ --table-cell-block-padding: 22px;
2354
+ }
2355
+ .fractal-sortable-table-th + .fractal-sortable-table-th,
2356
+ .fractal-sortable-table-td + .fractal-sortable-table-td {
2357
+ border-inline-start: 1px solid var(--border-subtle);
1021
2358
  }
1022
2359
 
1023
2360
  /* src/components/Tabs/Tabs.css */
@@ -1026,17 +2363,60 @@
1026
2363
  font-size: 0.875rem;
1027
2364
  }
1028
2365
  .fractal-tabs-list {
2366
+ position: relative;
1029
2367
  display: flex;
1030
2368
  gap: 24px;
1031
- border-bottom: 1px solid var(--border-subtle);
1032
2369
  margin-bottom: var(--space-6);
1033
2370
  }
2371
+ .fractal-tabs--divider > .fractal-tabs-list {
2372
+ border-bottom: 1px solid var(--border-subtle);
2373
+ }
2374
+ .fractal-tabs--surface > .fractal-tabs-list {
2375
+ width: 100%;
2376
+ gap: 0;
2377
+ margin-bottom: 0;
2378
+ background: var(--bg-surface-1);
2379
+ }
2380
+ .fractal-tabs--surface > .fractal-tabs-list::before {
2381
+ position: absolute;
2382
+ z-index: 3;
2383
+ right: 0;
2384
+ bottom: 0;
2385
+ left: 0;
2386
+ height: 1px;
2387
+ background: var(--border-subtle);
2388
+ content: "";
2389
+ pointer-events: none;
2390
+ }
2391
+ .fractal-tabs-list::after {
2392
+ position: absolute;
2393
+ bottom: -1px;
2394
+ left: 0;
2395
+ width: var(--fractal-tabs-indicator-width, 0px);
2396
+ height: 2px;
2397
+ background: var(--accent-default);
2398
+ content: "";
2399
+ opacity: 0;
2400
+ transform: translateX(var(--fractal-tabs-indicator-offset, 0px));
2401
+ transition:
2402
+ transform 180ms var(--ease-standard, ease),
2403
+ width 180ms var(--ease-standard, ease),
2404
+ opacity 100ms ease;
2405
+ }
2406
+ .fractal-tabs-list[data-indicator-ready=true]::after {
2407
+ opacity: 1;
2408
+ }
2409
+ .fractal-tabs--surface > .fractal-tabs-list::after {
2410
+ display: none;
2411
+ }
1034
2412
  .fractal-tabs-trigger {
1035
2413
  position: relative;
1036
2414
  display: inline-flex;
2415
+ min-width: 88px;
1037
2416
  align-items: center;
2417
+ justify-content: center;
1038
2418
  gap: 6px;
1039
- padding: 10px 0;
2419
+ padding: 10px 1rem;
1040
2420
  background: none;
1041
2421
  border: 0;
1042
2422
  font: inherit;
@@ -1044,8 +2424,7 @@
1044
2424
  font-weight: 400;
1045
2425
  color: var(--fg-secondary);
1046
2426
  cursor: pointer;
1047
- transition: color 0.15s ease, box-shadow 0.15s ease;
1048
- box-shadow: inset 0 -1px 0 transparent;
2427
+ transition: color 0.15s ease;
1049
2428
  margin-bottom: -1px;
1050
2429
  }
1051
2430
  .fractal-tabs-trigger:hover:not(.fractal-tabs-trigger--active):not(.fractal-tabs-trigger--disabled) {
@@ -1059,7 +2438,21 @@
1059
2438
  .fractal-tabs-trigger--active {
1060
2439
  color: var(--accent-default);
1061
2440
  font-weight: 500;
1062
- box-shadow: inset 0 -1px 0 var(--accent-default);
2441
+ }
2442
+ .fractal-tabs:not(.fractal-tabs--divider):not(.fractal-tabs--surface) > .fractal-tabs-list > .fractal-tabs-trigger:not(.fractal-tabs-trigger--active) {
2443
+ box-shadow: inset 0 -1px 0 var(--border-subtle);
2444
+ }
2445
+ .fractal-tabs--surface > .fractal-tabs-list > .fractal-tabs-trigger {
2446
+ margin-bottom: 0;
2447
+ border-right: 1px solid var(--border-subtle);
2448
+ background: var(--bg-surface-1);
2449
+ }
2450
+ .fractal-tabs--surface > .fractal-tabs-list > .fractal-tabs-trigger:hover:not(.fractal-tabs-trigger--active):not(.fractal-tabs-trigger--disabled) {
2451
+ background: var(--hover-surface);
2452
+ }
2453
+ .fractal-tabs--surface > .fractal-tabs-list > .fractal-tabs-trigger--active {
2454
+ background: var(--bg-canvas);
2455
+ color: var(--fg-primary);
1063
2456
  }
1064
2457
  .fractal-tabs-trigger--disabled {
1065
2458
  color: var(--fg-disabled, var(--fg-secondary));
@@ -1070,8 +2463,96 @@
1070
2463
  font-size: 0.875rem;
1071
2464
  color: var(--fg-primary);
1072
2465
  }
1073
- .fractal-tabs-panel[hidden] {
1074
- display: none;
2466
+ .fractal-tabs-panel[hidden] {
2467
+ display: none;
2468
+ }
2469
+ @media (prefers-reduced-motion: reduce) {
2470
+ .fractal-tabs-list::after {
2471
+ transition: none;
2472
+ }
2473
+ }
2474
+
2475
+ /* src/components/ContentSwitcher/ContentSwitcher.css */
2476
+ .fractal-content-switcher {
2477
+ position: relative;
2478
+ display: inline-flex;
2479
+ gap: 2px;
2480
+ padding: 2px;
2481
+ border: 1px solid color-mix(in srgb, var(--border-subtle) 55%, transparent);
2482
+ border-radius: var(--radius-md);
2483
+ background: var(--bg-surface-subtle);
2484
+ font-family: var(--font-sans);
2485
+ }
2486
+ .fractal-content-switcher__indicator {
2487
+ position: absolute;
2488
+ top: 0;
2489
+ left: 0;
2490
+ width: var(--fractal-content-switcher-indicator-width, 0);
2491
+ height: var(--fractal-content-switcher-indicator-height, 0);
2492
+ border-radius: var(--radius-sm);
2493
+ background: var(--bg-canvas);
2494
+ box-shadow: var(--shadow-sm);
2495
+ opacity: 0;
2496
+ pointer-events: none;
2497
+ transform: translate3d(var(--fractal-content-switcher-indicator-x, 0), var(--fractal-content-switcher-indicator-y, 0), 0);
2498
+ }
2499
+ .fractal-content-switcher[data-indicator-ready=true] .fractal-content-switcher__indicator {
2500
+ opacity: 1;
2501
+ }
2502
+ .fractal-content-switcher[data-indicator-ready=true][data-indicator-animate=true] .fractal-content-switcher__indicator {
2503
+ transition:
2504
+ transform var(--duration-normal) var(--ease-in-out),
2505
+ width var(--duration-normal) var(--ease-in-out),
2506
+ height var(--duration-normal) var(--ease-in-out),
2507
+ opacity var(--duration-fast) var(--ease-out);
2508
+ }
2509
+ .fractal-content-switcher--full-width {
2510
+ display: flex;
2511
+ width: 100%;
2512
+ }
2513
+ .fractal-content-switcher__item {
2514
+ position: relative;
2515
+ z-index: 1;
2516
+ min-width: 128px;
2517
+ min-height: 40px;
2518
+ padding: 0 var(--space-4);
2519
+ border: 0;
2520
+ border-radius: var(--radius-sm);
2521
+ background: transparent;
2522
+ color: var(--fg-secondary);
2523
+ cursor: pointer;
2524
+ font: inherit;
2525
+ font-size: 0.875rem;
2526
+ line-height: 1.25;
2527
+ text-align: center;
2528
+ transition: background-color var(--duration-fast) var(--ease-out), color var(--duration-fast) var(--ease-out);
2529
+ }
2530
+ .fractal-content-switcher--full-width .fractal-content-switcher__item {
2531
+ flex: 1;
2532
+ }
2533
+ .fractal-content-switcher__item:hover:not(:disabled):not(.fractal-content-switcher__item--active) {
2534
+ background: var(--hover-surface);
2535
+ color: var(--fg-primary);
2536
+ }
2537
+ .fractal-content-switcher__item--active {
2538
+ background: transparent;
2539
+ color: var(--fg-primary);
2540
+ }
2541
+ .fractal-content-switcher__item:focus-visible {
2542
+ position: relative;
2543
+ z-index: 1;
2544
+ outline: 2px solid var(--border-focus);
2545
+ outline-offset: -2px;
2546
+ }
2547
+ .fractal-content-switcher__item:disabled {
2548
+ cursor: not-allowed;
2549
+ color: var(--fg-disabled);
2550
+ opacity: 0.5;
2551
+ }
2552
+ @media (prefers-reduced-motion: reduce) {
2553
+ .fractal-content-switcher[data-indicator-ready=true][data-indicator-animate=true] .fractal-content-switcher__indicator {
2554
+ transition: none;
2555
+ }
1075
2556
  }
1076
2557
 
1077
2558
  /* src/components/Disclosure/Disclosure.css */
@@ -1104,6 +2585,17 @@
1104
2585
  .fractal-disclosure-trigger:hover {
1105
2586
  background: var(--bg-surface-1);
1106
2587
  }
2588
+ .fractal-disclosure--disabled .fractal-disclosure-trigger {
2589
+ color: var(--fg-tertiary);
2590
+ cursor: not-allowed;
2591
+ }
2592
+ .fractal-disclosure--disabled .fractal-disclosure-trigger:hover {
2593
+ background: transparent;
2594
+ }
2595
+ .fractal-disclosure--disabled .fractal-disclosure-icon,
2596
+ .fractal-disclosure--disabled .fractal-disclosure-meta {
2597
+ color: var(--fg-tertiary);
2598
+ }
1107
2599
  .fractal-disclosure-trigger:focus-visible {
1108
2600
  outline: 2px solid var(--border-focus);
1109
2601
  outline-offset: -2px;
@@ -1146,9 +2638,378 @@
1146
2638
  padding: 4px 0 12px 24px;
1147
2639
  }
1148
2640
 
2641
+ /* src/components/LatticeLoader/LatticeLoader.css */
2642
+ .fractal-lattice-loader {
2643
+ display: flex;
2644
+ align-items: center;
2645
+ gap: 6px;
2646
+ width: 100%;
2647
+ height: 12px;
2648
+ overflow: hidden;
2649
+ color: var(--fg-secondary);
2650
+ }
2651
+ .fractal-lattice-loader__cell {
2652
+ position: relative;
2653
+ width: 12px;
2654
+ flex: 0 0 12px;
2655
+ aspect-ratio: 1;
2656
+ background: currentColor;
2657
+ -webkit-mask: url("./lattice-FAYE5KWW.svg") center / contain no-repeat;
2658
+ mask: url("./lattice-FAYE5KWW.svg") center / contain no-repeat;
2659
+ opacity: 0.08;
2660
+ animation: fractal-lattice-wave 3.2s ease-in-out infinite;
2661
+ animation-delay: calc((var(--fractal-lattice-index) * 40ms) - 3.2s);
2662
+ }
2663
+ @keyframes fractal-lattice-wave {
2664
+ 0%, 58%, 100% {
2665
+ opacity: 0.08;
2666
+ }
2667
+ 18% {
2668
+ opacity: 0.28;
2669
+ }
2670
+ 30% {
2671
+ opacity: 1;
2672
+ }
2673
+ 42% {
2674
+ opacity: 0.28;
2675
+ }
2676
+ }
2677
+ @media (prefers-reduced-motion: reduce) {
2678
+ .fractal-lattice-loader__cell {
2679
+ opacity: 0.35;
2680
+ animation: none;
2681
+ }
2682
+ }
2683
+
2684
+ /* src/components/Ghost/Ghost.css */
2685
+ .fractal-ghost {
2686
+ --fractal-ghost-base: var(--bg-surface-1);
2687
+ --fractal-ghost-shine: color-mix(in srgb, var(--bg-canvas) 82%, transparent);
2688
+ position: relative;
2689
+ display: block;
2690
+ min-width: 0;
2691
+ min-height: 1px;
2692
+ overflow: hidden;
2693
+ background: var(--fractal-ghost-base);
2694
+ border-radius: var(--radius-sm);
2695
+ }
2696
+ .fractal-ghost::after {
2697
+ position: absolute;
2698
+ top: 0;
2699
+ bottom: 0;
2700
+ left: -50%;
2701
+ width: 50%;
2702
+ background:
2703
+ linear-gradient(
2704
+ 105deg,
2705
+ transparent 0%,
2706
+ var(--fractal-ghost-shine) 50%,
2707
+ transparent 100%);
2708
+ content: "";
2709
+ pointer-events: none;
2710
+ transform: translate3d(-100%, 0, 0);
2711
+ animation: fractal-ghost-shine var(--duration-ambient) linear infinite;
2712
+ will-change: transform;
2713
+ }
2714
+ .fractal-ghost-line {
2715
+ height: 0.875rem;
2716
+ }
2717
+ .fractal-ghost-line--sm {
2718
+ height: 0.6875rem;
2719
+ }
2720
+ .fractal-ghost-line--lg {
2721
+ height: 1.125rem;
2722
+ }
2723
+ .fractal-ghost-stack {
2724
+ display: grid;
2725
+ gap: var(--space-2);
2726
+ }
2727
+ .fractal-ghost-button {
2728
+ height: var(--control-min-block-size);
2729
+ border-radius: var(--radius-full);
2730
+ }
2731
+ .fractal-ghost-button--sm {
2732
+ width: 84px;
2733
+ }
2734
+ .fractal-ghost-button--md {
2735
+ width: 96px;
2736
+ }
2737
+ .fractal-ghost-button--lg {
2738
+ width: 108px;
2739
+ }
2740
+ .fractal-ghost-button--xl {
2741
+ width: 128px;
2742
+ }
2743
+ .fractal-ghost-button--icon-only {
2744
+ width: var(--control-min-block-size);
2745
+ }
2746
+ .fractal-ghost-card {
2747
+ display: grid;
2748
+ gap: var(--space-4);
2749
+ padding: var(--space-5);
2750
+ border: 1px solid var(--border-subtle);
2751
+ border-radius: var(--radius-md);
2752
+ background: var(--bg-canvas);
2753
+ }
2754
+ .fractal-ghost-table {
2755
+ overflow: hidden;
2756
+ border: 1px solid var(--border-subtle);
2757
+ border-radius: var(--radius-md);
2758
+ background: var(--bg-canvas);
2759
+ }
2760
+ .fractal-ghost-table__table {
2761
+ width: 100%;
2762
+ border-collapse: separate;
2763
+ border-spacing: 0;
2764
+ }
2765
+ .fractal-ghost-table__head-row {
2766
+ background: var(--bg-surface-1);
2767
+ }
2768
+ .fractal-ghost-table th {
2769
+ padding: 12px 16px;
2770
+ border-bottom: 1px solid var(--border-subtle);
2771
+ color: var(--fg-secondary);
2772
+ font-size: 0.75rem;
2773
+ font-weight: 500;
2774
+ text-align: left;
2775
+ }
2776
+ .fractal-ghost-table td {
2777
+ padding: 14px 16px;
2778
+ }
2779
+ .fractal-ghost-table__row + .fractal-ghost-table__row td {
2780
+ border-top: 1px solid var(--border-subtle);
2781
+ }
2782
+ .fractal-ghost-table--sm th {
2783
+ padding: 8px 12px;
2784
+ }
2785
+ .fractal-ghost-table--sm td {
2786
+ padding: 10px 12px;
2787
+ }
2788
+ .fractal-ghost-table--lg th {
2789
+ padding: 18px 24px;
2790
+ }
2791
+ .fractal-ghost-table--lg td {
2792
+ padding: 22px 24px;
2793
+ }
2794
+ .fractal-ghost-field {
2795
+ display: grid;
2796
+ gap: var(--control-label-gap);
2797
+ }
2798
+ .fractal-ghost-field > .fractal-ghost-label {
2799
+ height: var(--control-line-height);
2800
+ }
2801
+ .fractal-ghost-field__control {
2802
+ box-sizing: border-box;
2803
+ width: 100%;
2804
+ height: var(--control-min-block-size);
2805
+ border: 1px solid var(--border-subtle);
2806
+ border-radius: var(--radius-md);
2807
+ }
2808
+ .fractal-ghost-field__control--multiline {
2809
+ height: 112px;
2810
+ }
2811
+ .fractal-ghost-label {
2812
+ border-radius: var(--radius-sm);
2813
+ }
2814
+ .fractal-ghost-alert {
2815
+ display: grid;
2816
+ gap: var(--space-2);
2817
+ padding: var(--space-4);
2818
+ border: 1px solid var(--border-subtle);
2819
+ border-radius: var(--radius-md);
2820
+ }
2821
+ .fractal-ghost-choice {
2822
+ display: flex;
2823
+ align-items: center;
2824
+ gap: var(--space-2);
2825
+ }
2826
+ .fractal-ghost-choice__control {
2827
+ width: 16px;
2828
+ height: 16px;
2829
+ border-radius: var(--radius-sm);
2830
+ }
2831
+ .fractal-ghost-chip {
2832
+ border-radius: var(--radius-full);
2833
+ }
2834
+ .fractal-ghost-link {
2835
+ display: inline-block;
2836
+ }
2837
+ .fractal-ghost-dropdown {
2838
+ display: flex;
2839
+ align-items: center;
2840
+ justify-content: space-between;
2841
+ box-sizing: border-box;
2842
+ width: 220px;
2843
+ height: var(--control-min-block-size);
2844
+ padding: 0 var(--control-padding-inline);
2845
+ border: 1px solid var(--border-subtle);
2846
+ border-radius: var(--radius-md);
2847
+ }
2848
+ .fractal-ghost-dropdown__chevron {
2849
+ width: 14px;
2850
+ height: 14px;
2851
+ border-radius: var(--radius-full);
2852
+ }
2853
+ .fractal-ghost-switcher {
2854
+ display: flex;
2855
+ width: fit-content;
2856
+ gap: 2px;
2857
+ padding: 3px;
2858
+ border-radius: var(--radius-md);
2859
+ background: var(--bg-surface-1);
2860
+ }
2861
+ .fractal-ghost-switcher > .fractal-ghost {
2862
+ width: 76px;
2863
+ height: 32px;
2864
+ border-radius: calc(var(--radius-md) - 2px);
2865
+ }
2866
+ .fractal-ghost-disclosure {
2867
+ display: flex;
2868
+ align-items: center;
2869
+ gap: var(--space-3);
2870
+ padding: var(--space-3) 0;
2871
+ border-bottom: 1px solid var(--border-subtle);
2872
+ }
2873
+ .fractal-ghost-disclosure__icon {
2874
+ width: 16px;
2875
+ height: 16px;
2876
+ border-radius: var(--radius-full);
2877
+ }
2878
+ .fractal-ghost-pagination {
2879
+ display: flex;
2880
+ gap: var(--space-2);
2881
+ }
2882
+ .fractal-ghost-pagination > .fractal-ghost {
2883
+ width: 32px;
2884
+ height: 32px;
2885
+ border-radius: var(--radius-md);
2886
+ }
2887
+ .fractal-ghost-dropzone {
2888
+ display: grid;
2889
+ place-items: center;
2890
+ gap: var(--space-3);
2891
+ min-height: 184px;
2892
+ padding: var(--space-6);
2893
+ border: 1px dashed var(--border-default);
2894
+ border-radius: var(--radius-md);
2895
+ }
2896
+ .fractal-ghost-dropzone__icon {
2897
+ width: 32px;
2898
+ height: 32px;
2899
+ border-radius: var(--radius-full);
2900
+ }
2901
+ .fractal-ghost-prompt-card {
2902
+ min-height: 176px;
2903
+ }
2904
+ .fractal-ghost-conversation {
2905
+ display: flex;
2906
+ width: 100%;
2907
+ min-width: 0;
2908
+ flex-direction: column;
2909
+ gap: var(--space-6);
2910
+ }
2911
+ .fractal-ghost-conversation__message {
2912
+ display: grid;
2913
+ width: min(92%, 42rem);
2914
+ min-width: 0;
2915
+ gap: var(--space-2);
2916
+ }
2917
+ .fractal-ghost-conversation__message--user {
2918
+ width: min(78%, 36rem);
2919
+ align-self: flex-end;
2920
+ }
2921
+ .fractal-ghost-conversation__bubble {
2922
+ --fractal-ghost-base: color-mix(in srgb, var(--accent-text) 12%, transparent);
2923
+ --fractal-ghost-shine: color-mix(in srgb, var(--accent-text) 5%, transparent);
2924
+ display: grid;
2925
+ gap: var(--space-2);
2926
+ padding: var(--space-4);
2927
+ border: 1px solid var(--accent-surface-stroke);
2928
+ border-radius: 12px 12px 4px;
2929
+ background: var(--accent-surface-stroke);
2930
+ }
2931
+ .fractal-ghost-sidebar {
2932
+ display: grid;
2933
+ align-content: start;
2934
+ gap: var(--space-7);
2935
+ width: 248px;
2936
+ min-height: 100%;
2937
+ padding: var(--space-5);
2938
+ border-right: 1px solid var(--border-subtle);
2939
+ background: var(--bg-canvas);
2940
+ }
2941
+ .fractal-ghost-sidebar__brand {
2942
+ width: 112px;
2943
+ height: 24px;
2944
+ }
2945
+ .fractal-ghost-sidebar__items {
2946
+ display: grid;
2947
+ gap: var(--space-2);
2948
+ }
2949
+ .fractal-ghost-sidebar__item {
2950
+ display: flex;
2951
+ align-items: center;
2952
+ gap: var(--space-3);
2953
+ height: 36px;
2954
+ padding: 0 var(--space-2);
2955
+ }
2956
+ .fractal-ghost-sidebar__item > .fractal-ghost {
2957
+ width: 16px;
2958
+ height: 16px;
2959
+ border-radius: var(--radius-sm);
2960
+ }
2961
+ .fractal-ghost-surface {
2962
+ display: grid;
2963
+ gap: var(--space-5);
2964
+ padding: var(--space-6);
2965
+ border: 1px solid var(--border-subtle);
2966
+ border-radius: var(--radius-lg);
2967
+ background: var(--bg-canvas);
2968
+ }
2969
+ .fractal-ghost-modal {
2970
+ width: min(100%, 420px);
2971
+ }
2972
+ .fractal-ghost-side-panel {
2973
+ width: min(100%, 540px);
2974
+ min-height: 480px;
2975
+ }
2976
+ .fractal-ghost-surface__header {
2977
+ display: flex;
2978
+ align-items: center;
2979
+ justify-content: space-between;
2980
+ }
2981
+ .fractal-ghost-surface__close {
2982
+ width: 28px;
2983
+ height: 28px;
2984
+ border-radius: var(--radius-md);
2985
+ }
2986
+ .fractal-ghost-surface__title {
2987
+ color: var(--fg-secondary);
2988
+ font-size: 0.75rem;
2989
+ }
2990
+ @keyframes fractal-ghost-shine {
2991
+ from {
2992
+ transform: translate3d(-100%, 0, 0);
2993
+ }
2994
+ to {
2995
+ transform: translate3d(300%, 0, 0);
2996
+ }
2997
+ }
2998
+ @media (prefers-reduced-motion: reduce) {
2999
+ .fractal-ghost::after {
3000
+ display: none;
3001
+ animation: none;
3002
+ }
3003
+ }
3004
+
1149
3005
  /* src/components/Sidebar/Sidebar.css */
3006
+ .fractal-sidebar:not([data-fractal-border-surface]) {
3007
+ --border-subtle: var(--border-on-surface-1);
3008
+ --border-default: var(--border-subtle);
3009
+ }
1150
3010
  .fractal-sidebar {
1151
3011
  --fractal-sidebar-width: 232px;
3012
+ --fractal-sidebar-compact-width: 56px;
1152
3013
  box-sizing: border-box;
1153
3014
  display: flex;
1154
3015
  width: var(--fractal-sidebar-width);
@@ -1156,17 +3017,47 @@
1156
3017
  min-height: 100%;
1157
3018
  flex-direction: column;
1158
3019
  background: var(--bg-surface-1);
1159
- border-right: 1px solid var(--nav-border);
3020
+ border-right: 1px solid var(--border-subtle);
1160
3021
  color: var(--fg-primary);
1161
3022
  font-family: var(--font-sans);
1162
3023
  }
3024
+ .fractal-sidebar[data-compact] {
3025
+ z-index: 10;
3026
+ width: var(--fractal-sidebar-compact-width);
3027
+ min-width: var(--fractal-sidebar-compact-width);
3028
+ overflow: hidden;
3029
+ transition:
3030
+ width var(--duration-normal) var(--ease-out),
3031
+ min-width var(--duration-normal) var(--ease-out),
3032
+ box-shadow var(--duration-normal) var(--ease-out);
3033
+ }
3034
+ .fractal-sidebar[data-compact]:hover,
3035
+ .fractal-sidebar[data-compact]:focus-within {
3036
+ width: var(--fractal-sidebar-width);
3037
+ min-width: var(--fractal-sidebar-width);
3038
+ box-shadow: var(--shadow-md);
3039
+ }
3040
+ .fractal-shell-header,
1163
3041
  .fractal-sidebar__header {
3042
+ box-sizing: border-box;
1164
3043
  display: flex;
1165
- min-height: 48px;
3044
+ block-size: var(--shell-header-height);
3045
+ min-block-size: var(--shell-header-height);
3046
+ max-block-size: var(--shell-header-height);
3047
+ min-inline-size: 0;
3048
+ flex-shrink: 0;
1166
3049
  align-items: center;
1167
- padding: 0 var(--space-4);
3050
+ padding-block: 0;
1168
3051
  border-bottom: 1px solid var(--border-subtle);
1169
3052
  }
3053
+ .fractal-shell-header {
3054
+ justify-content: space-between;
3055
+ gap: var(--space-4);
3056
+ padding-inline: var(--space-4);
3057
+ }
3058
+ .fractal-sidebar__header {
3059
+ padding-inline: var(--space-2);
3060
+ }
1170
3061
  .fractal-sidebar__brand {
1171
3062
  display: inline-flex;
1172
3063
  min-width: 0;
@@ -1189,10 +3080,55 @@
1189
3080
  transform: scale(0.98);
1190
3081
  }
1191
3082
  .fractal-sidebar__brand:focus-visible,
1192
- .fractal-sidebar__nav-item:focus-visible {
3083
+ .fractal-sidebar__nav-item:focus-visible,
3084
+ .fractal-sidebar__account-trigger:focus-visible {
1193
3085
  outline: 2px solid var(--border-focus);
1194
3086
  outline-offset: 2px;
1195
3087
  }
3088
+ .fractal-sidebar__account {
3089
+ display: block;
3090
+ width: 100%;
3091
+ }
3092
+ .fractal-sidebar__account-trigger {
3093
+ width: 100%;
3094
+ min-height: 36px;
3095
+ box-sizing: border-box;
3096
+ gap: var(--space-2);
3097
+ padding: 8px 10px;
3098
+ border: 0;
3099
+ background: transparent;
3100
+ border-radius: var(--radius-md);
3101
+ color: var(--fg-primary);
3102
+ font-weight: 500;
3103
+ }
3104
+ .fractal-sidebar__account-trigger:hover,
3105
+ .fractal-sidebar__account-trigger.fractal-dropdown-trigger--tertiary:hover {
3106
+ background: var(--nav-hover);
3107
+ }
3108
+ .fractal-sidebar__account-name {
3109
+ min-width: 0;
3110
+ flex: 1;
3111
+ overflow: hidden;
3112
+ text-overflow: ellipsis;
3113
+ white-space: nowrap;
3114
+ }
3115
+ .fractal-sidebar__account-icon {
3116
+ display: inline-flex;
3117
+ width: 18px;
3118
+ height: 18px;
3119
+ flex: 0 0 18px;
3120
+ align-items: center;
3121
+ justify-content: center;
3122
+ }
3123
+ .fractal-sidebar__account-icon > img,
3124
+ .fractal-sidebar__account-icon > svg {
3125
+ display: block;
3126
+ width: 18px;
3127
+ height: 18px;
3128
+ }
3129
+ .fractal-sidebar__account-panel {
3130
+ min-width: 100%;
3131
+ }
1196
3132
  .fractal-sidebar__nav {
1197
3133
  display: flex;
1198
3134
  flex: 1;
@@ -1284,6 +3220,7 @@
1284
3220
  border-top: 1px solid var(--border-subtle);
1285
3221
  }
1286
3222
  @media (prefers-reduced-motion: reduce) {
3223
+ .fractal-sidebar[data-compact],
1287
3224
  .fractal-sidebar__brand,
1288
3225
  .fractal-sidebar__nav-item {
1289
3226
  transition: none;
@@ -1298,7 +3235,7 @@
1298
3235
  display: flex;
1299
3236
  justify-content: flex-end;
1300
3237
  background: color-mix(in srgb, var(--fg-primary) 16%, transparent);
1301
- animation: fractal-side-panel-overlay-in 180ms ease-out both;
3238
+ animation: fractal-side-panel-overlay-in var(--duration-normal) var(--ease-out) both;
1302
3239
  }
1303
3240
  .fractal-side-panel {
1304
3241
  display: flex;
@@ -1310,7 +3247,7 @@
1310
3247
  box-shadow: var(--shadow-lg);
1311
3248
  color: var(--fg-primary);
1312
3249
  font-family: var(--font-sans);
1313
- animation: fractal-side-panel-in 180ms cubic-bezier(0.16, 1, 0.3, 1) both;
3250
+ animation: fractal-side-panel-in var(--duration-normal) var(--ease-out) both;
1314
3251
  }
1315
3252
  .fractal-side-panel--sm {
1316
3253
  width: min(100vw, 420px);
@@ -1321,9 +3258,11 @@
1321
3258
  .fractal-side-panel--lg {
1322
3259
  width: min(100vw, 680px);
1323
3260
  }
3261
+ .fractal-side-panel--xl {
3262
+ width: min(100vw, 960px);
3263
+ }
1324
3264
  .fractal-side-panel__header {
1325
3265
  display: flex;
1326
- min-height: 72px;
1327
3266
  align-items: flex-start;
1328
3267
  justify-content: space-between;
1329
3268
  gap: var(--space-4);
@@ -1333,6 +3272,9 @@
1333
3272
  min-width: 0;
1334
3273
  }
1335
3274
  .fractal-side-panel__title {
3275
+ display: flex;
3276
+ min-height: 32px;
3277
+ align-items: center;
1336
3278
  margin: 0;
1337
3279
  font-size: 1rem;
1338
3280
  font-weight: 500;
@@ -1370,12 +3312,42 @@
1370
3312
  overflow: auto;
1371
3313
  padding: var(--space-2) var(--space-6) var(--space-6);
1372
3314
  }
3315
+ .fractal-side-panel__body--loading {
3316
+ display: grid;
3317
+ place-items: center;
3318
+ }
1373
3319
  .fractal-side-panel__footer {
1374
3320
  display: flex;
1375
3321
  justify-content: flex-end;
1376
3322
  gap: var(--space-2);
1377
3323
  padding: var(--space-4) var(--space-6);
1378
- border-top: 1px solid var(--border-subtle);
3324
+ border-top: 1px solid transparent;
3325
+ }
3326
+ .fractal-side-panel__header,
3327
+ .fractal-side-panel__footer {
3328
+ position: relative;
3329
+ flex-shrink: 0;
3330
+ }
3331
+ .fractal-side-panel__header::after,
3332
+ .fractal-side-panel__footer::before {
3333
+ content: "";
3334
+ position: absolute;
3335
+ inset-inline: 0;
3336
+ height: 1px;
3337
+ background: var(--border-subtle);
3338
+ opacity: 0;
3339
+ pointer-events: none;
3340
+ transition: opacity var(--duration-fast) var(--ease-out);
3341
+ }
3342
+ .fractal-side-panel__header::after {
3343
+ bottom: 0;
3344
+ }
3345
+ .fractal-side-panel__footer::before {
3346
+ top: -1px;
3347
+ }
3348
+ .fractal-side-panel__header[data-scroll-divider=true]::after,
3349
+ .fractal-side-panel__footer[data-scroll-divider=true]::before {
3350
+ opacity: 1;
1379
3351
  }
1380
3352
  @media (max-width: 640px) {
1381
3353
  .fractal-side-panel {
@@ -1410,7 +3382,11 @@
1410
3382
  @media (prefers-reduced-motion: reduce) {
1411
3383
  .fractal-side-panel-overlay,
1412
3384
  .fractal-side-panel {
1413
- animation-duration: 0.01ms;
3385
+ animation: none;
3386
+ }
3387
+ .fractal-side-panel__header::after,
3388
+ .fractal-side-panel__footer::before {
3389
+ transition: none;
1414
3390
  }
1415
3391
  }
1416
3392
 
@@ -1420,7 +3396,7 @@
1420
3396
  width: 100%;
1421
3397
  min-height: 120px;
1422
3398
  resize: vertical;
1423
- border: 1px solid var(--border-default);
3399
+ border: 1px solid var(--border-subtle);
1424
3400
  border-radius: var(--radius-md);
1425
3401
  background: var(--bg-canvas);
1426
3402
  padding: var(--space-3);
@@ -1430,9 +3406,6 @@
1430
3406
  .fractal-textarea::placeholder {
1431
3407
  color: var(--fg-placeholder);
1432
3408
  }
1433
- .fractal-textarea:hover {
1434
- border-color: var(--fg-tertiary);
1435
- }
1436
3409
  .fractal-textarea:focus-visible {
1437
3410
  outline: none;
1438
3411
  border-color: var(--border-focus);
@@ -1443,4 +3416,358 @@
1443
3416
  opacity: 0.5;
1444
3417
  background: var(--bg-surface-1);
1445
3418
  }
3419
+ .fractal-textarea[data-text-style=prose] {
3420
+ font-family: var(--font-sans);
3421
+ font-size: var(--control-md-font-size);
3422
+ line-height: var(--control-md-line-height);
3423
+ }
3424
+ .fractal-floating-field--textarea > .fractal-floating-field__label {
3425
+ transform: translateY(calc(var(--space-3) + 1px));
3426
+ }
3427
+ .fractal-floating-field--textarea:where(:focus-within, :has(textarea:not(:placeholder-shown))) > .fractal-floating-field__label {
3428
+ transform: translateY(-50%) scale(0.75);
3429
+ }
3430
+
3431
+ /* src/components/TextButton/TextButton.css */
3432
+ .fractal-text-button {
3433
+ display: inline-flex;
3434
+ align-items: center;
3435
+ gap: var(--space-1);
3436
+ border: 0;
3437
+ background: transparent;
3438
+ cursor: pointer;
3439
+ font-family: var(--font-sans);
3440
+ font-weight: 500;
3441
+ line-height: 1.4;
3442
+ padding: 0;
3443
+ text-align: left;
3444
+ transition: color 120ms ease;
3445
+ }
3446
+ .fractal-text-button--primary {
3447
+ color: var(--fg-primary);
3448
+ }
3449
+ .fractal-text-button--primary:hover:not(:disabled) {
3450
+ color: var(--fg-secondary);
3451
+ }
3452
+ .fractal-text-button--secondary {
3453
+ color: var(--fg-secondary);
3454
+ }
3455
+ .fractal-text-button--secondary:hover:not(:disabled) {
3456
+ color: var(--fg-primary);
3457
+ }
3458
+ .fractal-text-button:focus-visible {
3459
+ outline: 2px solid var(--border-focus);
3460
+ outline-offset: 3px;
3461
+ border-radius: var(--radius-sm);
3462
+ }
3463
+ .fractal-text-button:disabled {
3464
+ cursor: not-allowed;
3465
+ opacity: 0.5;
3466
+ }
3467
+ .fractal-text-button--sm {
3468
+ font-size: 0.8125rem;
3469
+ }
3470
+ .fractal-text-button--md {
3471
+ font-size: 0.875rem;
3472
+ }
3473
+ .fractal-text-button__icon {
3474
+ display: inline-grid;
3475
+ place-items: center;
3476
+ }
3477
+
3478
+ /* src/components/FileDropzone/FileDropzone.css */
3479
+ .fractal-file-dropzone {
3480
+ display: grid;
3481
+ gap: var(--space-2);
3482
+ color: var(--fg-primary);
3483
+ font-family: var(--font-sans);
3484
+ }
3485
+ .fractal-file-dropzone__input {
3486
+ display: none;
3487
+ }
3488
+ .fractal-file-dropzone__target {
3489
+ display: flex;
3490
+ width: 100%;
3491
+ min-height: 92px;
3492
+ align-items: center;
3493
+ justify-content: center;
3494
+ gap: var(--space-3);
3495
+ border: 1px dashed var(--border-default);
3496
+ border-radius: var(--radius-md);
3497
+ background: var(--bg-canvas);
3498
+ color: var(--fg-secondary);
3499
+ cursor: pointer;
3500
+ padding: var(--space-4);
3501
+ text-align: left;
3502
+ }
3503
+ .fractal-file-dropzone__target:hover,
3504
+ .fractal-file-dropzone__target[data-dragging] {
3505
+ border-color: var(--border-focus);
3506
+ background: var(--hover-surface);
3507
+ color: var(--fg-primary);
3508
+ }
3509
+ .fractal-file-dropzone__target:focus-visible {
3510
+ outline: 2px solid var(--border-focus);
3511
+ outline-offset: 2px;
3512
+ }
3513
+ .fractal-file-dropzone__target:disabled {
3514
+ cursor: not-allowed;
3515
+ opacity: 0.5;
3516
+ }
3517
+ .fractal-file-dropzone__copy {
3518
+ display: grid;
3519
+ gap: var(--space-1);
3520
+ }
3521
+ .fractal-file-dropzone__title {
3522
+ font-size: 0.875rem;
3523
+ font-weight: 500;
3524
+ line-height: 1.4;
3525
+ }
3526
+ .fractal-file-dropzone__description {
3527
+ color: var(--fg-secondary);
3528
+ font-size: 0.8125rem;
3529
+ line-height: 1.4;
3530
+ }
3531
+ .fractal-file-dropzone__files {
3532
+ display: grid;
3533
+ gap: var(--space-1);
3534
+ margin: 0;
3535
+ padding: 0;
3536
+ list-style: none;
3537
+ }
3538
+ .fractal-file-dropzone__file {
3539
+ display: flex;
3540
+ min-width: 0;
3541
+ align-items: center;
3542
+ gap: var(--space-2);
3543
+ padding: var(--space-2) var(--space-3);
3544
+ border: 1px solid var(--border-subtle);
3545
+ border-radius: var(--radius-md);
3546
+ background: var(--bg-canvas);
3547
+ font-size: 0.8125rem;
3548
+ line-height: 1.4;
3549
+ }
3550
+ .fractal-file-dropzone__file-name {
3551
+ min-width: 0;
3552
+ flex: 1;
3553
+ overflow: hidden;
3554
+ text-overflow: ellipsis;
3555
+ white-space: nowrap;
3556
+ }
3557
+ .fractal-file-dropzone__file-meta {
3558
+ color: var(--fg-secondary);
3559
+ white-space: nowrap;
3560
+ }
3561
+ .fractal-file-dropzone__remove {
3562
+ display: grid;
3563
+ width: 24px;
3564
+ height: 24px;
3565
+ flex: 0 0 auto;
3566
+ place-items: center;
3567
+ border: 0;
3568
+ border-radius: var(--radius-sm);
3569
+ background: transparent;
3570
+ color: var(--fg-secondary);
3571
+ cursor: pointer;
3572
+ }
3573
+ .fractal-file-dropzone__remove:hover {
3574
+ background: var(--hover-surface);
3575
+ color: var(--fg-primary);
3576
+ }
3577
+ .fractal-file-dropzone__remove:focus-visible {
3578
+ outline: 2px solid var(--border-focus);
3579
+ outline-offset: 1px;
3580
+ }
3581
+ .fractal-file-dropzone__remove:disabled {
3582
+ cursor: not-allowed;
3583
+ opacity: 0.5;
3584
+ }
3585
+
3586
+ /* src/components/Pagination/Pagination.css */
3587
+ .fractal-pagination {
3588
+ display: flex;
3589
+ align-items: center;
3590
+ justify-content: space-between;
3591
+ gap: var(--space-3);
3592
+ color: var(--fg-secondary);
3593
+ font-family: var(--font-sans);
3594
+ font-size: 0.8125rem;
3595
+ line-height: 1.4;
3596
+ }
3597
+ .fractal-pagination__controls {
3598
+ display: flex;
3599
+ align-items: center;
3600
+ gap: var(--space-2);
3601
+ }
3602
+ .fractal-pagination__page-size .fractal-dropdown-trigger {
3603
+ padding: 4px 0;
3604
+ border: 0;
3605
+ background: transparent;
3606
+ color: var(--fg-secondary);
3607
+ }
3608
+ .fractal-pagination__page-size .fractal-dropdown-trigger:hover {
3609
+ background: transparent;
3610
+ color: var(--fg-primary);
3611
+ }
3612
+ .fractal-pagination__button {
3613
+ display: grid;
3614
+ width: 28px;
3615
+ height: 28px;
3616
+ place-items: center;
3617
+ border: 1px solid var(--border-default);
3618
+ border-radius: var(--radius-sm);
3619
+ background: var(--bg-canvas);
3620
+ color: var(--fg-secondary);
3621
+ cursor: pointer;
3622
+ }
3623
+ .fractal-pagination__button:hover:not(:disabled) {
3624
+ background: var(--hover-surface);
3625
+ color: var(--fg-primary);
3626
+ }
3627
+ .fractal-pagination__button:focus-visible {
3628
+ outline: 2px solid var(--border-focus);
3629
+ outline-offset: 2px;
3630
+ }
3631
+ .fractal-pagination__button:disabled {
3632
+ cursor: not-allowed;
3633
+ opacity: 0.45;
3634
+ }
3635
+ .fractal-pagination__page {
3636
+ min-width: 44px;
3637
+ text-align: center;
3638
+ white-space: nowrap;
3639
+ }
3640
+
3641
+ /* src/components/ColumnEditor/ColumnEditor.css */
3642
+ .fractal-column-editor {
3643
+ position: relative;
3644
+ }
3645
+ .fractal-column-editor__panel {
3646
+ position: absolute;
3647
+ z-index: 60;
3648
+ top: calc(100% + var(--space-2));
3649
+ right: 0;
3650
+ width: min(440px, calc(100vw - var(--space-7)));
3651
+ box-sizing: border-box;
3652
+ padding: var(--space-4);
3653
+ border: 1px solid var(--border-subtle);
3654
+ border-radius: var(--radius-lg);
3655
+ background: var(--bg-canvas);
3656
+ box-shadow: var(--shadow-md);
3657
+ max-height: 72dvh;
3658
+ overflow-y: auto;
3659
+ font-family: var(--font-sans);
3660
+ font-size: .875rem;
3661
+ }
3662
+ .fractal-column-editor__panel:focus-visible {
3663
+ outline: 2px solid var(--border-focus);
3664
+ outline-offset: 2px;
3665
+ }
3666
+ .fractal-column-editor__list {
3667
+ display: grid;
3668
+ gap: var(--space-2);
3669
+ padding: 0;
3670
+ margin: 0;
3671
+ list-style: none;
3672
+ min-height: var(--space-4);
3673
+ }
3674
+ .fractal-column-editor__row {
3675
+ display: flex;
3676
+ align-items: center;
3677
+ gap: var(--space-2);
3678
+ padding: var(--space-2);
3679
+ border: 1px solid var(--border-subtle);
3680
+ border-radius: var(--radius-md);
3681
+ color: var(--fg-primary);
3682
+ background: var(--bg-canvas);
3683
+ cursor: grab;
3684
+ user-select: none;
3685
+ touch-action: none;
3686
+ transition: background-color var(--duration-fast) var(--ease-out), border-color var(--duration-fast) var(--ease-out);
3687
+ }
3688
+ .fractal-column-editor__row[data-hidden] {
3689
+ color: var(--fg-disabled);
3690
+ background: var(--bg-surface-1);
3691
+ }
3692
+ .fractal-column-editor__row:hover {
3693
+ background: var(--hover-surface);
3694
+ }
3695
+ .fractal-column-editor__row[data-dragging] {
3696
+ cursor: grabbing;
3697
+ background: var(--nav-selected);
3698
+ border-color: var(--border-focus);
3699
+ }
3700
+ .fractal-column-editor__grip {
3701
+ width: 20px;
3702
+ height: 20px;
3703
+ flex-shrink: 0;
3704
+ color: inherit;
3705
+ pointer-events: none;
3706
+ }
3707
+ .fractal-column-editor__name {
3708
+ min-width: 0;
3709
+ pointer-events: none;
3710
+ }
3711
+ .fractal-column-editor__actions {
3712
+ display: flex;
3713
+ flex-shrink: 0;
3714
+ margin-left: auto;
3715
+ cursor: default;
3716
+ }
3717
+ .fractal-column-editor__actions .fractal-button {
3718
+ cursor: pointer !important;
3719
+ color: var(--fg-secondary);
3720
+ }
3721
+ .fractal-column-editor__actions .fractal-button:hover:not(:disabled) {
3722
+ background: var(--bg-surface-2) !important;
3723
+ }
3724
+ .fractal-column-editor__actions .fractal-button:disabled {
3725
+ pointer-events: auto;
3726
+ cursor: pointer !important;
3727
+ }
3728
+ .fractal-column-editor__divider {
3729
+ display: flex;
3730
+ align-items: center;
3731
+ gap: var(--space-3);
3732
+ margin-block: var(--space-6);
3733
+ color: var(--fg-tertiary);
3734
+ }
3735
+ .fractal-column-editor__divider::before,
3736
+ .fractal-column-editor__divider::after {
3737
+ content: "";
3738
+ flex: 1;
3739
+ border-top: 1px solid var(--border-subtle);
3740
+ }
3741
+ .fractal-column-editor__divider > span {
3742
+ display: flex;
3743
+ gap: var(--space-2);
3744
+ align-items: center;
3745
+ white-space: nowrap;
3746
+ }
3747
+ .fractal-column-editor__divider svg {
3748
+ width: 20px;
3749
+ height: 20px;
3750
+ }
3751
+ .fractal-column-editor__empty {
3752
+ margin: 0;
3753
+ padding-block: var(--space-4);
3754
+ color: var(--fg-tertiary);
3755
+ }
3756
+ .fractal-column-editor__announcement {
3757
+ position: absolute;
3758
+ width: 1px;
3759
+ height: 1px;
3760
+ overflow: hidden;
3761
+ clip-path: inset(50%);
3762
+ white-space: nowrap;
3763
+ }
3764
+ @media (prefers-reduced-motion: reduce) {
3765
+ .fractal-column-editor__row {
3766
+ transition: none;
3767
+ }
3768
+ }
3769
+ .fractal-column-editor__panel[data-dragging],
3770
+ .fractal-column-editor__panel[data-dragging] .fractal-column-editor__row {
3771
+ cursor: grabbing;
3772
+ }
1446
3773
  /*# sourceMappingURL=index.css.map */