@relements/core 0.1.2 → 0.2.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 CHANGED
@@ -68,6 +68,14 @@ All styled with CSS classes and `data-*` attributes. No JavaScript needed for st
68
68
  | `.re-toast-region` | live region host | — |
69
69
  | `.re-progress` | `<progress>` | `data-size`: sm, md, lg |
70
70
  | `.re-meter` | `<meter>` | `data-size`: sm, md, lg |
71
+ | `.re-alert` | `<div>` + `role` | `data-variant`: info, success, warning, danger; dismissible |
72
+ | `.re-badge` | `<span>` | `data-variant`: neutral, info, success, warning, danger |
73
+ | `.re-card` | `<article>` | `__header` / `__body` / `__footer`; `data-interactive` |
74
+ | `.re-tag` | `<span>` | `data-variant`: neutral, info, success, warning, danger; removable |
75
+ | `.re-avatar` | `<span>` | `data-size`: sm, md, lg; `<img>` or initials |
76
+ | `.re-breadcrumb` | `<nav>` / `<ol>` | `aria-current="page"` on current |
77
+ | `.re-accordion` | `<details name>` group | native single-open; wraps `.re-disclosure` |
78
+ | `.re-switch` | `<input type="checkbox">` | `role="switch"`; `:checked`, `:disabled` |
71
79
 
72
80
  ## JavaScript behaviors
73
81
 
@@ -0,0 +1 @@
1
+ @layer re.components{.re-accordion{border:var(--re-border-default);border-radius:var(--re-radius-md);flex-direction:column;display:flex;overflow:hidden}.re-accordion>.re-disclosure{border-width:0;border-radius:0}.re-accordion>.re-disclosure+.re-disclosure{border-block-start:var(--re-border-default)}}
@@ -0,0 +1 @@
1
+ @layer re.components{.re-alert{align-items:flex-start;gap:var(--re-space-3);padding:var(--re-space-3) var(--re-space-4);border:var(--re-border-width) solid var(--re-color-info-border);border-radius:var(--re-radius-md);background-color:var(--re-color-info-surface);color:var(--re-color-text);line-height:var(--re-line-height-normal);display:flex}.re-alert__content{flex:auto;min-inline-size:0}.re-alert__title{margin:0 0 var(--re-space-1);font-weight:var(--re-font-weight-semibold);color:var(--re-color-info-text)}.re-alert__dismiss{appearance:none;cursor:pointer;padding:var(--re-space-1) var(--re-space-2);border-radius:var(--re-radius-sm);font-size:var(--re-size-text-lg);color:var(--re-color-text-muted);background:0 0;border:0;flex-shrink:0;line-height:1}.re-alert__dismiss:hover{color:var(--re-color-text);background:color-mix(in oklab, var(--re-color-text) 10%, transparent)}.re-alert__dismiss:focus-visible{box-shadow:var(--re-shadow-focus);outline:none}.re-alert[data-variant=success]{border-color:var(--re-color-success-border);background-color:var(--re-color-success-surface)}.re-alert[data-variant=success] .re-alert__title{color:var(--re-color-success-text)}.re-alert[data-variant=warning]{border-color:var(--re-color-warning-border);background-color:var(--re-color-warning-surface)}.re-alert[data-variant=warning] .re-alert__title{color:var(--re-color-warning-text)}.re-alert[data-variant=danger]{border-color:var(--re-color-danger-border);background-color:var(--re-color-danger-surface)}.re-alert[data-variant=danger] .re-alert__title{color:var(--re-color-danger-text)}}
@@ -0,0 +1 @@
1
+ @layer re.components{.re-avatar{inline-size:var(--re-control-height-md);block-size:var(--re-control-height-md);border-radius:var(--re-radius-pill);background-color:var(--re-color-bg-muted);color:var(--re-color-text-muted);font-size:var(--re-size-text-sm);font-weight:var(--re-font-weight-medium);text-transform:uppercase;-webkit-user-select:none;user-select:none;flex-shrink:0;justify-content:center;align-items:center;line-height:1;display:inline-flex;overflow:hidden}.re-avatar>img{object-fit:cover;block-size:100%;inline-size:100%}.re-avatar[data-size=sm]{inline-size:var(--re-control-height-sm);block-size:var(--re-control-height-sm);font-size:var(--re-size-text-xs)}.re-avatar[data-size=lg]{inline-size:var(--re-control-height-lg);block-size:var(--re-control-height-lg);font-size:var(--re-size-text-md)}}
@@ -0,0 +1 @@
1
+ @layer re.components{.re-badge{align-items:center;gap:var(--re-space-1);padding-inline:var(--re-space-2);padding-block:calc(var(--re-space-1) / 2);font-size:var(--re-size-text-xs);font-weight:var(--re-font-weight-medium);white-space:nowrap;border-radius:var(--re-radius-pill);background-color:var(--re-color-bg-muted);color:var(--re-color-text-muted);line-height:1.4;display:inline-flex}.re-badge[data-variant=info]{background-color:var(--re-color-info-surface);color:var(--re-color-info-text)}.re-badge[data-variant=success]{background-color:var(--re-color-success-surface);color:var(--re-color-success-text)}.re-badge[data-variant=warning]{background-color:var(--re-color-warning-surface);color:var(--re-color-warning-text)}.re-badge[data-variant=danger]{background-color:var(--re-color-danger-surface);color:var(--re-color-danger-text)}}
@@ -0,0 +1 @@
1
+ @layer re.components{.re-breadcrumb>ol{align-items:center;gap:var(--re-space-2);font-size:var(--re-size-text-sm);color:var(--re-color-text-muted);flex-wrap:wrap;margin:0;padding:0;list-style:none;display:flex}.re-breadcrumb li{align-items:center;gap:var(--re-space-2);display:inline-flex}.re-breadcrumb li+li:before{content:"/";color:var(--re-color-text-subtle);-webkit-user-select:none;user-select:none}.re-breadcrumb a{color:var(--re-color-link);border-radius:var(--re-radius-sm);text-decoration:none}.re-breadcrumb a:hover{text-decoration:underline}.re-breadcrumb a:focus-visible{box-shadow:var(--re-shadow-focus);outline:none}.re-breadcrumb [aria-current=page]{color:var(--re-color-text);font-weight:var(--re-font-weight-medium);pointer-events:none;text-decoration:none}}
@@ -0,0 +1 @@
1
+ @layer re.components{.re-card{background-color:var(--re-color-surface);border:var(--re-border-default);border-radius:var(--re-radius-lg);box-shadow:var(--re-shadow-sm);color:var(--re-color-text);flex-direction:column;display:flex;overflow:hidden}a.re-card{text-decoration:none}.re-card__header{padding:var(--re-space-4);font-weight:var(--re-font-weight-semibold);border-block-end:var(--re-border-default)}.re-card__body{padding:var(--re-space-4);line-height:var(--re-line-height-normal)}.re-card__footer{padding:var(--re-space-3) var(--re-space-4);border-block-start:var(--re-border-default);background-color:var(--re-color-bg-subtle)}.re-card[data-interactive]{cursor:pointer;transition:box-shadow var(--re-duration-fast) var(--re-easing-standard), border-color var(--re-duration-fast) var(--re-easing-standard)}.re-card[data-interactive]:hover{box-shadow:var(--re-shadow-md);border-color:var(--re-color-border-strong)}.re-card[data-interactive]:focus-within{box-shadow:var(--re-shadow-focus);outline:none}}
@@ -0,0 +1 @@
1
+ @layer re.components{.re-switch{appearance:none;box-sizing:border-box;border:var(--re-border-width) solid var(--re-color-border-strong);border-radius:var(--re-radius-pill);background-color:var(--re-color-bg-muted);cursor:pointer;vertical-align:middle;block-size:1.25rem;inline-size:2.25rem;transition:background-color var(--re-duration-fast) var(--re-easing-standard), border-color var(--re-duration-fast) var(--re-easing-standard);flex-shrink:0;margin:0;position:relative}.re-switch:before{content:"";border-radius:var(--re-radius-pill);background-color:var(--re-color-surface);block-size:.875rem;inline-size:.875rem;box-shadow:var(--re-shadow-sm);transition:transform var(--re-duration-fast) var(--re-easing-standard);position:absolute;inset-block-start:2px;inset-inline-start:2px}.re-switch:checked{background-color:var(--re-color-accent-600);border-color:var(--re-color-accent-600)}.re-switch:checked:before{transform:translate(1rem)}.re-switch:focus-visible{box-shadow:var(--re-shadow-focus);outline:none}.re-switch:disabled{cursor:not-allowed;opacity:.55}}
@@ -0,0 +1 @@
1
+ @layer re.components{.re-tag{align-items:center;gap:var(--re-space-1);padding-inline:var(--re-space-2);padding-block:calc(var(--re-space-1) / 2);font-size:var(--re-size-text-xs);white-space:nowrap;border:var(--re-border-width) solid var(--re-color-border);border-radius:var(--re-radius-pill);background-color:var(--re-color-bg-subtle);color:var(--re-color-text);line-height:1.4;display:inline-flex}.re-tag__remove{appearance:none;border-radius:var(--re-radius-pill);block-size:1rem;inline-size:1rem;color:var(--re-color-text-muted);font-size:var(--re-size-text-sm);cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;padding:0;line-height:1;display:inline-flex}.re-tag__remove:hover{color:var(--re-color-text);background:color-mix(in oklab, var(--re-color-text) 12%, transparent)}.re-tag__remove:focus-visible{box-shadow:var(--re-shadow-focus);outline:none}.re-tag[data-variant=info]{border-color:var(--re-color-info-border);background-color:var(--re-color-info-surface);color:var(--re-color-info-text)}.re-tag[data-variant=success]{border-color:var(--re-color-success-border);background-color:var(--re-color-success-surface);color:var(--re-color-success-text)}.re-tag[data-variant=warning]{border-color:var(--re-color-warning-border);background-color:var(--re-color-warning-surface);color:var(--re-color-warning-text)}.re-tag[data-variant=danger]{border-color:var(--re-color-danger-border);background-color:var(--re-color-danger-surface);color:var(--re-color-danger-text)}}
@@ -4,19 +4,42 @@ import { enhanceTabs } from '../chunk-GMICGIQW.js';
4
4
  var ReTabsElement = class extends HTMLElement {
5
5
  /** @type {{ destroy: () => void } | null} */
6
6
  #controller = null;
7
+ /** @type {MutationObserver | null} */
8
+ #observer = null;
7
9
  static get observedAttributes() {
8
10
  return ["value"];
9
11
  }
10
12
  connectedCallback() {
11
13
  this.setAttribute("data-re-tabs", "");
12
- this.#controller = enhanceTabs(this);
13
- const initial = this.getAttribute("value");
14
- if (initial) this.#selectById(initial);
14
+ if (this.#hasTabs()) {
15
+ this.#enhance();
16
+ } else {
17
+ this.#observer = new MutationObserver(() => {
18
+ if (this.#hasTabs()) {
19
+ this.#observer?.disconnect();
20
+ this.#observer = null;
21
+ this.#enhance();
22
+ }
23
+ });
24
+ this.#observer.observe(this, { childList: true, subtree: true });
25
+ }
15
26
  }
16
27
  disconnectedCallback() {
28
+ this.#observer?.disconnect();
29
+ this.#observer = null;
17
30
  this.#controller?.destroy();
18
31
  this.#controller = null;
19
32
  }
