@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@olympusoss/canvas",
3
- "version": "2.15.0",
3
+ "version": "2.17.0",
4
4
  "type": "module",
5
5
  "main": "./src/index.ts",
6
6
  "types": "./src/index.ts",
@@ -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 ref={ref} role="alert" className={cn(alertVariants({ variant }), className)} {...props} />
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
  />
@@ -32,6 +32,7 @@ const CodeBlock = React.forwardRef<HTMLDivElement, CodeBlockProps>(
32
32
  return (
33
33
  <div
34
34
  ref={ref}
35
+ data-slot="code-block"
35
36
  className={cn(
36
37
  "relative overflow-hidden rounded-md",
37
38
  isDark ? "border border-border" : "bg-muted",
@@ -28,6 +28,7 @@ const EmptyState = React.forwardRef<HTMLDivElement, EmptyStateProps>(
28
28
  return (
29
29
  <div
30
30
  ref={ref}
31
+ data-slot="empty-state"
31
32
  className={cn(
32
33
  "flex flex-col items-center justify-center gap-3 py-12 text-muted-foreground",
33
34
  className,
@@ -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 ref={ref} className={cn("border-b", className)} {...props} />
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,
@@ -14,6 +14,7 @@ const Command = React.forwardRef<
14
14
  >(({ className, ...props }, ref) => (
15
15
  <CommandPrimitive
16
16
  ref={ref}
17
+ data-slot="command"
17
18
  className={cn(
18
19
  "flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground",
19
20
  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,
@@ -132,6 +132,7 @@ const PopoverContent = React.forwardRef<
132
132
  <PopoverPrimitive.Portal container={container ?? undefined}>
133
133
  <PopoverPrimitive.Content
134
134
  ref={ref}
135
+ data-slot="popover-content"
135
136
  align={align}
136
137
  sideOffset={sideOffset}
137
138
  className={cn(
@@ -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" &&
@@ -166,6 +166,7 @@ const SheetContent = React.forwardRef<
166
166
  <SheetOverlay />
167
167
  <SheetPrimitive.Content
168
168
  ref={ref}
169
+ data-slot="sheet-content"
169
170
  className={cn(sheetVariants({ side }), className)}
170
171
  {...props}
171
172
  >
@@ -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,
@@ -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
+ }