UNPKG

@ryanhelsing/ry-ui

Version:

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

1,196 lines (974 loc) 30.4 kB
/** * ry-ui Component Styles * * Styles for interactive and display components. */ /* ═══════════════════════════════════════════════════════════════ BUTTONS ═══════════════════════════════════════════════════════════════ */ .ry-btn, ry-button { display: inline-flex; align-items: center; justify-content: center; gap: var(--ry-space-2); padding: var(--ry-space-2) var(--ry-space-4); 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; white-space: nowrap; 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); cursor: pointer; user-select: none; transition-property: background-color, border-color, color, box-shadow; transition-duration: var(--ry-duration-fast); transition-timing-function: var(--ry-ease); } .ry-btn:hover, ry-button:hover { background-color: var(--ry-color-primary-hover); } .ry-btn:active, ry-button:active { background-color: var(--ry-color-primary-active); } .ry-btn:disabled, .ry-btn[aria-disabled="true"], ry-button[disabled] { opacity: 0.5; cursor: not-allowed; pointer-events: none; } /* Button variants */ .ry-btn--secondary, ry-button[variant="secondary"] { background-color: var(--ry-color-secondary); } .ry-btn--secondary:hover, ry-button[variant="secondary"]:hover { background-color: var(--ry-color-secondary-hover); } .ry-btn--outline, ry-button[variant="outline"] { background-color: transparent; color: var(--ry-color-primary); border-color: var(--ry-color-primary); } .ry-btn--outline:hover, ry-button[variant="outline"]:hover { background-color: var(--ry-color-primary); color: var(--ry-color-text-inverse); } .ry-btn--ghost, ry-button[variant="ghost"] { background-color: transparent; color: var(--ry-color-text); } .ry-btn--ghost:hover, ry-button[variant="ghost"]:hover { background-color: var(--ry-color-bg-muted); } .ry-btn--danger, ry-button[variant="danger"] { background-color: var(--ry-color-danger); } .ry-btn--danger:hover, ry-button[variant="danger"]:hover { background-color: #dc2626; } /* Button sizes */ .ry-btn--sm, ry-button[size="sm"] { padding: var(--ry-space-1) var(--ry-space-3); font-size: var(--ry-text-xs); } .ry-btn--lg, ry-button[size="lg"] { padding: var(--ry-space-3) var(--ry-space-6); font-size: var(--ry-text-base); } /* ═══════════════════════════════════════════════════════════════ CARDS ═══════════════════════════════════════════════════════════════ */ ry-card { display: block; padding: var(--ry-space-6); 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); } ry-card h3 { margin: 0 0 var(--ry-space-2) 0; font-size: var(--ry-text-lg); font-weight: var(--ry-font-semibold); } ry-card p { margin: 0 0 var(--ry-space-4) 0; color: var(--ry-color-text-muted); } ry-card p:last-child { margin-bottom: 0; } /* ═══════════════════════════════════════════════════════════════ BADGES ═══════════════════════════════════════════════════════════════ */ .ry-badge, ry-badge { display: inline-flex; align-items: center; padding: var(--ry-space-1) var(--ry-space-2); font-size: var(--ry-text-xs); font-weight: var(--ry-font-medium); line-height: 1; background-color: var(--ry-color-bg-muted); color: var(--ry-color-text); border-radius: var(--ry-radius-full); } .ry-badge--primary, ry-badge[variant="primary"] { background-color: var(--ry-color-primary); color: var(--ry-color-text-inverse); } .ry-badge--success, ry-badge[variant="success"] { background-color: var(--ry-color-success); color: var(--ry-color-text-inverse); } .ry-badge--warning, ry-badge[variant="warning"] { background-color: var(--ry-color-warning); color: var(--ry-color-text); } .ry-badge--danger, ry-badge[variant="danger"] { background-color: var(--ry-color-danger); color: var(--ry-color-text-inverse); } /* ═══════════════════════════════════════════════════════════════ ALERTS ═══════════════════════════════════════════════════════════════ */ .ry-alert, ry-alert { display: flex; gap: var(--ry-space-3); padding: var(--ry-space-4); background-color: var(--ry-color-bg-subtle); border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-lg); } .ry-alert--info, ry-alert[type="info"] { background-color: #ecfeff; border-color: #06b6d4; color: #0e7490; } .ry-alert--success, ry-alert[type="success"] { background-color: #f0fdf4; border-color: #22c55e; color: #15803d; } .ry-alert--warning, ry-alert[type="warning"] { background-color: #fffbeb; border-color: #f59e0b; color: #b45309; } .ry-alert--danger, ry-alert[type="danger"] { background-color: #fef2f2; border-color: #ef4444; color: #b91c1c; } .ry-alert__title, ry-alert [slot="title"] { margin: 0 0 var(--ry-space-1) 0; font-weight: var(--ry-font-semibold); } .ry-alert__content, ry-alert p { margin: 0; } /* ═══════════════════════════════════════════════════════════════ FORM ELEMENTS ═══════════════════════════════════════════════════════════════ */ .ry-input, ry-field input, ry-field textarea, ry-field select { display: block; width: 100%; padding: var(--ry-space-2) var(--ry-space-3); 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); } .ry-input:hover, ry-field input:hover, ry-field textarea:hover { border-color: var(--ry-color-border-strong); } .ry-input:focus, ry-field input:focus, ry-field textarea:focus { outline: none; border-color: var(--ry-color-primary); box-shadow: var(--ry-focus-ring); } .ry-input::placeholder, ry-field input::placeholder, ry-field textarea::placeholder { color: var(--ry-color-text-muted); } .ry-input:disabled, ry-field input:disabled, ry-field textarea:disabled { background-color: var(--ry-color-bg-muted); cursor: not-allowed; opacity: 0.5; } .ry-label, ry-field label { display: block; margin-bottom: var(--ry-space-2); font-size: var(--ry-text-sm); font-weight: var(--ry-font-medium); color: var(--ry-color-text); } .ry-form-group, ry-field { display: block; margin-bottom: var(--ry-space-4); } /* ═══════════════════════════════════════════════════════════════ ACCORDION ═══════════════════════════════════════════════════════════════ */ ry-accordion { border: var(--ry-border-width) solid var(--ry-color-border); border-radius: var(--ry-radius-lg); overflow: hidden; } .ry-accordion__item, ry-accordion-item { border-bottom: var(--ry-border-width) solid var(--ry-color-border); } .ry-accordion__item:last-child, ry-accordion-item:last-child { border-bottom: none; } .ry-accordion__trigger { display: flex; align-items: center; justify-content: space-between; width: 100%; padding: var(--ry-space-4) var(--ry-space-6); font-family: var(--ry-font-sans); font-size: var(--ry-text-base); font-weight: var(--ry-font-medium); text-align: left; color: var(--ry-color-text); background-color: transparent; border: none; cursor: pointer; 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__icon { flex-shrink: 0; transition: transform var(--ry-duration-normal) var(--ry-ease); } .ry-accordion__item[data-ry-state="open"] .ry-accordion__icon { transform: rotate(180deg); } .ry-accordion__panel { overflow: hidden; } .ry-accordion__item[data-ry-state="closed"] .ry-accordion__panel { display: none; } .ry-accordion__content { padding: var(--ry-space-4) var(--ry-space-6); color: var(--ry-color-text-muted); } /* ═══════════════════════════════════════════════════════════════ TABS ═══════════════════════════════════════════════════════════════ */ ry-tabs { display: block; } .ry-tabs__list { display: flex; gap: var(--ry-space-1); border-bottom: var(--ry-border-width) solid var(--ry-color-border); margin-bottom: var(--ry-space-4); } .ry-tabs__trigger { padding: var(--ry-space-2) var(--ry-space-4); 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; border: none; border-bottom: 2px solid transparent; margin-bottom: -1px; cursor: pointer; 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-bottom-color: var(--ry-color-primary); } .ry-tabs__trigger:focus-visible { outline: none; box-shadow: var(--ry-focus-ring); border-radius: var(--ry-radius-sm); } .ry-tabs__panel, ry-tab { display: none; } .ry-tabs__panel[data-ry-state="active"], ry-tab[active], ry-tab[data-ry-state="active"] { display: block; } /* Before JS loads, show first panel */ ry-tabs:not(:defined) .ry-tabs__panel:first-of-type, ry-tabs:not(:defined) ry-tab:first-of-type { display: block; } /* ═══════════════════════════════════════════════════════════════ MODAL ═══════════════════════════════════════════════════════════════ */ ry-modal { display: contents; } .ry-modal__backdrop { position: fixed; inset: 0; z-index: var(--ry-z-modal-backdrop); background-color: var(--ry-color-overlay); opacity: 0; visibility: hidden; transition: opacity var(--ry-duration-normal) var(--ry-ease), visibility var(--ry-duration-normal) var(--ry-ease); } ry-modal[data-ry-state="open"] .ry-modal__backdrop { opacity: 1; visibility: visible; } .ry-modal__dialog { position: fixed; top: 50%; left: 50%; z-index: var(--ry-z-modal); width: 100%; max-width: 32rem; max-height: calc(100vh - var(--ry-space-8)); background-color: var(--ry-color-bg); border-radius: var(--ry-radius-xl); box-shadow: var(--ry-shadow-xl); overflow: auto; opacity: 0; visibility: hidden; transform: translate(-50%, -50%) scale(0.95); transition: opacity var(--ry-duration-normal) var(--ry-ease), visibility var(--ry-duration-normal) var(--ry-ease), transform var(--ry-duration-normal) var(--ry-ease); } ry-modal[data-ry-state="open"] .ry-modal__dialog { opacity: 1; visibility: visible; transform: translate(-50%, -50%) scale(1); } .ry-modal__header { display: flex; align-items: center; justify-content: space-between; padding: var(--ry-space-4) var(--ry-space-6); border-bottom: var(--ry-border-width) solid var(--ry-color-border); } .ry-modal__title { margin: 0; font-size: var(--ry-text-lg); font-weight: var(--ry-font-semibold); } .ry-modal__close { display: flex; align-items: center; justify-content: center; width: 2rem; height: 2rem; padding: 0; font-size: var(--ry-text-xl); background: transparent; border: none; border-radius: var(--ry-radius-md); color: var(--ry-color-text-muted); cursor: pointer; 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__body { padding: var(--ry-space-6); } .ry-modal__footer { display: flex; justify-content: flex-end; gap: var(--ry-space-3); padding: var(--ry-space-4) var(--ry-space-6); border-top: var(--ry-border-width) solid var(--ry-color-border); background-color: var(--ry-color-bg-subtle); } /* ═══════════════════════════════════════════════════════════════ DROPDOWN ═══════════════════════════════════════════════════════════════ */ ry-dropdown { position: relative; display: inline-block; } .ry-dropdown__menu, ry-menu { position: absolute; top: 100%; left: 0; z-index: var(--ry-z-dropdown); min-width: 12rem; margin-top: var(--ry-space-1); padding: var(--ry-space-1); 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); opacity: 0; visibility: hidden; transform: translateY(-0.5rem); transition: opacity var(--ry-duration-fast) var(--ry-ease), visibility var(--ry-duration-fast) var(--ry-ease), transform var(--ry-duration-fast) var(--ry-ease); } ry-dropdown[data-ry-state="open"] .ry-dropdown__menu, ry-dropdown[data-ry-state="open"] ry-menu { opacity: 1; visibility: visible; transform: translateY(0); } .ry-dropdown__item, ry-menu-item { display: block; width: 100%; padding: var(--ry-space-2) var(--ry-space-3); font-family: var(--ry-font-sans); font-size: var(--ry-text-sm); text-align: left; text-decoration: none; color: var(--ry-color-text); background: transparent; border: none; border-radius: var(--ry-radius-md); cursor: pointer; transition: background-color var(--ry-duration-fast) var(--ry-ease); } .ry-dropdown__item:hover, ry-menu-item:hover { background-color: var(--ry-color-bg-muted); } .ry-dropdown__item:focus-visible, ry-menu-item:focus-visible { outline: none; box-shadow: inset var(--ry-focus-ring); } .ry-dropdown__divider { height: 1px; margin: var(--ry-space-1) 0; background-color: var(--ry-color-border); } /* ═══════════════════════════════════════════════════════════════ KEYFRAMES ═══════════════════════════════════════════════════════════════ */ @keyframes ry-fade-in { from { opacity: 0; } to { opacity: 1; } } @keyframes ry-fade-out { from { opacity: 1; } to { opacity: 0; } } @keyframes ry-slide-up { from { transform: translateY(1rem); opacity: 0; } to { transform: translateY(0); opacity: 1; } } @keyframes ry-slide-down { from { transform: translateY(-1rem); opacity: 0; } to { transform: translateY(0); opacity: 1; } } @keyframes ry-scale-in { from { transform: scale(0.95); opacity: 0; } to { transform: scale(1); opacity: 1; } } /* ═══════════════════════════════════════════════════════════════ SWITCH ═══════════════════════════════════════════════════════════════ */ ry-switch { display: inline-flex; align-items: center; gap: var(--ry-space-3); cursor: pointer; user-select: none; } ry-switch[disabled] { opacity: 0.5; cursor: not-allowed; } .ry-switch__track { position: relative; display: inline-flex; width: 2.75rem; height: 1.5rem; flex-shrink: 0; 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 { position: absolute; top: 2px; left: 2px; width: 1.125rem; height: 1.125rem; background-color: var(--ry-color-bg); border-radius: var(--ry-radius-full); box-shadow: var(--ry-shadow-sm); transition: transform var(--ry-duration-fast) var(--ry-ease); } ry-switch[checked] .ry-switch__thumb { transform: translateX(1.25rem); } .ry-switch__label { font-size: var(--ry-text-sm); font-weight: var(--ry-font-medium); color: var(--ry-color-text); } .ry-switch__input { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0, 0, 0, 0); border: 0; } ry-switch:focus-visible { outline: none; } ry-switch:focus-visible .ry-switch__track { box-shadow: var(--ry-focus-ring); } /* ═══════════════════════════════════════════════════════════════ TOOLTIP ═══════════════════════════════════════════════════════════════ */ ry-tooltip { position: relative; display: inline-block; } .ry-tooltip__content { position: absolute; z-index: var(--ry-z-tooltip); padding: var(--ry-space-2) var(--ry-space-3); font-size: var(--ry-text-xs); font-weight: var(--ry-font-medium); line-height: var(--ry-leading-tight); white-space: nowrap; background-color: var(--ry-color-text); color: var(--ry-color-text-inverse); border-radius: var(--ry-radius-md); opacity: 0; visibility: hidden; pointer-events: none; transition: opacity var(--ry-duration-fast) var(--ry-ease), visibility var(--ry-duration-fast) var(--ry-ease); } ry-tooltip[data-ry-state="open"] .ry-tooltip__content { opacity: 1; visibility: visible; } /* Position offsets */ ry-tooltip[data-ry-position="top"] .ry-tooltip__content { margin-bottom: var(--ry-space-2); } ry-tooltip[data-ry-position="bottom"] .ry-tooltip__content { margin-top: var(--ry-space-2); } ry-tooltip[data-ry-position="left"] .ry-tooltip__content { margin-right: var(--ry-space-2); } ry-tooltip[data-ry-position="right"] .ry-tooltip__content { margin-left: var(--ry-space-2); } /* ═══════════════════════════════════════════════════════════════ DRAWER ═══════════════════════════════════════════════════════════════ */ ry-drawer { display: contents; } .ry-drawer__backdrop { position: fixed; inset: 0; z-index: var(--ry-z-modal-backdrop); background-color: var(--ry-color-overlay); opacity: 0; visibility: hidden; transition: opacity var(--ry-duration-normal) var(--ry-ease), visibility var(--ry-duration-normal) var(--ry-ease); } ry-drawer[data-ry-state="open"] .ry-drawer__backdrop { opacity: 1; visibility: visible; } .ry-drawer__panel { position: fixed; z-index: var(--ry-z-modal); background-color: var(--ry-color-bg); box-shadow: var(--ry-shadow-xl); opacity: 0; visibility: hidden; transition: opacity var(--ry-duration-normal) var(--ry-ease), visibility var(--ry-duration-normal) var(--ry-ease), transform var(--ry-duration-normal) var(--ry-ease); } ry-drawer[data-ry-state="open"] .ry-drawer__panel { opacity: 1; visibility: visible; } /* Left drawer */ .ry-drawer__panel[data-ry-side="left"] { top: 0; left: 0; bottom: 0; width: 20rem; max-width: 100%; transform: translateX(-100%); } ry-drawer[data-ry-state="open"] .ry-drawer__panel[data-ry-side="left"] { transform: translateX(0); } /* Right drawer */ .ry-drawer__panel[data-ry-side="right"] { top: 0; right: 0; bottom: 0; width: 20rem; max-width: 100%; transform: translateX(100%); } ry-drawer[data-ry-state="open"] .ry-drawer__panel[data-ry-side="right"] { transform: translateX(0); } /* Top drawer */ .ry-drawer__panel[data-ry-side="top"] { top: 0; left: 0; right: 0; height: auto; max-height: 80vh; transform: translateY(-100%); } ry-drawer[data-ry-state="open"] .ry-drawer__panel[data-ry-side="top"] { transform: translateY(0); } /* Bottom drawer */ .ry-drawer__panel[data-ry-side="bottom"] { bottom: 0; left: 0; right: 0; height: auto; max-height: 80vh; border-radius: var(--ry-radius-xl) var(--ry-radius-xl) 0 0; transform: translateY(100%); } ry-drawer[data-ry-state="open"] .ry-drawer__panel[data-ry-side="bottom"] { transform: translateY(0); } .ry-drawer__close { position: absolute; top: var(--ry-space-4); right: var(--ry-space-4); display: flex; align-items: center; justify-content: center; width: 2rem; height: 2rem; padding: 0; font-size: var(--ry-text-xl); background: transparent; border: none; border-radius: var(--ry-radius-md); color: var(--ry-color-text-muted); cursor: pointer; 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); } .ry-drawer__content { padding: var(--ry-space-6); padding-top: var(--ry-space-12); overflow-y: auto; height: 100%; } /* ═══════════════════════════════════════════════════════════════ TOAST ═══════════════════════════════════════════════════════════════ */ .ry-toast-container { position: fixed; top: var(--ry-space-4); right: var(--ry-space-4); z-index: var(--ry-z-toast); display: flex; flex-direction: column; gap: var(--ry-space-3); max-width: 24rem; pointer-events: none; } ry-toast { display: flex; align-items: flex-start; gap: var(--ry-space-3); padding: var(--ry-space-4); 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); pointer-events: auto; opacity: 0; transform: translateX(1rem); transition: opacity var(--ry-duration-normal) var(--ry-ease), transform var(--ry-duration-normal) var(--ry-ease); } ry-toast[data-ry-state="visible"] { opacity: 1; transform: translateX(0); } ry-toast[data-ry-state="hiding"] { opacity: 0; transform: translateX(1rem); } .ry-toast__icon { flex-shrink: 0; width: 1.25rem; height: 1.25rem; display: flex; align-items: center; justify-content: center; font-size: var(--ry-text-sm); } ry-toast[type="info"] .ry-toast__icon { color: #06b6d4; } 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 { flex: 1; font-size: var(--ry-text-sm); color: var(--ry-color-text); line-height: var(--ry-leading-normal); } .ry-toast__close { flex-shrink: 0; display: flex; align-items: center; justify-content: center; width: 1.5rem; height: 1.5rem; padding: 0; margin: calc(var(--ry-space-1) * -1); font-size: var(--ry-text-lg); background: transparent; border: none; border-radius: var(--ry-radius-sm); color: var(--ry-color-text-muted); cursor: pointer; 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 { position: relative; display: inline-block; min-width: 12rem; } ry-select[disabled] { opacity: 0.5; cursor: not-allowed; } .ry-select__trigger { display: flex; align-items: center; justify-content: space-between; gap: var(--ry-space-2); width: 100%; padding: var(--ry-space-2) var(--ry-space-3); 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); cursor: pointer; 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 { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--ry-color-text-muted); } .ry-select__value--selected { color: var(--ry-color-text); } .ry-select__arrow { flex-shrink: 0; font-size: var(--ry-text-xs); color: var(--ry-color-text-muted); transition: transform var(--ry-duration-fast) var(--ry-ease); } ry-select[data-ry-state="open"] .ry-select__arrow { transform: rotate(180deg); } .ry-select__dropdown { position: absolute; top: 100%; left: 0; right: 0; z-index: var(--ry-z-dropdown); margin-top: var(--ry-space-1); padding: var(--ry-space-1); max-height: 15rem; overflow-y: auto; 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); opacity: 0; visibility: hidden; transform: translateY(-0.5rem); transition: opacity var(--ry-duration-fast) var(--ry-ease), visibility var(--ry-duration-fast) var(--ry-ease), transform var(--ry-duration-fast) var(--ry-ease); } ry-select[data-ry-state="open"] .ry-select__dropdown { opacity: 1; visibility: visible; transform: translateY(0); } /* Dropdown flipped to top when near bottom of screen */ ry-select[data-ry-position="top"] .ry-select__dropdown { top: auto; bottom: 100%; margin-top: 0; margin-bottom: var(--ry-space-1); transform: translateY(0.5rem); } ry-select[data-ry-position="top"][data-ry-state="open"] .ry-select__dropdown { transform: translateY(0); } .ry-select__option { padding: var(--ry-space-2) var(--ry-space-3); font-size: var(--ry-text-sm); color: var(--ry-color-text); border-radius: var(--ry-radius-md); cursor: pointer; transition: background-color var(--ry-duration-fast) var(--ry-ease); } .ry-select__option:hover, .ry-select__option[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; cursor: not-allowed; } .ry-select__option[data-disabled]:hover { background-color: transparent; } .ry-select__native { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0, 0, 0, 0); border: 0; } /* Hide placeholder ry-option elements */ ry-option { display: none; }