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

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,1032 +595,3205 @@
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 {
488
- background-color: var(--accent-default);
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);
489
736
  }
490
- .fractal-toggle-thumb {
737
+ .fractal-number-input-unit {
491
738
  position: absolute;
492
- top: 2px;
493
- left: 2px;
494
- width: 14px;
495
- height: 14px;
496
- border-radius: 50%;
497
- background-color: #fff;
498
- transition: left 0.2s;
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;
499
747
  }
500
- .fractal-toggle-thumb--checked {
501
- left: 16px;
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;
502
758
  }
503
- .fractal-toggle-label {
504
- font-size: 0.8125rem;
759
+ .fractal-number-input-step:hover:not(:disabled) {
760
+ background: var(--bg-surface-1);
505
761
  color: var(--fg-primary);
506
- user-select: none;
507
- }
508
-
509
- /* src/components/Modal/Modal.css */
510
- .fractal-modal-overlay {
511
- position: fixed;
512
- inset: 0;
513
- background-color: var(--overlay, rgba(0, 0, 0, 0.5));
514
- display: flex;
515
- align-items: center;
516
- justify-content: center;
517
- z-index: 9998;
518
762
  }
519
- .fractal-modal-panel {
520
- background: var(--bg-canvas);
521
- border: 1px solid var(--border-subtle);
522
- border-radius: var(--radius-lg, 8px);
523
- box-shadow: var(--shadow-lg);
524
- padding: var(--space-6, 24px);
525
- max-width: 90vw;
526
- font-family: var(--font-sans);
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;
527
768
  }
528
- .fractal-modal-panel--sm {
529
- width: 420px;
769
+ .fractal-number-input-step:disabled {
770
+ color: var(--fg-disabled);
771
+ cursor: not-allowed;
530
772
  }
531
- .fractal-modal-panel--md {
532
- width: 756px;
773
+ .fractal-number-input-step svg {
774
+ width: var(--control-icon-size);
775
+ height: var(--control-icon-size);
533
776
  }
534
- .fractal-modal-panel--lg {
535
- width: calc(100vw - 4rem);
536
- height: calc(100vh - 4rem);
537
- max-height: 100vh;
538
- display: flex;
539
- flex-direction: column;
777
+ .fractal-number-input:has(.fractal-floating-field input:placeholder-shown):not(:focus-within) .fractal-number-input-unit {
778
+ visibility: hidden;
540
779
  }
541
- .fractal-modal-panel--danger {
542
- border-color: var(--error-subtle);
780
+ .fractal-number-input .fractal-floating-field__label {
781
+ max-width: calc(100% - 2 * var(--control-min-block-size) - 2 * var(--control-padding-inline));
543
782
  }
544
- .fractal-modal-panel--warn {
545
- border-color: var(--warning-subtle);
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);
546
790
  }
547
- .fractal-modal-title-row {
791
+ .fractal-slider-values {
548
792
  display: flex;
793
+ min-height: 1.2em;
549
794
  justify-content: space-between;
550
- align-items: center;
551
- margin-bottom: var(--space-4, 16px);
552
- }
553
- .fractal-modal-title {
554
- margin: 0;
555
- font-size: 1rem;
556
- font-weight: 600;
557
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;
558
800
  }
559
- .fractal-modal-title--danger {
560
- color: var(--error-default);
801
+ .fractal-slider[data-knobs="1"] .fractal-slider-values {
802
+ justify-content: flex-end;
561
803
  }
562
- .fractal-modal-title--warn {
563
- color: var(--warning-default);
804
+ .fractal-slider-control {
805
+ position: relative;
806
+ height: 24px;
564
807
  }
565
- .fractal-modal-close {
566
- background: none;
567
- border: none;
568
- cursor: pointer;
569
- color: var(--fg-secondary);
570
- padding: 4px;
571
- border-radius: var(--radius-sm, 4px);
572
- display: flex;
573
- align-items: center;
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;
574
815
  }
575
- .fractal-modal-close:hover {
576
- color: var(--fg-primary);
577
- background: var(--bg-surface-1);
816
+ .fractal-slider-track {
817
+ right: 0;
818
+ left: 0;
819
+ background: var(--bg-surface-2);
578
820
  }
579
- .fractal-modal-body {
580
- font-size: 0.875rem;
581
- color: var(--fg-secondary);
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);
582
825
  }
583
- .fractal-modal-body--lg {
584
- flex: 1;
585
- min-height: 0;
586
- overflow: hidden;
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;
587
836
  }
588
- .fractal-modal-footer {
589
- display: flex;
590
- justify-content: flex-end;
591
- gap: var(--space-2, 8px);
592
- margin-top: var(--space-4, 16px);
837
+ .fractal-slider-control > input[type=range]::-webkit-slider-runnable-track {
838
+ height: 4px;
839
+ background: transparent;
593
840
  }
594
-
595
- /* src/components/DataTable/DataTable.css */
596
- .fractal-datatable {
597
- font-family: var(--font-sans);
598
- font-size: 0.875rem;
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;
599
852
  }
600
- .fractal-datatable-surface {
601
- overflow: hidden;
602
- border: 1px solid var(--border-subtle);
603
- border-radius: var(--radius-md, 6px);
604
- background: var(--bg-canvas);
853
+ .fractal-slider-control > input[type=range]::-moz-range-track {
854
+ height: 4px;
855
+ background: transparent;
605
856
  }
606
- .fractal-datatable-header {
607
- display: flex;
608
- align-items: center;
609
- justify-content: space-between;
610
- padding: 12px 16px;
611
- border-bottom: 1px solid var(--border-subtle);
612
- background: var(--bg-canvas);
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;
613
866
  }
614
- .fractal-datatable-empty {
615
- display: flex;
616
- align-items: center;
617
- justify-content: center;
618
- padding: var(--space-7, 32px) var(--space-4, 16px);
619
- font-size: 0.875rem;
620
- color: var(--fg-secondary);
621
- background: var(--bg-canvas);
867
+ .fractal-slider-control > input[type=range]:focus-visible::-webkit-slider-thumb {
868
+ outline: 2px solid var(--border-focus);
869
+ outline-offset: 2px;
622
870
  }
623
- .fractal-datatable-table {
624
- width: 100%;
625
- border-collapse: separate;
626
- border-spacing: 0;
627
- font-family: var(--font-sans);
628
- font-size: 0.875rem;
871
+ .fractal-slider-control > input[type=range]:focus-visible::-moz-range-thumb {
872
+ outline: 2px solid var(--border-focus);
873
+ outline-offset: 2px;
629
874
  }
630
- .fractal-datatable-thead-row {
631
- background: var(--bg-surface-1);
875
+ .fractal-slider-control > input[type=range]:active::-webkit-slider-thumb {
876
+ cursor: grabbing;
632
877
  }
633
- .fractal-datatable-th {
634
- text-align: left;
635
- padding: 12px 16px;
636
- font-size: 0.75rem;
637
- font-weight: 500;
638
- color: var(--fg-secondary);
639
- border-bottom: 1px solid var(--border-subtle);
640
- vertical-align: middle;
878
+ .fractal-slider-control > input[type=range]:active::-moz-range-thumb {
879
+ cursor: grabbing;
641
880
  }
642
- .fractal-datatable-th + .fractal-datatable-th {
643
- border-left: 1px solid var(--border-subtle);
881
+ .fractal-slider--disabled {
882
+ opacity: 0.5;
644
883
  }
645
- .fractal-datatable-row {
646
- background: var(--bg-canvas);
647
- transition: background 120ms ease;
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;
648
887
  }
649
- .fractal-datatable-row:hover {
650
- background: var(--bg-surface-1);
888
+
889
+ /* src/components/PasswordInput/PasswordInput.css */
890
+ .fractal-password-input {
891
+ position: relative;
892
+ width: 100%;
893
+ align-self: start;
651
894
  }
652
- .fractal-datatable-td {
653
- padding: 14px 16px;
654
- color: var(--fg-primary);
655
- line-height: 1.55;
656
- vertical-align: top;
657
- overflow-wrap: anywhere;
895
+ .fractal-password-input-field {
896
+ padding-right: calc(var(--control-min-block-size) + var(--control-padding-inline));
658
897
  }
659
- .fractal-datatable-td + .fractal-datatable-td {
660
- border-left: 1px solid var(--border-subtle);
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;
661
913
  }
662
- .fractal-datatable-row + .fractal-datatable-row .fractal-datatable-td {
663
- border-top: 1px solid var(--border-subtle);
914
+ .fractal-password-input-toggle:hover:not(:disabled) {
915
+ background: var(--hover-canvas, var(--bg-surface-1));
916
+ color: var(--fg-primary);
664
917
  }
665
- .fractal-datatable--sm .fractal-datatable-th {
666
- padding: 8px 12px;
918
+ .fractal-password-input-toggle:focus-visible {
919
+ outline: 2px solid var(--border-focus);
920
+ outline-offset: -2px;
667
921
  }
668
- .fractal-datatable--sm .fractal-datatable-td {
669
- padding: 10px 12px;
922
+ .fractal-password-input-toggle:disabled {
923
+ color: var(--fg-disabled);
924
+ cursor: not-allowed;
925
+ opacity: 0.5;
670
926
  }
671
- .fractal-datatable--lg .fractal-datatable-th {
672
- padding: 18px 24px;
927
+ @media (prefers-reduced-motion: reduce) {
928
+ .fractal-password-input-toggle {
929
+ transition-duration: 0.01ms;
930
+ }
673
931
  }
674
- .fractal-datatable--lg .fractal-datatable-td {
675
- padding: 22px 24px;
932
+ .fractal-password-input-toggle svg {
933
+ width: var(--control-icon-size);
934
+ height: var(--control-icon-size);
676
935
  }
677
-
678
- /* src/components/Dropdown/Dropdown.css */
679
- .fractal-dropdown {
680
- position: relative;
681
- display: inline-block;
936
+ .fractal-password-input .fractal-floating-field__label {
937
+ max-width: calc(100% - var(--control-min-block-size) - 2 * var(--control-padding-inline));
682
938
  }
683
- .fractal-dropdown-trigger {
684
- display: inline-flex;
685
- align-items: center;
686
- gap: 8px;
687
- border-radius: var(--radius-md, 6px);
688
- border: 1px solid var(--border-subtle);
689
- background: var(--bg-canvas);
690
- padding: 8px 12px;
691
- text-align: left;
692
- font-size: 0.875rem;
939
+
940
+ /* src/components/Label/Label.css */
941
+ .fractal-label {
942
+ display: block;
943
+ margin: 0;
693
944
  font-family: var(--font-sans);
945
+ font-size: var(--control-font-size);
946
+ font-weight: 500;
947
+ line-height: var(--control-line-height);
694
948
  color: var(--fg-primary);
695
- cursor: pointer;
696
- transition: background-color 0.15s;
697
- }
698
- .fractal-dropdown-trigger--sm {
699
- gap: 6px;
700
- padding: 4px 8px;
701
- font-size: 0.75rem;
702
949
  }
703
- .fractal-dropdown-trigger--tertiary {
704
- border-color: transparent;
705
- background: transparent;
950
+ .fractal-label[data-disabled] {
951
+ cursor: not-allowed;
952
+ opacity: 0.7;
706
953
  }
707
- .fractal-dropdown-trigger:hover,
708
- .fractal-dropdown-trigger--tertiary:hover {
709
- background: var(--bg-surface-1);
710
- }
711
- .fractal-dropdown-trigger:focus-visible {
712
- outline: none;
713
- box-shadow: 0 0 0 2px var(--bg-canvas), 0 0 0 4px var(--border-focus);
714
- }
715
- .fractal-dropdown-icon {
954
+
955
+ /* src/components/Alert/Alert.css */
956
+ .fractal-alert {
716
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 {
717
967
  flex-shrink: 0;
718
- color: var(--fg-primary);
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;
719
976
  }
720
- .fractal-dropdown-icon svg {
721
- width: 16px;
722
- height: 16px;
977
+ .fractal-alert-icon svg {
978
+ display: block;
723
979
  }
724
- .fractal-dropdown-icon--trigger svg {
725
- width: 16px;
726
- height: 16px;
980
+ .fractal-alert-content {
981
+ flex: 1;
982
+ min-width: 0;
727
983
  }
728
- .fractal-dropdown-selected-text {
729
- color: var(--fg-primary);
984
+ .fractal-alert-title {
985
+ margin: 0 0 4px 0;
986
+ font-size: 0.875rem;
987
+ font-weight: 500;
988
+ line-height: 1.4;
730
989
  }
731
- .fractal-dropdown-chevron {
732
- display: flex;
733
- flex-shrink: 0;
990
+ .fractal-alert-description {
734
991
  color: var(--fg-secondary);
992
+ font-size: 0.875rem;
993
+ line-height: 1.5;
735
994
  }
736
- .fractal-dropdown-panel {
737
- position: absolute;
738
- z-index: 999999;
739
- overflow: hidden;
740
- border-radius: var(--radius-md, 6px);
741
- border: 1px solid var(--border-subtle);
742
- background: var(--bg-canvas);
743
- white-space: nowrap;
744
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
745
- padding: 4px;
995
+ .fractal-alert--default {
996
+ background-color: var(--bg-canvas);
997
+ border-color: var(--border-subtle);
998
+ color: var(--fg-primary);
746
999
  }
747
- .fractal-dropdown-label {
748
- width: 100%;
749
- padding: 6px 8px;
750
- font-size: 0.75rem;
751
- font-weight: 500;
1000
+ .fractal-alert--default .fractal-alert-icon {
752
1001
  color: var(--fg-secondary);
753
- box-sizing: border-box;
754
1002
  }
755
- .fractal-dropdown-option {
756
- display: flex;
757
- width: 100%;
758
- align-items: center;
759
- gap: 8px;
760
- padding: 6px 8px;
761
- text-align: left;
762
- font-size: 0.875rem;
763
- font-family: var(--font-sans);
764
- background: none;
765
- border: none;
766
- border-radius: var(--radius-sm, 4px);
767
- cursor: pointer;
1003
+ .fractal-alert--info {
1004
+ background-color: var(--accent-surface);
1005
+ border-color: var(--accent-surface-stroke);
768
1006
  color: var(--fg-primary);
769
- transition: background-color 0.1s;
770
1007
  }
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;
1008
+ .fractal-alert--info .fractal-alert-icon {
1009
+ color: var(--accent-default);
775
1010
  }
776
- .fractal-dropdown-panel--sm .fractal-dropdown-option {
777
- gap: 6px;
1011
+ .fractal-alert--success {
1012
+ background-color: var(--success-surface);
1013
+ border-color: var(--success-surface-stroke);
1014
+ color: var(--fg-primary);
778
1015
  }
779
- .fractal-dropdown-option:hover,
780
- .fractal-dropdown-option:focus-visible {
781
- background: var(--hover-canvas, var(--bg-surface-2));
782
- outline: none;
1016
+ .fractal-alert--success .fractal-alert-icon {
1017
+ color: var(--success-default);
783
1018
  }
784
- .fractal-dropdown-separator {
785
- height: 1px;
786
- margin: 4px -4px;
787
- background: var(--border-subtle);
1019
+ .fractal-alert--warning {
1020
+ background-color: var(--warning-surface);
1021
+ border-color: var(--warning-surface-stroke);
1022
+ color: var(--fg-primary);
788
1023
  }
789
- .fractal-dropdown-option-text {
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);
790
1030
  color: var(--fg-primary);
791
1031
  }
792
- .fractal-dropdown-trailing {
793
- margin-left: auto;
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;
794
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%;
795
1051
  align-items: center;
796
- padding-left: 8px;
797
- color: var(--accent-default);
1052
+ transform: translateX(-50%);
798
1053
  }
799
-
800
- /* src/components/Link/Link.css */
801
- .fractal-link {
802
- display: inline;
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);
803
1079
  font-family: var(--font-sans);
1080
+ font-size: 0.8125rem;
804
1081
  font-weight: 500;
805
- text-decoration: underline;
806
- text-underline-offset: 2px;
807
- cursor: pointer;
808
- transition: opacity 0.15s ease;
809
- }
810
- .fractal-link:hover {
811
- opacity: 0.7;
1082
+ line-height: 1.35;
1083
+ pointer-events: auto;
1084
+ animation: fractal-toast-in-from-top 180ms var(--ease-out, ease-out) both;
812
1085
  }
813
- .fractal-link:active {
814
- opacity: 0.5;
1086
+ .fractal-toast-viewport--bottom-center .fractal-toast {
1087
+ animation-name: fractal-toast-in-from-bottom;
815
1088
  }
816
- .fractal-link--default {
817
- color: var(--fg-primary);
1089
+ .fractal-toast__icon {
1090
+ display: grid;
1091
+ width: 18px;
1092
+ height: 18px;
1093
+ flex: 0 0 18px;
1094
+ place-items: center;
818
1095
  }
819
- .fractal-link--muted {
1096
+ .fractal-toast--default .fractal-toast__icon {
820
1097
  color: var(--fg-secondary);
821
1098
  }
822
- .fractal-link--accent {
1099
+ .fractal-toast--info .fractal-toast__icon {
823
1100
  color: var(--accent-default);
824
1101
  }
825
- .fractal-link--sm {
826
- font-size: 0.75rem;
1102
+ .fractal-toast--success .fractal-toast__icon {
1103
+ color: var(--success-default);
827
1104
  }
828
- .fractal-link--md {
829
- font-size: 0.875rem;
1105
+ .fractal-toast--warning .fractal-toast__icon {
1106
+ color: var(--warning-default);
830
1107
  }
831
- .fractal-link--lg {
832
- font-size: 1rem;
1108
+ .fractal-toast--error .fractal-toast__icon {
1109
+ color: var(--error-default);
833
1110
  }
834
-
835
- /* src/components/Chip/Chip.css */
836
- .fractal-chip {
837
- display: inline-flex;
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;
838
1118
  align-items: center;
839
- 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;
846
- white-space: nowrap;
847
- background: var(--bg-surface-2);
848
- border: 1px solid var(--border-subtle);
849
- color: var(--fg-secondary);
850
1119
  }
851
- .fractal-chip--neutral {
852
- background: var(--bg-surface-2);
853
- border-color: var(--border-subtle);
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;
854
1130
  color: var(--fg-secondary);
1131
+ cursor: pointer;
1132
+ place-items: center;
855
1133
  }
856
- .fractal-chip--success {
857
- background: var(--success-surface);
858
- border-color: var(--success-subtle);
859
- color: var(--success-default);
1134
+ .fractal-toast__dismiss:hover {
1135
+ background: var(--hover-surface);
1136
+ color: var(--fg-primary);
860
1137
  }
861
- .fractal-chip--warning {
862
- background: var(--warning-surface);
863
- border-color: var(--warning-subtle);
864
- color: var(--warning-default);
1138
+ .fractal-toast__dismiss:focus-visible {
1139
+ outline: 2px solid var(--border-focus);
1140
+ outline-offset: -2px;
865
1141
  }
866
- .fractal-chip--error {
867
- background: var(--error-surface);
868
- border-color: var(--error-subtle);
869
- color: var(--error-default);
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
+ }
870
1151
  }
871
- .fractal-chip--info {
872
- background: var(--accent-surface);
873
- border-color: var(--accent-subtle);
874
- color: var(--accent-default);
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
+ }
875
1161
  }
876
-
877
- /* src/components/SortableTable/SortableTable.css */
878
- .fractal-sortable-table {
879
- font-family: var(--font-sans);
880
- font-size: 0.875rem;
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
+ }
881
1169
  }
882
- .fractal-sortable-table-surface {
883
- overflow: hidden;
884
- border: 1px solid var(--border-subtle);
885
- border-radius: var(--radius-md, 6px);
886
- background: var(--bg-canvas);
1170
+ @media (prefers-reduced-motion: reduce) {
1171
+ .fractal-toast {
1172
+ animation-duration: 0.01ms;
1173
+ }
887
1174
  }
888
- .fractal-sortable-table-header {
889
- display: flex;
1175
+
1176
+ /* src/components/Toggle/Toggle.css */
1177
+ .fractal-toggle {
1178
+ display: inline-flex;
890
1179
  align-items: center;
891
- justify-content: space-between;
892
- padding: 12px 16px;
893
- border-bottom: 1px solid var(--border-subtle);
894
- background: var(--bg-canvas);
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 {
1197
+ background-color: var(--accent-default);
1198
+ }
1199
+ .fractal-toggle-thumb {
1200
+ position: absolute;
1201
+ top: 2px;
1202
+ left: 2px;
1203
+ width: 14px;
1204
+ height: 14px;
1205
+ border-radius: 50%;
1206
+ background-color: #fff;
1207
+ transition: left 0.2s;
1208
+ }
1209
+ .fractal-toggle-thumb--checked {
1210
+ left: 16px;
1211
+ }
1212
+ .fractal-toggle-label {
1213
+ font-size: 0.8125rem;
1214
+ color: var(--fg-primary);
1215
+ user-select: none;
1216
+ }
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
+
1272
+ /* src/components/Modal/Modal.css */
1273
+ .fractal-modal-overlay {
1274
+ position: fixed;
1275
+ inset: 0;
1276
+ background-color: var(--overlay, rgba(0, 0, 0, 0.5));
1277
+ display: flex;
1278
+ align-items: center;
1279
+ justify-content: center;
1280
+ z-index: 9998;
1281
+ }
1282
+ .fractal-modal-panel {
1283
+ --fractal-modal-panel-padding: var(--space-6, 24px);
1284
+ box-sizing: border-box;
1285
+ background: var(--bg-canvas);
1286
+ border: 1px solid var(--border-subtle);
1287
+ border-radius: var(--radius-lg, 8px);
1288
+ box-shadow: var(--shadow-lg);
1289
+ padding: var(--fractal-modal-panel-padding);
1290
+ max-width: 90vw;
1291
+ font-family: var(--font-sans);
1292
+ }
1293
+ .fractal-modal-panel--sm {
1294
+ width: 420px;
1295
+ }
1296
+ .fractal-modal-panel--md {
1297
+ width: 756px;
1298
+ }
1299
+ .fractal-modal-panel--lg {
1300
+ width: calc(100vw - 4rem);
1301
+ height: calc(100vh - 4rem);
1302
+ max-height: 100vh;
1303
+ display: flex;
1304
+ flex-direction: column;
1305
+ }
1306
+ .fractal-modal-panel--scrollable {
1307
+ display: flex;
1308
+ max-height: calc(100dvh - 2rem);
1309
+ flex-direction: column;
1310
+ padding-bottom: 0;
1311
+ }
1312
+ .fractal-modal-panel--danger {
1313
+ border-color: var(--error-subtle);
1314
+ }
1315
+ .fractal-modal-panel--warn {
1316
+ border-color: var(--warning-subtle);
1317
+ }
1318
+ .fractal-modal-title-row {
1319
+ display: flex;
1320
+ justify-content: space-between;
1321
+ align-items: center;
1322
+ margin-bottom: var(--space-4, 16px);
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
+ }
1347
+ .fractal-modal-title {
1348
+ margin: 0;
1349
+ font-size: 1rem;
1350
+ font-weight: 600;
1351
+ color: var(--fg-primary);
1352
+ }
1353
+ .fractal-modal-title--danger {
1354
+ color: var(--error-default);
1355
+ }
1356
+ .fractal-modal-title--warn {
1357
+ color: var(--warning-default);
1358
+ }
1359
+ .fractal-modal-close {
1360
+ background: none;
1361
+ border: none;
1362
+ cursor: pointer;
1363
+ color: var(--fg-secondary);
1364
+ padding: 4px;
1365
+ border-radius: var(--radius-sm, 4px);
1366
+ display: flex;
1367
+ align-items: center;
1368
+ }
1369
+ .fractal-modal-close:hover {
1370
+ color: var(--fg-primary);
1371
+ background: var(--bg-surface-1);
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
+ }
1381
+ .fractal-modal-body {
1382
+ font-size: 0.875rem;
1383
+ color: var(--fg-secondary);
1384
+ }
1385
+ .fractal-modal-body--loading {
1386
+ display: grid;
1387
+ min-height: 168px;
1388
+ place-items: center;
1389
+ }
1390
+ .fractal-modal-body--lg {
1391
+ flex: 1;
1392
+ min-height: 0;
1393
+ overflow: hidden;
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
+ }
1404
+ .fractal-modal-footer {
1405
+ display: flex;
1406
+ justify-content: flex-end;
1407
+ gap: var(--space-2, 8px);
1408
+ margin-top: var(--space-4, 16px);
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
+ }
1637
+
1638
+ /* src/components/DataTable/DataTable.css */
1639
+ .fractal-datatable {
1640
+ font-family: var(--font-sans);
1641
+ font-size: 0.875rem;
1642
+ }
1643
+ .fractal-datatable-surface {
1644
+ overflow: hidden;
1645
+ border: 1px solid var(--border-subtle);
1646
+ border-radius: var(--radius-md, 6px);
1647
+ background: var(--bg-canvas);
1648
+ }
1649
+ .fractal-datatable-header {
1650
+ display: flex;
1651
+ align-items: center;
1652
+ justify-content: space-between;
1653
+ padding: 12px 16px;
1654
+ border-bottom: 1px solid var(--border-subtle);
1655
+ background: var(--bg-canvas);
1656
+ }
1657
+ .fractal-datatable-empty {
1658
+ display: flex;
1659
+ align-items: center;
1660
+ justify-content: center;
1661
+ padding: var(--space-7, 32px) var(--space-4, 16px);
1662
+ font-size: 0.875rem;
1663
+ color: var(--fg-secondary);
1664
+ background: var(--bg-canvas);
1665
+ }
1666
+ .fractal-datatable-table {
1667
+ width: 100%;
1668
+ border-collapse: separate;
1669
+ border-spacing: 0;
1670
+ font-family: var(--font-sans);
1671
+ font-size: 0.875rem;
1672
+ }
1673
+ .fractal-datatable-thead-row {
1674
+ background: var(--bg-surface-1);
1675
+ }
1676
+ .fractal-datatable-th {
1677
+ text-align: left;
1678
+ padding: 12px 16px;
1679
+ --table-cell-block-padding: 12px;
1680
+ font-size: inherit;
1681
+ line-height: 1.55;
1682
+ font-weight: 500;
1683
+ color: var(--fg-secondary);
1684
+ border-bottom: 1px solid var(--border-subtle);
1685
+ vertical-align: middle;
1686
+ }
1687
+ .fractal-datatable-row {
1688
+ background: var(--bg-canvas);
1689
+ transition: background 120ms ease;
1690
+ }
1691
+ .fractal-datatable-row:hover {
1692
+ background: var(--bg-surface-1);
1693
+ }
1694
+ .fractal-datatable-td {
1695
+ padding: 14px 16px;
1696
+ --table-cell-block-padding: 14px;
1697
+ color: var(--fg-primary);
1698
+ line-height: 1.55;
1699
+ vertical-align: middle;
1700
+ overflow-wrap: anywhere;
1701
+ }
1702
+ .fractal-datatable-td .fractal-dropdown-trigger--icon-only.fractal-dropdown-trigger--tertiary:hover {
1703
+ background: var(--bg-canvas);
1704
+ }
1705
+ .fractal-datatable-row + .fractal-datatable-row .fractal-datatable-td {
1706
+ border-top: 1px solid var(--border-subtle);
1707
+ }
1708
+ .fractal-datatable--sm .fractal-datatable-th {
1709
+ padding: 8px 12px;
1710
+ --table-cell-block-padding: 8px;
1711
+ }
1712
+ .fractal-datatable--sm .fractal-datatable-td {
1713
+ padding: 10px 12px;
1714
+ --table-cell-block-padding: 10px;
1715
+ }
1716
+ .fractal-datatable--lg .fractal-datatable-th {
1717
+ padding: 18px 24px;
1718
+ --table-cell-block-padding: 18px;
1719
+ }
1720
+ .fractal-datatable--lg .fractal-datatable-td {
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);
1727
+ }
1728
+
1729
+ /* src/components/Dropdown/Dropdown.css */
1730
+ .fractal-dropdown {
1731
+ position: relative;
1732
+ display: inline-flex;
1733
+ vertical-align: top;
1734
+ min-width: 0;
1735
+ }
1736
+ .fractal-dropdown-trigger {
1737
+ display: inline-flex;
1738
+ align-items: center;
1739
+ gap: var(--control-icon-gap);
1740
+ border-radius: var(--radius-md, 6px);
1741
+ border: 1px solid var(--border-subtle);
1742
+ background: var(--bg-canvas);
1743
+ text-align: left;
1744
+ font-family: var(--font-sans);
1745
+ color: var(--fg-primary);
1746
+ cursor: pointer;
1747
+ transition: background-color 0.15s;
1748
+ }
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;
1769
+ }
1770
+ .fractal-dropdown-trigger--tertiary {
1771
+ border-color: transparent;
1772
+ background: transparent;
1773
+ }
1774
+ .fractal-dropdown-trigger:hover,
1775
+ .fractal-dropdown-trigger--tertiary:hover {
1776
+ background: var(--control-hover-bg, var(--hover-canvas));
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
+ }
1789
+ .fractal-dropdown-trigger:focus-visible {
1790
+ outline: none;
1791
+ box-shadow: 0 0 0 2px var(--bg-canvas), 0 0 0 4px var(--border-focus);
1792
+ }
1793
+ .fractal-dropdown-icon {
1794
+ display: flex;
1795
+ flex-shrink: 0;
1796
+ color: var(--fg-primary);
1797
+ }
1798
+ .fractal-dropdown-icon svg {
1799
+ width: 16px;
1800
+ height: 16px;
1801
+ }
1802
+ .fractal-dropdown-icon--trigger svg {
1803
+ width: 16px;
1804
+ height: 16px;
1805
+ }
1806
+ .fractal-dropdown-selected-text {
1807
+ color: var(--fg-primary);
1808
+ }
1809
+ .fractal-dropdown-chevron {
1810
+ display: flex;
1811
+ flex-shrink: 0;
1812
+ margin-left: auto;
1813
+ color: var(--fg-secondary);
1814
+ }
1815
+ .fractal-dropdown-panel {
1816
+ position: absolute;
1817
+ z-index: 999999;
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;
1825
+ border-radius: var(--radius-md, 6px);
1826
+ border: 1px solid var(--border-subtle);
1827
+ background: var(--bg-canvas);
1828
+ white-space: normal;
1829
+ overflow-wrap: anywhere;
1830
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
1831
+ padding: 4px;
1832
+ }
1833
+ .fractal-dropdown-label {
1834
+ width: 100%;
1835
+ padding: var(--space-1) var(--control-padding-inline);
1836
+ font-size: 0.75rem;
1837
+ font-weight: 500;
1838
+ color: var(--fg-secondary);
1839
+ box-sizing: border-box;
1840
+ }
1841
+ .fractal-dropdown-option {
1842
+ display: flex;
1843
+ width: 100%;
1844
+ box-sizing: border-box;
1845
+ align-items: center;
1846
+ gap: 8px;
1847
+ padding: var(--control-padding-block) var(--control-padding-inline);
1848
+ text-align: left;
1849
+ font-size: var(--control-font-size);
1850
+ line-height: var(--control-line-height);
1851
+ font-family: var(--font-sans);
1852
+ background: none;
1853
+ border: none;
1854
+ border-radius: var(--radius-sm, 4px);
1855
+ cursor: pointer;
1856
+ color: var(--fg-primary);
1857
+ transition: background-color 0.1s;
1858
+ }
1859
+ .fractal-dropdown-option:hover,
1860
+ .fractal-dropdown-option:focus-visible {
1861
+ background: var(--hover-surface, var(--bg-surface-2));
1862
+ outline: none;
1863
+ }
1864
+ .fractal-dropdown-separator {
1865
+ height: 1px;
1866
+ margin: 4px -4px;
1867
+ background: var(--border-subtle);
1868
+ }
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;
1914
+ color: var(--fg-primary);
1915
+ font: inherit;
1916
+ font-size: var(--control-font-size);
1917
+ line-height: var(--control-line-height);
1918
+ }
1919
+ .fractal-dropdown-search input::placeholder {
1920
+ color: var(--fg-placeholder);
1921
+ }
1922
+ .fractal-dropdown-checkbox {
1923
+ display: flex;
1924
+ align-items: center;
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;
1941
+ }
1942
+
1943
+ /* src/components/Link/Link.css */
1944
+ .fractal-link {
1945
+ display: inline;
1946
+ font-family: var(--font-sans);
1947
+ font-weight: 500;
1948
+ text-decoration: underline;
1949
+ text-underline-offset: 2px;
1950
+ cursor: pointer;
1951
+ transition: opacity 0.15s ease;
1952
+ }
1953
+ .fractal-link:hover {
1954
+ opacity: 0.7;
1955
+ }
1956
+ .fractal-link:active {
1957
+ opacity: 0.5;
1958
+ }
1959
+ .fractal-link--default {
1960
+ color: var(--fg-primary);
1961
+ }
1962
+ .fractal-link--muted {
1963
+ color: var(--fg-secondary);
1964
+ }
1965
+ .fractal-link--accent {
1966
+ color: var(--accent-default);
1967
+ }
1968
+ .fractal-link--sm {
1969
+ font-size: 0.75rem;
1970
+ }
1971
+ .fractal-link--md {
1972
+ font-size: 0.875rem;
1973
+ }
1974
+ .fractal-link--lg {
1975
+ font-size: 1rem;
1976
+ }
1977
+
1978
+ /* src/components/Chip/Chip.css */
1979
+ .fractal-chip {
1980
+ display: inline-flex;
1981
+ align-items: center;
1982
+ border-radius: var(--radius-full);
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;
1989
+ white-space: nowrap;
1990
+ border: 0;
1991
+ background: var(--tag-neutral-bg);
1992
+ color: var(--tag-neutral-fg);
1993
+ }
1994
+ .fractal-chip--neutral {
1995
+ background: var(--tag-neutral-bg);
1996
+ color: var(--tag-neutral-fg);
1997
+ }
1998
+ .fractal-chip--success {
1999
+ background: var(--tag-success-bg);
2000
+ color: var(--tag-success-fg);
2001
+ }
2002
+ .fractal-chip--warning {
2003
+ background: var(--tag-warning-bg);
2004
+ color: var(--tag-warning-fg);
2005
+ }
2006
+ .fractal-chip--error {
2007
+ background: var(--tag-error-bg);
2008
+ color: var(--tag-error-fg);
2009
+ }
2010
+ .fractal-chip--info {
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);
2131
+ }
2132
+
2133
+ /* src/components/SortableTable/SortableTable.css */
2134
+ .fractal-sortable-table {
2135
+ font-family: var(--font-sans);
2136
+ font-size: 0.875rem;
2137
+ }
2138
+ .fractal-sortable-table-surface {
2139
+ overflow: hidden;
2140
+ border: 1px solid var(--border-subtle);
2141
+ border-radius: var(--radius-md, 6px);
2142
+ background: var(--bg-canvas);
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
+ }
2149
+ .fractal-sortable-table-header {
2150
+ display: flex;
2151
+ align-items: center;
2152
+ justify-content: space-between;
2153
+ padding: 12px 16px;
2154
+ border-bottom: 1px solid var(--border-subtle);
2155
+ background: var(--bg-canvas);
895
2156
  }
896
2157
  .fractal-sortable-table-empty {
897
2158
  display: flex;
898
- align-items: center;
899
- justify-content: center;
900
- padding: var(--space-7, 32px) var(--space-4, 16px);
901
- font-size: 0.875rem;
902
- color: var(--fg-secondary);
903
- background: var(--bg-canvas);
2159
+ align-items: center;
2160
+ justify-content: center;
2161
+ padding: var(--space-7, 32px) var(--space-4, 16px);
2162
+ font-size: 0.875rem;
2163
+ color: var(--fg-secondary);
2164
+ background: var(--bg-canvas);
2165
+ }
2166
+ .fractal-sortable-table-table {
2167
+ width: 100%;
2168
+ border-collapse: separate;
2169
+ border-spacing: 0;
2170
+ font-family: var(--font-sans);
2171
+ font-size: 0.875rem;
2172
+ }
2173
+ .fractal-sortable-table-thead-row {
2174
+ background: var(--bg-surface-1);
2175
+ }
2176
+ .fractal-sortable-table-th {
2177
+ text-align: left;
2178
+ padding: 12px 16px;
2179
+ --table-cell-block-padding: 12px;
2180
+ font-size: inherit;
2181
+ line-height: 1.55;
2182
+ font-weight: 500;
2183
+ color: var(--fg-secondary);
2184
+ border-bottom: 1px solid var(--border-subtle);
2185
+ vertical-align: middle;
2186
+ white-space: nowrap;
2187
+ }
2188
+ .fractal-sortable-table-th--sortable {
2189
+ padding: 0;
2190
+ }
2191
+ .fractal-sortable-table-sort-button {
2192
+ display: flex;
2193
+ align-items: center;
2194
+ gap: 6px;
2195
+ width: 100%;
2196
+ background: none;
2197
+ border: 0;
2198
+ padding: 12px 16px;
2199
+ margin: 0;
2200
+ font: inherit;
2201
+ color: inherit;
2202
+ text-align: left;
2203
+ cursor: pointer;
2204
+ transition: color 0.15s ease, background 0.15s ease;
2205
+ }
2206
+ .fractal-sortable-table-sort-button:hover {
2207
+ color: var(--fg-primary);
2208
+ background: var(--hover-surface);
2209
+ }
2210
+ .fractal-sortable-table-sort-button--active {
2211
+ color: var(--accent-default);
2212
+ }
2213
+ .fractal-sortable-table-sort-button:focus-visible {
2214
+ outline: 2px solid var(--border-focus);
2215
+ outline-offset: 2px;
2216
+ border-radius: 2px;
2217
+ }
2218
+ .fractal-sortable-table-sort-icon {
2219
+ display: inline-flex;
2220
+ align-items: center;
2221
+ color: var(--fg-tertiary, var(--fg-secondary));
2222
+ opacity: 0;
2223
+ transition: opacity 0.15s ease, color 0.15s ease;
2224
+ }
2225
+ .fractal-sortable-table-sort-button:hover .fractal-sortable-table-sort-icon,
2226
+ .fractal-sortable-table-sort-button:focus-visible .fractal-sortable-table-sort-icon {
2227
+ opacity: 1;
2228
+ }
2229
+ .fractal-sortable-table-sort-button--active .fractal-sortable-table-sort-icon {
2230
+ opacity: 1;
2231
+ color: var(--accent-default);
2232
+ }
2233
+ .fractal-sortable-table-row {
2234
+ background: var(--bg-canvas);
2235
+ transition: background 120ms ease;
2236
+ }
2237
+ .fractal-sortable-table-row:hover {
2238
+ background: var(--bg-surface-1);
2239
+ }
2240
+ .fractal-sortable-table-row--interactive {
2241
+ cursor: pointer;
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
+ }
2310
+ .fractal-sortable-table-row--interactive:focus-visible {
2311
+ position: relative;
2312
+ z-index: 1;
2313
+ outline: 2px solid var(--border-focus);
2314
+ outline-offset: -2px;
2315
+ }
2316
+ .fractal-sortable-table-row + .fractal-sortable-table-row .fractal-sortable-table-td {
2317
+ border-top: 1px solid var(--border-subtle);
2318
+ }
2319
+ .fractal-sortable-table-row--highlighted {
2320
+ background: var(--bg-surface-1);
2321
+ }
2322
+ .fractal-sortable-table-row--highlighted:hover {
2323
+ background: var(--bg-surface-2);
2324
+ }
2325
+ .fractal-sortable-table-td {
2326
+ padding: 14px 16px;
2327
+ --table-cell-block-padding: 14px;
2328
+ color: var(--fg-primary);
2329
+ line-height: 1.55;
2330
+ vertical-align: middle;
2331
+ overflow-wrap: anywhere;
2332
+ }
2333
+ .fractal-sortable-table--sm .fractal-sortable-table-th {
2334
+ --table-cell-block-padding: 8px;
2335
+ }
2336
+ .fractal-sortable-table--sm .fractal-sortable-table-sort-button {
2337
+ padding: 8px 12px;
2338
+ --table-cell-block-padding: 8px;
2339
+ }
2340
+ .fractal-sortable-table--sm .fractal-sortable-table-td {
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;
2346
+ }
2347
+ .fractal-sortable-table--lg .fractal-sortable-table-sort-button {
2348
+ padding: 18px 24px;
2349
+ --table-cell-block-padding: 18px;
2350
+ }
2351
+ .fractal-sortable-table--lg .fractal-sortable-table-td {
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);
2358
+ }
2359
+
2360
+ /* src/components/Tabs/Tabs.css */
2361
+ .fractal-tabs {
2362
+ font-family: var(--font-sans);
2363
+ font-size: 0.875rem;
2364
+ }
2365
+ .fractal-tabs-list {
2366
+ position: relative;
2367
+ display: flex;
2368
+ gap: 24px;
2369
+ margin-bottom: var(--space-6);
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
+ }
2412
+ .fractal-tabs-trigger {
2413
+ position: relative;
2414
+ display: inline-flex;
2415
+ min-width: 88px;
2416
+ align-items: center;
2417
+ justify-content: center;
2418
+ gap: 6px;
2419
+ padding: 10px 1rem;
2420
+ background: none;
2421
+ border: 0;
2422
+ font: inherit;
2423
+ font-size: 0.875rem;
2424
+ font-weight: 400;
2425
+ color: var(--fg-secondary);
2426
+ cursor: pointer;
2427
+ transition: color 0.15s ease;
2428
+ margin-bottom: -1px;
2429
+ }
2430
+ .fractal-tabs-trigger:hover:not(.fractal-tabs-trigger--active):not(.fractal-tabs-trigger--disabled) {
2431
+ color: var(--fg-primary);
2432
+ }
2433
+ .fractal-tabs-trigger:focus-visible {
2434
+ outline: 2px solid var(--border-focus);
2435
+ outline-offset: 2px;
2436
+ border-radius: 2px;
2437
+ }
2438
+ .fractal-tabs-trigger--active {
2439
+ color: var(--accent-default);
2440
+ font-weight: 500;
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);
2456
+ }
2457
+ .fractal-tabs-trigger--disabled {
2458
+ color: var(--fg-disabled, var(--fg-secondary));
2459
+ opacity: 0.5;
2460
+ cursor: not-allowed;
2461
+ }
2462
+ .fractal-tabs-panel {
2463
+ font-size: 0.875rem;
2464
+ color: var(--fg-primary);
2465
+ }
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
+ }
2556
+ }
2557
+
2558
+ /* src/components/Disclosure/Disclosure.css */
2559
+ .fractal-disclosure {
2560
+ font-family: var(--font-sans);
2561
+ font-size: 0.875rem;
2562
+ }
2563
+ .fractal-disclosure--card {
2564
+ border: 1px solid var(--border-subtle);
2565
+ border-radius: 8px;
2566
+ background: var(--bg-canvas);
2567
+ overflow: hidden;
2568
+ }
2569
+ .fractal-disclosure-trigger {
2570
+ display: flex;
2571
+ align-items: center;
2572
+ gap: 8px;
2573
+ width: 100%;
2574
+ padding: 12px 16px;
2575
+ background: transparent;
2576
+ border: 0;
2577
+ font: inherit;
2578
+ font-size: 0.875rem;
2579
+ font-weight: 500;
2580
+ color: var(--fg-primary);
2581
+ text-align: left;
2582
+ cursor: pointer;
2583
+ transition: background 0.15s ease;
2584
+ }
2585
+ .fractal-disclosure-trigger:hover {
2586
+ background: var(--bg-surface-1);
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
+ }
2599
+ .fractal-disclosure-trigger:focus-visible {
2600
+ outline: 2px solid var(--border-focus);
2601
+ outline-offset: -2px;
2602
+ }
2603
+ .fractal-disclosure--open .fractal-disclosure-trigger {
2604
+ border-bottom: 1px solid var(--border-subtle);
2605
+ }
2606
+ .fractal-disclosure-icon {
2607
+ display: inline-flex;
2608
+ align-items: center;
2609
+ color: var(--fg-secondary);
2610
+ flex-shrink: 0;
2611
+ }
2612
+ .fractal-disclosure-title {
2613
+ flex: 1;
2614
+ min-width: 0;
2615
+ }
2616
+ .fractal-disclosure-meta {
2617
+ font-size: 0.75rem;
2618
+ font-weight: 400;
2619
+ color: var(--fg-secondary);
2620
+ flex-shrink: 0;
2621
+ }
2622
+ .fractal-disclosure-panel[hidden] {
2623
+ display: none;
2624
+ }
2625
+ .fractal-disclosure-panel-inner {
2626
+ padding: 16px;
2627
+ color: var(--fg-primary);
2628
+ font-size: 0.875rem;
2629
+ line-height: 1.55;
2630
+ }
2631
+ .fractal-disclosure:not(.fractal-disclosure--card) .fractal-disclosure-trigger {
2632
+ padding: 8px 0;
2633
+ }
2634
+ .fractal-disclosure:not(.fractal-disclosure--card).fractal-disclosure--open .fractal-disclosure-trigger {
2635
+ border-bottom: 0;
2636
+ }
2637
+ .fractal-disclosure:not(.fractal-disclosure--card) .fractal-disclosure-panel-inner {
2638
+ padding: 4px 0 12px 24px;
2639
+ }
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
+
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
+ }
3010
+ .fractal-sidebar {
3011
+ --fractal-sidebar-width: 232px;
3012
+ --fractal-sidebar-compact-width: 56px;
3013
+ box-sizing: border-box;
3014
+ display: flex;
3015
+ width: var(--fractal-sidebar-width);
3016
+ min-width: var(--fractal-sidebar-width);
3017
+ min-height: 100%;
3018
+ flex-direction: column;
3019
+ background: var(--bg-surface-1);
3020
+ border-right: 1px solid var(--border-subtle);
3021
+ color: var(--fg-primary);
3022
+ font-family: var(--font-sans);
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,
3041
+ .fractal-sidebar__header {
3042
+ box-sizing: border-box;
3043
+ display: flex;
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;
3049
+ align-items: center;
3050
+ padding-block: 0;
3051
+ border-bottom: 1px solid var(--border-subtle);
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
+ }
3061
+ .fractal-sidebar__brand {
3062
+ display: inline-flex;
3063
+ min-width: 0;
3064
+ align-items: center;
3065
+ gap: var(--space-2);
3066
+ padding: var(--space-1);
3067
+ border: 0;
3068
+ border-radius: var(--radius-md);
3069
+ background: transparent;
3070
+ color: var(--fg-primary);
3071
+ cursor: pointer;
3072
+ font: inherit;
3073
+ text-align: left;
3074
+ transition: background-color var(--duration-fast) var(--ease-out), transform var(--duration-fast) var(--ease-out);
3075
+ }
3076
+ .fractal-sidebar__brand:hover {
3077
+ background: var(--nav-hover);
3078
+ }
3079
+ .fractal-sidebar__brand:active {
3080
+ transform: scale(0.98);
3081
+ }
3082
+ .fractal-sidebar__brand:focus-visible,
3083
+ .fractal-sidebar__nav-item:focus-visible,
3084
+ .fractal-sidebar__account-trigger:focus-visible {
3085
+ outline: 2px solid var(--border-focus);
3086
+ outline-offset: 2px;
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
+ }
3132
+ .fractal-sidebar__nav {
3133
+ display: flex;
3134
+ flex: 1;
3135
+ flex-direction: column;
3136
+ gap: 0;
3137
+ overflow-y: auto;
3138
+ padding: var(--space-2);
3139
+ }
3140
+ .fractal-sidebar__section {
3141
+ display: flex;
3142
+ flex-direction: column;
3143
+ gap: 1px;
904
3144
  }
905
- .fractal-sortable-table-table {
3145
+ .fractal-sidebar__section + .fractal-sidebar__section {
3146
+ position: relative;
3147
+ margin-top: var(--space-2);
3148
+ padding-top: var(--space-2);
3149
+ }
3150
+ .fractal-sidebar__section + .fractal-sidebar__section::before {
3151
+ position: absolute;
3152
+ top: 0;
3153
+ right: var(--space-2);
3154
+ left: var(--space-2);
3155
+ height: 1px;
3156
+ background: var(--border-subtle);
3157
+ content: "";
3158
+ }
3159
+ .fractal-sidebar__nav-item {
3160
+ display: flex;
906
3161
  width: 100%;
907
- border-collapse: separate;
908
- border-spacing: 0;
3162
+ min-height: 36px;
3163
+ align-items: center;
3164
+ gap: 10px;
3165
+ padding: 8px 10px;
3166
+ border: 0;
3167
+ border-radius: var(--radius-md);
3168
+ background: transparent;
3169
+ color: var(--fg-secondary);
3170
+ cursor: pointer;
909
3171
  font-family: var(--font-sans);
910
3172
  font-size: 0.875rem;
3173
+ font-weight: 400;
3174
+ line-height: 1.25;
3175
+ text-align: left;
3176
+ transition:
3177
+ background-color var(--duration-fast) var(--ease-out),
3178
+ color var(--duration-fast) var(--ease-out),
3179
+ transform var(--duration-fast) var(--ease-out);
911
3180
  }
912
- .fractal-sortable-table-thead-row {
913
- background: var(--bg-surface-1);
3181
+ .fractal-sidebar__nav-item:hover {
3182
+ background: var(--nav-hover);
3183
+ color: var(--fg-primary);
914
3184
  }
915
- .fractal-sortable-table-th {
916
- text-align: left;
917
- padding: 12px 16px;
918
- font-size: 0.75rem;
3185
+ .fractal-sidebar__nav-item[data-active] {
3186
+ background: var(--nav-selected);
3187
+ color: var(--fg-primary);
919
3188
  font-weight: 500;
920
- color: var(--fg-secondary);
921
- border-bottom: 1px solid var(--border-subtle);
922
- vertical-align: middle;
3189
+ }
3190
+ .fractal-sidebar__nav-item:active {
3191
+ transform: scale(0.99);
3192
+ }
3193
+ .fractal-sidebar__nav-item-icon {
3194
+ display: inline-flex;
3195
+ width: 18px;
3196
+ height: 18px;
3197
+ flex: 0 0 18px;
3198
+ align-items: center;
3199
+ justify-content: center;
3200
+ }
3201
+ .fractal-sidebar__nav-item-icon > svg {
3202
+ width: 18px;
3203
+ height: 18px;
3204
+ }
3205
+ .fractal-sidebar__nav-item-label {
3206
+ min-width: 0;
3207
+ flex: 1;
3208
+ overflow: hidden;
3209
+ text-overflow: ellipsis;
923
3210
  white-space: nowrap;
924
3211
  }
925
- .fractal-sortable-table-th + .fractal-sortable-table-th {
3212
+ .fractal-sidebar__nav-item-end {
3213
+ color: var(--fg-tertiary);
3214
+ font-family: var(--font-mono);
3215
+ font-size: 0.6875rem;
3216
+ line-height: 1;
3217
+ }
3218
+ .fractal-sidebar__footer {
3219
+ padding: var(--space-2);
3220
+ border-top: 1px solid var(--border-subtle);
3221
+ }
3222
+ @media (prefers-reduced-motion: reduce) {
3223
+ .fractal-sidebar[data-compact],
3224
+ .fractal-sidebar__brand,
3225
+ .fractal-sidebar__nav-item {
3226
+ transition: none;
3227
+ }
3228
+ }
3229
+
3230
+ /* src/components/SidePanel/SidePanel.css */
3231
+ .fractal-side-panel-overlay {
3232
+ position: fixed;
3233
+ inset: 0;
3234
+ z-index: 9998;
3235
+ display: flex;
3236
+ justify-content: flex-end;
3237
+ background: color-mix(in srgb, var(--fg-primary) 16%, transparent);
3238
+ animation: fractal-side-panel-overlay-in var(--duration-normal) var(--ease-out) both;
3239
+ }
3240
+ .fractal-side-panel {
3241
+ display: flex;
3242
+ width: min(100vw, 540px);
3243
+ height: 100%;
3244
+ flex-direction: column;
926
3245
  border-left: 1px solid var(--border-subtle);
3246
+ background: var(--bg-canvas);
3247
+ box-shadow: var(--shadow-lg);
3248
+ color: var(--fg-primary);
3249
+ font-family: var(--font-sans);
3250
+ animation: fractal-side-panel-in var(--duration-normal) var(--ease-out) both;
927
3251
  }
928
- .fractal-sortable-table-th--sortable {
929
- padding: 0;
3252
+ .fractal-side-panel--sm {
3253
+ width: min(100vw, 420px);
930
3254
  }
931
- .fractal-sortable-table-sort-button {
3255
+ .fractal-side-panel--md {
3256
+ width: min(100vw, 540px);
3257
+ }
3258
+ .fractal-side-panel--lg {
3259
+ width: min(100vw, 680px);
3260
+ }
3261
+ .fractal-side-panel--xl {
3262
+ width: min(100vw, 960px);
3263
+ }
3264
+ .fractal-side-panel__header {
3265
+ display: flex;
3266
+ align-items: flex-start;
3267
+ justify-content: space-between;
3268
+ gap: var(--space-4);
3269
+ padding: var(--space-5) var(--space-6) var(--space-4);
3270
+ }
3271
+ .fractal-side-panel__heading {
3272
+ min-width: 0;
3273
+ }
3274
+ .fractal-side-panel__title {
932
3275
  display: flex;
3276
+ min-height: 32px;
933
3277
  align-items: center;
934
- gap: 6px;
935
- width: 100%;
936
- background: none;
937
- border: 0;
938
- padding: 12px 16px;
939
3278
  margin: 0;
940
- font: inherit;
941
- color: inherit;
942
- text-align: left;
3279
+ font-size: 1rem;
3280
+ font-weight: 500;
3281
+ line-height: 1.4;
3282
+ }
3283
+ .fractal-side-panel__description {
3284
+ margin: var(--space-1) 0 0;
3285
+ color: var(--fg-secondary);
3286
+ font-size: 0.875rem;
3287
+ line-height: 1.4;
3288
+ }
3289
+ .fractal-side-panel__close {
3290
+ display: grid;
3291
+ width: 32px;
3292
+ height: 32px;
3293
+ flex: 0 0 auto;
3294
+ place-items: center;
3295
+ border: 0;
3296
+ border-radius: var(--radius-md);
3297
+ background: transparent;
3298
+ color: var(--fg-secondary);
943
3299
  cursor: pointer;
944
- transition: color 0.15s ease, background 0.15s ease;
945
3300
  }
946
- .fractal-sortable-table-sort-button:hover {
947
- color: var(--fg-primary);
3301
+ .fractal-side-panel__close:hover {
948
3302
  background: var(--hover-surface);
3303
+ color: var(--fg-primary);
949
3304
  }
950
- .fractal-sortable-table-sort-button--active {
951
- color: var(--accent-default);
952
- }
953
- .fractal-sortable-table-sort-button:focus-visible {
3305
+ .fractal-side-panel__close:focus-visible {
954
3306
  outline: 2px solid var(--border-focus);
955
3307
  outline-offset: 2px;
956
- border-radius: 2px;
957
3308
  }
958
- .fractal-sortable-table-sort-icon {
959
- display: inline-flex;
960
- align-items: center;
961
- color: var(--fg-tertiary, var(--fg-secondary));
962
- opacity: 0;
963
- transition: opacity 0.15s ease, color 0.15s ease;
3309
+ .fractal-side-panel__body {
3310
+ min-height: 0;
3311
+ flex: 1;
3312
+ overflow: auto;
3313
+ padding: var(--space-2) var(--space-6) var(--space-6);
964
3314
  }
965
- .fractal-sortable-table-sort-button:hover .fractal-sortable-table-sort-icon,
966
- .fractal-sortable-table-sort-button:focus-visible .fractal-sortable-table-sort-icon {
967
- opacity: 1;
3315
+ .fractal-side-panel__body--loading {
3316
+ display: grid;
3317
+ place-items: center;
968
3318
  }
969
- .fractal-sortable-table-sort-button--active .fractal-sortable-table-sort-icon {
970
- opacity: 1;
971
- color: var(--accent-default);
3319
+ .fractal-side-panel__footer {
3320
+ display: flex;
3321
+ justify-content: flex-end;
3322
+ gap: var(--space-2);
3323
+ padding: var(--space-4) var(--space-6);
3324
+ border-top: 1px solid transparent;
972
3325
  }
973
- .fractal-sortable-table-row {
974
- background: var(--bg-canvas);
975
- transition: background 120ms ease;
3326
+ .fractal-side-panel__header,
3327
+ .fractal-side-panel__footer {
3328
+ position: relative;
3329
+ flex-shrink: 0;
976
3330
  }
977
- .fractal-sortable-table-row:hover {
978
- background: var(--bg-surface-1);
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);
979
3341
  }
980
- .fractal-sortable-table-row--interactive {
981
- cursor: pointer;
3342
+ .fractal-side-panel__header::after {
3343
+ bottom: 0;
982
3344
  }
983
- .fractal-sortable-table-row--interactive:focus-visible {
984
- position: relative;
985
- z-index: 1;
986
- outline: 2px solid var(--border-focus);
987
- outline-offset: -2px;
3345
+ .fractal-side-panel__footer::before {
3346
+ top: -1px;
988
3347
  }
989
- .fractal-sortable-table-row + .fractal-sortable-table-row .fractal-sortable-table-td {
990
- border-top: 1px solid var(--border-subtle);
3348
+ .fractal-side-panel__header[data-scroll-divider=true]::after,
3349
+ .fractal-side-panel__footer[data-scroll-divider=true]::before {
3350
+ opacity: 1;
991
3351
  }
992
- .fractal-sortable-table-row--highlighted {
993
- background: var(--bg-surface-1);
3352
+ @media (max-width: 640px) {
3353
+ .fractal-side-panel {
3354
+ width: 100%;
3355
+ }
3356
+ .fractal-side-panel__header {
3357
+ padding: var(--space-4) var(--space-5) var(--space-3);
3358
+ }
3359
+ .fractal-side-panel__body {
3360
+ padding: var(--space-2) var(--space-5) var(--space-5);
3361
+ }
3362
+ .fractal-side-panel__footer {
3363
+ padding: var(--space-3) var(--space-5);
3364
+ }
994
3365
  }
995
- .fractal-sortable-table-row--highlighted:hover {
996
- background: var(--bg-surface-2);
3366
+ @keyframes fractal-side-panel-overlay-in {
3367
+ from {
3368
+ opacity: 0;
3369
+ }
3370
+ to {
3371
+ opacity: 1;
3372
+ }
997
3373
  }
998
- .fractal-sortable-table-td {
999
- padding: 14px 16px;
1000
- color: var(--fg-primary);
1001
- line-height: 1.55;
1002
- vertical-align: top;
1003
- overflow-wrap: anywhere;
3374
+ @keyframes fractal-side-panel-in {
3375
+ from {
3376
+ transform: translateX(100%);
3377
+ }
3378
+ to {
3379
+ transform: translateX(0);
3380
+ }
1004
3381
  }
1005
- .fractal-sortable-table-td + .fractal-sortable-table-td {
1006
- border-left: 1px solid var(--border-subtle);
3382
+ @media (prefers-reduced-motion: reduce) {
3383
+ .fractal-side-panel-overlay,
3384
+ .fractal-side-panel {
3385
+ animation: none;
3386
+ }
3387
+ .fractal-side-panel__header::after,
3388
+ .fractal-side-panel__footer::before {
3389
+ transition: none;
3390
+ }
1007
3391
  }
1008
- .fractal-sortable-table--sm .fractal-sortable-table-th,
1009
- .fractal-sortable-table--sm .fractal-sortable-table-sort-button {
1010
- padding: 8px 12px;
3392
+
3393
+ /* src/components/Textarea/Textarea.css */
3394
+ .fractal-textarea {
3395
+ display: block;
3396
+ width: 100%;
3397
+ min-height: 120px;
3398
+ resize: vertical;
3399
+ border: 1px solid var(--border-subtle);
3400
+ border-radius: var(--radius-md);
3401
+ background: var(--bg-canvas);
3402
+ padding: var(--space-3);
3403
+ color: var(--fg-primary);
3404
+ font: 0.8125rem/1.55 var(--font-mono);
1011
3405
  }
1012
- .fractal-sortable-table--sm .fractal-sortable-table-td {
1013
- padding: 10px 12px;
3406
+ .fractal-textarea::placeholder {
3407
+ color: var(--fg-placeholder);
1014
3408
  }
1015
- .fractal-sortable-table--lg .fractal-sortable-table-th,
1016
- .fractal-sortable-table--lg .fractal-sortable-table-sort-button {
1017
- padding: 18px 24px;
3409
+ .fractal-textarea:focus-visible {
3410
+ outline: none;
3411
+ border-color: var(--border-focus);
3412
+ box-shadow: 0 0 0 2px var(--accent-surface);
1018
3413
  }
1019
- .fractal-sortable-table--lg .fractal-sortable-table-td {
1020
- padding: 22px 24px;
3414
+ .fractal-textarea:disabled {
3415
+ cursor: not-allowed;
3416
+ opacity: 0.5;
3417
+ background: var(--bg-surface-1);
1021
3418
  }
1022
-
1023
- /* src/components/Tabs/Tabs.css */
1024
- .fractal-tabs {
3419
+ .fractal-textarea[data-text-style=prose] {
1025
3420
  font-family: var(--font-sans);
1026
- font-size: 0.875rem;
3421
+ font-size: var(--control-md-font-size);
3422
+ line-height: var(--control-md-line-height);
1027
3423
  }
1028
- .fractal-tabs-list {
1029
- display: flex;
1030
- gap: 24px;
1031
- border-bottom: 1px solid var(--border-subtle);
1032
- margin-bottom: var(--space-6);
3424
+ .fractal-floating-field--textarea > .fractal-floating-field__label {
3425
+ transform: translateY(calc(var(--space-3) + 1px));
1033
3426
  }
1034
- .fractal-tabs-trigger {
1035
- position: relative;
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 {
1036
3433
  display: inline-flex;
1037
3434
  align-items: center;
1038
- gap: 6px;
1039
- padding: 10px 0;
1040
- background: none;
3435
+ gap: var(--space-1);
1041
3436
  border: 0;
1042
- font: inherit;
1043
- font-size: 0.875rem;
1044
- font-weight: 400;
1045
- color: var(--fg-secondary);
3437
+ background: transparent;
1046
3438
  cursor: pointer;
1047
- transition: color 0.15s ease, box-shadow 0.15s ease;
1048
- box-shadow: inset 0 -1px 0 transparent;
1049
- margin-bottom: -1px;
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;
1050
3445
  }
1051
- .fractal-tabs-trigger:hover:not(.fractal-tabs-trigger--active):not(.fractal-tabs-trigger--disabled) {
3446
+ .fractal-text-button--primary {
1052
3447
  color: var(--fg-primary);
1053
3448
  }
1054
- .fractal-tabs-trigger:focus-visible {
1055
- outline: 2px solid var(--border-focus);
1056
- outline-offset: 2px;
1057
- border-radius: 2px;
3449
+ .fractal-text-button--primary:hover:not(:disabled) {
3450
+ color: var(--fg-secondary);
1058
3451
  }
1059
- .fractal-tabs-trigger--active {
1060
- color: var(--accent-default);
1061
- font-weight: 500;
1062
- box-shadow: inset 0 -1px 0 var(--accent-default);
3452
+ .fractal-text-button--secondary {
3453
+ color: var(--fg-secondary);
1063
3454
  }
1064
- .fractal-tabs-trigger--disabled {
1065
- color: var(--fg-disabled, var(--fg-secondary));
1066
- opacity: 0.5;
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 {
1067
3464
  cursor: not-allowed;
3465
+ opacity: 0.5;
1068
3466
  }
1069
- .fractal-tabs-panel {
3467
+ .fractal-text-button--sm {
3468
+ font-size: 0.8125rem;
3469
+ }
3470
+ .fractal-text-button--md {
1070
3471
  font-size: 0.875rem;
1071
- color: var(--fg-primary);
1072
3472
  }
1073
- .fractal-tabs-panel[hidden] {
1074
- display: none;
3473
+ .fractal-text-button__icon {
3474
+ display: inline-grid;
3475
+ place-items: center;
1075
3476
  }
1076
3477
 
1077
- /* src/components/Disclosure/Disclosure.css */
1078
- .fractal-disclosure {
3478
+ /* src/components/FileDropzone/FileDropzone.css */
3479
+ .fractal-file-dropzone {
3480
+ display: grid;
3481
+ gap: var(--space-2);
3482
+ color: var(--fg-primary);
1079
3483
  font-family: var(--font-sans);
1080
- font-size: 0.875rem;
1081
3484
  }
1082
- .fractal-disclosure--card {
1083
- border: 1px solid var(--border-subtle);
1084
- border-radius: 8px;
1085
- background: var(--bg-canvas);
1086
- overflow: hidden;
3485
+ .fractal-file-dropzone__input {
3486
+ display: none;
1087
3487
  }
1088
- .fractal-disclosure-trigger {
3488
+ .fractal-file-dropzone__target {
1089
3489
  display: flex;
1090
- align-items: center;
1091
- gap: 8px;
1092
3490
  width: 100%;
1093
- padding: 12px 16px;
1094
- background: transparent;
1095
- border: 0;
1096
- font: inherit;
1097
- font-size: 0.875rem;
1098
- font-weight: 500;
1099
- color: var(--fg-primary);
1100
- text-align: left;
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);
1101
3499
  cursor: pointer;
1102
- transition: background 0.15s ease;
3500
+ padding: var(--space-4);
3501
+ text-align: left;
1103
3502
  }
1104
- .fractal-disclosure-trigger:hover {
1105
- background: var(--bg-surface-1);
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);
1106
3508
  }
1107
- .fractal-disclosure-trigger:focus-visible {
3509
+ .fractal-file-dropzone__target:focus-visible {
1108
3510
  outline: 2px solid var(--border-focus);
1109
- outline-offset: -2px;
1110
- }
1111
- .fractal-disclosure--open .fractal-disclosure-trigger {
1112
- border-bottom: 1px solid var(--border-subtle);
1113
- }
1114
- .fractal-disclosure-icon {
1115
- display: inline-flex;
1116
- align-items: center;
1117
- color: var(--fg-secondary);
1118
- flex-shrink: 0;
1119
- }
1120
- .fractal-disclosure-title {
1121
- flex: 1;
1122
- min-width: 0;
3511
+ outline-offset: 2px;
1123
3512
  }
1124
- .fractal-disclosure-meta {
1125
- font-size: 0.75rem;
1126
- font-weight: 400;
1127
- color: var(--fg-secondary);
1128
- flex-shrink: 0;
3513
+ .fractal-file-dropzone__target:disabled {
3514
+ cursor: not-allowed;
3515
+ opacity: 0.5;
1129
3516
  }
1130
- .fractal-disclosure-panel[hidden] {
1131
- display: none;
3517
+ .fractal-file-dropzone__copy {
3518
+ display: grid;
3519
+ gap: var(--space-1);
1132
3520
  }
1133
- .fractal-disclosure-panel-inner {
1134
- padding: 16px;
1135
- color: var(--fg-primary);
3521
+ .fractal-file-dropzone__title {
1136
3522
  font-size: 0.875rem;
1137
- line-height: 1.55;
1138
- }
1139
- .fractal-disclosure:not(.fractal-disclosure--card) .fractal-disclosure-trigger {
1140
- padding: 8px 0;
1141
- }
1142
- .fractal-disclosure:not(.fractal-disclosure--card).fractal-disclosure--open .fractal-disclosure-trigger {
1143
- border-bottom: 0;
3523
+ font-weight: 500;
3524
+ line-height: 1.4;
1144
3525
  }
1145
- .fractal-disclosure:not(.fractal-disclosure--card) .fractal-disclosure-panel-inner {
1146
- padding: 4px 0 12px 24px;
3526
+ .fractal-file-dropzone__description {
3527
+ color: var(--fg-secondary);
3528
+ font-size: 0.8125rem;
3529
+ line-height: 1.4;
1147
3530
  }
1148
-
1149
- /* src/components/Sidebar/Sidebar.css */
1150
- .fractal-sidebar {
1151
- --fractal-sidebar-width: 232px;
1152
- box-sizing: border-box;
1153
- display: flex;
1154
- width: var(--fractal-sidebar-width);
1155
- min-width: var(--fractal-sidebar-width);
1156
- min-height: 100%;
1157
- flex-direction: column;
1158
- background: var(--bg-surface-1);
1159
- border-right: 1px solid var(--nav-border);
1160
- color: var(--fg-primary);
1161
- font-family: var(--font-sans);
3531
+ .fractal-file-dropzone__files {
3532
+ display: grid;
3533
+ gap: var(--space-1);
3534
+ margin: 0;
3535
+ padding: 0;
3536
+ list-style: none;
1162
3537
  }
1163
- .fractal-sidebar__header {
3538
+ .fractal-file-dropzone__file {
1164
3539
  display: flex;
1165
- min-height: 48px;
1166
- align-items: center;
1167
- padding: 0 var(--space-4);
1168
- border-bottom: 1px solid var(--border-subtle);
1169
- }
1170
- .fractal-sidebar__brand {
1171
- display: inline-flex;
1172
3540
  min-width: 0;
1173
3541
  align-items: center;
1174
3542
  gap: var(--space-2);
1175
- padding: var(--space-1);
1176
- border: 0;
3543
+ padding: var(--space-2) var(--space-3);
3544
+ border: 1px solid var(--border-subtle);
1177
3545
  border-radius: var(--radius-md);
1178
- background: transparent;
1179
- color: var(--fg-primary);
1180
- cursor: pointer;
1181
- font: inherit;
1182
- text-align: left;
1183
- transition: background-color var(--duration-fast) var(--ease-out), transform var(--duration-fast) var(--ease-out);
1184
- }
1185
- .fractal-sidebar__brand:hover {
1186
- background: var(--nav-hover);
1187
- }
1188
- .fractal-sidebar__brand:active {
1189
- transform: scale(0.98);
1190
- }
1191
- .fractal-sidebar__brand:focus-visible,
1192
- .fractal-sidebar__nav-item:focus-visible {
1193
- outline: 2px solid var(--border-focus);
1194
- outline-offset: 2px;
3546
+ background: var(--bg-canvas);
3547
+ font-size: 0.8125rem;
3548
+ line-height: 1.4;
1195
3549
  }
1196
- .fractal-sidebar__nav {
1197
- display: flex;
3550
+ .fractal-file-dropzone__file-name {
3551
+ min-width: 0;
1198
3552
  flex: 1;
1199
- flex-direction: column;
1200
- gap: 0;
1201
- overflow-y: auto;
1202
- padding: var(--space-2);
3553
+ overflow: hidden;
3554
+ text-overflow: ellipsis;
3555
+ white-space: nowrap;
1203
3556
  }
1204
- .fractal-sidebar__section {
1205
- display: flex;
1206
- flex-direction: column;
1207
- gap: 1px;
3557
+ .fractal-file-dropzone__file-meta {
3558
+ color: var(--fg-secondary);
3559
+ white-space: nowrap;
1208
3560
  }
1209
- .fractal-sidebar__section + .fractal-sidebar__section {
1210
- position: relative;
1211
- margin-top: var(--space-2);
1212
- padding-top: var(--space-2);
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;
1213
3572
  }
1214
- .fractal-sidebar__section + .fractal-sidebar__section::before {
1215
- position: absolute;
1216
- top: 0;
1217
- right: var(--space-2);
1218
- left: var(--space-2);
1219
- height: 1px;
1220
- background: var(--border-subtle);
1221
- content: "";
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;
1222
3580
  }
1223
- .fractal-sidebar__nav-item {
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 {
1224
3588
  display: flex;
1225
- width: 100%;
1226
- min-height: 36px;
1227
3589
  align-items: center;
1228
- gap: 10px;
1229
- padding: 8px 10px;
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;
1230
3604
  border: 0;
1231
- border-radius: var(--radius-md);
1232
3605
  background: transparent;
1233
3606
  color: var(--fg-secondary);
1234
- cursor: pointer;
1235
- font-family: var(--font-sans);
1236
- font-size: 0.875rem;
1237
- font-weight: 400;
1238
- line-height: 1.25;
1239
- text-align: left;
1240
- transition:
1241
- background-color var(--duration-fast) var(--ease-out),
1242
- color var(--duration-fast) var(--ease-out),
1243
- transform var(--duration-fast) var(--ease-out);
1244
3607
  }
1245
- .fractal-sidebar__nav-item:hover {
1246
- background: var(--nav-hover);
3608
+ .fractal-pagination__page-size .fractal-dropdown-trigger:hover {
3609
+ background: transparent;
1247
3610
  color: var(--fg-primary);
1248
3611
  }
1249
- .fractal-sidebar__nav-item[data-active] {
1250
- background: var(--nav-selected);
1251
- color: var(--fg-primary);
1252
- font-weight: 500;
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;
1253
3622
  }
1254
- .fractal-sidebar__nav-item:active {
1255
- transform: scale(0.99);
3623
+ .fractal-pagination__button:hover:not(:disabled) {
3624
+ background: var(--hover-surface);
3625
+ color: var(--fg-primary);
1256
3626
  }
1257
- .fractal-sidebar__nav-item-icon {
1258
- display: inline-flex;
1259
- width: 18px;
1260
- height: 18px;
1261
- flex: 0 0 18px;
1262
- align-items: center;
1263
- justify-content: center;
3627
+ .fractal-pagination__button:focus-visible {
3628
+ outline: 2px solid var(--border-focus);
3629
+ outline-offset: 2px;
1264
3630
  }
1265
- .fractal-sidebar__nav-item-icon > svg {
1266
- width: 18px;
1267
- height: 18px;
3631
+ .fractal-pagination__button:disabled {
3632
+ cursor: not-allowed;
3633
+ opacity: 0.45;
1268
3634
  }
1269
- .fractal-sidebar__nav-item-label {
1270
- min-width: 0;
1271
- flex: 1;
1272
- overflow: hidden;
1273
- text-overflow: ellipsis;
3635
+ .fractal-pagination__page {
3636
+ min-width: 44px;
3637
+ text-align: center;
1274
3638
  white-space: nowrap;
1275
3639
  }
1276
- .fractal-sidebar__nav-item-end {
1277
- color: var(--fg-tertiary);
1278
- font-family: var(--font-mono);
1279
- font-size: 0.6875rem;
1280
- line-height: 1;
3640
+
3641
+ /* src/components/ColumnEditor/ColumnEditor.css */
3642
+ .fractal-column-editor {
3643
+ position: relative;
1281
3644
  }
1282
- .fractal-sidebar__footer {
1283
- padding: var(--space-2);
1284
- border-top: 1px solid var(--border-subtle);
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;
1285
3661
  }
1286
- @media (prefers-reduced-motion: reduce) {
1287
- .fractal-sidebar__brand,
1288
- .fractal-sidebar__nav-item {
1289
- transition: none;
1290
- }
3662
+ .fractal-column-editor__panel:focus-visible {
3663
+ outline: 2px solid var(--border-focus);
3664
+ outline-offset: 2px;
1291
3665
  }
1292
-
1293
- /* src/components/SidePanel/SidePanel.css */
1294
- .fractal-side-panel-overlay {
1295
- position: fixed;
1296
- inset: 0;
1297
- z-index: 9998;
1298
- display: flex;
1299
- justify-content: flex-end;
1300
- background: color-mix(in srgb, var(--fg-primary) 16%, transparent);
1301
- animation: fractal-side-panel-overlay-in 180ms ease-out both;
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);
1302
3673
  }
1303
- .fractal-side-panel {
3674
+ .fractal-column-editor__row {
1304
3675
  display: flex;
1305
- width: min(100vw, 540px);
1306
- height: 100%;
1307
- flex-direction: column;
1308
- border-left: 1px solid var(--border-subtle);
1309
- background: var(--bg-canvas);
1310
- box-shadow: var(--shadow-lg);
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);
1311
3681
  color: var(--fg-primary);
1312
- font-family: var(--font-sans);
1313
- animation: fractal-side-panel-in 180ms cubic-bezier(0.16, 1, 0.3, 1) both;
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);
1314
3687
  }
1315
- .fractal-side-panel--sm {
1316
- width: min(100vw, 420px);
3688
+ .fractal-column-editor__row[data-hidden] {
3689
+ color: var(--fg-disabled);
3690
+ background: var(--bg-surface-1);
1317
3691
  }
1318
- .fractal-side-panel--md {
1319
- width: min(100vw, 540px);
3692
+ .fractal-column-editor__row:hover {
3693
+ background: var(--hover-surface);
1320
3694
  }
1321
- .fractal-side-panel--lg {
1322
- width: min(100vw, 680px);
3695
+ .fractal-column-editor__row[data-dragging] {
3696
+ cursor: grabbing;
3697
+ background: var(--nav-selected);
3698
+ border-color: var(--border-focus);
1323
3699
  }
1324
- .fractal-side-panel__header {
1325
- display: flex;
1326
- min-height: 72px;
1327
- align-items: flex-start;
1328
- justify-content: space-between;
1329
- gap: var(--space-4);
1330
- padding: var(--space-5) var(--space-6) var(--space-4);
3700
+ .fractal-column-editor__grip {
3701
+ width: 20px;
3702
+ height: 20px;
3703
+ flex-shrink: 0;
3704
+ color: inherit;
3705
+ pointer-events: none;
1331
3706
  }
1332
- .fractal-side-panel__heading {
3707
+ .fractal-column-editor__name {
1333
3708
  min-width: 0;
3709
+ pointer-events: none;
1334
3710
  }
1335
- .fractal-side-panel__title {
1336
- margin: 0;
1337
- font-size: 1rem;
1338
- font-weight: 500;
1339
- line-height: 1.4;
3711
+ .fractal-column-editor__actions {
3712
+ display: flex;
3713
+ flex-shrink: 0;
3714
+ margin-left: auto;
3715
+ cursor: default;
1340
3716
  }
1341
- .fractal-side-panel__description {
1342
- margin: var(--space-1) 0 0;
3717
+ .fractal-column-editor__actions .fractal-button {
3718
+ cursor: pointer !important;
1343
3719
  color: var(--fg-secondary);
1344
- font-size: 0.875rem;
1345
- line-height: 1.4;
1346
3720
  }
1347
- .fractal-side-panel__close {
1348
- display: grid;
1349
- width: 32px;
1350
- height: 32px;
1351
- flex: 0 0 auto;
1352
- place-items: center;
1353
- border: 0;
1354
- border-radius: var(--radius-md);
1355
- background: transparent;
1356
- color: var(--fg-secondary);
1357
- cursor: pointer;
3721
+ .fractal-column-editor__actions .fractal-button:hover:not(:disabled) {
3722
+ background: var(--bg-surface-2) !important;
1358
3723
  }
1359
- .fractal-side-panel__close:hover {
1360
- background: var(--hover-surface);
1361
- color: var(--fg-primary);
3724
+ .fractal-column-editor__actions .fractal-button:disabled {
3725
+ pointer-events: auto;
3726
+ cursor: pointer !important;
1362
3727
  }
1363
- .fractal-side-panel__close:focus-visible {
1364
- outline: 2px solid var(--border-focus);
1365
- outline-offset: 2px;
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);
1366
3734
  }
1367
- .fractal-side-panel__body {
1368
- min-height: 0;
3735
+ .fractal-column-editor__divider::before,
3736
+ .fractal-column-editor__divider::after {
3737
+ content: "";
1369
3738
  flex: 1;
1370
- overflow: auto;
1371
- padding: var(--space-2) var(--space-6) var(--space-6);
3739
+ border-top: 1px solid var(--border-subtle);
1372
3740
  }
1373
- .fractal-side-panel__footer {
3741
+ .fractal-column-editor__divider > span {
1374
3742
  display: flex;
1375
- justify-content: flex-end;
1376
3743
  gap: var(--space-2);
1377
- padding: var(--space-4) var(--space-6);
1378
- border-top: 1px solid var(--border-subtle);
3744
+ align-items: center;
3745
+ white-space: nowrap;
1379
3746
  }
1380
- @media (max-width: 640px) {
1381
- .fractal-side-panel {
1382
- width: 100%;
1383
- }
1384
- .fractal-side-panel__header {
1385
- padding: var(--space-4) var(--space-5) var(--space-3);
1386
- }
1387
- .fractal-side-panel__body {
1388
- padding: var(--space-2) var(--space-5) var(--space-5);
1389
- }
1390
- .fractal-side-panel__footer {
1391
- padding: var(--space-3) var(--space-5);
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;
1392
3767
  }
1393
3768
  }
1394
- @keyframes fractal-side-panel-overlay-in {
3769
+ .fractal-column-editor__panel[data-dragging],
3770
+ .fractal-column-editor__panel[data-dragging] .fractal-column-editor__row {
3771
+ cursor: grabbing;
3772
+ }
3773
+
3774
+ /* src/components/Tooltip/Tooltip.css */
3775
+ .fractal-tooltip {
3776
+ z-index: 10000;
3777
+ box-sizing: border-box;
3778
+ width: max-content;
3779
+ max-width: min(var(--tooltip-max-width), var(--radix-tooltip-content-available-width));
3780
+ padding: var(--space-2) var(--space-3);
3781
+ border: 1px solid var(--border-subtle);
3782
+ border-radius: var(--radius-md);
3783
+ background: var(--bg-surface-1);
3784
+ color: var(--fg-primary);
3785
+ box-shadow: var(--shadow-md);
3786
+ font-family: var(--font-sans);
3787
+ font-size: 0.75rem;
3788
+ font-weight: 400;
3789
+ line-height: 1.4;
3790
+ overflow-wrap: anywhere;
3791
+ animation: fractal-tooltip-enter var(--duration-normal) var(--ease-out);
3792
+ }
3793
+ .fractal-tooltip[data-state=closed] {
3794
+ animation: fractal-tooltip-exit var(--duration-fast) var(--ease-in) forwards;
3795
+ }
3796
+ @keyframes fractal-tooltip-enter {
1395
3797
  from {
1396
3798
  opacity: 0;
1397
3799
  }
@@ -1399,48 +3801,17 @@
1399
3801
  opacity: 1;
1400
3802
  }
1401
3803
  }
1402
- @keyframes fractal-side-panel-in {
3804
+ @keyframes fractal-tooltip-exit {
1403
3805
  from {
1404
- transform: translateX(100%);
3806
+ opacity: 1;
1405
3807
  }
1406
3808
  to {
1407
- transform: translateX(0);
3809
+ opacity: 0;
1408
3810
  }
1409
3811
  }
1410
3812
  @media (prefers-reduced-motion: reduce) {
1411
- .fractal-side-panel-overlay,
1412
- .fractal-side-panel {
1413
- animation-duration: 0.01ms;
3813
+ .fractal-tooltip {
3814
+ animation: none;
1414
3815
  }
1415
3816
  }
1416
-
1417
- /* src/components/Textarea/Textarea.css */
1418
- .fractal-textarea {
1419
- display: block;
1420
- width: 100%;
1421
- min-height: 120px;
1422
- resize: vertical;
1423
- border: 1px solid var(--border-default);
1424
- border-radius: var(--radius-md);
1425
- background: var(--bg-canvas);
1426
- padding: var(--space-3);
1427
- color: var(--fg-primary);
1428
- font: 0.8125rem/1.55 var(--font-mono);
1429
- }
1430
- .fractal-textarea::placeholder {
1431
- color: var(--fg-placeholder);
1432
- }
1433
- .fractal-textarea:hover {
1434
- border-color: var(--fg-tertiary);
1435
- }
1436
- .fractal-textarea:focus-visible {
1437
- outline: none;
1438
- border-color: var(--border-focus);
1439
- box-shadow: 0 0 0 2px var(--accent-surface);
1440
- }
1441
- .fractal-textarea:disabled {
1442
- cursor: not-allowed;
1443
- opacity: 0.5;
1444
- background: var(--bg-surface-1);
1445
- }
1446
3817
  /*# sourceMappingURL=index.css.map */