Mercurial
diff design_system/src/styles/shadcn.css @ 254:2b6e732087ff
[ui] Add complete native component catalog
Co-authored-by: Copilot <[email protected]>
| author | MrJuneJune <me@mrjunejune.com> |
|---|---|
| date | Tue, 04 Aug 2026 15:12:09 -0700 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/design_system/src/styles/shadcn.css Tue Aug 04 15:12:09 2026 -0700 @@ -0,0 +1,1744 @@ +:where( + zen-accordion, + zen-alert-dialog, + zen-aspect-ratio, + zen-attachment, + zen-avatar, + zen-badge, + zen-breadcrumb, + zen-bubble, + zen-button-group, + zen-calendar, + zen-carousel, + zen-chart, + zen-checkbox, + zen-collapsible, + zen-combobox, + zen-command, + zen-context-menu, + zen-data-table, + zen-date-picker, + zen-dialog, + zen-direction, + zen-drawer, + zen-dropdown-menu, + zen-empty, + zen-form, + zen-hover-card, + zen-icon, + zen-input, + zen-input-group, + zen-input-otp, + zen-item, + zen-kbd, + zen-label, + zen-marker, + zen-menubar, + zen-message, + zen-message-scroller, + zen-native-select, + zen-navigation-menu, + zen-pagination, + zen-popover, + zen-progress, + zen-radio-group, + zen-resizable, + zen-scroll-area, + zen-select, + zen-separator, + zen-sheet, + zen-sidebar, + zen-skeleton, + zen-slider, + zen-spinner, + zen-switch, + zen-table, + zen-tabs, + zen-textarea, + zen-toggle, + zen-toggle-group, + zen-tooltip, + zen-typography +) { + box-sizing: border-box; + color: var(--zen-color-text); + font-family: var(--zen-font-sans); +} + +zen-icon { + display: inline-grid; + width: var(--zen-icon-size, 1em); + height: var(--zen-icon-size, 1em); + flex: 0 0 auto; + place-items: center; + color: inherit; + vertical-align: -0.125em; +} + +zen-icon > svg { + display: block; + width: 100%; + height: 100%; +} + +:where( + zen-alert-dialog, + zen-calendar, + zen-combobox, + zen-command, + zen-date-picker, + zen-dialog, + zen-drawer, + zen-form, + zen-input-otp, + zen-popover, + zen-progress, + zen-radio-group, + zen-resizable, + zen-select, + zen-sheet, + zen-sidebar, + zen-slider, + zen-tabs +) { + display: block; +} + +:where( + zen-accordion, + zen-collapsible +) { + display: block; +} + +:where( + zen-accordion, + zen-collapsible +) details { + interpolate-size: allow-keywords; + border-block-end: 1px solid color-mix( + in srgb, + var(--zen-color-border) 28%, + transparent + ); +} + +:where( + zen-accordion, + zen-collapsible +) summary { + display: flex; + align-items: center; + gap: var(--zen-space-3); + padding: var(--zen-space-3) 0; + font-weight: 800; + list-style: none; + cursor: pointer; +} + +:where( + zen-accordion, + zen-collapsible +) summary::marker, +:where( + zen-accordion, + zen-collapsible +) summary::-webkit-details-marker { + display: none; + content: ""; +} + +:where( + zen-accordion, + zen-collapsible +) summary > [data-zen-disclosure-icon] { + margin-inline-start: auto; + transition: transform 220ms cubic-bezier(0.2, 0.8, 0.2, 1); +} + +:where( + zen-accordion, + zen-collapsible +) details[open] > summary > [data-zen-disclosure-icon] { + transform: rotate(180deg); +} + +:where( + zen-accordion, + zen-collapsible +) details::details-content { + block-size: 0; + overflow: clip; + opacity: 0; + transition: + block-size 220ms cubic-bezier(0.2, 0.8, 0.2, 1), + content-visibility 220ms allow-discrete, + opacity 180ms ease; +} + +:where( + zen-accordion, + zen-collapsible +) details[open]::details-content { + block-size: auto; + opacity: 1; +} + +:where( + zen-accordion, + zen-collapsible +) details > :not(summary) { + margin-block-start: 0; + padding-block-end: var(--zen-space-3); + color: var(--zen-color-text-muted); +} + +:where( + zen-alert-dialog, + zen-dialog, + zen-drawer, + zen-sheet +) > [data-zen-trigger], +:where( + zen-dropdown-menu, + zen-menubar, + zen-navigation-menu, + zen-popover +) [data-zen-trigger], +zen-empty > button, +zen-form button, +zen-input-group button { + min-height: 2.5rem; + padding: var(--zen-space-2) var(--zen-space-3); + border: var(--zen-border-width) solid var(--zen-color-border); + border-radius: var(--zen-radius-md); + box-shadow: var(--zen-shadow-sm); + background: var(--zen-color-accent); + color: var(--zen-color-on-accent); + font-weight: 800; + cursor: pointer; +} + +:where( + zen-alert-dialog, + zen-dialog, + zen-drawer, + zen-sheet +) dialog { + width: min(32rem, calc(100vi - 2rem)); + padding: var(--zen-space-5); + border: var(--zen-border-width) solid var(--zen-color-border); + border-radius: var(--zen-radius-lg); + box-shadow: var(--zen-shadow-md); + background: var(--zen-color-surface-raised); + color: var(--zen-color-text); +} + +:where( + zen-alert-dialog, + zen-dialog, + zen-drawer, + zen-sheet +) dialog[open], +:where( + zen-combobox, + zen-command, + zen-context-menu, + zen-dropdown-menu, + zen-hover-card, + zen-menubar, + zen-navigation-menu, + zen-popover, + zen-tooltip +) :where( + [data-zen-content], + [role="listbox"], + [role="menu"] +):not([hidden]) { + animation: zen-surface-open 160ms ease-out; +} + +:where( + zen-alert-dialog, + zen-dialog, + zen-drawer, + zen-sheet +) dialog::backdrop { + background: var(--zen-color-surface-overlay); + backdrop-filter: blur(3px); +} + +:where( + zen-alert-dialog, + zen-dialog, + zen-drawer, + zen-sheet +) dialog > h3 { + margin-block-start: 0; +} + +:where( + zen-alert-dialog, + zen-dialog, + zen-drawer, + zen-sheet +) dialog button { + min-height: 2.35rem; + margin-inline-end: var(--zen-space-2); + padding-inline: var(--zen-space-3); + border: var(--zen-border-width) solid var(--zen-color-border); + border-radius: var(--zen-radius-sm); + background: var(--zen-color-surface); + color: var(--zen-color-text); + font-weight: 700; + cursor: pointer; +} + +zen-alert-dialog dialog button[value="confirm"] { + background: var(--zen-color-danger); + color: var(--zen-color-on-danger); +} + +:where(zen-sheet, zen-drawer) dialog { + position: fixed; + max-width: none; + max-height: none; + margin: 0; +} + +:where(zen-sheet, zen-drawer)[placement="right"] dialog { + inset: 0 0 0 auto; + width: min(28rem, 92vi); + height: 100vb; + border-radius: var(--zen-radius-lg) 0 0 var(--zen-radius-lg); +} + +:where(zen-sheet, zen-drawer)[placement="left"] dialog { + inset: 0 auto 0 0; + width: min(28rem, 92vi); + height: 100vb; + border-radius: 0 var(--zen-radius-lg) var(--zen-radius-lg) 0; +} + +:where(zen-sheet, zen-drawer)[placement="bottom"] dialog, +zen-drawer:not([placement]) dialog { + inset: auto 0 0; + width: 100vi; + border-radius: var(--zen-radius-lg) var(--zen-radius-lg) 0 0; +} + +zen-aspect-ratio { + display: block; + aspect-ratio: var(--zen-aspect-ratio, 16 / 9); + overflow: hidden; + border: var(--zen-border-width) solid var(--zen-color-border); + border-radius: var(--zen-radius-lg); + background: var(--zen-color-surface); +} + +zen-aspect-ratio > * { + width: 100%; + height: 100%; +} + +.demo-media { + display: grid; + place-items: center; + background: var(--zen-color-surface-muted); + color: var(--zen-color-text); + font-size: var(--zen-font-size-lg); + font-weight: 900; +} + +zen-attachment { + display: grid; + grid-template-columns: 3rem minmax(0, 1fr) auto; + align-items: center; + gap: var(--zen-space-3); + padding: var(--zen-space-3); + border: var(--zen-border-width) solid var(--zen-color-border); + border-radius: var(--zen-radius-md); + background: var(--zen-color-surface); +} + +zen-attachment > span { + display: grid; + width: 3rem; + height: 3rem; + place-items: center; + border-radius: var(--zen-radius-sm); + background: var(--zen-color-info); + color: var(--zen-color-on-info); + font-size: var(--zen-font-size-xs); + font-weight: 900; +} + +zen-attachment > div, +zen-item > div { + display: grid; +} + +:where(zen-attachment, zen-item) small { + color: var(--zen-color-text-muted); +} + +:where(zen-attachment, zen-item) > button { + border: 0; + background: transparent; + color: inherit; + cursor: pointer; +} + +zen-avatar { + display: inline-grid; + width: var(--zen-avatar-size, 2.75rem); + height: var(--zen-avatar-size, 2.75rem); + overflow: hidden; + place-items: center; + border: var(--zen-border-width) solid var(--zen-color-border); + border-radius: 50%; + background: var(--zen-color-accent); + color: var(--zen-color-on-accent); + font-weight: 900; +} + +zen-avatar > img { + width: 100%; + height: 100%; + object-fit: cover; +} + +zen-badge { + display: inline-flex; + align-items: center; + min-height: 1.75rem; + padding: 0 var(--zen-space-2); + border: 1px solid var(--zen-color-border); + border-radius: 999px; + background: var(--zen-color-surface); + font-size: var(--zen-font-size-xs); + font-weight: 850; +} + +zen-badge[tone="success"] { + background: var(--zen-color-success); + color: var(--zen-color-on-success); +} + +zen-badge[tone="danger"] { + background: var(--zen-color-danger); + color: var(--zen-color-on-danger); +} + +:where(zen-breadcrumb, zen-pagination) nav { + display: flex; + align-items: center; + gap: var(--zen-space-2); +} + +zen-breadcrumb ol { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: var(--zen-space-2); + margin: 0; + padding: 0; + list-style: none; +} + +zen-breadcrumb li:not(:last-child)::after { + margin-inline-start: var(--zen-space-2); + color: var(--zen-color-text-muted); + content: "/"; +} + +:where(zen-breadcrumb, zen-pagination) a { + color: var(--zen-color-info); + text-underline-offset: 0.2em; +} + +zen-bubble { + display: block; + width: fit-content; + max-width: min(42rem, 88%); + padding: var(--zen-space-3) var(--zen-space-4); + border-radius: var(--zen-radius-lg) var(--zen-radius-lg) + var(--zen-radius-lg) var(--zen-radius-sm); + background: var(--zen-color-surface-raised); + box-shadow: var(--zen-shadow-sm); +} + +zen-bubble[align="end"] { + margin-inline-start: auto; + border-radius: var(--zen-radius-lg) var(--zen-radius-lg) + var(--zen-radius-sm) var(--zen-radius-lg); + background: var(--zen-color-accent); + color: var(--zen-color-on-accent); +} + +zen-bubble > :first-child { + margin-block-start: 0; +} + +zen-bubble > :last-child { + margin-block-end: 0; +} + +zen-button-group { + display: inline-flex; +} + +zen-button-group > :where(button, a) { + min-height: 2.5rem; + padding-inline: var(--zen-space-3); + border: var(--zen-border-width) solid var(--zen-color-border); + border-radius: 0; + background: var(--zen-color-surface); + color: var(--zen-color-text); + font-weight: 750; + cursor: pointer; +} + +zen-button-group > :first-child { + border-radius: var(--zen-radius-md) 0 0 var(--zen-radius-md); +} + +zen-button-group > :last-child { + border-radius: 0 var(--zen-radius-md) var(--zen-radius-md) 0; +} + +zen-button-group > :not(:first-child) { + margin-inline-start: calc(-1 * var(--zen-border-width)); +} + +:where( + zen-calendar, + zen-date-picker, + zen-slider +) { + display: grid; + gap: var(--zen-space-2); + max-width: 22rem; +} + +:where( + zen-calendar, + zen-date-picker, + zen-input, + zen-input-group, + zen-input-otp, + zen-native-select, + zen-select, + zen-slider, + zen-textarea +) :where(input, select, textarea) { + appearance: none; + min-height: 2.75rem; + box-sizing: border-box; + padding: var(--zen-space-2) var(--zen-space-3); + border: var(--zen-border-width) solid var(--zen-color-border); + border-radius: var(--zen-radius-md); + background: var(--zen-color-surface); + color: var(--zen-color-text); + font: inherit; +} + +:where( + zen-input, + zen-input-group, + zen-input-otp, + zen-native-select, + zen-select, + zen-textarea, + zen-calendar, + zen-date-picker +) :where(input, select, textarea), +zen-field > :where(input, select, textarea) { + appearance: none; + border-radius: var(--zen-radius-md); + background: var(--zen-color-surface); + color: var(--zen-color-text); +} + +:where(zen-native-select, zen-select) { + position: relative; +} + +:where(zen-native-select, zen-select) select { + width: 100%; + padding-inline-end: 2.75rem; + cursor: pointer; +} + +:where(zen-native-select, zen-select) > [data-zen-select-icon] { + position: absolute; + inset-inline-end: var(--zen-space-3); + inset-block-end: 0.9rem; + pointer-events: none; +} + +:where( + zen-calendar, + zen-date-picker, + zen-input, + zen-native-select, + zen-select, + zen-textarea +) { + display: grid; + gap: var(--zen-space-2); +} + +zen-textarea textarea { + width: 100%; + min-height: 8rem; + resize: vertical; +} + +:where(zen-calendar, zen-date-picker) > input[data-zen-calendar-input] { + position: absolute; + width: 1px; + height: 1px; + overflow: hidden; + clip-path: inset(50%); + pointer-events: none; +} + +:where(zen-calendar, zen-date-picker) [data-zen-generated="calendar"] { + display: grid; + gap: var(--zen-space-2); +} + +zen-date-picker [data-zen-generated="calendar"] { + position: relative; +} + +:where(zen-calendar, zen-date-picker) :where( + [data-zen-date-trigger], + [data-zen-calendar-previous], + [data-zen-calendar-next], + [data-zen-calendar-day] +) { + appearance: none; + border: 0; + background: transparent; + color: var(--zen-color-text); + font: inherit; + cursor: pointer; +} + +zen-date-picker [data-zen-date-trigger] { + display: inline-flex; + min-height: 2.75rem; + align-items: center; + gap: var(--zen-space-2); + justify-content: flex-start; + padding: var(--zen-space-2) var(--zen-space-3); + border: var(--zen-border-width) solid var(--zen-color-border); + border-radius: var(--zen-radius-md); + box-shadow: var(--zen-shadow-sm); + background: var(--zen-color-surface); +} + +zen-date-picker[data-invalid] [data-zen-date-trigger], +zen-calendar[data-invalid] [data-zen-calendar-view] { + border-color: var(--zen-color-danger); +} + +zen-date-picker [data-zen-calendar-panel] { + position: absolute; + z-index: 40; + inset-block-start: calc(100% + var(--zen-space-2)); + inset-inline-start: 0; + width: min(21rem, calc(100vi - 2rem)); + padding: var(--zen-space-3); + border: var(--zen-border-width) solid var(--zen-color-border); + border-radius: var(--zen-radius-lg); + box-shadow: var(--zen-shadow-md); + background: var(--zen-color-surface-raised); + transform-origin: top left; + animation: zen-calendar-open 160ms ease-out; +} + +zen-date-picker [data-zen-calendar-panel][hidden] { + display: none; +} + +:where(zen-calendar, zen-date-picker) [data-zen-calendar-view] { + display: grid; + gap: var(--zen-space-2); + padding: var(--zen-space-3); + border: 1px solid var(--zen-color-border-muted); + border-radius: var(--zen-radius-lg); + background: var(--zen-color-surface); +} + +zen-date-picker [data-zen-calendar-view] { + padding: 0; + border: 0; +} + +:where(zen-calendar, zen-date-picker) [data-zen-calendar-view] > header { + display: grid; + grid-template-columns: 2.5rem minmax(0, 1fr) 2.5rem; + align-items: center; + gap: var(--zen-space-2); + text-align: center; +} + +:where(zen-calendar, zen-date-picker) :where( + [data-zen-calendar-previous], + [data-zen-calendar-next] +) { + display: grid; + width: 2.5rem; + height: 2.5rem; + place-items: center; + border: 1px solid var(--zen-color-border-muted); + border-radius: 50%; +} + +:where(zen-calendar, zen-date-picker) :where( + [data-zen-calendar-previous], + [data-zen-calendar-next] +):hover { + background: var(--zen-color-accent-muted); +} + +:where(zen-calendar, zen-date-picker) [data-zen-calendar-weekdays], +:where(zen-calendar, zen-date-picker) [data-zen-calendar-grid] > [role="row"] { + display: grid; + grid-template-columns: repeat(7, minmax(2rem, 1fr)); + gap: var(--zen-space-1); +} + +:where(zen-calendar, zen-date-picker) [data-zen-calendar-weekdays] > span { + padding-block: var(--zen-space-1); + color: var(--zen-color-text-muted); + font-size: var(--zen-font-size-xs); + font-weight: 800; + text-align: center; +} + +:where(zen-calendar, zen-date-picker) [data-zen-calendar-grid] { + display: grid; + gap: var(--zen-space-1); +} + +:where(zen-calendar, zen-date-picker) [data-zen-calendar-day] { + aspect-ratio: 1; + min-width: 2rem; + border-radius: 50%; + font-size: var(--zen-font-size-sm); +} + +:where(zen-calendar, zen-date-picker) [data-zen-calendar-day]:hover { + background: var(--zen-color-accent-muted); +} + +:where(zen-calendar, zen-date-picker) [data-zen-calendar-day][data-outside] { + color: var(--zen-color-text-subtle); + opacity: 0.55; +} + +:where(zen-calendar, zen-date-picker) [data-zen-calendar-day][data-today] { + outline: 1px solid var(--zen-color-info); + outline-offset: -2px; +} + +:where(zen-calendar, zen-date-picker) [data-zen-calendar-day][aria-selected="true"] { + background: var(--zen-color-accent); + color: var(--zen-color-on-accent); + font-weight: 900; +} + +:where(zen-calendar, zen-date-picker) [data-zen-calendar-day]:disabled { + color: var(--zen-color-disabled); + cursor: not-allowed; +} + +@keyframes zen-calendar-open { + from { + opacity: 0; + transform: translateY(calc(-1 * var(--zen-space-1))) scale(0.98); + } + + @keyframes zen-surface-open { + from { + opacity: 0; + transform: translateY(calc(-1 * var(--zen-space-1))) scale(0.98); + } + } +} + +zen-input-group { + display: flex; + align-items: stretch; + width: min(100%, 36rem); + border: var(--zen-border-width) solid var(--zen-color-border); + border-radius: var(--zen-radius-md); + background: var(--zen-color-surface); +} + +zen-input-group > :where(span, button) { + display: inline-flex; + align-items: center; + padding-inline: var(--zen-space-3); +} + +zen-input-group input { + min-width: 0; + flex: 1; + border: 0; + border-radius: 0; +} + +zen-input-group button { + min-height: auto; + border-width: 0 0 0 var(--zen-border-width); + border-radius: 0 var(--zen-radius-sm) var(--zen-radius-sm) 0; + box-shadow: none; +} + +zen-carousel { + position: relative; + display: grid; + grid-template-columns: auto minmax(0, 1fr) auto; + align-items: center; + gap: var(--zen-space-2); +} + +zen-carousel [data-zen-viewport] { + display: flex; + grid-column: 1 / -1; + gap: var(--zen-space-3); + overflow: auto; + scroll-snap-type: inline mandatory; + scrollbar-width: none; +} + +zen-carousel [data-zen-viewport] > * { + min-width: min(22rem, 82vi); + min-height: 9rem; + padding: var(--zen-space-5); + border: var(--zen-border-width) solid var(--zen-color-border); + border-radius: var(--zen-radius-lg); + background: var(--zen-color-surface-raised); + scroll-snap-align: start; +} + +zen-carousel :where([data-zen-prev], [data-zen-next]) { + width: 2.5rem; + height: 2.5rem; + border: var(--zen-border-width) solid var(--zen-color-border); + border-radius: 50%; + background: var(--zen-color-surface); + color: var(--zen-color-text); + cursor: pointer; +} + +zen-carousel [data-zen-prev] { + grid-column: 1; +} + +zen-carousel [data-zen-next] { + grid-column: 3; +} + +zen-chart { + display: block; + min-height: 15rem; + padding: var(--zen-space-4); + border: var(--zen-border-width) solid var(--zen-color-border); + border-radius: var(--zen-radius-lg); + background: var(--zen-color-surface); +} + +zen-chart [data-zen-chart-plot] { + display: flex; + height: 12rem; + align-items: end; + justify-content: space-around; + gap: var(--zen-space-3); + border-block-end: 1px solid var(--zen-color-border); +} + +zen-chart [data-zen-chart-plot] > span { + position: relative; + width: min(3rem, 15%); + height: var(--zen-chart-value); + min-height: 1rem; + border-radius: var(--zen-radius-sm) var(--zen-radius-sm) 0 0; + background: var(--zen-color-data-1); +} + +zen-chart [data-zen-chart-plot] > span:nth-child(2) { + background: var(--zen-color-data-2); +} + +zen-chart [data-zen-chart-plot] > span:nth-child(3) { + background: var(--zen-color-data-3); +} + +zen-chart [data-zen-chart-plot] > span:nth-child(4) { + background: var(--zen-color-data-4); +} + +zen-chart [data-zen-chart-plot] > span:nth-child(5) { + background: var(--zen-color-data-5); +} + +zen-chart [data-zen-chart-plot] > span::after { + position: absolute; + inset-block-start: 100%; + inset-inline-start: 50%; + padding-block-start: var(--zen-space-1); + color: var(--zen-color-text-muted); + content: attr(data-label); + font-size: var(--zen-font-size-xs); + transform: translateX(-50%); +} + +:where(zen-checkbox, zen-switch) label, +zen-radio-group label { + display: flex; + align-items: center; + gap: var(--zen-space-2); + width: fit-content; + cursor: pointer; +} + +:where(zen-checkbox, zen-radio-group) input { + appearance: none; + display: inline-grid; + width: 1.2rem; + height: 1.2rem; + flex: 0 0 auto; + place-content: center; + border: var(--zen-border-width) solid var(--zen-color-border); + background: var(--zen-color-surface); + cursor: pointer; +} + +zen-checkbox input { + border-radius: var(--zen-radius-sm); +} + +zen-checkbox input::before { + width: 0.55rem; + height: 0.3rem; + border-block-end: 2px solid var(--zen-color-on-accent); + border-inline-start: 2px solid var(--zen-color-on-accent); + content: ""; + opacity: 0; + transform: translateY(-0.08rem) rotate(-45deg); +} + +zen-checkbox input:checked { + background: var(--zen-color-accent); +} + +zen-checkbox input:checked::before { + opacity: 1; +} + +zen-radio-group input { + border-radius: 50%; +} + +zen-radio-group input::before { + width: 0.55rem; + height: 0.55rem; + border-radius: 50%; + background: var(--zen-color-info); + content: ""; + opacity: 0; +} + +zen-radio-group input:checked::before { + opacity: 1; +} + +zen-radio-group fieldset { + display: grid; + gap: var(--zen-space-2); + padding: var(--zen-space-4); + border: var(--zen-border-width) solid var(--zen-color-border); + border-radius: var(--zen-radius-md); +} + +zen-switch input { + appearance: none; + width: 2.75rem; + height: 1.5rem; + margin: 0; + padding: 2px; + border: var(--zen-border-width) solid var(--zen-color-border); + border-radius: 999px; + background: var(--zen-color-surface); + cursor: pointer; + transition: background var(--zen-motion-fast) ease; +} + +zen-switch input::before { + display: block; + width: 1rem; + height: 1rem; + border-radius: 50%; + background: var(--zen-color-border); + content: ""; + transition: transform var(--zen-motion-fast) ease; +} + +zen-switch input:checked { + background: var(--zen-color-success); +} + +zen-switch input:checked::before { + background: var(--zen-color-on-success); + transform: translateX(1.2rem); +} + +:where(zen-combobox, zen-command) { + position: relative; + display: grid; + width: min(100%, 28rem); + gap: var(--zen-space-2); +} + +:where(zen-combobox, zen-command) > input { + min-height: 2.75rem; + padding: var(--zen-space-2) var(--zen-space-3); + border: var(--zen-border-width) solid var(--zen-color-border); + border-radius: var(--zen-radius-md); + background: var(--zen-color-surface); + color: var(--zen-color-text); +} + +:where( + zen-combobox, + zen-command, + zen-context-menu, + zen-dropdown-menu, + zen-menubar, + zen-navigation-menu +) :where([role="listbox"], [role="menu"]) { + z-index: 20; + display: grid; + min-width: 12rem; + padding: var(--zen-space-1); + border: var(--zen-border-width) solid var(--zen-color-border); + border-radius: var(--zen-radius-md); + box-shadow: var(--zen-shadow-md); + background: var(--zen-color-surface-raised); +} + +:where( + zen-combobox, + zen-command, + zen-context-menu, + zen-dropdown-menu, + zen-menubar, + zen-navigation-menu +) :where([role="listbox"], [role="menu"])[hidden] { + display: none; +} + +:where( + zen-combobox, + zen-command, + zen-context-menu, + zen-dropdown-menu, + zen-menubar, + zen-navigation-menu +) :where([role="option"], [role="menuitem"]) { + display: block; + width: 100%; + padding: var(--zen-space-2) var(--zen-space-3); + border: 0; + border-radius: var(--zen-radius-sm); + background: transparent; + color: var(--zen-color-text); + text-align: start; + text-decoration: none; + cursor: pointer; +} + +:where( + zen-combobox, + zen-command, + zen-context-menu, + zen-dropdown-menu, + zen-menubar, + zen-navigation-menu +) :where([role="option"], [role="menuitem"]):is( + :hover, + :focus, + [aria-selected="true"] +) { + outline: none; + background: var(--zen-color-accent); + color: var(--zen-color-on-accent); +} + +:where( + zen-context-menu, + zen-dropdown-menu, + zen-navigation-menu +) { + position: relative; + display: inline-block; +} + +zen-context-menu > [data-zen-trigger] { + min-height: 8rem; + padding: var(--zen-space-5); + border: 2px dashed var(--zen-color-border); + border-radius: var(--zen-radius-lg); + background: var(--zen-color-surface); +} + +:where( + zen-dropdown-menu, + zen-navigation-menu +) > [role="menu"], +zen-navigation-menu nav > [role="menu"] { + position: absolute; + inset-block-start: calc(100% + var(--zen-space-2)); + inset-inline-start: 0; +} + +zen-context-menu > [role="menu"] { + position: fixed; +} + +zen-menubar { + position: relative; + display: flex; + width: fit-content; + padding: var(--zen-space-1); + border: var(--zen-border-width) solid var(--zen-color-border); + border-radius: var(--zen-radius-md); + background: var(--zen-color-surface); +} + +zen-menubar > [data-zen-trigger] { + border: 0; + box-shadow: none; + background: transparent; + color: var(--zen-color-text); +} + +zen-menubar > [role="menu"] { + position: absolute; + inset-block-start: calc(100% + var(--zen-space-1)); +} + +zen-data-table, +zen-table { + display: block; + max-width: 100%; + overflow: auto; +} + +:where(zen-data-table, zen-table) table { + width: 100%; + border-collapse: collapse; + background: var(--zen-color-surface); +} + +:where(zen-data-table, zen-table) :where(th, td) { + padding: var(--zen-space-3); + border-block-end: 1px solid color-mix( + in srgb, + var(--zen-color-border) 30%, + transparent + ); + text-align: start; +} + +:where(zen-data-table, zen-table) th { + font-size: var(--zen-font-size-sm); +} + +zen-data-table [data-zen-sort] { + padding: 0; + border: 0; + background: transparent; + color: inherit; + font-weight: 850; + cursor: pointer; +} + +zen-direction { + display: contents; +} + +zen-empty { + display: grid; + justify-items: center; + gap: var(--zen-space-2); + padding: var(--zen-space-7) var(--zen-space-5); + border: var(--zen-border-width) dashed var(--zen-color-border); + border-radius: var(--zen-radius-lg); + background: var(--zen-color-surface); + text-align: center; +} + +zen-empty > p { + max-width: 34rem; + margin: 0; + color: var(--zen-color-text-muted); +} + +zen-form form { + display: grid; + max-width: 34rem; + gap: var(--zen-space-4); +} + +zen-form[data-invalid] form { + padding-inline-start: var(--zen-space-3); + border-inline-start: 0.35rem solid var(--zen-color-danger); +} + +:where(zen-hover-card, zen-tooltip, zen-popover) { + position: relative; + display: inline-block; +} + +:where(zen-hover-card, zen-tooltip, zen-popover) [data-zen-content] { + position: absolute; + z-index: 30; + inset-block-start: calc(100% + var(--zen-space-2)); + inset-inline-start: 0; + width: max-content; + max-width: min(22rem, calc(100vi - 2rem)); + padding: var(--zen-space-3); + border: var(--zen-border-width) solid var(--zen-color-border); + border-radius: var(--zen-radius-md); + box-shadow: var(--zen-shadow-md); + background: var(--zen-color-surface-raised); + color: var(--zen-color-text); +} + +:where(zen-hover-card, zen-tooltip, zen-popover) [data-zen-content][hidden] { + display: none; +} + +zen-tooltip [data-zen-content] { + padding: var(--zen-space-1) var(--zen-space-2); + background: var(--zen-color-border); + color: var(--zen-color-surface); + font-size: var(--zen-font-size-xs); +} + +zen-input-otp [data-zen-otp-slots] { + display: flex; + gap: var(--zen-space-1); +} + +zen-input-otp [data-zen-otp-slots] > span { + display: grid; + width: 2.5rem; + height: 2.75rem; + place-items: center; + border: var(--zen-border-width) solid var(--zen-color-border); + border-radius: var(--zen-radius-sm); + background: var(--zen-color-surface); + font-weight: 850; +} + +zen-item { + display: grid; + grid-template-columns: auto minmax(0, 1fr) auto; + align-items: center; + gap: var(--zen-space-3); + padding: var(--zen-space-3); + border-block-end: 1px solid color-mix( + in srgb, + var(--zen-color-border) 28%, + transparent + ); +} + +zen-kbd { + display: inline-flex; + align-items: center; + gap: var(--zen-space-1); +} + +zen-kbd kbd { + min-width: 1.75rem; + padding: 0.1rem var(--zen-space-1); + border: 1px solid var(--zen-color-border); + border-block-end-width: 3px; + border-radius: var(--zen-radius-sm); + background: var(--zen-color-surface); + font: 700 var(--zen-font-size-xs)/1.5 var(--zen-font-mono); + text-align: center; +} + +zen-label { + display: block; + margin-block-end: var(--zen-space-2); + font-weight: 800; +} + +zen-marker { + display: flex; + align-items: center; + gap: var(--zen-space-2); + color: var(--zen-color-text-muted); + font-size: var(--zen-font-size-xs); + text-transform: uppercase; +} + +zen-marker::before, +zen-marker::after { + height: 1px; + flex: 1; + background: color-mix( + in srgb, + var(--zen-color-border) 32%, + transparent + ); + content: ""; +} + +zen-message { + display: grid; + grid-template-columns: auto minmax(0, 1fr); + align-items: start; + gap: var(--zen-space-3); +} + +zen-message > div { + display: grid; + gap: var(--zen-space-1); +} + +zen-message-scroller { + position: relative; + display: block; +} + +zen-message-scroller [data-zen-viewport] { + max-height: 12rem; + overflow: auto; + padding: var(--zen-space-3); + border: var(--zen-border-width) solid var(--zen-color-border); + border-radius: var(--zen-radius-md); + background: var(--zen-color-surface); +} + +zen-message-scroller [data-zen-scroll-end] { + position: absolute; + inset-inline-end: var(--zen-space-3); + inset-block-end: var(--zen-space-3); +} + +zen-navigation-menu nav { + display: flex; + align-items: center; + gap: var(--zen-space-3); +} + +zen-pagination nav { + flex-wrap: wrap; +} + +zen-pagination a { + display: inline-grid; + min-width: 2.35rem; + min-height: 2.35rem; + place-items: center; + padding-inline: var(--zen-space-2); + border: 1px solid transparent; + border-radius: var(--zen-radius-sm); + text-decoration: none; +} + +zen-pagination a[aria-current] { + border-color: var(--zen-color-border); + background: var(--zen-color-accent); + color: var(--zen-color-on-accent); +} + +zen-progress { + display: grid; + gap: var(--zen-space-2); +} + +zen-progress progress { + appearance: none; + width: 100%; + height: 0.75rem; + overflow: hidden; + border: 0; + border-radius: 999px; + accent-color: var(--zen-color-success); + background: var(--zen-color-surface); +} + +zen-progress progress::-webkit-progress-bar { + background: var(--zen-color-surface-muted); +} + +zen-progress progress::-webkit-progress-value { + background: var(--zen-color-success); +} + +zen-progress progress::-moz-progress-bar { + background: var(--zen-color-success); +} + +zen-resizable { + display: flex; + min-height: 12rem; + overflow: hidden; + border: var(--zen-border-width) solid var(--zen-color-border); + border-radius: var(--zen-radius-lg); +} + +zen-resizable [data-zen-panel] { + min-width: 0; + flex: 1 1 50%; + padding: var(--zen-space-4); + background: var(--zen-color-surface); +} + +zen-resizable [data-zen-handle] { + width: 0.65rem; + flex: 0 0 0.65rem; + border-inline: 1px solid var(--zen-color-border); + background: var(--zen-color-accent); + cursor: col-resize; +} + +zen-scroll-area { + display: block; + max-height: 10rem; + overflow: auto; + padding: var(--zen-space-3); + border: var(--zen-border-width) solid var(--zen-color-border); + border-radius: var(--zen-radius-md); + background: var(--zen-color-surface); + scrollbar-color: var(--zen-color-accent) transparent; +} + +zen-separator { + display: block; +} + +zen-separator hr { + margin-block: var(--zen-space-4); + border: 0; + border-block-start: 1px solid var(--zen-color-border); +} + +zen-separator[orientation="vertical"] { + display: inline-block; + width: 1px; + min-height: 1.5rem; + background: var(--zen-color-border); +} + +zen-sidebar { + display: grid; + grid-template-columns: minmax(12rem, 17rem) minmax(0, 1fr); + gap: var(--zen-space-3); +} + +zen-sidebar > [data-zen-sidebar-trigger] { + grid-column: 1 / -1; + justify-self: start; +} + +zen-sidebar [data-zen-sidebar-panel] { + padding: var(--zen-space-3); + border: var(--zen-border-width) solid var(--zen-color-border); + border-radius: var(--zen-radius-lg); + background: var(--zen-color-surface); +} + +zen-sidebar [data-zen-sidebar-panel] nav { + display: grid; + gap: var(--zen-space-1); +} + +zen-sidebar [data-zen-sidebar-panel] a { + padding: var(--zen-space-2); + border-radius: var(--zen-radius-sm); + color: inherit; + text-decoration: none; +} + +zen-sidebar [data-zen-sidebar-panel] a:hover { + background: var(--zen-color-accent); + color: var(--zen-color-on-accent); +} + +zen-skeleton { + display: block; + width: var(--zen-skeleton-width, 100%); + height: 1rem; + border-radius: var(--zen-radius-sm); + background: + linear-gradient( + 100deg, + color-mix(in srgb, var(--zen-color-text-muted) 18%, transparent) 20%, + color-mix(in srgb, var(--zen-color-text-muted) 8%, transparent) 38%, + color-mix(in srgb, var(--zen-color-text-muted) 18%, transparent) 56% + ); + background-size: 200% 100%; + animation: zen-skeleton-shimmer 1.4s linear infinite; +} + +zen-skeleton[shape="circle"] { + width: 3rem; + height: 3rem; + border-radius: 50%; +} + +zen-slider input { + appearance: none; + width: 100%; + height: 0.5rem; + padding-inline: 0; + border: 0; + border-radius: 999px; + background: var(--zen-color-surface-sunken); + cursor: pointer; +} + +zen-slider input::-webkit-slider-thumb { + appearance: none; + width: 1.35rem; + height: 1.35rem; + border: var(--zen-border-width) solid var(--zen-color-border); + border-radius: 50%; + box-shadow: var(--zen-shadow-sm); + background: var(--zen-color-accent); +} + +zen-slider input::-moz-range-thumb { + width: 1.35rem; + height: 1.35rem; + border: var(--zen-border-width) solid var(--zen-color-border); + border-radius: 50%; + box-shadow: var(--zen-shadow-sm); + background: var(--zen-color-accent); +} + +zen-spinner { + display: inline-block; + width: 1.35rem; + height: 1.35rem; + border: 3px solid color-mix( + in srgb, + var(--zen-color-text-muted) 28%, + transparent + ); + border-inline-end-color: var(--zen-color-info); + border-radius: 50%; + animation: zen-shadcn-spin 650ms linear infinite; +} + +zen-tabs [role="tablist"] { + display: flex; + width: fit-content; + gap: var(--zen-space-1); + padding: var(--zen-space-1); + border: 1px solid var(--zen-color-border); + border-radius: var(--zen-radius-md); + background: var(--zen-color-surface); +} + +zen-tabs [role="tab"] { + min-height: 2.25rem; + padding-inline: var(--zen-space-3); + border: 0; + border-radius: var(--zen-radius-sm); + background: transparent; + color: var(--zen-color-text); + font-weight: 750; + cursor: pointer; +} + +zen-tabs [role="tab"][aria-selected="true"] { + background: var(--zen-color-accent); + color: var(--zen-color-on-accent); +} + +zen-tabs [role="tabpanel"] { + padding-block: var(--zen-space-4); +} + +zen-tabs [role="tabpanel"][hidden] { + display: none; +} + +:where(zen-toggle, zen-toggle-group) { + display: inline-flex; +} + +:where(zen-toggle, zen-toggle-group) > button { + min-height: 2.5rem; + padding-inline: var(--zen-space-3); + border: 1px solid transparent; + border-radius: var(--zen-radius-sm); + background: transparent; + color: var(--zen-color-text); + font-weight: 750; + cursor: pointer; +} + +:where(zen-toggle, zen-toggle-group) > button[aria-pressed="true"] { + border-color: var(--zen-color-border); + background: var(--zen-color-accent); + color: var(--zen-color-on-accent); +} + +zen-typography { + display: block; + max-width: 65ch; + line-height: var(--zen-line-height); +} + +zen-typography > :where(h1, h2, h3) { + line-height: 1.15; + text-wrap: balance; +} + +zen-typography blockquote { + margin-inline: 0; + padding-inline-start: var(--zen-space-4); + border-inline-start: 0.35rem solid var(--zen-color-accent); + color: var(--zen-color-text-muted); + font-style: italic; +} + +:where( + button, + summary, + [tabindex] +):focus-visible { + outline: 3px solid var(--zen-color-focus); + outline-offset: 3px; +} + +:where( + zen-calendar, + zen-checkbox, + zen-combobox, + zen-command, + zen-date-picker, + zen-field, + zen-form, + zen-input, + zen-input-group, + zen-input-otp, + zen-native-select, + zen-radio-group, + zen-select, + zen-slider, + zen-switch, + zen-textarea +) :where(input, select, textarea):focus-visible { + outline: none; +} + +@keyframes zen-shadcn-spin { + to { transform: rotate(1turn); } +} + +@keyframes zen-skeleton-shimmer { + to { background-position-x: -200%; } +} + +@media (max-width: 640px) { + zen-sidebar { + display: block; + } + + zen-sidebar > [data-zen-sidebar-trigger] { + margin-block-end: var(--zen-space-2); + } + + :where(zen-calendar, zen-date-picker) { + width: 100%; + max-width: 100%; + } + + zen-date-picker [data-zen-calendar-panel] { + position: fixed; + inset: auto var(--zen-space-3) var(--zen-space-3); + width: auto; + max-height: calc(100vb - 2 * var(--zen-space-3)); + overflow: auto; + transform-origin: bottom center; + } +} + +@media (forced-colors: active) { + :where( + zen-aspect-ratio, + zen-attachment, + zen-avatar, + zen-badge, + zen-empty, + zen-resizable, + zen-scroll-area + ) { + border: 1px solid CanvasText; + } +} + +@media (prefers-reduced-motion: reduce) { + zen-skeleton, + zen-spinner { + animation: none; + } + + zen-switch input, + zen-switch input::before, + :where( + zen-accordion, + zen-collapsible + ) details::details-content, + :where( + zen-accordion, + zen-collapsible + ) summary > [data-zen-disclosure-icon] { + transition: none; + } + + zen-date-picker [data-zen-calendar-panel] { + animation: none; + } + + :where( + zen-alert-dialog, + zen-dialog, + zen-drawer, + zen-sheet + ) dialog[open], + :where( + zen-combobox, + zen-command, + zen-context-menu, + zen-dropdown-menu, + zen-hover-card, + zen-menubar, + zen-navigation-menu, + zen-popover, + zen-tooltip + ) :where( + [data-zen-content], + [role="listbox"], + [role="menu"] + ):not([hidden]) { + animation: none; + } +}