@adea-ai/ui 0.106.2 → 0.107.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/dist/components/composites/appearance-editor/appearance-editor.d.ts +9 -3
- package/dist/components/composites/appearance-editor/appearance-editor.d.ts.map +1 -1
- package/dist/components/composites/appearance-editor/appearance-editor.js +61 -29
- package/dist/components/composites/appearance-editor/appearance-editor.js.map +1 -1
- package/dist/components/composites/appearance-editor/appearance-types.d.ts +2 -0
- package/dist/components/composites/appearance-editor/appearance-types.d.ts.map +1 -1
- package/dist/components/composites/appearance-editor/index.d.ts +1 -1
- package/dist/components/composites/appearance-editor/index.d.ts.map +1 -1
- package/dist/components/composites/appearance-editor/index.js +2 -2
- package/dist/components/ui/badge/badge.d.ts.map +1 -1
- package/dist/components/ui/badge/badge.js +9 -5
- package/dist/components/ui/badge/badge.js.map +1 -1
- package/dist/components/ui/combobox/combobox.d.ts.map +1 -1
- package/dist/components/ui/combobox/combobox.js +2 -2
- package/dist/components/ui/combobox/combobox.js.map +1 -1
- package/dist/components/ui/context-menu/context-menu.d.ts.map +1 -1
- package/dist/components/ui/context-menu/context-menu.js +3 -3
- package/dist/components/ui/context-menu/context-menu.js.map +1 -1
- package/dist/components/ui/dropdown-menu/dropdown-menu.d.ts.map +1 -1
- package/dist/components/ui/dropdown-menu/dropdown-menu.js +7 -4
- package/dist/components/ui/dropdown-menu/dropdown-menu.js.map +1 -1
- package/dist/components/ui/menubar/menubar.d.ts.map +1 -1
- package/dist/components/ui/menubar/menubar.js +3 -3
- package/dist/components/ui/menubar/menubar.js.map +1 -1
- package/dist/components/ui/popover/popover.d.ts.map +1 -1
- package/dist/components/ui/popover/popover.js +2 -2
- package/dist/components/ui/popover/popover.js.map +1 -1
- package/dist/components/ui/select/select.d.ts.map +1 -1
- package/dist/components/ui/select/select.js +2 -2
- package/dist/components/ui/select/select.js.map +1 -1
- package/dist/components/ui/sheet/sheet.d.ts +16 -0
- package/dist/components/ui/sheet/sheet.d.ts.map +1 -1
- package/dist/components/ui/sheet/sheet.js +82 -16
- package/dist/components/ui/sheet/sheet.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/lib/overlay.d.ts +15 -0
- package/dist/lib/overlay.d.ts.map +1 -1
- package/dist/lib/overlay.js +14 -1
- package/dist/lib/overlay.js.map +1 -1
- package/dist/r/appearance-editor.json +1 -1
- package/dist/r/registry.json +1 -1
- package/dist/r/src/components/composites/appearance-editor/appearance-editor.tsx +55 -33
- package/dist/r/src/components/composites/appearance-editor/appearance-types.ts +2 -0
- package/dist/r/src/components/composites/appearance-editor/index.ts +1 -1
- package/dist/r/src/components/ui/badge/badge.tsx +9 -5
- package/dist/r/src/components/ui/combobox/combobox.tsx +2 -1
- package/dist/r/src/components/ui/context-menu/context-menu.tsx +3 -0
- package/dist/r/src/components/ui/dropdown-menu/dropdown-menu.tsx +9 -0
- package/dist/r/src/components/ui/menubar/menubar.tsx +3 -0
- package/dist/r/src/components/ui/popover/popover.tsx +8 -1
- package/dist/r/src/components/ui/select/select.tsx +2 -1
- package/dist/r/src/components/ui/sheet/sheet.tsx +78 -15
- package/dist/r/src/lib/overlay.ts +14 -0
- package/dist/r/src/styles/base.css +13 -0
- package/package.json +1 -1
- package/registry.json +1 -1
- package/src/components/composites/appearance-editor/appearance-editor.tsx +55 -33
- package/src/components/composites/appearance-editor/appearance-types.ts +2 -0
- package/src/components/composites/appearance-editor/index.ts +1 -1
- package/src/components/ui/badge/badge.tsx +9 -5
- package/src/components/ui/combobox/combobox.tsx +2 -1
- package/src/components/ui/context-menu/context-menu.tsx +3 -0
- package/src/components/ui/dropdown-menu/dropdown-menu.tsx +9 -0
- package/src/components/ui/menubar/menubar.tsx +3 -0
- package/src/components/ui/popover/popover.tsx +8 -1
- package/src/components/ui/select/select.tsx +2 -1
- package/src/components/ui/sheet/sheet.tsx +78 -15
- package/src/lib/overlay.ts +14 -0
- package/src/styles/base.css +13 -0
|
@@ -24,31 +24,79 @@ import { headingVariants } from '../typography'
|
|
|
24
24
|
* `end`, and a full-width row for `top` and `bottom`. The slide-in direction
|
|
25
25
|
* follows from the side, so a caller never pairs them by hand.
|
|
26
26
|
*
|
|
27
|
+
* `variant` decides how it meets that edge. `inset` — the default for `end` —
|
|
28
|
+
* docks the panel inside the main view: below the top bar, one equal gap from
|
|
29
|
+
* the top bar, the end edge and the bottom, with no scrim, so the work it edits
|
|
30
|
+
* stays visible and the top bar stays reachable. It is the shape for editing one
|
|
31
|
+
* thing beside its context (appearance settings, a task, a record). `edge` runs
|
|
32
|
+
* edge to edge over a scrim — the shape of a navigation drawer, and the default
|
|
33
|
+
* for every other side.
|
|
34
|
+
*
|
|
35
|
+
* Its parts read alike everywhere: `SheetHeader` holds a heading, a description
|
|
36
|
+
* and a full-width rule beneath, with the close button in the corner;
|
|
37
|
+
* `SheetBody` scrolls on its own; `SheetFooter` is a full-width tinted band that
|
|
38
|
+
* holds the decision.
|
|
39
|
+
*
|
|
27
40
|
* Controlled sheets opened from outside a `SheetTrigger` restore focus to the
|
|
28
41
|
* element focused before opening. Pass `restoreFocusRef` when a stable external
|
|
29
42
|
* opener must be used instead, such as when another layer closes before the
|
|
30
43
|
* sheet opens.
|
|
31
44
|
*/
|
|
45
|
+
// `overflow-clip`, not `overflow-hidden`: a hidden overflow can still be
|
|
46
|
+
// scrolled programmatically (focus, scrollIntoView, scrollTop), which slid the
|
|
47
|
+
// pinned footer out of view. Only SheetBody scrolls.
|
|
32
48
|
const sheetVariants = cva(
|
|
33
|
-
'bg-popover text-popover-foreground fixed z-(--z-dialog) flex flex-col
|
|
49
|
+
'bg-popover text-popover-foreground fixed z-(--z-dialog) flex flex-col overflow-clip border-border shadow-lg',
|
|
34
50
|
{
|
|
35
51
|
variants: {
|
|
36
52
|
side: {
|
|
37
|
-
top: '
|
|
38
|
-
bottom:
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
53
|
+
top: 'data-expanded:slide-in-from-top data-closed:slide-out-to-top',
|
|
54
|
+
bottom: 'data-expanded:slide-in-from-bottom data-closed:slide-out-to-bottom',
|
|
55
|
+
start: 'data-expanded:slide-in-from-left data-closed:slide-out-to-left',
|
|
56
|
+
end: 'data-expanded:slide-in-from-right data-closed:slide-out-to-right',
|
|
57
|
+
},
|
|
58
|
+
variant: {
|
|
59
|
+
edge: '',
|
|
60
|
+
inset: 'panel-dialog-inset w-lg rounded-xl border',
|
|
43
61
|
},
|
|
44
62
|
},
|
|
45
|
-
|
|
63
|
+
compoundVariants: [
|
|
64
|
+
{
|
|
65
|
+
side: 'top',
|
|
66
|
+
variant: 'edge',
|
|
67
|
+
class: 'inset-x-0 top-0 h-auto max-h-[85vh] rounded-b-xl border-b',
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
side: 'bottom',
|
|
71
|
+
variant: 'edge',
|
|
72
|
+
class: 'inset-x-0 bottom-0 h-auto max-h-[85vh] rounded-t-xl border-t',
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
side: 'start',
|
|
76
|
+
variant: 'edge',
|
|
77
|
+
class: 'inset-y-0 start-0 h-full w-80 max-w-[85vw] rounded-e-xl border-e',
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
side: 'end',
|
|
81
|
+
variant: 'edge',
|
|
82
|
+
class: 'inset-y-0 end-0 h-full w-80 max-w-[85vw] rounded-s-xl border-s',
|
|
83
|
+
},
|
|
84
|
+
],
|
|
85
|
+
defaultVariants: { side: 'end', variant: 'edge' },
|
|
46
86
|
}
|
|
47
87
|
)
|
|
48
88
|
|
|
89
|
+
/** `inset` for the end edge, `edge` for every other side, unless the caller says. */
|
|
90
|
+
const sheetVariantFor = (
|
|
91
|
+
side: SheetContentProps['side'],
|
|
92
|
+
variant: SheetContentProps['variant']
|
|
93
|
+
): 'edge' | 'inset' => variant ?? ((side ?? 'end') === 'end' ? 'inset' : 'edge')
|
|
94
|
+
|
|
49
95
|
export type SheetContentProps = ComponentProps<typeof KobalteDialogContent> &
|
|
50
96
|
VariantProps<typeof sheetVariants> & {
|
|
51
97
|
closeButton?: JSX.Element | false
|
|
98
|
+
/** The close button's accessible name. Defaults to "Close". */
|
|
99
|
+
closeLabel?: string
|
|
52
100
|
/** Supplies the stable external element to focus when the controlled sheet closes. */
|
|
53
101
|
restoreFocusRef?: Accessor<HTMLElement | undefined>
|
|
54
102
|
}
|
|
@@ -57,8 +105,10 @@ export function SheetContent(props: SheetContentProps) {
|
|
|
57
105
|
const [local, rest] = splitProps(props, [
|
|
58
106
|
'class',
|
|
59
107
|
'side',
|
|
108
|
+
'variant',
|
|
60
109
|
'children',
|
|
61
110
|
'closeButton',
|
|
111
|
+
'closeLabel',
|
|
62
112
|
'restoreFocusRef',
|
|
63
113
|
'onOpenAutoFocus',
|
|
64
114
|
'onCloseAutoFocus',
|
|
@@ -71,12 +121,19 @@ export function SheetContent(props: SheetContentProps) {
|
|
|
71
121
|
onCloseAutoFocus: local.onCloseAutoFocus,
|
|
72
122
|
})
|
|
73
123
|
|
|
124
|
+
const variant = () => sheetVariantFor(local.side, local.variant)
|
|
125
|
+
|
|
74
126
|
return (
|
|
75
127
|
<KobalteDialog.Portal>
|
|
76
|
-
|
|
128
|
+
{/* An inset panel is beside the work, so the work stays in view: no scrim.
|
|
129
|
+
It is still modal — focus stays inside and an outside click dismisses. */}
|
|
130
|
+
<Show when={variant() === 'edge'}>
|
|
131
|
+
<DialogOverlay />
|
|
132
|
+
</Show>
|
|
77
133
|
<KobalteDialogContent
|
|
134
|
+
data-variant={variant()}
|
|
78
135
|
class={cn(
|
|
79
|
-
sheetVariants({ side: local.side }),
|
|
136
|
+
sheetVariants({ side: local.side, variant: variant() }),
|
|
80
137
|
'data-expanded:animate-in data-expanded:fade-in-0 data-expanded:duration-200',
|
|
81
138
|
'data-closed:animate-out data-closed:fade-out-0 data-closed:duration-150',
|
|
82
139
|
local.class
|
|
@@ -92,7 +149,7 @@ export function SheetContent(props: SheetContentProps) {
|
|
|
92
149
|
WebKit walks only explicit tabindex and form controls) would skip
|
|
93
150
|
an implicitly-tabbable button and jump past the sheet's end. */}
|
|
94
151
|
<KobalteDialog.CloseButton
|
|
95
|
-
aria-label=
|
|
152
|
+
aria-label={local.closeLabel ?? 'Close'}
|
|
96
153
|
tabindex="0"
|
|
97
154
|
class="absolute top-3.5 end-3.5 rounded-md p-1 text-muted-foreground transition-colors ease-out outline-none hover:bg-surface-hover hover:text-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-primary-subtle"
|
|
98
155
|
>
|
|
@@ -122,7 +179,10 @@ export function SheetHeader(props: ComponentProps<'div'>) {
|
|
|
122
179
|
return (
|
|
123
180
|
<div
|
|
124
181
|
data-slot="sheet-header"
|
|
125
|
-
class={cn(
|
|
182
|
+
class={cn(
|
|
183
|
+
'flex shrink-0 flex-col gap-1.5 border-b border-border p-4 pe-12 text-start',
|
|
184
|
+
local.class
|
|
185
|
+
)}
|
|
126
186
|
{...rest}
|
|
127
187
|
/>
|
|
128
188
|
)
|
|
@@ -133,7 +193,7 @@ export function SheetBody(props: ComponentProps<'div'>) {
|
|
|
133
193
|
return (
|
|
134
194
|
<div
|
|
135
195
|
data-slot="sheet-body"
|
|
136
|
-
class={cn('flex-1 overflow-y-auto
|
|
196
|
+
class={cn('min-h-0 flex-1 overflow-y-auto p-4', local.class)}
|
|
137
197
|
{...rest}
|
|
138
198
|
/>
|
|
139
199
|
)
|
|
@@ -144,7 +204,10 @@ export function SheetFooter(props: ComponentProps<'div'>) {
|
|
|
144
204
|
return (
|
|
145
205
|
<div
|
|
146
206
|
data-slot="sheet-footer"
|
|
147
|
-
class={cn(
|
|
207
|
+
class={cn(
|
|
208
|
+
'flex shrink-0 flex-wrap items-center justify-end gap-2 border-t border-border bg-background px-4 py-3',
|
|
209
|
+
local.class
|
|
210
|
+
)}
|
|
148
211
|
{...rest}
|
|
149
212
|
/>
|
|
150
213
|
)
|
|
@@ -154,7 +217,7 @@ export function SheetTitle(props: ComponentProps<typeof KobalteDialog.Title>) {
|
|
|
154
217
|
const [local, rest] = splitProps(props, ['class'])
|
|
155
218
|
return (
|
|
156
219
|
<KobalteDialog.Title
|
|
157
|
-
class={cn(headingVariants({ size: '
|
|
220
|
+
class={cn(headingVariants({ size: 'card', leading: 'none' }), local.class)}
|
|
158
221
|
{...rest}
|
|
159
222
|
/>
|
|
160
223
|
)
|
package/src/lib/overlay.ts
CHANGED
|
@@ -81,3 +81,17 @@ export const menuSeparator = 'bg-border -mx-1 my-1 h-px'
|
|
|
81
81
|
|
|
82
82
|
/** Padding shared by every menu-list surface. */
|
|
83
83
|
export const menuContentPadding = 'p-1'
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Marks a floating layer — a menu, a listbox, a popover — as part of the top
|
|
87
|
+
* layer.
|
|
88
|
+
*
|
|
89
|
+
* A modal dialog hides everything outside itself from assistive technology
|
|
90
|
+
* (`aria-hidden` on its siblings) and keeps watching `<body>` for new nodes.
|
|
91
|
+
* A menu or select opened from inside the dialog portals to `<body>`, so the
|
|
92
|
+
* dialog hid it too: the list was on screen, focused, and invisible to a
|
|
93
|
+
* screen reader, and an outside-click check could treat a click on it as a
|
|
94
|
+
* click away from the dialog. Kobalte exempts nodes carrying this attribute
|
|
95
|
+
* from both, so every floating layer carries it.
|
|
96
|
+
*/
|
|
97
|
+
export const topLayerProps = { 'data-kb-top-layer': '' } as const
|
package/src/styles/base.css
CHANGED
|
@@ -277,6 +277,19 @@
|
|
|
277
277
|
text-orientation: mixed;
|
|
278
278
|
}
|
|
279
279
|
|
|
280
|
+
/**
|
|
281
|
+
* The docking box of an inset Sheet: below the top bar, with one gap (two spacing
|
|
282
|
+
* steps) from the top bar, the end edge and the bottom of the window, so the
|
|
283
|
+
* panel fills the height of the main view and its edges line up on every side.
|
|
284
|
+
* Narrow windows keep the same gap at the start edge too.
|
|
285
|
+
*/
|
|
286
|
+
@utility panel-dialog-inset {
|
|
287
|
+
top: calc(var(--topbar-height) + var(--spacing) * 2);
|
|
288
|
+
inset-inline-end: calc(var(--spacing) * 2);
|
|
289
|
+
bottom: calc(var(--spacing) * 2);
|
|
290
|
+
max-width: calc(100vw - var(--spacing) * 4);
|
|
291
|
+
}
|
|
292
|
+
|
|
280
293
|
@utility no-scrollbar {
|
|
281
294
|
-ms-overflow-style: none;
|
|
282
295
|
scrollbar-width: none;
|