UNPKG

@ryanhelsing/ry-ui

Version:

Framework-agnostic, Light DOM web components. CSS is the source of truth.

1,810 lines (1,480 loc) 85.3 kB
/** * ry-ui Theme CSS * * All visual styling: colors, shadows, borders, typography. * Requires ry-structure.css for layout. * Override these styles or swap with your own theme. */ @layer ry-theme { /* ═══════════════════════════════════════════════════════════════ BASE / BODY ═══════════════════════════════════════════════════════════════ */ html { background-color: var(--ry-color-bg); } /* ═══════════════════════════════════════════════════════════════ SECTION — INVERTED ═══════════════════════════════════════════════════════════════ */ ry-section[inverted] { background-color: var(--ry-color-text); color: var(--ry-color-bg); border-radius: var(--ry-radius-lg); } ry-section[inverted] :is(h1, h2, h3, h4, p, span, a) { color: inherit; } ry-section[inverted] p { opacity: 0.7; } /* ═══════════════════════════════════════════════════════════════ FOOTER — INVERTED ═══════════════════════════════════════════════════════════════ */ ry-footer[inverted] { background-color: var(--ry-color-text); color: var(--ry-color-bg); } ry-footer[inverted] :is(a, strong, p, span, nav) { color: inherit; } ry-footer[inverted] a { opacity: 0.7; transition: opacity var(--ry-duration-fast); } ry-footer[inverted] a:hover { opacity: 1; } /* ═══════════════════════════════════════════════════════════════ FOCUS STYLES ═══════════════════════════════════════════════════════════════ */ :is([class^="ry-"], [class*=" ry-"], ry-button, .ry-btn, .ry-input):focus-visible { outline: none; box-shadow: var(--ry-focus-ring); } /* ═══════════════════════════════════════════════════════════════ PAGE TYPOGRAPHY ═══════════════════════════════════════════════════════════════ */ ry-page { font-family: var(--ry-font-sans); font-size: var(--ry-text-base); line-height: var(--ry-leading-normal); color: var(--ry-color-text); background-color: var(--ry-color-bg); } ry-page :is(h1, h2, h3, h4, h5, h6) { margin: 0 0 var(--ry-space-4) 0; font-weight: var(--ry-font-semibold); line-height: var(--ry-leading-tight); color: var(--ry-color-text); } ry-page h1 { font-size: var(--ry-text-4xl); } ry-page h2 { font-size: var(--ry-text-3xl); } ry-page h3 { font-size: var(--ry-text-2xl); } ry-page h4 { font-size: var(--ry-text-xl); } ry-page p { margin: 0 0 var(--ry-space-4) 0; } ry-page a { color: var(--ry-color-primary); text-decoration: none; } ry-page a:hover { text-decoration: underline; } /* ═══════════════════════════════════════════════════════════════ HEADER ═══════════════════════════════════════════════════════════════ */ ry-header { background-color: var(--ry-color-bg); border-block-end: var(--ry-border-width) solid var(--ry-color-border); } ry-header strong { font-size: var(--ry-text-xl); } ry-header span { color: var(--ry-color-text-muted); } ry-header a:not(.ry-btn) { color: var(--ry-color-text-muted); text-decoration: none; font-size: var(--ry-text-sm); transition: color var(--ry-duration-fast); } ry-header a:not(.ry-btn):hover { color: var(--ry-color-text); } /* ═══════════════════════════════════════════════════════════════ FOOTER ═══════════════════════════════════════════════════════════════ */ ry-footer { background-color: var(--ry-color-bg-subtle); border-block-start: var(--ry-border-width) solid var(--ry-color-border); color: var(--ry-color-text-muted); } ry-footer a { color: inherit; text-decoration: none; transition: color var(--ry-duration-fast); } ry-footer a:hover { color: var(--ry-color-text); } /* ═══════════════════════════════════════════════════════════════ NAV ═══════════════════════════════════════════════════════════════ */ ry-nav a { color: var(--ry-color-text-muted); font-size: var(--ry-text-sm); font-weight: var(--ry-font-medium); border-radius: var(--ry-radius-md); transition: color var(--ry-duration-fast) var(--ry-ease), background-color var(--ry-duration-fast) var(--ry-ease); } ry-nav a:hover { color: var(--ry-color-text); background-color: var(--ry-color-hover-overlay); } ry-nav a[aria-current="page"] { color: var(--ry-color-primary); } /* ═══════════════════════════════════════════════════════════════ LOGO ═══════════════════════════════════════════════════════════════ */ ry-logo { font-size: var(--ry-text-xl); font-weight: var(--ry-font-bold); color: var(--ry-color-text); } /* ═══════════════════════════════════════════════════════════════ DIVIDER ═══════════════════════════════════════════════════════════════ */ ry-divider { background-color: var(--ry-color-border); } /* ═══════════════════════════════════════════════════════════════ SPLIT HANDLE ═══════════════════════════════════════════════════════════════ */ ry-split [data-ry-target="handle"]::after { background-color: var(--ry-color-border-strong); } ry-split[data-ry-resizing] [data-ry-target="handle"]::after { background-color: var(--ry-color-primary); } ry-split [data-ry-target="handle"]:focus-visible { outline: none; } ry-split [data-ry-target="handle"]:focus-visible::after { opacity: 1; background-color: var(--ry-color-primary); box-shadow: var(--ry-focus-ring); } /* ═══════════════════════════════════════════════════════════════ BUTTONS ═══════════════════════════════════════════════════════════════ */ :is(:where(.ry-btn), ry-button) { font-family: var(--ry-font-sans); font-size: var(--ry-text-sm); font-weight: var(--ry-font-medium); line-height: var(--ry-leading-normal); text-decoration: none; background-color: var(--ry-color-primary); color: var(--ry-color-text-inverse); border: var(--ry-border-width) solid transparent; border-radius: var(--ry-radius-md); transition-property: background-color, border-color, color, box-shadow; transition-duration: var(--ry-duration-fast); transition-timing-function: var(--ry-ease); } :is(:where(.ry-btn), ry-button):hover { background-color: var(--ry-color-primary-hover); } :is(:where(.ry-btn), ry-button):active { background-color: var(--ry-color-primary-active); } :is(:where(.ry-btn:disabled, .ry-btn[aria-disabled="true"]), ry-button[disabled]) { opacity: 0.5; } /* Button variants */ :is(:where(.ry-btn--secondary), ry-button[variant="secondary"]) { background-color: var(--ry-color-secondary); } :is(:where(.ry-btn--secondary), ry-button[variant="secondary"]):hover { background-color: var(--ry-color-secondary-hover); } :is(:where(.ry-btn--outline), ry-button[variant="outline"]) { background-color: transparent; color: var(--ry-color-primary); border-color: var(--ry-color-primary); } :is(:where(.ry-btn--outline), ry-button[variant="outline"]):hover { background-color: var(--ry-color-primary); color: var(--ry-color-text-inverse); } :is(:where(.ry-btn--ghost), ry-button[variant="ghost"]) { background-color: transparent; color: var(--ry-color-text); } :is(:where(.ry-btn--ghost), ry-button[variant="ghost"]):hover { background-color: var(--ry-color-bg-muted); } :is(:where(.ry-btn--danger), ry-button[variant="danger"]) { background-color: var(--ry-color-danger); } :is(:where(.ry-btn--danger), ry-button[variant="danger"]):hover { background-color: var(--ry-color-danger-hover); } :is(:where(.ry-btn--accent), ry-button[variant="accent"]) { background-color: var(--ry-color-accent); } :is(:where(.ry-btn--accent), ry-button[variant="accent"]):hover { background-color: var(--ry-color-accent-hover); } /* Link variant — inline text link */ :is(:where(.ry-btn--link), ry-button[variant="link"]) { background: none; color: var(--ry-color-primary); font-weight: var(--ry-font-semibold); text-decoration: none; border: none; } :is(:where(.ry-btn--link), ry-button[variant="link"]):hover { text-decoration: underline; } /* Pressed/active toggle state */ :is(:where(.ry-btn[aria-pressed="true"]), ry-button[pressed]) { background-color: var(--ry-color-primary); color: var(--ry-color-text-inverse); border-color: var(--ry-color-primary); } :is(:where(.ry-btn[aria-pressed="true"]), ry-button[pressed]):hover { background-color: var(--ry-color-primary-hover); border-color: var(--ry-color-primary-hover); } /* Button sizes (typography only - padding is structural) */ :is(:where(.ry-btn--sm), ry-button[size="sm"]) { font-size: var(--ry-text-xs); } :is(:where(.ry-btn--lg), ry-button[size="lg"]) { font-size: var(--ry-text-base); } /* ═══════════════════════════════════════════════════════════════ TOGGLE BUTTON ═══════════════════════════════════════════════════════════════ */ ry-toggle-button { font-family: var(--ry-font-sans); font-size: var(--ry-text-sm); font-weight: var(--ry-font-medium); line-height: var(--ry-leading-normal); text-decoration: none; background-color: var(--ry-color-bg); color: var(--ry-color-text); border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-md); transition-property: background-color, border-color, color, box-shadow; transition-duration: var(--ry-duration-fast); transition-timing-function: var(--ry-ease); } ry-toggle-button:hover { background-color: var(--ry-color-bg-muted); border-color: var(--ry-color-border-strong); } ry-toggle-button:active { background-color: var(--ry-color-bg-subtle); } ry-toggle-button[pressed] { background-color: var(--ry-color-primary); border-color: var(--ry-color-primary); color: var(--ry-color-text-inverse); } ry-toggle-button[pressed]:hover { background-color: var(--ry-color-primary-hover); border-color: var(--ry-color-primary-hover); } ry-toggle-button[disabled] { opacity: 0.5; } ry-toggle-button:focus-visible { outline: none; box-shadow: var(--ry-focus-ring); } /* Size variants (typography only) */ ry-toggle-button[size="sm"] { font-size: var(--ry-text-xs); } ry-toggle-button[size="lg"] { font-size: var(--ry-text-base); } /* ═══════════════════════════════════════════════════════════════ SLIDER ═══════════════════════════════════════════════════════════════ */ ry-slider [data-ry-target="track"] { background-color: var(--ry-color-bg-muted); border-radius: var(--ry-radius-full); } ry-slider [data-ry-target="fill"] { background-color: var(--ry-color-primary); border-radius: var(--ry-radius-full); } ry-slider [data-ry-target^="thumb"] { background-color: var(--ry-color-bg); border: 2px solid var(--ry-color-primary); border-radius: var(--ry-radius-full); box-shadow: var(--ry-shadow-sm); transition: box-shadow var(--ry-duration-fast) var(--ry-ease); } ry-slider [data-ry-target^="thumb"]:hover { box-shadow: var(--ry-shadow-md); } ry-slider [data-ry-target^="thumb"]:focus-visible { outline: none; box-shadow: var(--ry-focus-ring); } ry-slider[disabled] { opacity: 0.5; } ry-slider [data-ry-target="labels"] { font-size: var(--ry-text-xs); color: var(--ry-color-text-muted); } ry-slider [data-ry-target^="tooltip"] { background-color: var(--ry-color-text); color: var(--ry-color-text-inverse); padding: var(--ry-space-1) var(--ry-space-2); border-radius: var(--ry-radius-md); font-size: var(--ry-text-xs); font-weight: var(--ry-font-medium); } /* Color variants */ ry-slider[color="secondary"] [data-ry-target="fill"] { background-color: var(--ry-color-secondary); } ry-slider[color="secondary"] [data-ry-target^="thumb"] { border-color: var(--ry-color-secondary); } ry-slider[color="success"] [data-ry-target="fill"] { background-color: var(--ry-color-success); } ry-slider[color="success"] [data-ry-target^="thumb"] { border-color: var(--ry-color-success); } ry-slider[color="warning"] [data-ry-target="fill"] { background-color: var(--ry-color-warning); } ry-slider[color="warning"] [data-ry-target^="thumb"] { border-color: var(--ry-color-warning); } ry-slider[color="danger"] [data-ry-target="fill"] { background-color: var(--ry-color-danger); } ry-slider[color="danger"] [data-ry-target^="thumb"] { border-color: var(--ry-color-danger); } ry-slider[color="info"] [data-ry-target="fill"] { background-color: var(--ry-color-info); } ry-slider[color="info"] [data-ry-target^="thumb"] { border-color: var(--ry-color-info); } /* ═══════════════════════════════════════════════════════════════ KNOB ═══════════════════════════════════════════════════════════════ */ ry-knob [data-ry-target="ring"] { background: conic-gradient( from 225deg, var(--ry-color-primary) calc(var(--knob-percent) * 270deg), var(--ry-color-bg-muted) calc(var(--knob-percent) * 270deg) ); border-radius: var(--ry-radius-full); } ry-knob [data-ry-target="cap"] { background: var(--ry-color-bg); border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-full); margin: 4px; width: calc(100% - 8px); height: calc(100% - 8px); } ry-knob [data-ry-target="indicator"] { background-color: var(--ry-color-primary); border-radius: 1.5px; } ry-knob [data-ry-target="display"] { font-family: var(--ry-font-mono); font-size: var(--ry-text-sm); font-weight: var(--ry-font-medium); color: var(--ry-color-text); } ry-knob [data-ry-target="label"] { font-size: var(--ry-text-xs); color: var(--ry-color-text-muted); } ry-knob:focus-visible [data-ry-target="ring"] { box-shadow: var(--ry-focus-ring); } ry-knob[disabled] { opacity: 0.5; } /* Color variants */ ry-knob[color="secondary"] [data-ry-target="ring"] { background: conic-gradient( from 225deg, var(--ry-color-secondary) calc(var(--knob-percent) * 270deg), var(--ry-color-bg-muted) calc(var(--knob-percent) * 270deg) ); } ry-knob[color="secondary"] [data-ry-target="indicator"] { background-color: var(--ry-color-secondary); } ry-knob[color="success"] [data-ry-target="ring"] { background: conic-gradient( from 225deg, var(--ry-color-success) calc(var(--knob-percent) * 270deg), var(--ry-color-bg-muted) calc(var(--knob-percent) * 270deg) ); } ry-knob[color="success"] [data-ry-target="indicator"] { background-color: var(--ry-color-success); } ry-knob[color="warning"] [data-ry-target="ring"] { background: conic-gradient( from 225deg, var(--ry-color-warning) calc(var(--knob-percent) * 270deg), var(--ry-color-bg-muted) calc(var(--knob-percent) * 270deg) ); } ry-knob[color="warning"] [data-ry-target="indicator"] { background-color: var(--ry-color-warning); } ry-knob[color="danger"] [data-ry-target="ring"] { background: conic-gradient( from 225deg, var(--ry-color-danger) calc(var(--knob-percent) * 270deg), var(--ry-color-bg-muted) calc(var(--knob-percent) * 270deg) ); } ry-knob[color="danger"] [data-ry-target="indicator"] { background-color: var(--ry-color-danger); } /* ═══════════════════════════════════════════════════════════════ NUMBER SELECT ═══════════════════════════════════════════════════════════════ */ .ry-number-select__btn { background: var(--ry-color-bg); border: var(--ry-border-width) solid var(--ry-color-border); color: var(--ry-color-text); transition: background-color var(--ry-duration-fast) var(--ry-ease), border-color var(--ry-duration-fast) var(--ry-ease); } .ry-number-select__btn:hover { background-color: var(--ry-color-bg-muted); border-color: var(--ry-color-border-strong); } .ry-number-select__btn:active { background-color: var(--ry-color-bg-subtle); } .ry-number-select__decrement { border-start-start-radius: var(--ry-radius-md); border-end-start-radius: var(--ry-radius-md); border-start-end-radius: 0; border-end-end-radius: 0; border-inline-end: none; } .ry-number-select__increment { border-start-start-radius: 0; border-end-start-radius: 0; border-start-end-radius: var(--ry-radius-md); border-end-end-radius: var(--ry-radius-md); border-inline-start: none; } /* Single-button rounding */ ry-number-select[arrows="start"] .ry-number-select__decrement { border-radius: var(--ry-radius-md); border-inline-end: var(--ry-border-width) solid var(--ry-color-border); } ry-number-select[arrows="end"] .ry-number-select__increment { border-radius: var(--ry-radius-md); border-inline-start: var(--ry-border-width) solid var(--ry-color-border); } .ry-number-select__display { background-color: var(--ry-color-bg); border-block-start: var(--ry-border-width) solid var(--ry-color-border); border-block-end: var(--ry-border-width) solid var(--ry-color-border); } /* Display borders when both arrows */ ry-number-select:not([arrows]) .ry-number-select__display, ry-number-select[arrows="both"] .ry-number-select__display { border-inline-start: none; border-inline-end: none; } /* No arrows: full border + radius */ ry-number-select[arrows="none"] .ry-number-select__display { border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-md); } /* Start only: display gets end border + end radius */ ry-number-select[arrows="start"] .ry-number-select__display { border-inline-end: var(--ry-border-width) solid var(--ry-color-border); border-inline-start: none; border-start-start-radius: 0; border-end-start-radius: 0; border-start-end-radius: var(--ry-radius-md); border-end-end-radius: var(--ry-radius-md); } /* End only: display gets start border + start radius */ ry-number-select[arrows="end"] .ry-number-select__display { border-inline-start: var(--ry-border-width) solid var(--ry-color-border); border-inline-end: none; border-start-start-radius: var(--ry-radius-md); border-end-start-radius: var(--ry-radius-md); border-start-end-radius: 0; border-end-end-radius: 0; } /* Stacked: top-rounded increment, bottom-rounded decrement, no radius on display */ ry-number-select[arrows="stacked"] .ry-number-select__increment { border: var(--ry-border-width) solid var(--ry-color-border); border-block-end: none; border-radius: var(--ry-radius-md) var(--ry-radius-md) 0 0; } ry-number-select[arrows="stacked"] .ry-number-select__decrement { border: var(--ry-border-width) solid var(--ry-color-border); border-block-start: none; border-radius: 0 0 var(--ry-radius-md) var(--ry-radius-md); } ry-number-select[arrows="stacked"] .ry-number-select__display { border: var(--ry-border-width) solid var(--ry-color-border); border-block-start: none; border-block-end: none; border-radius: 0; } /* Stacked-end: display start-rounded, buttons end-rounded */ ry-number-select[arrows="stacked-end"] .ry-number-select__display { border: var(--ry-border-width) solid var(--ry-color-border); border-inline-end: none; border-start-start-radius: var(--ry-radius-md); border-end-start-radius: var(--ry-radius-md); border-start-end-radius: 0; border-end-end-radius: 0; } ry-number-select[arrows="stacked-end"] .ry-number-select__increment { border: var(--ry-border-width) solid var(--ry-color-border); border-block-end: none; border-start-end-radius: var(--ry-radius-md); border-start-start-radius: 0; border-end-start-radius: 0; border-end-end-radius: 0; } ry-number-select[arrows="stacked-end"] .ry-number-select__decrement { border: var(--ry-border-width) solid var(--ry-color-border); border-end-end-radius: var(--ry-radius-md); border-start-start-radius: 0; border-start-end-radius: 0; border-end-start-radius: 0; } /* Stacked-start: buttons start-rounded, display end-rounded */ ry-number-select[arrows="stacked-start"] .ry-number-select__display { border: var(--ry-border-width) solid var(--ry-color-border); border-inline-start: none; border-start-start-radius: 0; border-end-start-radius: 0; border-start-end-radius: var(--ry-radius-md); border-end-end-radius: var(--ry-radius-md); } ry-number-select[arrows="stacked-start"] .ry-number-select__increment { border: var(--ry-border-width) solid var(--ry-color-border); border-block-end: none; border-start-start-radius: var(--ry-radius-md); border-start-end-radius: 0; border-end-start-radius: 0; border-end-end-radius: 0; } ry-number-select[arrows="stacked-start"] .ry-number-select__decrement { border: var(--ry-border-width) solid var(--ry-color-border); border-end-start-radius: var(--ry-radius-md); border-start-start-radius: 0; border-start-end-radius: 0; border-end-end-radius: 0; } .ry-number-select__value { font-family: var(--ry-font-mono); font-size: var(--ry-text-sm); font-weight: var(--ry-font-medium); color: var(--ry-color-text); } .ry-number-select__input { font-family: var(--ry-font-mono); font-size: var(--ry-text-sm); font-weight: var(--ry-font-medium); color: var(--ry-color-text); background: transparent; border: none; border-block-end: 2px solid var(--ry-color-primary); } .ry-number-select__display:focus-visible { outline: none; box-shadow: var(--ry-focus-ring); border-color: var(--ry-color-primary); } .ry-number-select__affix { font-family: var(--ry-font-mono); font-size: var(--ry-text-sm); color: var(--ry-color-text-muted); } .ry-number-select__label { font-size: var(--ry-text-sm); color: var(--ry-color-text-muted); } ry-number-select[disabled] { opacity: 0.5; } ry-number-select[size="xs"] .ry-number-select__value { font-size: var(--ry-text-xs); } ry-number-select[size="xs"] .ry-number-select__affix { font-size: var(--ry-text-xs); } /* ═══════════════════════════════════════════════════════════════ CARDS ═══════════════════════════════════════════════════════════════ */ ry-card { background-color: var(--ry-color-bg); border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-lg); box-shadow: var(--ry-shadow-sm); } :is(a, [interactive]):is(ry-card) { transition: border-color var(--ry-duration-normal) var(--ry-ease), box-shadow var(--ry-duration-normal) var(--ry-ease); } :is(a, [interactive]):is(ry-card):hover { border-color: var(--ry-color-primary); box-shadow: var(--ry-shadow-md); } ry-card h3 { font-size: var(--ry-text-lg); font-weight: var(--ry-font-semibold); } ry-card p { color: var(--ry-color-text-muted); } ry-card > img:first-child { border-radius: var(--ry-radius-md); } /* ═══════════════════════════════════════════════════════════════ BADGES ═══════════════════════════════════════════════════════════════ */ :is(.ry-badge, ry-badge) { font-size: var(--ry-text-xs); font-weight: var(--ry-font-medium); background-color: var(--ry-color-bg-muted); color: var(--ry-color-text); border-radius: var(--ry-radius-full); } :is(.ry-badge--primary, ry-badge[variant="primary"]) { background-color: var(--ry-color-primary); color: var(--ry-color-text-inverse); } :is(.ry-badge--success, ry-badge[variant="success"]) { background-color: var(--ry-color-success); color: var(--ry-color-text-inverse); } :is(.ry-badge--warning, ry-badge[variant="warning"]) { background-color: var(--ry-color-warning); color: var(--ry-color-text); } :is(.ry-badge--danger, ry-badge[variant="danger"]) { background-color: var(--ry-color-danger); color: var(--ry-color-text-inverse); } :is(.ry-badge--accent, ry-badge[variant="accent"]) { background-color: var(--ry-color-accent); color: var(--ry-color-text-inverse); } /* Arbitrary color via style="--ry-badge-color: ..." */ ry-badge[style*="--ry-badge-color"] { background-color: var(--ry-badge-color); color: var(--ry-badge-text, var(--ry-color-text-inverse)); } /* ═══════════════════════════════════════════════════════════════ ALERTS ═══════════════════════════════════════════════════════════════ */ :is(.ry-alert, ry-alert) { background-color: var(--ry-color-bg-subtle); border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-lg); } :is(.ry-alert--info, ry-alert[type="info"]) { background-color: var(--ry-color-info-bg); border-color: var(--ry-color-info); color: var(--ry-color-info-text); } :is(.ry-alert--success, ry-alert[type="success"]) { background-color: var(--ry-color-success-bg); border-color: var(--ry-color-success); color: var(--ry-color-success-text); } :is(.ry-alert--warning, ry-alert[type="warning"]) { background-color: var(--ry-color-warning-bg); border-color: var(--ry-color-warning); color: var(--ry-color-warning-text); } :is(.ry-alert--danger, ry-alert[type="danger"]) { background-color: var(--ry-color-danger-bg); border-color: var(--ry-color-danger); color: var(--ry-color-danger-text); } .ry-alert__title { font-weight: var(--ry-font-semibold); } /* ═══════════════════════════════════════════════════════════════ FORM ELEMENTS ═══════════════════════════════════════════════════════════════ */ :is(.ry-input, ry-field input, ry-field textarea, ry-field select) { font-family: var(--ry-font-sans); font-size: var(--ry-text-base); line-height: var(--ry-leading-normal); color: var(--ry-color-text); background-color: var(--ry-color-bg); border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-md); transition: border-color var(--ry-duration-fast) var(--ry-ease), box-shadow var(--ry-duration-fast) var(--ry-ease); } :is(.ry-input, ry-field input, ry-field textarea):hover { border-color: var(--ry-color-border-strong); } :is(.ry-input, ry-field input, ry-field textarea):focus { outline: none; border-color: var(--ry-color-primary); box-shadow: var(--ry-focus-ring); } :is(.ry-input, ry-field input, ry-field textarea)::placeholder { color: var(--ry-color-text-muted); } :is(.ry-input, ry-field input, ry-field textarea):disabled { background-color: var(--ry-color-bg-muted); opacity: 0.5; } :is(.ry-label, ry-field label) { font-size: var(--ry-text-sm); font-weight: var(--ry-font-medium); color: var(--ry-color-text); } .ry-field__error { font-size: var(--ry-text-sm); color: var(--ry-color-danger); } .ry-field__hint { font-size: var(--ry-text-sm); color: var(--ry-color-text-muted); } /* Error state on input */ ry-field:has([data-ry-target="error"]:not(:empty)) :is(input, textarea, select) { border-color: var(--ry-color-danger); } ry-field:has([data-ry-target="error"]:not(:empty)) :is(input, textarea, select):focus { box-shadow: 0 0 0 3px light-dark(oklch(0.637 0.208 25.3 / 0.3), oklch(0.637 0.208 25.3 / 0.3)); } /* ═══════════════════════════════════════════════════════════════ ACCORDION ═══════════════════════════════════════════════════════════════ */ ry-accordion { border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-lg); } :is(.ry-accordion__item, ry-accordion-item) { border-block-end: var(--ry-border-width) solid var(--ry-color-border); } :is(.ry-accordion__item, ry-accordion-item):last-child { border-block-end: none; } .ry-accordion__trigger { font-family: var(--ry-font-sans); font-size: var(--ry-text-base); font-weight: var(--ry-font-medium); color: var(--ry-color-text); background-color: transparent; transition: background-color var(--ry-duration-fast) var(--ry-ease); } .ry-accordion__trigger:hover { background-color: var(--ry-color-bg-subtle); } .ry-accordion__trigger:focus-visible { outline: none; box-shadow: inset var(--ry-focus-ring); } .ry-accordion__content { color: var(--ry-color-text-muted); } /* ═══════════════════════════════════════════════════════════════ TABS ═══════════════════════════════════════════════════════════════ */ .ry-tabs__list { border-block-end: var(--ry-border-width) solid var(--ry-color-border); } .ry-tabs__trigger { font-family: var(--ry-font-sans); font-size: var(--ry-text-sm); font-weight: var(--ry-font-medium); color: var(--ry-color-text-muted); background: transparent; transition: color var(--ry-duration-fast) var(--ry-ease), border-color var(--ry-duration-fast) var(--ry-ease); } .ry-tabs__trigger:hover { color: var(--ry-color-text); } .ry-tabs__trigger[aria-selected="true"] { color: var(--ry-color-primary); border-block-end-color: var(--ry-color-primary); } .ry-tabs__trigger:focus-visible { outline: none; box-shadow: var(--ry-focus-ring); border-radius: var(--ry-radius-sm); } /* ═══════════════════════════════════════════════════════════════ MODAL ═══════════════════════════════════════════════════════════════ */ .ry-modal__backdrop { background-color: var(--ry-color-overlay); } .ry-modal__dialog { background-color: var(--ry-color-bg); border-radius: var(--ry-radius-xl); box-shadow: var(--ry-shadow-xl); } .ry-modal__header { border-block-end: var(--ry-border-width) solid var(--ry-color-border); } .ry-modal__title { font-size: var(--ry-text-lg); font-weight: var(--ry-font-semibold); } .ry-modal__close { font-size: var(--ry-text-xl); background: transparent; border-radius: var(--ry-radius-md); color: var(--ry-color-text-muted); transition: background-color var(--ry-duration-fast) var(--ry-ease), color var(--ry-duration-fast) var(--ry-ease); } .ry-modal__close:hover { background-color: var(--ry-color-bg-muted); color: var(--ry-color-text); } .ry-modal__footer { border-block-start: var(--ry-border-width) solid var(--ry-color-border); background-color: var(--ry-color-bg-subtle); } /* ═══════════════════════════════════════════════════════════════ DROPDOWN ═══════════════════════════════════════════════════════════════ */ :is(.ry-dropdown__menu, ry-menu) { background-color: var(--ry-color-bg); border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-lg); box-shadow: var(--ry-shadow-lg); } :is(.ry-dropdown__item, ry-menu-item) { font-family: var(--ry-font-sans); font-size: var(--ry-text-sm); color: var(--ry-color-text); background: transparent; border-radius: var(--ry-radius-md); transition: background-color var(--ry-duration-fast) var(--ry-ease); } :is(.ry-dropdown__item, ry-menu-item):hover { background-color: var(--ry-color-bg-muted); } :is(.ry-dropdown__item, ry-menu-item):focus-visible { outline: none; box-shadow: inset var(--ry-focus-ring); } .ry-dropdown__divider { background-color: var(--ry-color-border); } /* ═══════════════════════════════════════════════════════════════ SWITCH ═══════════════════════════════════════════════════════════════ */ ry-switch[disabled] { opacity: 0.5; } .ry-switch__track { background-color: var(--ry-color-bg-muted); border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-full); transition: background-color var(--ry-duration-fast) var(--ry-ease), border-color var(--ry-duration-fast) var(--ry-ease); } ry-switch[checked] .ry-switch__track { background-color: var(--ry-color-primary); border-color: var(--ry-color-primary); } .ry-switch__thumb { background-color: var(--ry-color-bg); border-radius: var(--ry-radius-full); box-shadow: var(--ry-shadow-sm); } .ry-switch__label { font-size: var(--ry-text-sm); font-weight: var(--ry-font-medium); color: var(--ry-color-text); } ry-switch:focus-visible .ry-switch__track { box-shadow: var(--ry-focus-ring); } /* ═══════════════════════════════════════════════════════════════ TOOLTIP ═══════════════════════════════════════════════════════════════ */ .ry-tooltip__content { font-size: var(--ry-text-xs); font-weight: var(--ry-font-medium); line-height: var(--ry-leading-tight); background-color: var(--ry-color-text); color: var(--ry-color-text-inverse); border-radius: var(--ry-radius-md); } /* ═══════════════════════════════════════════════════════════════ DRAWER ═══════════════════════════════════════════════════════════════ */ .ry-drawer__backdrop { background-color: var(--ry-color-overlay); } .ry-drawer__panel { background-color: var(--ry-color-bg); box-shadow: var(--ry-shadow-xl); } .ry-drawer__panel[data-ry-side="bottom"] { border-radius: var(--ry-radius-xl) var(--ry-radius-xl) 0 0; } .ry-drawer__close { font-size: var(--ry-text-xl); background: transparent; border-radius: var(--ry-radius-md); color: var(--ry-color-text-muted); transition: background-color var(--ry-duration-fast) var(--ry-ease), color var(--ry-duration-fast) var(--ry-ease); } .ry-drawer__close:hover { background-color: var(--ry-color-bg-muted); color: var(--ry-color-text); } /* ═══════════════════════════════════════════════════════════════ TOAST ═══════════════════════════════════════════════════════════════ */ ry-toast { font-family: var(--ry-font-sans); background-color: var(--ry-color-bg); border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-lg); box-shadow: var(--ry-shadow-lg); } .ry-toast__icon { font-size: var(--ry-text-sm); } ry-toast[type="info"] .ry-toast__icon { color: var(--ry-color-info); } ry-toast[type="success"] .ry-toast__icon { color: var(--ry-color-success); } ry-toast[type="warning"] .ry-toast__icon { color: var(--ry-color-warning); } ry-toast[type="error"] .ry-toast__icon { color: var(--ry-color-danger); } .ry-toast__content { font-size: var(--ry-text-sm); color: var(--ry-color-text); line-height: var(--ry-leading-normal); } .ry-toast__close { font-size: var(--ry-text-lg); background: transparent; border-radius: var(--ry-radius-sm); color: var(--ry-color-text-muted); transition: background-color var(--ry-duration-fast) var(--ry-ease), color var(--ry-duration-fast) var(--ry-ease); } .ry-toast__close:hover { background-color: var(--ry-color-bg-muted); color: var(--ry-color-text); } /* ═══════════════════════════════════════════════════════════════ SELECT ═══════════════════════════════════════════════════════════════ */ ry-select[disabled] { opacity: 0.5; } .ry-select__trigger { font-family: var(--ry-font-sans); font-size: var(--ry-text-base); line-height: var(--ry-leading-normal); background-color: var(--ry-color-bg); border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-md); transition: border-color var(--ry-duration-fast) var(--ry-ease), box-shadow var(--ry-duration-fast) var(--ry-ease); } ry-select:hover .ry-select__trigger { border-color: var(--ry-color-border-strong); } ry-select:focus-visible .ry-select__trigger { outline: none; border-color: var(--ry-color-primary); box-shadow: var(--ry-focus-ring); } ry-select[data-ry-state="open"] .ry-select__trigger { border-color: var(--ry-color-primary); } .ry-select__value { color: var(--ry-color-text-muted); } .ry-select__value--selected { color: var(--ry-color-text); } .ry-select__arrow { font-size: var(--ry-text-xs); color: var(--ry-color-text-muted); } .ry-select__dropdown { background-color: var(--ry-color-bg); border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-lg); box-shadow: var(--ry-shadow-lg); } .ry-select__option { font-size: var(--ry-text-sm); color: var(--ry-color-text); border-radius: var(--ry-radius-md); transition: background-color var(--ry-duration-fast) var(--ry-ease); } .ry-select__option:is(:hover, [data-highlighted]) { background-color: var(--ry-color-bg-muted); } .ry-select__option[aria-selected="true"] { background-color: var(--ry-color-primary); color: var(--ry-color-text-inverse); } .ry-select__option[data-disabled] { opacity: 0.5; } .ry-select__option[data-disabled]:hover { background-color: transparent; } /* Multi-select checkmarks */ .ry-select__check { color: var(--ry-color-primary); } .ry-select__clear { background: transparent; color: var(--ry-color-text-muted); border-radius: var(--ry-radius-full); transition: color var(--ry-duration-fast) var(--ry-ease); } .ry-select__clear:hover { color: var(--ry-color-text); } /* Multi: checkmark is the indicator, no bg change on selected */ ry-select[multiple] .ry-select__option[aria-selected="true"] { background-color: transparent; color: var(--ry-color-text); } ry-select[multiple] .ry-select__option[aria-selected="true"]:is(:hover, [data-highlighted]) { background-color: var(--ry-color-bg-muted); } /* ═══════════════════════════════════════════════════════════════ CODE ═══════════════════════════════════════════════════════════════ */ ry-code { background-color: var(--ry-code-bg); border-radius: var(--ry-radius-lg); box-shadow: var(--ry-shadow-lg); } .ry-code__header { background-color: var(--ry-code-header-bg); } .ry-code__title { font-family: var(--ry-font-sans); font-size: var(--ry-text-xs); font-weight: var(--ry-font-bold); color: var(--ry-code-title-color); } .ry-code__copy { background: transparent; border-radius: var(--ry-radius-full); color: var(--ry-code-icon-color); transition: background-color var(--ry-duration-fast) var(--ry-ease), color var(--ry-duration-fast) var(--ry-ease); } .ry-code__copy:hover { background-color: var(--ry-code-icon-hover-bg); color: var(--ry-code-icon-hover-color); } .ry-code__copy--success { color: var(--ry-color-success); } :is(.ry-code__pre, .ry-code__code) { font-family: var(--ry-font-mono); font-size: var(--ry-text-sm); line-height: var(--ry-leading-relaxed); color: var(--ry-code-text-color); } .ry-code__line-number { color: var(--ry-code-line-number-color); border-inline-end: 1px solid var(--ry-code-line-border-color); } .ry-code__color-preview { border: 1px solid var(--ry-code-color-preview-border); border-radius: var(--ry-radius-sm); } /* Syntax highlighting colors */ .ry-code__keyword { color: var(--ry-code-keyword); } .ry-code__property { color: var(--ry-code-property); } .ry-code__value { color: var(--ry-code-value); } .ry-code__string { color: var(--ry-code-string); } .ry-code__number { color: var(--ry-code-number); } .ry-code__comment { color: var(--ry-code-comment); font-style: italic; } .ry-code__selector { color: var(--ry-code-selector); } .ry-code__punctuation { color: var(--ry-code-punctuation); } .ry-code__tag { color: var(--ry-code-tag); } .ry-code__attribute { color: var(--ry-code-attribute); } .ry-code__color { color: var(--ry-code-value); } /* ═══════════════════════════════════════════════════════════════ EXAMPLE ═══════════════════════════════════════════════════════════════ */ .ry-example__preview { background-color: var(--ry-color-bg-subtle); border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-lg); } .ry-example__usage-toggle { background-color: var(--ry-color-bg-subtle); border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-md); color: var(--ry-color-text-muted); font-size: var(--ry-text-sm); font-weight: 500; } .ry-example__usage-toggle:hover { background-color: var(--ry-color-bg-hover); color: var(--ry-color-text); } /* ═══════════════════════════════════════════════════════════════ ICON ═══════════════════════════════════════════════════════════════ */ ry-icon { color: currentColor; } /* ═══════════════════════════════════════════════════════════════ CHECKBOX ═══════════════════════════════════════════════════════════════ */ input[type="checkbox"] { background-color: var(--ry-color-bg); border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-sm); transition: background-color var(--ry-duration-fast) var(--ry-ease), border-color var(--ry-duration-fast) var(--ry-ease), box-shadow var(--ry-duration-fast) var(--ry-ease); } input[type="checkbox"]:hover { border-color: var(--ry-color-border-strong); } input[type="checkbox"]:focus-visible { outline: none; border-color: var(--ry-color-primary); box-shadow: var(--ry-focus-ring); } input[type="checkbox"]:checked { background-color: var(--ry-color-primary); border-color: var(--ry-color-primary); } input[type="checkbox"]:checked:hover { background-color: var(--ry-color-primary-hover); border-color: var(--ry-color-primary-hover); } input[type="checkbox"]::after { border-inline-end: 2px solid var(--ry-color-text-inverse); border-block-end: 2px solid var(--ry-color-text-inverse); margin-bottom: 2px; } input[type="checkbox"]:disabled { opacity: 0.5; background-color: var(--ry-color-bg-muted); } /* ═══════════════════════════════════════════════════════════════ RADIO ═══════════════════════════════════════════════════════════════ */ input[type="radio"] { background-color: var(--ry-color-bg); border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-full); transition: background-color var(--ry-duration-fast) var(--ry-ease), border-color var(--ry-duration-fast) var(--ry-ease), box-shadow var(--ry-duration-fast) var(--ry-ease); } input[type="radio"]:hover { border-color: var(--ry-color-border-strong); } input[type="radio"]:focus-visible { outline: none; border-color: var(--ry-color-primary); box-shadow: var(--ry-focus-ring); } input[type="radio"]:checked { border-color: var(--ry-color-primary); } input[type="radio"]:checked:hover { border-color: var(--ry-color-primary-hover); } input[type="radio"]::after { background-color: var(--ry-color-primary); border-radius: var(--ry-radius-full); } input[type="radio"]:disabled { opacity: 0.5; background-color: var(--ry-color-bg-muted); } /* ═══════════════════════════════════════════════════════════════ TABLE ═══════════════════════════════════════════════════════════════ */ table { font-family: var(--ry-font-sans); font-size: var(--ry-text-sm); color: var(--ry-color-text); } th { font-weight: var(--ry-font-semibold); color: var(--ry-color-text); background-color: var(--ry-color-bg-subtle); border-block-end: var(--ry-border-width) solid var(--ry-color-border); } td { border-block-end: var(--ry-border-width) solid var(--ry-color-border); } tbody tr:last-child td { border-block-end: none; } tbody tr:hover { background-color: var(--ry-color-bg-subtle); } /* Table variants */ table[data-bordered] { border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-lg); } table[data-bordered] :is(th, td) { border: var(--ry-border-width) solid var(--ry-color-border); } table[data-striped] tbody tr:nth-child(even) { background-color: var(--ry-color-bg-subtle); } table[data-striped] tbody tr:hover { background-color: var(--ry-color-bg-muted); } /* ═══════════════════════════════════════════════════════════════ COLOR PICKER ═══════════════════════════════════════════════════════════════ */ ry-color-picker[disabled] { opacity: 0.5; } /* Trigger button */ ry-color-picker [data-ry-target="trigger"] { background-color: var(--ry-color-bg); background-image: repeating-conic-gradient(#ccc 0% 25%, #fff 0% 50%); background-size: 8px 8px; border-radius: var(--ry-radius-md); overflow: hidden; } ry-color-picker [data-ry-target="trigger"]:focus-visible { box-shadow: var(--ry-focus-ring); } ry-color-picker [data-ry-target="trigger-color"] { border-radius: calc(var(--ry-radius-md) - 1px); outline: 3px solid oklch(0 0 0 / 0.2); outline-offset: -3px; } ry-color-picker [data-ry-target="trigger-color"] { border-radius: calc(var(--ry-radius-md) - 1px); } /* Panel */ ry-color-picker [data-ry-target="panel"] { background-color: var(--ry-color-bg); border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-lg); box-shadow: var(--ry-shadow-lg); } /* Grid */ ry-color-picker [data-ry-target="grid"] { background-color: var(--grid-hue-color, #ff0000); background-image: linear-gradient(to top, #000 0%, transparent 100%), linear-gradient(to right, #fff 0%, transparent 100%); border-radius: var(--ry-radius-lg) var(--ry-radius-lg) 0 0; } ry-color-picker [data-ry-target="grid-handle"] { background-color: transparent; border: 2px solid #fff; border-radius: var(--ry-radius-full); box-shadow: 0 0 0 1px oklch(0 0 0 / 0.3), inset 0 0 0 1px oklch(0 0 0 / 0.3); } ry-color-picker [data-ry-target="grid-handle"]:focus-visible { outline: none; box-shadow: 0 0 0 1px oklch(0 0 0 / 0.3), inset 0 0 0 1px oklch(0 0 0 / 0.3), var(--ry-focus-ring); } /* Hue slider */ ry-color-picker .ry-color-picker__hue { background: linear-gradient( to right, hsl(0, 100%, 50%) 0%, hsl(60, 100%, 50%) 17%, hsl(120, 100%, 50%) 33%, hsl(180, 100%, 50%) 50%, hsl(240, 100%, 50%) 67%, hsl(300, 100%, 50%) 83%, hsl(360, 100%, 50%) 100% ); border-radius: var(--ry-radius-full); } /* Alpha slider */ ry-color-picker .ry-color-picker__alpha { /* Checkerboard pattern for transparency */ background-image: linear-gradient(to right, transparent 0%, var(--alpha-color, #ff0000) 100%), repeating-conic-gradient(#ccc 0% 25%, #fff 0% 50%); background-size: 100% 100%, 8px 8px; border-radius: var(--ry-radius-full); } /* Slider handles */ ry-color-picker .ry-color-picker__slider-handle { background-color: #fff; border-radius: var(--ry-radius-full); box-shadow: 0 0 0 1px oklch(0 0 0 / 0.2), var(--ry-shadow-sm); } ry-color-picker .ry-color-picker__slider-handle:focus-visible { outline: none; box-shadow: 0 0 0 1px oklch(0 0 0 / 0.2), var(--ry-focus-ring); } /* Preview */ ry-color-picker [data-ry-target="preview"] { background-image: repeating-conic-gradient(#ccc 0% 25%, #fff 0% 50%); background-size: 8px 8px; border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-md); overflow: hidden; } ry-color-picker [data-ry-target="preview-color"] { border-radius: inherit; outline: 3px solid oklch(0 0 0 / 0.2); outline-offset: -3px; } /* Input */ ry-color-picker [data-ry-target="input"] { font-family: var(--ry-font-mono); font-size: var(--ry-text-sm); color: var(--ry-color-text); background-color: var(--ry-color-bg); border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-md); transition: border-color var(--ry-duration-fast) var(--ry-ease), box-shadow var(--ry-duration-fast) var(--ry-ease); } ry-color-picker [data-ry-target="input"]:hover { border-color: var(--ry-color-border-strong); } ry-color-picker [data-ry-target="input"]:focus { outline: none; border-color: var(--ry-color-primary); box-shadow: var(--ry-focus-ring); } /* Format toggle */ ry-color-picker [data-ry-target="format-toggle"] { font-family: var(--ry-font-sans); font-size: var(--ry-text-xs); font-weight: var(--ry-font-semibold); color: var(--ry-color-text-muted); background-color: var(--ry-color-bg-muted); border-radius: var(--ry-radius-md); transition: background-color var(--ry-duration-fast) var(--ry-ease), color var(--ry-duration-fast) var(--ry-ease); } ry-color-picker [data-ry-target="format-toggle"]:hover { background-color: var(--ry-color-bg-subtle); color: var(--ry-color-text); } ry-color-picker [data-ry-target="format-toggle"]:focus-visible { outline: none; box-shadow: var(--ry-focus-ring); } /* Swatches */ ry-color-picker .ry-color-picker__swatch { border-radius: var(--ry-radius-sm); transition: transform var(--ry-duration-fast) var(--ry-ease), box-shadow var(--ry-duration-fast) var(--ry-ease); } ry-color-picker .ry-color-picker__swatch:hover { transform: scale(1.1); box-shadow: var(--ry-shadow-md); } ry-color-picker .ry-color-picker__swatch:focus-visible { outline: none; box-shadow: var(--ry-focus-ring); } /* ═══════════════════════════════════════════════════════════════ COLOR INPUT ═══════════════════════════════════════════════════════════════ */ ry-color-input[disabled] { opacity: 0.5; } ry-color-input [data-ry-target="trigger"] { background-color: var(--ry-color-bg); border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-md); overflow: hidden; transition: border-color var(--ry-duration-fast) var(--ry-ease), box-shadow var(--ry-duration-fast) var(--ry-ease); } ry-color-input:hover [data-ry-target="trigger"] { border-color: var(--ry-color-border-strong); } ry-color-input:focus-within [data-ry-target="trigger"] { border-color: var(--ry-color-primary); box-shadow: var(--ry-focus-ring); } ry-color-input [data-ry-target="swatch"] { background-image: repeating-conic-gradient(#ccc 0% 25%, #fff 0% 50%); background-size: 8px 8px; border-inline-end: var(--ry-border-width) solid var(--ry-color-border); transition: background-color var(--ry-duration-fast) var(--ry-ease); } ry-color-input [data-ry-target="swatch"]:hover { background-color: var(--ry-color-bg-muted); } ry-color-input [data-ry-target="swatch"]:focus-visible { outline: none; } ry-color-input [data-ry-target="swatch-color"] { box-shadow: inset 0 0 0 1px oklch(0 0 0 / 0.1); } ry-color-input [data-ry-target="input"] { font-family: var(--ry-font-mono); font-size: var(--ry-text-sm); color: var(--ry-color-text); background-color: transparent; border: none; } ry-color-input [data-ry-target="input"]:focus { outline: none; } ry-color-input [data-ry-target="input"]::placeholder { color: var(--ry-color-text-muted); } ry-color-input [data-ry-target="panel"] { background-color: var(--ry-color-bg); border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-lg); box-shadow: var(--ry-shadow-lg); } /* ═══════════════════════════════════════════════════════════════ GRADIENT PICKER ═══════════════════════════════════════════════════════════════ */ ry-gradient-picker { background-color: var(--ry-color-bg); border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-lg); box-shadow: var(--ry-shadow-md);