@filipgutica/ui 1.11.2 → 1.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/site.css CHANGED
@@ -24,8 +24,11 @@
24
24
  line-height: var(--leading-tight);
25
25
  text-wrap: balance;
26
26
  }
27
- .fg-site-docs :where(h1) { max-width: 22ch; font-size: var(--text-3xl); letter-spacing: var(--tracking-tight); }
28
- .fg-site-docs :where(h2) { font-size: var(--text-xl); }
27
+ .fg-site-docs :where(h1) { max-width: 22ch; font: var(--weight-semibold) var(--text-3xl) / 1.08 var(--font-mono); letter-spacing: var(--tracking-tight); }
28
+ .fg-site-docs :where(h2) { font-family: var(--font-mono); font-size: var(--text-xl); }
29
+ .fg-site-docs :where(h3) { font-family: var(--font-ui); font-size: var(--text-lg); }
30
+ :is(.fg-site-docs main, .fg-site-prose) :where(section > h2, section > :is(header, hgroup) > h2) { padding-top: var(--space-4); border-top: 1px solid var(--color-border-subtle); }
31
+ :is(.fg-site-docs main, .fg-site-prose) :where(section > h2, section > :is(header, hgroup) > h2)::before { content: '## ' / ''; color: var(--color-project); }
29
32
  .fg-site-docs :where(p) { max-width: var(--measure); }
30
33
  /* Tab panels and other enhanced markup use the hidden attribute, so it outranks the page's own
31
34
  * display rules. until-found keeps the browser's find-in-page behavior. */
@@ -86,6 +89,7 @@
86
89
  color: var(--color-muted);
87
90
  font-size: var(--text-sm);
88
91
  }
92
+ .fg-site-footer { font-family: var(--font-mono); }
89
93
  .fg-site-footer nav { display: flex; flex-wrap: wrap; gap: 0 var(--space-5); }
90
94
  .fg-site-footer a {
91
95
  display: inline-flex;
@@ -128,7 +132,7 @@
128
132
  .fg-site-header {
129
133
  position: relative;
130
134
  z-index: 30;
131
- border-bottom: 1px solid var(--color-border-subtle);
135
+ border-bottom: 1px solid var(--color-text);
132
136
  background: var(--color-bg);
133
137
  color: var(--color-text);
134
138
  font-family: var(--font-ui);
@@ -156,7 +160,7 @@
156
160
  min-height: var(--control-lg);
157
161
  align-items: center;
158
162
  color: var(--color-muted);
159
- font-size: var(--text-sm);
163
+ font-size: var(--text-md);
160
164
  text-decoration: none;
161
165
  }
162
166
  .fg-site-header__links a:hover { color: var(--color-text); }
@@ -175,6 +179,8 @@
175
179
  cursor: pointer;
176
180
  user-select: none;
177
181
  }
182
+ .fg-site-projects__trigger { font-family: var(--font-mono); }
183
+ .fg-site-projects__trigger::before { content: '~/' / ''; color: var(--color-project); }
178
184
  .fg-site-projects__trigger::-webkit-details-marker { display: none; }
179
185
  .fg-site-projects__trigger:hover,
180
186
  .fg-site-projects[open] > .fg-site-projects__trigger { background: var(--color-row-hover); }
@@ -195,7 +201,7 @@
195
201
 
196
202
  /* Route rows. Hover is neutral, and the current page keeps its selected fill on
197
203
  * hover. An in-page section marker (aria-current="location") must look different
198
- * from the current page, so it only strengthens the text. */
204
+ * from the current page, so it keeps the bar without the selected fill. */
199
205
  .fg-site-nav a {
200
206
  display: flex;
201
207
  min-height: var(--row);
@@ -203,18 +209,19 @@
203
209
  padding-inline: var(--space-3);
204
210
  border-radius: var(--radius-control);
205
211
  color: var(--color-muted);
206
- font-size: var(--text-md);
212
+ font-family: var(--font-mono);
213
+ font-size: var(--text-sm);
207
214
  text-decoration: none;
208
215
  transition: background-color var(--duration-fast) ease, color var(--duration-fast) ease;
209
216
  }
210
217
  .fg-site-nav a:hover { background: var(--color-row-hover); color: var(--color-text); }
