Skip to content

Commit d2c0474

Browse files
fix(popover): by replacing native Popover elements with Corvu Popover library fixing placement screen issues, simplify demo
1 parent 104eed7 commit d2c0474

File tree

9 files changed

+104
-557
lines changed

9 files changed

+104
-557
lines changed

.roo/rules-code/solid_ui_library.md

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -178,9 +178,7 @@ Generated at: 2025-10-20 20:03
178178
- ~/interactive/toast/toastAdd.ts
179179
- ~/interactive/toast/Toaster.tsx
180180
- ~/interactive/toast/GlobalToasterState.ts
181-
- ~/interactive/popover/SimplePopover3.tsx
182-
- ~/interactive/popover/SimplePopover2.tsx
183-
- ~/interactive/popover/SimplePopover.tsx
181+
- ~/interactive/popover/CorvuPopover.tsx
184182
- ~/interactive/details/Details.tsx
185183
- ~/interactive/toggle/ToggleButton.tsx
186184
- ~/interactive/theme/t4theme.ts

lib/input/select/Multiselect.tsx

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@ import { ct0, ct1 } from "~ui/i18n/ct0"
55
import { t4multiselect } from "~ui/input/select/t4multiselect"
66
import { buttonVariant } from "~ui/interactive/button/buttonCva"
77
import { ButtonIcon } from "~ui/interactive/button/ButtonIcon"
8-
import type { ButtonIcon1Props } from "~ui/interactive/button/ButtonIcon1"
9-
import { SimplePopover3 } from "~ui/interactive/popover/SimplePopover3"
8+
import { CorvuPopover, type CorvuPopoverProps } from "~ui/interactive/popover/CorvuPopover"
109
import { classArr } from "~ui/utils/ui/classArr"
1110
import { classMerge } from "~ui/utils/ui/classMerge"
1211
import type { SignalObject } from "~ui/utils/ui/createSignalObject"
@@ -18,15 +17,15 @@ import type { SelectionItem } from "~ui/utils/ui/SelectionItem"
1817
/**
1918
* https://github.com/radix-ui/primitives/blob/main/packages/react/checkbox/src/Checkbox.tsx
2019
*/
21-
export type MultiselectProps<T extends string = string> = {
22-
buttonProps: ButtonIcon1Props
20+
export interface MultiselectProps<T extends string = string> extends MultiselectState<T>, HasClass, HasChildren {
21+
buttonProps: CorvuPopoverProps
2322
textNoEntries?: string
2423
textAddEntry?: string
25-
} & MultiselectState<T> &
26-
HasClass &
27-
HasChildren
24+
}
2825

29-
export type MultiselectState<T extends string = string> = MultiselectStateValue<T> & MultiselectStateOptions<T>
26+
export interface MultiselectState<T extends string = string>
27+
extends MultiselectStateValue<T>,
28+
MultiselectStateOptions<T> {}
3029

3130
export type MultiselectStateValue<T extends string = string> = {
3231
valueSignal: SignalObject<SelectionItem<T>[]>
@@ -51,14 +50,15 @@ export function Multiselect<T extends string = string>(p: MultiselectProps<T>) {
5150
"rounded-md",
5251
"focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2",
5352
"flex flex-col items-center justify-center gap-1", // layout
53+
p.class,
5454
)}
5555
>
5656
<SelectedValues valueSignal={p.valueSignal} />
57-
<SimplePopover3 buttonProps={buttonProps}>
57+
<CorvuPopover {...buttonProps}>
5858
<div class={classArr("bg-white dark:bg-black", "max-h-dvh", "grid grid-cols-3 gap-x-2 gap-y-1")}>
5959
<OptionList valueSignal={p.valueSignal} getOptions={p.getOptions} />
6060
</div>
61-
</SimplePopover3>
61+
</CorvuPopover>
6262
</div>
6363
)
6464
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import Popover from "@corvu/popover"
2+
import type { JSX } from "solid-js"
3+
import { buttonCva2 } from "~ui/interactive/button/buttonCva"
4+
import type { ButtonIcon1Props } from "~ui/interactive/button/ButtonIcon1"
5+
import { buttonIconCva } from "~ui/interactive/button/buttonIconCva"
6+
import { classesButtonClickAnimation } from "~ui/interactive/button/classesButtonClickAnimation"
7+
import { classesButtonDisabled } from "~ui/interactive/button/classesButtonDisabled"
8+
import { Icon1 } from "~ui/static/icon/Icon1"
9+
import { classArr } from "~ui/utils/ui/classArr"
10+
import type { HasChildren } from "~ui/utils/ui/HasChildren"
11+
import type { HasClass } from "~ui/utils/ui/HasClass"
12+
13+
export interface CorvuPopoverProps extends HasClass, HasChildren, ButtonIcon1Props {
14+
// buttonProps: ButtonIcon1Props
15+
buttonChildren?: JSX.Element
16+
}
17+
18+
export function CorvuPopover(p: CorvuPopoverProps) {
19+
// const [a, buttonProps] = splitProps(p.buttonProps, ["onClick"])
20+
return (
21+
<Popover
22+
floatingOptions={{
23+
offset: 8,
24+
flip: true,
25+
shift: true,
26+
}}
27+
>
28+
<Popover.Trigger
29+
class={buttonCva2(
30+
p.variant,
31+
p.size,
32+
classesButtonClickAnimation,
33+
(p.disabled || p.isDisabled?.()) && classesButtonDisabled,
34+
p.class,
35+
)}
36+
>
37+
{p.icon && <Icon1 path={p.icon} class={buttonIconCva(p.variant, p.buttonChildren && "mr-2", p.iconClass)} />}
38+
{p.buttonChildren}
39+
{p.iconRight && (
40+
<Icon1 path={p.iconRight} class={buttonIconCva(p.variant, p.buttonChildren && "ml-2", p.iconClass)} />
41+
)}
42+
</Popover.Trigger>
43+
<Popover.Portal>
44+
<Popover.Content
45+
class={classArr(
46+
"z-50", // positioning
47+
"px-3 py-3", // spacing
48+
"rounded-lg", // border
49+
"dark:border", // border
50+
"bg-white dark:bg-black", // background
51+
"shadow-md", // shadow
52+
"data-open:animate-in data-open:fade-in-50% data-open:slide-in-from-top-1 data-closed:animate-out data-closed:fade-out-50% data-closed:slide-out-to-top-1", // animations
53+
)}
54+
>
55+
{p.children}
56+
</Popover.Content>
57+
</Popover.Portal>
58+
</Popover>
59+
)
60+
}

0 commit comments

Comments
 (0)