@adea-ai/ui 0.99.1 → 0.99.3
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/dist/components/layout/orbit-layout/orbit-layout.d.ts +5 -1
- package/dist/components/layout/orbit-layout/orbit-layout.d.ts.map +1 -1
- package/dist/components/layout/orbit-layout/orbit-layout.js.map +1 -1
- package/dist/components/layout/side-rail/side-rail.d.ts +4 -1
- package/dist/components/layout/side-rail/side-rail.d.ts.map +1 -1
- package/dist/components/layout/side-rail/side-rail.js +58 -64
- package/dist/components/layout/side-rail/side-rail.js.map +1 -1
- package/dist/components/layout/sidebar-nav/sidebar-nav.js +2 -2
- package/dist/components/layout/sidebar-nav/sidebar-nav.js.map +1 -1
- package/dist/components/motion/presence.d.ts +17 -7
- package/dist/components/motion/presence.d.ts.map +1 -1
- package/dist/components/motion/presence.js.map +1 -1
- package/dist/components/theme/theme-picker.d.ts.map +1 -1
- package/dist/components/theme/theme-picker.js +1 -1
- package/dist/components/theme/theme-picker.js.map +1 -1
- package/dist/components/theme/theme-provider.d.ts.map +1 -1
- package/dist/components/theme/theme-provider.js +15 -4
- package/dist/components/theme/theme-provider.js.map +1 -1
- package/dist/components/ui/aspect-ratio/aspect-ratio.d.ts +2 -2
- package/dist/components/ui/aspect-ratio/aspect-ratio.d.ts.map +1 -1
- package/dist/components/ui/aspect-ratio/aspect-ratio.js +15 -1
- package/dist/components/ui/aspect-ratio/aspect-ratio.js.map +1 -1
- package/dist/components/ui/badge/badge.d.ts +1 -1
- package/dist/components/ui/button/button.d.ts +1 -1
- package/dist/components/ui/calendar/calendar.d.ts.map +1 -1
- package/dist/components/ui/calendar/calendar.js +1 -1
- package/dist/components/ui/calendar/calendar.js.map +1 -1
- package/dist/components/ui/card/card.d.ts +2 -2
- package/dist/components/ui/card/card.js +2 -2
- package/dist/components/ui/card/card.js.map +1 -1
- package/dist/components/ui/chart/chart-options.d.ts +50 -0
- package/dist/components/ui/chart/chart-options.d.ts.map +1 -0
- package/dist/components/ui/chart/chart-options.js +178 -0
- package/dist/components/ui/chart/chart-options.js.map +1 -0
- package/dist/components/ui/chart/chart.d.ts +21 -18
- package/dist/components/ui/chart/chart.d.ts.map +1 -1
- package/dist/components/ui/chart/chart.js +175 -155
- package/dist/components/ui/chart/chart.js.map +1 -1
- package/dist/components/ui/chart/index.js +2 -1
- package/dist/components/ui/context-menu/context-menu.d.ts +8 -0
- package/dist/components/ui/context-menu/context-menu.d.ts.map +1 -1
- package/dist/components/ui/context-menu/context-menu.js +8 -0
- package/dist/components/ui/context-menu/context-menu.js.map +1 -1
- package/dist/components/ui/drawer/drawer.d.ts +8 -1
- package/dist/components/ui/drawer/drawer.d.ts.map +1 -1
- package/dist/components/ui/drawer/drawer.js.map +1 -1
- package/dist/components/ui/dropdown-menu/dropdown-menu.d.ts +8 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu.d.ts.map +1 -1
- package/dist/components/ui/dropdown-menu/dropdown-menu.js +8 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu.js.map +1 -1
- package/dist/components/ui/input-otp/input-otp.d.ts.map +1 -1
- package/dist/components/ui/input-otp/input-otp.js +2 -2
- package/dist/components/ui/input-otp/input-otp.js.map +1 -1
- package/dist/components/ui/menubar/menubar.d.ts +8 -0
- package/dist/components/ui/menubar/menubar.d.ts.map +1 -1
- package/dist/components/ui/menubar/menubar.js +8 -0
- package/dist/components/ui/menubar/menubar.js.map +1 -1
- package/dist/components/ui/navigation-menu/navigation-menu.d.ts +14 -2
- package/dist/components/ui/navigation-menu/navigation-menu.d.ts.map +1 -1
- package/dist/components/ui/navigation-menu/navigation-menu.js +28 -23
- package/dist/components/ui/navigation-menu/navigation-menu.js.map +1 -1
- package/dist/components/ui/pagination/pagination.d.ts.map +1 -1
- package/dist/components/ui/pagination/pagination.js +1 -1
- package/dist/components/ui/pagination/pagination.js.map +1 -1
- package/dist/components/ui/resizable/resizable.d.ts +0 -12
- package/dist/components/ui/resizable/resizable.d.ts.map +1 -1
- package/dist/components/ui/resizable/resizable.js +43 -9
- package/dist/components/ui/resizable/resizable.js.map +1 -1
- package/dist/components/ui/toast/toast.d.ts.map +1 -1
- package/dist/components/ui/toast/toast.js +19 -6
- package/dist/components/ui/toast/toast.js.map +1 -1
- package/dist/lib/cn-tables.generated.js +10 -10
- package/dist/lib/cn-tables.generated.js.map +1 -1
- package/dist/r/chart.json +5 -0
- package/dist/r/registry.json +5 -0
- package/dist/r/src/components/layout/orbit-layout/orbit-layout.tsx +5 -1
- package/dist/r/src/components/layout/side-rail/side-rail.tsx +29 -16
- package/dist/r/src/components/layout/sidebar-nav/sidebar-nav.tsx +2 -2
- package/dist/r/src/components/motion/presence.tsx +17 -7
- package/dist/r/src/components/theme/theme-picker.tsx +5 -1
- package/dist/r/src/components/theme/theme-provider.tsx +19 -9
- package/dist/r/src/components/ui/aspect-ratio/aspect-ratio.tsx +14 -3
- package/dist/r/src/components/ui/calendar/calendar.tsx +6 -1
- package/dist/r/src/components/ui/card/card.tsx +2 -2
- package/dist/r/src/components/ui/chart/chart-options.ts +196 -0
- package/dist/r/src/components/ui/chart/chart.tsx +149 -101
- package/dist/r/src/components/ui/context-menu/context-menu.tsx +8 -0
- package/dist/r/src/components/ui/drawer/drawer.tsx +8 -1
- package/dist/r/src/components/ui/dropdown-menu/dropdown-menu.tsx +8 -0
- package/dist/r/src/components/ui/input-otp/input-otp.tsx +14 -2
- package/dist/r/src/components/ui/menubar/menubar.tsx +8 -0
- package/dist/r/src/components/ui/navigation-menu/navigation-menu.tsx +42 -28
- package/dist/r/src/components/ui/pagination/pagination.tsx +8 -1
- package/dist/r/src/components/ui/resizable/resizable.tsx +46 -8
- package/dist/r/src/components/ui/toast/toast.tsx +21 -6
- package/dist/r/src/lib/cn-tables.generated.ts +10 -10
- package/dist/r/src/styles/base.css +4 -1
- package/dist/r/src/styles/theme.css +23 -43
- package/package.json +1 -1
- package/registry.json +5 -0
- package/src/components/layout/orbit-layout/orbit-layout.tsx +5 -1
- package/src/components/layout/side-rail/side-rail.tsx +29 -16
- package/src/components/layout/sidebar-nav/sidebar-nav.tsx +2 -2
- package/src/components/motion/presence.tsx +17 -7
- package/src/components/theme/theme-picker.tsx +5 -1
- package/src/components/theme/theme-provider.tsx +19 -9
- package/src/components/ui/aspect-ratio/aspect-ratio.tsx +14 -3
- package/src/components/ui/calendar/calendar.tsx +6 -1
- package/src/components/ui/card/card.tsx +2 -2
- package/src/components/ui/chart/chart-options.ts +196 -0
- package/src/components/ui/chart/chart.tsx +149 -101
- package/src/components/ui/context-menu/context-menu.tsx +8 -0
- package/src/components/ui/drawer/drawer.tsx +8 -1
- package/src/components/ui/dropdown-menu/dropdown-menu.tsx +8 -0
- package/src/components/ui/input-otp/input-otp.tsx +14 -2
- package/src/components/ui/menubar/menubar.tsx +8 -0
- package/src/components/ui/navigation-menu/navigation-menu.tsx +42 -28
- package/src/components/ui/pagination/pagination.tsx +8 -1
- package/src/components/ui/resizable/resizable.tsx +46 -8
- package/src/components/ui/toast/toast.tsx +21 -6
- package/src/lib/cn-tables.generated.ts +10 -10
- package/src/styles/base.css +4 -1
- package/src/styles/theme.css +23 -43
|
@@ -38,7 +38,17 @@ export function InputOtp(props: InputOtpProps) {
|
|
|
38
38
|
return (
|
|
39
39
|
<OtpField
|
|
40
40
|
maxLength={length()}
|
|
41
|
-
class={cn(
|
|
41
|
+
class={cn(
|
|
42
|
+
'flex items-center gap-2',
|
|
43
|
+
// corvu positions the field itself, but its hidden input is 40px wider
|
|
44
|
+
// than the field so a password manager's badge lands outside the boxes
|
|
45
|
+
// (`shiftPWManagers`). `clip-path` only hides that overhang; it still
|
|
46
|
+
// counts as overflow, and a full-width field scrolled the page sideways.
|
|
47
|
+
// `overflow-hidden` contains it, and `p-1` keeps the edge boxes' focus
|
|
48
|
+
// ring (`ring-3`) inside the clip.
|
|
49
|
+
'overflow-hidden p-1',
|
|
50
|
+
local.class
|
|
51
|
+
)}
|
|
42
52
|
{...rest}
|
|
43
53
|
children={(field) => (
|
|
44
54
|
<>
|
|
@@ -72,7 +82,9 @@ export function InputOtp(props: InputOtpProps) {
|
|
|
72
82
|
'data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50'
|
|
73
83
|
)}
|
|
74
84
|
data-active={field.activeSlots.includes(slot)}
|
|
75
|
-
data-disabled
|
|
85
|
+
// Present-or-absent, never `"false"`: `data-[disabled]`
|
|
86
|
+
// matches any value, so `disabled={false}` dimmed the boxes.
|
|
87
|
+
data-disabled={props.disabled ? '' : undefined}
|
|
76
88
|
>
|
|
77
89
|
{field.value[slot] ?? ''}
|
|
78
90
|
</span>
|
|
@@ -160,6 +160,14 @@ export function MenubarRadioItem(props: ComponentProps<typeof KobalteMenubar.Rad
|
|
|
160
160
|
)
|
|
161
161
|
}
|
|
162
162
|
|
|
163
|
+
/**
|
|
164
|
+
* The caption of a `MenubarGroup`, and that group's accessible name. It must be a
|
|
165
|
+
* child of the group it names: Kobalte reads the group from context, so a label
|
|
166
|
+
* placed directly in the content throws `useMenuGroupContext must be used within
|
|
167
|
+
* a Menu.Group` the moment the menu opens. For an ungrouped caption, wrap the
|
|
168
|
+
* label and its items in a group anyway — the grouping is what a screen reader
|
|
169
|
+
* announces.
|
|
170
|
+
*/
|
|
163
171
|
export function MenubarLabel(props: ComponentProps<typeof KobalteMenubar.GroupLabel>) {
|
|
164
172
|
const [local, rest] = splitProps(props, ['class'])
|
|
165
173
|
return <KobalteMenubar.GroupLabel class={cn(menuLabel, local.class)} {...rest} />
|
|
@@ -41,9 +41,15 @@ import { menuContentPadding, menuItem, overlayMotion, overlaySurface } from '#li
|
|
|
41
41
|
* - `Content` must be a direct child of `Menu`, and the `Viewport` is a **sibling
|
|
42
42
|
* of the menus** — not inside them. All the panels share one viewport, which is
|
|
43
43
|
* what lets the bar animate between them instead of each panel popping in place.
|
|
44
|
+
* - The viewport is an empty surface. Each `Content` reaches it through Kobalte's
|
|
45
|
+
* `Portal`, which mounts the panel inside the viewport while keeping it in its
|
|
46
|
+
* own `Menu`'s context. A `Content` rendered anywhere else — the viewport's own
|
|
47
|
+
* children included — has no `Menu` above it, and Kobalte throws
|
|
48
|
+
* `useMenuRootContext must be used within a MenuRoot` the moment a panel opens.
|
|
44
49
|
*
|
|
45
|
-
* The wrapper enforces the last
|
|
46
|
-
*
|
|
50
|
+
* The wrapper enforces the last two by rendering the `Viewport` itself and by
|
|
51
|
+
* portalling every `NavigationMenuContent`, so a caller cannot forget either and
|
|
52
|
+
* get a menu whose panels never appear.
|
|
47
53
|
*/
|
|
48
54
|
|
|
49
55
|
export type NavigationMenuProps = ComponentProps<typeof KobalteNavigationMenu.Root> & {
|
|
@@ -112,25 +118,41 @@ export function NavigationMenuContent(props: ComponentProps<typeof KobalteNaviga
|
|
|
112
118
|
const [local, rest] = splitProps(props, ['class', 'children'])
|
|
113
119
|
|
|
114
120
|
return (
|
|
115
|
-
<KobalteNavigationMenu.
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
121
|
+
<KobalteNavigationMenu.Portal>
|
|
122
|
+
<KobalteNavigationMenu.Content
|
|
123
|
+
class={cn(
|
|
124
|
+
// Absolute so the viewport sizes to the active panel's measured box and
|
|
125
|
+
// animates between panels, rather than stacking them.
|
|
126
|
+
'absolute top-0 left-0 grid w-max gap-1 p-2 outline-none',
|
|
127
|
+
// The motion is the panel's, not the viewport's. Kobalte keeps an
|
|
128
|
+
// outgoing panel mounted until the viewport's own animation ends; a
|
|
129
|
+
// viewport that carries an entrance animation never fires that again
|
|
130
|
+
// after it opens, so the previous panel would stay painted under the
|
|
131
|
+
// next one.
|
|
132
|
+
overlayMotion,
|
|
133
|
+
// A two-column panel is the shape most menu bars want, and it is opt-in
|
|
134
|
+
// through this hook rather than a prop because the column count is a
|
|
135
|
+
// layout decision the caller's content makes.
|
|
136
|
+
'data-[wide]:grid-cols-2',
|
|
137
|
+
local.class
|
|
138
|
+
)}
|
|
139
|
+
{...rest}
|
|
140
|
+
>
|
|
141
|
+
{local.children}
|
|
142
|
+
</KobalteNavigationMenu.Content>
|
|
143
|
+
</KobalteNavigationMenu.Portal>
|
|
128
144
|
)
|
|
129
145
|
}
|
|
130
146
|
|
|
131
147
|
/**
|
|
132
148
|
* The shared panel surface. One per menu bar, and the wrapper supplies it — but
|
|
133
149
|
* exported so a caller with an unusual layout can place it themselves.
|
|
150
|
+
*
|
|
151
|
+
* It renders no children: the panels arrive through each `NavigationMenuContent`'s
|
|
152
|
+
* portal. Kobalte positions it under the bar and publishes the active panel's size
|
|
153
|
+
* as `--kb-navigation-menu-viewport-*`, which the surface animates between.
|
|
154
|
+
* `box-content` keeps the border outside that measured size so a panel is never
|
|
155
|
+
* clipped by its own frame.
|
|
134
156
|
*/
|
|
135
157
|
export function NavigationMenuViewport(
|
|
136
158
|
props: ComponentProps<typeof KobalteNavigationMenu.Viewport>
|
|
@@ -139,24 +161,16 @@ export function NavigationMenuViewport(
|
|
|
139
161
|
|
|
140
162
|
return (
|
|
141
163
|
<KobalteNavigationMenu.Viewport
|
|
164
|
+
data-slot="navigation-menu-viewport"
|
|
142
165
|
class={cn(
|
|
143
|
-
|
|
166
|
+
overlaySurface,
|
|
167
|
+
'isolate z-(--z-menu) mt-1.5 box-content list-none overflow-hidden',
|
|
144
168
|
'h-(--kb-navigation-menu-viewport-height) w-(--kb-navigation-menu-viewport-width)',
|
|
145
|
-
'origin-
|
|
169
|
+
'origin-(--kb-menu-content-transform-origin) transition-[width,height] duration-200 ease-out',
|
|
146
170
|
local.class
|
|
147
171
|
)}
|
|
148
172
|
{...rest}
|
|
149
|
-
|
|
150
|
-
<div
|
|
151
|
-
class={cn(
|
|
152
|
-
overlaySurface,
|
|
153
|
-
overlayMotion,
|
|
154
|
-
'w-full rounded-lg border border-border bg-popover p-1 shadow-lg'
|
|
155
|
-
)}
|
|
156
|
-
>
|
|
157
|
-
<KobalteNavigationMenu.Content />
|
|
158
|
-
</div>
|
|
159
|
-
</KobalteNavigationMenu.Viewport>
|
|
173
|
+
/>
|
|
160
174
|
)
|
|
161
175
|
}
|
|
162
176
|
|
|
@@ -55,7 +55,14 @@ export function Pagination(props: PaginationProps) {
|
|
|
55
55
|
((itemProps) => <PaginationItem page={itemProps.page}>{itemProps.page}</PaginationItem>)
|
|
56
56
|
}
|
|
57
57
|
ellipsisComponent={local.ellipsisComponent ?? (() => <PaginationEllipsis />)}
|
|
58
|
-
|
|
58
|
+
// Kobalte renders the root as a `<nav>` wrapping a `<ul>`, and every control —
|
|
59
|
+
// previous, the page run, next — is an `<li>` inside that list. The row has to be
|
|
60
|
+
// declared on the list: on the `<nav>` alone it lays out one child and the
|
|
61
|
+
// controls stack vertically.
|
|
62
|
+
class={cn(
|
|
63
|
+
'flex w-full items-center justify-center [&>ul]:m-0 [&>ul]:flex [&>ul]:list-none [&>ul]:items-center [&>ul]:gap-1 [&>ul]:p-0',
|
|
64
|
+
local.class
|
|
65
|
+
)}
|
|
59
66
|
{...rest}
|
|
60
67
|
>
|
|
61
68
|
<Show when={local.children} fallback={<DefaultPaginationControls />}>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import Resizable from '@corvu/resizable'
|
|
2
2
|
import { GripVertical } from 'lucide-solid'
|
|
3
3
|
import type { ComponentProps } from 'solid-js'
|
|
4
|
-
import { splitProps } from 'solid-js'
|
|
4
|
+
import { createContext, splitProps, useContext } from 'solid-js'
|
|
5
5
|
import { cn } from '#lib/utils'
|
|
6
6
|
|
|
7
7
|
/**
|
|
@@ -16,20 +16,54 @@ import { cn } from '#lib/utils'
|
|
|
16
16
|
* is a real focusable element with an accessible role, so a split pane can be
|
|
17
17
|
* adjusted from the keyboard; a bare `cursor-col-resize` div cannot.
|
|
18
18
|
*/
|
|
19
|
+
/**
|
|
20
|
+
* Whether the group was given `initialSizes`. Those are corvu's to apply, and a
|
|
21
|
+
* panel's own `initialSize` overrides them — so an unsized panel must not invent
|
|
22
|
+
* one when the group already has an answer.
|
|
23
|
+
*/
|
|
24
|
+
const GroupSizesContext = createContext<() => boolean>(() => false)
|
|
25
|
+
|
|
19
26
|
export function ResizablePanelGroup(props: ComponentProps<typeof Resizable> & { class?: string }) {
|
|
20
27
|
const [local, rest] = splitProps(props, ['class'])
|
|
21
28
|
|
|
22
29
|
return (
|
|
23
|
-
<
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
30
|
+
<GroupSizesContext.Provider value={() => rest.initialSizes !== undefined}>
|
|
31
|
+
<Resizable
|
|
32
|
+
class={cn('flex size-full data-[orientation=vertical]:flex-col', local.class)}
|
|
33
|
+
{...rest}
|
|
34
|
+
/>
|
|
35
|
+
</GroupSizesContext.Provider>
|
|
27
36
|
)
|
|
28
37
|
}
|
|
29
38
|
|
|
39
|
+
/**
|
|
40
|
+
* The size an unsized panel registers with: whatever its earlier siblings left.
|
|
41
|
+
*
|
|
42
|
+
* corvu registers a panel without `initialSize` at a flat 50%, so `0.28` beside
|
|
43
|
+
* an unsized panel summed to 78% and left a gap. Panels register in document
|
|
44
|
+
* order, so at registration `sizes` holds exactly the panels before this one.
|
|
45
|
+
* When nothing is left — a second unsized panel — it takes an equal share, and
|
|
46
|
+
* corvu shrinks the earlier panels by that share to keep the total at 100%.
|
|
47
|
+
*/
|
|
48
|
+
function remainingSize(sizes: readonly number[]): number {
|
|
49
|
+
const left = 1 - sizes.reduce((total, size) => total + size, 0)
|
|
50
|
+
return left > 0.001 ? left : 1 / (sizes.length + 1)
|
|
51
|
+
}
|
|
52
|
+
|
|
30
53
|
export function ResizablePanel(props: ComponentProps<typeof Resizable.Panel> & { class?: string }) {
|
|
31
|
-
const [local, rest] = splitProps(props, ['class'])
|
|
32
|
-
|
|
54
|
+
const [local, rest] = splitProps(props, ['class', 'initialSize'])
|
|
55
|
+
const group = Resizable.useContext(rest.contextId)
|
|
56
|
+
const groupHasSizes = useContext(GroupSizesContext)
|
|
57
|
+
|
|
58
|
+
return (
|
|
59
|
+
<Resizable.Panel
|
|
60
|
+
initialSize={
|
|
61
|
+
local.initialSize ?? (groupHasSizes() ? undefined : remainingSize(group.sizes()))
|
|
62
|
+
}
|
|
63
|
+
class={cn('min-h-0 min-w-0 overflow-hidden', local.class)}
|
|
64
|
+
{...rest}
|
|
65
|
+
/>
|
|
66
|
+
)
|
|
33
67
|
}
|
|
34
68
|
|
|
35
69
|
export type ResizableHandleProps = ComponentProps<typeof Resizable.Handle> & {
|
|
@@ -46,11 +80,15 @@ export type ResizableHandleProps = ComponentProps<typeof Resizable.Handle> & {
|
|
|
46
80
|
|
|
47
81
|
export function ResizableHandle(props: ResizableHandleProps) {
|
|
48
82
|
const [local, rest] = splitProps(props, ['class', 'withHandle', 'label'])
|
|
83
|
+
const group = Resizable.useContext(rest.contextId)
|
|
49
84
|
|
|
50
85
|
return (
|
|
51
86
|
<Resizable.Handle
|
|
52
87
|
aria-label={local.label ?? 'Resize panels'}
|
|
53
|
-
|
|
88
|
+
// A separator's orientation is the line's own, which runs across the
|
|
89
|
+
// group: a row of panels is divided by a vertical line, a column by a
|
|
90
|
+
// horizontal one. corvu reports the group's orientation instead.
|
|
91
|
+
aria-orientation={group.orientation() === 'horizontal' ? 'vertical' : 'horizontal'}
|
|
54
92
|
class={cn(
|
|
55
93
|
'group/resize bg-border relative flex w-px shrink-0 items-center justify-center',
|
|
56
94
|
/* Widen the hit target without moving the visual line: the divider is
|
|
@@ -179,11 +179,23 @@ export type ToasterProps = ComponentProps<typeof KobalteToast.Region> & {
|
|
|
179
179
|
region?: string
|
|
180
180
|
}
|
|
181
181
|
|
|
182
|
+
/**
|
|
183
|
+
* The corner is set on the region, not the list. The region is the `fixed`
|
|
184
|
+
* element: an inset on the list inside it positions nothing, and the region falls
|
|
185
|
+
* back to wherever it happens to sit in the document flow.
|
|
186
|
+
*/
|
|
182
187
|
const toasterPosition = {
|
|
183
|
-
'top-left': 'top-0 left-0
|
|
184
|
-
'top-right': 'top-0 right-0
|
|
185
|
-
'bottom-left': 'bottom-0 left-0
|
|
186
|
-
'bottom-right': 'bottom-0 right-0
|
|
188
|
+
'top-left': 'top-0 left-0',
|
|
189
|
+
'top-right': 'top-0 right-0',
|
|
190
|
+
'bottom-left': 'bottom-0 left-0',
|
|
191
|
+
'bottom-right': 'bottom-0 right-0',
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
const toasterAlignment = {
|
|
195
|
+
'top-left': 'items-start',
|
|
196
|
+
'top-right': 'items-end',
|
|
197
|
+
'bottom-left': 'items-start',
|
|
198
|
+
'bottom-right': 'items-end',
|
|
187
199
|
}
|
|
188
200
|
|
|
189
201
|
/** Mount once, near the root. Renders the stack and owns its timing defaults. */
|
|
@@ -203,13 +215,16 @@ export function Toaster(props: ToasterProps) {
|
|
|
203
215
|
* in-flight notification, and clicking a toast must not dismiss the
|
|
204
216
|
* dialog behind it.
|
|
205
217
|
*/
|
|
206
|
-
class=
|
|
218
|
+
class={cn(
|
|
219
|
+
'pointer-events-none fixed z-(--z-toast) flex max-h-screen w-full flex-col gap-2 p-4 sm:max-w-sm',
|
|
220
|
+
toasterPosition[local.position ?? 'bottom-right']
|
|
221
|
+
)}
|
|
207
222
|
{...rest}
|
|
208
223
|
>
|
|
209
224
|
<KobalteToast.List
|
|
210
225
|
class={cn(
|
|
211
226
|
'flex flex-col gap-2',
|
|
212
|
-
|
|
227
|
+
toasterAlignment[local.position ?? 'bottom-right'],
|
|
213
228
|
local.class
|
|
214
229
|
)}
|
|
215
230
|
/>
|
|
@@ -54,7 +54,7 @@ const DZ = (s: string): Int32Array => {
|
|
|
54
54
|
}
|
|
55
55
|
return out
|
|
56
56
|
}
|
|
57
|
-
const GROUP_COUNT =
|
|
57
|
+
const GROUP_COUNT = 384
|
|
58
58
|
const customValidatorNames: string[] = []
|
|
59
59
|
const edgeStart = PS(U("E0500002005282000000002000150000020021820000011200000003022202000300004200120000200420001200021200301200010400162000010000220021010:2192001200220012000220012000200200200400010200040000000000400200108200110100000022010313000162002000020020012020080213000228200000000082000000000120002000120020020040101020300130001001010"))
|
|
60
60
|
const labelStart = PS(U(":11111111211111119311546544411119731869:671397415686432441111111111161114151214313433415:78311132233313187211117221449443411141111151152226611131111112212518142224214215421421542142424242516171151615616347111111111197911327451111111111111111111113134714133513411111311111111111111111111112444411111342312715245411117:3"))
|
|
@@ -91,7 +91,7 @@ const nodeVlist = (() => {
|
|
|
91
91
|
for (let i = 0; i < A.length; i++) out[A[i]!] = V[i]!
|
|
92
92
|
return out
|
|
93
93
|
})()
|
|
94
|
-
const SETS = "container |break-after- all auto avoid avoid-page column left page right|break-before- all auto avoid avoid-page column left page right|break-inside-a uto void void-column void-page|box-decoration- clone slice|box- border content| contents flow-root hidden table table-caption table-cell table-column table-column-group table-footer-group table-header-group table-row table-row-group| not-sr-only sr-only|float- end left none right start|clear- both end left none right start|isolat e ion-auto|overflow- auto clip hidden scroll visible|overflow-x- auto clip hidden scroll visible|overflow-y- auto clip hidden scroll visible|overscroll- auto contain none|overscroll-x- auto contain none|overscroll-y- auto contain none| absolute fixed relative static sticky| collapse invisible visible|justify- around baseline between center center-safe end end-safe evenly normal start stretch|justify-items- center center-safe end end-safe normal start stretch|justify-self- auto center center-safe end end-safe start stretch|items- baseline baseline-last center center-safe end end-safe start stretch|self- auto baseline baseline-last center center-safe end end-safe start stretch|place-content- around baseline between center center-safe end end-safe evenly start stretch|place-items- baseline center center-safe end end-safe start stretch|place-self- auto center center-safe end end-safe start stretch| antialiased subpixel-antialiased| italic not-italic|normal-nums |ordinal |slashed-zero | lining-nums oldstyle-nums| proportional-nums tabular-nums| diagonal-fractions stacked-fractions| no-underline overline| capitalize lowercase normal-case uppercase|truncate |whitespace- break-spaces normal nowrap pre pre-line pre-wrap|break- all keep normal words|wrap- anywhere break-word normal|hyphens- auto manual none|mix-blend- color color-burn color-dodge darken difference exclusion hard-light hue lighten luminosity multiply normal overlay plus-darker plus-lighter saturation screen soft-light|table- auto fixed|caption- bottom top|backface- hidden visible|appearance- auto none|scheme- dark light light-dark normal only-dark only-light|field-sizing- content fixed|pointer-events- auto none|resize -none -x -y|snap- align-none center end start|snap- always normal|snap- both none x y|snap- mandatory proximity|touch- auto manipulation none|touch-pan- left right x|touch-pan- down up y|touch-pinch-zoom |select- all auto none text|forced-color-adjust- auto none| normal size| baseline bottom middle sub super text-bottom text-top top| bounce none ping pulse spin| auto square video| auto fr max min px|none | auto full px| fixed local scroll|clip- border content padding text|origin- border content padding| bottom bottom-left bottom-right center left left-bottom left-top right right-bottom right-top top top-left top-right| no-repeat repeat repeat-round repeat-space repeat-x repeat-y| auto contain cover| gradient-to-b gradient-to-bl gradient-to-br gradient-to-l gradient-to-r gradient-to-t gradient-to-tl gradient-to-tr none|blend- color color-burn color-dodge darken difference exclusion hard-light hue lighten luminosity multiply normal overlay saturation screen soft-light|to- b bl br l r t tl tr| auto dvh fit full lh lvh max min px screen svh| dashed dotted double hidden none solid| collapse separate|px
|
|
94
|
+
const SETS = "container |break-after- all auto avoid avoid-page column left page right|break-before- all auto avoid avoid-page column left page right|break-inside-a uto void void-column void-page|box-decoration- clone slice|box- border content| contents flow-root hidden table table-caption table-cell table-column table-column-group table-footer-group table-header-group table-row table-row-group| not-sr-only sr-only|float- end left none right start|clear- both end left none right start|isolat e ion-auto|overflow- auto clip hidden scroll visible|overflow-x- auto clip hidden scroll visible|overflow-y- auto clip hidden scroll visible|overscroll- auto contain none|overscroll-x- auto contain none|overscroll-y- auto contain none| absolute fixed relative static sticky| collapse invisible visible|justify- around baseline between center center-safe end end-safe evenly normal start stretch|justify-items- center center-safe end end-safe normal start stretch|justify-self- auto center center-safe end end-safe start stretch|items- baseline baseline-last center center-safe end end-safe start stretch|self- auto baseline baseline-last center center-safe end end-safe start stretch|place-content- around baseline between center center-safe end end-safe evenly start stretch|place-items- baseline center center-safe end end-safe start stretch|place-self- auto center center-safe end end-safe start stretch| antialiased subpixel-antialiased| italic not-italic|normal-nums |ordinal |slashed-zero | lining-nums oldstyle-nums| proportional-nums tabular-nums| diagonal-fractions stacked-fractions| no-underline overline| capitalize lowercase normal-case uppercase|truncate |whitespace- break-spaces normal nowrap pre pre-line pre-wrap|break- all keep normal words|wrap- anywhere break-word normal|hyphens- auto manual none|mix-blend- color color-burn color-dodge darken difference exclusion hard-light hue lighten luminosity multiply normal overlay plus-darker plus-lighter saturation screen soft-light|table- auto fixed|caption- bottom top|backface- hidden visible|appearance- auto none|scheme- dark light light-dark normal only-dark only-light|field-sizing- content fixed|pointer-events- auto none|resize -none -x -y|snap- align-none center end start|snap- always normal|snap- both none x y|snap- mandatory proximity|touch- auto manipulation none|touch-pan- left right x|touch-pan- down up y|touch-pinch-zoom |select- all auto none text|forced-color-adjust- auto none| normal size| baseline bottom middle sub super text-bottom text-top top| bounce none ping pulse spin| auto square video| auto control-2xl control-2xs control-lg control-md control-sm control-xl control-xs fr max min px|none | auto control-2xl control-2xs control-lg control-md control-sm control-xl control-xs full px| fixed local scroll|clip- border content padding text|origin- border content padding| bottom bottom-left bottom-right center left left-bottom left-top right right-bottom right-top top top-left top-right| no-repeat repeat repeat-round repeat-space repeat-x repeat-y| auto contain cover| gradient-to-b gradient-to-bl gradient-to-br gradient-to-l gradient-to-r gradient-to-t gradient-to-tl gradient-to-tr none|blend- color color-burn color-dodge darken difference exclusion hard-light hue lighten luminosity multiply normal overlay saturation screen soft-light|to- b bl br l r t tl tr| auto control-2xl control-2xs control-lg control-md control-sm control-xl control-xs dvh fit full lh lvh max min px screen svh| dashed dotted double hidden none solid| collapse separate| control-2xl control-2xs control-lg control-md control-sm control-xl control-xs px|auto |full | content none strict| inline-size size|layout |paint |style | around baseline between center center-safe end end-safe evenly normal start stretch| alias all-scroll auto cell col-resize context-menu copy crosshair default e-resize ew-resize grab grabbing help move n-resize ne-resize nesw-resize no-drop none not-allowed ns-resize nw-resize nwse-resize pointer progress row-resize s-resize se-resize sw-resize text vertical-text w-resize wait zoom-in zoom-out| dashed dotted double solid wavy| auto from-font|reverse |initial | in in-out initial linear out| col col-reverse row row-reverse| nowrap wrap wrap-reverse| auto initial none| black bold extrabold extralight light medium normal semibold thin| condensed expanded extra-condensed extra-expanded normal semi-condensed semi-expanded ultra-condensed ultra-expanded|flow- col col-dense dense row row-dense| none subgrid| auto control-2xl control-2xs control-lg control-md control-sm control-xl control-xs dvh dvw fit full lh lvh lvw max min px rail-item row-lg row-md row-sm screen statusbar svh svw topbar| block flex grid table| auto control-2xl control-2xs control-lg control-md control-sm control-xl control-xs dvw fit full lvw max min px screen svw| control-2xl control-2xs control-lg control-md control-sm control-xl control-xs loose none normal px relaxed snug tight|through |item | inside outside| decimal disc none| auto control-2xl control-2xs control-lg control-md control-sm control-xl control-xs px| clip-border clip-content clip-fill clip-padding clip-stroke clip-view no-clip| add exclude intersect subtract| alpha luminance match|origin- border content fill padding stroke view|type- alpha luminance| circle ellipse| closest-corner closest-side farthest-corner farthest-side|at- bottom bottom-left bottom-right center left left-bottom left-top right right-bottom right-top top top-left top-right| control-2xl control-2xs control-lg control-md control-sm control-xl control-xs dvh fit full lh lvh max min none px screen svh| auto control-2xl control-2xs control-lg control-md control-sm control-xl control-xs dvh dvw fit full lh lvh lvw max min none px rail-item row-lg row-md row-sm screen statusbar svh svw topbar| control-2xl control-2xs control-lg control-md control-sm control-xl control-xs dvw fit full lvw max min none px screen svw| auto control-2xl control-2xs control-lg control-md control-sm control-xl control-xs dvh dvw fit full lvh lvw max min none prose px rail rail-expanded sidebar sidebar-compact svh svw| auto control-2xl control-2xs control-lg control-md control-sm control-xl control-xs dvh dvw fit full lvh lvw max min none px rail rail-expanded screen sidebar sidebar-compact svh svw| contain cover fill none scale-down| first last none| distant dramatic midrange near none normal|inset | full none|3d | auto smooth|gutter- auto both stable| auto none thin| inner none| auto control-2xl control-2xs control-lg control-md control-sm control-xl control-xs dvh dvw fit full lvh lvw max min px rail-item svh svw|base | center end justify left right start| clip ellipsis| balance nowrap pretty wrap| normal tight tighter wide wider widest| cpu gpu none| 3d flat| all colors none opacity shadow transform| discrete normal| control-2xl control-2xs control-lg control-md control-sm control-xl control-xs full px| auto control-2xl control-2xs control-lg control-md control-sm control-xl control-xs dvh dvw fit full lvh lvw max min px rail rail-expanded screen sidebar sidebar-compact svh svw| auto contents scroll transform".split('|').map((s) => {
|
|
95
95
|
const tails = s.split(' ')
|
|
96
96
|
const prefix = tails.shift()!
|
|
97
97
|
for (let i = 0; i < tails.length; i++) {
|
|
@@ -99,12 +99,12 @@ const SETS = "container |break-after- all auto avoid avoid-page column left page
|
|
|
99
99
|
}
|
|
100
100
|
return tails
|
|
101
101
|
})
|
|
102
|
-
const AA = DZ("0000000000000000000000000000000000000000000000000000000000000262242:6@200000006:240B428:
|
|
103
|
-
const AG = DZ("ɠ222222222222222222222222222222222222222222222222222222222222˕4222226>ʶ22ʷʺʷ2ʸʷ42ʴ2ʓ22>621422ɶ222ɹɼɷɺɷɺ22ɱ42222ɨ2ɧ26622ɘɓ
|
|
104
|
-
const AS = DZ("02222222222222222222222222222222222222222222222222222222222222222202022222222222EH2200IL021042222Y\\
|
|
105
|
-
const litAnchor = new Int32Array(
|
|
106
|
-
const litGroup = new Int32Array(
|
|
107
|
-
const litPool = new Int32Array(
|
|
102
|
+
const AA = DZ("0000000000000000000000000000000000000000000000000000000000000262242:6@200000006:240B428:4422400002046044222426220026642642462026224222824220022400000000\\00N222422242222222224062242222222422226264222422222222222222442804222422222222222222222222220<4<0204260002444020204224422")
|
|
103
|
+
const AG = DZ("ɠ222222222222222222222222222222222222222222222222222222222222˕4222226>ʶ22ʷʺʷ2ʸʷ42ʴ2ʓ22>621422ɶ222ɹɼɷɺɷɺ22ɱ42222ɨ2ɧ26622ɘɓ244ƸƵ222]d24242ǖǓƚÄȫ2263ȨȥȨ2222222ǣ222222222222222222ǂƽ2ƾƵ2222222422222ƜƑ22222222222222222222144Ŧţ22Ţş222222222222222222222ĸ2ı68ĦģĦɡŰ4Ġ«®ĝ822ĔđĔ2ē2222622")
|
|
104
|
+
const AS = DZ("02222222222222222222222222222222222222222222222222222222222222222202022222222222EH2200IL021042222Y\\222IL0cf2e10j2222U00X202[^2y0000120|{~22
:22|22222222222G000qOVI00000}2>40000B00000I¨©000¬00000000000000021M®00°000000000000000000000222HGHa1º222¿2À2222ÉÌ000°2±")
|
|
105
|
+
const litAnchor = new Int32Array(1635)
|
|
106
|
+
const litGroup = new Int32Array(1635)
|
|
107
|
+
const litPool = new Int32Array(1635)
|
|
108
108
|
let poolText = ''
|
|
109
109
|
const poolOffsets = new Int32Array(1072)
|
|
110
110
|
{
|
|
@@ -129,9 +129,9 @@ const poolOffsets = new Int32Array(1072)
|
|
|
129
129
|
}
|
|
130
130
|
}
|
|
131
131
|
// conflict adjacency (engine builds claim bitmask CSR at init)
|
|
132
|
-
const adjGid = DZ("0b2N:222@R>F@286¦2@H2D266226FB22B2>BD\\
|
|
132
|
+
const adjGid = DZ("0b2N:222@R>F@286¦2@H2D266226FB22B2>BD\\6N22222Z222D222p")
|
|
133
133
|
const adjStart = PS(U("1::24444432:442:44:44>222222:44:4421322511111311111114"))
|
|
134
|
-
const adjTgt = DZ("24A;33N=C@H4A;33N=C@<27;83:;8393NQ:3NQʰ222ˉºŴŽ2R2=18cƴÅŇ=cĞÛC1ƈǝȈ:ħ25=11D3A@4=<1;1DEr25;11B3?<6;:371BCn9@7=<8192>2E121@9@EHE@9>2T25511<398454131<=V25511<398454131<=ƧNž2
|
|
134
|
+
const adjTgt = DZ("24A;33N=C@H4A;33N=C@<27;83:;8393NQ:3NQʰ222ˉºŴŽ2R2=18cƴÅŇ=cĞÛC1ƈǝȈ:ħ25=11D3A@4=<1;1DEr25;11B3?<6;:371BCn9@7=<8192>2E121@9@EHE@9>2T25511<398454131<=V25511<398454131<=ƧNž2Đå242L222290000f22500ɛ000ǘ222")
|
|
135
135
|
const patGid = U("ij")
|
|
136
136
|
const patTgt = U("")
|
|
137
137
|
const postfixLookupGroups = U("1")
|
package/src/styles/base.css
CHANGED
|
@@ -59,8 +59,11 @@
|
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
+
/* Presence, like the variants above: corvu and Kobalte mark a selected item
|
|
63
|
+
with an empty attribute (`data-selected=""`), while cmdk writes `"true"` and
|
|
64
|
+
`"false"`. Matching only `'true'` left every corvu calendar day unfilled. */
|
|
62
65
|
@custom-variant data-selected {
|
|
63
|
-
&:where([data-selected='
|
|
66
|
+
&:where([data-selected]:not([data-selected='false'])) {
|
|
64
67
|
@slot;
|
|
65
68
|
}
|
|
66
69
|
}
|
package/src/styles/theme.css
CHANGED
|
@@ -16,9 +16,10 @@
|
|
|
16
16
|
* lightness step reads as the same step in every hue and a re-hue does not
|
|
17
17
|
* need its ramp re-derived by eye.
|
|
18
18
|
* - **`@adea-ai/themes` supplies the values.** The two default themes are composed
|
|
19
|
-
* there from upstream palettes —
|
|
20
|
-
*
|
|
21
|
-
*
|
|
19
|
+
* there from upstream palettes — GitHub Dark Default's canvas and greyscale,
|
|
20
|
+
* re-greyed to violet, for Adea Dark; GitHub Light Default's white canvas for Adea
|
|
21
|
+
* Light; and GitHub's dark hues for both — and normalized against measured
|
|
22
|
+
* contrast floors. The colour declarations in sections 1 and 2
|
|
22
23
|
* are *generated* from that catalogue (`bun run theme:build`) rather than written
|
|
23
24
|
* here; everything else in this file is this system's own.
|
|
24
25
|
*
|
|
@@ -41,11 +42,11 @@
|
|
|
41
42
|
* ========================================================================== */
|
|
42
43
|
|
|
43
44
|
/* ---------------------------------------------------------------------------
|
|
44
|
-
* 1. Colour — light theme (the
|
|
45
|
+
* 1. Colour — light theme (the `:root` fallback; Storybook opens dark)
|
|
45
46
|
*
|
|
46
|
-
* Contrast: body text 8
|
|
47
|
-
*
|
|
48
|
-
*
|
|
47
|
+
* Contrast: body text 15.8:1 on the canvas and 14.3:1 on a card, `--muted-foreground`
|
|
48
|
+
* 6.2:1 on the canvas and 5.6:1 on a card and the sidebar, `--primary-foreground` on
|
|
49
|
+
* `--primary` 6.1:1. Measured rather than estimated; `tests/tokens.test.ts` asserts each pairing.
|
|
49
50
|
* ------------------------------------------------------------------------- */
|
|
50
51
|
:root {
|
|
51
52
|
/* @generated theme:root — run `bun run theme:build` after changing the catalogue */
|
|
@@ -176,13 +177,15 @@
|
|
|
176
177
|
/* ---------------------------------------------------------------------------
|
|
177
178
|
* 2. Colour — dark theme
|
|
178
179
|
*
|
|
179
|
-
*
|
|
180
|
-
*
|
|
181
|
-
*
|
|
182
|
-
* system's
|
|
180
|
+
* A near-black violet-grey canvas — GitHub Dark Default's greyscale with its chroma
|
|
181
|
+
* halved and its hue turned from blue to violet — and a bright violet primary that
|
|
182
|
+
* carries a near-black label. The tint is what pairs it with the light theme's
|
|
183
|
+
* violet; it is deliberately not the blue-tinted dark of the donor this system's
|
|
184
|
+
* structure came from.
|
|
183
185
|
*
|
|
184
|
-
* Contrast: body text
|
|
185
|
-
*
|
|
186
|
+
* Contrast: body text 16.0:1 on the canvas and 14.9:1 on a card,
|
|
187
|
+
* `--muted-foreground` 7.0:1 on the canvas and 6.5:1 on a card and the sidebar,
|
|
188
|
+
* `--primary-foreground` on `--primary` 7.5:1.
|
|
186
189
|
* ------------------------------------------------------------------------- */
|
|
187
190
|
.dark {
|
|
188
191
|
/* @generated theme:dark — run `bun run theme:build` after changing the catalogue */
|
|
@@ -304,7 +307,7 @@
|
|
|
304
307
|
/* ---------------------------------------------------------------------------
|
|
305
308
|
* 3. The accent axis
|
|
306
309
|
*
|
|
307
|
-
* adea's six
|
|
310
|
+
* adea's six accent presets, as a selection rather than a constant. `data-accent` sits on
|
|
308
311
|
* the same element as `dark` — in both applications that is `<html>` — and each
|
|
309
312
|
* block overrides the roles an accent owns: the interactive primary, its label,
|
|
310
313
|
* its hover rung, its tint and the focus ring.
|
|
@@ -319,7 +322,7 @@
|
|
|
319
322
|
* for exactly this reason: a bright violet in dark mode carries a black
|
|
320
323
|
* label, and the same accent's deep light-mode form carries a white one.
|
|
321
324
|
*
|
|
322
|
-
* `theme` (the default) is the
|
|
325
|
+
* `theme` (the default) is the theme's own primary above and needs no block.
|
|
323
326
|
* ------------------------------------------------------------------------- */
|
|
324
327
|
|
|
325
328
|
/* @generated accents — run `bun run theme:build` after changing the catalogue */
|
|
@@ -490,23 +493,6 @@
|
|
|
490
493
|
--ui-word-spacing: -2.5px;
|
|
491
494
|
}
|
|
492
495
|
|
|
493
|
-
/* The default, and it has to be declared *above* the blocks above.
|
|
494
|
-
*
|
|
495
|
-
* `:root` and `[data-font='…']` have the same specificity, so the later one wins
|
|
496
|
-
* outright. With the default written after them — which is where it naturally
|
|
497
|
-
* belongs, next to the stacks it references — every `[data-font]` block was
|
|
498
|
-
* dead: all five typefaces resolved to Space Grotesk while the toolbar reported a
|
|
499
|
-
* different selection.
|
|
500
|
-
*
|
|
501
|
-
* The references resolve fine from here even though `--font-family-*` is declared
|
|
502
|
-
* further down, because a custom property is resolved where it is used rather than
|
|
503
|
-
* where it is declared. The ordering that matters is between two declarations of
|
|
504
|
-
* the *same* property, and there is only one of those below.
|
|
505
|
-
*
|
|
506
|
-
* `tests/appearance-axes.test.ts` asserts this order, because "the block is above
|
|
507
|
-
* the default" is invisible to review and to every behavioural test.
|
|
508
|
-
*/
|
|
509
|
-
|
|
510
496
|
/* ---------------------------------------------------------------------------
|
|
511
497
|
* 4. Non-colour scales
|
|
512
498
|
*
|
|
@@ -596,12 +582,6 @@
|
|
|
596
582
|
--row-height-md: 2rem;
|
|
597
583
|
--row-height-lg: 2.25rem;
|
|
598
584
|
|
|
599
|
-
/* Space Grotesk is the default because it is the face the visual language was
|
|
600
|
-
drawn against: the donor this system's structure comes from sets it, and its
|
|
601
|
-
slightly narrow, geometric forms are part of the look. The *selection* that
|
|
602
|
-
picks between it and the other four is the `:root` block above, which has to
|
|
603
|
-
precede every `[data-font]` block for the reason given there. */
|
|
604
|
-
|
|
605
585
|
/* Shell geometry. One place to change how wide a rail or sidebar is, so the two
|
|
606
586
|
consumer apps cannot disagree. 56px keeps the icon column to its content:
|
|
607
587
|
20px glyphs centred in a 36px row need less chrome than the 74px the donor's
|
|
@@ -621,9 +601,9 @@
|
|
|
621
601
|
--tooltip-max-width: min(16rem, calc(100vw - 1.5rem));
|
|
622
602
|
|
|
623
603
|
/* Shadows. Two parts on purpose: a tinted spread that reads as elevation, plus a
|
|
624
|
-
hairline that keeps an edge visible when the surface behind a panel is
|
|
625
|
-
same colour as the panel — which is the light theme, where `--card`
|
|
626
|
-
|
|
604
|
+
hairline that keeps an edge visible when the surface behind a panel is
|
|
605
|
+
nearly the same colour as the panel — which is the light theme, where `--card`
|
|
606
|
+
is one faint step off a white `--background`. */
|
|
627
607
|
--shadow-2xs: 0 1px 2px 0 oklch(0 0 0 / 0.05);
|
|
628
608
|
--shadow-xs: 0 1px 2px 0 oklch(0 0 0 / 0.06);
|
|
629
609
|
--shadow-sm: 0 1px 2px oklch(0 0 0 / 0.06), 0 0 0 1px oklch(0 0 0 / 0.04);
|
|
@@ -631,8 +611,8 @@
|
|
|
631
611
|
--shadow-lg: 0 12px 28px oklch(0 0 0 / 0.12);
|
|
632
612
|
--shadow-xl: 0 20px 44px oklch(0 0 0 / 0.16);
|
|
633
613
|
|
|
634
|
-
/* Motion.
|
|
635
|
-
already watching, `normal` for an entrance. The easing is KiroCrew's entrance
|
|
614
|
+
/* Motion. Three durations cover the system: `fast` for a state change the user is
|
|
615
|
+
already watching, `normal` for an entrance, `slow` for a layout settle. The easing is KiroCrew's entrance
|
|
636
616
|
curve — a fast start and a long settle, which reads as decisive rather than
|
|
637
617
|
floaty. */
|
|
638
618
|
--duration-fast: 120ms;
|