211
218
  .fg-site-nav a[aria-current="page"] {
212
- background: var(--color-row-selected);
213
- box-shadow: inset 2px 0 0 var(--color-accent);
219
+ background: var(--color-surface-raised);
220
+ box-shadow: inset 2px 0 0 var(--color-project);
214
221
  color: var(--color-text);
215
222
  font-weight: var(--weight-medium);
216
223
  }
217
- .fg-site-nav a[aria-current="location"] { color: var(--color-text); font-weight: var(--weight-medium); }
224
+ .fg-site-nav a[aria-current="location"] { box-shadow: inset 2px 0 0 var(--color-project); color: var(--color-text); font-weight: var(--weight-medium); }
218
225
  .fg-site-nav a code { font-family: var(--font-mono); font-size: var(--text-sm); }
219
226
 
220
227
  .fg-site-appearance {
@@ -250,6 +257,7 @@
250
257
  }
251
258
  /* Forced colors drop the fill and the ring, so the pressed choice takes the system highlight. */
252
259
  @media (forced-colors: active) {
260
+ .fg-site-nav a[aria-current] { border-inline-start: 2px solid Highlight; }
253
261
  .fg-site-appearance__choice[aria-pressed="true"] { forced-color-adjust: none; color: HighlightText; background: Highlight; }
254
262
  }
255
263
 
@@ -284,8 +292,9 @@
284
292
  margin: 0;
285
293
  padding-inline: var(--space-3);
286
294
  color: var(--color-muted);
287
- font-size: var(--text-sm);
288
- font-weight: var(--weight-regular);
295
+ font-family: var(--font-ui);
296
+ font-size: var(--text-xs);
297
+ font-weight: var(--weight-semibold);
289
298
  }
290
299
  .fg-site-rail__group { display: grid; gap: 2px; }
291
300
  .fg-site-rail__group + .fg-site-rail__group { margin-top: var(--space-3); }
@@ -296,17 +305,23 @@
296
305
  * default. A site can set --site-capture-bg and --t* values on :root, which also
297
306
  * reach the full-size viewer. Nothing clips the panel, so focus rings inside it stay whole. */
298
307
  .fg-capture {
308
+ --color-text: var(--color-terminal-text);
309
+ --color-muted: var(--color-terminal-caption-text);
310
+ --color-accent: var(--color-project-dark);
311
+ --color-focus: var(--color-project-dark);
312
+ --color-border-subtle: var(--color-terminal-border);
299
313
  position: relative;
300
314
  min-width: 0;
301
315
  border: 1px solid var(--color-border-subtle);
302
316
  border-radius: var(--radius-panel);
303
- background: var(--color-surface);
317
+ background: var(--color-terminal);
318
+ color: var(--color-terminal-text);
304
319
  }
305
320
  .fg-capture .fg-tabs__list { width: 100%; margin-block-end: 0; padding-inline: var(--space-2); }
306
- .fg-capture .fg-tabs__tab { min-height: var(--control-lg); }
321
+ .fg-capture .fg-tabs__tab { min-height: var(--control-lg); font-family: var(--font-mono); font-size: var(--text-sm); }
307
322
  /* The Full size control sits at the end of the tab row. The list's margin, not its
308
323
  * padding, reserves the control's width, so the scroll area and divider end before it. */
309
- .fg-capture[data-enhanced="true"] .fg-tabs__list { width: auto; margin-inline-end: calc(var(--space-2) + 6.5rem); }
324
+ .fg-capture[data-enhanced="true"] .fg-tabs__list { width: auto; margin-inline-end: calc(var(--space-2) + 7rem); }
310
325
  .fg-capture__full {
311
326
  position: absolute;
312
327
  top: 0;
@@ -320,7 +335,7 @@
320
335
  border-radius: var(--radius-control);
321
336
  background: transparent;
322
337
  color: var(--color-muted);
323
- font: var(--text-sm) / var(--leading) var(--font-ui);
338
+ font: var(--text-sm) / var(--leading) var(--font-mono);
324
339
  cursor: pointer;
325
340
  }
326
341
  .fg-capture__full:hover { color: var(--color-text); }
@@ -342,17 +357,18 @@
342
357
  min-width: 0;
343
358
  max-width: 100%;
344
359
  overflow-x: auto;
345
- background: var(--site-capture-bg, var(--color-code));
360
+ background: var(--site-capture-bg, var(--color-terminal));
361
+ color: var(--color-terminal-text);
346
362
  }
