@leftium/nimble.css 0.2.0 → 0.3.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/dist/nimble.css CHANGED
@@ -123,19 +123,20 @@
123
123
  @layer nimble.base {
124
124
  :root {
125
125
  color-scheme: light dark;
126
- --nc-surface-1: light-dark(oklch(0.985 0.002 250), oklch(0.17 0.005 260));
127
- --nc-surface-2: light-dark(oklch(0.955 0.002 250), oklch(0.2 0.005 260));
128
- --nc-surface-3: light-dark(oklch(0.925 0.002 250), oklch(0.23 0.005 260));
129
- --nc-surface-4: light-dark(oklch(0.885 0.002 250), oklch(0.27 0.005 260));
130
- --nc-text: light-dark(oklch(0.28 0.005 250), oklch(0.86 0.005 250));
131
- --nc-border: light-dark(oklch(0.83 0.005 250), oklch(0.28 0.005 260));
126
+ --nc-surface-hue: 250;
127
+ --nc-surface-1: light-dark(oklch(0.985 0.002 var(--nc-surface-hue)), oklch(0.17 0.005 calc(var(--nc-surface-hue) + 10)));
128
+ --nc-surface-2: light-dark(oklch(0.955 0.002 var(--nc-surface-hue)), oklch(0.2 0.005 calc(var(--nc-surface-hue) + 10)));
129
+ --nc-surface-3: light-dark(oklch(0.925 0.002 var(--nc-surface-hue)), oklch(0.23 0.005 calc(var(--nc-surface-hue) + 10)));
130
+ --nc-surface-4: light-dark(oklch(0.885 0.002 var(--nc-surface-hue)), oklch(0.27 0.005 calc(var(--nc-surface-hue) + 10)));
131
+ --nc-text: light-dark(oklch(0.28 0.005 var(--nc-surface-hue)), oklch(0.86 0.005 var(--nc-surface-hue)));
132
+ --nc-border: light-dark(oklch(0.83 0.005 var(--nc-surface-hue)), oklch(0.28 0.005 calc(var(--nc-surface-hue) + 10)));
132
133
  --nc-primary: light-dark(oklch(0.5 0.2 250), oklch(0.6 0.2 250));
133
- --nc-primary-hover: light-dark(oklch(0.4 0.2 250), oklch(0.7 0.2 250));
134
- --nc-primary-focus: oklch(0.5 0.2 250 / 0.4);
134
+ --nc-primary-hover: light-dark(oklch(from var(--nc-primary) calc(l - 0.1) c h), oklch(from var(--nc-primary) calc(l + 0.1) c h));
135
+ --nc-primary-focus: oklch(from var(--nc-primary) l c h / 0.4);
135
136
  --nc-primary-contrast: light-dark(#fff, oklch(0.15 0.005 250));
136
137
  --nc-secondary: light-dark(oklch(0.45 0.05 250), oklch(0.6 0.05 250));
137
- --nc-secondary-hover: light-dark(oklch(0.35 0.05 250), oklch(0.7 0.05 250));
138
- --nc-secondary-focus: oklch(0.45 0.05 250 / 0.3);
138
+ --nc-secondary-hover: light-dark(oklch(from var(--nc-secondary) calc(l - 0.1) c h), oklch(from var(--nc-secondary) calc(l + 0.1) c h));
139
+ --nc-secondary-focus: oklch(from var(--nc-secondary) l c h / 0.3);
139
140
  --nc-secondary-contrast: light-dark(#fff, oklch(0.15 0.005 250));
140
141
  --nc-valid: light-dark(oklch(0.52 0.17 145), oklch(0.65 0.2 145));
141
142
  --nc-invalid: light-dark(oklch(0.55 0.22 25), oklch(0.65 0.22 25));
@@ -169,6 +170,10 @@
169
170
  grid-column: 2;
170
171
  min-width: 0;
171
172
  }
173
+ body > [style*="display: contents"] > * {
174
+ grid-column: 2;
175
+ min-width: 0;
176
+ }
172
177
  ::selection {
173
178
  background-color: var(--nc-primary-focus);
174
179
  color: var(--nc-text);
@@ -327,6 +332,18 @@
327
332
  box-shadow: 0 0 0 2px var(--nc-primary-focus);
328
333
  outline: none;
329
334
  }
335
+ :where([type=reset]) {
336
+ background-color: var(--nc-secondary);
337
+ border-color: var(--nc-secondary);
338
+ color: var(--nc-secondary-contrast);
339
+ }
340
+ :where([type=reset]):hover {
341
+ background-color: var(--nc-secondary-hover);
342
+ border-color: var(--nc-secondary-hover);
343
+ }
344
+ :where([type=reset]):focus-visible {
345
+ box-shadow: 0 0 0 2px var(--nc-secondary-focus);
346
+ }
330
347
  :where(button, [type=submit], [type=reset], [type=button], [role=button]).inline {
331
348
  --_btn-padding-v: 0.05em;
332
349
  --_btn-padding-h: 0.4em;
@@ -407,23 +424,31 @@
407
424
  }
408
425
  }
409
426
  @layer nimble.utilities {
410
- .secondary {
427
+ .secondary:not(a:not([role=button])) {
411
428
  background-color: var(--nc-secondary);
412
429
  border-color: var(--nc-secondary);
413
430
  color: var(--nc-secondary-contrast);
414
431
  }
415
- .secondary:hover {
432
+ .secondary:not(a:not([role=button])):hover {
416
433
  background-color: var(--nc-secondary-hover);
417
434
  border-color: var(--nc-secondary-hover);
418
435
  }
419
- .secondary:focus-visible {
436
+ .secondary:not(a:not([role=button])):focus-visible {
420
437
  box-shadow: 0 0 0 2px var(--nc-secondary-focus);
421
438
  }
422
- .outline {
439
+ a:not([role=button]).secondary {
440
+ color: var(--nc-secondary);
441
+ text-decoration-color: color-mix(in oklch, var(--nc-secondary), transparent 50%);
442
+ }
443
+ a:not([role=button]).secondary:hover {
444
+ color: var(--nc-secondary-hover);
445
+ text-decoration-color: var(--nc-secondary-hover);
446
+ }
447
+ .outline:not(a:not([role=button])) {
423
448
  background-color: transparent;
424
449
  color: var(--nc-primary);
425
450
  }
426
- .outline:hover {
451
+ .outline:not(a:not([role=button])):hover {
427
452
  background-color: var(--nc-primary-focus);
428
453
  color: var(--nc-primary-hover);
429
454
  border-color: var(--nc-primary-hover);
@@ -479,6 +504,9 @@
479
504
  :where(label:has(+ input, + select, + textarea)) {
480
505
  font-weight: 600;
481
506
  }
507
+ :where(label:has(+ [type=file], + [type=range])) {
508
+ margin-bottom: 0.5em;
509
+ }
482
510
  :where(fieldset) {
483
511
  border: 1px solid var(--nc-border);
484
512
  border-radius: var(--nc-radius);
@@ -500,14 +528,19 @@
500
528
  display: flex;
501
529
  align-items: center;
502
530
  gap: 0.35em;
503
- margin-bottom: var(--nc-spacing);
531
+ margin-bottom: 0.5em;
532
+ }
533
+ :where(label:has([type=checkbox], [type=radio]):last-child) {
534
+ margin-bottom: 0;
504
535
  }
505
- :where(label:has([type=radio])) {
506
- margin-bottom: 0.35em;
536
+ :where([type=search]) {
537
+ border-radius: 5rem;
538
+ padding-inline: 1.25em;
507
539
  }
508
540
  :where([type=range]) {
509
541
  accent-color: var(--nc-primary);
510
542
  width: 100%;
543
+ margin-bottom: var(--nc-spacing);
511
544
  }
512
545
  :where(input[list]) {
513
546
  width: auto;
@@ -517,6 +550,7 @@
517
550
  font: inherit;
518
551
  cursor: pointer;
519
552
  max-width: 100%;
553
+ margin-bottom: var(--nc-spacing);
520
554
  }
521
555
  :where([type=file])::file-selector-button {
522
556
  padding: 0.5em 1em;
@@ -540,6 +574,7 @@
540
574
  }
541
575
  :where([type=color]) {
542
576
  --_color-size: calc(1em * 1.5 + 1em + 2px);
577
+ margin-bottom: var(--nc-spacing);
543
578
  --_color-pad: 0.25em;
544
579
  height: var(--_color-size);
545
580
  width: calc((var(--_color-size) - 2 * var(--_color-pad)) * 1.618 + 2 * var(--_color-pad));
@@ -557,7 +592,7 @@
557
592
  border-radius: calc(var(--nc-radius) * 0.5);
558
593
  }
559
594
  :where(label:has([type=checkbox][role=switch])) {
560
- display: inline-flex;
595
+ display: flex;
561
596
  align-items: center;
562
597
  gap: 0.5em;
563
598
  }
@@ -658,12 +693,54 @@
658
693
  margin-top: 0.5em;
659
694
  }
660
695
  }
696
+ @layer nimble.base {
697
+ :where(article) {
698
+ background-color: var(--nc-surface-1);
699
+ border: 1px solid var(--nc-border);
700
+ border-radius: var(--nc-radius);
701
+ padding: var(--nc-spacing);
702
+ margin-bottom: var(--nc-spacing);
703
+ }
704
+ :where(article > header),
705
+ :where(article > footer) {
706
+ background-color: color-mix(in oklch, var(--nc-surface-1), var(--nc-surface-2) 20%);
707
+ padding: var(--nc-spacing);
708
+ }
709
+ :where(article > header) {
710
+ margin: calc(var(--nc-spacing) * -1) calc(var(--nc-spacing) * -1) var(--nc-spacing);
711
+ border-bottom: 1px solid var(--nc-border);
712
+ border-radius: var(--nc-radius) var(--nc-radius) 0 0;
713
+ }
714
+ :where(article > footer) {
715
+ margin: var(--nc-spacing) calc(var(--nc-spacing) * -1) calc(var(--nc-spacing) * -1);
716
+ border-top: 1px solid var(--nc-border);
717
+ border-radius: 0 0 var(--nc-radius) var(--nc-radius);
718
+ }
719
+ :where(article) > :last-child:not(footer) {
720
+ margin-bottom: 0;
721
+ }
722
+ :where(article > header, article > footer) > :last-child {
723
+ margin-bottom: 0;
724
+ }
725
+ :where(article > header, article > footer) > h1,
726
+ :where(article > header, article > footer) > h2,
727
+ :where(article > header, article > footer) > h3,
728
+ :where(article > header, article > footer) > h4,
729
+ :where(article > header, article > footer) > h5,
730
+ :where(article > header, article > footer) > h6 {
731
+ margin-top: 0;
732
+ margin-bottom: 0;
733
+ }
734
+ }
661
735
  @layer nimble.base {
662
736
  :where(details) {
663
737
  border: 1px solid var(--nc-border);
664
738
  border-radius: var(--nc-radius);
665
739
  padding: 0 1em;
666
740
  }
741
+ :where(details) {
742
+ margin-bottom: 0.5em;
743
+ }
667
744
  :where(summary) {
668
745
  cursor: pointer;
669
746
  font-weight: 600;
@@ -877,6 +954,9 @@
877
954
  rotate: 180deg;
878
955
  }
879
956
  :where(select)::picker(select) {
957
+ position-area: block-end;
958
+ position-try-order: normal;
959
+ position-try-fallbacks: flip-block;
880
960
  border: 1px solid var(--nc-border);
881
961
  border-radius: var(--nc-radius);
882
962
  background-color: var(--nc-surface-1);
@@ -1 +1 @@
1
- @layer nimble.reset{:where(:not(progress)),:where(),:where(){box-sizing:border-box;background-repeat:no-repeat}:where(html){-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5}:where(body){margin:0}:where(h1){margin-block:.67em;font-size:2em}:where(hr){height:0;color:inherit}:where(nav) :where(ol,ul){padding:0;list-style-type:none}:where(pre){font-family:monospace;font-size:1em}:where(abbr[title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}:where(b,strong){font-weight:bolder}:where(code,kbd,samp){font-family:monospace;font-size:1em}:where(small){font-size:80%}:where(sub,sup){vertical-align:baseline;font-size:75%;line-height:0;position:relative}:where(sub){bottom:-.25em}:where(sup){top:-.5em}:where(iframe){border-style:none}:where(table){border-collapse:collapse;text-indent:0;border-color:currentColor}:where(button,input,select,textarea){font:inherit;letter-spacing:inherit}:where(button,[type=button],[type=reset],[type=submit]){-webkit-appearance:button}:where(fieldset){border:1px solid #a0a0a0}:where(progress){vertical-align:baseline}:where(textarea){resize:vertical;overflow:auto}:where([type=search]){-webkit-appearance:textfield;outline-offset:-2px}:where(){-webkit-appearance:none}:where(),:where(){height:auto}:where(){-webkit-appearance:button;font:inherit}:where(summary){display:list-item}:where(a,area,button,input,label,select,summary,textarea,[tabindex]){touch-action:manipulation;-webkit-tap-highlight-color:transparent}:where([aria-busy=true]){cursor:progress}:where([aria-disabled=true],[disabled]){cursor:not-allowed}@media (prefers-reduced-motion:reduce){:where(*),:where(),:where(){scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}}@layer nimble.base{:root{color-scheme:light dark;--nc-surface-1:light-dark(oklch(98.5% .002 250),oklch(17% .005 260));--nc-surface-2:light-dark(oklch(95.5% .002 250),oklch(20% .005 260));--nc-surface-3:light-dark(oklch(92.5% .002 250),oklch(23% .005 260));--nc-surface-4:light-dark(oklch(88.5% .002 250),oklch(27% .005 260));--nc-text:light-dark(oklch(28% .005 250),oklch(86% .005 250));--nc-border:light-dark(oklch(83% .005 250),oklch(28% .005 260));--nc-primary:light-dark(oklch(50% .2 250),oklch(60% .2 250));--nc-primary-hover:light-dark(oklch(40% .2 250),oklch(70% .2 250));--nc-primary-focus:oklch(50% .2 250/.4);--nc-primary-contrast:light-dark(#fff,oklch(15% .005 250));--nc-secondary:light-dark(oklch(45% .05 250),oklch(60% .05 250));--nc-secondary-hover:light-dark(oklch(35% .05 250),oklch(70% .05 250));--nc-secondary-focus:oklch(45% .05 250/.3);--nc-secondary-contrast:light-dark(#fff,oklch(15% .005 250));--nc-valid:light-dark(oklch(52% .17 145),oklch(65% .2 145));--nc-invalid:light-dark(oklch(55% .22 25),oklch(65% .22 25));--nc-font-sans:system-ui, sans-serif;--nc-font-mono:ui-monospace, Cascadia Code, Source Code Pro, Menlo, Consolas, DejaVu Sans Mono, monospace;--nc-spacing:1rem;--nc-radius:.25rem;--nc-content-width:720px}[data-theme=dark]{color-scheme:dark}[data-theme=light]{color-scheme:light}html{font-family:var(--nc-font-sans);color:var(--nc-text);background-color:var(--nc-surface-1);font-size:100%;line-height:1.5}body{grid-template-columns:1fr min(var(--nc-content-width), calc(100% - 2 * var(--nc-spacing))) 1fr;min-height:100dvh;display:grid}body>*{grid-column:2;min-width:0}::selection{background-color:var(--nc-primary-focus);color:var(--nc-text)}h1{margin-top:0;margin-bottom:var(--nc-spacing);text-wrap:balance;font-size:2rem;font-weight:700;line-height:1.1}h2{margin-top:2rem;margin-bottom:var(--nc-spacing);text-wrap:balance;font-size:1.75rem;font-weight:700;line-height:1.15}h3{margin-top:1.5rem;margin-bottom:var(--nc-spacing);text-wrap:balance;font-size:1.5rem;font-weight:700;line-height:1.2}h4{margin-top:1.5rem;margin-bottom:var(--nc-spacing);text-wrap:balance;font-size:1.25rem;font-weight:700;line-height:1.3}h5{margin-top:1.5rem;margin-bottom:var(--nc-spacing);text-wrap:balance;font-size:1.125rem;font-weight:700;line-height:1.4}h6{margin-top:1.5rem;margin-bottom:var(--nc-spacing);text-wrap:balance;font-size:1rem;font-weight:700;line-height:1.5}@media (width<=720px){h1{font-size:1.75rem}h2{font-size:1.5rem}h3{font-size:1.3rem}}p,ul,ol,dl,blockquote,pre,table,figure,form,fieldset{margin-top:0;margin-bottom:var(--nc-spacing)}ul,ol{padding-inline-start:1.5em}li{margin-bottom:.25em}:where(li)>:where(ul,ol){margin-bottom:0}dt{font-weight:600}dd{margin-inline-start:1.5em;margin-bottom:.5em}blockquote{margin-block:var(--nc-spacing);padding:.25em var(--nc-spacing);border-inline-start:.25rem solid var(--nc-border);margin-inline:0;font-style:italic}:where(blockquote) footer,:where(blockquote) cite{color:color-mix(in oklch, var(--nc-text), transparent 40%);font-size:.9em;font-style:normal}hr{background-color:color-mix(in oklch, var(--nc-border), transparent 40%);height:1px;margin:calc(var(--nc-spacing) * 2) 0;border:none}mark{color:light-dark(inherit,oklch(95% .01 85));background-color:light-dark(#fde68a,oklch(55% .12 85));border-radius:2px;padding:.1em .25em}address{font-style:normal}:where(a:not([role=button])){color:var(--nc-primary);text-underline-offset:.15em;text-decoration:underline;-webkit-text-decoration-color:color-mix(in oklch, var(--nc-primary), transparent 50%);text-decoration-color:color-mix(in oklch, var(--nc-primary), transparent 50%);transition:color .2s,text-decoration-color .2s}:where(a:not([role=button])):visited{color:color-mix(in oklch, var(--nc-primary) 40%, oklch(38% .15 310));-webkit-text-decoration-color:color-mix(in oklch, var(--nc-primary) 40%, oklch(38% .15 310) 30%);text-decoration-color:color-mix(in oklch, var(--nc-primary) 40%, oklch(38% .15 310) 30%)}:where(a:not([role=button])):hover{color:var(--nc-primary-hover);-webkit-text-decoration-color:var(--nc-primary-hover);text-decoration-color:var(--nc-primary-hover)}:where(button,[type=submit],[type=reset],[type=button],[role=button]){--_btn-padding-v:.5em;--_btn-padding-h:1em;padding:var(--_btn-padding-v) var(--_btn-padding-h);background-color:var(--nc-primary);color:var(--nc-primary-contrast);border:1px solid var(--nc-primary);border-radius:var(--nc-radius);font:inherit;cursor:pointer;text-align:center;margin:0 .25em .25em 0;font-size:1rem;line-height:1.5;text-decoration:none;transition:background-color .2s,border-color .2s;display:inline-block}:where(button,[type=submit],[type=reset],[type=button],[role=button]):hover{background-color:var(--nc-primary-hover);border-color:var(--nc-primary-hover)}:where(button,[type=submit],[type=reset],[type=button],[role=button]):focus-visible{box-shadow:0 0 0 2px var(--nc-primary-focus);outline:none}:where(button,[type=submit],[type=reset],[type=button],[role=button]).inline{--_btn-padding-v:.05em;--_btn-padding-h:.4em;vertical-align:baseline;margin:.1em .15em;font-size:.875em}:where(button,[type=submit],[type=reset],[type=button],[role=button]):disabled{opacity:.5;cursor:not-allowed;pointer-events:none}:where([role=group]){margin-bottom:var(--nc-spacing);display:inline-flex}[role=group]>*{border-radius:0;margin:0;position:relative}[role=group]>*+*{--_divider:""}[role=group]>*+:before{content:var(--_divider);inset-inline-start:0;pointer-events:none;background:#ffffff4d;width:1px;position:absolute;top:20%;bottom:20%}[role=group]>:not(.secondary):not(.outline)+.secondary,[role=group]>.secondary+:not(.secondary):not(.outline),[role=group]>:not(.secondary):not(.outline)+.outline,[role=group]>.outline+:not(.secondary):not(.outline),[role=group]>.secondary+.outline,[role=group]>.outline+.secondary,[role=group]>input+*,[role=group]>select+*{--_divider:none}[role=group]>:first-child{border-start-start-radius:var(--nc-radius);border-end-start-radius:var(--nc-radius)}[role=group]>:last-child{border-start-end-radius:var(--nc-radius);border-end-end-radius:var(--nc-radius)}[role=group]:has(.outline):not(:has(>:not(.outline))){border:1px solid var(--nc-primary);border-radius:var(--nc-radius)}[role=group]:has(.outline):not(:has(>:not(.outline)))>.outline{border:none}[role=group]>.outline+.outline:before{background:var(--nc-primary)}[role=search] [role=group]>:first-child{border-start-start-radius:5rem;border-end-start-radius:5rem;padding-inline-start:1.25em}[role=search] [role=group]>:last-child{border-start-end-radius:5rem;border-end-end-radius:5rem;padding-inline-end:1.25em}:where(input:not([type=checkbox],[type=radio],[type=range],[type=file],[type=color],[type=submit],[type=button],[type=reset]),select,textarea){--_input-bg:color-mix(in oklch, var(--nc-surface-1), var(--nc-surface-2) 20%);background-color:var(--_input-bg);border:1px solid var(--nc-border);border-radius:var(--nc-radius);min-height:calc(2.5em + 2px);color:var(--nc-text);font:inherit;padding:.5em .75em;font-size:1rem;transition:border-color .2s,box-shadow .2s}:where(input:not([type=checkbox],[type=radio],[type=range],[type=file],[type=color],[type=submit],[type=button],[type=reset],[type=date],[type=month],[type=week],[type=time],[type=datetime-local]),select,textarea){width:100%;margin-bottom:var(--nc-spacing)}:where(input,select,textarea):focus-visible{border-color:var(--nc-primary);box-shadow:0 0 0 2px var(--nc-primary-focus);outline:none}:where(input,select,textarea)+:where(small){margin-top:calc(var(--nc-spacing) * -.75);margin-bottom:var(--nc-spacing);color:color-mix(in oklch, var(--nc-text), transparent 40%);font-size:.875em;display:block}:where(input,select,textarea)[aria-invalid=false]{border-color:var(--nc-valid)}:where(input,select,textarea)[aria-invalid=true]{border-color:var(--nc-invalid)}:where(input,select,textarea)[aria-invalid=false]+:where(small){color:var(--nc-valid)}:where(input,select,textarea)[aria-invalid=true]+:where(small){color:var(--nc-invalid)}:where(label){margin-bottom:.25em;display:block}:where(label:has(+input,+select,+textarea)){font-weight:600}:where(fieldset){border:1px solid var(--nc-border);border-radius:var(--nc-radius);padding:var(--nc-spacing);min-width:0;max-width:100%}:where(legend){padding-inline:.25em;font-weight:600}:where([type=checkbox],[type=radio]){accent-color:var(--nc-primary);width:1.125em;height:1.125em;margin:0}:where(label:has([type=checkbox],[type=radio])){margin-bottom:var(--nc-spacing);align-items:center;gap:.35em;display:flex}:where(label:has([type=radio])){margin-bottom:.35em}:where([type=range]){accent-color:var(--nc-primary);width:100%}:where(input[list]){width:auto}:where([type=file]){color:var(--nc-text);font:inherit;cursor:pointer;max-width:100%}:where([type=file])::file-selector-button{margin-right:.75em;background-color:var(--nc-primary);color:var(--nc-primary-contrast);border:1px solid var(--nc-primary);border-radius:var(--nc-radius);font:inherit;cursor:pointer;margin-inline-end:.75em;padding:.5em 1em;transition:background-color .2s,border-color .2s}:where([type=file])::file-selector-button:hover{background-color:var(--nc-primary-hover);border-color:var(--nc-primary-hover)}:where([type=date],[type=month],[type=week],[type=time],[type=datetime-local]){min-width:10em;margin-bottom:var(--nc-spacing)}:where([type=color]){--_color-size:calc(1em * 1.5 + 1em + 2px);--_color-pad:.25em;height:var(--_color-size);width:calc((var(--_color-size) - 2 * var(--_color-pad)) * 1.618 + 2 * var(--_color-pad));padding:var(--_color-pad);background-color:color-mix(in oklch, var(--nc-surface-1), var(--nc-surface-2) 20%);border:1px solid var(--nc-border);border-radius:var(--nc-radius);cursor:pointer}:where([type=color])::-webkit-color-swatch-wrapper{padding:0}:where([type=color])::-webkit-color-swatch{border-radius:calc(var(--nc-radius) * .5);border:none}:where(label:has([type=checkbox][role=switch])){align-items:center;gap:.5em;display:inline-flex}:where([type=checkbox][role=switch]){appearance:none;background-color:var(--nc-border);cursor:pointer;border-radius:1em;flex-shrink:0;width:2.5em;height:1.25em;margin:0;transition:background-color .2s;position:relative}:where([type=checkbox][role=switch]):before{content:"";background-color:#fff;border-radius:50%;width:calc(1.25em - 4px);height:calc(1.25em - 4px);transition:transform .2s;position:absolute;top:2px;left:2px}:where([type=checkbox][role=switch]):checked{background-color:var(--nc-primary)}:where([type=checkbox][role=switch]):checked:before{transform:translate(1.25em)}:where(table){border-collapse:collapse;width:100%}:where(th,td){border-bottom:1px solid color-mix(in oklch, var(--nc-border), transparent 40%);text-align:start;padding:.5em .75em}:where(thead th,thead td){background-color:var(--nc-surface-2);text-wrap:balance;border-bottom-width:2px;font-weight:600}:where(figure:has(table)){overflow-x:auto}:where(code,kbd,samp){font-family:var(--nc-font-mono);background-color:var(--nc-surface-2);border-radius:var(--nc-radius);padding:.15em .35em;font-size:.875em}:where(pre){background-color:var(--nc-surface-2);border-radius:var(--nc-radius);padding:var(--nc-spacing);overflow-x:auto}:where(pre code){font-size:inherit;background:0 0;padding:0}:where(kbd){border:1px solid var(--nc-border);border-bottom-width:2px}:where(img,video,canvas,svg){max-width:100%;height:auto}:where(figure){margin:0}:where(figcaption){color:color-mix(in oklch, var(--nc-text), transparent 40%);margin-top:.5em;font-size:.9em}:where(details){border:1px solid var(--nc-border);border-radius:var(--nc-radius);padding:0 1em}:where(summary){cursor:pointer;margin:0 -1em;padding:.75em 1em;font-weight:600;list-style-type:"▶ "}:where(details[open]>summary){list-style-type:"▼ "}:where(details[open]){padding-bottom:.75em}details :last-child{margin-bottom:0}:where(dialog){background-color:var(--nc-surface-4);border:1px solid var(--nc-border);border-radius:var(--nc-radius);max-width:min(90vw,40rem);padding:var(--nc-spacing)}dialog::backdrop{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);background:#00000080;animation:.2s nc-backdrop-in}@keyframes nc-backdrop-in{0%{opacity:0}}:where(progress){appearance:none;border-radius:var(--nc-radius);background-color:var(--nc-surface-3);width:100%;height:.5rem;color:var(--nc-primary);border:0;position:relative;overflow:hidden}:where(progress)::-webkit-progress-bar{border-radius:var(--nc-radius);background-color:var(--nc-surface-3)}:where(progress)::-webkit-progress-value{background-color:var(--nc-primary);border-radius:var(--nc-radius);transition:inline-size .3s}:where(progress)::-moz-progress-bar{background-color:var(--nc-primary);border-radius:var(--nc-radius)}:where(progress):not([value]){--nc-progress-track:linear-gradient(to right, var(--nc-surface-3) 0%, var(--nc-primary) 25%, var(--nc-primary) 25%, var(--nc-surface-3) 50%, var(--nc-surface-3) 50%, var(--nc-primary) 75%, var(--nc-primary) 75%, var(--nc-surface-3) 100%);--nc-progress-track-size:200% 100%}@media (prefers-reduced-motion:no-preference){@supports selector(progress::after){:where(progress):not([value]):after{content:"";background:var(--nc-progress-track);background-size:var(--nc-progress-track-size);animation:12s linear infinite nc-progress-indeterminate;position:absolute;inset:0}}:where(progress):not([value])::-webkit-progress-bar{background:var(--nc-progress-track);background-size:var(--nc-progress-track-size);animation:12s linear infinite nc-progress-indeterminate}:where(progress):not([value])::-moz-progress-bar{background:var(--nc-progress-track);background-size:var(--nc-progress-track-size);animation:12s linear infinite nc-progress-indeterminate}}@keyframes nc-progress-indeterminate{0%{background-position:0 0}to{background-position:-200% 0}}:where(meter){appearance:none;border-radius:var(--nc-radius);background-color:var(--nc-surface-3);border:0;width:100%;height:.5rem;overflow:hidden}:where(meter)::-webkit-meter-bar{border-radius:var(--nc-radius);background-color:var(--nc-surface-3);border:0;height:.5rem}:where(meter)::-webkit-meter-optimum-value{background-color:var(--nc-valid);border-radius:var(--nc-radius)}:where(meter)::-webkit-meter-suboptimum-value{background-color:var(--nc-primary);border-radius:var(--nc-radius)}:where(meter)::-webkit-meter-even-less-good-value{background-color:var(--nc-invalid);border-radius:var(--nc-radius)}:where(meter)::-moz-meter-bar{background-color:var(--nc-primary);border-radius:var(--nc-radius)}:where(meter):-moz-meter-optimum::-moz-meter-bar{background-color:var(--nc-valid)}:where(meter):-moz-meter-sub-optimum::-moz-meter-bar{background-color:var(--nc-primary)}:where(meter):-moz-meter-sub-sub-optimum::-moz-meter-bar{background-color:var(--nc-invalid)}@supports (appearance:base-select){:where(select){appearance:base-select}:where(select)::picker(select){appearance:base-select}:where(select)::picker-icon{content:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='10' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2 2l6 6 6-6'/%3E%3C/svg%3E");transition:rotate .4s}:where(select):open::picker-icon{rotate:180deg}:where(select)::picker(select){border:1px solid var(--nc-border);border-radius:var(--nc-radius);background-color:var(--nc-surface-1);opacity:0;transition:opacity .2s, overlay .2s allow-discrete, display .2s allow-discrete;padding:.25em}:where(select):open::picker(select){opacity:1}@starting-style{:where(select):open::picker(select){opacity:0}}:where(select) option{border-radius:var(--nc-radius);padding:.5em .75em;transition:background-color .15s}:where(select) option:hover{background-color:var(--nc-surface-2)}:where(select) option:checked{font-weight:600}}}@layer nimble.utilities{.secondary{background-color:var(--nc-secondary);border-color:var(--nc-secondary);color:var(--nc-secondary-contrast)}.secondary:hover{background-color:var(--nc-secondary-hover);border-color:var(--nc-secondary-hover)}.secondary:focus-visible{box-shadow:0 0 0 2px var(--nc-secondary-focus)}.outline{color:var(--nc-primary);background-color:#0000}.outline:hover{background-color:var(--nc-primary-focus);color:var(--nc-primary-hover);border-color:var(--nc-primary-hover)}.container{max-width:var(--nc-content-width);padding-inline:var(--nc-spacing);margin-inline:auto}.fluid{max-width:none;padding-inline:var(--nc-spacing);display:block}.full-bleed{grid-column:1/-1}.wide{width:100%;max-width:1200px;padding-inline:var(--nc-spacing);grid-column:1/-1;margin-inline:auto}.striped :where(tbody tr:nth-child(2n)){background-color:var(--nc-surface-2)}.visually-hidden{clip-path:inset(50%);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.overflow-auto{overflow:auto}}[type=date],[type=month],[type=week],[type=time],[type=datetime-local]{appearance:none}@supports selector(details::details-content){details::details-content{transition:opacity .3s ease, content-visibility .3s ease allow-discrete;opacity:0}details[open]::details-content{opacity:1}@supports (interpolate-size:allow-keywords){details{interpolate-size:allow-keywords}details::details-content{transition:height .3s ease, opacity .3s ease, content-visibility .3s ease allow-discrete;height:0;overflow:clip}details[open]::details-content{height:auto}}}@media print{body{color:#000;background:#fff}a[href]:after{content:" (" attr(href) ")";color:#555;font-size:.85em}a[href^=\#]:after,a[href^=javascript\:]:after{content:none}pre,blockquote{page-break-inside:avoid}h2,h3,h4{page-break-after:avoid}img{max-width:100%!important}@page{margin:2cm}}
1
+ @layer nimble.reset{:where(:not(progress)),:where(),:where(){box-sizing:border-box;background-repeat:no-repeat}:where(html){-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5}:where(body){margin:0}:where(h1){margin-block:.67em;font-size:2em}:where(hr){height:0;color:inherit}:where(nav) :where(ol,ul){padding:0;list-style-type:none}:where(pre){font-family:monospace;font-size:1em}:where(abbr[title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}:where(b,strong){font-weight:bolder}:where(code,kbd,samp){font-family:monospace;font-size:1em}:where(small){font-size:80%}:where(sub,sup){vertical-align:baseline;font-size:75%;line-height:0;position:relative}:where(sub){bottom:-.25em}:where(sup){top:-.5em}:where(iframe){border-style:none}:where(table){border-collapse:collapse;text-indent:0;border-color:currentColor}:where(button,input,select,textarea){font:inherit;letter-spacing:inherit}:where(button,[type=button],[type=reset],[type=submit]){-webkit-appearance:button}:where(fieldset){border:1px solid #a0a0a0}:where(progress){vertical-align:baseline}:where(textarea){resize:vertical;overflow:auto}:where([type=search]){-webkit-appearance:textfield;outline-offset:-2px}:where(){-webkit-appearance:none}:where(),:where(){height:auto}:where(){-webkit-appearance:button;font:inherit}:where(summary){display:list-item}:where(a,area,button,input,label,select,summary,textarea,[tabindex]){touch-action:manipulation;-webkit-tap-highlight-color:transparent}:where([aria-busy=true]){cursor:progress}:where([aria-disabled=true],[disabled]){cursor:not-allowed}@media (prefers-reduced-motion:reduce){:where(*),:where(),:where(){scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}}@layer nimble.base{:root{color-scheme:light dark;--nc-surface-hue:250;--nc-surface-1:light-dark(oklch(.985 .002 var(--nc-surface-hue)),oklch(.17 .005 calc(var(--nc-surface-hue) + 10)));--nc-surface-2:light-dark(oklch(.955 .002 var(--nc-surface-hue)),oklch(.2 .005 calc(var(--nc-surface-hue) + 10)));--nc-surface-3:light-dark(oklch(.925 .002 var(--nc-surface-hue)),oklch(.23 .005 calc(var(--nc-surface-hue) + 10)));--nc-surface-4:light-dark(oklch(.885 .002 var(--nc-surface-hue)),oklch(.27 .005 calc(var(--nc-surface-hue) + 10)));--nc-text:light-dark(oklch(.28 .005 var(--nc-surface-hue)),oklch(.86 .005 var(--nc-surface-hue)));--nc-border:light-dark(oklch(.83 .005 var(--nc-surface-hue)),oklch(.28 .005 calc(var(--nc-surface-hue) + 10)));--nc-primary:light-dark(oklch(50% .2 250),oklch(60% .2 250));--nc-primary-hover:light-dark(oklch(from var(--nc-primary) calc(l - .1) c h),oklch(from var(--nc-primary) calc(l + .1) c h));--nc-primary-focus:oklch(from var(--nc-primary) l c h / .4);--nc-primary-contrast:light-dark(#fff,oklch(15% .005 250));--nc-secondary:light-dark(oklch(45% .05 250),oklch(60% .05 250));--nc-secondary-hover:light-dark(oklch(from var(--nc-secondary) calc(l - .1) c h),oklch(from var(--nc-secondary) calc(l + .1) c h));--nc-secondary-focus:oklch(from var(--nc-secondary) l c h / .3);--nc-secondary-contrast:light-dark(#fff,oklch(15% .005 250));--nc-valid:light-dark(oklch(52% .17 145),oklch(65% .2 145));--nc-invalid:light-dark(oklch(55% .22 25),oklch(65% .22 25));--nc-font-sans:system-ui, sans-serif;--nc-font-mono:ui-monospace, Cascadia Code, Source Code Pro, Menlo, Consolas, DejaVu Sans Mono, monospace;--nc-spacing:1rem;--nc-radius:.25rem;--nc-content-width:720px}[data-theme=dark]{color-scheme:dark}[data-theme=light]{color-scheme:light}html{font-family:var(--nc-font-sans);color:var(--nc-text);background-color:var(--nc-surface-1);font-size:100%;line-height:1.5}body{grid-template-columns:1fr min(var(--nc-content-width), calc(100% - 2 * var(--nc-spacing))) 1fr;min-height:100dvh;display:grid}body>*,body>[style*="display: contents"]>*{grid-column:2;min-width:0}::selection{background-color:var(--nc-primary-focus);color:var(--nc-text)}h1{margin-top:0;margin-bottom:var(--nc-spacing);text-wrap:balance;font-size:2rem;font-weight:700;line-height:1.1}h2{margin-top:2rem;margin-bottom:var(--nc-spacing);text-wrap:balance;font-size:1.75rem;font-weight:700;line-height:1.15}h3{margin-top:1.5rem;margin-bottom:var(--nc-spacing);text-wrap:balance;font-size:1.5rem;font-weight:700;line-height:1.2}h4{margin-top:1.5rem;margin-bottom:var(--nc-spacing);text-wrap:balance;font-size:1.25rem;font-weight:700;line-height:1.3}h5{margin-top:1.5rem;margin-bottom:var(--nc-spacing);text-wrap:balance;font-size:1.125rem;font-weight:700;line-height:1.4}h6{margin-top:1.5rem;margin-bottom:var(--nc-spacing);text-wrap:balance;font-size:1rem;font-weight:700;line-height:1.5}@media (width<=720px){h1{font-size:1.75rem}h2{font-size:1.5rem}h3{font-size:1.3rem}}p,ul,ol,dl,blockquote,pre,table,figure,form,fieldset{margin-top:0;margin-bottom:var(--nc-spacing)}ul,ol{padding-inline-start:1.5em}li{margin-bottom:.25em}:where(li)>:where(ul,ol){margin-bottom:0}dt{font-weight:600}dd{margin-inline-start:1.5em;margin-bottom:.5em}blockquote{margin-block:var(--nc-spacing);padding:.25em var(--nc-spacing);border-inline-start:.25rem solid var(--nc-border);margin-inline:0;font-style:italic}:where(blockquote) footer,:where(blockquote) cite{color:color-mix(in oklch, var(--nc-text), transparent 40%);font-size:.9em;font-style:normal}hr{background-color:color-mix(in oklch, var(--nc-border), transparent 40%);height:1px;margin:calc(var(--nc-spacing) * 2) 0;border:none}mark{color:light-dark(inherit,oklch(95% .01 85));background-color:light-dark(#fde68a,oklch(55% .12 85));border-radius:2px;padding:.1em .25em}address{font-style:normal}:where(a:not([role=button])){color:var(--nc-primary);text-underline-offset:.15em;text-decoration:underline;-webkit-text-decoration-color:color-mix(in oklch, var(--nc-primary), transparent 50%);text-decoration-color:color-mix(in oklch, var(--nc-primary), transparent 50%);transition:color .2s,text-decoration-color .2s}:where(a:not([role=button])):visited{color:color-mix(in oklch, var(--nc-primary) 40%, oklch(38% .15 310));-webkit-text-decoration-color:color-mix(in oklch, var(--nc-primary) 40%, oklch(38% .15 310) 30%);text-decoration-color:color-mix(in oklch, var(--nc-primary) 40%, oklch(38% .15 310) 30%)}:where(a:not([role=button])):hover{color:var(--nc-primary-hover);-webkit-text-decoration-color:var(--nc-primary-hover);text-decoration-color:var(--nc-primary-hover)}:where(button,[type=submit],[type=reset],[type=button],[role=button]){--_btn-padding-v:.5em;--_btn-padding-h:1em;padding:var(--_btn-padding-v) var(--_btn-padding-h);background-color:var(--nc-primary);color:var(--nc-primary-contrast);border:1px solid var(--nc-primary);border-radius:var(--nc-radius);font:inherit;cursor:pointer;text-align:center;margin:0 .25em .25em 0;font-size:1rem;line-height:1.5;text-decoration:none;transition:background-color .2s,border-color .2s;display:inline-block}:where(button,[type=submit],[type=reset],[type=button],[role=button]):hover{background-color:var(--nc-primary-hover);border-color:var(--nc-primary-hover)}:where(button,[type=submit],[type=reset],[type=button],[role=button]):focus-visible{box-shadow:0 0 0 2px var(--nc-primary-focus);outline:none}:where([type=reset]){background-color:var(--nc-secondary);border-color:var(--nc-secondary);color:var(--nc-secondary-contrast)}:where([type=reset]):hover{background-color:var(--nc-secondary-hover);border-color:var(--nc-secondary-hover)}:where([type=reset]):focus-visible{box-shadow:0 0 0 2px var(--nc-secondary-focus)}:where(button,[type=submit],[type=reset],[type=button],[role=button]).inline{--_btn-padding-v:.05em;--_btn-padding-h:.4em;vertical-align:baseline;margin:.1em .15em;font-size:.875em}:where(button,[type=submit],[type=reset],[type=button],[role=button]):disabled{opacity:.5;cursor:not-allowed;pointer-events:none}:where([role=group]){margin-bottom:var(--nc-spacing);display:inline-flex}[role=group]>*{border-radius:0;margin:0;position:relative}[role=group]>*+*{--_divider:""}[role=group]>*+:before{content:var(--_divider);inset-inline-start:0;pointer-events:none;background:#ffffff4d;width:1px;position:absolute;top:20%;bottom:20%}[role=group]>:not(.secondary):not(.outline)+.secondary,[role=group]>.secondary+:not(.secondary):not(.outline),[role=group]>:not(.secondary):not(.outline)+.outline,[role=group]>.outline+:not(.secondary):not(.outline),[role=group]>.secondary+.outline,[role=group]>.outline+.secondary,[role=group]>input+*,[role=group]>select+*{--_divider:none}[role=group]>:first-child{border-start-start-radius:var(--nc-radius);border-end-start-radius:var(--nc-radius)}[role=group]>:last-child{border-start-end-radius:var(--nc-radius);border-end-end-radius:var(--nc-radius)}[role=group]:has(.outline):not(:has(>:not(.outline))){border:1px solid var(--nc-primary);border-radius:var(--nc-radius)}[role=group]:has(.outline):not(:has(>:not(.outline)))>.outline{border:none}[role=group]>.outline+.outline:before{background:var(--nc-primary)}[role=search] [role=group]>:first-child{border-start-start-radius:5rem;border-end-start-radius:5rem;padding-inline-start:1.25em}[role=search] [role=group]>:last-child{border-start-end-radius:5rem;border-end-end-radius:5rem;padding-inline-end:1.25em}:where(input:not([type=checkbox],[type=radio],[type=range],[type=file],[type=color],[type=submit],[type=button],[type=reset]),select,textarea){--_input-bg:color-mix(in oklch, var(--nc-surface-1), var(--nc-surface-2) 20%);background-color:var(--_input-bg);border:1px solid var(--nc-border);border-radius:var(--nc-radius);min-height:calc(2.5em + 2px);color:var(--nc-text);font:inherit;padding:.5em .75em;font-size:1rem;transition:border-color .2s,box-shadow .2s}:where(input:not([type=checkbox],[type=radio],[type=range],[type=file],[type=color],[type=submit],[type=button],[type=reset],[type=date],[type=month],[type=week],[type=time],[type=datetime-local]),select,textarea){width:100%;margin-bottom:var(--nc-spacing)}:where(input,select,textarea):focus-visible{border-color:var(--nc-primary);box-shadow:0 0 0 2px var(--nc-primary-focus);outline:none}:where(input,select,textarea)+:where(small){margin-top:calc(var(--nc-spacing) * -.75);margin-bottom:var(--nc-spacing);color:color-mix(in oklch, var(--nc-text), transparent 40%);font-size:.875em;display:block}:where(input,select,textarea)[aria-invalid=false]{border-color:var(--nc-valid)}:where(input,select,textarea)[aria-invalid=true]{border-color:var(--nc-invalid)}:where(input,select,textarea)[aria-invalid=false]+:where(small){color:var(--nc-valid)}:where(input,select,textarea)[aria-invalid=true]+:where(small){color:var(--nc-invalid)}:where(label){margin-bottom:.25em;display:block}:where(label:has(+input,+select,+textarea)){font-weight:600}:where(label:has(+[type=file],+[type=range])){margin-bottom:.5em}:where(fieldset){border:1px solid var(--nc-border);border-radius:var(--nc-radius);padding:var(--nc-spacing);min-width:0;max-width:100%}:where(legend){padding-inline:.25em;font-weight:600}:where([type=checkbox],[type=radio]){accent-color:var(--nc-primary);width:1.125em;height:1.125em;margin:0}:where(label:has([type=checkbox],[type=radio])){align-items:center;gap:.35em;margin-bottom:.5em;display:flex}:where(label:has([type=checkbox],[type=radio]):last-child){margin-bottom:0}:where([type=search]){border-radius:5rem;padding-inline:1.25em}:where([type=range]){accent-color:var(--nc-primary);width:100%;margin-bottom:var(--nc-spacing)}:where(input[list]){width:auto}:where([type=file]){color:var(--nc-text);font:inherit;cursor:pointer;max-width:100%;margin-bottom:var(--nc-spacing)}:where([type=file])::file-selector-button{margin-right:.75em;background-color:var(--nc-primary);color:var(--nc-primary-contrast);border:1px solid var(--nc-primary);border-radius:var(--nc-radius);font:inherit;cursor:pointer;margin-inline-end:.75em;padding:.5em 1em;transition:background-color .2s,border-color .2s}:where([type=file])::file-selector-button:hover{background-color:var(--nc-primary-hover);border-color:var(--nc-primary-hover)}:where([type=date],[type=month],[type=week],[type=time],[type=datetime-local]){min-width:10em;margin-bottom:var(--nc-spacing)}:where([type=color]){--_color-size:calc(1em * 1.5 + 1em + 2px);margin-bottom:var(--nc-spacing);--_color-pad:.25em;height:var(--_color-size);width:calc((var(--_color-size) - 2 * var(--_color-pad)) * 1.618 + 2 * var(--_color-pad));padding:var(--_color-pad);background-color:color-mix(in oklch, var(--nc-surface-1), var(--nc-surface-2) 20%);border:1px solid var(--nc-border);border-radius:var(--nc-radius);cursor:pointer}:where([type=color])::-webkit-color-swatch-wrapper{padding:0}:where([type=color])::-webkit-color-swatch{border-radius:calc(var(--nc-radius) * .5);border:none}:where(label:has([type=checkbox][role=switch])){align-items:center;gap:.5em;display:flex}:where([type=checkbox][role=switch]){appearance:none;background-color:var(--nc-border);cursor:pointer;border-radius:1em;flex-shrink:0;width:2.5em;height:1.25em;margin:0;transition:background-color .2s;position:relative}:where([type=checkbox][role=switch]):before{content:"";background-color:#fff;border-radius:50%;width:calc(1.25em - 4px);height:calc(1.25em - 4px);transition:transform .2s;position:absolute;top:2px;left:2px}:where([type=checkbox][role=switch]):checked{background-color:var(--nc-primary)}:where([type=checkbox][role=switch]):checked:before{transform:translate(1.25em)}:where(table){border-collapse:collapse;width:100%}:where(th,td){border-bottom:1px solid color-mix(in oklch, var(--nc-border), transparent 40%);text-align:start;padding:.5em .75em}:where(thead th,thead td){background-color:var(--nc-surface-2);text-wrap:balance;border-bottom-width:2px;font-weight:600}:where(figure:has(table)){overflow-x:auto}:where(code,kbd,samp){font-family:var(--nc-font-mono);background-color:var(--nc-surface-2);border-radius:var(--nc-radius);padding:.15em .35em;font-size:.875em}:where(pre){background-color:var(--nc-surface-2);border-radius:var(--nc-radius);padding:var(--nc-spacing);overflow-x:auto}:where(pre code){font-size:inherit;background:0 0;padding:0}:where(kbd){border:1px solid var(--nc-border);border-bottom-width:2px}:where(img,video,canvas,svg){max-width:100%;height:auto}:where(figure){margin:0}:where(figcaption){color:color-mix(in oklch, var(--nc-text), transparent 40%);margin-top:.5em;font-size:.9em}:where(article){background-color:var(--nc-surface-1);border:1px solid var(--nc-border);border-radius:var(--nc-radius);padding:var(--nc-spacing);margin-bottom:var(--nc-spacing)}:where(article>header),:where(article>footer){background-color:color-mix(in oklch, var(--nc-surface-1), var(--nc-surface-2) 20%);padding:var(--nc-spacing)}:where(article>header){margin:calc(var(--nc-spacing) * -1) calc(var(--nc-spacing) * -1) var(--nc-spacing);border-bottom:1px solid var(--nc-border);border-radius:var(--nc-radius) var(--nc-radius) 0 0}:where(article>footer){margin:var(--nc-spacing) calc(var(--nc-spacing) * -1) calc(var(--nc-spacing) * -1);border-top:1px solid var(--nc-border);border-radius:0 0 var(--nc-radius) var(--nc-radius)}:where(article)>:last-child:not(footer),:where(article>header,article>footer)>:last-child{margin-bottom:0}:where(article>header,article>footer)>h1,:where(article>header,article>footer)>h2,:where(article>header,article>footer)>h3,:where(article>header,article>footer)>h4,:where(article>header,article>footer)>h5,:where(article>header,article>footer)>h6{margin-top:0;margin-bottom:0}:where(details){border:1px solid var(--nc-border);border-radius:var(--nc-radius);margin-bottom:.5em;padding:0 1em}:where(summary){cursor:pointer;margin:0 -1em;padding:.75em 1em;font-weight:600;list-style-type:"▶ "}:where(details[open]>summary){list-style-type:"▼ "}:where(details[open]){padding-bottom:.75em}details :last-child{margin-bottom:0}:where(dialog){background-color:var(--nc-surface-4);border:1px solid var(--nc-border);border-radius:var(--nc-radius);max-width:min(90vw,40rem);padding:var(--nc-spacing)}dialog::backdrop{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);background:#00000080;animation:.2s nc-backdrop-in}@keyframes nc-backdrop-in{0%{opacity:0}}:where(progress){appearance:none;border-radius:var(--nc-radius);background-color:var(--nc-surface-3);width:100%;height:.5rem;color:var(--nc-primary);border:0;position:relative;overflow:hidden}:where(progress)::-webkit-progress-bar{border-radius:var(--nc-radius);background-color:var(--nc-surface-3)}:where(progress)::-webkit-progress-value{background-color:var(--nc-primary);border-radius:var(--nc-radius);transition:inline-size .3s}:where(progress)::-moz-progress-bar{background-color:var(--nc-primary);border-radius:var(--nc-radius)}:where(progress):not([value]){--nc-progress-track:linear-gradient(to right, var(--nc-surface-3) 0%, var(--nc-primary) 25%, var(--nc-primary) 25%, var(--nc-surface-3) 50%, var(--nc-surface-3) 50%, var(--nc-primary) 75%, var(--nc-primary) 75%, var(--nc-surface-3) 100%);--nc-progress-track-size:200% 100%}@media (prefers-reduced-motion:no-preference){@supports selector(progress::after){:where(progress):not([value]):after{content:"";background:var(--nc-progress-track);background-size:var(--nc-progress-track-size);animation:12s linear infinite nc-progress-indeterminate;position:absolute;inset:0}}:where(progress):not([value])::-webkit-progress-bar{background:var(--nc-progress-track);background-size:var(--nc-progress-track-size);animation:12s linear infinite nc-progress-indeterminate}:where(progress):not([value])::-moz-progress-bar{background:var(--nc-progress-track);background-size:var(--nc-progress-track-size);animation:12s linear infinite nc-progress-indeterminate}}@keyframes nc-progress-indeterminate{0%{background-position:0 0}to{background-position:-200% 0}}:where(meter){appearance:none;border-radius:var(--nc-radius);background-color:var(--nc-surface-3);border:0;width:100%;height:.5rem;overflow:hidden}:where(meter)::-webkit-meter-bar{border-radius:var(--nc-radius);background-color:var(--nc-surface-3);border:0;height:.5rem}:where(meter)::-webkit-meter-optimum-value{background-color:var(--nc-valid);border-radius:var(--nc-radius)}:where(meter)::-webkit-meter-suboptimum-value{background-color:var(--nc-primary);border-radius:var(--nc-radius)}:where(meter)::-webkit-meter-even-less-good-value{background-color:var(--nc-invalid);border-radius:var(--nc-radius)}:where(meter)::-moz-meter-bar{background-color:var(--nc-primary);border-radius:var(--nc-radius)}:where(meter):-moz-meter-optimum::-moz-meter-bar{background-color:var(--nc-valid)}:where(meter):-moz-meter-sub-optimum::-moz-meter-bar{background-color:var(--nc-primary)}:where(meter):-moz-meter-sub-sub-optimum::-moz-meter-bar{background-color:var(--nc-invalid)}@supports (appearance:base-select){:where(select){appearance:base-select}:where(select)::picker(select){appearance:base-select}:where(select)::picker-icon{content:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='10' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2 2l6 6 6-6'/%3E%3C/svg%3E");transition:rotate .4s}:where(select):open::picker-icon{rotate:180deg}:where(select)::picker(select){position-area:block-end;position-try-order:normal;position-try-fallbacks:flip-block;border:1px solid var(--nc-border);border-radius:var(--nc-radius);background-color:var(--nc-surface-1);opacity:0;transition:opacity .2s, overlay .2s allow-discrete, display .2s allow-discrete;padding:.25em}:where(select):open::picker(select){opacity:1}@starting-style{:where(select):open::picker(select){opacity:0}}:where(select) option{border-radius:var(--nc-radius);padding:.5em .75em;transition:background-color .15s}:where(select) option:hover{background-color:var(--nc-surface-2)}:where(select) option:checked{font-weight:600}}}@layer nimble.utilities{.secondary:not(a:not([role=button])){background-color:var(--nc-secondary);border-color:var(--nc-secondary);color:var(--nc-secondary-contrast)}.secondary:not(a:not([role=button])):hover{background-color:var(--nc-secondary-hover);border-color:var(--nc-secondary-hover)}.secondary:not(a:not([role=button])):focus-visible{box-shadow:0 0 0 2px var(--nc-secondary-focus)}a:not([role=button]).secondary{color:var(--nc-secondary);-webkit-text-decoration-color:color-mix(in oklch, var(--nc-secondary), transparent 50%);text-decoration-color:color-mix(in oklch, var(--nc-secondary), transparent 50%)}a:not([role=button]).secondary:hover{color:var(--nc-secondary-hover);-webkit-text-decoration-color:var(--nc-secondary-hover);text-decoration-color:var(--nc-secondary-hover)}.outline:not(a:not([role=button])){color:var(--nc-primary);background-color:#0000}.outline:not(a:not([role=button])):hover{background-color:var(--nc-primary-focus);color:var(--nc-primary-hover);border-color:var(--nc-primary-hover)}.container{max-width:var(--nc-content-width);padding-inline:var(--nc-spacing);margin-inline:auto}.fluid{max-width:none;padding-inline:var(--nc-spacing);display:block}.full-bleed{grid-column:1/-1}.wide{width:100%;max-width:1200px;padding-inline:var(--nc-spacing);grid-column:1/-1;margin-inline:auto}.striped :where(tbody tr:nth-child(2n)){background-color:var(--nc-surface-2)}.visually-hidden{clip-path:inset(50%);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.overflow-auto{overflow:auto}}[type=date],[type=month],[type=week],[type=time],[type=datetime-local]{appearance:none}@supports selector(details::details-content){details::details-content{transition:opacity .3s ease, content-visibility .3s ease allow-discrete;opacity:0}details[open]::details-content{opacity:1}@supports (interpolate-size:allow-keywords){details{interpolate-size:allow-keywords}details::details-content{transition:height .3s ease, opacity .3s ease, content-visibility .3s ease allow-discrete;height:0;overflow:clip}details[open]::details-content{height:auto}}}@media print{body{color:#000;background:#fff}a[href]:after{content:" (" attr(href) ")";color:#555;font-size:.85em}a[href^=\#]:after,a[href^=javascript\:]:after{content:none}pre,blockquote{page-break-inside:avoid}h2,h3,h4{page-break-after:avoid}img{max-width:100%!important}@page{margin:2cm}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leftium/nimble.css",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "A minimal class/classless CSS library combining Open Props design tokens with PicoCSS aesthetics",
5
5
  "type": "module",
6
6
  "main": "dist/nimble.min.css",
@@ -0,0 +1,65 @@
1
+ // ==========================================================================
2
+ // nimble.css — Article (Card)
3
+ // Styled as a self-contained card with optional header/footer separators.
4
+ // ==========================================================================
5
+
6
+ @use 'config' as *;
7
+
8
+ @layer nimble.base {
9
+
10
+ :where(article) {
11
+ background-color: var(#{$prefix}surface-1);
12
+ border: 1px solid var(#{$prefix}border);
13
+ border-radius: var(#{$prefix}radius);
14
+ padding: var(#{$prefix}spacing);
15
+ margin-bottom: var(#{$prefix}spacing);
16
+ }
17
+
18
+ // Header and footer bleed to card edges via negative margin,
19
+ // with a subtle background tint (matches input background).
20
+ :where(article > header),
21
+ :where(article > footer) {
22
+ background-color: color-mix(in oklch, var(#{$prefix}surface-1), var(#{$prefix}surface-2) 20%);
23
+ padding: var(#{$prefix}spacing);
24
+ }
25
+
26
+ :where(article > header) {
27
+ margin: calc(var(#{$prefix}spacing) * -1) calc(var(#{$prefix}spacing) * -1) var(#{$prefix}spacing);
28
+ border-bottom: 1px solid var(#{$prefix}border);
29
+ border-radius: var(#{$prefix}radius) var(#{$prefix}radius) 0 0;
30
+ }
31
+
32
+ :where(article > footer) {
33
+ margin: var(#{$prefix}spacing) calc(var(#{$prefix}spacing) * -1) calc(var(#{$prefix}spacing) * -1);
34
+ border-top: 1px solid var(#{$prefix}border);
35
+ border-radius: 0 0 var(#{$prefix}radius) var(#{$prefix}radius);
36
+ }
37
+
38
+ // Kill last-child bottom margin inside article so it doesn't
39
+ // stack with the card's own padding — but not footer, which
40
+ // uses negative margin to bleed to the card edge.
41
+ :where(article) > :last-child:not(footer) {
42
+ margin-bottom: 0;
43
+ }
44
+
45
+ // Kill last-child bottom margin inside article > header/footer too —
46
+ // those containers use padding for spacing; a trailing margin doubles it.
47
+ :where(article > header, article > footer) > :last-child {
48
+ margin-bottom: 0;
49
+ }
50
+
51
+ // Suppress heading top/bottom margin inside article > header / footer —
52
+ // the container's own padding already provides the visual gap on both sides.
53
+ // Real specificity on the heading tags so this wins over the plain h1–h6
54
+ // rule in _typography.scss (same layer, same zero-specificity containers).
55
+ :where(article > header, article > footer) > h1,
56
+ :where(article > header, article > footer) > h2,
57
+ :where(article > header, article > footer) > h3,
58
+ :where(article > header, article > footer) > h4,
59
+ :where(article > header, article > footer) > h5,
60
+ :where(article > header, article > footer) > h6 {
61
+ margin-top: 0;
62
+ margin-bottom: 0;
63
+ }
64
+
65
+ }
package/src/_buttons.scss CHANGED
@@ -3,6 +3,7 @@
3
3
  // Spec §9.2: button base, .secondary, .outline, button groups, disabled
4
4
  // ==========================================================================
5
5
 
6
+ @use 'sass:string';
6
7
  @use 'config' as *;
7
8
 
8
9
  @layer nimble.base {
@@ -39,6 +40,23 @@
39
40
  outline: none;
40
41
  }
41
42
 
43
+ // ----- Reset button (secondary by default) -----
44
+
45
+ :where([type="reset"]) {
46
+ background-color: var(#{$prefix}secondary);
47
+ border-color: var(#{$prefix}secondary);
48
+ color: var(#{$prefix}secondary-contrast);
49
+ }
50
+
51
+ :where([type="reset"]):hover {
52
+ background-color: var(#{$prefix}secondary-hover);
53
+ border-color: var(#{$prefix}secondary-hover);
54
+ }
55
+
56
+ :where([type="reset"]):focus-visible {
57
+ box-shadow: 0 0 0 2px var(#{$prefix}secondary-focus);
58
+ }
59
+
42
60
  // ----- Inline (buttons within flow text) -----
43
61
 
44
62
  :where(button, [type="submit"], [type="reset"], [type="button"], [role="button"]).inline {
@@ -164,27 +182,37 @@
164
182
 
165
183
  @layer nimble.utilities {
166
184
 
167
- .secondary {
185
+ .secondary:not(a:not([role="button"])) {
168
186
  background-color: var(#{$prefix}secondary);
169
187
  border-color: var(#{$prefix}secondary);
170
188
  color: var(#{$prefix}secondary-contrast);
171
189
  }
172
190
 
173
- .secondary:hover {
191
+ .secondary:not(a:not([role="button"])):hover {
174
192
  background-color: var(#{$prefix}secondary-hover);
175
193
  border-color: var(#{$prefix}secondary-hover);
176
194
  }
177
195
 
178
- .secondary:focus-visible {
196
+ .secondary:not(a:not([role="button"])):focus-visible {
179
197
  box-shadow: 0 0 0 2px var(#{$prefix}secondary-focus);
180
198
  }
181
199
 
182
- .outline {
200
+ a:not([role="button"]).secondary {
201
+ color: var(#{$prefix}secondary);
202
+ text-decoration-color: #{string.unquote('color-mix(in oklch, var(#{$prefix}secondary), transparent 50%)')};
203
+ }
204
+
205
+ a:not([role="button"]).secondary:hover {
206
+ color: var(#{$prefix}secondary-hover);
207
+ text-decoration-color: var(#{$prefix}secondary-hover);
208
+ }
209
+
210
+ .outline:not(a:not([role="button"])) {
183
211
  background-color: transparent;
184
212
  color: var(#{$prefix}primary);
185
213
  }
186
214
 
187
- .outline:hover {
215
+ .outline:not(a:not([role="button"])):hover {
188
216
  background-color: var(#{$prefix}primary-focus);
189
217
  color: var(#{$prefix}primary-hover);
190
218
  border-color: var(#{$prefix}primary-hover);
package/src/_colors.scss CHANGED
@@ -29,58 +29,63 @@
29
29
  :root {
30
30
  color-scheme: light dark;
31
31
 
32
+ // ----- Surface hue (shared by surfaces, text, border) -----
33
+ #{$prefix}surface-hue: #{$surface-hue};
34
+
32
35
  // ----- Surfaces -----
33
36
  // Surface 1: page background (base lightness)
34
37
  #{$prefix}surface-1: #{_light-dark(
35
- _oklch($surface-light-base, $surface-chroma, $surface-hue),
36
- _oklch($surface-dark-base, $surface-chroma + $surface-dark-chroma-boost, $surface-hue + $surface-dark-hue-shift)
38
+ string.unquote('oklch(#{$surface-light-base} #{$surface-chroma} var(#{$prefix}surface-hue))'),
39
+ string.unquote('oklch(#{$surface-dark-base} #{$surface-chroma + $surface-dark-chroma-boost} calc(var(#{$prefix}surface-hue) + #{$surface-dark-hue-shift}))')
37
40
  )};
38
41
 
39
42
  // Surface 2-4: generated from offsets
40
43
  @each $level, $offset in $surface-offsets {
41
44
  #{$prefix}surface-#{$level}: #{_light-dark(
42
- _oklch($surface-light-base - $offset, $surface-chroma, $surface-hue),
43
- _oklch($surface-dark-base + $offset, $surface-chroma + $surface-dark-chroma-boost, $surface-hue + $surface-dark-hue-shift)
45
+ string.unquote('oklch(#{$surface-light-base - $offset} #{$surface-chroma} var(#{$prefix}surface-hue))'),
46
+ string.unquote('oklch(#{$surface-dark-base + $offset} #{$surface-chroma + $surface-dark-chroma-boost} calc(var(#{$prefix}surface-hue) + #{$surface-dark-hue-shift}))')
44
47
  )};
45
48
  }
46
49
 
47
50
  // ----- Text -----
48
51
  #{$prefix}text: #{_light-dark(
49
- _oklch(0.280, 0.005, $surface-hue),
50
- _oklch(0.860, 0.005, $surface-hue)
52
+ string.unquote('oklch(0.28 0.005 var(#{$prefix}surface-hue))'),
53
+ string.unquote('oklch(0.86 0.005 var(#{$prefix}surface-hue))')
51
54
  )};
52
55
 
53
56
  // ----- Border -----
54
57
  #{$prefix}border: #{_light-dark(
55
- _oklch(0.830, 0.005, $surface-hue),
56
- _oklch(0.280, 0.005, $surface-hue + $surface-dark-hue-shift)
58
+ string.unquote('oklch(0.83 0.005 var(#{$prefix}surface-hue))'),
59
+ string.unquote('oklch(0.28 0.005 calc(var(#{$prefix}surface-hue) + #{$surface-dark-hue-shift}))')
57
60
  )};
58
61
 
59
62
  // ----- Primary (main accent) -----
63
+ // Base color; hover/focus are derived via relative color syntax
60
64
  #{$prefix}primary: #{_light-dark(
61
65
  _oklch($primary-lightness, $primary-chroma, $primary-hue),
62
66
  _oklch($primary-lightness + 0.1, $primary-chroma, $primary-hue)
63
67
  )};
64
68
  #{$prefix}primary-hover: #{_light-dark(
65
- _oklch($primary-lightness - 0.1, $primary-chroma, $primary-hue),
66
- _oklch($primary-lightness + 0.2, $primary-chroma, $primary-hue)
69
+ string.unquote('oklch(from var(#{$prefix}primary) calc(l - 0.1) c h)'),
70
+ string.unquote('oklch(from var(#{$prefix}primary) calc(l + 0.1) c h)')
67
71
  )};
68
- #{$prefix}primary-focus: #{_oklch($primary-lightness, $primary-chroma, $primary-hue, 0.4)};
72
+ #{$prefix}primary-focus: #{string.unquote('oklch(from var(#{$prefix}primary) l c h / 0.4)')};
69
73
  #{$prefix}primary-contrast: #{_light-dark(
70
74
  '#fff',
71
75
  _oklch(0.15, 0.005, $surface-hue)
72
76
  )};
73
77
 
74
78
  // ----- Secondary (neutral accent) -----
79
+ // Base color; hover/focus are derived via relative color syntax
75
80
  #{$prefix}secondary: #{_light-dark(
76
81
  _oklch($secondary-lightness, $secondary-chroma, $secondary-hue),
77
82
  _oklch($secondary-lightness + 0.15, $secondary-chroma, $secondary-hue)
78
83
  )};
79
84
  #{$prefix}secondary-hover: #{_light-dark(
80
- _oklch($secondary-lightness - 0.1, $secondary-chroma, $secondary-hue),
81
- _oklch($secondary-lightness + 0.25, $secondary-chroma, $secondary-hue)
85
+ string.unquote('oklch(from var(#{$prefix}secondary) calc(l - 0.1) c h)'),
86
+ string.unquote('oklch(from var(#{$prefix}secondary) calc(l + 0.1) c h)')
82
87
  )};
83
- #{$prefix}secondary-focus: #{_oklch($secondary-lightness, $secondary-chroma, $secondary-hue, 0.3)};
88
+ #{$prefix}secondary-focus: #{string.unquote('oklch(from var(#{$prefix}secondary) l c h / 0.3)')};
84
89
  #{$prefix}secondary-contrast: #{_light-dark(
85
90
  '#fff',
86
91
  _oklch(0.15, 0.005, $surface-hue)
package/src/_details.scss CHANGED
@@ -17,6 +17,10 @@
17
17
  padding: 0 1em;
18
18
  }
19
19
 
20
+ :where(details) {
21
+ margin-bottom: 0.5em;
22
+ }
23
+
20
24
  :where(summary) {
21
25
  cursor: pointer;
22
26
  font-weight: 600;
@@ -33,6 +33,16 @@
33
33
  min-width: 0; // Allow grid children to shrink below intrinsic content width
34
34
  }
35
35
 
36
+ // Fix for frameworks (SvelteKit, etc.) that insert a
37
+ // <div style="display: contents"> wrapper between <body> and content.
38
+ // display: contents removes the element from the box tree for layout,
39
+ // but NOT for CSS selector matching — so body > * misses the actual
40
+ // content elements. This rule mirrors the body > * rule above.
41
+ body > [style*='display: contents'] > * {
42
+ grid-column: 2;
43
+ min-width: 0;
44
+ }
45
+
36
46
  // Selection styling using primary accent
37
47
  ::selection {
38
48
  background-color: var(#{$prefix}primary-focus);
package/src/_forms.scss CHANGED
@@ -79,6 +79,12 @@
79
79
  font-weight: 600;
80
80
  }
81
81
 
82
+ // file and range are short/inline controls — increase the label gap to match
83
+ // the visual weight of the spacing above and beside them.
84
+ :where(label:has(+ [type="file"], + [type="range"])) {
85
+ margin-bottom: 0.5em;
86
+ }
87
+
82
88
  // ----- Fieldset -----
83
89
 
84
90
  :where(fieldset) {
@@ -108,13 +114,20 @@
108
114
  display: flex;
109
115
  align-items: center;
110
116
  gap: 0.35em;
111
- margin-bottom: var(#{$prefix}spacing);
117
+ margin-bottom: 0.5em;
112
118
  }
113
119
 
114
- // Radio options in a group sit close together; only the last one
115
- // carries the full field-gap to the next element.
116
- :where(label:has([type="radio"])) {
117
- margin-bottom: 0.35em;
120
+ // Last checkbox/radio label in a group drops its bottom margin
121
+ // so the parent element controls spacing to the next sibling.
122
+ :where(label:has([type="checkbox"], [type="radio"]):last-child) {
123
+ margin-bottom: 0;
124
+ }
125
+
126
+ // ----- Search (pill shape) -----
127
+
128
+ :where([type="search"]) {
129
+ border-radius: 5rem;
130
+ padding-inline: 1.25em;
118
131
  }
119
132
 
120
133
  // ----- Range -----
@@ -122,6 +135,7 @@
122
135
  :where([type="range"]) {
123
136
  accent-color: var(#{$prefix}primary);
124
137
  width: 100%;
138
+ margin-bottom: var(#{$prefix}spacing);
125
139
  }
126
140
 
127
141
  // ----- Datalist-connected inputs -----
@@ -139,6 +153,7 @@
139
153
  font: inherit;
140
154
  cursor: pointer;
141
155
  max-width: 100%; // Prevent native file input from overflowing container (iOS Safari)
156
+ margin-bottom: var(#{$prefix}spacing);
142
157
  }
143
158
 
144
159
  :where([type="file"])::file-selector-button {
@@ -171,6 +186,7 @@
171
186
 
172
187
  :where([type="color"]) {
173
188
  --_color-size: calc(1em * 1.5 + 1em + 2px); // Match text input height
189
+ margin-bottom: var(#{$prefix}spacing);
174
190
 
175
191
  --_color-pad: 0.25em;
176
192
 
@@ -198,7 +214,7 @@
198
214
  // Minimal switch styling — relies on native checkbox with role="switch"
199
215
  // Browsers with :has() support get enhanced label alignment
200
216
  :where(label:has([type="checkbox"][role="switch"])) {
201
- display: inline-flex;
217
+ display: flex;
202
218
  align-items: center;
203
219
  gap: 0.5em;
204
220
  }
package/src/_select.scss CHANGED
@@ -26,6 +26,9 @@
26
26
 
27
27
  // Drop-down picker
28
28
  :where(select)::picker(select) {
29
+ position-area: block-end;
30
+ position-try-order: normal;
31
+ position-try-fallbacks: flip-block;
29
32
  border: 1px solid var(#{$prefix}border);
30
33
  border-radius: var(#{$prefix}radius);
31
34
  background-color: var(#{$prefix}surface-1);