33
+ /** @returns {boolean} */
34
+ #hasTabs() {
35
+ return !!this.querySelector('[role="tablist"] [role="tab"]');
36
+ }
37
+ #enhance() {
38
+ this.#controller?.destroy();
39
+ this.#controller = enhanceTabs(this);
40
+ const initial = this.getAttribute("value");
41
+ if (initial) this.#selectById(initial);
42
+ }
20
43
  /**
21
44
  * @param {string} name
22
45
  * @param {string | null} _oldValue
package/dist/index.css CHANGED
@@ -1 +1 @@
1
- @layer re.tokens{@layer re.tokens{:root{--re-color-neutral-0:#fff;--re-color-neutral-50:#f8fafc;--re-color-neutral-100:#f1f5f9;--re-color-neutral-200:#e2e8f0;--re-color-neutral-300:#cbd5e1;--re-color-neutral-400:#94a3b8;--re-color-neutral-500:#64748b;--re-color-neutral-600:#475569;--re-color-neutral-700:#334155;--re-color-neutral-800:#1e293b;--re-color-neutral-900:#0f172a;--re-color-neutral-950:#020617;--re-color-accent-50:#eff6ff;--re-color-accent-100:#dbeafe;--re-color-accent-200:#bfdbfe;--re-color-accent-300:#93c5fd;--re-color-accent-400:#60a5fa;--re-color-accent-500:#3b82f6;--re-color-accent-600:#2563eb;--re-color-accent-700:#1d4ed8;--re-color-accent-800:#1e40af;--re-color-accent-900:#1e3a8a;--re-color-danger-500:#ef4444;--re-color-danger-600:#dc2626;--re-color-danger-700:#b91c1c;--re-color-success-500:#10b981;--re-color-success-600:#059669;--re-color-success-700:#047857;--re-color-warning-500:#f59e0b;--re-color-warning-600:#d97706;--re-color-warning-700:#b45309;--re-color-bg:var(--re-color-neutral-0);--re-color-bg-subtle:var(--re-color-neutral-50);--re-color-bg-muted:var(--re-color-neutral-100);--re-color-surface:var(--re-color-neutral-0);--re-color-text:var(--re-color-neutral-900);--re-color-text-muted:var(--re-color-neutral-600);--re-color-text-subtle:var(--re-color-neutral-500);--re-color-text-on-accent:var(--re-color-neutral-0);--re-color-text-danger:var(--re-color-danger-700);--re-color-border:var(--re-color-neutral-200);--re-color-border-strong:var(--re-color-neutral-300);--re-color-border-danger:var(--re-color-danger-500);--re-color-link:var(--re-color-accent-700);--re-color-link-hover:var(--re-color-accent-800);--re-color-link-visited:var(--re-color-accent-800);--re-color-focus-ring:var(--re-color-accent-500);--re-color-selection-bg:var(--re-color-accent-100);--re-color-selection-text:var(--re-color-neutral-900);--re-font-sans:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif;--re-font-mono:ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;--re-size-text-xs:.75rem;--re-size-text-sm:.875rem;--re-size-text-md:1rem;--re-size-text-lg:1.125rem;--re-size-text-xl:1.25rem;--re-size-text-2xl:1.5rem;--re-size-text-3xl:1.875rem;--re-size-text-4xl:2.25rem;--re-line-height-tight:1.2;--re-line-height-snug:1.35;--re-line-height-normal:1.5;--re-line-height-relaxed:1.65;--re-font-weight-regular:400;--re-font-weight-medium:500;--re-font-weight-semibold:600;--re-font-weight-bold:700;--re-space-0:0;--re-space-1:.25rem;--re-space-2:.5rem;--re-space-3:.75rem;--re-space-4:1rem;--re-space-5:1.25rem;--re-space-6:1.5rem;--re-space-8:2rem;--re-space-10:2.5rem;--re-space-12:3rem;--re-space-16:4rem;--re-radius-none:0;--re-radius-sm:.25rem;--re-radius-md:.375rem;--re-radius-lg:.5rem;--re-radius-xl:.75rem;--re-radius-pill:9999px;--re-border-width:1px;--re-border-width-strong:2px;--re-border-default:var(--re-border-width) solid var(--re-color-border);--re-border-strong:var(--re-border-width-strong) solid var(--re-color-border-strong);--re-border-danger:var(--re-border-width) solid var(--re-color-border-danger);--re-focus-ring-width:2px;--re-focus-ring-offset:2px;--re-focus-ring-color:var(--re-color-focus-ring);--re-shadow-focus:0 0 0 var(--re-focus-ring-offset) var(--re-color-bg), 0 0 0 calc(var(--re-focus-ring-offset) + var(--re-focus-ring-width)) var(--re-color-focus-ring);--re-shadow-sm:0 1px 2px #0000000f;--re-shadow-md:0 4px 12px #00000014;--re-shadow-lg:0 12px 32px #0000001f;--re-duration-instant:0s;--re-duration-fast:.12s;--re-duration-normal:.2s;--re-duration-slow:.32s;--re-easing-standard:cubic-bezier(.2, 0, 0, 1);--re-easing-emphasized:cubic-bezier(.3, 0, 0, 1);--re-z-base:0;--re-z-overlay:100;--re-z-popover:200;--re-z-dialog:300;--re-z-toast:400;--re-control-height-sm:1.75rem;--re-control-height-md:2.25rem;--re-control-height-lg:2.75rem;--re-control-padding-x:var(--re-space-3);--re-control-padding-y:var(--re-space-2)}@media (prefers-color-scheme:dark){:root{--re-color-bg:var(--re-color-neutral-950);--re-color-bg-subtle:var(--re-color-neutral-900);--re-color-bg-muted:var(--re-color-neutral-800);--re-color-surface:var(--re-color-neutral-900);--re-color-text:var(--re-color-neutral-50);--re-color-text-muted:var(--re-color-neutral-300);--re-color-text-subtle:var(--re-color-neutral-400);--re-color-text-on-accent:var(--re-color-neutral-0);--re-color-text-danger:var(--re-color-danger-500);--re-color-border:var(--re-color-neutral-700);--re-color-border-strong:var(--re-color-neutral-600);--re-color-link:var(--re-color-accent-300);--re-color-link-hover:var(--re-color-accent-200);--re-color-link-visited:var(--re-color-accent-200);--re-color-focus-ring:var(--re-color-accent-400);--re-color-selection-bg:var(--re-color-accent-900);--re-color-selection-text:var(--re-color-neutral-50);--re-focus-ring-offset:0px;--re-shadow-focus:0 0 0 2px var(--re-color-focus-ring)}}}}@layer re.reset{@layer re.reset{*,:before,:after{box-sizing:border-box}html{-moz-text-size-adjust:100%;text-size-adjust:100%;tab-size:4}body{min-height:100dvh;line-height:var(--re-line-height-normal);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin:0}h1,h2,h3,h4,h5,h6,p,figure,blockquote,dl,dd{margin:0}ul[role=list],ol[role=list]{margin:0;padding:0;list-style:none}img,picture,video,canvas,svg{max-width:100%;height:auto;display:block}input,button,textarea,select{font:inherit;color:inherit}textarea{resize:vertical}p,h1,h2,h3,h4,h5,h6{overflow-wrap:break-word}[hidden]{display:none!important}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}}}@layer re.base{@layer re.base{:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial}}html{font-family:var(--re-font-sans);font-size:var(--re-size-text-md);line-height:var(--re-line-height-normal);color:var(--re-color-text);background-color:var(--re-color-bg)}::selection{background-color:var(--re-color-selection-bg);color:var(--re-color-selection-text)}h1,h2,h3,h4,h5,h6{line-height:var(--re-line-height-tight);font-weight:var(--re-font-weight-semibold);color:var(--re-color-text)}h1{font-size:var(--re-size-text-4xl)}h2{font-size:var(--re-size-text-3xl)}h3{font-size:var(--re-size-text-2xl)}h4{font-size:var(--re-size-text-xl)}h5{font-size:var(--re-size-text-lg)}h6{font-size:var(--re-size-text-md)}p{line-height:var(--re-line-height-normal);color:var(--re-color-text)}small{font-size:var(--re-size-text-sm);color:var(--re-color-text-muted)}code,kbd,samp,pre{font-family:var(--re-font-mono);font-size:.95em}pre{padding:var(--re-space-3) var(--re-space-4);background-color:var(--re-color-bg-muted);border-radius:var(--re-radius-md);overflow:auto}code{background-color:var(--re-color-bg-muted);border-radius:var(--re-radius-sm);padding:.1em .3em}pre code{background:0 0;border-radius:0;padding:0}hr{border:0;border-top:var(--re-border-default);margin-block:var(--re-space-6)}a{color:var(--re-color-link);text-underline-offset:.2em;text-decoration-thickness:.08em}a:hover{color:var(--re-color-link-hover)}a:visited{color:var(--re-color-link-visited)}:focus-visible{box-shadow:var(--re-shadow-focus);border-radius:var(--re-radius-sm);outline:none}input,textarea,select{color:var(--re-color-text);background-color:var(--re-color-bg)}}}@layer re.components{.re-button{justify-content:center;align-items:center;gap:var(--re-space-2);box-sizing:border-box;block-size:var(--re-control-height-md);padding-inline:var(--re-space-4);font:inherit;font-weight:var(--re-font-weight-medium);font-size:var(--re-size-text-md);text-align:center;white-space:nowrap;-webkit-user-select:none;user-select:none;color:var(--re-color-text-on-accent);background-color:var(--re-color-accent-600);border:var(--re-border-width) solid transparent;border-radius:var(--re-radius-md);cursor:pointer;transition:background-color var(--re-duration-fast) var(--re-easing-standard), color var(--re-duration-fast) var(--re-easing-standard), border-color var(--re-duration-fast) var(--re-easing-standard), box-shadow var(--re-duration-fast) var(--re-easing-standard);padding-block:0;line-height:1;text-decoration:none;display:inline-flex}a.re-button{-webkit-tap-highlight-color:transparent}.re-button:hover{background-color:var(--re-color-accent-700)}.re-button:active{background-color:var(--re-color-accent-800)}.re-button:focus-visible{box-shadow:var(--re-shadow-focus);outline:none}.re-button:disabled,.re-button[aria-disabled=true]{cursor:not-allowed;opacity:.55;pointer-events:none}a.re-button[aria-disabled=true]{pointer-events:none}.re-button[data-variant=secondary]{color:var(--re-color-text);background-color:var(--re-color-bg);border-color:var(--re-color-border-strong)}.re-button[data-variant=secondary]:hover{background-color:var(--re-color-bg-subtle)}.re-button[data-variant=secondary]:active{background-color:var(--re-color-bg-muted)}.re-button[data-variant=ghost]{color:var(--re-color-text);background-color:#0000;border-color:#0000}.re-button[data-variant=ghost]:hover{background-color:var(--re-color-bg-subtle)}.re-button[data-variant=ghost]:active{background-color:var(--re-color-bg-muted)}.re-button[data-variant=danger]{color:var(--re-color-text-on-accent);background-color:var(--re-color-danger-600)}.re-button[data-variant=danger]:hover{background-color:var(--re-color-danger-700)}.re-button[data-variant=danger]:active{background-color:var(--re-color-danger-700);filter:brightness(.95)}.re-button[data-size=sm]{block-size:var(--re-control-height-sm);padding-inline:var(--re-space-3);font-size:var(--re-size-text-sm)}.re-button[data-size=lg]{block-size:var(--re-control-height-lg);padding-inline:var(--re-space-5);font-size:var(--re-size-text-lg)}.re-button[data-full-width]{inline-size:100%}.re-link{color:var(--re-color-link);text-underline-offset:.18em;border-radius:var(--re-radius-sm);transition:color var(--re-duration-fast) var(--re-easing-standard), text-decoration-color var(--re-duration-fast) var(--re-easing-standard);text-decoration-line:underline;text-decoration-color:currentColor;text-decoration-thickness:.08em}.re-link:hover{color:var(--re-color-link-hover)}.re-link:visited{color:var(--re-color-link-visited)}.re-link:focus-visible{box-shadow:var(--re-shadow-focus);outline:none}.re-link[data-variant=muted]{color:var(--re-color-text-muted);-webkit-text-decoration-color:var(--re-color-border-strong);text-decoration-color:var(--re-color-border-strong)}.re-link[data-variant=muted]:hover{color:var(--re-color-text);text-decoration-color:currentColor}.re-link[data-variant=subtle]{text-decoration-line:none}.re-link[data-variant=subtle]:hover{text-decoration-line:underline}.re-link[data-variant=external]:after{content:" ↗";speak:none}.re-input,.re-textarea,.re-select{box-sizing:border-box;inline-size:100%;min-block-size:var(--re-control-height-md);padding-inline:var(--re-control-padding-x);padding-block:var(--re-control-padding-y);font:inherit;font-size:var(--re-size-text-md);line-height:var(--re-line-height-normal);color:var(--re-color-text);background-color:var(--re-color-bg);border:var(--re-border-default);border-radius:var(--re-radius-md);appearance:none;transition:border-color var(--re-duration-fast) var(--re-easing-standard), box-shadow var(--re-duration-fast) var(--re-easing-standard), background-color var(--re-duration-fast) var(--re-easing-standard);display:block}.re-input::placeholder,.re-textarea::placeholder{color:var(--re-color-text-subtle);opacity:1}.re-input:hover,.re-textarea:hover,.re-select:hover{border-color:var(--re-color-border-strong)}.re-input:focus-visible,.re-textarea:focus-visible,.re-select:focus-visible{border-color:var(--re-color-focus-ring);box-shadow:var(--re-shadow-focus);outline:none}:is(.re-input[aria-invalid=true],.re-textarea[aria-invalid=true],.re-select[aria-invalid=true],.re-input:user-invalid,.re-textarea:user-invalid,.re-select:user-invalid){border-color:var(--re-color-border-danger)}:is(.re-input[aria-invalid=true]:focus-visible,.re-textarea[aria-invalid=true]:focus-visible,.re-select[aria-invalid=true]:focus-visible,.re-input:user-invalid:focus-visible,.re-textarea:user-invalid:focus-visible,.re-select:user-invalid:focus-visible){box-shadow:0 0 0 var(--re-focus-ring-offset) var(--re-color-bg), 0 0 0 calc(var(--re-focus-ring-offset) + var(--re-focus-ring-width)) var(--re-color-danger-500)}.re-input:disabled,.re-textarea:disabled,.re-select:disabled,.re-checkbox:disabled,.re-radio:disabled{cursor:not-allowed;background-color:var(--re-color-bg-muted);color:var(--re-color-text-subtle);opacity:.7}.re-input[data-size=sm],.re-textarea[data-size=sm],.re-select[data-size=sm]{min-block-size:var(--re-control-height-sm);font-size:var(--re-size-text-sm);padding-inline:var(--re-space-2)}.re-input[data-size=lg],.re-textarea[data-size=lg],.re-select[data-size=lg]{min-block-size:var(--re-control-height-lg);font-size:var(--re-size-text-lg);padding-inline:var(--re-space-4)}.re-textarea{min-block-size:calc(var(--re-control-height-md) * 2);resize:vertical;line-height:var(--re-line-height-relaxed)}.re-select{background-image:linear-gradient(45deg,#0000 50%,currentColor 50%),linear-gradient(135deg,currentColor 50%,#0000 50%);background-position:right var(--re-space-4) top 55%, right calc(var(--re-space-4) - 5px) top 55%;color:var(--re-color-text);background-repeat:no-repeat;background-size:5px 5px,5px 5px;padding-inline-end:var(--re-space-8)}.re-select[multiple]{min-block-size:calc(var(--re-control-height-md) * 3);background-image:none;padding-inline-end:var(--re-control-padding-x)}.re-select[multiple] option{padding-block:var(--re-space-1)}.re-checkbox,.re-radio{appearance:none;background-color:var(--re-color-bg);border:var(--re-border-width-strong) solid var(--re-color-border-strong);cursor:pointer;block-size:1.125rem;inline-size:1.125rem;color:var(--re-color-text-on-accent);transition:background-color var(--re-duration-fast) var(--re-easing-standard), border-color var(--re-duration-fast) var(--re-easing-standard), box-shadow var(--re-duration-fast) var(--re-easing-standard);flex-shrink:0;place-content:center;margin:0;padding:0;display:inline-grid}.re-checkbox{border-radius:var(--re-radius-sm)}.re-radio{border-radius:var(--re-radius-pill)}.re-checkbox:hover,.re-radio:hover{border-color:var(--re-color-accent-600)}.re-checkbox:focus-visible,.re-radio:focus-visible{box-shadow:var(--re-shadow-focus);border-color:var(--re-color-focus-ring);outline:none}.re-checkbox:checked,.re-radio:checked{background-color:var(--re-color-accent-600);border-color:var(--re-color-accent-600)}.re-checkbox:checked:before{content:"";clip-path:polygon(14% 44%,0 65%,50% 100%,100% 16%,80% 0,43% 62%);background-color:currentColor;block-size:.65rem;inline-size:.65rem}.re-radio:checked:before{content:"";border-radius:var(--re-radius-pill);background-color:currentColor;block-size:.55rem;inline-size:.55rem}.re-checkbox:indeterminate{background-color:var(--re-color-accent-600);border-color:var(--re-color-accent-600)}.re-checkbox:indeterminate:before{content:"";border-radius:var(--re-radius-sm);background-color:currentColor;block-size:.18rem;inline-size:.7rem}.re-checkbox[aria-invalid=true],.re-radio[aria-invalid=true]{border-color:var(--re-color-border-danger)}.re-field{gap:var(--re-space-2);color:var(--re-color-text);flex-direction:column;display:flex}.re-field__label{font-size:var(--re-size-text-sm);font-weight:var(--re-font-weight-medium);color:var(--re-color-text);line-height:1.2}.re-field__label[data-required]:after{content:" *";color:var(--re-color-text-danger);margin-inline-start:.1em}.re-field__hint{font-size:var(--re-size-text-sm);color:var(--re-color-text-muted);line-height:var(--re-line-height-normal)}.re-field--inline{align-items:center;gap:var(--re-space-3);flex-direction:row}.re-field-group{gap:var(--re-space-2);border:0;flex-direction:column;margin:0;padding:0;display:flex}.re-field-group__legend{font-size:var(--re-size-text-sm);font-weight:var(--re-font-weight-medium);color:var(--re-color-text);padding:0;line-height:1.2}.re-field-group[data-orientation=horizontal]>.re-field-group__items{gap:var(--re-space-4);flex-flow:wrap}.re-field-group__items{gap:var(--re-space-2);flex-direction:column;display:flex}.re-validation-message{font-size:var(--re-size-text-sm);line-height:var(--re-line-height-normal);color:var(--re-color-text-danger);display:block}.re-validation-message[data-tone=success]{color:var(--re-color-success-700)}.re-validation-message[data-tone=hint]{color:var(--re-color-text-muted)}.re-validation-message[data-tone=warning]{color:var(--re-color-warning-700)}.re-disclosure{border:var(--re-border-default);border-radius:var(--re-radius-md);background-color:var(--re-color-surface);overflow:hidden}.re-disclosure__summary{cursor:pointer;padding:var(--re-space-3) var(--re-space-4);font-weight:var(--re-font-weight-medium);color:var(--re-color-text);align-items:center;gap:var(--re-space-3);-webkit-user-select:none;user-select:none;transition:background-color var(--re-duration-fast) var(--re-easing-standard);list-style:none;display:flex}.re-disclosure__summary::-webkit-details-marker{display:none}.re-disclosure__summary:before{content:"";block-size:.6rem;inline-size:.6rem;transition:transform var(--re-duration-fast) var(--re-easing-standard);border-block-end:2px solid;border-inline-end:2px solid;flex-shrink:0;margin-inline-end:var(--re-space-1);transform:rotate(-45deg)}.re-disclosure[open]>.re-disclosure__summary:before{transform:rotate(45deg)}.re-disclosure__summary:hover{background-color:var(--re-color-bg-subtle)}.re-disclosure__summary:focus-visible{box-shadow:var(--re-shadow-focus);outline:none}.re-disclosure__body{padding:var(--re-space-3) var(--re-space-4) var(--re-space-4);border-block-start:var(--re-border-default);color:var(--re-color-text);line-height:var(--re-line-height-normal)}.re-disclosure[data-variant=plain]{background:0 0;border:0}.re-disclosure[data-variant=plain]>.re-disclosure__body{border-block-start:0;padding-block-start:var(--re-space-2)}.re-dialog:not([open]){display:none}.re-dialog{box-sizing:border-box;border:var(--re-border-default);border-radius:var(--re-radius-lg);background-color:var(--re-color-surface);color:var(--re-color-text);max-block-size:min(85vh,40rem);inline-size:min(90vw,32rem);box-shadow:var(--re-shadow-lg);flex-direction:column;padding:0;display:flex;overflow:hidden}.re-dialog::backdrop{-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);background-color:#0006}.re-dialog:focus-visible{outline:none}.re-dialog__header{justify-content:space-between;align-items:center;gap:var(--re-space-3);padding:var(--re-space-4);border-block-end:var(--re-border-default);display:flex}.re-dialog__title{font-size:var(--re-size-text-lg);font-weight:var(--re-font-weight-semibold);line-height:var(--re-line-height-tight);color:var(--re-color-text);margin:0}.re-dialog__close{appearance:none;cursor:pointer;padding:var(--re-space-1) var(--re-space-2);border-radius:var(--re-radius-md);color:var(--re-color-text-muted);font:inherit;font-size:var(--re-size-text-xl);transition:background-color var(--re-duration-fast) var(--re-easing-standard);background:0 0;border:0;line-height:1}.re-dialog__close:hover{background-color:var(--re-color-bg-subtle);color:var(--re-color-text)}.re-dialog__close:focus-visible{box-shadow:var(--re-shadow-focus);outline:none}.re-dialog__body{padding:var(--re-space-4);line-height:var(--re-line-height-normal);overflow-y:auto}.re-dialog__footer{justify-content:flex-end;gap:var(--re-space-3);padding:var(--re-space-4);border-block-start:var(--re-border-default);background-color:var(--re-color-bg-subtle);display:flex}.re-progress,.re-meter{appearance:none;border-radius:var(--re-radius-pill);background-color:var(--re-color-bg-muted);block-size:.5rem;inline-size:100%;color:var(--re-color-accent-600);border:0;overflow:hidden}.re-progress::-webkit-progress-bar{background-color:var(--re-color-bg-muted);border-radius:var(--re-radius-pill)}.re-progress::-webkit-progress-value{background-color:var(--re-color-accent-600);border-radius:var(--re-radius-pill);transition:inline-size var(--re-duration-normal) var(--re-easing-standard)}.re-progress::-moz-progress-bar{background-color:var(--re-color-accent-600);border-radius:var(--re-radius-pill)}.re-progress:indeterminate{background:linear-gradient(90deg, transparent 0%, var(--re-color-accent-300) 50%, transparent 100%) no-repeat, var(--re-color-bg-muted);background-size:40% 100%,100% 100%;animation:1.2s linear infinite re-progress-indeterminate}@keyframes re-progress-indeterminate{0%{background-position:-40% 0,0 0}to{background-position:140% 0,0 0}}@media (prefers-reduced-motion:reduce){.re-progress:indeterminate{animation-duration:.01ms}}.re-meter::-webkit-meter-bar{background-color:var(--re-color-bg-muted);border-radius:var(--re-radius-pill);border:0}.re-meter::-webkit-meter-optimum-value{background-color:var(--re-color-success-600);border-radius:var(--re-radius-pill)}.re-meter::-webkit-meter-suboptimum-value{background-color:var(--re-color-warning-600);border-radius:var(--re-radius-pill)}.re-meter::-webkit-meter-even-less-good-value{background-color:var(--re-color-danger-600);border-radius:var(--re-radius-pill)}.re-meter::-moz-meter-bar{background-color:var(--re-color-success-600);border-radius:var(--re-radius-pill)}.re-meter:-moz-meter-sub-optimum::-moz-meter-bar{background-color:var(--re-color-warning-600)}.re-meter:-moz-meter-sub-sub-optimum::-moz-meter-bar{background-color:var(--re-color-danger-600)}.re-progress[data-size=sm],.re-meter[data-size=sm]{block-size:.25rem}.re-progress[data-size=lg],.re-meter[data-size=lg]{block-size:.75rem}.re-tabs{gap:var(--re-space-4);flex-direction:column;display:flex}.re-tabs__list{gap:var(--re-space-1);border-block-end:var(--re-border-default);flex-wrap:wrap;padding-block-end:0;display:flex}.re-tab{appearance:none;cursor:pointer;font:inherit;color:var(--re-color-text-muted);padding:var(--re-space-2) var(--re-space-4);border-radius:var(--re-radius-md) var(--re-radius-md) 0 0;line-height:1.4;font-weight:var(--re-font-weight-medium);transition:color var(--re-duration-fast) var(--re-easing-standard), background-color var(--re-duration-fast) var(--re-easing-standard);background:0 0;border:0;position:relative}.re-tab:hover{color:var(--re-color-text);background-color:var(--re-color-bg-subtle)}.re-tab:focus-visible{box-shadow:var(--re-shadow-focus);outline:none}.re-tab[aria-selected=true]{color:var(--re-color-text);background-color:var(--re-color-bg)}.re-tab[aria-selected=true]:after{content:"";inset-inline:var(--re-space-2);background-color:var(--re-color-accent-600);border-radius:var(--re-radius-sm);block-size:2px;position:absolute;inset-block-end:calc(var(--re-border-width) * -1)}.re-tabpanel{color:var(--re-color-text);line-height:var(--re-line-height-normal)}.re-tabpanel:focus-visible{box-shadow:var(--re-shadow-focus);border-radius:var(--re-radius-md);outline:none}.re-menu{display:inline-block;position:relative}.re-menu__panel{background-color:var(--re-color-surface);border:var(--re-border-default);border-radius:var(--re-radius-md);min-inline-size:12rem;box-shadow:var(--re-shadow-md);padding:var(--re-space-1);z-index:var(--re-z-popover);flex-direction:column;gap:1px;display:flex;position:absolute;inset-block-start:calc(100% + var(--re-space-1));inset-inline-start:0}.re-menu__item{appearance:none;cursor:pointer;font:inherit;text-align:start;padding:var(--re-space-2) var(--re-space-3);border-radius:var(--re-radius-sm);color:var(--re-color-text);line-height:var(--re-line-height-normal);background:0 0;border:0}.re-menu__item:hover{background-color:var(--re-color-bg-muted);outline:none}.re-menu__item:focus-visible{background-color:var(--re-color-bg-muted);box-shadow:inset 0 0 0 2px var(--re-color-focus-ring);outline:none}.re-menu__item[aria-disabled=true],.re-menu__item:disabled{color:var(--re-color-text-subtle);cursor:not-allowed}.re-menu__separator{background-color:var(--re-color-border);block-size:1px;margin-block:var(--re-space-1)}.re-popover{border:var(--re-border-default);border-radius:var(--re-radius-md);background-color:var(--re-color-surface);color:var(--re-color-text);padding:var(--re-space-3) var(--re-space-4);box-shadow:var(--re-shadow-md);max-inline-size:22rem;line-height:var(--re-line-height-normal);margin:0;inset:auto}.re-popover:popover-open{margin:0}.re-popover[data-tone=info]{background-color:color-mix(in srgb, var(--re-color-accent-500) 12%, var(--re-color-surface));border-color:var(--re-color-accent-500)}.re-popover[data-tone=warning]{background-color:color-mix(in srgb, var(--re-color-warning-500) 12%, var(--re-color-surface));border-color:var(--re-color-warning-500)}.re-popover[data-tone=danger]{background-color:color-mix(in srgb, var(--re-color-danger-500) 12%, var(--re-color-surface));border-color:var(--re-color-danger-500)}.re-toast-region{z-index:var(--re-z-toast);pointer-events:none;position:fixed;inset-block-end:var(--re-space-6);inset-inline-end:var(--re-space-6)}.re-toast-list{gap:var(--re-space-2);flex-direction:column-reverse;min-inline-size:16rem;max-inline-size:24rem;margin:0;padding:0;display:flex}.re-toast{pointer-events:auto;gap:var(--re-space-3);padding:var(--re-space-3) var(--re-space-4);background-color:var(--re-color-surface);color:var(--re-color-text);border:var(--re-border-default);border-radius:var(--re-radius-md);box-shadow:var(--re-shadow-md);line-height:var(--re-line-height-normal);align-items:flex-start;display:flex}.re-toast__body{flex:auto}.re-toast__dismiss{appearance:none;cursor:pointer;color:var(--re-color-text-muted);font:inherit;font-size:var(--re-size-text-lg);padding:0 var(--re-space-1);border-radius:var(--re-radius-sm);background:0 0;border:0;line-height:1}.re-toast__dismiss:hover{color:var(--re-color-text);background:var(--re-color-bg-subtle)}.re-toast__dismiss:focus-visible{box-shadow:var(--re-shadow-focus);outline:none}.re-toast[data-tone=success]{background-color:color-mix(in srgb, var(--re-color-success-600) 12%, var(--re-color-surface));border-color:var(--re-color-success-600);color:var(--re-color-text)}.re-toast[data-tone=danger]{background-color:color-mix(in srgb, var(--re-color-danger-600) 12%, var(--re-color-surface));border-color:var(--re-color-danger-600);color:var(--re-color-text)}.re-toast[data-tone=warning]{background-color:color-mix(in srgb, var(--re-color-warning-600) 12%, var(--re-color-surface));border-color:var(--re-color-warning-600);color:var(--re-color-text)}}
1
+ @layer re.tokens{@layer re.tokens{:root{--re-color-neutral-0:#fff;--re-color-neutral-50:#f8fafc;--re-color-neutral-100:#f1f5f9;--re-color-neutral-200:#e2e8f0;--re-color-neutral-300:#cbd5e1;--re-color-neutral-400:#94a3b8;--re-color-neutral-500:#64748b;--re-color-neutral-600:#475569;--re-color-neutral-700:#334155;--re-color-neutral-800:#1e293b;--re-color-neutral-900:#0f172a;--re-color-neutral-950:#020617;--re-color-accent-50:#eff6ff;--re-color-accent-100:#dbeafe;--re-color-accent-200:#bfdbfe;--re-color-accent-300:#93c5fd;--re-color-accent-400:#60a5fa;--re-color-accent-500:#3b82f6;--re-color-accent-600:#2563eb;--re-color-accent-700:#1d4ed8;--re-color-accent-800:#1e40af;--re-color-accent-900:#1e3a8a;--re-color-danger-500:#ef4444;--re-color-danger-600:#dc2626;--re-color-danger-700:#b91c1c;--re-color-success-500:#10b981;--re-color-success-600:#059669;--re-color-success-700:#047857;--re-color-warning-500:#f59e0b;--re-color-warning-600:#d97706;--re-color-warning-700:#b45309;--re-color-bg:var(--re-color-neutral-0);--re-color-bg-subtle:var(--re-color-neutral-50);--re-color-bg-muted:var(--re-color-neutral-100);--re-color-surface:var(--re-color-neutral-0);--re-color-text:var(--re-color-neutral-900);--re-color-text-muted:var(--re-color-neutral-600);--re-color-text-subtle:var(--re-color-neutral-500);--re-color-text-on-accent:var(--re-color-neutral-0);--re-color-text-danger:var(--re-color-danger-700);--re-color-border:var(--re-color-neutral-200);--re-color-border-strong:var(--re-color-neutral-300);--re-color-border-danger:var(--re-color-danger-500);--re-color-link:var(--re-color-accent-700);--re-color-link-hover:var(--re-color-accent-800);--re-color-link-visited:var(--re-color-accent-800);--re-color-focus-ring:var(--re-color-accent-500);--re-color-selection-bg:var(--re-color-accent-100);--re-color-selection-text:var(--re-color-neutral-900);--re-color-info-surface:color-mix(in oklab, var(--re-color-accent-500) 12%, var(--re-color-bg));--re-color-info-border:var(--re-color-accent-500);--re-color-info-text:var(--re-color-accent-700);--re-color-success-surface:color-mix(in oklab, var(--re-color-success-500) 12%, var(--re-color-bg));--re-color-success-border:var(--re-color-success-500);--re-color-success-text:var(--re-color-success-700);--re-color-warning-surface:color-mix(in oklab, var(--re-color-warning-500) 12%, var(--re-color-bg));--re-color-warning-border:var(--re-color-warning-500);--re-color-warning-text:var(--re-color-warning-700);--re-color-danger-surface:color-mix(in oklab, var(--re-color-danger-500) 12%, var(--re-color-bg));--re-color-danger-border:var(--re-color-danger-500);--re-color-danger-text:var(--re-color-danger-700);--re-font-sans:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif;--re-font-mono:ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;--re-size-text-xs:.75rem;--re-size-text-sm:.875rem;--re-size-text-md:1rem;--re-size-text-lg:1.125rem;--re-size-text-xl:1.25rem;--re-size-text-2xl:1.5rem;--re-size-text-3xl:1.875rem;--re-size-text-4xl:2.25rem;--re-line-height-tight:1.2;--re-line-height-snug:1.35;--re-line-height-normal:1.5;--re-line-height-relaxed:1.65;--re-font-weight-regular:400;--re-font-weight-medium:500;--re-font-weight-semibold:600;--re-font-weight-bold:700;--re-space-0:0;--re-space-1:.25rem;--re-space-2:.5rem;--re-space-3:.75rem;--re-space-4:1rem;--re-space-5:1.25rem;--re-space-6:1.5rem;--re-space-8:2rem;--re-space-10:2.5rem;--re-space-12:3rem;--re-space-16:4rem;--re-radius-none:0;--re-radius-sm:.25rem;--re-radius-md:.375rem;--re-radius-lg:.5rem;--re-radius-xl:.75rem;--re-radius-pill:9999px;--re-border-width:1px;--re-border-width-strong:2px;--re-border-default:var(--re-border-width) solid var(--re-color-border);--re-border-strong:var(--re-border-width-strong) solid var(--re-color-border-strong);--re-border-danger:var(--re-border-width) solid var(--re-color-border-danger);--re-focus-ring-width:2px;--re-focus-ring-offset:2px;--re-focus-ring-color:var(--re-color-focus-ring);--re-shadow-focus:0 0 0 var(--re-focus-ring-offset) var(--re-color-bg), 0 0 0 calc(var(--re-focus-ring-offset) + var(--re-focus-ring-width)) var(--re-color-focus-ring);--re-shadow-sm:0 1px 2px #0000000f;--re-shadow-md:0 4px 12px #00000014;--re-shadow-lg:0 12px 32px #0000001f;--re-duration-instant:0s;--re-duration-fast:.12s;--re-duration-normal:.2s;--re-duration-slow:.32s;--re-easing-standard:cubic-bezier(.2, 0, 0, 1);--re-easing-emphasized:cubic-bezier(.3, 0, 0, 1);--re-z-base:0;--re-z-overlay:100;--re-z-popover:200;--re-z-dialog:300;--re-z-toast:400;--re-control-height-sm:1.75rem;--re-control-height-md:2.25rem;--re-control-height-lg:2.75rem;--re-control-padding-x:var(--re-space-3);--re-control-padding-y:var(--re-space-2)}@media (prefers-color-scheme:dark){:root{--re-color-bg:var(--re-color-neutral-950);--re-color-bg-subtle:var(--re-color-neutral-900);--re-color-bg-muted:var(--re-color-neutral-800);--re-color-surface:var(--re-color-neutral-900);--re-color-text:var(--re-color-neutral-50);--re-color-text-muted:var(--re-color-neutral-300);--re-color-text-subtle:var(--re-color-neutral-400);--re-color-text-on-accent:var(--re-color-neutral-0);--re-color-text-danger:var(--re-color-danger-500);--re-color-border:var(--re-color-neutral-700);--re-color-border-strong:var(--re-color-neutral-600);--re-color-link:var(--re-color-accent-300);--re-color-link-hover:var(--re-color-accent-200);--re-color-link-visited:var(--re-color-accent-200);--re-color-focus-ring:var(--re-color-accent-400);--re-color-selection-bg:var(--re-color-accent-900);--re-color-selection-text:var(--re-color-neutral-50);--re-color-info-surface:color-mix(in oklab, var(--re-color-accent-500) 20%, var(--re-color-bg));--re-color-info-border:var(--re-color-accent-400);--re-color-info-text:var(--re-color-accent-200);--re-color-success-surface:color-mix(in oklab, var(--re-color-success-500) 20%, var(--re-color-bg));--re-color-success-border:var(--re-color-success-500);--re-color-success-text:var(--re-color-success-500);--re-color-warning-surface:color-mix(in oklab, var(--re-color-warning-500) 20%, var(--re-color-bg));--re-color-warning-border:var(--re-color-warning-500);--re-color-warning-text:var(--re-color-warning-500);--re-color-danger-surface:color-mix(in oklab, var(--re-color-danger-500) 20%, var(--re-color-bg));--re-color-danger-border:var(--re-color-danger-500);--re-color-danger-text:var(--re-color-danger-500);--re-focus-ring-offset:0px;--re-shadow-focus:0 0 0 2px var(--re-color-focus-ring)}}}}@layer re.reset{@layer re.reset{*,:before,:after{box-sizing:border-box}html{-moz-text-size-adjust:100%;text-size-adjust:100%;tab-size:4}body{min-height:100dvh;line-height:var(--re-line-height-normal);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin:0}h1,h2,h3,h4,h5,h6,p,figure,blockquote,dl,dd{margin:0}ul[role=list],ol[role=list]{margin:0;padding:0;list-style:none}img,picture,video,canvas,svg{max-width:100%;height:auto;display:block}input,button,textarea,select{font:inherit;color:inherit}textarea{resize:vertical}p,h1,h2,h3,h4,h5,h6{overflow-wrap:break-word}[hidden]{display:none!important}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}}}@layer re.base{@layer re.base{:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial}}html{font-family:var(--re-font-sans);font-size:var(--re-size-text-md);line-height:var(--re-line-height-normal);color:var(--re-color-text);background-color:var(--re-color-bg)}::selection{background-color:var(--re-color-selection-bg);color:var(--re-color-selection-text)}h1,h2,h3,h4,h5,h6{line-height:var(--re-line-height-tight);font-weight:var(--re-font-weight-semibold);color:var(--re-color-text)}h1{font-size:var(--re-size-text-4xl)}h2{font-size:var(--re-size-text-3xl)}h3{font-size:var(--re-size-text-2xl)}h4{font-size:var(--re-size-text-xl)}h5{font-size:var(--re-size-text-lg)}h6{font-size:var(--re-size-text-md)}p{line-height:var(--re-line-height-normal);color:var(--re-color-text)}small{font-size:var(--re-size-text-sm);color:var(--re-color-text-muted)}code,kbd,samp,pre{font-family:var(--re-font-mono);font-size:.95em}pre{padding:var(--re-space-3) var(--re-space-4);background-color:var(--re-color-bg-muted);border-radius:var(--re-radius-md);overflow:auto}code{background-color:var(--re-color-bg-muted);border-radius:var(--re-radius-sm);padding:.1em .3em}pre code{background:0 0;border-radius:0;padding:0}hr{border:0;border-top:var(--re-border-default);margin-block:var(--re-space-6)}a{color:var(--re-color-link);text-underline-offset:.2em;text-decoration-thickness:.08em}a:hover{color:var(--re-color-link-hover)}a:visited{color:var(--re-color-link-visited)}:focus-visible{box-shadow:var(--re-shadow-focus);border-radius:var(--re-radius-sm);outline:none}input,textarea,select{color:var(--re-color-text);background-color:var(--re-color-bg)}}}@layer re.components{.re-button{justify-content:center;align-items:center;gap:var(--re-space-2);box-sizing:border-box;block-size:var(--re-control-height-md);padding-inline:var(--re-space-4);font:inherit;font-weight:var(--re-font-weight-medium);font-size:var(--re-size-text-md);text-align:center;white-space:nowrap;-webkit-user-select:none;user-select:none;color:var(--re-color-text-on-accent);background-color:var(--re-color-accent-600);border:var(--re-border-width) solid transparent;border-radius:var(--re-radius-md);cursor:pointer;transition:background-color var(--re-duration-fast) var(--re-easing-standard), color var(--re-duration-fast) var(--re-easing-standard), border-color var(--re-duration-fast) var(--re-easing-standard), box-shadow var(--re-duration-fast) var(--re-easing-standard);padding-block:0;line-height:1;text-decoration:none;display:inline-flex}a.re-button{-webkit-tap-highlight-color:transparent}.re-button:hover{background-color:var(--re-color-accent-700)}.re-button:active{background-color:var(--re-color-accent-800)}.re-button:focus-visible{box-shadow:var(--re-shadow-focus);outline:none}.re-button:disabled,.re-button[aria-disabled=true]{cursor:not-allowed;opacity:.55;pointer-events:none}a.re-button[aria-disabled=true]{pointer-events:none}.re-button[data-variant=secondary]{color:var(--re-color-text);background-color:var(--re-color-bg);border-color:var(--re-color-border-strong)}.re-button[data-variant=secondary]:hover{background-color:var(--re-color-bg-subtle)}.re-button[data-variant=secondary]:active{background-color:var(--re-color-bg-muted)}.re-button[data-variant=ghost]{color:var(--re-color-text);background-color:#0000;border-color:#0000}.re-button[data-variant=ghost]:hover{background-color:var(--re-color-bg-subtle)}.re-button[data-variant=ghost]:active{background-color:var(--re-color-bg-muted)}.re-button[data-variant=danger]{color:var(--re-color-text-on-accent);background-color:var(--re-color-danger-600)}.re-button[data-variant=danger]:hover{background-color:var(--re-color-danger-700)}.re-button[data-variant=danger]:active{background-color:var(--re-color-danger-700);filter:brightness(.95)}.re-button[data-size=sm]{block-size:var(--re-control-height-sm);padding-inline:var(--re-space-3);font-size:var(--re-size-text-sm)}.re-button[data-size=lg]{block-size:var(--re-control-height-lg);padding-inline:var(--re-space-5);font-size:var(--re-size-text-lg)}.re-button[data-full-width]{inline-size:100%}.re-link{color:var(--re-color-link);text-underline-offset:.18em;border-radius:var(--re-radius-sm);transition:color var(--re-duration-fast) var(--re-easing-standard), text-decoration-color var(--re-duration-fast) var(--re-easing-standard);text-decoration-line:underline;text-decoration-color:currentColor;text-decoration-thickness:.08em}.re-link:hover{color:var(--re-color-link-hover)}.re-link:visited{color:var(--re-color-link-visited)}.re-link:focus-visible{box-shadow:var(--re-shadow-focus);outline:none}.re-link[data-variant=muted]{color:var(--re-color-text-muted);-webkit-text-decoration-color:var(--re-color-border-strong);text-decoration-color:var(--re-color-border-strong)}.re-link[data-variant=muted]:hover{color:var(--re-color-text);text-decoration-color:currentColor}.re-link[data-variant=subtle]{text-decoration-line:none}.re-link[data-variant=subtle]:hover{text-decoration-line:underline}.re-link[data-variant=external]:after{content:" ↗";speak:none}.re-input,.re-textarea,.re-select{box-sizing:border-box;inline-size:100%;min-block-size:var(--re-control-height-md);padding-inline:var(--re-control-padding-x);padding-block:var(--re-control-padding-y);font:inherit;font-size:var(--re-size-text-md);line-height:var(--re-line-height-normal);color:var(--re-color-text);background-color:var(--re-color-bg);border:var(--re-border-default);border-radius:var(--re-radius-md);appearance:none;transition:border-color var(--re-duration-fast) var(--re-easing-standard), box-shadow var(--re-duration-fast) var(--re-easing-standard), background-color var(--re-duration-fast) var(--re-easing-standard);display:block}.re-input::placeholder,.re-textarea::placeholder{color:var(--re-color-text-subtle);opacity:1}.re-input:hover,.re-textarea:hover,.re-select:hover{border-color:var(--re-color-border-strong)}.re-input:focus-visible,.re-textarea:focus-visible,.re-select:focus-visible{border-color:var(--re-color-focus-ring);box-shadow:var(--re-shadow-focus);outline:none}:is(.re-input[aria-invalid=true],.re-textarea[aria-invalid=true],.re-select[aria-invalid=true],.re-input:user-invalid,.re-textarea:user-invalid,.re-select:user-invalid){border-color:var(--re-color-border-danger)}:is(.re-input[aria-invalid=true]:focus-visible,.re-textarea[aria-invalid=true]:focus-visible,.re-select[aria-invalid=true]:focus-visible,.re-input:user-invalid:focus-visible,.re-textarea:user-invalid:focus-visible,.re-select:user-invalid:focus-visible){box-shadow:0 0 0 var(--re-focus-ring-offset) var(--re-color-bg), 0 0 0 calc(var(--re-focus-ring-offset) + var(--re-focus-ring-width)) var(--re-color-danger-500)}.re-input:disabled,.re-textarea:disabled,.re-select:disabled,.re-checkbox:disabled,.re-radio:disabled{cursor:not-allowed;background-color:var(--re-color-bg-muted);color:var(--re-color-text-subtle);opacity:.7}.re-input[data-size=sm],.re-textarea[data-size=sm],.re-select[data-size=sm]{min-block-size:var(--re-control-height-sm);font-size:var(--re-size-text-sm);padding-inline:var(--re-space-2)}.re-input[data-size=lg],.re-textarea[data-size=lg],.re-select[data-size=lg]{min-block-size:var(--re-control-height-lg);font-size:var(--re-size-text-lg);padding-inline:var(--re-space-4)}.re-textarea{min-block-size:calc(var(--re-control-height-md) * 2);resize:vertical;line-height:var(--re-line-height-relaxed)}.re-select{background-image:linear-gradient(45deg,#0000 50%,currentColor 50%),linear-gradient(135deg,currentColor 50%,#0000 50%);background-position:right var(--re-space-4) top 55%, right calc(var(--re-space-4) - 5px) top 55%;color:var(--re-color-text);background-repeat:no-repeat;background-size:5px 5px,5px 5px;padding-inline-end:var(--re-space-8)}.re-select[multiple]{min-block-size:calc(var(--re-control-height-md) * 3);background-image:none;padding-inline-end:var(--re-control-padding-x)}.re-select[multiple] option{padding-block:var(--re-space-1)}.re-checkbox,.re-radio{appearance:none;background-color:var(--re-color-bg);border:var(--re-border-width-strong) solid var(--re-color-border-strong);cursor:pointer;block-size:1.125rem;inline-size:1.125rem;color:var(--re-color-text-on-accent);transition:background-color var(--re-duration-fast) var(--re-easing-standard), border-color var(--re-duration-fast) var(--re-easing-standard), box-shadow var(--re-duration-fast) var(--re-easing-standard);flex-shrink:0;place-content:center;margin:0;padding:0;display:inline-grid}.re-checkbox{border-radius:var(--re-radius-sm)}.re-radio{border-radius:var(--re-radius-pill)}.re-checkbox:hover,.re-radio:hover{border-color:var(--re-color-accent-600)}.re-checkbox:focus-visible,.re-radio:focus-visible{box-shadow:var(--re-shadow-focus);border-color:var(--re-color-focus-ring);outline:none}.re-checkbox:checked,.re-radio:checked{background-color:var(--re-color-accent-600);border-color:var(--re-color-accent-600)}.re-checkbox:checked:before{content:"";clip-path:polygon(14% 44%,0 65%,50% 100%,100% 16%,80% 0,43% 62%);background-color:currentColor;block-size:.65rem;inline-size:.65rem}.re-radio:checked:before{content:"";border-radius:var(--re-radius-pill);background-color:currentColor;block-size:.55rem;inline-size:.55rem}.re-checkbox:indeterminate{background-color:var(--re-color-accent-600);border-color:var(--re-color-accent-600)}.re-checkbox:indeterminate:before{content:"";border-radius:var(--re-radius-sm);background-color:currentColor;block-size:.18rem;inline-size:.7rem}.re-checkbox[aria-invalid=true],.re-radio[aria-invalid=true]{border-color:var(--re-color-border-danger)}.re-field{gap:var(--re-space-2);color:var(--re-color-text);flex-direction:column;display:flex}.re-field__label{font-size:var(--re-size-text-sm);font-weight:var(--re-font-weight-medium);color:var(--re-color-text);line-height:1.2}.re-field__label[data-required]:after{content:" *";color:var(--re-color-text-danger);margin-inline-start:.1em}.re-field__hint{font-size:var(--re-size-text-sm);color:var(--re-color-text-muted);line-height:var(--re-line-height-normal)}.re-field--inline{align-items:center;gap:var(--re-space-3);flex-direction:row}.re-field-group{gap:var(--re-space-2);border:0;flex-direction:column;margin:0;padding:0;display:flex}.re-field-group__legend{font-size:var(--re-size-text-sm);font-weight:var(--re-font-weight-medium);color:var(--re-color-text);padding:0;line-height:1.2}.re-field-group[data-orientation=horizontal]>.re-field-group__items{gap:var(--re-space-4);flex-flow:wrap}.re-field-group__items{gap:var(--re-space-2);flex-direction:column;display:flex}.re-validation-message{font-size:var(--re-size-text-sm);line-height:var(--re-line-height-normal);color:var(--re-color-text-danger);display:block}.re-validation-message[data-tone=success]{color:var(--re-color-success-700)}.re-validation-message[data-tone=hint]{color:var(--re-color-text-muted)}.re-validation-message[data-tone=warning]{color:var(--re-color-warning-700)}.re-disclosure{border:var(--re-border-default);border-radius:var(--re-radius-md);background-color:var(--re-color-surface);overflow:hidden}.re-disclosure__summary{cursor:pointer;padding:var(--re-space-3) var(--re-space-4);font-weight:var(--re-font-weight-medium);color:var(--re-color-text);align-items:center;gap:var(--re-space-3);-webkit-user-select:none;user-select:none;transition:background-color var(--re-duration-fast) var(--re-easing-standard);list-style:none;display:flex}.re-disclosure__summary::-webkit-details-marker{display:none}.re-disclosure__summary:before{content:"";block-size:.6rem;inline-size:.6rem;transition:transform var(--re-duration-fast) var(--re-easing-standard);border-block-end:2px solid;border-inline-end:2px solid;flex-shrink:0;margin-inline-end:var(--re-space-1);transform:rotate(-45deg)}.re-disclosure[open]>.re-disclosure__summary:before{transform:rotate(45deg)}.re-disclosure__summary:hover{background-color:var(--re-color-bg-subtle)}.re-disclosure__summary:focus-visible{box-shadow:var(--re-shadow-focus);outline:none}.re-disclosure__body{padding:var(--re-space-3) var(--re-space-4) var(--re-space-4);border-block-start:var(--re-border-default);color:var(--re-color-text);line-height:var(--re-line-height-normal)}.re-disclosure[data-variant=plain]{background:0 0;border:0}.re-disclosure[data-variant=plain]>.re-disclosure__body{border-block-start:0;padding-block-start:var(--re-space-2)}.re-dialog:not([open]){display:none}.re-dialog{box-sizing:border-box;border:var(--re-border-default);border-radius:var(--re-radius-lg);background-color:var(--re-color-surface);color:var(--re-color-text);max-block-size:min(85vh,40rem);inline-size:min(90vw,32rem);box-shadow:var(--re-shadow-lg);flex-direction:column;padding:0;display:flex;overflow:hidden}.re-dialog::backdrop{-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);background-color:#0006}.re-dialog:focus-visible{outline:none}.re-dialog__header{justify-content:space-between;align-items:center;gap:var(--re-space-3);padding:var(--re-space-4);border-block-end:var(--re-border-default);display:flex}.re-dialog__title{font-size:var(--re-size-text-lg);font-weight:var(--re-font-weight-semibold);line-height:var(--re-line-height-tight);color:var(--re-color-text);margin:0}.re-dialog__close{appearance:none;cursor:pointer;padding:var(--re-space-1) var(--re-space-2);border-radius:var(--re-radius-md);color:var(--re-color-text-muted);font:inherit;font-size:var(--re-size-text-xl);transition:background-color var(--re-duration-fast) var(--re-easing-standard);background:0 0;border:0;line-height:1}.re-dialog__close:hover{background-color:var(--re-color-bg-subtle);color:var(--re-color-text)}.re-dialog__close:focus-visible{box-shadow:var(--re-shadow-focus);outline:none}.re-dialog__body{padding:var(--re-space-4);line-height:var(--re-line-height-normal);overflow-y:auto}.re-dialog__footer{justify-content:flex-end;gap:var(--re-space-3);padding:var(--re-space-4);border-block-start:var(--re-border-default);background-color:var(--re-color-bg-subtle);display:flex}.re-progress,.re-meter{appearance:none;border-radius:var(--re-radius-pill);background-color:var(--re-color-bg-muted);block-size:.5rem;inline-size:100%;color:var(--re-color-accent-600);border:0;overflow:hidden}.re-progress::-webkit-progress-bar{background-color:var(--re-color-bg-muted);border-radius:var(--re-radius-pill)}.re-progress::-webkit-progress-value{background-color:var(--re-color-accent-600);border-radius:var(--re-radius-pill);transition:inline-size var(--re-duration-normal) var(--re-easing-standard)}.re-progress::-moz-progress-bar{background-color:var(--re-color-accent-600);border-radius:var(--re-radius-pill)}.re-progress:indeterminate{background:linear-gradient(90deg, transparent 0%, var(--re-color-accent-300) 50%, transparent 100%) no-repeat, var(--re-color-bg-muted);background-size:40% 100%,100% 100%;animation:1.2s linear infinite re-progress-indeterminate}@keyframes re-progress-indeterminate{0%{background-position:-40% 0,0 0}to{background-position:140% 0,0 0}}@media (prefers-reduced-motion:reduce){.re-progress:indeterminate{animation-duration:.01ms}}.re-meter::-webkit-meter-bar{background-color:var(--re-color-bg-muted);border-radius:var(--re-radius-pill);border:0}.re-meter::-webkit-meter-optimum-value{background-color:var(--re-color-success-600);border-radius:var(--re-radius-pill)}.re-meter::-webkit-meter-suboptimum-value{background-color:var(--re-color-warning-600);border-radius:var(--re-radius-pill)}.re-meter::-webkit-meter-even-less-good-value{background-color:var(--re-color-danger-600);border-radius:var(--re-radius-pill)}.re-meter::-moz-meter-bar{background-color:var(--re-color-success-600);border-radius:var(--re-radius-pill)}.re-meter:-moz-meter-sub-optimum::-moz-meter-bar{background-color:var(--re-color-warning-600)}.re-meter:-moz-meter-sub-sub-optimum::-moz-meter-bar{background-color:var(--re-color-danger-600)}.re-progress[data-size=sm],.re-meter[data-size=sm]{block-size:.25rem}.re-progress[data-size=lg],.re-meter[data-size=lg]{block-size:.75rem}.re-tabs{gap:var(--re-space-4);flex-direction:column;display:flex}.re-tabs__list{gap:var(--re-space-1);border-block-end:var(--re-border-default);flex-wrap:wrap;padding-block-end:0;display:flex}.re-tab{appearance:none;cursor:pointer;font:inherit;color:var(--re-color-text-muted);padding:var(--re-space-2) var(--re-space-4);border-radius:var(--re-radius-md) var(--re-radius-md) 0 0;line-height:1.4;font-weight:var(--re-font-weight-medium);transition:color var(--re-duration-fast) var(--re-easing-standard), background-color var(--re-duration-fast) var(--re-easing-standard);background:0 0;border:0;position:relative}.re-tab:hover{color:var(--re-color-text);background-color:var(--re-color-bg-subtle)}.re-tab:focus-visible{box-shadow:var(--re-shadow-focus);outline:none}.re-tab[aria-selected=true]{color:var(--re-color-text);background-color:var(--re-color-bg)}.re-tab[aria-selected=true]:after{content:"";inset-inline:var(--re-space-2);background-color:var(--re-color-accent-600);border-radius:var(--re-radius-sm);block-size:2px;position:absolute;inset-block-end:calc(var(--re-border-width) * -1)}.re-tabpanel{color:var(--re-color-text);line-height:var(--re-line-height-normal)}.re-tabpanel:focus-visible{box-shadow:var(--re-shadow-focus);border-radius:var(--re-radius-md);outline:none}.re-menu{display:inline-block;position:relative}.re-menu__panel{background-color:var(--re-color-surface);border:var(--re-border-default);border-radius:var(--re-radius-md);min-inline-size:12rem;box-shadow:var(--re-shadow-md);padding:var(--re-space-1);z-index:var(--re-z-popover);flex-direction:column;gap:1px;display:flex;position:absolute;inset-block-start:calc(100% + var(--re-space-1));inset-inline-start:0}.re-menu__item{appearance:none;cursor:pointer;font:inherit;text-align:start;padding:var(--re-space-2) var(--re-space-3);border-radius:var(--re-radius-sm);color:var(--re-color-text);line-height:var(--re-line-height-normal);background:0 0;border:0}.re-menu__item:hover{background-color:var(--re-color-bg-muted);outline:none}.re-menu__item:focus-visible{background-color:var(--re-color-bg-muted);box-shadow:inset 0 0 0 2px var(--re-color-focus-ring);outline:none}.re-menu__item[aria-disabled=true],.re-menu__item:disabled{color:var(--re-color-text-subtle);cursor:not-allowed}.re-menu__separator{background-color:var(--re-color-border);block-size:1px;margin-block:var(--re-space-1)}.re-popover{border:var(--re-border-default);border-radius:var(--re-radius-md);background-color:var(--re-color-surface);color:var(--re-color-text);padding:var(--re-space-3) var(--re-space-4);box-shadow:var(--re-shadow-md);max-inline-size:22rem;line-height:var(--re-line-height-normal);margin:0;inset:auto}.re-popover:popover-open{margin:0}.re-popover[data-tone=info]{background-color:color-mix(in srgb, var(--re-color-accent-500) 12%, var(--re-color-surface));border-color:var(--re-color-accent-500)}.re-popover[data-tone=warning]{background-color:color-mix(in srgb, var(--re-color-warning-500) 12%, var(--re-color-surface));border-color:var(--re-color-warning-500)}.re-popover[data-tone=danger]{background-color:color-mix(in srgb, var(--re-color-danger-500) 12%, var(--re-color-surface));border-color:var(--re-color-danger-500)}.re-toast-region{z-index:var(--re-z-toast);pointer-events:none;position:fixed;inset-block-end:var(--re-space-6);inset-inline-end:var(--re-space-6)}.re-toast-list{gap:var(--re-space-2);flex-direction:column-reverse;min-inline-size:16rem;max-inline-size:24rem;margin:0;padding:0;display:flex}.re-toast{pointer-events:auto;gap:var(--re-space-3);padding:var(--re-space-3) var(--re-space-4);background-color:var(--re-color-surface);color:var(--re-color-text);border:var(--re-border-default);border-radius:var(--re-radius-md);box-shadow:var(--re-shadow-md);line-height:var(--re-line-height-normal);align-items:flex-start;display:flex}.re-toast__body{flex:auto}.re-toast__dismiss{appearance:none;cursor:pointer;color:var(--re-color-text-muted);font:inherit;font-size:var(--re-size-text-lg);padding:0 var(--re-space-1);border-radius:var(--re-radius-sm);background:0 0;border:0;line-height:1}.re-toast__dismiss:hover{color:var(--re-color-text);background:var(--re-color-bg-subtle)}.re-toast__dismiss:focus-visible{box-shadow:var(--re-shadow-focus);outline:none}.re-toast[data-tone=success]{background-color:color-mix(in srgb, var(--re-color-success-600) 12%, var(--re-color-surface));border-color:var(--re-color-success-600);color:var(--re-color-text)}.re-toast[data-tone=danger]{background-color:color-mix(in srgb, var(--re-color-danger-600) 12%, var(--re-color-surface));border-color:var(--re-color-danger-600);color:var(--re-color-text)}.re-toast[data-tone=warning]{background-color:color-mix(in srgb, var(--re-color-warning-600) 12%, var(--re-color-surface));border-color:var(--re-color-warning-600);color:var(--re-color-text)}.re-accordion{border:var(--re-border-default);border-radius:var(--re-radius-md);flex-direction:column;display:flex;overflow:hidden}.re-accordion>.re-disclosure{border-width:0;border-radius:0}.re-accordion>.re-disclosure+.re-disclosure{border-block-start:var(--re-border-default)}.re-alert{align-items:flex-start;gap:var(--re-space-3);padding:var(--re-space-3) var(--re-space-4);border:var(--re-border-width) solid var(--re-color-info-border);border-radius:var(--re-radius-md);background-color:var(--re-color-info-surface);color:var(--re-color-text);line-height:var(--re-line-height-normal);display:flex}.re-alert__content{flex:auto;min-inline-size:0}.re-alert__title{margin:0 0 var(--re-space-1);font-weight:var(--re-font-weight-semibold);color:var(--re-color-info-text)}.re-alert__dismiss{appearance:none;cursor:pointer;padding:var(--re-space-1) var(--re-space-2);border-radius:var(--re-radius-sm);font-size:var(--re-size-text-lg);color:var(--re-color-text-muted);background:0 0;border:0;flex-shrink:0;line-height:1}.re-alert__dismiss:hover{color:var(--re-color-text);background:color-mix(in oklab, var(--re-color-text) 10%, transparent)}.re-alert__dismiss:focus-visible{box-shadow:var(--re-shadow-focus);outline:none}.re-alert[data-variant=success]{border-color:var(--re-color-success-border);background-color:var(--re-color-success-surface)}.re-alert[data-variant=success] .re-alert__title{color:var(--re-color-success-text)}.re-alert[data-variant=warning]{border-color:var(--re-color-warning-border);background-color:var(--re-color-warning-surface)}.re-alert[data-variant=warning] .re-alert__title{color:var(--re-color-warning-text)}.re-alert[data-variant=danger]{border-color:var(--re-color-danger-border);background-color:var(--re-color-danger-surface)}.re-alert[data-variant=danger] .re-alert__title{color:var(--re-color-danger-text)}.re-avatar{inline-size:var(--re-control-height-md);block-size:var(--re-control-height-md);border-radius:var(--re-radius-pill);background-color:var(--re-color-bg-muted);color:var(--re-color-text-muted);font-size:var(--re-size-text-sm);font-weight:var(--re-font-weight-medium);text-transform:uppercase;-webkit-user-select:none;user-select:none;flex-shrink:0;justify-content:center;align-items:center;line-height:1;display:inline-flex;overflow:hidden}.re-avatar>img{object-fit:cover;block-size:100%;inline-size:100%}.re-avatar[data-size=sm]{inline-size:var(--re-control-height-sm);block-size:var(--re-control-height-sm);font-size:var(--re-size-text-xs)}.re-avatar[data-size=lg]{inline-size:var(--re-control-height-lg);block-size:var(--re-control-height-lg);font-size:var(--re-size-text-md)}.re-badge{align-items:center;gap:var(--re-space-1);padding-inline:var(--re-space-2);padding-block:calc(var(--re-space-1) / 2);font-size:var(--re-size-text-xs);font-weight:var(--re-font-weight-medium);white-space:nowrap;border-radius:var(--re-radius-pill);background-color:var(--re-color-bg-muted);color:var(--re-color-text-muted);line-height:1.4;display:inline-flex}.re-badge[data-variant=info]{background-color:var(--re-color-info-surface);color:var(--re-color-info-text)}.re-badge[data-variant=success]{background-color:var(--re-color-success-surface);color:var(--re-color-success-text)}.re-badge[data-variant=warning]{background-color:var(--re-color-warning-surface);color:var(--re-color-warning-text)}.re-badge[data-variant=danger]{background-color:var(--re-color-danger-surface);color:var(--re-color-danger-text)}.re-breadcrumb>ol{align-items:center;gap:var(--re-space-2);font-size:var(--re-size-text-sm);color:var(--re-color-text-muted);flex-wrap:wrap;margin:0;padding:0;list-style:none;display:flex}.re-breadcrumb li{align-items:center;gap:var(--re-space-2);display:inline-flex}.re-breadcrumb li+li:before{content:"/";color:var(--re-color-text-subtle);-webkit-user-select:none;user-select:none}.re-breadcrumb a{color:var(--re-color-link);border-radius:var(--re-radius-sm);text-decoration:none}.re-breadcrumb a:hover{text-decoration:underline}.re-breadcrumb a:focus-visible{box-shadow:var(--re-shadow-focus);outline:none}.re-breadcrumb [aria-current=page]{color:var(--re-color-text);font-weight:var(--re-font-weight-medium);pointer-events:none;text-decoration:none}.re-card{background-color:var(--re-color-surface);border:var(--re-border-default);border-radius:var(--re-radius-lg);box-shadow:var(--re-shadow-sm);color:var(--re-color-text);flex-direction:column;display:flex;overflow:hidden}a.re-card{text-decoration:none}.re-card__header{padding:var(--re-space-4);font-weight:var(--re-font-weight-semibold);border-block-end:var(--re-border-default)}.re-card__body{padding:var(--re-space-4);line-height:var(--re-line-height-normal)}.re-card__footer{padding:var(--re-space-3) var(--re-space-4);border-block-start:var(--re-border-default);background-color:var(--re-color-bg-subtle)}.re-card[data-interactive]{cursor:pointer;transition:box-shadow var(--re-duration-fast) var(--re-easing-standard), border-color var(--re-duration-fast) var(--re-easing-standard)}.re-card[data-interactive]:hover{box-shadow:var(--re-shadow-md);border-color:var(--re-color-border-strong)}.re-card[data-interactive]:focus-within{box-shadow:var(--re-shadow-focus);outline:none}.re-switch{appearance:none;box-sizing:border-box;border:var(--re-border-width) solid var(--re-color-border-strong);border-radius:var(--re-radius-pill);background-color:var(--re-color-bg-muted);cursor:pointer;vertical-align:middle;block-size:1.25rem;inline-size:2.25rem;transition:background-color var(--re-duration-fast) var(--re-easing-standard), border-color var(--re-duration-fast) var(--re-easing-standard);flex-shrink:0;margin:0;position:relative}.re-switch:before{content:"";border-radius:var(--re-radius-pill);background-color:var(--re-color-surface);block-size:.875rem;inline-size:.875rem;box-shadow:var(--re-shadow-sm);transition:transform var(--re-duration-fast) var(--re-easing-standard);position:absolute;inset-block-start:2px;inset-inline-start:2px}.re-switch:checked{background-color:var(--re-color-accent-600);border-color:var(--re-color-accent-600)}.re-switch:checked:before{transform:translate(1rem)}.re-switch:focus-visible{box-shadow:var(--re-shadow-focus);outline:none}.re-switch:disabled{cursor:not-allowed;opacity:.55}.re-tag{align-items:center;gap:var(--re-space-1);padding-inline:var(--re-space-2);padding-block:calc(var(--re-space-1) / 2);font-size:var(--re-size-text-xs);white-space:nowrap;border:var(--re-border-width) solid var(--re-color-border);border-radius:var(--re-radius-pill);background-color:var(--re-color-bg-subtle);color:var(--re-color-text);line-height:1.4;display:inline-flex}.re-tag__remove{appearance:none;border-radius:var(--re-radius-pill);block-size:1rem;inline-size:1rem;color:var(--re-color-text-muted);font-size:var(--re-size-text-sm);cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;padding:0;line-height:1;display:inline-flex}.re-tag__remove:hover{color:var(--re-color-text);background:color-mix(in oklab, var(--re-color-text) 12%, transparent)}.re-tag__remove:focus-visible{box-shadow:var(--re-shadow-focus);outline:none}.re-tag[data-variant=info]{border-color:var(--re-color-info-border);background-color:var(--re-color-info-surface);color:var(--re-color-info-text)}.re-tag[data-variant=success]{border-color:var(--re-color-success-border);background-color:var(--re-color-success-surface);color:var(--re-color-success-text)}.re-tag[data-variant=warning]{border-color:var(--re-color-warning-border);background-color:var(--re-color-warning-surface);color:var(--re-color-warning-text)}.re-tag[data-variant=danger]{border-color:var(--re-color-danger-border);background-color:var(--re-color-danger-surface);color:var(--re-color-danger-text)}}
package/dist/tokens.css CHANGED
@@ -1 +1 @@
1
- @layer re.tokens{:root{--re-color-neutral-0:#fff;--re-color-neutral-50:#f8fafc;--re-color-neutral-100:#f1f5f9;--re-color-neutral-200:#e2e8f0;--re-color-neutral-300:#cbd5e1;--re-color-neutral-400:#94a3b8;--re-color-neutral-500:#64748b;--re-color-neutral-600:#475569;--re-color-neutral-700:#334155;--re-color-neutral-800:#1e293b;--re-color-neutral-900:#0f172a;--re-color-neutral-950:#020617;--re-color-accent-50:#eff6ff;--re-color-accent-100:#dbeafe;--re-color-accent-200:#bfdbfe;--re-color-accent-300:#93c5fd;--re-color-accent-400:#60a5fa;--re-color-accent-500:#3b82f6;--re-color-accent-600:#2563eb;--re-color-accent-700:#1d4ed8;--re-color-accent-800:#1e40af;--re-color-accent-900:#1e3a8a;--re-color-danger-500:#ef4444;--re-color-danger-600:#dc2626;--re-color-danger-700:#b91c1c;--re-color-success-500:#10b981;--re-color-success-600:#059669;--re-color-success-700:#047857;--re-color-warning-500:#f59e0b;--re-color-warning-600:#d97706;--re-color-warning-700:#b45309;--re-color-bg:var(--re-color-neutral-0);--re-color-bg-subtle:var(--re-color-neutral-50);--re-color-bg-muted:var(--re-color-neutral-100);--re-color-surface:var(--re-color-neutral-0);--re-color-text:var(--re-color-neutral-900);--re-color-text-muted:var(--re-color-neutral-600);--re-color-text-subtle:var(--re-color-neutral-500);--re-color-text-on-accent:var(--re-color-neutral-0);--re-color-text-danger:var(--re-color-danger-700);--re-color-border:var(--re-color-neutral-200);--re-color-border-strong:var(--re-color-neutral-300);--re-color-border-danger:var(--re-color-danger-500);--re-color-link:var(--re-color-accent-700);--re-color-link-hover:var(--re-color-accent-800);--re-color-link-visited:var(--re-color-accent-800);--re-color-focus-ring:var(--re-color-accent-500);--re-color-selection-bg:var(--re-color-accent-100);--re-color-selection-text:var(--re-color-neutral-900);--re-font-sans:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif;--re-font-mono:ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;--re-size-text-xs:.75rem;--re-size-text-sm:.875rem;--re-size-text-md:1rem;--re-size-text-lg:1.125rem;--re-size-text-xl:1.25rem;--re-size-text-2xl:1.5rem;--re-size-text-3xl:1.875rem;--re-size-text-4xl:2.25rem;--re-line-height-tight:1.2;--re-line-height-snug:1.35;--re-line-height-normal:1.5;--re-line-height-relaxed:1.65;--re-font-weight-regular:400;--re-font-weight-medium:500;--re-font-weight-semibold:600;--re-font-weight-bold:700;--re-space-0:0;--re-space-1:.25rem;--re-space-2:.5rem;--re-space-3:.75rem;--re-space-4:1rem;--re-space-5:1.25rem;--re-space-6:1.5rem;--re-space-8:2rem;--re-space-10:2.5rem;--re-space-12:3rem;--re-space-16:4rem;--re-radius-none:0;--re-radius-sm:.25rem;--re-radius-md:.375rem;--re-radius-lg:.5rem;--re-radius-xl:.75rem;--re-radius-pill:9999px;--re-border-width:1px;--re-border-width-strong:2px;--re-border-default:var(--re-border-width) solid var(--re-color-border);--re-border-strong:var(--re-border-width-strong) solid var(--re-color-border-strong);--re-border-danger:var(--re-border-width) solid var(--re-color-border-danger);--re-focus-ring-width:2px;--re-focus-ring-offset:2px;--re-focus-ring-color:var(--re-color-focus-ring);--re-shadow-focus:0 0 0 var(--re-focus-ring-offset) var(--re-color-bg), 0 0 0 calc(var(--re-focus-ring-offset) + var(--re-focus-ring-width)) var(--re-color-focus-ring);--re-shadow-sm:0 1px 2px #0000000f;--re-shadow-md:0 4px 12px #00000014;--re-shadow-lg:0 12px 32px #0000001f;--re-duration-instant:0s;--re-duration-fast:.12s;--re-duration-normal:.2s;--re-duration-slow:.32s;--re-easing-standard:cubic-bezier(.2, 0, 0, 1);--re-easing-emphasized:cubic-bezier(.3, 0, 0, 1);--re-z-base:0;--re-z-overlay:100;--re-z-popover:200;--re-z-dialog:300;--re-z-toast:400;--re-control-height-sm:1.75rem;--re-control-height-md:2.25rem;--re-control-height-lg:2.75rem;--re-control-padding-x:var(--re-space-3);--re-control-padding-y:var(--re-space-2)}@media (prefers-color-scheme:dark){:root{--re-color-bg:var(--re-color-neutral-950);--re-color-bg-subtle:var(--re-color-neutral-900);--re-color-bg-muted:var(--re-color-neutral-800);--re-color-surface:var(--re-color-neutral-900);--re-color-text:var(--re-color-neutral-50);--re-color-text-muted:var(--re-color-neutral-300);--re-color-text-subtle:var(--re-color-neutral-400);--re-color-text-on-accent:var(--re-color-neutral-0);--re-color-text-danger:var(--re-color-danger-500);--re-color-border:var(--re-color-neutral-700);--re-color-border-strong:var(--re-color-neutral-600);--re-color-link:var(--re-color-accent-300);--re-color-link-hover:var(--re-color-accent-200);--re-color-link-visited:var(--re-color-accent-200);--re-color-focus-ring:var(--re-color-accent-400);--re-color-selection-bg:var(--re-color-accent-900);--re-color-selection-text:var(--re-color-neutral-50);--re-focus-ring-offset:0px;--re-shadow-focus:0 0 0 2px var(--re-color-focus-ring)}}}
1
+ @layer re.tokens{:root{--re-color-neutral-0:#fff;--re-color-neutral-50:#f8fafc;--re-color-neutral-100:#f1f5f9;--re-color-neutral-200:#e2e8f0;--re-color-neutral-300:#cbd5e1;--re-color-neutral-400:#94a3b8;--re-color-neutral-500:#64748b;--re-color-neutral-600:#475569;--re-color-neutral-700:#334155;--re-color-neutral-800:#1e293b;--re-color-neutral-900:#0f172a;--re-color-neutral-950:#020617;--re-color-accent-50:#eff6ff;--re-color-accent-100:#dbeafe;--re-color-accent-200:#bfdbfe;--re-color-accent-300:#93c5fd;--re-color-accent-400:#60a5fa;--re-color-accent-500:#3b82f6;--re-color-accent-600:#2563eb;--re-color-accent-700:#1d4ed8;--re-color-accent-800:#1e40af;--re-color-accent-900:#1e3a8a;--re-color-danger-500:#ef4444;--re-color-danger-600:#dc2626;--re-color-danger-700:#b91c1c;--re-color-success-500:#10b981;--re-color-success-600:#059669;--re-color-success-700:#047857;--re-color-warning-500:#f59e0b;--re-color-warning-600:#d97706;--re-color-warning-700:#b45309;--re-color-bg:var(--re-color-neutral-0);--re-color-bg-subtle:var(--re-color-neutral-50);--re-color-bg-muted:var(--re-color-neutral-100);--re-color-surface:var(--re-color-neutral-0);--re-color-text:var(--re-color-neutral-900);--re-color-text-muted:var(--re-color-neutral-600);--re-color-text-subtle:var(--re-color-neutral-500);--re-color-text-on-accent:var(--re-color-neutral-0);--re-color-text-danger:var(--re-color-danger-700);--re-color-border:var(--re-color-neutral-200);--re-color-border-strong:var(--re-color-neutral-300);--re-color-border-danger:var(--re-color-danger-500);--re-color-link:var(--re-color-accent-700);--re-color-link-hover:var(--re-color-accent-800);--re-color-link-visited:var(--re-color-accent-800);--re-color-focus-ring:var(--re-color-accent-500);--re-color-selection-bg:var(--re-color-accent-100);--re-color-selection-text:var(--re-color-neutral-900);--re-color-info-surface:color-mix(in oklab, var(--re-color-accent-500) 12%, var(--re-color-bg));--re-color-info-border:var(--re-color-accent-500);--re-color-info-text:var(--re-color-accent-700);--re-color-success-surface:color-mix(in oklab, var(--re-color-success-500) 12%, var(--re-color-bg));--re-color-success-border:var(--re-color-success-500);--re-color-success-text:var(--re-color-success-700);--re-color-warning-surface:color-mix(in oklab, var(--re-color-warning-500) 12%, var(--re-color-bg));--re-color-warning-border:var(--re-color-warning-500);--re-color-warning-text:var(--re-color-warning-700);--re-color-danger-surface:color-mix(in oklab, var(--re-color-danger-500) 12%, var(--re-color-bg));--re-color-danger-border:var(--re-color-danger-500);--re-color-danger-text:var(--re-color-danger-700);--re-font-sans:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif;--re-font-mono:ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;--re-size-text-xs:.75rem;--re-size-text-sm:.875rem;--re-size-text-md:1rem;--re-size-text-lg:1.125rem;--re-size-text-xl:1.25rem;--re-size-text-2xl:1.5rem;--re-size-text-3xl:1.875rem;--re-size-text-4xl:2.25rem;--re-line-height-tight:1.2;--re-line-height-snug:1.35;--re-line-height-normal:1.5;--re-line-height-relaxed:1.65;--re-font-weight-regular:400;--re-font-weight-medium:500;--re-font-weight-semibold:600;--re-font-weight-bold:700;--re-space-0:0;--re-space-1:.25rem;--re-space-2:.5rem;--re-space-3:.75rem;--re-space-4:1rem;--re-space-5:1.25rem;--re-space-6:1.5rem;--re-space-8:2rem;--re-space-10:2.5rem;--re-space-12:3rem;--re-space-16:4rem;--re-radius-none:0;--re-radius-sm:.25rem;--re-radius-md:.375rem;--re-radius-lg:.5rem;--re-radius-xl:.75rem;--re-radius-pill:9999px;--re-border-width:1px;--re-border-width-strong:2px;--re-border-default:var(--re-border-width) solid var(--re-color-border);--re-border-strong:var(--re-border-width-strong) solid var(--re-color-border-strong);--re-border-danger:var(--re-border-width) solid var(--re-color-border-danger);--re-focus-ring-width:2px;--re-focus-ring-offset:2px;--re-focus-ring-color:var(--re-color-focus-ring);--re-shadow-focus:0 0 0 var(--re-focus-ring-offset) var(--re-color-bg), 0 0 0 calc(var(--re-focus-ring-offset) + var(--re-focus-ring-width)) var(--re-color-focus-ring);--re-shadow-sm:0 1px 2px #0000000f;--re-shadow-md:0 4px 12px #00000014;--re-shadow-lg:0 12px 32px #0000001f;--re-duration-instant:0s;--re-duration-fast:.12s;--re-duration-normal:.2s;--re-duration-slow:.32s;--re-easing-standard:cubic-bezier(.2, 0, 0, 1);--re-easing-emphasized:cubic-bezier(.3, 0, 0, 1);--re-z-base:0;--re-z-overlay:100;--re-z-popover:200;--re-z-dialog:300;--re-z-toast:400;--re-control-height-sm:1.75rem;--re-control-height-md:2.25rem;--re-control-height-lg:2.75rem;--re-control-padding-x:var(--re-space-3);--re-control-padding-y:var(--re-space-2)}@media (prefers-color-scheme:dark){:root{--re-color-bg:var(--re-color-neutral-950);--re-color-bg-subtle:var(--re-color-neutral-900);--re-color-bg-muted:var(--re-color-neutral-800);--re-color-surface:var(--re-color-neutral-900);--re-color-text:var(--re-color-neutral-50);--re-color-text-muted:var(--re-color-neutral-300);--re-color-text-subtle:var(--re-color-neutral-400);--re-color-text-on-accent:var(--re-color-neutral-0);--re-color-text-danger:var(--re-color-danger-500);--re-color-border:var(--re-color-neutral-700);--re-color-border-strong:var(--re-color-neutral-600);--re-color-link:var(--re-color-accent-300);--re-color-link-hover:var(--re-color-accent-200);--re-color-link-visited:var(--re-color-accent-200);--re-color-focus-ring:var(--re-color-accent-400);--re-color-selection-bg:var(--re-color-accent-900);--re-color-selection-text:var(--re-color-neutral-50);--re-color-info-surface:color-mix(in oklab, var(--re-color-accent-500) 20%, var(--re-color-bg));--re-color-info-border:var(--re-color-accent-400);--re-color-info-text:var(--re-color-accent-200);--re-color-success-surface:color-mix(in oklab, var(--re-color-success-500) 20%, var(--re-color-bg));--re-color-success-border:var(--re-color-success-500);--re-color-success-text:var(--re-color-success-500);--re-color-warning-surface:color-mix(in oklab, var(--re-color-warning-500) 20%, var(--re-color-bg));--re-color-warning-border:var(--re-color-warning-500);--re-color-warning-text:var(--re-color-warning-500);--re-color-danger-surface:color-mix(in oklab, var(--re-color-danger-500) 20%, var(--re-color-bg));--re-color-danger-border:var(--re-color-danger-500);--re-color-danger-text:var(--re-color-danger-500);--re-focus-ring-offset:0px;--re-shadow-focus:0 0 0 2px var(--re-color-focus-ring)}}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@relements/core",
3
- "version": "0.1.2",
3
+ "version": "0.2.0",
4
4
  "description": "HTML-first design system core: tokens, styles, and progressive enhancement.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -25,7 +25,9 @@
25
25
  "type": "module",
26
26
  "sideEffects": [
27
27
  "**/*.css",