347
- /* Terminal markup gets the dark default; a plain <pre> keeps the code background its text expects. */
348
- .fg-capture__screen:has(> .term) { background: var(--site-capture-bg, var(--t-bg, #131316)); }
363
+ /* ANSI captures and plain output share the terminal plate; explicit site palettes still win. */
364
+ .fg-capture__screen:has(> .term) { background: var(--site-capture-bg, var(--t-bg, var(--color-terminal))); }
349
365
  .fg-capture__screen > * { width: max-content; margin: 0; }
350
366
  /* Terminal colors for checked-in capture markup: .term and the ANSI classes the capture
351
367
  * converter emits. Each color reads the site's --t* value first, so a site palette on
352
368
  * :root still wins, and these defaults apply only where a site sets none. */
353
369
  .fg-capture__screen .term {
354
370
  padding: var(--space-4);
355
- color: var(--t-fg, #e6e6ea);
371
+ color: var(--t-fg, var(--color-terminal-text));
356
372
  font: var(--weight-regular) var(--text-sm) / 1 var(--font-mono);
357
373
  font-variant-ligatures: none;
358
374
  tab-size: 8;
@@ -391,8 +407,8 @@
391
407
  .fg-capture__screen .tb14 { background: var(--t14, #8ee3e8); }
392
408
  .fg-capture__screen .tb15 { background: var(--t15, #ffffff); }
393
409
  .fg-capture__screen .tf-dim { color: var(--t-dim, #a0a0ab); }
394
- .fg-capture__screen .tf-bg { color: var(--t-bg, #131316); }
395
- .fg-capture__screen .tb-fg { background: var(--t-fg, #e6e6ea); }
410
+ .fg-capture__screen .tf-bg { color: var(--t-bg, var(--color-terminal)); }
411
+ .fg-capture__screen .tb-fg { background: var(--t-fg, var(--color-terminal-text)); }
396
412
  /* Text on the light selection row stays dark, whatever its own colour class. */
397
413
  .fg-capture__screen .tb8 { color: #1b1b1f; }
398
414
  .fg-capture__screen .tbold { font-weight: var(--weight-semibold); }
@@ -419,11 +435,13 @@
419
435
  gap: var(--space-1);
420
436
  padding: var(--space-3) var(--space-4);
421
437
  border-top: 1px solid var(--color-border-subtle);
422
- color: var(--color-muted);
438
+ color: var(--color-terminal-caption-text);
439
+ background: var(--color-terminal-caption);
440
+ font-family: var(--font-mono);
423
441
  font-size: var(--text-sm);
424
442
  line-height: var(--leading);
425
443
  }
426
- .fg-capture__caption > code { color: var(--color-text); font-family: var(--font-mono); font-size: var(--text-sm); overflow-wrap: anywhere; }
444
+ .fg-capture__caption > code { color: var(--color-terminal-caption-text); font-family: var(--font-mono); font-size: var(--text-sm); overflow-wrap: anywhere; }
427
445
  /* Inset: the enhanced panel clips its content. */
428
446
  .fg-capture__screen:focus-visible,
429
447
  .fg-capture__expand:focus-visible { outline: 2px solid var(--color-focus); outline-offset: -2px; }
@@ -491,28 +509,41 @@
491
509
  /* Page helpers. Steps number a real sequence; facts are short label and value
492
510
  * pairs on one line; definitions pair terms with short meanings. Definitions
493
511
  * take dt and dd as direct children. */
494
- .fg-site-steps { display: grid; gap: var(--space-5); margin: 0; padding: 0; list-style: none; counter-reset: fg-site-step; }
512
+ .fg-site-steps { display: grid; gap: var(--space-6); margin: 0; padding: 0; list-style: none; counter-reset: fg-site-step; }
513
+ /* Each step hangs from a mono number in the project hue, set on the title's baseline; a
514
+ * rule runs down the leading column to the next step. */
495
515
  .fg-site-steps > li {
496
516
  position: relative;
497
- min-width: 0;
498
- padding-inline-start: calc(var(--space-6) + var(--space-3));
517
+ display: grid;
518
+ grid-template-columns: var(--space-8) minmax(0, 1fr);
519
+ row-gap: var(--space-2);
499
520
  counter-increment: fg-site-step;
500
521
  }
522
+ .fg-site-steps > li > * { grid-column: 2; }
501
523
  .fg-site-steps > li::before {
502
524
  content: counter(fg-site-step);
525
+ grid-area: 1 / 1;
526
+ align-self: baseline;
527
+ color: var(--color-project);
528
+ font-family: var(--font-mono);
529
+ font-size: var(--text-sm);
530
+ font-weight: var(--weight-semibold);
531
+ font-variant-numeric: tabular-nums;
532
+ }
533
+ .fg-site-steps > li > :first-child { align-self: baseline; }
534
+ .fg-site-steps > li:not(:last-child)::after {
535
+ content: '';
503
536
  position: absolute;
504
- top: 0;
505
- inset-inline-start: 0;
506
- display: grid;
507
- width: var(--space-6);
508
- height: var(--space-6);
509
- place-items: center;
510
- border: 1px solid var(--color-border);
511
- border-radius: var(--radius-pill);
537
+ top: var(--space-8);
538
+ bottom: calc(var(--space-2) - var(--space-6));
539
+ inset-inline-start: 0.25em;
540
+ border-inline-start: 1px solid var(--color-border-subtle);
541
+ }
542
+ /* The outcome of the last step. */
543
+ .fg-site-steps__result {
544
+ padding-inline-start: var(--space-3);
545
+ border-inline-start: 2px solid var(--color-project);
512
546
  color: var(--color-muted);
513
- font-size: var(--text-xs);
514
- font-variant-numeric: tabular-nums;
515
- line-height: 1;
516
547
  }
517
548
  .fg-site-facts {
518
549
  display: flex;
@@ -522,6 +553,7 @@
522
553
  color: var(--color-muted);
523
554
  font-size: var(--text-sm);
524
555
  }
556
+ .fg-site-facts { font-family: var(--font-mono); }
525
557
  .fg-site-facts > div { display: flex; gap: var(--space-2); }
526
558
  .fg-site-facts dd { margin: 0; color: var(--color-text); }
527
559
  .fg-site-definitions {
@@ -574,19 +606,47 @@
574
606
  letter-spacing: var(--tracking-tight);
575
607
  text-wrap: balance;
576
608
  }
577
- .fg-site-prose :where(h1) { font-size: var(--text-3xl); }
578
- .fg-site-prose :where(h2) { font-size: var(--text-xl); }
609
+ .fg-site-prose :where(h1) { font-family: var(--font-mono); font-size: var(--text-3xl); line-height: 1.08; }
610
+ /* Hero titles sit in the components layer so they also outrank the prose defaults above. */
611
+ .fg-site-hero > h1 {
612
+ max-width: none;
613
+ font-size: var(--text-display);
614
+ line-height: 1.04;
615
+ word-spacing: -0.12em;
616
+ }
617
+ .fg-site-prose :where(h2) { font-family: var(--font-mono); font-size: var(--text-xl); }
579
618
  .fg-site-prose :where(h3, h4) { font-size: var(--text-lg); }
580
619
  .fg-site-prose :where(p, ul, ol) { max-width: var(--measure); margin: 0; }
581
620
  .fg-site-prose :where(p, ul, ol) + :where(p, ul, ol) { margin-top: var(--space-4); }
582
621
  .fg-site-prose :where(p a, li a, dd a) { text-decoration: underline; text-underline-offset: 0.18em; }
583
- .fg-site-meta { color: var(--color-muted); font-size: var(--text-sm); }
622
+ .fg-site-meta { color: var(--color-muted); font-family: var(--font-mono); font-size: var(--text-sm); }
584
623
 
585
624
  /* No-JavaScript desktop: the rail's disclosure stays expanded. */
586
625
  @media (min-width: 801px) {
626
+ .fg-site-rail { border-inline-end: 1px solid var(--color-border-subtle); padding-inline-end: var(--space-4); }
587
627
  .fg-site-rail__menu::details-content { content-visibility: visible; }
588
628
  .fg-site-rail__menu:not([open]) > .fg-site-rail__content { display: block; }
589
629
  }
630
+ /* Explicit opt-in keeps the hero independent of page-owned install and capture markup. */
631
+ .fg-site-hero { display: grid; gap: var(--space-4); }
632
+ .fg-site-hero > * { min-width: 0; }
633
+ .fg-site-hero__lede,
634
+ .fg-site-hero__aside { display: grid; gap: var(--space-3); align-content: start; }
635
+ .fg-site-hero__aside .fg-site-meta { margin: 0; align-self: start; }
636
+ /* 1024px is the documented wide exception; narrower heroes keep source order. */
637
+ @media (min-width: 1024px) {
638
+ .fg-site-hero {
639
+ grid-template-columns: minmax(0, 1.1fr) minmax(0, 1fr);
640
+ grid-auto-columns: minmax(0, 1fr);
641
+ column-gap: var(--space-8);
642
+ align-items: start;
643
+ }
644
+ /* Explicit lines also span the implicit column when an unlayered site overrides the template. */
645
+ .fg-site-hero > * { grid-column: 1 / 3; }
646
+ .fg-site-hero > h1 { grid-row: 1; }
647
+ .fg-site-hero > .fg-site-hero__lede { grid-column: 1; grid-row: 2; }
648
+ .fg-site-hero > .fg-site-hero__aside { grid-column: 2; grid-row: 2; }
649
+ }
590
650
  /* Keep in sync with MOBILE_QUERY in UiSiteNav.vue. */
591
651
  @media (max-width: 800px) {
592
652
  .fg-site-docs { grid-template-columns: minmax(0, 1fr); }
@@ -597,10 +657,17 @@
597
657
  overflow: visible;
598
658
  padding-block: var(--space-2);
599
659
  }
600
- .fg-site-rail__summary {
660
+ .fg-site-rail__summary,
661
+ .fg-site-rail__toggle {
601
662
  display: flex;
663
+ gap: var(--space-3);
664
+ border: 1px solid var(--color-border);
665
+ background: var(--color-surface-raised);
602
666
  width: max-content;
667
+ max-width: 100%;
603
668
  min-height: var(--control-lg);
669
+ white-space: normal;
670
+ text-align: start;
604
671
  align-items: center;
605
672
  padding-inline: var(--space-3);
606
673
  border-radius: var(--radius-control);
@@ -609,6 +676,15 @@
609
676
  list-style: none;
610
677
  cursor: pointer;
611
678
  }
679
+ .fg-site-rail__summary::after,
680
+ .fg-site-rail__toggle::after {
681
+ content: '';
682
+ width: 6px;
683
+ height: 6px;
684
+ border-right: 1px solid currentColor;
685
+ border-bottom: 1px solid currentColor;
686
+ transform: rotate(45deg);
687
+ }
612
688
  .fg-site-rail__summary::-webkit-details-marker { display: none; }
613
689
  .fg-site-rail__summary:hover { color: var(--color-text); background: var(--color-row-hover); }
614
690
  .fg-site-rail__summary:focus-visible { outline: 2px solid var(--color-focus); outline-offset: 2px; }
@@ -633,18 +709,24 @@
633
709
  .fg-site-header__inner:has(.fg-site-header__links > :nth-child(3)) .fg-site-header__end { display: contents; }
634
710
  .fg-site-header__inner:has(.fg-site-header__links > :nth-child(3)) .fg-site-projects { margin-inline-end: auto; }
635
711
  .fg-site-header__inner:has(.fg-site-header__links > :nth-child(3)) .fg-site-header__links { order: 1; flex-basis: 100%; }
712
+ .fg-site-docs :where(h1) { font-size: 32px; }
713
+ .fg-site-hero > h1 { font-size: var(--text-display-sm); }
636
714
  .fg-site-docs { padding-inline: var(--space-4); }
637
715
  /* Docs-shell pages keep one header row on phones and repeat these links in their footer. */
638
716
  .fg-site-docs .fg-site-header__links { display: none; }
639
- /* Fact links, such as a Source link that stands in for the hidden header link, get a
640
- * touch-sized hit area. The negative margin keeps each fact row one line tall, and the
641
- * row gap of a list with links makes room for the part of the hit area past the line. */
642
- .fg-site-facts:has(a) { row-gap: calc(var(--control-lg) - 1lh); }
643
- .fg-site-facts a {
644
- display: inline-flex;
717
+ /* Expand the link target without adding space between the text rows. A later link fact
718
+ * moves a full target below the one before it, so their targets never overlap. */
719
+ .fg-site-facts { row-gap: var(--space-2); }
720
+ .fg-site-facts > div:has(a) ~ div:has(a) { margin-top: calc(var(--control-lg) - 1lh - var(--space-2)); }
721
+ .fg-site-facts a { position: relative; display: inline-block; }
722
+ .fg-site-facts a::after {
723
+ content: '';
724
+ position: absolute;
725
+ inset-inline: 0;
726
+ top: 50%;
645
727
  min-height: var(--control-lg);
646
- align-items: center;
647
- margin-block: calc((1lh - var(--control-lg)) / 2);
728
+ height: 100%;
729
+ transform: translateY(-50%);
648
730
  }
649
731
  .fg-dialog__content.fg-capture-viewer { width: 100%; max-width: none; }
650
732
  /* Phones keep the icon; the accessible name still says Full size. */
@@ -681,7 +763,7 @@
681
763
  .fg-site-header__inner { padding-inline: var(--site-gutter, var(--space-6)); }
682
764
  }
683
765
  @media (max-width: 680px) {
684
- .fg-site-prose :where(h1) { font-size: var(--text-2xl); }
766
+ .fg-site-prose :where(h1) { font-size: 32px; }
685
767
  .fg-site-header__end { gap: var(--space-2) var(--space-4); }
686
768
  .fg-site-header__links { gap: var(--space-4); }
687
769
  .fg-site-projects__menu a { min-height: var(--control-lg); }
package/src/theme.css CHANGED
@@ -1,12 +1,15 @@
1
+ @import "./fonts.css";
2
+
1
3
  @custom-variant dark (&:where(.dark, .dark *));
2
4
 
3
5
  :root {
4
6
  color-scheme: light;
5
- --font-ui: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Segoe UI', system-ui, sans-serif;
6
- --font-mono: ui-monospace, 'SF Mono', SFMono-Regular, Menlo, Consolas, monospace;
7
+ --font-ui: "IBM Plex Sans", -apple-system, BlinkMacSystemFont, "SF Pro Text", "Segoe UI", system-ui, sans-serif;
8
+ --font-mono: "IBM Plex Mono", ui-monospace, "SF Mono", SFMono-Regular, Menlo, Consolas, monospace;
7
9
  --text-xs: 0.75rem;
8
10
  --text-sm: 0.8125rem;
9
11
  --text-md: 0.875rem;
12
+ --text-code: 0.84375rem;
10
13
  --text-lg: 1rem;
11
14
  --text-xl: 1.25rem;
12
15
  --text-2xl: 1.5rem;
@@ -14,7 +17,7 @@
14
17
  --weight-medium: 500;
15
18
  --weight-semibold: 600;
16
19
  --leading-tight: 1.25;
17
- --leading: 1.5;
20
+ --leading: 1.6;
18
21
  --space-1: 0.25rem;
19
22
  --space-2: 0.5rem;
20
23
  --space-3: 0.75rem;
@@ -30,106 +33,132 @@
30
33
  --measure: 68ch;
31
34
  --page-max: 60rem;
32
35
  --sidebar: 14rem;
33
- --color-bg: #fcfcfd;
34
- --color-surface: #f6f6f8;
35
- --color-surface-raised: #fff;
36
- --color-surface-muted: #efeff2;
37
- --color-text: #1b1b1f;
38
- --color-muted: #62626d;
39
- --color-link: #3d63dd;
40
- --color-accent: #3d63dd;
41
- --color-focus: #3d63dd;
42
- --color-border: #667085;
43
- --color-border-subtle: #e9e9ed;
44
- --color-button-bg: #3d63dd;
45
- --color-button-text: #fff;
46
- --color-button-hover: #3354c4;
47
- --color-input-bg: #fff;
48
- --color-input-text: #1b1b1f;
49
- --color-input-border: #667085;
50
- --color-input-placeholder: #667085;
51
- --color-row-hover: #efeff2;
52
- --color-row-selected: #e9ebf8;
53
- --color-row-selected-text: #3354c4;
54
- --color-code: #f6f6f8;
55
- --color-code-text: #1b1b1f;
56
- --color-syntax-comment: #62626d;
57
- --color-syntax-keyword: #3d63dd;
58
- --color-syntax-string: #1f7a52;
59
- --color-syntax-number: #854a0e;
60
- --color-syntax-function: #3d63dd;
61
- --color-syntax-type: #854a0e;
62
- --color-syntax-variable: #1b1b1f;
63
- --color-syntax-operator: #62626d;
64
- --color-syntax-punctuation: #62626d;
65
- --color-syntax-tag: #3d63dd;
66
- --color-syntax-attribute: #854a0e;
67
- --color-error: #c01048;
68
- --color-warning: #854a0e;
69
- --color-success: #067647;
36
+ --color-bg: #f4f5f6;
37
+ --color-surface: #e9ebed;
38
+ --color-surface-raised: #fbfbfc;
39
+ --color-surface-muted: #e2e5e8;
40
+ --color-text: #101315;
41
+ --color-muted: #50575e;
42
+ --color-link: #0b5f7c;
43
+ --color-accent: var(--color-project);
44
+ --color-focus: var(--color-link);
45
+ --color-border: #6d747b;
46
+ --color-border-subtle: #d3d8dd;
47
+ --color-button-bg: #101315;
48
+ --color-button-text: #f4f5f6;
49
+ --color-button-hover: #50575e;
50
+ --color-input-bg: #fbfbfc;
51
+ --color-input-text: #101315;
52
+ --color-input-border: #6d747b;
53
+ --color-input-placeholder: #50575e;
54
+ --color-row-hover: #e2e5e8;
55
+ --color-row-selected: var(--color-surface-raised);
56
+ --color-row-selected-text: #101315;
57
+ --color-code: var(--color-surface);
58
+ --color-code-text: var(--color-text);
59
+ --color-syntax-comment: #626772;
60
+ --color-syntax-keyword: #715b42;
61
+ --color-syntax-string: #346347;
62
+ --color-syntax-number: #86532e;
63
+ --color-syntax-function: #715b42;
64
+ --color-syntax-type: #86532e;
65
+ --color-syntax-variable: var(--color-text);
66
+ --color-syntax-operator: #50575e;
67
+ --color-syntax-punctuation: #50575e;
68
+ --color-syntax-tag: #715b42;
69
+ --color-syntax-attribute: #86532e;
70
+ --color-error: #bd342b;
71
+ --color-warning: #86532e;
72
+ --color-success: #157249;
70
73
  --color-info: #175cd3;
71
- --color-progress: #3d63dd;
74
+ --color-progress: var(--color-project);
72
75
  --color-shadow: rgb(16 24 40 / 10%);
73
76
  --color-overlay: rgb(0 0 0 / 42%);
74
- --color-error-surface: color-mix(in srgb, var(--color-error) 12%, var(--color-surface));
75
- --color-warning-surface: color-mix(in srgb, var(--color-warning) 13%, var(--color-surface));
76
- --color-success-surface: color-mix(in srgb, var(--color-success) 12%, var(--color-surface));
77
- --color-info-surface: color-mix(in srgb, var(--color-info) 12%, var(--color-surface));
78
- --radius-inline: 0.25rem;
79
- --radius-control: 0.375rem;
80
- --radius-panel: 0.5rem;
81
- --radius-pill: 999px;
77
+ --color-error-surface: var(--color-surface-raised);
78
+ --color-warning-surface: var(--color-surface-raised);
79
+ --color-success-surface: var(--color-surface-raised);
80
+ --color-info-surface: var(--color-surface-raised);
81
+ --radius-inline: 2px;
82
+ --radius-control: 2px;
83
+ --radius-panel: 3px;
84
+ --radius-pill: 2px;
82
85
  --duration-fast: 120ms;
83
86
  --duration: 180ms;
84
87
  --ease-out: cubic-bezier(0.2, 0.8, 0.2, 1);
85
88
  --shadow-control: none;
86
- --shadow-dialog: 0 8px 24px rgb(16 16 24 / 12%);
89
+ --shadow-dialog: 0 8px 24px rgb(16 16 24 / 12%), 0 0 0 1px var(--color-border-subtle);
90
+
91
+ --color-project: #4b45d1;
92
+ --color-accent-text: var(--color-bg);
93
+ --color-accent-hover: var(--color-text);
94
+ --color-project-dark: #a5a1ff;
95
+ --color-status-text: #101315;
96
+ --color-terminal: #0a0c0e;
97
+ --color-terminal-text: #e6e9eb;
98
+ --color-terminal-border: #2a3036;
99
+ --color-terminal-caption: #13171a;
100
+ --color-terminal-caption-text: #c9d0d6;
87
101
  }
88
102
 
89
103
  :root.dark {
90
104
  color-scheme: dark;
91
- --color-bg: #0f0f11;
92
- --color-surface: #151518;
93
- --color-surface-raised: #1a1a1e;
94
- --color-surface-muted: #1f1f24;
95
- --color-text: #ececf0;
96
- --color-muted: #a0a0ab;
97
- --color-link: #7d97ff;
98
- --color-accent: #7d97ff;
99
- --color-focus: #7d97ff;
100
- --color-border: #647189;
101
- --color-border-subtle: #222227;
102
- --color-button-bg: #7d97ff;
103
- --color-button-text: #0d1020;
104
- --color-button-hover: #97acff;
105
- --color-input-bg: #151518;
106
- --color-input-text: #ececf0;
107
- --color-input-border: #647189;
108
- --color-input-placeholder: #a0a0ab;
109
- --color-row-hover: #1f1f24;
110
- --color-row-selected: #1f2233;
111
- --color-row-selected-text: #ececf0;
112
- --color-code: #151518;
113
- --color-code-text: #ececf0;
114
- --color-syntax-comment: #a0a0ab;
115
- --color-syntax-keyword: #97acff;
116
- --color-syntax-string: #6fd3a0;
117
- --color-syntax-number: #e8b56a;
118
- --color-syntax-function: #97acff;
119
- --color-syntax-type: #e8b56a;
120
- --color-syntax-variable: #ececf0;
121
- --color-syntax-operator: #a0a0ab;
122
- --color-syntax-punctuation: #a0a0ab;
123
- --color-syntax-tag: #97acff;
124
- --color-syntax-attribute: #e8b56a;
125
- --color-error: #ff8aad;
126
- --color-warning: #f8c477;
127
- --color-success: #75e0a7;
105
+ --color-bg: #0d1012;
106
+ --color-surface: #13171a;
107
+ --color-surface-raised: #181d21;
108
+ --color-surface-muted: #20262b;
109
+ --color-text: #e6e9eb;
110
+ --color-muted: #9aa3ab;
111
+ --color-link: #67c1df;
112
+ --color-accent: var(--color-project);
113
+ --color-focus: var(--color-link);
114
+ --color-border: #78818a;
115
+ --color-border-subtle: #262d33;
116
+ --color-button-bg: #e6e9eb;
117
+ --color-button-text: #0d1012;
118
+ --color-button-hover: #9aa3ab;
119
+ --color-input-bg: #181d21;
120
+ --color-input-text: #e6e9eb;
121
+ --color-input-border: #78818a;
122
+ --color-input-placeholder: #9aa3ab;
123
+ --color-row-hover: #20262b;
124
+ --color-row-selected: var(--color-surface-raised);
125
+ --color-row-selected-text: #e6e9eb;
126
+ --color-code: var(--color-surface);
127
+ --color-code-text: var(--color-text);
128
+ --color-syntax-comment: #a0a6b1;
129
+ --color-syntax-keyword: #d8c2a5;
130
+ --color-syntax-string: #a8bd9c;
131
+ --color-syntax-number: #d5b98c;
132
+ --color-syntax-function: #d8c2a5;
133
+ --color-syntax-type: #d5b98c;
134
+ --color-syntax-variable: var(--color-text);
135
+ --color-syntax-operator: #9aa3ab;
136
+ --color-syntax-punctuation: #9aa3ab;
137
+ --color-syntax-tag: #d8c2a5;
138
+ --color-syntax-attribute: #d5b98c;
139
+ --color-error: #f0776c;
140
+ --color-warning: #e2a54b;
141
+ --color-success: #4cc38a;
128
142
  --color-info: #84adff;
129
- --color-progress: #7d97ff;
143
+ --color-progress: var(--color-project);
130
144
  --color-shadow: rgb(0 0 0 / 32%);
131
145
  --color-overlay: rgb(0 0 0 / 62%);
132
- --shadow-dialog: 0 8px 24px rgb(0 0 0 / 45%);
146
+ --shadow-dialog: 0 8px 24px rgb(0 0 0 / 45%), 0 0 0 1px var(--color-border-subtle);
147
+
148
+ --color-project: #a5a1ff;
149
+ --color-accent-text: var(--color-bg);
150
+ --color-accent-hover: var(--color-text);
151
+ --color-project-dark: #a5a1ff;
152
+ --color-error-surface: var(--color-surface-raised);
153
+ --color-warning-surface: var(--color-surface-raised);
154
+ --color-success-surface: var(--color-surface-raised);
155
+ --color-info-surface: var(--color-surface-raised);
156
+ --color-status-text: #e6e9eb;
157
+ --color-terminal: #0a0c0e;
158
+ --color-terminal-text: #e6e9eb;
159
+ --color-terminal-border: #2a3036;
160
+ --color-terminal-caption: #13171a;
161
+ --color-terminal-caption-text: #c9d0d6;
133
162
  }
134
163
 
135
164
  @theme inline {