UNPKG

@arolariu/components

Version:

🎨 70+ beautiful, accessible React components built on Base UI. TypeScript-first, CSS Modules styling, tree-shakeable, SSR-ready. Perfect for modern web apps, design systems & rapid prototyping. Zero config, maximum flexibility! ⚡

595 lines (510 loc) • 12.2 kB
.wrapper { display: flex; width: 100%; min-height: 100svh; background-color: var(--ac-sidebar); } .staticSidebar { display: flex; width: var(--ac-sidebar-width); height: 100%; flex-direction: column; background-color: var(--ac-sidebar); color: var(--ac-sidebar-foreground); } .desktopRoot { display: none; color: var(--ac-sidebar-foreground); } @media (min-width: 768px) { .desktopRoot { display: block; } } .gap { position: relative; width: var(--ac-sidebar-width); background-color: transparent; transition: width var(--ac-transition-slow); } .desktopRoot[data-collapsible="offcanvas"] .gap { width: 0; } .desktopRoot[data-collapsible="icon"] .gap { width: var(--ac-sidebar-width-icon); } .desktopRoot[data-variant="floating"] .gap, .desktopRoot[data-variant="inset"] .gap { width: calc(var(--ac-sidebar-width-icon) + var(--ac-space-4)); } .panelWrap { position: fixed; inset-block: 0; z-index: 20; display: none; width: var(--ac-sidebar-width); transition: left var(--ac-transition-slow), right var(--ac-transition-slow), width var(--ac-transition-slow), padding var(--ac-transition-slow); } @media (min-width: 768px) { .panelWrap { display: flex; } } .desktopRoot[data-side="left"] .panelWrap { left: 0; } .desktopRoot[data-side="right"] .panelWrap { right: 0; } .desktopRoot[data-side="left"][data-collapsible="offcanvas"] .panelWrap { left: calc(var(--ac-sidebar-width) * -1); } .desktopRoot[data-side="right"][data-collapsible="offcanvas"] .panelWrap { right: calc(var(--ac-sidebar-width) * -1); } .desktopRoot[data-collapsible="icon"] .panelWrap { width: var(--ac-sidebar-width-icon); } .desktopRoot[data-variant="floating"] .panelWrap, .desktopRoot[data-variant="inset"] .panelWrap { padding: var(--ac-space-2); } .desktopRoot[data-variant="floating"][data-collapsible="icon"] .panelWrap, .desktopRoot[data-variant="inset"][data-collapsible="icon"] .panelWrap { width: calc(var(--ac-sidebar-width-icon) + var(--ac-space-4)); } .panel { display: flex; width: 100%; height: 100%; flex-direction: column; background-color: var(--ac-sidebar); color: var(--ac-sidebar-foreground); } .desktopRoot[data-variant="sidebar"] .panel { border-inline-end: 1px solid var(--ac-sidebar-border); } .desktopRoot[data-side="right"][data-variant="sidebar"] .panel { border-inline-end: 0; border-inline-start: 1px solid var(--ac-sidebar-border); } .desktopRoot[data-variant="floating"] .panel, .desktopRoot[data-variant="inset"] .panel { border: 1px solid var(--ac-sidebar-border); border-radius: var(--ac-radius-lg); box-shadow: 0 8px 24px rgb(0 0 0 / 0.08); } .mobilePortal { position: fixed; inset: 0; z-index: 50; } .mobileOverlay { position: absolute; inset: 0; border: 0; background: rgb(0 0 0 / 0.45); } .mobilePanel { position: absolute; inset-block: 0; width: var(--ac-sidebar-width); padding: 0; background-color: var(--ac-sidebar); color: var(--ac-sidebar-foreground); box-shadow: 0 18px 50px rgb(0 0 0 / 0.18); } .mobilePanelLeft { left: 0; } .mobilePanelRight { right: 0; } .mobileContent { display: flex; width: 100%; height: 100%; flex-direction: column; } .trigger { width: 1.75rem; height: 1.75rem; } .triggerIcon { width: 1rem; height: 1rem; } .rail { position: absolute; inset-block: 0; z-index: 30; display: none; width: 1rem; border: 0; background: transparent; transform: translateX(-50%); transition: background-color var(--ac-transition-fast); } .rail::after { position: absolute; inset-block: 0; left: 50%; width: 2px; content: ""; background-color: transparent; transition: background-color var(--ac-transition-fast); } @media (min-width: 640px) { .rail { display: flex; cursor: ew-resize; } .rail:hover::after { background-color: var(--ac-sidebar-border); } } .desktopRoot[data-side="left"] .rail { right: -1rem; } .desktopRoot[data-side="right"] .rail { left: 0; } .desktopRoot[data-collapsible="offcanvas"][data-side="left"] .rail { right: -0.5rem; transform: none; } .desktopRoot[data-collapsible="offcanvas"][data-side="right"] .rail { left: -0.5rem; transform: none; } .inset { position: relative; display: flex; width: 100%; flex: 1; flex-direction: column; background-color: var(--ac-background); } @media (min-width: 768px) { .desktopRoot[data-variant="inset"] ~ .inset { margin: var(--ac-space-2); margin-inline-start: 0; border-radius: var(--ac-radius-xl); box-shadow: 0 8px 24px rgb(0 0 0 / 0.08); } .desktopRoot[data-state="collapsed"][data-variant="inset"] ~ .inset { margin-inline-start: var(--ac-space-2); } } .input { width: 100%; height: 2rem; background-color: var(--ac-background); box-shadow: none; } .header, .footer { display: flex; flex-direction: column; gap: var(--ac-space-2); padding: var(--ac-space-2); } .separator { width: auto; margin-inline: var(--ac-space-2); background-color: var(--ac-sidebar-border); } .content { display: flex; min-height: 0; flex: 1; flex-direction: column; gap: var(--ac-space-2); overflow: auto; } .desktopRoot[data-collapsible="icon"] .content { overflow: hidden; } .group { position: relative; display: flex; width: 100%; min-width: 0; flex-direction: column; padding: var(--ac-space-2); } .groupLabel { display: flex; height: 2rem; flex-shrink: 0; align-items: center; padding-inline: var(--ac-space-2); border-radius: var(--ac-radius-md); color: color-mix(in oklch, var(--ac-sidebar-foreground), transparent 30%); font-size: var(--ac-text-xs); font-weight: 500; outline: none; transition: margin var(--ac-transition-slow), opacity var(--ac-transition-slow); } .groupLabel > svg { width: 1rem; height: 1rem; flex-shrink: 0; } .desktopRoot[data-collapsible="icon"] .groupLabel { margin-top: -2rem; opacity: 0; pointer-events: none; } .groupAction { position: absolute; top: 0.875rem; right: 0.75rem; display: flex; width: 1.25rem; aspect-ratio: 1; align-items: center; justify-content: center; padding: 0; border: 0; border-radius: var(--ac-radius-md); background: transparent; color: var(--ac-sidebar-foreground); cursor: pointer; outline: none; transition: background-color var(--ac-transition-fast), color var(--ac-transition-fast); } .groupAction:hover, .groupAction:focus-visible { background-color: var(--ac-sidebar-accent); color: var(--ac-sidebar-accent-foreground); } .desktopRoot[data-collapsible="icon"] .groupAction { display: none; } .groupContent { width: 100%; font-size: var(--ac-text-sm); } .menu { display: flex; width: 100%; min-width: 0; flex-direction: column; gap: var(--ac-space-1); } .menuItem { position: relative; } .menuButton { display: flex; width: 100%; align-items: center; gap: var(--ac-space-2); overflow: hidden; padding: var(--ac-space-2); border: 0; border-radius: var(--ac-radius-md); background: transparent; color: inherit; font-size: var(--ac-text-sm); text-align: left; outline: none; transition: background-color var(--ac-transition-fast), color var(--ac-transition-fast), width var(--ac-transition-slow), height var(--ac-transition-slow), padding var(--ac-transition-slow); } .menuButton:hover, .menuButton:focus-visible, .menuButton:active, .menuButton[data-active="true"] { background-color: var(--ac-sidebar-accent); color: var(--ac-sidebar-accent-foreground); } .menuButton[data-active="true"] { font-weight: 500; } .menuButton:disabled, .menuButton[aria-disabled="true"] { pointer-events: none; opacity: 0.5; } .menuButton > svg { width: 1rem; height: 1rem; flex-shrink: 0; } .menuButton > span:last-child { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .menuButtonDefault { background-color: transparent; } .menuButtonOutline { border: 1px solid var(--ac-sidebar-border); background-color: var(--ac-background); box-shadow: 0 1px 2px rgb(0 0 0 / 0.05); } .menuButtonSizeDefault { min-height: 2rem; } .menuButtonSizeSm { min-height: 1.75rem; font-size: var(--ac-text-xs); } .menuButtonSizeLg { min-height: 3rem; font-size: var(--ac-text-sm); } .desktopRoot[data-collapsible="icon"] .menuButton { width: 2rem; min-width: 2rem; height: 2rem; justify-content: center; padding: var(--ac-space-2); } .desktopRoot[data-collapsible="icon"] .menuButton > span:last-child, .desktopRoot[data-collapsible="icon"] .menuBadge, .desktopRoot[data-collapsible="icon"] .menuAction, .desktopRoot[data-collapsible="icon"] .menuSub { display: none; } .desktopRoot[data-collapsible="icon"] .menuButtonSizeLg { padding: 0; } .menuAction { position: absolute; top: 50%; right: 0.25rem; display: flex; width: 1.25rem; aspect-ratio: 1; align-items: center; justify-content: center; padding: 0; border: 0; border-radius: var(--ac-radius-md); background: transparent; color: inherit; transform: translateY(-50%); cursor: pointer; outline: none; transition: opacity var(--ac-transition-fast), background-color var(--ac-transition-fast), color var(--ac-transition-fast); } .menuAction:hover, .menuAction:focus-visible { background-color: var(--ac-sidebar-accent); color: var(--ac-sidebar-accent-foreground); } @media (min-width: 768px) { .menuActionShowOnHover { opacity: 0; } .menuItem:hover .menuActionShowOnHover, .menuItem:focus-within .menuActionShowOnHover { opacity: 1; } } .menuBadge { position: absolute; top: 50%; right: 0.25rem; display: flex; min-width: 1.25rem; height: 1.25rem; align-items: center; justify-content: center; padding-inline: 0.25rem; border-radius: var(--ac-radius-md); color: inherit; font-size: var(--ac-text-xs); font-weight: 500; font-variant-numeric: tabular-nums; pointer-events: none; transform: translateY(-50%); user-select: none; } .menuSkeleton { display: flex; height: 2rem; align-items: center; gap: var(--ac-space-2); padding-inline: var(--ac-space-2); border-radius: var(--ac-radius-md); } .menuSkeletonIcon { width: 1rem; height: 1rem; border-radius: var(--ac-radius-md); } .menuSkeletonText { width: var(--ac-skeleton-width); max-width: var(--ac-skeleton-width); height: 1rem; flex: 1; } .menuSub { display: flex; min-width: 0; flex-direction: column; gap: var(--ac-space-1); margin-inline: 0.875rem; padding: 0.125rem 0 0.125rem var(--ac-space-3); border-left: 1px solid var(--ac-sidebar-border); } .menuSubButton { display: flex; min-width: 0; height: 1.75rem; align-items: center; gap: var(--ac-space-2); padding-inline: var(--ac-space-2); border-radius: var(--ac-radius-md); color: inherit; text-decoration: none; outline: none; transition: background-color var(--ac-transition-fast), color var(--ac-transition-fast); } .menuSubButton:hover, .menuSubButton:focus-visible, .menuSubButton:active, .menuSubButton[data-active="true"] { background-color: var(--ac-sidebar-accent); color: var(--ac-sidebar-accent-foreground); } .menuSubButton > svg { width: 1rem; height: 1rem; flex-shrink: 0; } .menuSubButtonSm { font-size: var(--ac-text-xs); } .menuSubButtonMd { font-size: var(--ac-text-sm); } .srOnly { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); border: 0; white-space: nowrap; }