28
- "dist/**/*.css"
28
+ "dist/**/*.css",
29
+ "dist/elements/*.js",
30
+ "src/elements/*.js"
29
31
  ],
30
32
  "files": [
31
33
  "dist",
@@ -50,6 +52,14 @@
50
52
  "./components/menu.css": "./dist/components/menu.css",
51
53
  "./components/popover.css": "./dist/components/popover.css",
52
54
  "./components/toast.css": "./dist/components/toast.css",
55
+ "./components/accordion.css": "./dist/components/accordion.css",
56
+ "./components/alert.css": "./dist/components/alert.css",
57
+ "./components/avatar.css": "./dist/components/avatar.css",
58
+ "./components/badge.css": "./dist/components/badge.css",
59
+ "./components/breadcrumb.css": "./dist/components/breadcrumb.css",
60
+ "./components/card.css": "./dist/components/card.css",
61
+ "./components/switch.css": "./dist/components/switch.css",
62
+ "./components/tag.css": "./dist/components/tag.css",
53
63
  "./themes/renascent.css": "./dist/themes/renascent.css",
54
64
  "./behaviors/dismissible": {
55
65
  "import": "./dist/behaviors/dismissible.js",
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Relements accordion.
3
+ *
4
+ * A group of <details> disclosures. Give every <details> the same `name`
5
+ * attribute and the browser keeps a single panel open at a time — natively,
6
+ * with no JavaScript.
7
+ *
8
+ * <div class="re-accordion">
9
+ * <details class="re-disclosure" name="faq" open>
10
+ * <summary class="re-disclosure__summary">First</summary>
11
+ * <div class="re-disclosure__body">…</div>
12
+ * </details>
13
+ * <details class="re-disclosure" name="faq">…</details>
14
+ * </div>
15
+ *
16
+ * Progressive enhancement: browsers without exclusive `<details name>`
17
+ * support simply allow multiple panels open — still fully functional.
18
+ * Reuses the disclosure component for each item's summary / chevron / body.
19
+ */
20
+
21
+ @layer re.components {
22
+ .re-accordion {
23
+ display: flex;
24
+ flex-direction: column;
25
+ border: var(--re-border-default);
26
+ border-radius: var(--re-radius-md);
27
+ overflow: hidden; /* clip joined items to the rounded corners */
28
+ }
29
+
30
+ /* Items sit flush; the group owns the outer border + radius. */
31
+ .re-accordion > .re-disclosure {
32
+ border-width: 0;
33
+ border-radius: 0;
34
+ }
35
+ .re-accordion > .re-disclosure + .re-disclosure {
36
+ border-block-start: var(--re-border-default);
37
+ }
38
+ }
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Relements alert / callout.
3
+ *
4
+ * A status message block. Add role="status" (polite) or role="alert"
5
+ * (assertive) on the host element for screen-reader semantics.
6
+ *
7
+ * <div class="re-alert" data-variant="success" role="status">
8
+ * <div class="re-alert__content">
9
+ * <p class="re-alert__title">Saved</p>
10
+ * Your changes are live.
11
+ * </div>
12
+ * </div>
13
+ *
14
+ * Dismissible: mark the host [data-re-dismissible], add a [data-re-dismiss]
15
+ * button, and call enhanceDismissible().
16
+ *
17
+ * Variants (data-variant): info (default), success, warning, danger.
18
+ */
19
+
20
+ @layer re.components {
21
+ .re-alert {
22
+ display: flex;
23
+ align-items: flex-start;
24
+ gap: var(--re-space-3);
25
+ padding: var(--re-space-3) var(--re-space-4);
26
+ border: var(--re-border-width) solid var(--re-color-info-border);
27
+ border-radius: var(--re-radius-md);
28
+ background-color: var(--re-color-info-surface);
29
+ color: var(--re-color-text);
30
+ line-height: var(--re-line-height-normal);
31
+ }
32
+
33
+ .re-alert__content {
34
+ flex: 1 1 auto;
35
+ min-inline-size: 0;
36
+ }
37
+
38
+ .re-alert__title {
39
+ margin: 0 0 var(--re-space-1);
40
+ font-weight: var(--re-font-weight-semibold);
41
+ color: var(--re-color-info-text);
42
+ }
43
+
44
+ .re-alert__dismiss {
45
+ appearance: none;
46
+ flex-shrink: 0;
47
+ background: transparent;
48
+ border: 0;
49
+ cursor: pointer;
50
+ padding: var(--re-space-1) var(--re-space-2);
51
+ border-radius: var(--re-radius-sm);
52
+ font-size: var(--re-size-text-lg);
53
+ line-height: 1;
54
+ color: var(--re-color-text-muted);
55
+ }
56
+ .re-alert__dismiss:hover {
57
+ color: var(--re-color-text);
58
+ background: color-mix(in oklab, var(--re-color-text) 10%, transparent);
59
+ }
60
+ .re-alert__dismiss:focus-visible {
61
+ outline: none;
62
+ box-shadow: var(--re-shadow-focus);
63
+ }
64
+
65
+ /* ---- Variants -------------------------------------------------------- */
66
+ .re-alert[data-variant="success"] {
67
+ border-color: var(--re-color-success-border);
68
+ background-color: var(--re-color-success-surface);
69
+ }
70
+ .re-alert[data-variant="success"] .re-alert__title {
71
+ color: var(--re-color-success-text);
72
+ }
73
+
74
+ .re-alert[data-variant="warning"] {
75
+ border-color: var(--re-color-warning-border);
76
+ background-color: var(--re-color-warning-surface);
77
+ }
78
+ .re-alert[data-variant="warning"] .re-alert__title {
79
+ color: var(--re-color-warning-text);
80
+ }
81
+
82
+ .re-alert[data-variant="danger"] {
83
+ border-color: var(--re-color-danger-border);
84
+ background-color: var(--re-color-danger-surface);
85
+ }
86
+ .re-alert[data-variant="danger"] .re-alert__title {
87
+ color: var(--re-color-danger-text);
88
+ }
89
+ }
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Relements avatar.
3
+ *
4
+ * Circular user image, or a text-initials fallback.
5
+ *
6
+ * <span class="re-avatar"><img src="…" alt="Ada Lovelace" /></span>
7
+ * <span class="re-avatar" data-size="lg" role="img" aria-label="Ada Lovelace">AL</span>
8
+ *
9
+ * Sizes (data-size): sm, md (default), lg.
10
+ */
11
+
12
+ @layer re.components {
13
+ .re-avatar {
14
+ display: inline-flex;
15
+ align-items: center;
16
+ justify-content: center;
17
+ flex-shrink: 0;
18
+ inline-size: var(--re-control-height-md);
19
+ block-size: var(--re-control-height-md);
20
+ border-radius: var(--re-radius-pill);
21
+ overflow: hidden;
22
+ background-color: var(--re-color-bg-muted);
23
+ color: var(--re-color-text-muted);
24
+ font-size: var(--re-size-text-sm);
25
+ font-weight: var(--re-font-weight-medium);
26
+ line-height: 1;
27
+ text-transform: uppercase;
28
+ user-select: none;
29
+ }
30
+
31
+ .re-avatar > img {
32
+ inline-size: 100%;
33
+ block-size: 100%;
34
+ object-fit: cover;
35
+ }
36
+
37
+ /* ---- Sizes ----------------------------------------------------------- */
38
+ .re-avatar[data-size="sm"] {
39
+ inline-size: var(--re-control-height-sm);
40
+ block-size: var(--re-control-height-sm);
41
+ font-size: var(--re-size-text-xs);
42
+ }
43
+ .re-avatar[data-size="lg"] {
44
+ inline-size: var(--re-control-height-lg);
45
+ block-size: var(--re-control-height-lg);
46
+ font-size: var(--re-size-text-md);
47
+ }
48
+ }
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Relements badge.
3
+ *
4
+ * Small inline label for counts and statuses. Soft tinted per status.
5
+ *
6
+ * <span class="re-badge">New</span>
7
+ * <span class="re-badge" data-variant="success">Active</span>
8
+ *
9
+ * Variants (data-variant): neutral (default), info, success, warning, danger.
10
+ */
11
+
12
+ @layer re.components {
13
+ .re-badge {
14
+ display: inline-flex;
15
+ align-items: center;
16
+ gap: var(--re-space-1);
17
+ padding-inline: var(--re-space-2);
18
+ padding-block: calc(var(--re-space-1) / 2);
19
+ font-size: var(--re-size-text-xs);
20
+ font-weight: var(--re-font-weight-medium);
21
+ line-height: 1.4;
22
+ white-space: nowrap;
23
+ border-radius: var(--re-radius-pill);
24
+ background-color: var(--re-color-bg-muted);
25
+ color: var(--re-color-text-muted);
26
+ }
27
+
28
+ .re-badge[data-variant="info"] {
29
+ background-color: var(--re-color-info-surface);
30
+ color: var(--re-color-info-text);
31
+ }
32
+ .re-badge[data-variant="success"] {
33
+ background-color: var(--re-color-success-surface);
34
+ color: var(--re-color-success-text);
35
+ }
36
+ .re-badge[data-variant="warning"] {
37
+ background-color: var(--re-color-warning-surface);
38
+ color: var(--re-color-warning-text);
39
+ }
40
+ .re-badge[data-variant="danger"] {
41
+ background-color: var(--re-color-danger-surface);
42
+ color: var(--re-color-danger-text);
43
+ }
44
+ }
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Relements breadcrumb.
3
+ *
4
+ * Navigation trail. Use on a <nav aria-label="Breadcrumb"> wrapping an
5
+ * ordered list; mark the current page with aria-current="page".
6
+ *
7
+ * <nav class="re-breadcrumb" aria-label="Breadcrumb">
8
+ * <ol>
9
+ * <li><a href="/">Home</a></li>
10
+ * <li><a href="/docs">Docs</a></li>
11
+ * <li><a aria-current="page">Breadcrumb</a></li>
12
+ * </ol>
13
+ * </nav>
14
+ */
15
+
16
+ @layer re.components {
17
+ .re-breadcrumb > ol {
18
+ display: flex;
19
+ flex-wrap: wrap;
20
+ align-items: center;
21
+ gap: var(--re-space-2);
22
+ margin: 0;
23
+ padding: 0;
24
+ list-style: none;
25
+ font-size: var(--re-size-text-sm);
26
+ color: var(--re-color-text-muted);
27
+ }
28
+
29
+ .re-breadcrumb li {
30
+ display: inline-flex;
31
+ align-items: center;
32
+ gap: var(--re-space-2);
33
+ }
34
+
35
+ /* Separator before every item except the first (decorative). */
36
+ .re-breadcrumb li + li::before {
37
+ content: "/";
38
+ color: var(--re-color-text-subtle);
39
+ user-select: none;
40
+ }
41
+
42
+ .re-breadcrumb a {
43
+ color: var(--re-color-link);
44
+ text-decoration: none;
45
+ border-radius: var(--re-radius-sm);
46
+ }
47
+ .re-breadcrumb a:hover {
48
+ text-decoration: underline;
49
+ }
50
+ .re-breadcrumb a:focus-visible {
51
+ outline: none;
52
+ box-shadow: var(--re-shadow-focus);
53
+ }
54
+
55
+ /* Current page: styled as plain, emphasised text. */
56
+ .re-breadcrumb [aria-current="page"] {
57
+ color: var(--re-color-text);
58
+ font-weight: var(--re-font-weight-medium);
59
+ pointer-events: none;
60
+ text-decoration: none;
61
+ }
62
+ }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Relements card.
3
+ *
4
+ * A surface container with optional header / body / footer regions.
5
+ *
6
+ * <article class="re-card">
7
+ * <header class="re-card__header">Title</header>
8
+ * <div class="re-card__body">…</div>
9
+ * <footer class="re-card__footer">…</footer>
10
+ * </article>
11
+ *
12
+ * Modifiers:
13
+ * [data-interactive] — hover elevation + focus ring for clickable cards.
14
+ */
15
+
16
+ @layer re.components {
17
+ .re-card {
18
+ display: flex;
19
+ flex-direction: column;
20
+ background-color: var(--re-color-surface);
21
+ border: var(--re-border-default);
22
+ border-radius: var(--re-radius-lg);
23
+ box-shadow: var(--re-shadow-sm);
24
+ overflow: hidden; /* clip children to the rounded corners */
25
+ color: var(--re-color-text);
26
+ }
27
+
28
+ /* Card-as-link: shed the default anchor underline (color already inherits). */
29
+ a.re-card {
30
+ text-decoration: none;
31
+ }
32
+
33
+ .re-card__header {
34
+ padding: var(--re-space-4);
35
+ font-weight: var(--re-font-weight-semibold);
36
+ border-block-end: var(--re-border-default);
37
+ }
38
+
39
+ .re-card__body {
40
+ padding: var(--re-space-4);
41
+ line-height: var(--re-line-height-normal);
42
+ }
43
+
44
+ .re-card__footer {
45
+ padding: var(--re-space-3) var(--re-space-4);
46
+ border-block-start: var(--re-border-default);
47
+ background-color: var(--re-color-bg-subtle);
48
+ }
49
+
50
+ /* ---- Interactive ----------------------------------------------------- */
51
+ .re-card[data-interactive] {
52
+ cursor: pointer;
53
+ transition:
54
+ box-shadow var(--re-duration-fast) var(--re-easing-standard),
55
+ border-color var(--re-duration-fast) var(--re-easing-standard);
56
+ }
57
+ .re-card[data-interactive]:hover {
58
+ box-shadow: var(--re-shadow-md);
59
+ border-color: var(--re-color-border-strong);
60
+ }
61
+ .re-card[data-interactive]:focus-within {
62
+ outline: none;
63
+ box-shadow: var(--re-shadow-focus);
64
+ }
65
+ }
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Relements switch.
3
+ *
4
+ * A styled on/off toggle built on a native checkbox. Add role="switch" so
5
+ * assistive tech announces it as a switch; label it like any checkbox.
6
+ *
7
+ * <label>
8
+ * <input type="checkbox" role="switch" class="re-switch" />
9
+ * Email notifications
10
+ * </label>
11
+ *
12
+ * States: :checked, :focus-visible, :disabled.
13
+ */
14
+
15
+ @layer re.components {
16
+ .re-switch {
17
+ appearance: none;
18
+ -webkit-appearance: none;
19
+ position: relative;
20
+ box-sizing: border-box;
21
+ flex-shrink: 0;
22
+ inline-size: 2.25rem; /* 36 */
23
+ block-size: 1.25rem; /* 20 */
24
+ margin: 0;
25
+ border: var(--re-border-width) solid var(--re-color-border-strong);
26
+ border-radius: var(--re-radius-pill);
27
+ background-color: var(--re-color-bg-muted);
28
+ cursor: pointer;
29
+ vertical-align: middle;
30
+ transition:
31
+ background-color var(--re-duration-fast) var(--re-easing-standard),
32
+ border-color var(--re-duration-fast) var(--re-easing-standard);
33
+ }
34
+
35
+ /* Thumb — absolutely positioned so travel is symmetric. */
36
+ .re-switch::before {
37
+ content: "";
38
+ position: absolute;
39
+ inset-block-start: 2px;
40
+ inset-inline-start: 2px;
41
+ inline-size: 0.875rem; /* 14 */
42
+ block-size: 0.875rem;
43
+ border-radius: var(--re-radius-pill);
44
+ background-color: var(--re-color-surface);
45
+ box-shadow: var(--re-shadow-sm);
46
+ transition: transform var(--re-duration-fast) var(--re-easing-standard);
47
+ }
48
+
49
+ .re-switch:checked {
50
+ background-color: var(--re-color-accent-600);
51
+ border-color: var(--re-color-accent-600);
52
+ }
53
+ .re-switch:checked::before {
54
+ transform: translateX(1rem); /* 16 */
55
+ }
56
+
57
+ .re-switch:focus-visible {
58
+ outline: none;
59
+ box-shadow: var(--re-shadow-focus);
60
+ }
61
+
62
+ .re-switch:disabled {
63
+ cursor: not-allowed;
64
+ opacity: 0.55;
65
+ }
66
+ }
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Relements tag / chip.
3
+ *
4
+ * Compact label, optionally removable. For removable tags, mark the tag
5
+ * [data-re-dismissible], add a [data-re-dismiss] button, and call
6
+ * enhanceDismissible().
7
+ *
8
+ * <span class="re-tag">Design</span>
9
+ * <span class="re-tag" data-re-dismissible>
10
+ * Filter
11
+ * <button class="re-tag__remove" type="button" data-re-dismiss
12
+ * aria-label="Remove Filter">×</button>
13
+ * </span>
14
+ *
15
+ * Variants (data-variant): neutral (default), info, success, warning, danger.
16
+ */
17
+
18
+ @layer re.components {
19
+ .re-tag {
20
+ display: inline-flex;
21
+ align-items: center;
22
+ gap: var(--re-space-1);
23
+ padding-inline: var(--re-space-2);
24
+ padding-block: calc(var(--re-space-1) / 2);
25
+ font-size: var(--re-size-text-xs);
26
+ line-height: 1.4;
27
+ white-space: nowrap;
28
+ border: var(--re-border-width) solid var(--re-color-border);
29
+ border-radius: var(--re-radius-pill);
30
+ background-color: var(--re-color-bg-subtle);
31
+ color: var(--re-color-text);
32
+ }
33
+
34
+ .re-tag__remove {
35
+ appearance: none;
36
+ display: inline-flex;
37
+ align-items: center;
38
+ justify-content: center;
39
+ inline-size: 1rem;
40
+ block-size: 1rem;
41
+ padding: 0;
42
+ border: 0;
43
+ border-radius: var(--re-radius-pill);
44
+ background: transparent;
45
+ color: var(--re-color-text-muted);
46
+ font-size: var(--re-size-text-sm);
47
+ line-height: 1;
48
+ cursor: pointer;
49
+ }
50
+ .re-tag__remove:hover {
51
+ color: var(--re-color-text);
52
+ background: color-mix(in oklab, var(--re-color-text) 12%, transparent);
53
+ }
54
+ .re-tag__remove:focus-visible {
55
+ outline: none;
56
+ box-shadow: var(--re-shadow-focus);
57
+ }
58
+
59
+ /* ---- Variants -------------------------------------------------------- */
60
+ .re-tag[data-variant="info"] {
61
+ border-color: var(--re-color-info-border);
62
+ background-color: var(--re-color-info-surface);
63
+ color: var(--re-color-info-text);
64
+ }
65
+ .re-tag[data-variant="success"] {
66
+ border-color: var(--re-color-success-border);
67
+ background-color: var(--re-color-success-surface);
68
+ color: var(--re-color-success-text);
69
+ }
70
+ .re-tag[data-variant="warning"] {
71
+ border-color: var(--re-color-warning-border);
72
+ background-color: var(--re-color-warning-surface);
73
+ color: var(--re-color-warning-text);
74
+ }
75
+ .re-tag[data-variant="danger"] {
76
+ border-color: var(--re-color-danger-border);
77
+ background-color: var(--re-color-danger-surface);
78
+ color: var(--re-color-danger-text);
79
+ }
80
+ }
@@ -25,6 +25,8 @@ import { enhanceTabs } from "../behaviors/tabs.js";
25
25
  export class ReTabsElement extends HTMLElement {
26
26
  /** @type {{ destroy: () => void } | null} */
27
27
  #controller = null;
28
+ /** @type {MutationObserver | null} */
29
+ #observer = null;
28
30
 
29
31
  static get observedAttributes() {
30
32
  return ["value"];
@@ -33,17 +35,44 @@ export class ReTabsElement extends HTMLElement {
33
35
  connectedCallback() {
34
36
  // Mark the host so enhanceTabs picks it up.
35
37
  this.setAttribute("data-re-tabs", "");
36
- this.#controller = enhanceTabs(this);
37
- // Honor a value attribute if present and different from initial state.
38
- const initial = this.getAttribute("value");
39
- if (initial) this.#selectById(initial);
38
+ if (this.#hasTabs()) {
39
+ this.#enhance();
40
+ } else {
41
+ // Some frameworks (e.g. Angular) connect the host before projecting its
42
+ // children. Enhance once the tabs appear, then stop observing.
43
+ this.#observer = new MutationObserver(() => {
44
+ if (this.#hasTabs()) {
45
+ this.#observer?.disconnect();
46
+ this.#observer = null;
47
+ this.#enhance();
48
+ }
49
+ });
50
+ this.#observer.observe(this, { childList: true, subtree: true });
51
+ }
40
52
  }
41
53
 
42
54
  disconnectedCallback() {
55
+ this.#observer?.disconnect();
56
+ this.#observer = null;
43
57
  this.#controller?.destroy();
44
58
  this.#controller = null;
45
59
  }
46
60
 
61
+ /** @returns {boolean} */
62
+ #hasTabs() {
63
+ return !!this.querySelector('[role="tablist"] [role="tab"]');
64
+ }
65
+
66
+ #enhance() {
67
+ // Idempotent: tear down any prior controller first so a reconnected or
68
+ // moved host (with children already present) does not double-wire listeners.
69
+ this.#controller?.destroy();
70
+ this.#controller = enhanceTabs(this);
71
+ // Honor a value attribute if present and different from initial state.
72
+ const initial = this.getAttribute("value");
73
+ if (initial) this.#selectById(initial);
74
+ }
75
+
47
76
  /**
48
77
  * @param {string} name
49
78
  * @param {string | null} _oldValue
package/src/index.css CHANGED
@@ -28,3 +28,11 @@
28
28
  @import "./components/menu.css";
29
29
  @import "./components/popover.css";
30
30
  @import "./components/toast.css";
31
+ @import "./components/accordion.css";
32
+ @import "./components/alert.css";
33
+ @import "./components/avatar.css";
34
+ @import "./components/badge.css";
35
+ @import "./components/breadcrumb.css";
36
+ @import "./components/card.css";
37
+ @import "./components/switch.css";
38
+ @import "./components/tag.css";
package/src/tokens.css CHANGED
@@ -75,6 +75,39 @@
75
75
  --re-color-selection-bg: var(--re-color-accent-100);
76
76
  --re-color-selection-text: var(--re-color-neutral-900);
77
77
 
78
+ /* ----- Color: status surfaces -------------------------------------- */
79
+ /* Soft tinted background + border + readable text per status, for
80
+ alerts, badges, and tags. `info` maps to the accent (brand) scale.
81
+ Surfaces are derived from the 500 step so subtree theming follows. */
82
+ --re-color-info-surface: color-mix(
83
+ in oklab,
84
+ var(--re-color-accent-500) 12%,
85
+ var(--re-color-bg)
86
+ );
87
+ --re-color-info-border: var(--re-color-accent-500);
88
+ --re-color-info-text: var(--re-color-accent-700);
89
+ --re-color-success-surface: color-mix(
90
+ in oklab,
91
+ var(--re-color-success-500) 12%,
92
+ var(--re-color-bg)
93
+ );
94
+ --re-color-success-border: var(--re-color-success-500);
95
+ --re-color-success-text: var(--re-color-success-700);
96
+ --re-color-warning-surface: color-mix(
97
+ in oklab,
98
+ var(--re-color-warning-500) 12%,
99
+ var(--re-color-bg)
100
+ );
101
+ --re-color-warning-border: var(--re-color-warning-500);
102
+ --re-color-warning-text: var(--re-color-warning-700);
103
+ --re-color-danger-surface: color-mix(
104
+ in oklab,
105
+ var(--re-color-danger-500) 12%,
106
+ var(--re-color-bg)
107
+ );
108
+ --re-color-danger-border: var(--re-color-danger-500);
109
+ --re-color-danger-text: var(--re-color-danger-700);
110
+
78
111
  /* ----- Typography -------------------------------------------------- */
79
112
  --re-font-sans:
80
113
  system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif;
@@ -187,6 +220,37 @@
187
220
  --re-color-selection-bg: var(--re-color-accent-900);
188
221
  --re-color-selection-text: var(--re-color-neutral-50);
189
222
 
223
+ /* Status surfaces: mix harder toward the near-black bg so the tint
224
+ reads, and lift border/text to brighter steps for contrast. */
225
+ --re-color-info-surface: color-mix(
226
+ in oklab,
227
+ var(--re-color-accent-500) 20%,
228
+ var(--re-color-bg)
229
+ );
230
+ --re-color-info-border: var(--re-color-accent-400);
231
+ --re-color-info-text: var(--re-color-accent-200);
232
+ --re-color-success-surface: color-mix(
233
+ in oklab,
234
+ var(--re-color-success-500) 20%,
235
+ var(--re-color-bg)
236
+ );
237
+ --re-color-success-border: var(--re-color-success-500);
238
+ --re-color-success-text: var(--re-color-success-500);
239
+ --re-color-warning-surface: color-mix(
240
+ in oklab,
241
+ var(--re-color-warning-500) 20%,
242
+ var(--re-color-bg)
243
+ );
244
+ --re-color-warning-border: var(--re-color-warning-500);
245
+ --re-color-warning-text: var(--re-color-warning-500);
246
+ --re-color-danger-surface: color-mix(
247
+ in oklab,
248
+ var(--re-color-danger-500) 20%,
249
+ var(--re-color-bg)
250
+ );
251
+ --re-color-danger-border: var(--re-color-danger-500);
252
+ --re-color-danger-text: var(--re-color-danger-500);
253
+
190
254
  /* On dark backgrounds the offset gap is invisible, so the border and
191
255
  the outer ring appear as two separate blue lines. Remove the gap. */
192
256
  --re-focus-ring-offset: 0px;