@juwel-development/design-system 2.0.0 → 2.1.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 +19 -3
- package/dist/design-system.js +176 -164
- package/dist/index.css +1 -1
- package/dist/types/Interaction/Input/Input.d.ts +2 -0
- package/dist/types/Interaction/TextArea/TextArea.d.ts +2 -0
- package/dist/types/Theme/renderTokens.d.ts +16 -3
- package/package.json +5 -1
- package/src/Interaction/Button/Button.tsx +2 -2
- package/src/Interaction/Input/Input.tsx +18 -1
- package/src/Interaction/TextArea/TextArea.tsx +18 -1
- package/src/Theme/renderTokens.ts +89 -29
- package/src/styles.dark.css +9 -0
- package/src/styles.light.css +9 -0
- package/src/tokens.css +5 -0
- package/src/tokens.dark.css +169 -0
- package/src/tokens.light.css +169 -0
package/dist/index.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
|
|
2
|
-
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-content:""}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-serif:ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--spacing:.25rem;--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--radius-lg:.5rem;--aspect-video:16 / 9;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-surface:var(--color-surface);--color-foreground:var(--color-foreground);--color-muted:var(--color-muted);--color-border:var(--color-border);--color-control-border:var(--color-control-border);--color-rule:var(--color-rule);--color-backing:var(--color-backing);--color-primary:var(--color-primary);--color-primary-hover:var(--color-primary-hover);--color-primary-foreground:var(--color-primary-foreground);--color-secondary:var(--color-secondary);--color-secondary-hover:var(--color-secondary-hover);--color-secondary-foreground:var(--color-secondary-foreground);--color-disabled:var(--color-disabled);--color-disabled-hover:var(--color-disabled-hover);--color-focus-ring:var(--color-focus-ring);--color-link:var(--color-link);--color-success:var(--color-success);--color-warning:var(--color-warning);--color-error:var(--color-error);--color-info:var(--color-info);--font-primary:inherit;--font-secondary:inherit;--text-display:clamp(3rem, 7vw, 6rem);--leading-display:1.05;--text-title:clamp(2.25rem, 5vw, 4.25rem);--leading-title:1.1;--text-subtitle:clamp(1.5rem, 3vw, 2.25rem);--leading-subtitle:1.2;--text-lede:1.25rem;--leading-lede:1.4;--text-body:1.0625rem;--leading-body:1.6;--text-small:.9375rem;--text-label:.8125rem;--tracking-label:.14em;--tracking-optical:-.02em;--aspect-portrait:4 / 5;--aspect-square:1 / 1;--aspect-landscape:3 / 2;--aspect-wide:16 / 9}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.fixed{position:fixed}.static{position:static}.sticky{position:sticky}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.m-0{margin:0}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.aspect-landscape{aspect-ratio:var(--aspect-landscape)}.aspect-portrait{aspect-ratio:var(--aspect-portrait)}.aspect-square{aspect-ratio:var(--aspect-square)}.aspect-wide{aspect-ratio:var(--aspect-wide)}.min-h-24{min-height:calc(var(--spacing) * 24)}.min-h-\[var\(--fold-height\)\]{min-height:var(--fold-height)}.w-full{width:100%}.max-w-\[var\(--measure\)\]{max-width:var(--measure)}.max-w-\[var\(--measure-wide\)\]{max-width:var(--measure-wide)}.min-w-0{min-width:0}.min-w-42{min-width:calc(var(--spacing) * 42)}.grow{flex-grow:1}.cursor-pointer{cursor:pointer}.list-none{list-style-type:none}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-start{justify-content:flex-start}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-\[var\(--space-region\)\]{gap:var(--space-region)}.gap-\[var\(--space-stack\)\]{gap:var(--space-stack)}.rounded-\[var\(--radius-control\)\]{border-radius:var(--radius-control)}.rounded-\[var\(--radius-…\)\]{border-radius:var(--radius-…)}.rounded-lg{border-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-solid{--tw-border-style:solid;border-style:solid}.border-border{border-color:var(--color-border)}.border-control-border{border-color:var(--color-control-border)}.border-rule{border-color:var(--color-rule)}.bg-backing{background-color:var(--color-backing)}.bg-primary{background-color:var(--color-primary)}.bg-secondary{background-color:var(--color-secondary)}.bg-transparent{background-color:#0000}.object-cover{object-fit:cover}.object-bottom{object-position:bottom}.object-center{object-position:center}.object-left{object-position:left}.object-right{object-position:right}.object-top{object-position:top}.p-0{padding:0}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-\[var\(--gutter\)\]{padding-inline:var(--gutter)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-\[var\(--space-band\)\]{padding-block:var(--space-band)}.py-\[var\(--space-region\)\]{padding-block:var(--space-region)}.pt-1{padding-top:var(--spacing)}.pb-1{padding-bottom:var(--spacing)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-primary{font-family:var(--font-primary)}.font-secondary{font-family:var(--font-secondary)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-body{font-size:var(--text-body)}.text-display{font-size:var(--text-display)}.text-label{font-size:var(--text-label)}.text-lede{font-size:var(--text-lede)}.text-small{font-size:var(--text-small)}.text-subtitle{font-size:var(--text-subtitle)}.text-title{font-size:var(--text-title)}.leading-body{--tw-leading:var(--leading-body);line-height:var(--leading-body)}.leading-display{--tw-leading:var(--leading-display);line-height:var(--leading-display)}.leading-lede{--tw-leading:var(--leading-lede);line-height:var(--leading-lede)}.leading-subtitle{--tw-leading:var(--leading-subtitle);line-height:var(--leading-subtitle)}.leading-title{--tw-leading:var(--leading-title);line-height:var(--leading-title)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-label{--tw-tracking:var(--tracking-label);letter-spacing:var(--tracking-label)}.tracking-optical{--tw-tracking:var(--tracking-optical);letter-spacing:var(--tracking-optical)}.text-nowrap{text-wrap:nowrap}.text-error{color:var(--color-error)}.text-foreground{color:var(--color-foreground)}.text-inherit{color:inherit}.text-link{color:var(--color-link)}.text-muted{color:var(--color-muted)}.text-primary-foreground{color:var(--color-primary-foreground)}.text-secondary-foreground{color:var(--color-secondary-foreground)}.text-success{color:var(--color-success)}.ordinal{--tw-ordinal:ordinal;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.decoration-\[length\:var\(--underline-thickness\)\]{text-decoration-thickness:var(--underline-thickness)}.underline-offset-\[var\(--underline-offset\)\]{text-underline-offset:var(--underline-offset)}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.outline-offset-\[var\(--focus-ring-offset\)\]{outline-offset:var(--focus-ring-offset)}.outline-focus-ring{outline-color:var(--color-focus-ring)}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-\[var\(--motion-duration-color\)\]{--tw-duration:var(--motion-duration-color);transition-duration:var(--motion-duration-color)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.before\:mt-\[0\.7em\]:before{content:var(--tw-content);margin-top:.7em}.before\:h-\[var\(--tick-thickness\)\]:before{content:var(--tw-content);height:var(--tick-thickness)}.before\:w-\[var\(--tick-length\)\]:before{content:var(--tw-content);width:var(--tick-length)}.before\:shrink-0:before{content:var(--tw-content);flex-shrink:0}.before\:bg-\[var\(--color-rule\)\]:before{content:var(--tw-content);background-color:var(--color-rule)}.before\:content-\[\'\'\]:before{--tw-content:"";content:var(--tw-content)}.first\:border-t:first-child{border-top-style:var(--tw-border-style);border-top-width:1px}.first\:pl-0:first-child{padding-left:0}.last\:pr-0:last-child{padding-right:0}@media (hover:hover){.hover\:bg-primary-hover:hover{background-color:var(--color-primary-hover)}.hover\:bg-secondary-hover:hover{background-color:var(--color-secondary-hover)}.hover\:text-foreground:hover{color:var(--color-foreground)}.hover\:underline:hover{text-decoration-line:underline}.hover\:decoration-\[length\:var\(--underline-thickness\)\]:hover{text-decoration-thickness:var(--underline-thickness)}.hover\:decoration-\[length\:var\(--underline-thickness-hover\)\]:hover{text-decoration-thickness:var(--underline-thickness-hover)}.hover\:underline-offset-\[var\(--underline-offset\)\]:hover{text-underline-offset:var(--underline-offset)}}.focus-visible\:outline:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-\[length\:var\(--focus-ring-width\)\]:focus-visible{outline-style:var(--tw-outline-style);outline-width:var(--focus-ring-width)}.focus-visible\:outline-focus-ring:focus-visible{outline-color:var(--color-focus-ring)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:border-disabled:disabled{border-color:var(--color-disabled)}.disabled\:bg-disabled:disabled{background-color:var(--color-disabled)}.disabled\:text-muted:disabled{color:var(--color-muted)}@media (hover:hover){.disabled\:hover\:bg-disabled-hover:disabled:hover{background-color:var(--color-disabled-hover)}}.aria-\[invalid\=true\]\:border-error[aria-invalid=true]{border-color:var(--color-error)}@media (width>=40rem){.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:py-2{padding-block:calc(var(--spacing) * 2)}}@media (width>=64rem){.lg\:sticky{position:sticky}.lg\:top-6{top:calc(var(--spacing) * 6)}.lg\:grid-cols-\[10rem_minmax\(0\,1fr\)\]{grid-template-columns:10rem minmax(0,1fr)}.lg\:grid-cols-\[16rem_minmax\(0\,1fr\)\]{grid-template-columns:16rem minmax(0,1fr)}.lg\:items-baseline{align-items:baseline}.lg\:items-start{align-items:flex-start}.lg\:gap-x-12{column-gap:calc(var(--spacing) * 12)}}.\[\&_\[aria-current\=page\]\]\:text-foreground [aria-current=page]{color:var(--color-foreground)}.\[\&_caption\]\:pb-3 caption{padding-bottom:calc(var(--spacing) * 3)}.\[\&_caption\]\:text-left caption{text-align:left}.\[\&_caption\]\:font-secondary caption{font-family:var(--font-secondary)}.\[\&_caption\]\:text-label caption{font-size:var(--text-label)}.\[\&_caption\]\:tracking-label caption{--tw-tracking:var(--tracking-label);letter-spacing:var(--tracking-label)}.\[\&_caption\]\:text-muted caption{color:var(--color-muted)}.\[\&\:not\(\:first-child\)\]\:mt-\[var\(--space-stack\)\]:not(:first-child){margin-top:var(--space-stack)}.\[\&\:not\(\:first-child\)\]\:border-t:not(:first-child){border-top-style:var(--tw-border-style);border-top-width:1px}.\[\&\:not\(\:first-child\)\]\:border-solid:not(:first-child){--tw-border-style:solid;border-style:solid}.\[\&\:not\(\:first-child\)\]\:border-border:not(:first-child){border-color:var(--color-border)}.\[\&\:not\(\:first-child\)\]\:pt-\[var\(--space-stack\)\]:not(:first-child){padding-top:var(--space-stack)}.\[\&\:not\(\[data-notes\]\)\]\:overflow-x-auto:not([data-notes]){overflow-x:auto}.\[\&\:user-invalid\]\:border-error:user-invalid{border-color:var(--color-error)}@media (width>=64rem){.lg\:\[\&\>dd\]\:col-start-2>dd{grid-column-start:2}.lg\:\[\&\>dd\]\:row-start-1>dd{grid-row-start:1}.lg\:\[\&\>dt\]\:col-start-1>dt{grid-column-start:1}}.\[\&\>table\]\:w-full>table{width:100%}.\[\&\>table\]\:border-collapse>table{border-collapse:collapse}.\[\&\>table\]\:text-left>table{text-align:left}.\[\&\>table\>\*\:nth-child\(2\)\>tr\:first-child\]\:border-rule>table>:nth-child(2)>tr:first-child{border-color:var(--color-rule)}@media not all and (width>=48rem){.\[\&\[data-notes\=content\]_tbody\]\:max-md\:block[data-notes=content] tbody,.\[\&\[data-notes\=content\]_td\]\:max-md\:block[data-notes=content] td,.\[\&\[data-notes\=content\]_tfoot\]\:max-md\:block[data-notes=content] tfoot,.\[\&\[data-notes\=content\]_th\]\:max-md\:block[data-notes=content] th,.\[\&\[data-notes\=content\]_thead\]\:max-md\:block[data-notes=content] thead,.\[\&\[data-notes\=content\]_tr\]\:max-md\:block[data-notes=content] tr,.\[\&\[data-notes\=content\]\>table\]\:max-md\:block[data-notes=content]>table{display:block}.\[\&\[data-notes\=supplementary\]_\[data-variant\=note\]\]\:max-md\:hidden[data-notes=supplementary] [data-variant=note]{display:none}}[data-section]+.\[\[data-section\]\+\&\]\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}[data-section]+.\[\[data-section\]\+\&\]\:border-solid{--tw-border-style:solid;border-style:solid}[data-section]+.\[\[data-section\]\+\&\]\:border-rule{border-color:var(--color-rule)}}:root{--color-surface:#fff;--color-foreground:#0f172a;--color-muted:#64748b;--color-border:#e2e8f0;--color-control-border:#64748b;--color-rule:#808fa3;--color-backing:#f1f5f9;--color-primary:#8b5cf6;--color-primary-hover:#7c3aed;--color-primary-foreground:#f8fafc;--color-secondary:#0ea5e9;--color-secondary-hover:#0284c7;--color-secondary-foreground:#f8fafc;--color-disabled:#94a3b8;--color-disabled-hover:#64748b;--color-focus-ring:var(--color-ring,#475569);--color-link:#2563eb;--color-success:#10b981;--color-warning:#f59e0b;--color-error:#d63384;--color-info:#06b6d4}.dark{--color-surface:#0f172a;--color-foreground:#f8fafc;--color-muted:#94a3b8;--color-border:#334155;--color-control-border:#94a3b8;--color-rule:#5b6a80;--color-backing:#1e293b;--color-primary:#7c3aed;--color-primary-hover:#8b5cf6;--color-primary-foreground:#f8fafc;--color-secondary:#0284c7;--color-secondary-hover:#0ea5e9;--color-secondary-foreground:#f8fafc;--color-disabled:#475569;--color-disabled-hover:#334155;--color-focus-ring:var(--color-ring,#cbd5e1);--color-link:#60a5fa;--color-success:#34d399;--color-warning:#fbbf24;--color-error:#f48fb1;--color-info:#22d3ee}:root{--motion-duration-color:.15s}@media (prefers-reduced-motion:reduce){:root{--motion-duration-color:0s}}:root{--focus-ring-width:3px;--focus-ring-offset:2px;--radius-control:.5rem;--underline-offset:.18em;--underline-thickness:1px;--underline-thickness-hover:2px;--measure:66ch;--measure-display:36ch;--measure-wide:72ch;--space-stack:.5em;--space-region:1.5em;--space-band:4em;--gutter:clamp(1.5rem, 5vw, 4rem);--fold-height:min(70vh, 40rem);--tick-length:.9rem;--tick-thickness:1px}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}
|
|
2
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-content:""}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-serif:ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--spacing:.25rem;--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--radius-lg:.5rem;--aspect-video:16 / 9;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-surface:var(--color-surface);--color-foreground:var(--color-foreground);--color-muted:var(--color-muted);--color-border:var(--color-border);--color-control-border:var(--color-control-border);--color-rule:var(--color-rule);--color-backing:var(--color-backing);--color-primary:var(--color-primary);--color-primary-hover:var(--color-primary-hover);--color-primary-foreground:var(--color-primary-foreground);--color-secondary:var(--color-secondary);--color-secondary-hover:var(--color-secondary-hover);--color-secondary-foreground:var(--color-secondary-foreground);--color-disabled:var(--color-disabled);--color-disabled-hover:var(--color-disabled-hover);--color-focus-ring:var(--color-focus-ring);--color-link:var(--color-link);--color-success:var(--color-success);--color-warning:var(--color-warning);--color-error:var(--color-error);--color-info:var(--color-info);--font-primary:inherit;--font-secondary:inherit;--text-display:clamp(3rem, 7vw, 6rem);--leading-display:1.05;--text-title:clamp(2.25rem, 5vw, 4.25rem);--leading-title:1.1;--text-subtitle:clamp(1.5rem, 3vw, 2.25rem);--leading-subtitle:1.2;--text-lede:1.25rem;--leading-lede:1.4;--text-body:1.0625rem;--leading-body:1.6;--text-small:.9375rem;--text-label:.8125rem;--tracking-label:.14em;--tracking-optical:-.02em;--aspect-portrait:4 / 5;--aspect-square:1 / 1;--aspect-landscape:3 / 2;--aspect-wide:16 / 9}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.fixed{position:fixed}.static{position:static}.sticky{position:sticky}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.m-0{margin:0}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.aspect-landscape{aspect-ratio:var(--aspect-landscape)}.aspect-portrait{aspect-ratio:var(--aspect-portrait)}.aspect-square{aspect-ratio:var(--aspect-square)}.aspect-wide{aspect-ratio:var(--aspect-wide)}.min-h-24{min-height:calc(var(--spacing) * 24)}.min-h-\[var\(--fold-height\)\]{min-height:var(--fold-height)}.w-full{width:100%}.max-w-\[var\(--measure\)\]{max-width:var(--measure)}.max-w-\[var\(--measure-wide\)\]{max-width:var(--measure-wide)}.min-w-0{min-width:0}.min-w-42{min-width:calc(var(--spacing) * 42)}.min-w-\[var\(--control-min-width\)\]{min-width:var(--control-min-width)}.grow{flex-grow:1}.cursor-pointer{cursor:pointer}.list-none{list-style-type:none}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-start{justify-content:flex-start}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-\[var\(--space-region\)\]{gap:var(--space-region)}.gap-\[var\(--space-stack\)\]{gap:var(--space-stack)}.rounded-\[var\(--radius-control\)\]{border-radius:var(--radius-control)}.rounded-\[var\(--radius-…\)\]{border-radius:var(--radius-…)}.rounded-lg{border-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-solid{--tw-border-style:solid;border-style:solid}.border-border{border-color:var(--color-border)}.border-control-border{border-color:var(--color-control-border)}.border-rule{border-color:var(--color-rule)}.bg-backing{background-color:var(--color-backing)}.bg-primary{background-color:var(--color-primary)}.bg-secondary{background-color:var(--color-secondary)}.bg-transparent{background-color:#0000}.object-cover{object-fit:cover}.object-bottom{object-position:bottom}.object-center{object-position:center}.object-left{object-position:left}.object-right{object-position:right}.object-top{object-position:top}.p-0{padding:0}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-\[var\(--gutter\)\]{padding-inline:var(--gutter)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-\[var\(--space-band\)\]{padding-block:var(--space-band)}.py-\[var\(--space-region\)\]{padding-block:var(--space-region)}.pt-1{padding-top:var(--spacing)}.pb-1{padding-bottom:var(--spacing)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-primary{font-family:var(--font-primary)}.font-secondary{font-family:var(--font-secondary)}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-body{font-size:var(--text-body)}.text-display{font-size:var(--text-display)}.text-label{font-size:var(--text-label)}.text-lede{font-size:var(--text-lede)}.text-small{font-size:var(--text-small)}.text-subtitle{font-size:var(--text-subtitle)}.text-title{font-size:var(--text-title)}.leading-body{--tw-leading:var(--leading-body);line-height:var(--leading-body)}.leading-display{--tw-leading:var(--leading-display);line-height:var(--leading-display)}.leading-lede{--tw-leading:var(--leading-lede);line-height:var(--leading-lede)}.leading-subtitle{--tw-leading:var(--leading-subtitle);line-height:var(--leading-subtitle)}.leading-title{--tw-leading:var(--leading-title);line-height:var(--leading-title)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-label{--tw-tracking:var(--tracking-label);letter-spacing:var(--tracking-label)}.tracking-optical{--tw-tracking:var(--tracking-optical);letter-spacing:var(--tracking-optical)}.text-nowrap{text-wrap:nowrap}.text-error{color:var(--color-error)}.text-foreground{color:var(--color-foreground)}.text-inherit{color:inherit}.text-link{color:var(--color-link)}.text-muted{color:var(--color-muted)}.text-primary-foreground{color:var(--color-primary-foreground)}.text-secondary-foreground{color:var(--color-secondary-foreground)}.text-success{color:var(--color-success)}.ordinal{--tw-ordinal:ordinal;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.decoration-\[length\:var\(--underline-thickness\)\]{text-decoration-thickness:var(--underline-thickness)}.underline-offset-\[var\(--underline-offset\)\]{text-underline-offset:var(--underline-offset)}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.outline-offset-\[var\(--focus-ring-offset\)\]{outline-offset:var(--focus-ring-offset)}.outline-focus-ring{outline-color:var(--color-focus-ring)}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-\[var\(--motion-duration-color\)\]{--tw-duration:var(--motion-duration-color);transition-duration:var(--motion-duration-color)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.before\:mt-\[0\.7em\]:before{content:var(--tw-content);margin-top:.7em}.before\:h-\[var\(--tick-thickness\)\]:before{content:var(--tw-content);height:var(--tick-thickness)}.before\:w-\[var\(--tick-length\)\]:before{content:var(--tw-content);width:var(--tick-length)}.before\:shrink-0:before{content:var(--tw-content);flex-shrink:0}.before\:bg-\[var\(--color-rule\)\]:before{content:var(--tw-content);background-color:var(--color-rule)}.before\:content-\[\'\'\]:before{--tw-content:"";content:var(--tw-content)}.first\:border-t:first-child{border-top-style:var(--tw-border-style);border-top-width:1px}.first\:pl-0:first-child{padding-left:0}.last\:pr-0:last-child{padding-right:0}@media (hover:hover){.hover\:bg-primary-hover:hover{background-color:var(--color-primary-hover)}.hover\:bg-secondary-hover:hover{background-color:var(--color-secondary-hover)}.hover\:text-foreground:hover{color:var(--color-foreground)}.hover\:underline:hover{text-decoration-line:underline}.hover\:decoration-\[length\:var\(--underline-thickness\)\]:hover{text-decoration-thickness:var(--underline-thickness)}.hover\:decoration-\[length\:var\(--underline-thickness-hover\)\]:hover{text-decoration-thickness:var(--underline-thickness-hover)}.hover\:underline-offset-\[var\(--underline-offset\)\]:hover{text-underline-offset:var(--underline-offset)}}.focus-visible\:outline:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-\[length\:var\(--focus-ring-width\)\]:focus-visible{outline-style:var(--tw-outline-style);outline-width:var(--focus-ring-width)}.focus-visible\:outline-focus-ring:focus-visible{outline-color:var(--color-focus-ring)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:border-disabled:disabled{border-color:var(--color-disabled)}.disabled\:bg-disabled:disabled{background-color:var(--color-disabled)}.disabled\:text-muted:disabled{color:var(--color-muted)}@media (hover:hover){.disabled\:hover\:bg-disabled-hover:disabled:hover{background-color:var(--color-disabled-hover)}}.aria-\[invalid\=true\]\:border-error[aria-invalid=true]{border-color:var(--color-error)}@media (width>=40rem){.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:py-2{padding-block:calc(var(--spacing) * 2)}}@media (width>=64rem){.lg\:sticky{position:sticky}.lg\:top-6{top:calc(var(--spacing) * 6)}.lg\:grid-cols-\[10rem_minmax\(0\,1fr\)\]{grid-template-columns:10rem minmax(0,1fr)}.lg\:grid-cols-\[16rem_minmax\(0\,1fr\)\]{grid-template-columns:16rem minmax(0,1fr)}.lg\:items-baseline{align-items:baseline}.lg\:items-start{align-items:flex-start}.lg\:gap-x-12{column-gap:calc(var(--spacing) * 12)}}.\[\&_\[aria-current\=page\]\]\:text-foreground [aria-current=page]{color:var(--color-foreground)}.\[\&_caption\]\:pb-3 caption{padding-bottom:calc(var(--spacing) * 3)}.\[\&_caption\]\:text-left caption{text-align:left}.\[\&_caption\]\:font-secondary caption{font-family:var(--font-secondary)}.\[\&_caption\]\:text-label caption{font-size:var(--text-label)}.\[\&_caption\]\:tracking-label caption{--tw-tracking:var(--tracking-label);letter-spacing:var(--tracking-label)}.\[\&_caption\]\:text-muted caption{color:var(--color-muted)}.\[\&\:not\(\:first-child\)\]\:mt-\[var\(--space-stack\)\]:not(:first-child){margin-top:var(--space-stack)}.\[\&\:not\(\:first-child\)\]\:border-t:not(:first-child){border-top-style:var(--tw-border-style);border-top-width:1px}.\[\&\:not\(\:first-child\)\]\:border-solid:not(:first-child){--tw-border-style:solid;border-style:solid}.\[\&\:not\(\:first-child\)\]\:border-border:not(:first-child){border-color:var(--color-border)}.\[\&\:not\(\:first-child\)\]\:pt-\[var\(--space-stack\)\]:not(:first-child){padding-top:var(--space-stack)}.\[\&\:not\(\[data-notes\]\)\]\:overflow-x-auto:not([data-notes]){overflow-x:auto}.\[\&\:user-invalid\]\:border-error:user-invalid{border-color:var(--color-error)}@media (width>=64rem){.lg\:\[\&\>dd\]\:col-start-2>dd{grid-column-start:2}.lg\:\[\&\>dd\]\:row-start-1>dd{grid-row-start:1}.lg\:\[\&\>dt\]\:col-start-1>dt{grid-column-start:1}}.\[\&\>table\]\:w-full>table{width:100%}.\[\&\>table\]\:border-collapse>table{border-collapse:collapse}.\[\&\>table\]\:text-left>table{text-align:left}.\[\&\>table\>\*\:nth-child\(2\)\>tr\:first-child\]\:border-rule>table>:nth-child(2)>tr:first-child{border-color:var(--color-rule)}@media not all and (width>=48rem){.\[\&\[data-notes\=content\]_tbody\]\:max-md\:block[data-notes=content] tbody,.\[\&\[data-notes\=content\]_td\]\:max-md\:block[data-notes=content] td,.\[\&\[data-notes\=content\]_tfoot\]\:max-md\:block[data-notes=content] tfoot,.\[\&\[data-notes\=content\]_th\]\:max-md\:block[data-notes=content] th,.\[\&\[data-notes\=content\]_thead\]\:max-md\:block[data-notes=content] thead,.\[\&\[data-notes\=content\]_tr\]\:max-md\:block[data-notes=content] tr,.\[\&\[data-notes\=content\]\>table\]\:max-md\:block[data-notes=content]>table{display:block}.\[\&\[data-notes\=supplementary\]_\[data-variant\=note\]\]\:max-md\:hidden[data-notes=supplementary] [data-variant=note]{display:none}}[data-section]+.\[\[data-section\]\+\&\]\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}[data-section]+.\[\[data-section\]\+\&\]\:border-solid{--tw-border-style:solid;border-style:solid}[data-section]+.\[\[data-section\]\+\&\]\:border-rule{border-color:var(--color-rule)}}:root{--color-surface:#fff;--color-foreground:#0f172a;--color-muted:#64748b;--color-border:#e2e8f0;--color-control-border:#64748b;--color-rule:#808fa3;--color-backing:#f1f5f9;--color-primary:#8b5cf6;--color-primary-hover:#7c3aed;--color-primary-foreground:#f8fafc;--color-secondary:#0ea5e9;--color-secondary-hover:#0284c7;--color-secondary-foreground:#f8fafc;--color-disabled:#94a3b8;--color-disabled-hover:#64748b;--color-focus-ring:var(--color-ring,#475569);--color-link:#2563eb;--color-success:#10b981;--color-warning:#f59e0b;--color-error:#d63384;--color-info:#06b6d4}.dark{--color-surface:#0f172a;--color-foreground:#f8fafc;--color-muted:#94a3b8;--color-border:#334155;--color-control-border:#94a3b8;--color-rule:#5b6a80;--color-backing:#1e293b;--color-primary:#7c3aed;--color-primary-hover:#8b5cf6;--color-primary-foreground:#f8fafc;--color-secondary:#0284c7;--color-secondary-hover:#0ea5e9;--color-secondary-foreground:#f8fafc;--color-disabled:#475569;--color-disabled-hover:#334155;--color-focus-ring:var(--color-ring,#cbd5e1);--color-link:#60a5fa;--color-success:#34d399;--color-warning:#fbbf24;--color-error:#f48fb1;--color-info:#22d3ee}:root{--motion-duration-color:.15s}@media (prefers-reduced-motion:reduce){:root{--motion-duration-color:0s}}:root{--focus-ring-width:3px;--focus-ring-offset:2px;--radius-control:.5rem;--control-min-width:10.5rem;--underline-offset:.18em;--underline-thickness:1px;--underline-thickness-hover:2px;--measure:66ch;--measure-display:36ch;--measure-wide:72ch;--space-stack:.5em;--space-region:1.5em;--space-band:4em;--gutter:clamp(1.5rem, 5vw, 4rem);--fold-height:min(70vh, 40rem);--tick-length:.9rem;--tick-thickness:1px}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}
|
|
@@ -18,6 +18,8 @@ interface IInputProps extends VariantProps<typeof input> {
|
|
|
18
18
|
hint?: string;
|
|
19
19
|
errorMessage?: string;
|
|
20
20
|
onInput$?: Subject<string>;
|
|
21
|
+
/** Emit to empty the control in place, keeping the same node so focus and IME composition survive. */
|
|
22
|
+
reset$?: Subject<void>;
|
|
21
23
|
testId?: string;
|
|
22
24
|
}
|
|
23
25
|
/**
|
|
@@ -14,6 +14,8 @@ interface ITextAreaProps {
|
|
|
14
14
|
hint?: string;
|
|
15
15
|
errorMessage?: string;
|
|
16
16
|
onInput$?: Subject<string>;
|
|
17
|
+
/** Emit to empty the control in place, keeping the same node so focus and IME composition survive. */
|
|
18
|
+
reset$?: Subject<void>;
|
|
17
19
|
testId?: string;
|
|
18
20
|
}
|
|
19
21
|
/**
|
|
@@ -1,6 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Renders the stylesheet form of the palette
|
|
3
|
-
* `
|
|
4
|
-
*
|
|
2
|
+
* Renders the combined stylesheet form of the palette: the light set in `:root`, the dark set under
|
|
3
|
+
* `.dark`, the `dark:` custom variant, then the shared colour map and non-colour tokens. This is
|
|
4
|
+
* the default `src/tokens.css`, unchanged by issue #62. Shared by the build script and the test that
|
|
5
|
+
* pins `src/tokens.css` to it, so a palette edit that was never regenerated fails the suite.
|
|
5
6
|
*/
|
|
6
7
|
export declare const renderTokens: () => string;
|
|
8
|
+
/**
|
|
9
|
+
* Renders the light-only variant (issue #62): the light set in `:root`, no `.dark` rule and no
|
|
10
|
+
* `dark:` variant, so a light-only consumer's bundle carries no dark theme it cannot remove. Pinned
|
|
11
|
+
* to `src/tokens.light.css` by the same regeneration test that pins {@link renderTokens}.
|
|
12
|
+
*/
|
|
13
|
+
export declare const renderLightTokens: () => string;
|
|
14
|
+
/**
|
|
15
|
+
* Renders the dark-only variant (issue #62): the dark set in `:root`, ungated since it is the only
|
|
16
|
+
* theme. A dark-only consumer imports this instead of the default. Pinned to `src/tokens.dark.css`
|
|
17
|
+
* by the same regeneration test that pins {@link renderTokens}.
|
|
18
|
+
*/
|
|
19
|
+
export declare const renderDarkTokens: () => string;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@juwel-development/design-system",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Shared design system: tokens and components.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -30,7 +30,11 @@
|
|
|
30
30
|
"default": "./dist/design-system.js"
|
|
31
31
|
},
|
|
32
32
|
"./styles.css": "./src/styles.css",
|
|
33
|
+
"./styles.light.css": "./src/styles.light.css",
|
|
34
|
+
"./styles.dark.css": "./src/styles.dark.css",
|
|
33
35
|
"./tokens.css": "./src/tokens.css",
|
|
36
|
+
"./tokens.light.css": "./src/tokens.light.css",
|
|
37
|
+
"./tokens.dark.css": "./src/tokens.dark.css",
|
|
34
38
|
"./package.json": "./package.json"
|
|
35
39
|
},
|
|
36
40
|
"scripts": {
|
|
@@ -16,9 +16,9 @@ const button = cva(
|
|
|
16
16
|
variants: {
|
|
17
17
|
variant: {
|
|
18
18
|
primary:
|
|
19
|
-
'px-4 sm:px-6 min-w-
|
|
19
|
+
'px-4 sm:px-6 min-w-[var(--control-min-width)] bg-primary text-primary-foreground hover:bg-primary-hover',
|
|
20
20
|
secondary:
|
|
21
|
-
'px-4 sm:px-6 min-w-
|
|
21
|
+
'px-4 sm:px-6 min-w-[var(--control-min-width)] bg-secondary text-secondary-foreground hover:bg-secondary-hover',
|
|
22
22
|
ghost:
|
|
23
23
|
'px-2 min-w-0 bg-transparent text-foreground hover:underline hover:decoration-[length:var(--underline-thickness)] hover:underline-offset-[var(--underline-offset)]',
|
|
24
24
|
},
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { VariantProps } from 'class-variance-authority';
|
|
2
2
|
import { cva } from 'class-variance-authority';
|
|
3
|
-
import { type FunctionComponent, useId } from 'react';
|
|
3
|
+
import { type FunctionComponent, useEffect, useId, useRef } from 'react';
|
|
4
4
|
import type { Subject } from 'rxjs';
|
|
5
5
|
|
|
6
6
|
// One recipe, deliberately not shared with TextArea (issue #5): each control owns its whole recipe
|
|
@@ -35,6 +35,8 @@ interface IInputProps extends VariantProps<typeof input> {
|
|
|
35
35
|
hint?: string;
|
|
36
36
|
errorMessage?: string;
|
|
37
37
|
onInput$?: Subject<string>;
|
|
38
|
+
/** Emit to empty the control in place, keeping the same node so focus and IME composition survive. */
|
|
39
|
+
reset$?: Subject<void>;
|
|
38
40
|
testId?: string;
|
|
39
41
|
}
|
|
40
42
|
|
|
@@ -56,6 +58,7 @@ export const Input: FunctionComponent<IInputProps> = ({
|
|
|
56
58
|
hint,
|
|
57
59
|
errorMessage,
|
|
58
60
|
onInput$,
|
|
61
|
+
reset$,
|
|
59
62
|
testId,
|
|
60
63
|
}) => {
|
|
61
64
|
const id = useId();
|
|
@@ -67,12 +70,26 @@ export const Input: FunctionComponent<IInputProps> = ({
|
|
|
67
70
|
.filter(Boolean)
|
|
68
71
|
.join(' ') || undefined;
|
|
69
72
|
|
|
73
|
+
// reset$ is an inbound command, so the component subscribes here (coding.md#asynchrony), unlike
|
|
74
|
+
// onInput$ which it emits on. Emptying the live node keeps focus and any in-flight IME composition,
|
|
75
|
+
// which a `key` remount would discard (issue #64).
|
|
76
|
+
const controlRef = useRef<HTMLInputElement>(null);
|
|
77
|
+
useEffect(() => {
|
|
78
|
+
const subscription = reset$?.subscribe(() => {
|
|
79
|
+
if (controlRef.current) {
|
|
80
|
+
controlRef.current.value = '';
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
return () => subscription?.unsubscribe();
|
|
84
|
+
}, [reset$]);
|
|
85
|
+
|
|
70
86
|
return (
|
|
71
87
|
<div className={'flex flex-col gap-[var(--space-stack)]'}>
|
|
72
88
|
<label htmlFor={controlId} className={'font-medium text-foreground'}>
|
|
73
89
|
{label}
|
|
74
90
|
</label>
|
|
75
91
|
<input
|
|
92
|
+
ref={controlRef}
|
|
76
93
|
id={controlId}
|
|
77
94
|
name={name}
|
|
78
95
|
type={variant ?? 'text'}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { cva } from 'class-variance-authority';
|
|
2
|
-
import { type FunctionComponent, useId } from 'react';
|
|
2
|
+
import { type FunctionComponent, useEffect, useId, useRef } from 'react';
|
|
3
3
|
import type { Subject } from 'rxjs';
|
|
4
4
|
|
|
5
5
|
// One recipe, deliberately not shared with Input (issue #5): each control owns its whole recipe so
|
|
@@ -27,6 +27,8 @@ interface ITextAreaProps {
|
|
|
27
27
|
hint?: string;
|
|
28
28
|
errorMessage?: string;
|
|
29
29
|
onInput$?: Subject<string>;
|
|
30
|
+
/** Emit to empty the control in place, keeping the same node so focus and IME composition survive. */
|
|
31
|
+
reset$?: Subject<void>;
|
|
30
32
|
testId?: string;
|
|
31
33
|
}
|
|
32
34
|
|
|
@@ -47,6 +49,7 @@ export const TextArea: FunctionComponent<ITextAreaProps> = ({
|
|
|
47
49
|
hint,
|
|
48
50
|
errorMessage,
|
|
49
51
|
onInput$,
|
|
52
|
+
reset$,
|
|
50
53
|
testId,
|
|
51
54
|
}) => {
|
|
52
55
|
const id = useId();
|
|
@@ -58,12 +61,26 @@ export const TextArea: FunctionComponent<ITextAreaProps> = ({
|
|
|
58
61
|
.filter(Boolean)
|
|
59
62
|
.join(' ') || undefined;
|
|
60
63
|
|
|
64
|
+
// reset$ is an inbound command, so the component subscribes here (coding.md#asynchrony), unlike
|
|
65
|
+
// onInput$ which it emits on. Emptying the live node keeps focus and any in-flight IME composition,
|
|
66
|
+
// which a `key` remount would discard (issue #64).
|
|
67
|
+
const controlRef = useRef<HTMLTextAreaElement>(null);
|
|
68
|
+
useEffect(() => {
|
|
69
|
+
const subscription = reset$?.subscribe(() => {
|
|
70
|
+
if (controlRef.current) {
|
|
71
|
+
controlRef.current.value = '';
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
return () => subscription?.unsubscribe();
|
|
75
|
+
}, [reset$]);
|
|
76
|
+
|
|
61
77
|
return (
|
|
62
78
|
<div className={'flex flex-col gap-[var(--space-stack)]'}>
|
|
63
79
|
<label htmlFor={controlId} className={'font-medium text-foreground'}>
|
|
64
80
|
{label}
|
|
65
81
|
</label>
|
|
66
82
|
<textarea
|
|
83
|
+
ref={controlRef}
|
|
67
84
|
id={controlId}
|
|
68
85
|
name={name}
|
|
69
86
|
className={textArea()}
|
|
@@ -7,6 +7,18 @@ const GENERATED_HEADER = `/* GENERATED from src/Theme/Palette.ts by \`npm run bu
|
|
|
7
7
|
* values inside @theme directly would freeze them at build time and the .dark overrides would
|
|
8
8
|
* never reach the utilities. */`;
|
|
9
9
|
|
|
10
|
+
const GENERATED_LIGHT_HEADER = `/* GENERATED from src/Theme/Palette.ts by \`npm run build:tokens\` - do not edit by hand.
|
|
11
|
+
*
|
|
12
|
+
* The light-only variant (issue #62): the light values live in :root and the @theme inline block
|
|
13
|
+
* maps each onto a Tailwind colour. It carries no dark rule, so a light-only consumer imports it
|
|
14
|
+
* instead of tokens.css and bundles no second theme it cannot remove. */`;
|
|
15
|
+
|
|
16
|
+
const GENERATED_DARK_HEADER = `/* GENERATED from src/Theme/Palette.ts by \`npm run build:tokens\` - do not edit by hand.
|
|
17
|
+
*
|
|
18
|
+
* The dark-only variant (issue #62): the dark values live in :root, ungated, and the @theme inline
|
|
19
|
+
* block maps each onto a Tailwind colour. A dark-only consumer imports it instead of tokens.css; it
|
|
20
|
+
* is the only theme, so no class toggle or variant is needed to select it. */`;
|
|
21
|
+
|
|
10
22
|
/* The library performs exactly one motion - a colour transition - so its motion contract is this
|
|
11
23
|
single token. 150ms matches Tailwind's default, so it changes nothing visually; its job is to
|
|
12
24
|
have a name a consumer theme and the reduced-motion query can reach.
|
|
@@ -40,6 +52,15 @@ const RADIUS = `:root {
|
|
|
40
52
|
--radius-control: 0.5rem;
|
|
41
53
|
}`;
|
|
42
54
|
|
|
55
|
+
/* The control's minimum width is not a colour: like radius it lives in :root only, never in
|
|
56
|
+
@theme inline, so a consumer theme can re-point it. One token names the floor primary and
|
|
57
|
+
secondary share; 10.5rem is exactly what min-w-42 resolved to, so nothing changes visually while
|
|
58
|
+
it keeps tracking the root font size. ghost owns a distinct zero - an intentional role, not this
|
|
59
|
+
token set to 0 - so it keeps its literal min-w-0 and does not read this. */
|
|
60
|
+
const CONTROL_MIN_WIDTH = `:root {
|
|
61
|
+
--control-min-width: 10.5rem;
|
|
62
|
+
}`;
|
|
63
|
+
|
|
43
64
|
/* The library's underline is not a colour: like the focus-ring dimensions it lives in :root only,
|
|
44
65
|
never @theme inline. Not prose's alone - every Link treatment that draws a line draws it from these.
|
|
45
66
|
Constraint: --underline-thickness-hover > --underline-thickness (the thicken on hover is the only
|
|
@@ -172,36 +193,23 @@ const declarations = (
|
|
|
172
193
|
.map((name) => ` --color-${toKebabCase(name)}: ${value(name)};`)
|
|
173
194
|
.join('\n');
|
|
174
195
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
// test checks. See docs/adr/0002-focus-ring-token-contract.md.
|
|
184
|
-
const raw = (tokens: PaletteTokens) => (name: string) => {
|
|
185
|
-
const value = tokens[name as keyof PaletteTokens];
|
|
186
|
-
return name === 'focusRing' ? `var(--color-ring, ${value})` : value;
|
|
187
|
-
};
|
|
188
|
-
const reference = () => (name: string) => `var(--color-${toKebabCase(name)})`;
|
|
189
|
-
|
|
190
|
-
return `${GENERATED_HEADER}
|
|
191
|
-
|
|
192
|
-
/* Dark mode is driven by a \`.dark\` class rather than prefers-color-scheme, so a story or a
|
|
193
|
-
screenshot can be taken under either theme on demand. */
|
|
194
|
-
@custom-variant dark (&:where(.dark, .dark *));
|
|
195
|
-
|
|
196
|
-
:root {
|
|
197
|
-
${declarations(light, raw(light))}
|
|
198
|
-
}
|
|
196
|
+
// The library no longer declares --color-ring but still reads it as a fallback, so a consumer's
|
|
197
|
+
// existing value keeps working; the plain hex in the palette is the default and what the contrast
|
|
198
|
+
// test checks. See docs/adr/0002-focus-ring-token-contract.md.
|
|
199
|
+
const raw = (tokens: PaletteTokens) => (name: string) => {
|
|
200
|
+
const value = tokens[name as keyof PaletteTokens];
|
|
201
|
+
return name === 'focusRing' ? `var(--color-ring, ${value})` : value;
|
|
202
|
+
};
|
|
203
|
+
const reference = () => (name: string) => `var(--color-${toKebabCase(name)})`;
|
|
199
204
|
|
|
200
|
-
.dark
|
|
201
|
-
|
|
202
|
-
|
|
205
|
+
// Only the combined tokens.css carries the dark set; this gates it behind .dark and defines dark:.
|
|
206
|
+
const DARK_VARIANT = `/* Dark mode is driven by a \`.dark\` class rather than prefers-color-scheme, so a story or a
|
|
207
|
+
screenshot can be taken under either theme on demand. */
|
|
208
|
+
@custom-variant dark (&:where(.dark, .dark *));`;
|
|
203
209
|
|
|
204
|
-
@theme inline
|
|
210
|
+
// The @theme inline colour map and every non-colour token block: identical across all three
|
|
211
|
+
// variants, since the map references the role variables :root declares rather than any hex.
|
|
212
|
+
const colourMapAndTail = (): string => `@theme inline {
|
|
205
213
|
${declarations(light, reference())}
|
|
206
214
|
}
|
|
207
215
|
|
|
@@ -214,6 +222,9 @@ ${FOCUS_RING}
|
|
|
214
222
|
/* Radius is not a colour either: one token for the corner every control reads, beside the others. */
|
|
215
223
|
${RADIUS}
|
|
216
224
|
|
|
225
|
+
/* The control minimum width is not a colour either, and sits in :root beside radius. */
|
|
226
|
+
${CONTROL_MIN_WIDTH}
|
|
227
|
+
|
|
217
228
|
/* The library's underline dimensions are not colours either, and sit in :root beside radius. They are
|
|
218
229
|
not prose's alone: every Link treatment that draws a line draws it from these (docs/adr/0006). */
|
|
219
230
|
${UNDERLINE}
|
|
@@ -242,4 +253,53 @@ ${FOLD}
|
|
|
242
253
|
/* The checklist tick's dimensions are not colours either, and sit in :root beside the underline block. */
|
|
243
254
|
${TICK}
|
|
244
255
|
`;
|
|
245
|
-
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Renders the combined stylesheet form of the palette: the light set in `:root`, the dark set under
|
|
259
|
+
* `.dark`, the `dark:` custom variant, then the shared colour map and non-colour tokens. This is
|
|
260
|
+
* the default `src/tokens.css`, unchanged by issue #62. Shared by the build script and the test that
|
|
261
|
+
* pins `src/tokens.css` to it, so a palette edit that was never regenerated fails the suite.
|
|
262
|
+
*/
|
|
263
|
+
export const renderTokens = (): string => `${GENERATED_HEADER}
|
|
264
|
+
|
|
265
|
+
${DARK_VARIANT}
|
|
266
|
+
|
|
267
|
+
:root {
|
|
268
|
+
${declarations(light, raw(light))}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
.dark {
|
|
272
|
+
${declarations(dark, raw(dark))}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
${colourMapAndTail()}`;
|
|
276
|
+
|
|
277
|
+
/* The single-theme variants (issue #62) share one shape: the chosen set unconditionally in `:root`,
|
|
278
|
+
then the shared colour map and non-colour tokens - no `.dark` rule and no `dark:` variant. They
|
|
279
|
+
differ only in header and which palette set lands in `:root`, so both render through here. */
|
|
280
|
+
const renderSingleTheme = (
|
|
281
|
+
header: string,
|
|
282
|
+
tokens: PaletteTokens,
|
|
283
|
+
): string => `${header}
|
|
284
|
+
|
|
285
|
+
:root {
|
|
286
|
+
${declarations(tokens, raw(tokens))}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
${colourMapAndTail()}`;
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Renders the light-only variant (issue #62): the light set in `:root`, no `.dark` rule and no
|
|
293
|
+
* `dark:` variant, so a light-only consumer's bundle carries no dark theme it cannot remove. Pinned
|
|
294
|
+
* to `src/tokens.light.css` by the same regeneration test that pins {@link renderTokens}.
|
|
295
|
+
*/
|
|
296
|
+
export const renderLightTokens = (): string =>
|
|
297
|
+
renderSingleTheme(GENERATED_LIGHT_HEADER, light);
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* Renders the dark-only variant (issue #62): the dark set in `:root`, ungated since it is the only
|
|
301
|
+
* theme. A dark-only consumer imports this instead of the default. Pinned to `src/tokens.dark.css`
|
|
302
|
+
* by the same regeneration test that pins {@link renderTokens}.
|
|
303
|
+
*/
|
|
304
|
+
export const renderDarkTokens = (): string =>
|
|
305
|
+
renderSingleTheme(GENERATED_DARK_HEADER, dark);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/* Component-level styles for the design system, dark theme only (issue #62). */
|
|
2
|
+
@import "tailwindcss";
|
|
3
|
+
@import "./tokens.dark.css";
|
|
4
|
+
|
|
5
|
+
/* Scan the component sources explicitly so their utilities are generated no matter
|
|
6
|
+
which host imports this stylesheet. Tailwind's automatic content detection is
|
|
7
|
+
anchored to the consumer and skips node_modules, so a host pulling the components
|
|
8
|
+
in through a package would otherwise render them unstyled. */
|
|
9
|
+
@source ".";
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/* Component-level styles for the design system, light theme only (issue #62). */
|
|
2
|
+
@import "tailwindcss";
|
|
3
|
+
@import "./tokens.light.css";
|
|
4
|
+
|
|
5
|
+
/* Scan the component sources explicitly so their utilities are generated no matter
|
|
6
|
+
which host imports this stylesheet. Tailwind's automatic content detection is
|
|
7
|
+
anchored to the consumer and skips node_modules, so a host pulling the components
|
|
8
|
+
in through a package would otherwise render them unstyled. */
|
|
9
|
+
@source ".";
|
package/src/tokens.css
CHANGED
|
@@ -105,6 +105,11 @@
|
|
|
105
105
|
--radius-control: 0.5rem;
|
|
106
106
|
}
|
|
107
107
|
|
|
108
|
+
/* The control minimum width is not a colour either, and sits in :root beside radius. */
|
|
109
|
+
:root {
|
|
110
|
+
--control-min-width: 10.5rem;
|
|
111
|
+
}
|
|
112
|
+
|
|
108
113
|
/* The library's underline dimensions are not colours either, and sit in :root beside radius. They are
|
|
109
114
|
not prose's alone: every Link treatment that draws a line draws it from these (docs/adr/0006). */
|
|
110
115
|
:root {
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/* GENERATED from src/Theme/Palette.ts by `npm run build:tokens` - do not edit by hand.
|
|
2
|
+
*
|
|
3
|
+
* The dark-only variant (issue #62): the dark values live in :root, ungated, and the @theme inline
|
|
4
|
+
* block maps each onto a Tailwind colour. A dark-only consumer imports it instead of tokens.css; it
|
|
5
|
+
* is the only theme, so no class toggle or variant is needed to select it. */
|
|
6
|
+
|
|
7
|
+
:root {
|
|
8
|
+
--color-surface: #0f172a;
|
|
9
|
+
--color-foreground: #f8fafc;
|
|
10
|
+
--color-muted: #94a3b8;
|
|
11
|
+
--color-border: #334155;
|
|
12
|
+
--color-control-border: #94a3b8;
|
|
13
|
+
--color-rule: #5b6a80;
|
|
14
|
+
--color-backing: #1e293b;
|
|
15
|
+
--color-primary: #7c3aed;
|
|
16
|
+
--color-primary-hover: #8b5cf6;
|
|
17
|
+
--color-primary-foreground: #f8fafc;
|
|
18
|
+
--color-secondary: #0284c7;
|
|
19
|
+
--color-secondary-hover: #0ea5e9;
|
|
20
|
+
--color-secondary-foreground: #f8fafc;
|
|
21
|
+
--color-disabled: #475569;
|
|
22
|
+
--color-disabled-hover: #334155;
|
|
23
|
+
--color-focus-ring: var(--color-ring, #cbd5e1);
|
|
24
|
+
--color-link: #60a5fa;
|
|
25
|
+
--color-success: #34d399;
|
|
26
|
+
--color-warning: #fbbf24;
|
|
27
|
+
--color-error: #f48fb1;
|
|
28
|
+
--color-info: #22d3ee;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
@theme inline {
|
|
32
|
+
--color-surface: var(--color-surface);
|
|
33
|
+
--color-foreground: var(--color-foreground);
|
|
34
|
+
--color-muted: var(--color-muted);
|
|
35
|
+
--color-border: var(--color-border);
|
|
36
|
+
--color-control-border: var(--color-control-border);
|
|
37
|
+
--color-rule: var(--color-rule);
|
|
38
|
+
--color-backing: var(--color-backing);
|
|
39
|
+
--color-primary: var(--color-primary);
|
|
40
|
+
--color-primary-hover: var(--color-primary-hover);
|
|
41
|
+
--color-primary-foreground: var(--color-primary-foreground);
|
|
42
|
+
--color-secondary: var(--color-secondary);
|
|
43
|
+
--color-secondary-hover: var(--color-secondary-hover);
|
|
44
|
+
--color-secondary-foreground: var(--color-secondary-foreground);
|
|
45
|
+
--color-disabled: var(--color-disabled);
|
|
46
|
+
--color-disabled-hover: var(--color-disabled-hover);
|
|
47
|
+
--color-focus-ring: var(--color-focus-ring);
|
|
48
|
+
--color-link: var(--color-link);
|
|
49
|
+
--color-success: var(--color-success);
|
|
50
|
+
--color-warning: var(--color-warning);
|
|
51
|
+
--color-error: var(--color-error);
|
|
52
|
+
--color-info: var(--color-info);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/* Motion is not a colour: it is carried in :root only, never mapped into @theme inline. */
|
|
56
|
+
:root {
|
|
57
|
+
--motion-duration-color: 150ms;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/* Honour prefers-reduced-motion for the one motion the library performs, by re-pointing the token
|
|
61
|
+
to 0ms. Deliberately no blanket transition reset - only what the library performs is zeroed. */
|
|
62
|
+
@media (prefers-reduced-motion: reduce) {
|
|
63
|
+
:root {
|
|
64
|
+
--motion-duration-color: 0ms;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/* The focus ring's dimensions are not colours either, and sit in :root beside the motion block. */
|
|
69
|
+
:root {
|
|
70
|
+
--focus-ring-width: 3px;
|
|
71
|
+
--focus-ring-offset: 2px;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/* Radius is not a colour either: one token for the corner every control reads, beside the others. */
|
|
75
|
+
:root {
|
|
76
|
+
--radius-control: 0.5rem;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/* The control minimum width is not a colour either, and sits in :root beside radius. */
|
|
80
|
+
:root {
|
|
81
|
+
--control-min-width: 10.5rem;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/* The library's underline dimensions are not colours either, and sit in :root beside radius. They are
|
|
85
|
+
not prose's alone: every Link treatment that draws a line draws it from these (docs/adr/0006). */
|
|
86
|
+
:root {
|
|
87
|
+
--underline-offset: 0.18em;
|
|
88
|
+
--underline-thickness: 1px;
|
|
89
|
+
--underline-thickness-hover: 2px;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/* Typography is a set of Tailwind theme namespaces, not colours: its own @theme block generates the
|
|
93
|
+
utilities, so it is not carried in @theme inline with the palette. */
|
|
94
|
+
@theme {
|
|
95
|
+
/* Both faces default to inherit, so the library ships no @font-face and no face and a one-face
|
|
96
|
+
consumer renders as today. --font-primary is carried by content, --font-secondary by labels; a
|
|
97
|
+
component sets font-variant-numeric: tabular-nums only on a --font-primary carrying tnum and
|
|
98
|
+
font-variant-caps: small-caps only on a --font-secondary carrying smcp - both fail silently otherwise. */
|
|
99
|
+
--font-primary: inherit;
|
|
100
|
+
--font-secondary: inherit;
|
|
101
|
+
|
|
102
|
+
/* Type roles, not a scale: one role per job, so a component asks for what its text is, never a rung.
|
|
103
|
+
display > title > subtitle are the three heading steps H1-H3 bind to; H4-H6 share body and split
|
|
104
|
+
by weight, so there is no fourth role. display is the hero and must out-scale every subpage head. */
|
|
105
|
+
--text-display: clamp(3rem, 7vw, 6rem);
|
|
106
|
+
--leading-display: 1.05;
|
|
107
|
+
--text-title: clamp(2.25rem, 5vw, 4.25rem);
|
|
108
|
+
--leading-title: 1.1;
|
|
109
|
+
--text-subtitle: clamp(1.5rem, 3vw, 2.25rem);
|
|
110
|
+
--leading-subtitle: 1.2;
|
|
111
|
+
|
|
112
|
+
/* The reading block's opening paragraph (Prose #21): sized above body and below subtitle, led
|
|
113
|
+
tighter than body's 1.6 but not as tight as a heading's 1.2 - it is running text, not a head, so
|
|
114
|
+
it keeps running-text leading. A role, not a rung: one lede per block, nothing to choose. Reusing
|
|
115
|
+
subtitle was rejected in ADR 0004 - it welds the lede's size to H3's and its leading to a head's. */
|
|
116
|
+
--text-lede: 1.25rem; /* 20px */
|
|
117
|
+
--leading-lede: 1.4;
|
|
118
|
+
--text-body: 1.0625rem; /* 17px */
|
|
119
|
+
--leading-body: 1.6;
|
|
120
|
+
--text-small: 0.9375rem; /* 15px floor: below it tabular figures stop comparing column to column */
|
|
121
|
+
--text-label: 0.8125rem; /* 13px floor: below it the tracking reads as damage, not a device */
|
|
122
|
+
|
|
123
|
+
/* Two quantities on one property that must not collapse: --tracking-label is a fixed letter-spaced
|
|
124
|
+
style, --tracking-optical a correction that varies with size. The names say which is which, so the
|
|
125
|
+
distinction survives without the ADR in hand. Scope: the title role and above - H1, H2 and the page
|
|
126
|
+
head's h1 - and never below it, where the correction would read as damage. See the ADR. */
|
|
127
|
+
--tracking-label: 0.14em;
|
|
128
|
+
--tracking-optical: -0.02em;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/* The aspect roles are Tailwind theme namespaces like typography, so they take their own @theme block
|
|
132
|
+
after it and are not carried in @theme inline with the palette. */
|
|
133
|
+
@theme {
|
|
134
|
+
--aspect-portrait: 4 / 5;
|
|
135
|
+
--aspect-square: 1 / 1;
|
|
136
|
+
--aspect-landscape: 3 / 2;
|
|
137
|
+
--aspect-wide: 16 / 9;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/* The reading measure has no Tailwind namespace, so it sits in :root beside radius. */
|
|
141
|
+
:root {
|
|
142
|
+
--measure: 66ch;
|
|
143
|
+
--measure-display: 36ch;
|
|
144
|
+
--measure-wide: 72ch;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/* Spacing has no Tailwind namespace either - --spacing is a single base multiplier ADR 0004 forbids
|
|
148
|
+
re-pointing - so the three roles sit in :root beside the measure. */
|
|
149
|
+
:root {
|
|
150
|
+
--space-stack: 0.5em;
|
|
151
|
+
--space-region: 1.5em;
|
|
152
|
+
--space-band: 4em;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/* The gutter has no Tailwind namespace either, so it sits in :root beside the space roles. */
|
|
156
|
+
:root {
|
|
157
|
+
--gutter: clamp(1.5rem, 5vw, 4rem);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/* The fold height has no Tailwind namespace either, so it sits in :root beside the gutter. */
|
|
161
|
+
:root {
|
|
162
|
+
--fold-height: min(70vh, 40rem);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/* The checklist tick's dimensions are not colours either, and sit in :root beside the underline block. */
|
|
166
|
+
:root {
|
|
167
|
+
--tick-length: 0.9rem;
|
|
168
|
+
--tick-thickness: 1px;
|
|
169
|
+
}
|