@adea-ai/ui 0.110.0 → 0.111.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/account-menu/account-menu.js +1 -1
- package/dist/components/composites/action-button/action-button.js +1 -1
- package/dist/components/composites/appearance-editor/accent-swatch-groups.d.ts +17 -2
- package/dist/components/composites/appearance-editor/accent-swatch-groups.d.ts.map +1 -1
- package/dist/components/composites/appearance-editor/accent-swatch-groups.js +47 -122
- package/dist/components/composites/appearance-editor/accent-swatch-groups.js.map +1 -1
- package/dist/components/composites/appearance-editor/appearance-choices.d.ts.map +1 -1
- package/dist/components/composites/appearance-editor/appearance-choices.js +0 -4
- package/dist/components/composites/appearance-editor/appearance-choices.js.map +1 -1
- package/dist/components/composites/appearance-editor/appearance-editor.js +1 -1
- package/dist/components/composites/appearance-editor/font-settings-group.d.ts.map +1 -1
- package/dist/components/composites/appearance-editor/font-settings-group.js +60 -68
- package/dist/components/composites/appearance-editor/font-settings-group.js.map +1 -1
- package/dist/components/composites/appearance-editor/index.js +1 -1
- package/dist/components/layout/split-layout/split-layout.d.ts.map +1 -1
- package/dist/components/layout/split-layout/split-layout.js +5 -2
- package/dist/components/layout/split-layout/split-layout.js.map +1 -1
- package/dist/components/theme/appearance-panel.d.ts.map +1 -1
- package/dist/components/theme/appearance-panel.js +0 -3
- package/dist/components/theme/appearance-panel.js.map +1 -1
- package/dist/components/ui/alert-dialog/alert-dialog.js +2 -2
- package/dist/components/ui/alert-dialog/alert-dialog.js.map +1 -1
- package/dist/components/ui/combobox/combobox.d.ts.map +1 -1
- package/dist/components/ui/combobox/combobox.js +1 -1
- 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 +2 -2
- package/dist/components/ui/context-menu/context-menu.js.map +1 -1
- package/dist/components/ui/dialog/dialog.d.ts.map +1 -1
- package/dist/components/ui/dialog/dialog.js +17 -11
- package/dist/components/ui/dialog/dialog.js.map +1 -1
- package/dist/components/ui/drawer/drawer.js +1 -1
- package/dist/components/ui/drawer/drawer.js.map +1 -1
- package/dist/components/ui/dropdown-menu/dropdown-menu.d.ts +22 -2
- package/dist/components/ui/dropdown-menu/dropdown-menu.d.ts.map +1 -1
- package/dist/components/ui/dropdown-menu/dropdown-menu.js +79 -30
- package/dist/components/ui/dropdown-menu/dropdown-menu.js.map +1 -1
- package/dist/components/ui/dropdown-menu/index.d.ts +1 -0
- package/dist/components/ui/dropdown-menu/index.d.ts.map +1 -1
- package/dist/components/ui/menubar/menubar.d.ts.map +1 -1
- package/dist/components/ui/menubar/menubar.js +2 -2
- package/dist/components/ui/menubar/menubar.js.map +1 -1
- package/dist/components/ui/select/index.d.ts +1 -0
- package/dist/components/ui/select/index.d.ts.map +1 -1
- package/dist/components/ui/select/select.d.ts +7 -1
- package/dist/components/ui/select/select.d.ts.map +1 -1
- package/dist/components/ui/select/select.js +34 -20
- package/dist/components/ui/select/select.js.map +1 -1
- package/dist/components/ui/sheet/sheet.js +1 -1
- package/dist/components/ui/sheet/sheet.js.map +1 -1
- package/dist/components/ui/tooltip/tooltip.d.ts +16 -6
- package/dist/components/ui/tooltip/tooltip.d.ts.map +1 -1
- package/dist/components/ui/tooltip/tooltip.js +17 -6
- package/dist/components/ui/tooltip/tooltip.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/lib/overlay.d.ts +30 -1
- package/dist/lib/overlay.d.ts.map +1 -1
- package/dist/lib/overlay.js +37 -2
- package/dist/lib/overlay.js.map +1 -1
- package/dist/r/dialog.json +1 -0
- package/dist/r/registry.json +2 -1
- package/dist/r/split-layout.json +1 -1
- package/dist/r/src/components/composites/appearance-editor/accent-swatch-groups.tsx +33 -86
- package/dist/r/src/components/composites/appearance-editor/appearance-choices.tsx +0 -3
- package/dist/r/src/components/composites/appearance-editor/font-settings-group.tsx +20 -7
- package/dist/r/src/components/layout/split-layout/split-layout.tsx +4 -3
- package/dist/r/src/components/theme/appearance-panel.tsx +0 -1
- package/dist/r/src/components/ui/alert-dialog/alert-dialog.tsx +2 -2
- package/dist/r/src/components/ui/combobox/combobox.tsx +3 -1
- package/dist/r/src/components/ui/context-menu/context-menu.tsx +6 -2
- package/dist/r/src/components/ui/dialog/dialog.tsx +19 -12
- package/dist/r/src/components/ui/drawer/drawer.tsx +1 -1
- package/dist/r/src/components/ui/dropdown-menu/dropdown-menu.tsx +44 -6
- package/dist/r/src/components/ui/dropdown-menu/index.ts +1 -0
- package/dist/r/src/components/ui/menubar/menubar.tsx +6 -2
- package/dist/r/src/components/ui/select/index.ts +1 -0
- package/dist/r/src/components/ui/select/select.tsx +31 -6
- package/dist/r/src/components/ui/sheet/sheet.tsx +1 -1
- package/dist/r/src/components/ui/tooltip/tooltip.tsx +34 -3
- package/dist/r/src/lib/overlay.ts +45 -1
- package/package.json +1 -1
- package/registry.json +2 -1
- package/src/components/composites/appearance-editor/accent-swatch-groups.tsx +33 -86
- package/src/components/composites/appearance-editor/appearance-choices.tsx +0 -3
- package/src/components/composites/appearance-editor/font-settings-group.tsx +20 -7
- package/src/components/layout/split-layout/split-layout.tsx +4 -3
- package/src/components/theme/appearance-panel.tsx +0 -1
- package/src/components/ui/alert-dialog/alert-dialog.tsx +2 -2
- package/src/components/ui/combobox/combobox.tsx +3 -1
- package/src/components/ui/context-menu/context-menu.tsx +6 -2
- package/src/components/ui/dialog/dialog.tsx +19 -12
- package/src/components/ui/drawer/drawer.tsx +1 -1
- package/src/components/ui/dropdown-menu/dropdown-menu.tsx +44 -6
- package/src/components/ui/dropdown-menu/index.ts +1 -0
- package/src/components/ui/menubar/menubar.tsx +6 -2
- package/src/components/ui/select/index.ts +1 -0
- package/src/components/ui/select/select.tsx +31 -6
- package/src/components/ui/sheet/sheet.tsx +1 -1
- package/src/components/ui/tooltip/tooltip.tsx +34 -3
- package/src/lib/overlay.ts +45 -1
|
@@ -11,7 +11,6 @@ import {
|
|
|
11
11
|
DropdownMenuTrigger,
|
|
12
12
|
} from '../../ui/dropdown-menu/dropdown-menu'
|
|
13
13
|
import { InputControl } from '../../ui/input/input-control'
|
|
14
|
-
import { SettingsRow } from './appearance-rows'
|
|
15
14
|
import {
|
|
16
15
|
APPEARANCE_EDITOR_FONT_SIZE_MAX,
|
|
17
16
|
APPEARANCE_EDITOR_FONT_SIZE_MIN,
|
|
@@ -142,7 +141,7 @@ function FontFamilyMenu(props: {
|
|
|
142
141
|
size="sm"
|
|
143
142
|
aria-label={`${props.label} font family`}
|
|
144
143
|
disabled={props.disabled}
|
|
145
|
-
class="w-
|
|
144
|
+
class="w-32 max-w-full justify-between"
|
|
146
145
|
>
|
|
147
146
|
<span class="truncate">{selectedLabel()}</span>
|
|
148
147
|
<ChevronDown aria-hidden="true" class="ms-2 size-4 shrink-0 text-muted-foreground" />
|
|
@@ -298,8 +297,22 @@ export function AppearanceFontSettingsGroup(props: AppearanceFontSettingsGroupPr
|
|
|
298
297
|
)
|
|
299
298
|
}
|
|
300
299
|
return (
|
|
301
|
-
<
|
|
302
|
-
<
|
|
300
|
+
<section class="flex items-center gap-3 px-4 py-4" data-font-settings-row={row.axis}>
|
|
301
|
+
<span
|
|
302
|
+
class="flex size-9 shrink-0 items-center justify-center rounded-lg border bg-foreground/5 text-muted-foreground [&_svg]:size-4"
|
|
303
|
+
aria-hidden="true"
|
|
304
|
+
>
|
|
305
|
+
<Icon />
|
|
306
|
+
</span>
|
|
307
|
+
{/* One line, always: the copy truncates rather than wrapping the
|
|
308
|
+
controls to a second line, so the family menu, the size field
|
|
309
|
+
and the title/subtitle stay aligned. The compact widths keep
|
|
310
|
+
that true at the appearance sheet's own width. */}
|
|
311
|
+
<div class="min-w-0 flex-1">
|
|
312
|
+
<h3 class="text-sm font-medium">{row.label}</h3>
|
|
313
|
+
<div class="mt-0.5 truncate text-xs text-muted-foreground">{row.description}</div>
|
|
314
|
+
</div>
|
|
315
|
+
<div class="flex shrink-0 items-center gap-2">
|
|
303
316
|
<FontFamilyMenu
|
|
304
317
|
label={row.label}
|
|
305
318
|
family={value().family}
|
|
@@ -307,7 +320,7 @@ export function AppearanceFontSettingsGroup(props: AppearanceFontSettingsGroupPr
|
|
|
307
320
|
disabled={props.disabled}
|
|
308
321
|
onSelect={(family) => updateAxis(row.axis, { family })}
|
|
309
322
|
/>
|
|
310
|
-
<div class="flex
|
|
323
|
+
<div class="flex items-center gap-1">
|
|
311
324
|
<InputControl
|
|
312
325
|
type="number"
|
|
313
326
|
min={APPEARANCE_EDITOR_FONT_SIZE_MIN}
|
|
@@ -318,7 +331,7 @@ export function AppearanceFontSettingsGroup(props: AppearanceFontSettingsGroupPr
|
|
|
318
331
|
aria-label={`${row.label} font size in pixels`}
|
|
319
332
|
aria-describedby={sizeHintId}
|
|
320
333
|
aria-invalid={sizeIsInvalid()}
|
|
321
|
-
class="w-
|
|
334
|
+
class="w-12"
|
|
322
335
|
onInput={(event) =>
|
|
323
336
|
setSizeDrafts((current) => ({
|
|
324
337
|
...current,
|
|
@@ -341,7 +354,7 @@ export function AppearanceFontSettingsGroup(props: AppearanceFontSettingsGroupPr
|
|
|
341
354
|
{APPEARANCE_EDITOR_FONT_SIZE_MAX} pixels.
|
|
342
355
|
</span>
|
|
343
356
|
</div>
|
|
344
|
-
</
|
|
357
|
+
</section>
|
|
345
358
|
)
|
|
346
359
|
}}
|
|
347
360
|
</For>
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
type JSX,
|
|
12
12
|
} from 'solid-js'
|
|
13
13
|
import { X, GripVertical } from 'lucide-solid'
|
|
14
|
-
import {
|
|
14
|
+
import { ActionButton } from '../../composites/action-button'
|
|
15
15
|
import { cn } from '../../../lib/utils'
|
|
16
16
|
import { computeLayoutFrames, type LayoutRect } from './geometry'
|
|
17
17
|
import { paneDropIntent, type PaneDropIntent } from './drop'
|
|
@@ -420,14 +420,15 @@ export function SplitLayout<L extends SplitLayoutLeaf>(props: SplitLayoutProps<L
|
|
|
420
420
|
</span>
|
|
421
421
|
{actions}
|
|
422
422
|
{props.onClose ? (
|
|
423
|
-
<
|
|
423
|
+
<ActionButton
|
|
424
424
|
variant="ghost"
|
|
425
425
|
size="icon-xs"
|
|
426
426
|
aria-label={`Close ${props.labelForLeaf(leaf())}`}
|
|
427
|
+
tooltip={`Close ${props.labelForLeaf(leaf())}.`}
|
|
427
428
|
onClick={() => close(id)}
|
|
428
429
|
>
|
|
429
430
|
<X />
|
|
430
|
-
</
|
|
431
|
+
</ActionButton>
|
|
431
432
|
) : null}
|
|
432
433
|
</header>
|
|
433
434
|
<div class="min-h-0 min-w-0 flex-1 overflow-auto">{content}</div>
|
|
@@ -118,7 +118,6 @@ export function AppearancePanel(props: AppearancePanelProps) {
|
|
|
118
118
|
>
|
|
119
119
|
<AccentSwatchGroups
|
|
120
120
|
accentOptions={accentPresets}
|
|
121
|
-
themeAccentOptions={themeAccents()}
|
|
122
121
|
resolvedAppearance={resolvedAppearance()}
|
|
123
122
|
themeDefaultColor="var(--primary)"
|
|
124
123
|
/>
|
|
@@ -6,10 +6,10 @@ import {
|
|
|
6
6
|
import type { ComponentProps } from 'solid-js'
|
|
7
7
|
import { createEffect, createSignal, splitProps } from 'solid-js'
|
|
8
8
|
import {
|
|
9
|
+
dialogSurface,
|
|
9
10
|
overlayMotion,
|
|
10
11
|
overlayPositioner,
|
|
11
12
|
overlayScrim,
|
|
12
|
-
overlaySurface,
|
|
13
13
|
overlayTitle,
|
|
14
14
|
} from '../../../lib/overlay'
|
|
15
15
|
import { cn } from '../../../lib/utils'
|
|
@@ -89,7 +89,7 @@ export function AlertDialogContent(props: ComponentProps<typeof KobalteAlertDial
|
|
|
89
89
|
<div class={overlayPositioner}>
|
|
90
90
|
<KobalteAlertDialogContent
|
|
91
91
|
{...blockDismissal}
|
|
92
|
-
class={cn(
|
|
92
|
+
class={cn(dialogSurface, overlayMotion, 'grid w-full max-w-md gap-4 p-5', local.class)}
|
|
93
93
|
{...rest}
|
|
94
94
|
/>
|
|
95
95
|
</div>
|
|
@@ -133,7 +133,9 @@ export function ComboboxItem(props: ComponentProps<typeof KobalteCombobox.Item>)
|
|
|
133
133
|
return (
|
|
134
134
|
<KobalteCombobox.Item class={cn(menuItem, 'pe-8', local.class)} {...rest}>
|
|
135
135
|
<KobalteCombobox.ItemLabel>{local.children}</KobalteCombobox.ItemLabel>
|
|
136
|
-
|
|
136
|
+
{/* The indicator reads in the accent, like every other selected state in
|
|
137
|
+
the system. */}
|
|
138
|
+
<KobalteCombobox.ItemIndicator class="absolute end-2 flex size-4 items-center justify-center text-primary">
|
|
137
139
|
<Check class="size-4" />
|
|
138
140
|
</KobalteCombobox.ItemIndicator>
|
|
139
141
|
</KobalteCombobox.Item>
|
|
@@ -109,7 +109,9 @@ export function ContextMenuCheckboxItem(
|
|
|
109
109
|
return (
|
|
110
110
|
<KobalteContextMenu.CheckboxItem class={cn(menuItem, 'pe-8', local.class)} {...rest}>
|
|
111
111
|
{local.children}
|
|
112
|
-
|
|
112
|
+
{/* The indicator reads in the accent, like every other selected state in
|
|
113
|
+
the system. */}
|
|
114
|
+
<KobalteContextMenu.ItemIndicator class="absolute end-2 flex size-4 items-center justify-center text-primary">
|
|
113
115
|
<Check class="size-4" />
|
|
114
116
|
</KobalteContextMenu.ItemIndicator>
|
|
115
117
|
</KobalteContextMenu.CheckboxItem>
|
|
@@ -126,7 +128,9 @@ export function ContextMenuRadioItem(props: ComponentProps<typeof KobalteContext
|
|
|
126
128
|
return (
|
|
127
129
|
<KobalteContextMenu.RadioItem class={cn(menuItem, 'pe-8', local.class)} {...rest}>
|
|
128
130
|
{local.children}
|
|
129
|
-
|
|
131
|
+
{/* The indicator reads in the accent, like every other selected state in
|
|
132
|
+
the system. */}
|
|
133
|
+
<KobalteContextMenu.ItemIndicator class="absolute end-2 flex size-4 items-center justify-center text-primary">
|
|
130
134
|
<Circle class="size-2 fill-current" />
|
|
131
135
|
</KobalteContextMenu.ItemIndicator>
|
|
132
136
|
</KobalteContextMenu.RadioItem>
|
|
@@ -8,13 +8,14 @@ import { X } from 'lucide-solid'
|
|
|
8
8
|
import type { Accessor, ComponentProps, JSX } from 'solid-js'
|
|
9
9
|
import { createRenderEffect, onCleanup, Show, splitProps } from 'solid-js'
|
|
10
10
|
import {
|
|
11
|
+
dialogSurface,
|
|
11
12
|
overlayMotion,
|
|
12
13
|
overlayPositioner,
|
|
13
14
|
overlayScrim,
|
|
14
|
-
overlaySurface,
|
|
15
15
|
overlayTitle,
|
|
16
16
|
} from '../../../lib/overlay'
|
|
17
17
|
import { cn } from '../../../lib/utils'
|
|
18
|
+
import { Tooltip, TooltipContent, TooltipTrigger } from '../tooltip'
|
|
18
19
|
|
|
19
20
|
type FocusCycle = {
|
|
20
21
|
content: HTMLElement
|
|
@@ -281,7 +282,7 @@ export function DialogContent(props: DialogContentProps) {
|
|
|
281
282
|
<div class={cn(overlayPositioner, local.positioner === 'inset' && 'inset-4 grid-rows-1 p-0')}>
|
|
282
283
|
<KobalteDialogContent
|
|
283
284
|
class={cn(
|
|
284
|
-
|
|
285
|
+
dialogSurface,
|
|
285
286
|
overlayMotion,
|
|
286
287
|
'relative grid w-full max-w-lg gap-4 p-5',
|
|
287
288
|
local.class
|
|
@@ -290,16 +291,22 @@ export function DialogContent(props: DialogContentProps) {
|
|
|
290
291
|
>
|
|
291
292
|
{local.children}
|
|
292
293
|
<Show when={local.closeButton !== false}>
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
294
|
+
{/* The corner close is icon-only, so it carries the shared tooltip
|
|
295
|
+
treatment while its accessible name stays "Close". */}
|
|
296
|
+
<Tooltip>
|
|
297
|
+
<TooltipTrigger
|
|
298
|
+
as={KobalteDialog.CloseButton}
|
|
299
|
+
aria-label="Close"
|
|
300
|
+
class={cn(
|
|
301
|
+
'absolute top-3.5 end-3.5 rounded-md p-1 text-muted-foreground',
|
|
302
|
+
'transition-colors ease-out hover:bg-surface-hover hover:text-foreground',
|
|
303
|
+
'focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-primary-subtle outline-none'
|
|
304
|
+
)}
|
|
305
|
+
>
|
|
306
|
+
{local.closeButton ?? <X class="size-4" />}
|
|
307
|
+
</TooltipTrigger>
|
|
308
|
+
<TooltipContent>Close dialog.</TooltipContent>
|
|
309
|
+
</Tooltip>
|
|
303
310
|
</Show>
|
|
304
311
|
</KobalteDialogContent>
|
|
305
312
|
</div>
|
|
@@ -69,7 +69,7 @@ export function DrawerContent(props: DrawerContentProps) {
|
|
|
69
69
|
<DrawerOverlay />
|
|
70
70
|
<DrawerPrimitive.Content
|
|
71
71
|
class={cn(
|
|
72
|
-
'group/drawer bg-
|
|
72
|
+
'group/drawer bg-background text-foreground fixed z-(--z-drawer) flex flex-col border-border shadow-lg',
|
|
73
73
|
'data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:max-h-[85vh] data-[side=bottom]:rounded-t-xl data-[side=bottom]:border-t',
|
|
74
74
|
'data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:max-h-[85vh] data-[side=top]:rounded-b-xl data-[side=top]:border-b',
|
|
75
75
|
'data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:w-80 data-[side=left]:rounded-e-xl data-[side=left]:border-e',
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { DropdownMenu as KobalteDropdownMenu } from '@kobalte/core/dropdown-menu'
|
|
2
2
|
import { Check, ChevronRight, Circle } from 'lucide-solid'
|
|
3
3
|
import type { Accessor, ComponentProps } from 'solid-js'
|
|
4
|
-
import { createContext, splitProps, useContext } from 'solid-js'
|
|
4
|
+
import { createContext, Show, splitProps, useContext } from 'solid-js'
|
|
5
5
|
import {
|
|
6
6
|
menuContentPadding,
|
|
7
7
|
destructiveMenuItem,
|
|
8
8
|
menuItem,
|
|
9
9
|
menuLabel,
|
|
10
|
+
menuSwatchTone,
|
|
11
|
+
type MenuSwatchTone,
|
|
10
12
|
menuSeparator,
|
|
11
13
|
overlayMotion,
|
|
12
14
|
overlaySurface,
|
|
@@ -192,6 +194,13 @@ export function DropdownMenuPortal(props: ComponentProps<typeof KobalteDropdownM
|
|
|
192
194
|
}
|
|
193
195
|
|
|
194
196
|
export type DropdownMenuContentProps = ComponentProps<typeof KobalteDropdownMenu.Content> & {
|
|
197
|
+
/**
|
|
198
|
+
* Kept for callers that hid the arrow explicitly; the arrow is now hidden by
|
|
199
|
+
* default. Pass `false` to draw one. The default flipped because Kobalte
|
|
200
|
+
* reserves half of the arrow's 30px box as popper gutter — a menu anchored to
|
|
201
|
+
* its trigger floated 15px off it, which read as a gap rather than as a
|
|
202
|
+
* pointer, and every anchored caller already passed `hideArrow`.
|
|
203
|
+
*/
|
|
195
204
|
hideArrow?: boolean
|
|
196
205
|
/** Mount under an owner element such as a modal, keeping the menu in its accessible subtree. */
|
|
197
206
|
portalMount?: HTMLElement
|
|
@@ -213,7 +222,12 @@ export function DropdownMenuContent(props: DropdownMenuContentProps) {
|
|
|
213
222
|
)}
|
|
214
223
|
{...rest}
|
|
215
224
|
>
|
|
216
|
-
{
|
|
225
|
+
{local.hideArrow === false && (
|
|
226
|
+
/* Rendered only when a caller asks for it back: the popper folds half
|
|
227
|
+
the arrow's box into the content's gutter, so an arrow and a flush
|
|
228
|
+
menu have never been true at once. */
|
|
229
|
+
<KobalteDropdownMenu.Arrow aria-hidden="true" class={popoverArrow} />
|
|
230
|
+
)}
|
|
217
231
|
{local.children}
|
|
218
232
|
</KobalteDropdownMenu.Content>
|
|
219
233
|
</KobalteDropdownMenu.Portal>
|
|
@@ -233,6 +247,10 @@ export function DropdownMenuItem(
|
|
|
233
247
|
* whenever `shortcut` is drawn.
|
|
234
248
|
*/
|
|
235
249
|
keyshortcuts?: string
|
|
250
|
+
/** Draw a leading colour dot from the shared tone ladder — the accent or
|
|
251
|
+
* status role the option's card badge carries. `aria-hidden`; the label
|
|
252
|
+
* carries the meaning. */
|
|
253
|
+
swatch?: MenuSwatchTone
|
|
236
254
|
}
|
|
237
255
|
) {
|
|
238
256
|
const [local, rest] = splitProps(props, [
|
|
@@ -240,6 +258,7 @@ export function DropdownMenuItem(
|
|
|
240
258
|
'variant',
|
|
241
259
|
'shortcut',
|
|
242
260
|
'keyshortcuts',
|
|
261
|
+
'swatch',
|
|
243
262
|
'children',
|
|
244
263
|
])
|
|
245
264
|
|
|
@@ -255,6 +274,9 @@ export function DropdownMenuItem(
|
|
|
255
274
|
aria-keyshortcuts={local.keyshortcuts}
|
|
256
275
|
{...rest}
|
|
257
276
|
>
|
|
277
|
+
<Show when={local.swatch}>
|
|
278
|
+
<span aria-hidden="true" class={menuSwatchTone({ tone: local.swatch })} />
|
|
279
|
+
</Show>
|
|
258
280
|
{local.children}
|
|
259
281
|
{local.shortcut ? (
|
|
260
282
|
<span
|
|
@@ -292,12 +314,19 @@ export function DropdownMenuShortcut(props: ComponentProps<'span'>) {
|
|
|
292
314
|
}
|
|
293
315
|
|
|
294
316
|
export function DropdownMenuCheckboxItem(
|
|
295
|
-
props: ComponentProps<typeof KobalteDropdownMenu.CheckboxItem>
|
|
317
|
+
props: ComponentProps<typeof KobalteDropdownMenu.CheckboxItem> & {
|
|
318
|
+
/** Draw a leading colour dot from the shared tone ladder. `aria-hidden`;
|
|
319
|
+
* the label carries the meaning. */
|
|
320
|
+
swatch?: MenuSwatchTone
|
|
321
|
+
}
|
|
296
322
|
) {
|
|
297
|
-
const [local, rest] = splitProps(props, ['class', 'children'])
|
|
323
|
+
const [local, rest] = splitProps(props, ['class', 'swatch', 'children'])
|
|
298
324
|
|
|
299
325
|
return (
|
|
300
326
|
<KobalteDropdownMenu.CheckboxItem class={cn(menuItem, 'pe-8', local.class)} {...rest}>
|
|
327
|
+
<Show when={local.swatch}>
|
|
328
|
+
<span aria-hidden="true" class={menuSwatchTone({ tone: local.swatch })} />
|
|
329
|
+
</Show>
|
|
301
330
|
{local.children}
|
|
302
331
|
<KobalteDropdownMenu.ItemIndicator
|
|
303
332
|
data-slot="dropdown-menu-indicator"
|
|
@@ -315,11 +344,20 @@ export function DropdownMenuRadioGroup(
|
|
|
315
344
|
return <KobalteDropdownMenu.RadioGroup {...props} />
|
|
316
345
|
}
|
|
317
346
|
|
|
318
|
-
export function DropdownMenuRadioItem(
|
|
319
|
-
|
|
347
|
+
export function DropdownMenuRadioItem(
|
|
348
|
+
props: ComponentProps<typeof KobalteDropdownMenu.RadioItem> & {
|
|
349
|
+
/** Draw a leading colour dot from the shared tone ladder. `aria-hidden`;
|
|
350
|
+
* the label carries the meaning. */
|
|
351
|
+
swatch?: MenuSwatchTone
|
|
352
|
+
}
|
|
353
|
+
) {
|
|
354
|
+
const [local, rest] = splitProps(props, ['class', 'swatch', 'children'])
|
|
320
355
|
|
|
321
356
|
return (
|
|
322
357
|
<KobalteDropdownMenu.RadioItem class={cn(menuItem, 'pe-8', local.class)} {...rest}>
|
|
358
|
+
<Show when={local.swatch}>
|
|
359
|
+
<span aria-hidden="true" class={menuSwatchTone({ tone: local.swatch })} />
|
|
360
|
+
</Show>
|
|
323
361
|
{local.children}
|
|
324
362
|
{/* The indicator reads in the accent, like every other selected state in
|
|
325
363
|
the system — a canvas-colored dot on a checked row reads as decoration. */}
|
|
@@ -139,7 +139,9 @@ export function MenubarCheckboxItem(props: ComponentProps<typeof KobalteMenubar.
|
|
|
139
139
|
return (
|
|
140
140
|
<KobalteMenubar.CheckboxItem class={cn(menuItem, 'pe-8', local.class)} {...rest}>
|
|
141
141
|
{local.children}
|
|
142
|
-
|
|
142
|
+
{/* The indicator reads in the accent, like every other selected state in
|
|
143
|
+
the system. */}
|
|
144
|
+
<KobalteMenubar.ItemIndicator class="absolute end-2 flex size-4 items-center justify-center text-primary">
|
|
143
145
|
<Check class="size-4" />
|
|
144
146
|
</KobalteMenubar.ItemIndicator>
|
|
145
147
|
</KobalteMenubar.CheckboxItem>
|
|
@@ -155,7 +157,9 @@ export function MenubarRadioItem(props: ComponentProps<typeof KobalteMenubar.Rad
|
|
|
155
157
|
return (
|
|
156
158
|
<KobalteMenubar.RadioItem class={cn(menuItem, 'pe-8', local.class)} {...rest}>
|
|
157
159
|
{local.children}
|
|
158
|
-
|
|
160
|
+
{/* The indicator reads in the accent, like every other selected state in
|
|
161
|
+
the system. */}
|
|
162
|
+
<KobalteMenubar.ItemIndicator class="absolute end-2 flex size-4 items-center justify-center text-primary">
|
|
159
163
|
<Circle class="size-2 fill-current" />
|
|
160
164
|
</KobalteMenubar.ItemIndicator>
|
|
161
165
|
</KobalteMenubar.RadioItem>
|
|
@@ -2,7 +2,13 @@ import { Select as KobalteSelect } from '@kobalte/core/select'
|
|
|
2
2
|
import { Check, ChevronDown, ChevronsUpDown } from 'lucide-solid'
|
|
3
3
|
import type { ComponentProps } from 'solid-js'
|
|
4
4
|
import { Show, splitProps } from 'solid-js'
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
menuContentPadding,
|
|
7
|
+
menuItem,
|
|
8
|
+
menuSwatchTone,
|
|
9
|
+
type MenuSwatchTone,
|
|
10
|
+
topLayerProps,
|
|
11
|
+
} from '../../../lib/overlay'
|
|
6
12
|
import { cn } from '../../../lib/utils'
|
|
7
13
|
|
|
8
14
|
/**
|
|
@@ -21,7 +27,12 @@ import { cn } from '../../../lib/utils'
|
|
|
21
27
|
export function Select<Option, OptGroup = never>(
|
|
22
28
|
props: ComponentProps<typeof KobalteSelect<Option, OptGroup>>
|
|
23
29
|
) {
|
|
24
|
-
|
|
30
|
+
// Kobalte's own default gutter is 8px; without the arrow (removed below) the
|
|
31
|
+
// popper no longer folds half an arrow box into that offset, and 8px read as
|
|
32
|
+
// a detached list. Four pixels is shadcn's `sideOffset` — attached, with
|
|
33
|
+
// room for the trigger's own border.
|
|
34
|
+
const [local, rest] = splitProps(props, ['gutter'])
|
|
35
|
+
return <KobalteSelect gutter={local.gutter ?? 4} {...rest} />
|
|
25
36
|
}
|
|
26
37
|
|
|
27
38
|
export type SelectTriggerProps = ComponentProps<typeof KobalteSelect.Trigger> & {
|
|
@@ -153,20 +164,34 @@ export function SelectContent(props: SelectContentProps) {
|
|
|
153
164
|
{...rest}
|
|
154
165
|
>
|
|
155
166
|
{local.children}
|
|
167
|
+
{/* No arrow: the list is the trigger's own value opened up, and Kobalte
|
|
168
|
+
reserves half the arrow's 30px box as popper gutter, which is where
|
|
169
|
+
the reported gap between a form trigger and its options came from. */}
|
|
156
170
|
<KobalteSelect.Listbox class="flex flex-col" />
|
|
157
|
-
<KobalteSelect.Arrow aria-hidden="true" class={popoverArrow} />
|
|
158
171
|
</KobalteSelect.Content>
|
|
159
172
|
</KobalteSelect.Portal>
|
|
160
173
|
)
|
|
161
174
|
}
|
|
162
175
|
|
|
163
|
-
export function SelectItem(
|
|
164
|
-
|
|
176
|
+
export function SelectItem(
|
|
177
|
+
props: ComponentProps<typeof KobalteSelect.Item> & {
|
|
178
|
+
/** Draw a leading colour dot from the shared tone ladder — the accent or
|
|
179
|
+
* status role the option's card badge carries. `aria-hidden`; the label
|
|
180
|
+
* carries the meaning. */
|
|
181
|
+
swatch?: MenuSwatchTone
|
|
182
|
+
}
|
|
183
|
+
) {
|
|
184
|
+
const [local, rest] = splitProps(props, ['class', 'children', 'swatch'])
|
|
165
185
|
|
|
166
186
|
return (
|
|
167
187
|
<KobalteSelect.Item class={cn(menuItem, 'pe-8', local.class)} {...rest}>
|
|
188
|
+
<Show when={local.swatch}>
|
|
189
|
+
<span aria-hidden="true" class={menuSwatchTone({ tone: local.swatch })} />
|
|
190
|
+
</Show>
|
|
168
191
|
<KobalteSelect.ItemLabel>{local.children}</KobalteSelect.ItemLabel>
|
|
169
|
-
|
|
192
|
+
{/* The indicator reads in the accent, like every other selected state in
|
|
193
|
+
the system — the row's own foreground reads as decoration. */}
|
|
194
|
+
<KobalteSelect.ItemIndicator class="absolute end-2 flex size-4 items-center justify-center text-primary">
|
|
170
195
|
<Check class="size-4" />
|
|
171
196
|
</KobalteSelect.ItemIndicator>
|
|
172
197
|
</KobalteSelect.Item>
|
|
@@ -46,7 +46,7 @@ import { createDialogFocusRestoration, DialogOverlay } from '../dialog/dialog'
|
|
|
46
46
|
// scrolled programmatically (focus, scrollIntoView, scrollTop), which slid the
|
|
47
47
|
// pinned footer out of view. Only SheetBody scrolls.
|
|
48
48
|
const sheetVariants = cva(
|
|
49
|
-
'bg-
|
|
49
|
+
'bg-background text-foreground fixed z-(--z-dialog) flex flex-col overflow-clip border-border shadow-lg',
|
|
50
50
|
{
|
|
51
51
|
variants: {
|
|
52
52
|
side: {
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import { Tooltip as KobalteTooltip, useTooltipContext } from '@kobalte/core/tooltip'
|
|
2
|
-
import type { ComponentProps } from 'solid-js'
|
|
2
|
+
import type { ComponentProps, JSX } from 'solid-js'
|
|
3
3
|
import {
|
|
4
4
|
createContext,
|
|
5
5
|
createEffect,
|
|
6
6
|
createSignal,
|
|
7
7
|
createUniqueId,
|
|
8
8
|
onCleanup,
|
|
9
|
+
Show,
|
|
9
10
|
splitProps,
|
|
10
11
|
useContext,
|
|
11
12
|
} from 'solid-js'
|
|
12
13
|
import { isServer } from 'solid-js/web'
|
|
13
|
-
import { tooltipTip } from '../../../lib/overlay'
|
|
14
|
+
import { tooltipTip, topLayerProps } from '../../../lib/overlay'
|
|
14
15
|
import { cn } from '../../../lib/utils'
|
|
15
16
|
|
|
16
17
|
/**
|
|
@@ -349,13 +350,24 @@ export function TooltipTrigger(props: ComponentProps<typeof KobalteTooltip.Trigg
|
|
|
349
350
|
)
|
|
350
351
|
}
|
|
351
352
|
|
|
352
|
-
export type TooltipContentProps = ComponentProps<typeof KobalteTooltip.Content>
|
|
353
|
+
export type TooltipContentProps = ComponentProps<typeof KobalteTooltip.Content> & {
|
|
354
|
+
/**
|
|
355
|
+
* A leading icon, repeating the trigger's glyph inside the tip — the side
|
|
356
|
+
* rail's icon+label treatment, offered so a toolbar or rail tooltip does not
|
|
357
|
+
* have to hand-roll it. Decorative by contract: the tip is `aria-hidden`
|
|
358
|
+
* while closed and never the accessible name, so the icon must not be the
|
|
359
|
+
* only carrier of meaning. Size it by leaving the svg bare; the slot fixes
|
|
360
|
+
* it to the system's control size.
|
|
361
|
+
*/
|
|
362
|
+
icon?: JSX.Element
|
|
363
|
+
}
|
|
353
364
|
|
|
354
365
|
export function TooltipContent(props: TooltipContentProps) {
|
|
355
366
|
const interaction = useContext(TooltipInteractionContext)
|
|
356
367
|
const [local, rest] = splitProps(props, [
|
|
357
368
|
'class',
|
|
358
369
|
'children',
|
|
370
|
+
'icon',
|
|
359
371
|
'aria-hidden',
|
|
360
372
|
'onEscapeKeyDown',
|
|
361
373
|
'onPointerDownOutside',
|
|
@@ -380,6 +392,9 @@ export function TooltipContent(props: TooltipContentProps) {
|
|
|
380
392
|
'data-expanded:animate-in data-expanded:fade-in-0 data-expanded:zoom-in-95',
|
|
381
393
|
'data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95',
|
|
382
394
|
'data-expanded:duration-150 data-closed:duration-100',
|
|
395
|
+
// An icon+label tip is one row that reads as a unit, so the label
|
|
396
|
+
// never wraps under the glyph.
|
|
397
|
+
{ 'flex items-center gap-2 whitespace-nowrap': !!local.icon },
|
|
383
398
|
local.class
|
|
384
399
|
)}
|
|
385
400
|
// A tooltip is never interactive: the content is plain text, and the
|
|
@@ -397,8 +412,24 @@ export function TooltipContent(props: TooltipContentProps) {
|
|
|
397
412
|
invokeEventHandler(local.onPointerDownOutside, event)
|
|
398
413
|
if (!event.defaultPrevented) interaction?.markCloseIntent()
|
|
399
414
|
}}
|
|
415
|
+
// A tooltip opened from inside a modal dialog is part of that dialog's
|
|
416
|
+
// surface, so it carries the same top-layer exemption as a menu or a
|
|
417
|
+
// popover — without it the dialog's hide-outside observer aria-hides
|
|
418
|
+
// the tip while it is on screen.
|
|
419
|
+
{...topLayerProps}
|
|
400
420
|
{...rest}
|
|
401
421
|
>
|
|
422
|
+
<Show when={local.icon}>
|
|
423
|
+
{(icon) => (
|
|
424
|
+
<span
|
|
425
|
+
data-slot="tooltip-icon"
|
|
426
|
+
aria-hidden="true"
|
|
427
|
+
class="flex size-4 shrink-0 items-center justify-center [&_svg]:size-4"
|
|
428
|
+
>
|
|
429
|
+
{icon()}
|
|
430
|
+
</span>
|
|
431
|
+
)}
|
|
432
|
+
</Show>
|
|
402
433
|
{local.children}
|
|
403
434
|
</KobalteTooltip.Content>
|
|
404
435
|
</KobalteTooltip.Portal>
|
|
@@ -10,10 +10,29 @@
|
|
|
10
10
|
* "an overlay looks like this" a fact rather than a convention.
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
import { cva, type VariantProps } from './variants'
|
|
14
|
+
|
|
15
|
+
/** The panel itself: fill, hairline edge, radius, elevation. Menus, popovers
|
|
16
|
+
* and the command palette float on the elevated overlay rung (`--popover`). */
|
|
14
17
|
export const overlaySurface =
|
|
15
18
|
'bg-popover text-popover-foreground rounded-xl border border-border shadow-lg'
|
|
16
19
|
|
|
20
|
+
/**
|
|
21
|
+
* The modal panel: the same hairline edge, radius and elevation, painted on the
|
|
22
|
+
* *neutral* theme surface instead of the elevated overlay rung.
|
|
23
|
+
*
|
|
24
|
+
* `--popover` is the catalogue's `surfaceElevated`, whose derivation amplifies
|
|
25
|
+
* the canvas hue's chroma on the elevated step. On the dark default's violet
|
|
26
|
+
* canvas that makes the dialog the most chromatic surface in the ladder —
|
|
27
|
+
* `oklch(0.2406 0.0088 300.91)`, red above green in sRGB — and on a full dialog
|
|
28
|
+
* panel that cast reads as a warm tint the canvas never has. shadcn's own
|
|
29
|
+
* convention already splits the two: a Dialog paints `bg-background`, menus and
|
|
30
|
+
* popovers paint `bg-popover`. The veil, the hairline and the elevation shadow
|
|
31
|
+
* carry the separation the lighter fill no longer provides.
|
|
32
|
+
*/
|
|
33
|
+
export const dialogSurface =
|
|
34
|
+
'bg-background text-foreground rounded-xl border border-border shadow-lg'
|
|
35
|
+
|
|
17
36
|
/**
|
|
18
37
|
* Overlay titles have one fixed typography role. Keep this small recipe shared
|
|
19
38
|
* without loading the configurable Heading component into every dialog.
|
|
@@ -85,6 +104,31 @@ export const menuLabel =
|
|
|
85
104
|
/** The rule between menu groups. */
|
|
86
105
|
export const menuSeparator = 'bg-border -mx-1 my-1 h-px'
|
|
87
106
|
|
|
107
|
+
/**
|
|
108
|
+
* A leading colour swatch on a menu or select row: the sanctioned way to carry
|
|
109
|
+
* a card-tone colour into a list of options. The tones are the system's accent
|
|
110
|
+
* and status roles — the vocabulary a Badge already speaks — so the colour an
|
|
111
|
+
* option shows in a menu is the colour its badge carries on a card, and a
|
|
112
|
+
* caller never passes a raw colour into a list. The dot is `aria-hidden`; the
|
|
113
|
+
* label carries the meaning, so a tone is never the only signal.
|
|
114
|
+
*/
|
|
115
|
+
export const menuSwatchTone = cva('size-2 shrink-0 rounded-full', {
|
|
116
|
+
variants: {
|
|
117
|
+
tone: {
|
|
118
|
+
neutral: 'bg-muted-foreground',
|
|
119
|
+
primary: 'bg-primary',
|
|
120
|
+
success: 'bg-success',
|
|
121
|
+
warning: 'bg-warning',
|
|
122
|
+
destructive: 'bg-destructive',
|
|
123
|
+
info: 'bg-info',
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
defaultVariants: { tone: 'neutral' },
|
|
127
|
+
})
|
|
128
|
+
|
|
129
|
+
/** The tones a menu row's swatch can take. */
|
|
130
|
+
export type MenuSwatchTone = NonNullable<VariantProps<typeof menuSwatchTone>['tone']>
|
|
131
|
+
|
|
88
132
|
/** Padding shared by every menu-list surface. */
|
|
89
133
|
export const menuContentPadding = 'p-1'
|
|
90
134
|
|
package/package.json
CHANGED
package/registry.json
CHANGED
|
@@ -568,6 +568,7 @@
|
|
|
568
568
|
"lucide-solid@^1.51.0"
|
|
569
569
|
],
|
|
570
570
|
"registryDependencies": [
|
|
571
|
+
"@adea-ai/ui/tooltip",
|
|
571
572
|
"lib"
|
|
572
573
|
],
|
|
573
574
|
"files": [
|
|
@@ -1804,7 +1805,7 @@
|
|
|
1804
1805
|
"lucide-solid@^1.51.0"
|
|
1805
1806
|
],
|
|
1806
1807
|
"registryDependencies": [
|
|
1807
|
-
"@adea-ai/ui/button",
|
|
1808
|
+
"@adea-ai/ui/action-button",
|
|
1808
1809
|
"lib"
|
|
1809
1810
|
],
|
|
1810
1811
|
"files": [
|