@olympusoss/canvas 2.15.0 → 2.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/components/atoms/input.tsx +1 -0
- package/src/components/molecules/alert.tsx +7 -1
- package/src/components/molecules/calendar.tsx +1 -0
- package/src/components/molecules/card.tsx +1 -0
- package/src/components/molecules/code-block.tsx +1 -0
- package/src/components/molecules/empty-state.tsx +1 -0
- package/src/components/molecules/section-card.tsx +1 -1
- package/src/components/molecules/terminal.tsx +1 -0
- package/src/components/molecules/tooltip.tsx +1 -0
- package/src/components/organisms/accordion.tsx +6 -1
- package/src/components/organisms/alert-dialog.tsx +1 -0
- package/src/components/organisms/command.tsx +1 -0
- package/src/components/organisms/context-menu.tsx +2 -0
- package/src/components/organisms/data-table.tsx +1 -1
- package/src/components/organisms/dialog.tsx +1 -0
- package/src/components/organisms/drawer.tsx +1 -0
- package/src/components/organisms/dropdown-menu.tsx +2 -0
- package/src/components/organisms/hover-card.tsx +1 -0
- package/src/components/organisms/menubar.tsx +3 -0
- package/src/components/organisms/navigation-menu.tsx +1 -0
- package/src/components/organisms/popover.tsx +1 -0
- package/src/components/organisms/select.tsx +1 -0
- package/src/components/organisms/sheet.tsx +1 -0
- package/src/components/organisms/sidebar.tsx +2 -0
- package/src/components/organisms/tabs.tsx +1 -0
- package/styles/glass.css +177 -0
package/package.json
CHANGED
|
@@ -76,6 +76,7 @@ const Input = React.forwardRef<HTMLInputElement, InputProps>(
|
|
|
76
76
|
return (
|
|
77
77
|
<input
|
|
78
78
|
type={type}
|
|
79
|
+
data-slot="input"
|
|
79
80
|
className={cn(
|
|
80
81
|
"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
|
|
81
82
|
className,
|
|
@@ -40,7 +40,13 @@ export interface AlertProps
|
|
|
40
40
|
|
|
41
41
|
const Alert = React.forwardRef<HTMLDivElement, AlertProps>(
|
|
42
42
|
({ className, variant, ...props }, ref) => (
|
|
43
|
-
<div
|
|
43
|
+
<div
|
|
44
|
+
ref={ref}
|
|
45
|
+
role="alert"
|
|
46
|
+
data-slot="alert"
|
|
47
|
+
className={cn(alertVariants({ variant }), className)}
|
|
48
|
+
{...props}
|
|
49
|
+
/>
|
|
44
50
|
),
|
|
45
51
|
);
|
|
46
52
|
Alert.displayName = "Alert";
|
|
@@ -44,6 +44,7 @@ function Calendar({
|
|
|
44
44
|
return (
|
|
45
45
|
<DayPicker
|
|
46
46
|
showOutsideDays={showOutsideDays}
|
|
47
|
+
data-slot="calendar"
|
|
47
48
|
className={cn(
|
|
48
49
|
"bg-background group/calendar p-4 [--cell-size:2rem] [[data-slot=card-content]_&]:bg-transparent [[data-slot=popover-content]_&]:bg-transparent",
|
|
49
50
|
String.raw`rtl:**:[.rdp-button\_next>svg]:rotate-180`,
|
|
@@ -15,6 +15,7 @@ export interface CardProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
|
15
15
|
const Card = React.forwardRef<HTMLDivElement, CardProps>(({ className, ...props }, ref) => (
|
|
16
16
|
<div
|
|
17
17
|
ref={ref}
|
|
18
|
+
data-slot="card"
|
|
18
19
|
className={cn("rounded-xl border border-border bg-card text-card-foreground shadow", className)}
|
|
19
20
|
{...props}
|
|
20
21
|
/>
|
|
@@ -61,7 +61,7 @@ export function SectionCard({
|
|
|
61
61
|
</div>
|
|
62
62
|
{resolvedActions && <div className="flex items-center gap-2">{resolvedActions}</div>}
|
|
63
63
|
</CardHeader>
|
|
64
|
-
<div className="mx-5 mb-3.5 h-px bg-border" />
|
|
64
|
+
<div data-slot="card-divider" className="mx-5 mb-3.5 h-px bg-border" />
|
|
65
65
|
</>
|
|
66
66
|
)}
|
|
67
67
|
<CardContent className={cn(padding ? "px-5 pb-[18px] pt-0" : "p-0")}>
|
|
@@ -23,6 +23,7 @@ const Terminal = React.forwardRef<HTMLDivElement, TerminalProps>(
|
|
|
23
23
|
({ title, children, className, ...props }, ref) => (
|
|
24
24
|
<div
|
|
25
25
|
ref={ref}
|
|
26
|
+
data-slot="terminal"
|
|
26
27
|
className={cn(
|
|
27
28
|
"overflow-hidden rounded-xl border border-border shadow-[0_30px_60px_-20px_rgb(0_0_0/0.35)]",
|
|
28
29
|
className,
|
|
@@ -136,6 +136,7 @@ const TooltipContent = React.forwardRef<
|
|
|
136
136
|
<TooltipPrimitive.Portal container={container ?? undefined}>
|
|
137
137
|
<TooltipPrimitive.Content
|
|
138
138
|
ref={ref}
|
|
139
|
+
data-slot="tooltip-content"
|
|
139
140
|
sideOffset={sideOffset}
|
|
140
141
|
className={cn(
|
|
141
142
|
"z-50 max-w-xs overflow-hidden rounded-md border border-border/50 bg-popover px-2 py-1 text-[11px] font-medium text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-1 data-[side=left]:slide-in-from-right-1 data-[side=right]:slide-in-from-left-1 data-[side=top]:slide-in-from-bottom-1 origin-[var(--radix-tooltip-content-transform-origin)]",
|
|
@@ -79,7 +79,12 @@ const AccordionItem = React.forwardRef<
|
|
|
79
79
|
React.ElementRef<typeof AccordionPrimitive.Item>,
|
|
80
80
|
AccordionItemProps
|
|
81
81
|
>(({ className, ...props }, ref) => (
|
|
82
|
-
<AccordionPrimitive.Item
|
|
82
|
+
<AccordionPrimitive.Item
|
|
83
|
+
ref={ref}
|
|
84
|
+
data-slot="accordion-item"
|
|
85
|
+
className={cn("border-b", className)}
|
|
86
|
+
{...props}
|
|
87
|
+
/>
|
|
83
88
|
));
|
|
84
89
|
AccordionItem.displayName = "AccordionItem";
|
|
85
90
|
|
|
@@ -123,6 +123,7 @@ const AlertDialogContent = React.forwardRef<
|
|
|
123
123
|
<AlertDialogOverlay />
|
|
124
124
|
<AlertDialogPrimitive.Content
|
|
125
125
|
ref={ref}
|
|
126
|
+
data-slot="alert-dialog-content"
|
|
126
127
|
className={cn(
|
|
127
128
|
"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border border-border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]",
|
|
128
129
|
className,
|
|
@@ -127,6 +127,7 @@ const ContextMenuSubContent = React.forwardRef<
|
|
|
127
127
|
>(({ className, ...props }, ref) => (
|
|
128
128
|
<ContextMenuPrimitive.SubContent
|
|
129
129
|
ref={ref}
|
|
130
|
+
data-slot="context-menu-sub-content"
|
|
130
131
|
className={cn(
|
|
131
132
|
"z-50 min-w-[8rem] overflow-hidden rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[var(--radix-context-menu-content-transform-origin)]",
|
|
132
133
|
className,
|
|
@@ -161,6 +162,7 @@ const ContextMenuContent = React.forwardRef<
|
|
|
161
162
|
<ContextMenuPrimitive.Portal container={container ?? undefined}>
|
|
162
163
|
<ContextMenuPrimitive.Content
|
|
163
164
|
ref={ref}
|
|
165
|
+
data-slot="context-menu-content"
|
|
164
166
|
className={cn(
|
|
165
167
|
"z-50 max-h-[var(--radix-context-menu-content-available-height)] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[var(--radix-context-menu-content-transform-origin)]",
|
|
166
168
|
className,
|
|
@@ -237,7 +237,7 @@ function DataTable<TData>({
|
|
|
237
237
|
</div>
|
|
238
238
|
)}
|
|
239
239
|
|
|
240
|
-
<div className="rounded-md border border-border">
|
|
240
|
+
<div data-slot="data-table" className="rounded-md border border-border">
|
|
241
241
|
<Table>
|
|
242
242
|
<TableHeader>
|
|
243
243
|
{table.getHeaderGroups().map((headerGroup) => (
|
|
@@ -191,6 +191,7 @@ const DialogContent = React.forwardRef<
|
|
|
191
191
|
<DialogOverlay />
|
|
192
192
|
<DialogPrimitive.Content
|
|
193
193
|
ref={ref}
|
|
194
|
+
data-slot="dialog-content"
|
|
194
195
|
className={cn(
|
|
195
196
|
"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border border-border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]",
|
|
196
197
|
className,
|
|
@@ -60,6 +60,7 @@ const DrawerContent = React.forwardRef<
|
|
|
60
60
|
<DrawerOverlay />
|
|
61
61
|
<DrawerPrimitive.Content
|
|
62
62
|
ref={ref}
|
|
63
|
+
data-slot="drawer-content"
|
|
63
64
|
className={cn(
|
|
64
65
|
"fixed inset-x-0 bottom-0 z-50 mt-24 flex h-auto flex-col rounded-t-[10px] border border-border bg-background",
|
|
65
66
|
className,
|
|
@@ -163,6 +163,7 @@ const DropdownMenuSubContent = React.forwardRef<
|
|
|
163
163
|
>(({ className, ...props }, ref) => (
|
|
164
164
|
<DropdownMenuPrimitive.SubContent
|
|
165
165
|
ref={ref}
|
|
166
|
+
data-slot="dropdown-menu-sub-content"
|
|
166
167
|
className={cn(
|
|
167
168
|
"z-50 min-w-[8rem] overflow-hidden rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[var(--radix-dropdown-menu-content-transform-origin)]",
|
|
168
169
|
className,
|
|
@@ -227,6 +228,7 @@ const DropdownMenuContent = React.forwardRef<
|
|
|
227
228
|
<DropdownMenuPrimitive.Portal container={container ?? undefined}>
|
|
228
229
|
<DropdownMenuPrimitive.Content
|
|
229
230
|
ref={ref}
|
|
231
|
+
data-slot="dropdown-menu-content"
|
|
230
232
|
sideOffset={sideOffset}
|
|
231
233
|
className={cn(
|
|
232
234
|
"z-50 max-h-[var(--radix-dropdown-menu-content-available-height)] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md",
|
|
@@ -100,6 +100,7 @@ const HoverCardContent = React.forwardRef<
|
|
|
100
100
|
>(({ className, align = "center", sideOffset = 4, ...props }, ref) => (
|
|
101
101
|
<HoverCardPrimitive.Content
|
|
102
102
|
ref={ref}
|
|
103
|
+
data-slot="hover-card-content"
|
|
103
104
|
align={align}
|
|
104
105
|
sideOffset={sideOffset}
|
|
105
106
|
className={cn(
|
|
@@ -33,6 +33,7 @@ const Menubar = React.forwardRef<React.ElementRef<typeof MenubarPrimitive.Root>,
|
|
|
33
33
|
({ className, ...props }, ref) => (
|
|
34
34
|
<MenubarPrimitive.Root
|
|
35
35
|
ref={ref}
|
|
36
|
+
data-slot="menubar"
|
|
36
37
|
className={cn(
|
|
37
38
|
"flex h-9 items-center space-x-1 rounded-md border border-border bg-background p-1 shadow-sm",
|
|
38
39
|
className,
|
|
@@ -216,6 +217,7 @@ const MenubarSubContent = React.forwardRef<
|
|
|
216
217
|
>(({ className, ...props }, ref) => (
|
|
217
218
|
<MenubarPrimitive.SubContent
|
|
218
219
|
ref={ref}
|
|
220
|
+
data-slot="menubar-sub-content"
|
|
219
221
|
className={cn(
|
|
220
222
|
"z-50 min-w-[8rem] overflow-hidden rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[var(--radix-menubar-content-transform-origin)]",
|
|
221
223
|
className,
|
|
@@ -279,6 +281,7 @@ const MenubarContent = React.forwardRef<
|
|
|
279
281
|
<MenubarPrimitive.Portal container={container ?? undefined}>
|
|
280
282
|
<MenubarPrimitive.Content
|
|
281
283
|
ref={ref}
|
|
284
|
+
data-slot="menubar-content"
|
|
282
285
|
align={align}
|
|
283
286
|
alignOffset={alignOffset}
|
|
284
287
|
sideOffset={sideOffset}
|
|
@@ -185,6 +185,7 @@ const NavigationMenuViewport = React.forwardRef<
|
|
|
185
185
|
>(({ className, ...props }, ref) => (
|
|
186
186
|
<div className={cn("absolute left-0 top-full flex justify-center")}>
|
|
187
187
|
<NavigationMenuPrimitive.Viewport
|
|
188
|
+
data-slot="navigation-menu-viewport"
|
|
188
189
|
className={cn(
|
|
189
190
|
"origin-top-center relative mt-1.5 h-[var(--radix-navigation-menu-viewport-height)] w-full overflow-hidden rounded-md border border-border bg-popover text-popover-foreground shadow data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-90 md:w-[var(--radix-navigation-menu-viewport-width)]",
|
|
190
191
|
className,
|
|
@@ -187,6 +187,7 @@ const SelectContent = React.forwardRef<
|
|
|
187
187
|
<SelectPrimitive.Portal container={container ?? undefined}>
|
|
188
188
|
<SelectPrimitive.Content
|
|
189
189
|
ref={ref}
|
|
190
|
+
data-slot="select-content"
|
|
190
191
|
className={cn(
|
|
191
192
|
"relative z-50 max-h-[var(--radix-select-content-available-height)] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border border-border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[var(--radix-select-content-transform-origin)]",
|
|
192
193
|
position === "popper" &&
|
|
@@ -209,6 +209,7 @@ const Sidebar = React.forwardRef<HTMLDivElement, SidebarProps>(
|
|
|
209
209
|
if (collapsible === "none") {
|
|
210
210
|
return (
|
|
211
211
|
<div
|
|
212
|
+
data-slot="sidebar"
|
|
212
213
|
className={cn(
|
|
213
214
|
"flex h-full w-[var(--sidebar-width)] flex-col bg-sidebar text-sidebar-foreground",
|
|
214
215
|
className,
|
|
@@ -281,6 +282,7 @@ const Sidebar = React.forwardRef<HTMLDivElement, SidebarProps>(
|
|
|
281
282
|
>
|
|
282
283
|
<div
|
|
283
284
|
data-sidebar="sidebar"
|
|
285
|
+
data-slot="sidebar"
|
|
284
286
|
className="flex h-full w-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow"
|
|
285
287
|
>
|
|
286
288
|
{children}
|
|
@@ -53,6 +53,7 @@ const TabsList = React.forwardRef<React.ElementRef<typeof TabsPrimitive.List>, T
|
|
|
53
53
|
({ className, ...props }, ref) => (
|
|
54
54
|
<TabsPrimitive.List
|
|
55
55
|
ref={ref}
|
|
56
|
+
data-slot="tabs-list"
|
|
56
57
|
className={cn(
|
|
57
58
|
"inline-flex h-9 items-center justify-center rounded-lg bg-muted p-1 text-muted-foreground",
|
|
58
59
|
className,
|
package/styles/glass.css
ADDED
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/* ---------- Glass surface mode ----------
|
|
2
|
+
*
|
|
3
|
+
* Activated by `html[data-surface="glass"]`. The conceit: an aurora-tinted
|
|
4
|
+
* backdrop shows through every chrome surface (sidebar, topbar, cards,
|
|
5
|
+
* tables) via `backdrop-filter: blur(...)`. Surfaces become tinted glass,
|
|
6
|
+
* with a low-alpha card color so the page palette bleeds through, plus a
|
|
7
|
+
* 1-px inner highlight on the top edge to suggest a refractive lip.
|
|
8
|
+
* Borders drop to white/black at low alpha so the layout reads as layered
|
|
9
|
+
* panes rather than rectangles drawn on flat paint.
|
|
10
|
+
*
|
|
11
|
+
* Two palettes:
|
|
12
|
+
* - Light: pastel peach + sky + lavender washes on near-white
|
|
13
|
+
* - Dark : deep indigo + violet + teal washes on near-black
|
|
14
|
+
*
|
|
15
|
+
* Surfaces opt in via `data-slot` attributes already present on Canvas
|
|
16
|
+
* components (`card`, `sidebar`, `data-table`, `input`, `popover-content`,
|
|
17
|
+
* `sheet-content`, `drawer-content`, `empty-state`, `code-block`). Consumer
|
|
18
|
+
* apps activate the mode by toggling the `data-surface` attribute on
|
|
19
|
+
* `<html>` (e.g. `document.documentElement.dataset.surface = "glass"`).
|
|
20
|
+
*
|
|
21
|
+
* Mirrors the Athena design handoff's `app.css` glass block; do not
|
|
22
|
+
* tighten these values without checking against the handoff bundle.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
@layer base {
|
|
26
|
+
html[data-surface="glass"] {
|
|
27
|
+
--glass-tint: 0 0% 100%; /* card tint base */
|
|
28
|
+
--glass-tint-alpha: 0.55;
|
|
29
|
+
--glass-border: 0 0% 100%;
|
|
30
|
+
--glass-border-alpha: 0.45;
|
|
31
|
+
--glass-highlight: 0 0% 100%;
|
|
32
|
+
--glass-highlight-alpha: 0.55;
|
|
33
|
+
--glass-shadow: 220 30% 20%;
|
|
34
|
+
--glass-blur: 18px;
|
|
35
|
+
--glass-saturate: 140%;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
html[data-surface="glass"].dark {
|
|
39
|
+
--glass-tint: 222 22% 18%;
|
|
40
|
+
--glass-tint-alpha: 0.55;
|
|
41
|
+
--glass-border: 0 0% 100%;
|
|
42
|
+
--glass-border-alpha: 0.1;
|
|
43
|
+
--glass-highlight: 0 0% 100%;
|
|
44
|
+
--glass-highlight-alpha: 0.1;
|
|
45
|
+
--glass-shadow: 222 60% 4%;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/* ──────────────────────────────────────────────────────────────
|
|
49
|
+
* Aurora backdrop — three soft radial washes anchored to body so
|
|
50
|
+
* they remain stable across route changes and ignore the inner
|
|
51
|
+
* shell's flat fill. The surfaces above are translucent so this
|
|
52
|
+
* is what users actually see "through" the glass.
|
|
53
|
+
* ──────────────────────────────────────────────────────────── */
|
|
54
|
+
html[data-surface="glass"] body {
|
|
55
|
+
background:
|
|
56
|
+
radial-gradient(60% 50% at 12% 10%, hsl(28 100% 80% / 0.55), transparent 60%),
|
|
57
|
+
radial-gradient(55% 55% at 88% 8%, hsl(210 100% 78% / 0.55), transparent 60%),
|
|
58
|
+
radial-gradient(70% 60% at 50% 100%, hsl(270 90% 82% / 0.45), transparent 65%),
|
|
59
|
+
hsl(220 30% 97%);
|
|
60
|
+
background-attachment: fixed;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
html[data-surface="glass"].dark body {
|
|
64
|
+
background:
|
|
65
|
+
radial-gradient(55% 50% at 10% 8%, hsl(245 90% 60% / 0.4), transparent 60%),
|
|
66
|
+
radial-gradient(50% 55% at 92% 12%, hsl(280 85% 55% / 0.35), transparent 60%),
|
|
67
|
+
radial-gradient(70% 60% at 50% 100%, hsl(190 90% 45% / 0.28), transparent 70%),
|
|
68
|
+
hsl(222 30% 6%);
|
|
69
|
+
background-attachment: fixed;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/* ──────────────────────────────────────────────────────────────
|
|
73
|
+
* Frosted-pane mixin. Same translucent fill, blur, and refractive
|
|
74
|
+
* highlight on every load-bearing surface so the whole layout
|
|
75
|
+
* reads as one stack of glass panes. Includes cards, chrome,
|
|
76
|
+
* dialogs, dropdown panels, popovers, tooltips, alerts, calendar,
|
|
77
|
+
* terminal, menubar, navigation-menu, tabs list.
|
|
78
|
+
* ──────────────────────────────────────────────────────────── */
|
|
79
|
+
html[data-surface="glass"] [data-slot="card"],
|
|
80
|
+
html[data-surface="glass"] [data-slot="sidebar"],
|
|
81
|
+
html[data-surface="glass"] [data-slot="topbar"],
|
|
82
|
+
html[data-surface="glass"] [data-slot="data-table"],
|
|
83
|
+
html[data-surface="glass"] [data-slot="empty-state"],
|
|
84
|
+
html[data-surface="glass"] [data-slot="popover-content"],
|
|
85
|
+
html[data-surface="glass"] [data-slot="sheet-content"],
|
|
86
|
+
html[data-surface="glass"] [data-slot="drawer-content"],
|
|
87
|
+
html[data-surface="glass"] [data-slot="alert"],
|
|
88
|
+
html[data-surface="glass"] [data-slot="alert-dialog-content"],
|
|
89
|
+
html[data-surface="glass"] [data-slot="dialog-content"],
|
|
90
|
+
html[data-surface="glass"] [data-slot="dropdown-menu-content"],
|
|
91
|
+
html[data-surface="glass"] [data-slot="dropdown-menu-sub-content"],
|
|
92
|
+
html[data-surface="glass"] [data-slot="context-menu-content"],
|
|
93
|
+
html[data-surface="glass"] [data-slot="context-menu-sub-content"],
|
|
94
|
+
html[data-surface="glass"] [data-slot="hover-card-content"],
|
|
95
|
+
html[data-surface="glass"] [data-slot="select-content"],
|
|
96
|
+
html[data-surface="glass"] [data-slot="menubar"],
|
|
97
|
+
html[data-surface="glass"] [data-slot="menubar-content"],
|
|
98
|
+
html[data-surface="glass"] [data-slot="menubar-sub-content"],
|
|
99
|
+
html[data-surface="glass"] [data-slot="navigation-menu-viewport"],
|
|
100
|
+
html[data-surface="glass"] [data-slot="tooltip-content"],
|
|
101
|
+
html[data-surface="glass"] [data-slot="command"],
|
|
102
|
+
html[data-surface="glass"] [data-slot="calendar"],
|
|
103
|
+
html[data-surface="glass"] [data-slot="terminal"] {
|
|
104
|
+
background: hsl(var(--glass-tint) / var(--glass-tint-alpha));
|
|
105
|
+
backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-saturate));
|
|
106
|
+
-webkit-backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-saturate));
|
|
107
|
+
border-color: hsl(var(--glass-border) / var(--glass-border-alpha));
|
|
108
|
+
box-shadow:
|
|
109
|
+
inset 0 1px 0 hsl(var(--glass-highlight) / var(--glass-highlight-alpha)),
|
|
110
|
+
0 1px 2px hsl(var(--glass-shadow) / 0.06),
|
|
111
|
+
0 8px 24px -12px hsl(var(--glass-shadow) / 0.18);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/* Sidebar and topbar take a slightly less-opaque tint so they
|
|
115
|
+
* read as chrome rather than content cards. */
|
|
116
|
+
html[data-surface="glass"] [data-slot="sidebar"],
|
|
117
|
+
html[data-surface="glass"] [data-slot="topbar"] {
|
|
118
|
+
background: hsl(var(--glass-tint) / calc(var(--glass-tint-alpha) - 0.1));
|
|
119
|
+
border-color: hsl(var(--glass-border) / var(--glass-border-alpha));
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/* DataTable internal rules — header tint, row separators, hover. */
|
|
123
|
+
html[data-surface="glass"] [data-slot="data-table"] thead tr {
|
|
124
|
+
background: hsl(var(--glass-highlight) / 0.1);
|
|
125
|
+
border-bottom: 1px solid hsl(var(--glass-border) / var(--glass-border-alpha));
|
|
126
|
+
}
|
|
127
|
+
html[data-surface="glass"] [data-slot="data-table"] tbody tr {
|
|
128
|
+
border-bottom: 1px solid hsl(var(--glass-border) / calc(var(--glass-border-alpha) - 0.2));
|
|
129
|
+
}
|
|
130
|
+
html[data-surface="glass"] [data-slot="data-table"] tbody tr:hover {
|
|
131
|
+
background: hsl(var(--glass-highlight) / 0.1);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/* SectionCard divider matches the border tone. */
|
|
135
|
+
html[data-surface="glass"] [data-slot="card"] [data-slot="card-divider"] {
|
|
136
|
+
background: hsl(var(--glass-border) / var(--glass-border-alpha));
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/* Inputs, kbd, codeblock, tabs list — frosted to match. Less blur
|
|
140
|
+
* than full panes so dense form rows stay readable. */
|
|
141
|
+
html[data-surface="glass"] [data-slot="input"],
|
|
142
|
+
html[data-surface="glass"] [data-slot="code-block"],
|
|
143
|
+
html[data-surface="glass"] [data-slot="tabs-list"] {
|
|
144
|
+
background: hsl(var(--glass-tint) / 0.35);
|
|
145
|
+
border-color: hsl(var(--glass-border) / var(--glass-border-alpha));
|
|
146
|
+
backdrop-filter: blur(8px);
|
|
147
|
+
-webkit-backdrop-filter: blur(8px);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/* Accordion items use only a bottom border — re-tint that border so it
|
|
151
|
+
* tracks the glass palette instead of the solid border token. */
|
|
152
|
+
html[data-surface="glass"] [data-slot="accordion-item"] {
|
|
153
|
+
border-bottom-color: hsl(var(--glass-border) / var(--glass-border-alpha));
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/* Popovers / sheets / drawers / dialog-like panels — slightly more
|
|
157
|
+
* opaque so the content stays legible against the body aurora.
|
|
158
|
+
* Overrides the base translucent fill from the frosted-pane block. */
|
|
159
|
+
html[data-surface="glass"] [data-slot="popover-content"],
|
|
160
|
+
html[data-surface="glass"] [data-slot="sheet-content"],
|
|
161
|
+
html[data-surface="glass"] [data-slot="drawer-content"],
|
|
162
|
+
html[data-surface="glass"] [data-slot="alert-dialog-content"],
|
|
163
|
+
html[data-surface="glass"] [data-slot="dialog-content"],
|
|
164
|
+
html[data-surface="glass"] [data-slot="dropdown-menu-content"],
|
|
165
|
+
html[data-surface="glass"] [data-slot="dropdown-menu-sub-content"],
|
|
166
|
+
html[data-surface="glass"] [data-slot="context-menu-content"],
|
|
167
|
+
html[data-surface="glass"] [data-slot="context-menu-sub-content"],
|
|
168
|
+
html[data-surface="glass"] [data-slot="hover-card-content"],
|
|
169
|
+
html[data-surface="glass"] [data-slot="select-content"],
|
|
170
|
+
html[data-surface="glass"] [data-slot="menubar-content"],
|
|
171
|
+
html[data-surface="glass"] [data-slot="menubar-sub-content"],
|
|
172
|
+
html[data-surface="glass"] [data-slot="navigation-menu-viewport"],
|
|
173
|
+
html[data-surface="glass"] [data-slot="tooltip-content"],
|
|
174
|
+
html[data-surface="glass"] [data-slot="command"] {
|
|
175
|
+
background: hsl(var(--glass-tint) / 0.85);
|
|
176
|
+
}
|
|
177
|
+
}
|