@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.
- package/README.md +152 -55
- package/dist/nimble-base.css +24 -141
- package/dist/nimble-base.min.css +1 -1
- package/dist/nimble-core.css +867 -0
- package/dist/nimble-core.min.css +1 -0
- package/dist/nimble-meter.css +45 -0
- package/dist/nimble-meter.min.css +1 -0
- package/dist/nimble-progress.css +71 -0
- package/dist/nimble-progress.min.css +1 -0
- package/dist/nimble-reset.css +2 -1
- package/dist/nimble-reset.min.css +1 -1
- package/dist/nimble-select.css +46 -0
- package/dist/nimble-select.min.css +1 -0
- package/dist/nimble.css +446 -38
- package/dist/nimble.min.css +1 -1
- package/package.json +10 -2
- package/src/_article.scss +65 -0
- package/src/_buttons.scss +104 -6
- package/src/_colors.scss +20 -19
- package/src/_details.scss +66 -2
- package/src/_dialog.scss +7 -1
- package/src/_document.scss +13 -2
- package/src/_forms.scss +142 -3
- package/src/_links.scss +2 -2
- package/src/_media.scss +1 -1
- package/src/_meter.scss +72 -0
- package/src/_progress.scss +88 -0
- package/src/_reset.scss +3 -1
- package/src/_select.scss +67 -0
- package/src/_typography.scss +13 -13
- package/src/nimble-base.scss +1 -2
- package/src/nimble-core.scss +31 -0
- package/src/nimble-meter.scss +8 -0
- package/src/nimble-progress.scss +8 -0
- package/src/nimble-select.scss +8 -0
- package/src/nimble.scss +7 -1
package/dist/nimble.min.css
CHANGED
|
@@ -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.
|
|
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
|
-
"./
|
|
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
|
-
|
|
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
|
-
.
|
|
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
|
-
|
|
36
|
-
|
|
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
|
-
|
|
43
|
-
|
|
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
|
|
49
|
-
|
|
50
|
-
|
|
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
|
-
|
|
60
|
-
|
|
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
|
-
|
|
70
|
-
|
|
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: #{
|
|
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
|
-
|
|
85
|
-
|
|
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: #{
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
}
|
package/src/_document.scss
CHANGED
|
@@ -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
|
|
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
|
|
49
|
+
color: var(#{$prefix}text);
|
|
39
50
|
}
|
|
40
51
|
|
|
41
52
|
}
|