@leftium/nimble.css 0.1.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.
@@ -1 +1 @@
1
- @layer nimble.reset{:where(*),: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}: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-1:light-dark(oklch(28% .005 250),oklch(86% .005 250));--nc-text-2:light-dark(oklch(58% .005 250),oklch(65% .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-1);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}::selection{background-color:var(--nc-primary-focus);color:var(--nc-text-1)}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:0;margin-bottom:var(--nc-spacing);text-wrap:balance;font-size:1.75rem;font-weight:700;line-height:1.15}h3{margin-top:0;margin-bottom:var(--nc-spacing);text-wrap:balance;font-size:1.5rem;font-weight:700;line-height:1.2}h4{margin-top:0;margin-bottom:var(--nc-spacing);text-wrap:balance;font-size:1.25rem;font-weight:700;line-height:1.3}h5{margin-top:0;margin-bottom:var(--nc-spacing);text-wrap:balance;font-size:1.125rem;font-weight:700;line-height:1.4}h6{margin-top:0;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)}:where(p,ul,ol,dl,blockquote,pre,table,figure,form)+:is(h1,h2,h3,h4,h5,h6){margin-top:calc(var(--nc-spacing) * 2)}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:var(--nc-text-2);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(50% .2 310));-webkit-text-decoration-color:color-mix(in oklch, var(--nc-primary) 40%, oklch(50% .2 310) 30%);text-decoration-color:color-mix(in oklch, var(--nc-primary) 40%, oklch(50% .2 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]):disabled{opacity:.5;cursor:not-allowed;pointer-events:none}:where([role=group]){display:inline-flex}[role=group]>*{border-radius:0;margin:0}[role=group]>*+*{box-shadow:-1px 0 #ffffff4d}[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=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]),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);color:var(--nc-text-1);font:inherit;padding:.5em .75em;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]),select,textarea){width:100%}: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)[aria-invalid=false]{border-color:var(--nc-valid)}:where(input,select,textarea)[aria-invalid=true]{border-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)}:where(legend){padding-inline:.25em;font-weight:600}:where([type=checkbox],[type=radio]){accent-color:var(--nc-primary)}:where([type=range]){accent-color:var(--nc-primary);width:100%}:where([type=color]){cursor:pointer}:where([type=checkbox][role=switch]){appearance:none;background-color:var(--nc-border);cursor:pointer;border-radius:1em;width:2.5em;height:1.25em;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:var(--nc-text-2);margin-top:.5em;font-size:.9em}:where(details){border:1px solid var(--nc-border);border-radius:var(--nc-radius);padding:.75em 1em}:where(summary){cursor:pointer;font-weight:600}:where(details[open]>summary){margin-bottom:.5em}: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)}:where(){background:#00000080}}@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}}@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,15 +1,23 @@
1
1
  {
2
2
  "name": "@leftium/nimble.css",
3
- "version": "0.1.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",
7
7
  "exports": {
8
8
  ".": "./dist/nimble.min.css",
9
+ "./core": "./dist/nimble-core.min.css",
9
10
  "./base": "./dist/nimble-base.min.css",
10
11
  "./reset": "./dist/nimble-reset.min.css",
11
12
  "./utilities": "./dist/nimble-utilities.min.css",
12
- "./scss": "./src/nimble.scss"
13
+ "./progress": "./dist/nimble-progress.min.css",
14
+ "./meter": "./dist/nimble-meter.min.css",
15
+ "./select": "./dist/nimble-select.min.css",
16
+ "./scss": "./src/nimble.scss",
17
+ "./scss/core": "./src/nimble-core.scss",
18
+ "./scss/progress": "./src/_progress.scss",
19
+ "./scss/meter": "./src/_meter.scss",
20
+ "./scss/select": "./src/_select.scss"
13
21
  },
14
22
  "repository": {
15
23
  "type": "git",
@@ -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,33 @@
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
+
60
+ // ----- Inline (buttons within flow text) -----
61
+
62
+ :where(button, [type="submit"], [type="reset"], [type="button"], [role="button"]).inline {
63
+ --_btn-padding-v: 0.05em;
64
+ --_btn-padding-h: 0.4em;
65
+ margin: 0.1em 0.15em;
66
+ font-size: 0.875em;
67
+ vertical-align: baseline;
68
+ }
69
+
42
70
  // ----- Disabled -----
43
71
 
44
72
  :where(button, [type="submit"], [type="reset"], [type="button"], [role="button"]):disabled {
@@ -53,15 +81,55 @@
53
81
 
54
82
  :where([role="group"]) {
55
83
  display: inline-flex;
84
+ margin-bottom: var(#{$prefix}spacing);
56
85
  }
57
86
 
58
87
  [role="group"] > * {
59
88
  border-radius: 0;
60
89
  margin: 0;
90
+ position: relative;
61
91
  }
62
92
 
93
+ // Inset divider between adjacent same-type buttons. Different-type
94
+ // neighbours already have distinct backgrounds so no separator needed.
63
95
  [role="group"] > * + * {
64
- box-shadow: -1px 0 0 rgb(255 255 255 / 0.3);
96
+ --_divider: ""; // shown by default (same-type needs separation)
97
+ }
98
+
99
+ [role="group"] > * + *::before {
100
+ content: var(--_divider);
101
+ position: absolute;
102
+ inset-inline-start: 0;
103
+ top: 20%;
104
+ bottom: 20%;
105
+ width: 1px;
106
+ background: rgb(255 255 255 / 0.3);
107
+ pointer-events: none;
108
+ }
109
+
110
+ // Hide divider between different-type button neighbours.
111
+ // primary ↔ secondary
112
+ [role="group"] > :not(.secondary):not(.outline) + .secondary,
113
+ [role="group"] > .secondary + :not(.secondary):not(.outline) {
114
+ --_divider: none;
115
+ }
116
+
117
+ // primary ↔ outline
118
+ [role="group"] > :not(.secondary):not(.outline) + .outline,
119
+ [role="group"] > .outline + :not(.secondary):not(.outline) {
120
+ --_divider: none;
121
+ }
122
+
123
+ // secondary ↔ outline
124
+ [role="group"] > .secondary + .outline,
125
+ [role="group"] > .outline + .secondary {
126
+ --_divider: none;
127
+ }
128
+
129
+ // Hide divider after non-button elements (e.g. search input).
130
+ [role="group"] > input + *,
131
+ [role="group"] > select + * {
132
+ --_divider: none;
65
133
  }
66
134
 
67
135
  [role="group"] > :first-child {
@@ -74,6 +142,26 @@
74
142
  border-end-end-radius: var(#{$prefix}radius);
75
143
  }
76
144
 
145
+ // ----- Outline button groups -----
146
+ // When ALL children are .outline, collapse borders onto the group
147
+ // container so internal dividers don't double up with per-button borders.
148
+ // :has(> :not(.outline)) excludes mixed groups (e.g. primary + outline).
149
+
150
+ [role="group"]:has(.outline):not(:has(> :not(.outline))) {
151
+ border: 1px solid var(#{$prefix}primary);
152
+ border-radius: var(#{$prefix}radius);
153
+ }
154
+
155
+ [role="group"]:has(.outline):not(:has(> :not(.outline))) > .outline {
156
+ border: none;
157
+ }
158
+
159
+ // Outline dividers use primary color (white overlay is invisible
160
+ // against transparent background).
161
+ [role="group"] > .outline + .outline::before {
162
+ background: var(#{$prefix}primary);
163
+ }
164
+
77
165
  // ----- Search groups (pill shape) -----
78
166
 
79
167
  [role="search"] [role="group"] > :first-child {
@@ -94,27 +182,37 @@
94
182
 
95
183
  @layer nimble.utilities {
96
184
 
97
- .secondary {
185
+ .secondary:not(a:not([role="button"])) {
98
186
  background-color: var(#{$prefix}secondary);
99
187
  border-color: var(#{$prefix}secondary);
100
188
  color: var(#{$prefix}secondary-contrast);
101
189
  }
102
190
 
103
- .secondary:hover {
191
+ .secondary:not(a:not([role="button"])):hover {
104
192
  background-color: var(#{$prefix}secondary-hover);
105
193
  border-color: var(#{$prefix}secondary-hover);
106
194
  }
107
195
 
108
- .secondary:focus-visible {
196
+ .secondary:not(a:not([role="button"])):focus-visible {
109
197
  box-shadow: 0 0 0 2px var(#{$prefix}secondary-focus);
110
198
  }
111
199
 
112
- .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"])) {
113
211
  background-color: transparent;
114
212
  color: var(#{$prefix}primary);
115
213
  }
116
214
 
117
- .outline:hover {
215
+ .outline:not(a:not([role="button"])):hover {
118
216
  background-color: var(#{$prefix}primary-focus);
119
217
  color: var(#{$prefix}primary-hover);
120
218
  border-color: var(#{$prefix}primary-hover);
package/src/_colors.scss CHANGED
@@ -29,62 +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
- #{$prefix}text-1: #{_light-dark(
49
- _oklch(0.280, 0.005, $surface-hue),
50
- _oklch(0.860, 0.005, $surface-hue)
51
- )};
52
- #{$prefix}text-2: #{_light-dark(
53
- _oklch(0.580, 0.005, $surface-hue),
54
- _oklch(0.650, 0.005, $surface-hue)
51
+ #{$prefix}text: #{_light-dark(
52
+ string.unquote('oklch(0.28 0.005 var(#{$prefix}surface-hue))'),
53
+ string.unquote('oklch(0.86 0.005 var(#{$prefix}surface-hue))')
55
54
  )};
56
55
 
57
56
  // ----- Border -----
58
57
  #{$prefix}border: #{_light-dark(
59
- _oklch(0.830, 0.005, $surface-hue),
60
- _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}))')
61
60
  )};
62
61
 
63
62
  // ----- Primary (main accent) -----
63
+ // Base color; hover/focus are derived via relative color syntax
64
64
  #{$prefix}primary: #{_light-dark(
65
65
  _oklch($primary-lightness, $primary-chroma, $primary-hue),
66
66
  _oklch($primary-lightness + 0.1, $primary-chroma, $primary-hue)
67
67
  )};
68
68
  #{$prefix}primary-hover: #{_light-dark(
69
- _oklch($primary-lightness - 0.1, $primary-chroma, $primary-hue),
70
- _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)')
71
71
  )};
72
- #{$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)')};
73
73
  #{$prefix}primary-contrast: #{_light-dark(
74
74
  '#fff',
75
75
  _oklch(0.15, 0.005, $surface-hue)
76
76
  )};
77
77
 
78
78
  // ----- Secondary (neutral accent) -----
79
+ // Base color; hover/focus are derived via relative color syntax
79
80
  #{$prefix}secondary: #{_light-dark(
80
81
  _oklch($secondary-lightness, $secondary-chroma, $secondary-hue),
81
82
  _oklch($secondary-lightness + 0.15, $secondary-chroma, $secondary-hue)
82
83
  )};
83
84
  #{$prefix}secondary-hover: #{_light-dark(
84
- _oklch($secondary-lightness - 0.1, $secondary-chroma, $secondary-hue),
85
- _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)')
86
87
  )};
87
- #{$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)')};
88
89
  #{$prefix}secondary-contrast: #{_light-dark(
89
90
  '#fff',
90
91
  _oklch(0.15, 0.005, $surface-hue)
package/src/_details.scss CHANGED
@@ -12,18 +12,82 @@
12
12
  :where(details) {
13
13
  border: 1px solid var(#{$prefix}border);
14
14
  border-radius: var(#{$prefix}radius);
15
- padding: 0.75em 1em;
15
+ // No vertical padding summary provides its own via the
16
+ // negative-margin/padding trick for vertical centering.
17
+ padding: 0 1em;
18
+ }
19
+
20
+ :where(details) {
21
+ margin-bottom: 0.5em;
16
22
  }
17
23
 
18
24
  :where(summary) {
19
25
  cursor: pointer;
20
26
  font-weight: 600;
27
+ // Stretch summary across the horizontal padding area, then
28
+ // re-apply vertical + horizontal padding on itself. When
29
+ // collapsed the text is vertically centered with equal padding.
30
+ margin: 0 -1em;
31
+ padding: 0.75em 1em;
32
+ // Custom markers fix iOS Safari's tiny native disclosure triangle.
33
+ // Full-size Unicode triangles inherit font metrics and sit on the
34
+ // baseline like native markers.
35
+ list-style-type: '▶ ';
21
36
  }
22
37
 
23
38
  :where(details[open] > summary) {
24
- margin-bottom: 0.5em;
39
+ list-style-type: '▼ ';
40
+ }
41
+
42
+ // When open, restore vertical padding for content spacing.
43
+ :where(details[open]) {
44
+ padding-bottom: 0.75em;
45
+ }
46
+
47
+ // Kill last-child bottom margin so it doesn't stack with
48
+ // details[open] padding-bottom. Descendant selector (not >)
49
+ // reaches inside ::details-content which wraps the content.
50
+ // No :where() — needs specificity to override typography margins.
51
+ details :last-child {
52
+ margin-bottom: 0;
25
53
  }
26
54
 
55
+ // Summary bottom padding provides the gap to content when open.
56
+ // No extra margin-bottom or ::details-content padding needed.
57
+
58
+ }
59
+
60
+ // Animate content on open/close (progressive enhancement)
61
+ // Outside @layer — ::details-content needs real specificity to override UA styles
62
+ // Gate on ::details-content support (Safari 18.4+, Chrome 131+)
63
+ @supports selector(details::details-content) {
64
+ details::details-content {
65
+ transition: opacity 0.3s ease,
66
+ content-visibility 0.3s ease allow-discrete;
67
+ opacity: 0;
68
+ }
69
+
70
+ details[open]::details-content {
71
+ opacity: 1;
72
+ }
73
+
74
+ // Height animation where interpolate-size is supported (Chrome 129+)
75
+ @supports (interpolate-size: allow-keywords) {
76
+ details {
77
+ interpolate-size: allow-keywords;
78
+ }
79
+
80
+ details::details-content {
81
+ transition: height 0.3s ease, opacity 0.3s ease,
82
+ content-visibility 0.3s ease allow-discrete;
83
+ height: 0;
84
+ overflow: clip;
85
+ }
86
+
87
+ details[open]::details-content {
88
+ height: auto;
89
+ }
90
+ }
27
91
  }
28
92
 
29
93
  }
package/src/_dialog.scss CHANGED
@@ -17,8 +17,14 @@
17
17
  padding: var(#{$prefix}spacing);
18
18
  }
19
19
 
20
- :where(dialog::backdrop) {
20
+ dialog::backdrop {
21
21
  background: rgb(0 0 0 / 0.5);
22
+ backdrop-filter: blur(4px);
23
+ animation: nc-backdrop-in 0.2s ease;
24
+ }
25
+
26
+ @keyframes nc-backdrop-in {
27
+ from { opacity: 0; }
22
28
  }
23
29
 
24
30
  }
@@ -12,7 +12,7 @@
12
12
  font-family: var(#{$prefix}font-sans);
13
13
  font-size: 100%; // = 16px in most browsers
14
14
  line-height: 1.5;
15
- color: var(#{$prefix}text-1);
15
+ color: var(#{$prefix}text);
16
16
  background-color: var(#{$prefix}surface-1);
17
17
  }
18
18
 
@@ -30,12 +30,23 @@
30
30
 
31
31
  body > * {
32
32
  grid-column: 2;
33
+ min-width: 0; // Allow grid children to shrink below intrinsic content width
34
+ }
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;
33
44
  }
34
45
 
35
46
  // Selection styling using primary accent
36
47
  ::selection {
37
48
  background-color: var(#{$prefix}primary-focus);
38
- color: var(#{$prefix}text-1);
49
+ color: var(#{$prefix}text);
39
50
  }
40
51
 
41
52
  }