@radix-solid-js/popover 0.1.2

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/index.cjs ADDED
@@ -0,0 +1,339 @@
1
+ 'use strict';
2
+
3
+ var solidJs = require('solid-js');
4
+ var primitive = require('@radix-solid-js/primitive');
5
+ var composeRefs = require('@radix-solid-js/compose-refs');
6
+ var context = require('@radix-solid-js/context');
7
+ var dismissableLayer = require('@radix-solid-js/dismissable-layer');
8
+ var focusGuards = require('@radix-solid-js/focus-guards');
9
+ var focusScope = require('@radix-solid-js/focus-scope');
10
+ var id = require('@radix-solid-js/id');
11
+ var popper = require('@radix-solid-js/popper');
12
+ var portal = require('@radix-solid-js/portal');
13
+ var presence = require('@radix-solid-js/presence');
14
+ var primitiveComponent = require('@radix-solid-js/primitive-component');
15
+ var useControllableState = require('@radix-solid-js/use-controllable-state');
16
+ var ariaHidden = require('aria-hidden');
17
+
18
+ // src/popover.tsx
19
+ var POPOVER_NAME = "Popover";
20
+ var [createPopoverContext, createPopoverScope] = context.createContextScope(POPOVER_NAME, [
21
+ popper.createPopperScope
22
+ ]);
23
+ var usePopperScope = popper.createPopperScope();
24
+ var [PopoverProvider, usePopoverContext] = createPopoverContext(POPOVER_NAME);
25
+ function Popover(props) {
26
+ const [local] = solidJs.splitProps(props, [
27
+ "__scopePopover",
28
+ "children",
29
+ "open",
30
+ "defaultOpen",
31
+ "onOpenChange",
32
+ "modal"
33
+ ]);
34
+ const popperScope = usePopperScope(local.__scopePopover);
35
+ const [triggerRef, setTriggerRef] = solidJs.createSignal(null);
36
+ const [hasCustomAnchor, setHasCustomAnchor] = solidJs.createSignal(false);
37
+ const contentId = id.createId();
38
+ const [open, setOpen] = useControllableState.createControllableSignal({
39
+ prop: () => local.open,
40
+ defaultProp: local.defaultOpen ?? false,
41
+ onChange: (value) => local.onOpenChange?.(value)
42
+ });
43
+ const modal = () => local.modal ?? false;
44
+ return /* @__PURE__ */ React.createElement(popper.Popper, { ...popperScope }, /* @__PURE__ */ React.createElement(
45
+ PopoverProvider,
46
+ {
47
+ scope: local.__scopePopover,
48
+ contentId,
49
+ triggerRef: triggerRef(),
50
+ onTriggerRefChange: setTriggerRef,
51
+ open: open(),
52
+ onOpenChange: setOpen,
53
+ onOpenToggle: () => setOpen((prev) => !prev),
54
+ hasCustomAnchor: hasCustomAnchor(),
55
+ onCustomAnchorAdd: () => setHasCustomAnchor(true),
56
+ onCustomAnchorRemove: () => setHasCustomAnchor(false),
57
+ modal: modal()
58
+ },
59
+ local.children
60
+ ));
61
+ }
62
+ Popover.displayName = POPOVER_NAME;
63
+ var ANCHOR_NAME = "PopoverAnchor";
64
+ function PopoverAnchor(inProps) {
65
+ const [local, rest] = solidJs.splitProps(inProps, ["__scopePopover", "ref"]);
66
+ const context = usePopoverContext(ANCHOR_NAME, local.__scopePopover);
67
+ const popperScope = usePopperScope(local.__scopePopover);
68
+ solidJs.createEffect(() => {
69
+ context.onCustomAnchorAdd();
70
+ solidJs.onCleanup(() => context.onCustomAnchorRemove());
71
+ });
72
+ return /* @__PURE__ */ React.createElement(popper.PopperAnchor, { ...popperScope, ...rest, ref: local.ref });
73
+ }
74
+ PopoverAnchor.displayName = ANCHOR_NAME;
75
+ var TRIGGER_NAME = "PopoverTrigger";
76
+ function PopoverTrigger(inProps) {
77
+ const [local, rest] = solidJs.splitProps(inProps, ["__scopePopover", "ref"]);
78
+ const context = usePopoverContext(TRIGGER_NAME, local.__scopePopover);
79
+ const popperScope = usePopperScope(local.__scopePopover);
80
+ const trigger = /* @__PURE__ */ React.createElement(
81
+ primitiveComponent.Primitive.button,
82
+ {
83
+ type: "button",
84
+ "aria-haspopup": "dialog",
85
+ "aria-expanded": context.open,
86
+ "aria-controls": context.contentId,
87
+ "data-state": getState(context.open),
88
+ ...rest,
89
+ ref: composeRefs.mergeRefs(local.ref, (el) => context.onTriggerRefChange(el)),
90
+ onClick: primitive.composeEventHandlers(rest.onClick, context.onOpenToggle)
91
+ }
92
+ );
93
+ return /* @__PURE__ */ React.createElement(solidJs.Show, { when: context.hasCustomAnchor, fallback: /* @__PURE__ */ React.createElement(popper.PopperAnchor, { ...popperScope }, trigger) }, trigger);
94
+ }
95
+ PopoverTrigger.displayName = TRIGGER_NAME;
96
+ var PORTAL_NAME = "PopoverPortal";
97
+ var [PortalProvider, usePortalContext] = createPopoverContext(PORTAL_NAME, {
98
+ forceMount: void 0
99
+ });
100
+ function PopoverPortal(props) {
101
+ const [local] = solidJs.splitProps(props, ["__scopePopover", "forceMount", "children", "container"]);
102
+ return /* @__PURE__ */ React.createElement(PortalProvider, { scope: local.__scopePopover, forceMount: local.forceMount }, /* @__PURE__ */ React.createElement(portal.Portal, { container: local.container }, local.children));
103
+ }
104
+ PopoverPortal.displayName = PORTAL_NAME;
105
+ var CONTENT_NAME = "PopoverContent";
106
+ function PopoverContent(inProps) {
107
+ const [local, rest] = solidJs.splitProps(inProps, ["__scopePopover", "forceMount"]);
108
+ const portalContext = usePortalContext(CONTENT_NAME, local.__scopePopover);
109
+ const context = usePopoverContext(CONTENT_NAME, local.__scopePopover);
110
+ const forceMount = () => local.forceMount ?? portalContext.forceMount;
111
+ return /* @__PURE__ */ React.createElement(presence.Presence, { present: forceMount() || context.open }, /* @__PURE__ */ React.createElement(
112
+ solidJs.Show,
113
+ {
114
+ when: context.modal,
115
+ fallback: /* @__PURE__ */ React.createElement(PopoverContentNonModal, { ...rest, __scopePopover: local.__scopePopover })
116
+ },
117
+ /* @__PURE__ */ React.createElement(PopoverContentModal, { ...rest, __scopePopover: local.__scopePopover })
118
+ ));
119
+ }
120
+ PopoverContent.displayName = CONTENT_NAME;
121
+ function PopoverContentModal(inProps) {
122
+ const [local, rest] = solidJs.splitProps(inProps, [
123
+ "__scopePopover",
124
+ "ref",
125
+ "onCloseAutoFocus",
126
+ "onPointerDownOutside",
127
+ "onFocusOutside"
128
+ ]);
129
+ const context = usePopoverContext(CONTENT_NAME, local.__scopePopover);
130
+ let contentRef;
131
+ let isRightClickOutside = false;
132
+ solidJs.createEffect(() => {
133
+ if (contentRef) {
134
+ const cleanup = ariaHidden.hideOthers(contentRef);
135
+ solidJs.onCleanup(() => cleanup?.());
136
+ }
137
+ });
138
+ return /* @__PURE__ */ React.createElement(
139
+ PopoverContentImpl,
140
+ {
141
+ ...rest,
142
+ __scopePopover: local.__scopePopover,
143
+ ref: composeRefs.mergeRefs(local.ref, (el) => {
144
+ contentRef = el;
145
+ }),
146
+ trapFocus: context.open,
147
+ disableOutsidePointerEvents: true,
148
+ onCloseAutoFocus: primitive.composeEventHandlers(local.onCloseAutoFocus, (event) => {
149
+ event.preventDefault();
150
+ if (!isRightClickOutside) context.triggerRef?.focus();
151
+ }),
152
+ onPointerDownOutside: primitive.composeEventHandlers(
153
+ local.onPointerDownOutside,
154
+ (event) => {
155
+ const originalEvent = event.detail.originalEvent;
156
+ const ctrlLeftClick = originalEvent.button === 0 && originalEvent.ctrlKey === true;
157
+ const isRightClick = originalEvent.button === 2 || ctrlLeftClick;
158
+ isRightClickOutside = isRightClick;
159
+ }
160
+ ),
161
+ onFocusOutside: primitive.composeEventHandlers(
162
+ local.onFocusOutside,
163
+ (event) => event.preventDefault()
164
+ )
165
+ }
166
+ );
167
+ }
168
+ function PopoverContentNonModal(inProps) {
169
+ const [local, rest] = solidJs.splitProps(inProps, [
170
+ "__scopePopover",
171
+ "onCloseAutoFocus",
172
+ "onInteractOutside"
173
+ ]);
174
+ const context = usePopoverContext(CONTENT_NAME, local.__scopePopover);
175
+ let hasInteractedOutside = false;
176
+ let hasPointerDownOutside = false;
177
+ return /* @__PURE__ */ React.createElement(
178
+ PopoverContentImpl,
179
+ {
180
+ ...rest,
181
+ __scopePopover: local.__scopePopover,
182
+ trapFocus: false,
183
+ disableOutsidePointerEvents: false,
184
+ onCloseAutoFocus: (event) => {
185
+ local.onCloseAutoFocus?.(event);
186
+ if (!event.defaultPrevented) {
187
+ if (!hasInteractedOutside) context.triggerRef?.focus();
188
+ event.preventDefault();
189
+ }
190
+ hasInteractedOutside = false;
191
+ hasPointerDownOutside = false;
192
+ },
193
+ onInteractOutside: (event) => {
194
+ local.onInteractOutside?.(event);
195
+ if (!event.defaultPrevented) {
196
+ hasInteractedOutside = true;
197
+ if (event.detail.originalEvent.type === "pointerdown") {
198
+ hasPointerDownOutside = true;
199
+ }
200
+ }
201
+ const target = event.target;
202
+ const targetIsTrigger = context.triggerRef?.contains(target);
203
+ if (targetIsTrigger) event.preventDefault();
204
+ if (event.detail.originalEvent.type === "focusin" && hasPointerDownOutside) {
205
+ event.preventDefault();
206
+ }
207
+ }
208
+ }
209
+ );
210
+ }
211
+ function PopoverContentImpl(inProps) {
212
+ const [local, rest] = solidJs.splitProps(inProps, [
213
+ "__scopePopover",
214
+ "ref",
215
+ "side",
216
+ "sideOffset",
217
+ "align",
218
+ "alignOffset",
219
+ "avoidCollisions",
220
+ "collisionBoundary",
221
+ "collisionPadding",
222
+ "arrowPadding",
223
+ "sticky",
224
+ "hideWhenDetached",
225
+ "trapFocus",
226
+ "onOpenAutoFocus",
227
+ "onCloseAutoFocus",
228
+ "disableOutsidePointerEvents",
229
+ "onEscapeKeyDown",
230
+ "onPointerDownOutside",
231
+ "onFocusOutside",
232
+ "onInteractOutside",
233
+ "style"
234
+ ]);
235
+ const context = usePopoverContext(CONTENT_NAME, local.__scopePopover);
236
+ const popperScope = usePopperScope(local.__scopePopover);
237
+ focusGuards.useFocusGuards();
238
+ return /* @__PURE__ */ React.createElement(
239
+ focusScope.FocusScope,
240
+ {
241
+ loop: true,
242
+ trapped: local.trapFocus,
243
+ onMountAutoFocus: local.onOpenAutoFocus,
244
+ onUnmountAutoFocus: local.onCloseAutoFocus
245
+ },
246
+ /* @__PURE__ */ React.createElement(
247
+ dismissableLayer.DismissableLayer,
248
+ {
249
+ asChild: true,
250
+ disableOutsidePointerEvents: local.disableOutsidePointerEvents,
251
+ onInteractOutside: local.onInteractOutside,
252
+ onEscapeKeyDown: local.onEscapeKeyDown,
253
+ onPointerDownOutside: local.onPointerDownOutside,
254
+ onFocusOutside: local.onFocusOutside,
255
+ onDismiss: () => context.onOpenChange(false)
256
+ },
257
+ /* @__PURE__ */ React.createElement(
258
+ popper.PopperContent,
259
+ {
260
+ "data-state": getState(context.open),
261
+ role: "dialog",
262
+ id: context.contentId,
263
+ ...popperScope,
264
+ ...rest,
265
+ ref: local.ref,
266
+ side: local.side,
267
+ sideOffset: local.sideOffset,
268
+ align: local.align,
269
+ alignOffset: local.alignOffset,
270
+ avoidCollisions: local.avoidCollisions,
271
+ collisionBoundary: local.collisionBoundary,
272
+ collisionPadding: local.collisionPadding,
273
+ arrowPadding: local.arrowPadding,
274
+ sticky: local.sticky,
275
+ hideWhenDetached: local.hideWhenDetached,
276
+ style: {
277
+ ...typeof local.style === "object" ? local.style : {},
278
+ // re-namespace exposed content custom properties
279
+ "--radix-popover-content-transform-origin": "var(--radix-popper-transform-origin)",
280
+ "--radix-popover-content-available-width": "var(--radix-popper-available-width)",
281
+ "--radix-popover-content-available-height": "var(--radix-popper-available-height)",
282
+ "--radix-popover-trigger-width": "var(--radix-popper-anchor-width)",
283
+ "--radix-popover-trigger-height": "var(--radix-popper-anchor-height)"
284
+ }
285
+ }
286
+ )
287
+ )
288
+ );
289
+ }
290
+ var CLOSE_NAME = "PopoverClose";
291
+ function PopoverClose(inProps) {
292
+ const [local, rest] = solidJs.splitProps(inProps, ["__scopePopover", "ref"]);
293
+ const context = usePopoverContext(CLOSE_NAME, local.__scopePopover);
294
+ return /* @__PURE__ */ React.createElement(
295
+ primitiveComponent.Primitive.button,
296
+ {
297
+ type: "button",
298
+ ...rest,
299
+ ref: local.ref,
300
+ onClick: primitive.composeEventHandlers(rest.onClick, () => context.onOpenChange(false))
301
+ }
302
+ );
303
+ }
304
+ PopoverClose.displayName = CLOSE_NAME;
305
+ var ARROW_NAME = "PopoverArrow";
306
+ function PopoverArrow(inProps) {
307
+ const [local, rest] = solidJs.splitProps(inProps, ["__scopePopover"]);
308
+ const popperScope = usePopperScope(local.__scopePopover);
309
+ return /* @__PURE__ */ React.createElement(popper.PopperArrow, { ...popperScope, ...rest });
310
+ }
311
+ PopoverArrow.displayName = ARROW_NAME;
312
+ function getState(open) {
313
+ return open ? "open" : "closed";
314
+ }
315
+ var Root = Popover;
316
+ var Anchor = PopoverAnchor;
317
+ var Trigger = PopoverTrigger;
318
+ var PortalExport = PopoverPortal;
319
+ var Content = PopoverContent;
320
+ var Close = PopoverClose;
321
+ var Arrow = PopoverArrow;
322
+
323
+ exports.Anchor = Anchor;
324
+ exports.Arrow = Arrow;
325
+ exports.Close = Close;
326
+ exports.Content = Content;
327
+ exports.Popover = Popover;
328
+ exports.PopoverAnchor = PopoverAnchor;
329
+ exports.PopoverArrow = PopoverArrow;
330
+ exports.PopoverClose = PopoverClose;
331
+ exports.PopoverContent = PopoverContent;
332
+ exports.PopoverPortal = PopoverPortal;
333
+ exports.PopoverTrigger = PopoverTrigger;
334
+ exports.Portal = PortalExport;
335
+ exports.Root = Root;
336
+ exports.Trigger = Trigger;
337
+ exports.createPopoverScope = createPopoverScope;
338
+ //# sourceMappingURL=index.cjs.map
339
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/popover.tsx"],"names":["createContextScope","createPopperScope","splitProps","createSignal","createId","createControllableSignal","Popper","createEffect","onCleanup","PopperAnchor","Primitive","mergeRefs","composeEventHandlers","Show","PortalPrimitive","Presence","hideOthers","useFocusGuards","FocusScope","DismissableLayer","PopperContent","PopperArrow"],"mappings":"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","file":"index.cjs","sourcesContent":["import {\n type JSX,\n createSignal,\n createEffect,\n onCleanup,\n splitProps,\n Show,\n} from 'solid-js';\nimport { composeEventHandlers } from '@radix-solid-js/primitive';\nimport { mergeRefs } from '@radix-solid-js/compose-refs';\nimport { createContextScope, type Scope } from '@radix-solid-js/context';\nimport { DismissableLayer } from '@radix-solid-js/dismissable-layer';\nimport { useFocusGuards } from '@radix-solid-js/focus-guards';\nimport { FocusScope } from '@radix-solid-js/focus-scope';\nimport { createId } from '@radix-solid-js/id';\nimport {\n createPopperScope,\n Popper,\n PopperAnchor,\n PopperContent,\n PopperArrow,\n} from '@radix-solid-js/popper';\nimport { Portal as PortalPrimitive } from '@radix-solid-js/portal';\nimport { Presence } from '@radix-solid-js/presence';\nimport { Primitive } from '@radix-solid-js/primitive-component';\nimport { createControllableSignal } from '@radix-solid-js/use-controllable-state';\nimport { hideOthers } from 'aria-hidden';\n\n/* -------------------------------------------------------------------------------------------------\n * Popover\n * -----------------------------------------------------------------------------------------------*/\n\nconst POPOVER_NAME = 'Popover';\n\ntype ScopedProps<P> = P & { __scopePopover?: Scope };\nconst [createPopoverContext, createPopoverScope] = createContextScope(POPOVER_NAME, [\n createPopperScope,\n]);\nconst usePopperScope = createPopperScope();\n\ntype PopoverContextValue = {\n triggerRef: HTMLButtonElement | null;\n onTriggerRefChange: (el: HTMLButtonElement | null) => void;\n contentId: string;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onOpenToggle: () => void;\n hasCustomAnchor: boolean;\n onCustomAnchorAdd: () => void;\n onCustomAnchorRemove: () => void;\n modal: boolean;\n};\n\nconst [PopoverProvider, usePopoverContext] =\n createPopoverContext<PopoverContextValue>(POPOVER_NAME);\n\ninterface PopoverProps {\n children?: JSX.Element;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n modal?: boolean;\n}\n\nfunction Popover(props: ScopedProps<PopoverProps>) {\n const [local] = splitProps(props, [\n '__scopePopover',\n 'children',\n 'open',\n 'defaultOpen',\n 'onOpenChange',\n 'modal',\n ]);\n\n const popperScope = usePopperScope(local.__scopePopover);\n const [triggerRef, setTriggerRef] = createSignal<HTMLButtonElement | null>(null);\n const [hasCustomAnchor, setHasCustomAnchor] = createSignal(false);\n const contentId = createId();\n\n const [open, setOpen] = createControllableSignal({\n prop: () => local.open,\n defaultProp: local.defaultOpen ?? false,\n onChange: (value) => local.onOpenChange?.(value),\n });\n\n const modal = () => local.modal ?? false;\n\n return (\n <Popper {...popperScope}>\n <PopoverProvider\n scope={local.__scopePopover}\n contentId={contentId}\n triggerRef={triggerRef()}\n onTriggerRefChange={setTriggerRef}\n open={open()}\n onOpenChange={setOpen}\n onOpenToggle={() => setOpen((prev) => !prev)}\n hasCustomAnchor={hasCustomAnchor()}\n onCustomAnchorAdd={() => setHasCustomAnchor(true)}\n onCustomAnchorRemove={() => setHasCustomAnchor(false)}\n modal={modal()}\n >\n {local.children}\n </PopoverProvider>\n </Popper>\n );\n}\n\nPopover.displayName = POPOVER_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * PopoverAnchor\n * -----------------------------------------------------------------------------------------------*/\n\nconst ANCHOR_NAME = 'PopoverAnchor';\n\ninterface PopoverAnchorProps extends JSX.HTMLAttributes<HTMLDivElement> {\n ref?: (el: HTMLElement) => void;\n}\n\nfunction PopoverAnchor(inProps: ScopedProps<PopoverAnchorProps>) {\n const [local, rest] = splitProps(inProps, ['__scopePopover', 'ref']);\n const context = usePopoverContext(ANCHOR_NAME, local.__scopePopover);\n const popperScope = usePopperScope(local.__scopePopover);\n\n // Notify the root that a custom anchor has been added\n createEffect(() => {\n context.onCustomAnchorAdd();\n onCleanup(() => context.onCustomAnchorRemove());\n });\n\n return <PopperAnchor {...popperScope} {...rest} ref={local.ref} />;\n}\n\nPopoverAnchor.displayName = ANCHOR_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * PopoverTrigger\n * -----------------------------------------------------------------------------------------------*/\n\nconst TRIGGER_NAME = 'PopoverTrigger';\n\ninterface PopoverTriggerProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {\n ref?: (el: HTMLElement) => void;\n}\n\nfunction PopoverTrigger(inProps: ScopedProps<PopoverTriggerProps>) {\n const [local, rest] = splitProps(inProps, ['__scopePopover', 'ref']);\n const context = usePopoverContext(TRIGGER_NAME, local.__scopePopover);\n const popperScope = usePopperScope(local.__scopePopover);\n\n const trigger = (\n <Primitive.button\n type=\"button\"\n aria-haspopup=\"dialog\"\n aria-expanded={context.open}\n aria-controls={context.contentId}\n data-state={getState(context.open)}\n {...rest}\n ref={mergeRefs(local.ref, (el: HTMLElement) => context.onTriggerRefChange(el as HTMLButtonElement))}\n onClick={composeEventHandlers(rest.onClick as any, context.onOpenToggle)}\n />\n );\n\n return (\n <Show when={context.hasCustomAnchor} fallback={\n <PopperAnchor {...popperScope}>\n {trigger}\n </PopperAnchor>\n }>\n {trigger}\n </Show>\n );\n}\n\nPopoverTrigger.displayName = TRIGGER_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * PopoverPortal\n * -----------------------------------------------------------------------------------------------*/\n\nconst PORTAL_NAME = 'PopoverPortal';\n\ntype PortalContextValue = { forceMount?: true };\nconst [PortalProvider, usePortalContext] = createPopoverContext<PortalContextValue>(PORTAL_NAME, {\n forceMount: undefined,\n});\n\ninterface PopoverPortalProps {\n children?: JSX.Element;\n container?: Element | DocumentFragment | null;\n forceMount?: true;\n}\n\nfunction PopoverPortal(props: ScopedProps<PopoverPortalProps>) {\n const [local] = splitProps(props, ['__scopePopover', 'forceMount', 'children', 'container']);\n\n // Portal is always mounted — visibility is controlled by Presence in PopoverContent.\n // This avoids the dual-Presence problem where the outer Presence would unmount\n // the portal before the inner exit animation completes.\n return (\n <PortalProvider scope={local.__scopePopover} forceMount={local.forceMount}>\n <PortalPrimitive container={local.container}>\n {local.children}\n </PortalPrimitive>\n </PortalProvider>\n );\n}\n\nPopoverPortal.displayName = PORTAL_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * PopoverContent\n * -----------------------------------------------------------------------------------------------*/\n\nconst CONTENT_NAME = 'PopoverContent';\n\ninterface PopoverContentProps extends Omit<PopoverContentImplProps, 'trapFocus' | 'disableOutsidePointerEvents'> {\n forceMount?: true;\n}\n\nfunction PopoverContent(inProps: ScopedProps<PopoverContentProps>) {\n const [local, rest] = splitProps(inProps, ['__scopePopover', 'forceMount']);\n const portalContext = usePortalContext(CONTENT_NAME, local.__scopePopover);\n const context = usePopoverContext(CONTENT_NAME, local.__scopePopover);\n const forceMount = () => local.forceMount ?? portalContext.forceMount;\n\n return (\n <Presence present={forceMount() || context.open}>\n <Show\n when={context.modal}\n fallback={<PopoverContentNonModal {...rest} __scopePopover={local.__scopePopover} />}\n >\n <PopoverContentModal {...rest} __scopePopover={local.__scopePopover} />\n </Show>\n </Presence>\n );\n}\n\nPopoverContent.displayName = CONTENT_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * PopoverContentModal\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PopoverContentTypeProps\n extends Omit<PopoverContentImplProps, 'trapFocus' | 'disableOutsidePointerEvents'> {}\n\nfunction PopoverContentModal(inProps: ScopedProps<PopoverContentTypeProps>) {\n const [local, rest] = splitProps(inProps, [\n '__scopePopover',\n 'ref',\n 'onCloseAutoFocus',\n 'onPointerDownOutside',\n 'onFocusOutside',\n ]);\n const context = usePopoverContext(CONTENT_NAME, local.__scopePopover);\n let contentRef: HTMLDivElement | undefined;\n let isRightClickOutside = false;\n\n // aria-hide everything except the content (better supported equivalent to setting aria-modal)\n createEffect(() => {\n if (contentRef) {\n const cleanup = hideOthers(contentRef);\n onCleanup(() => cleanup?.());\n }\n });\n\n return (\n <PopoverContentImpl\n {...rest}\n __scopePopover={local.__scopePopover}\n ref={mergeRefs(local.ref, (el: HTMLElement) => {\n contentRef = el as HTMLDivElement;\n })}\n // we make sure we're not trapping once it's been closed\n // (closed !== unmounted when animating out)\n trapFocus={context.open}\n disableOutsidePointerEvents\n onCloseAutoFocus={composeEventHandlers(local.onCloseAutoFocus, (event: Event) => {\n event.preventDefault();\n if (!isRightClickOutside) context.triggerRef?.focus();\n })}\n onPointerDownOutside={composeEventHandlers(\n local.onPointerDownOutside,\n (event: any) => {\n const originalEvent = event.detail.originalEvent;\n const ctrlLeftClick = originalEvent.button === 0 && originalEvent.ctrlKey === true;\n const isRightClick = originalEvent.button === 2 || ctrlLeftClick;\n isRightClickOutside = isRightClick;\n },\n )}\n // When focus is trapped, a `focusout` event may still happen.\n // We make sure we don't trigger our `onDismiss` in such case.\n onFocusOutside={composeEventHandlers(\n local.onFocusOutside,\n (event: Event) => event.preventDefault(),\n )}\n />\n );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * PopoverContentNonModal\n * -----------------------------------------------------------------------------------------------*/\n\nfunction PopoverContentNonModal(inProps: ScopedProps<PopoverContentTypeProps>) {\n const [local, rest] = splitProps(inProps, [\n '__scopePopover',\n 'onCloseAutoFocus',\n 'onInteractOutside',\n ]);\n const context = usePopoverContext(CONTENT_NAME, local.__scopePopover);\n let hasInteractedOutside = false;\n let hasPointerDownOutside = false;\n\n return (\n <PopoverContentImpl\n {...rest}\n __scopePopover={local.__scopePopover}\n trapFocus={false}\n disableOutsidePointerEvents={false}\n onCloseAutoFocus={(event: Event) => {\n local.onCloseAutoFocus?.(event);\n\n if (!event.defaultPrevented) {\n if (!hasInteractedOutside) context.triggerRef?.focus();\n // Always prevent auto focus because we either focus manually or want user agent focus\n event.preventDefault();\n }\n\n hasInteractedOutside = false;\n hasPointerDownOutside = false;\n }}\n onInteractOutside={(event: any) => {\n local.onInteractOutside?.(event);\n\n if (!event.defaultPrevented) {\n hasInteractedOutside = true;\n if (event.detail.originalEvent.type === 'pointerdown') {\n hasPointerDownOutside = true;\n }\n }\n\n // Prevent dismissing when clicking the trigger.\n // As the trigger is already setup to close, without doing so would\n // cause it to close and immediately open.\n const target = event.target as HTMLElement;\n const targetIsTrigger = context.triggerRef?.contains(target);\n if (targetIsTrigger) event.preventDefault();\n\n // On Safari if the trigger is inside a container with tabIndex={0}, when clicked\n // we will get the pointer down outside event on the trigger, but then a subsequent\n // focus outside event on the container, we ignore any focus outside event when we've\n // already had a pointer down outside event.\n if (event.detail.originalEvent.type === 'focusin' && hasPointerDownOutside) {\n event.preventDefault();\n }\n }}\n />\n );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * PopoverContentImpl\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PopoverContentImplProps extends JSX.HTMLAttributes<HTMLDivElement> {\n ref?: (el: HTMLElement) => void;\n side?: 'top' | 'right' | 'bottom' | 'left';\n sideOffset?: number;\n align?: 'start' | 'center' | 'end';\n alignOffset?: number;\n avoidCollisions?: boolean;\n collisionBoundary?: Element | Element[] | null;\n collisionPadding?: number | Partial<Record<'top' | 'right' | 'bottom' | 'left', number>>;\n arrowPadding?: number;\n sticky?: 'partial' | 'always';\n hideWhenDetached?: boolean;\n trapFocus?: boolean;\n onOpenAutoFocus?: (event: Event) => void;\n onCloseAutoFocus?: (event: Event) => void;\n disableOutsidePointerEvents?: boolean;\n onEscapeKeyDown?: (event: KeyboardEvent) => void;\n onPointerDownOutside?: (event: any) => void;\n onFocusOutside?: (event: any) => void;\n onInteractOutside?: (event: any) => void;\n}\n\nfunction PopoverContentImpl(inProps: ScopedProps<PopoverContentImplProps>) {\n const [local, rest] = splitProps(inProps, [\n '__scopePopover',\n 'ref',\n 'side',\n 'sideOffset',\n 'align',\n 'alignOffset',\n 'avoidCollisions',\n 'collisionBoundary',\n 'collisionPadding',\n 'arrowPadding',\n 'sticky',\n 'hideWhenDetached',\n 'trapFocus',\n 'onOpenAutoFocus',\n 'onCloseAutoFocus',\n 'disableOutsidePointerEvents',\n 'onEscapeKeyDown',\n 'onPointerDownOutside',\n 'onFocusOutside',\n 'onInteractOutside',\n 'style',\n ]);\n\n const context = usePopoverContext(CONTENT_NAME, local.__scopePopover);\n const popperScope = usePopperScope(local.__scopePopover);\n\n // Make sure the whole tree has focus guards as our `Popover` may be\n // the last element in the DOM (because of the `Portal`)\n useFocusGuards();\n\n return (\n <FocusScope\n loop\n trapped={local.trapFocus}\n onMountAutoFocus={local.onOpenAutoFocus}\n onUnmountAutoFocus={local.onCloseAutoFocus}\n >\n <DismissableLayer\n asChild\n disableOutsidePointerEvents={local.disableOutsidePointerEvents}\n onInteractOutside={local.onInteractOutside}\n onEscapeKeyDown={local.onEscapeKeyDown}\n onPointerDownOutside={local.onPointerDownOutside}\n onFocusOutside={local.onFocusOutside}\n onDismiss={() => context.onOpenChange(false)}\n >\n <PopperContent\n data-state={getState(context.open)}\n role=\"dialog\"\n id={context.contentId}\n {...popperScope}\n {...rest}\n ref={local.ref}\n side={local.side}\n sideOffset={local.sideOffset}\n align={local.align}\n alignOffset={local.alignOffset}\n avoidCollisions={local.avoidCollisions}\n collisionBoundary={local.collisionBoundary}\n collisionPadding={local.collisionPadding}\n arrowPadding={local.arrowPadding}\n sticky={local.sticky}\n hideWhenDetached={local.hideWhenDetached}\n style={{\n ...(typeof local.style === 'object' ? local.style : {}),\n // re-namespace exposed content custom properties\n '--radix-popover-content-transform-origin': 'var(--radix-popper-transform-origin)',\n '--radix-popover-content-available-width': 'var(--radix-popper-available-width)',\n '--radix-popover-content-available-height': 'var(--radix-popper-available-height)',\n '--radix-popover-trigger-width': 'var(--radix-popper-anchor-width)',\n '--radix-popover-trigger-height': 'var(--radix-popper-anchor-height)',\n } as JSX.CSSProperties}\n />\n </DismissableLayer>\n </FocusScope>\n );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * PopoverClose\n * -----------------------------------------------------------------------------------------------*/\n\nconst CLOSE_NAME = 'PopoverClose';\n\ninterface PopoverCloseProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {\n ref?: (el: HTMLElement) => void;\n}\n\nfunction PopoverClose(inProps: ScopedProps<PopoverCloseProps>) {\n const [local, rest] = splitProps(inProps, ['__scopePopover', 'ref']);\n const context = usePopoverContext(CLOSE_NAME, local.__scopePopover);\n\n return (\n <Primitive.button\n type=\"button\"\n {...rest}\n ref={local.ref}\n onClick={composeEventHandlers(rest.onClick as any, () => context.onOpenChange(false))}\n />\n );\n}\n\nPopoverClose.displayName = CLOSE_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * PopoverArrow\n * -----------------------------------------------------------------------------------------------*/\n\nconst ARROW_NAME = 'PopoverArrow';\n\ninterface PopoverArrowProps extends JSX.SvgSVGAttributes<SVGSVGElement> {\n ref?: (el: SVGSVGElement) => void;\n}\n\nfunction PopoverArrow(inProps: ScopedProps<PopoverArrowProps>) {\n const [local, rest] = splitProps(inProps, ['__scopePopover']);\n const popperScope = usePopperScope(local.__scopePopover);\n\n return <PopperArrow {...popperScope} {...rest} />;\n}\n\nPopoverArrow.displayName = ARROW_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * Utils\n * -----------------------------------------------------------------------------------------------*/\n\nfunction getState(open: boolean) {\n return open ? 'open' : 'closed';\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Exports\n * -----------------------------------------------------------------------------------------------*/\n\nconst Root = Popover;\nconst Anchor = PopoverAnchor;\nconst Trigger = PopoverTrigger;\nconst PortalExport = PopoverPortal;\nconst Content = PopoverContent;\nconst Close = PopoverClose;\nconst Arrow = PopoverArrow;\n\nexport {\n createPopoverScope,\n //\n Popover,\n PopoverAnchor,\n PopoverTrigger,\n PopoverPortal,\n PopoverContent,\n PopoverClose,\n PopoverArrow,\n //\n Root,\n Anchor,\n Trigger,\n PortalExport as Portal,\n Content,\n Close,\n Arrow,\n};\nexport type {\n PopoverProps,\n PopoverAnchorProps,\n PopoverTriggerProps,\n PopoverPortalProps,\n PopoverContentProps,\n PopoverCloseProps,\n PopoverArrowProps,\n};\n"]}
@@ -0,0 +1,93 @@
1
+ import * as _radix_solid_js_context from '@radix-solid-js/context';
2
+ import { Scope } from '@radix-solid-js/context';
3
+ import { JSX } from 'solid-js';
4
+
5
+ type ScopedProps<P> = P & {
6
+ __scopePopover?: Scope;
7
+ };
8
+ declare const createPopoverScope: _radix_solid_js_context.CreateScope;
9
+ interface PopoverProps {
10
+ children?: JSX.Element;
11
+ open?: boolean;
12
+ defaultOpen?: boolean;
13
+ onOpenChange?: (open: boolean) => void;
14
+ modal?: boolean;
15
+ }
16
+ declare function Popover(props: ScopedProps<PopoverProps>): JSX.Element;
17
+ declare namespace Popover {
18
+ var displayName: string;
19
+ }
20
+ interface PopoverAnchorProps extends JSX.HTMLAttributes<HTMLDivElement> {
21
+ ref?: (el: HTMLElement) => void;
22
+ }
23
+ declare function PopoverAnchor(inProps: ScopedProps<PopoverAnchorProps>): JSX.Element;
24
+ declare namespace PopoverAnchor {
25
+ var displayName: string;
26
+ }
27
+ interface PopoverTriggerProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {
28
+ ref?: (el: HTMLElement) => void;
29
+ }
30
+ declare function PopoverTrigger(inProps: ScopedProps<PopoverTriggerProps>): JSX.Element;
31
+ declare namespace PopoverTrigger {
32
+ var displayName: string;
33
+ }
34
+ interface PopoverPortalProps {
35
+ children?: JSX.Element;
36
+ container?: Element | DocumentFragment | null;
37
+ forceMount?: true;
38
+ }
39
+ declare function PopoverPortal(props: ScopedProps<PopoverPortalProps>): JSX.Element;
40
+ declare namespace PopoverPortal {
41
+ var displayName: string;
42
+ }
43
+ interface PopoverContentProps extends Omit<PopoverContentImplProps, 'trapFocus' | 'disableOutsidePointerEvents'> {
44
+ forceMount?: true;
45
+ }
46
+ declare function PopoverContent(inProps: ScopedProps<PopoverContentProps>): JSX.Element;
47
+ declare namespace PopoverContent {
48
+ var displayName: string;
49
+ }
50
+ interface PopoverContentImplProps extends JSX.HTMLAttributes<HTMLDivElement> {
51
+ ref?: (el: HTMLElement) => void;
52
+ side?: 'top' | 'right' | 'bottom' | 'left';
53
+ sideOffset?: number;
54
+ align?: 'start' | 'center' | 'end';
55
+ alignOffset?: number;
56
+ avoidCollisions?: boolean;
57
+ collisionBoundary?: Element | Element[] | null;
58
+ collisionPadding?: number | Partial<Record<'top' | 'right' | 'bottom' | 'left', number>>;
59
+ arrowPadding?: number;
60
+ sticky?: 'partial' | 'always';
61
+ hideWhenDetached?: boolean;
62
+ trapFocus?: boolean;
63
+ onOpenAutoFocus?: (event: Event) => void;
64
+ onCloseAutoFocus?: (event: Event) => void;
65
+ disableOutsidePointerEvents?: boolean;
66
+ onEscapeKeyDown?: (event: KeyboardEvent) => void;
67
+ onPointerDownOutside?: (event: any) => void;
68
+ onFocusOutside?: (event: any) => void;
69
+ onInteractOutside?: (event: any) => void;
70
+ }
71
+ interface PopoverCloseProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {
72
+ ref?: (el: HTMLElement) => void;
73
+ }
74
+ declare function PopoverClose(inProps: ScopedProps<PopoverCloseProps>): JSX.Element;
75
+ declare namespace PopoverClose {
76
+ var displayName: string;
77
+ }
78
+ interface PopoverArrowProps extends JSX.SvgSVGAttributes<SVGSVGElement> {
79
+ ref?: (el: SVGSVGElement) => void;
80
+ }
81
+ declare function PopoverArrow(inProps: ScopedProps<PopoverArrowProps>): JSX.Element;
82
+ declare namespace PopoverArrow {
83
+ var displayName: string;
84
+ }
85
+ declare const Root: typeof Popover;
86
+ declare const Anchor: typeof PopoverAnchor;
87
+ declare const Trigger: typeof PopoverTrigger;
88
+ declare const PortalExport: typeof PopoverPortal;
89
+ declare const Content: typeof PopoverContent;
90
+ declare const Close: typeof PopoverClose;
91
+ declare const Arrow: typeof PopoverArrow;
92
+
93
+ export { Anchor, Arrow, Close, Content, Popover, PopoverAnchor, type PopoverAnchorProps, PopoverArrow, type PopoverArrowProps, PopoverClose, type PopoverCloseProps, PopoverContent, type PopoverContentProps, PopoverPortal, type PopoverPortalProps, type PopoverProps, PopoverTrigger, type PopoverTriggerProps, PortalExport as Portal, Root, Trigger, createPopoverScope };
@@ -0,0 +1,93 @@
1
+ import * as _radix_solid_js_context from '@radix-solid-js/context';
2
+ import { Scope } from '@radix-solid-js/context';
3
+ import { JSX } from 'solid-js';
4
+
5
+ type ScopedProps<P> = P & {
6
+ __scopePopover?: Scope;
7
+ };
8
+ declare const createPopoverScope: _radix_solid_js_context.CreateScope;
9
+ interface PopoverProps {
10
+ children?: JSX.Element;
11
+ open?: boolean;
12
+ defaultOpen?: boolean;
13
+ onOpenChange?: (open: boolean) => void;
14
+ modal?: boolean;
15
+ }
16
+ declare function Popover(props: ScopedProps<PopoverProps>): JSX.Element;
17
+ declare namespace Popover {
18
+ var displayName: string;
19
+ }
20
+ interface PopoverAnchorProps extends JSX.HTMLAttributes<HTMLDivElement> {
21
+ ref?: (el: HTMLElement) => void;
22
+ }
23
+ declare function PopoverAnchor(inProps: ScopedProps<PopoverAnchorProps>): JSX.Element;
24
+ declare namespace PopoverAnchor {
25
+ var displayName: string;
26
+ }
27
+ interface PopoverTriggerProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {
28
+ ref?: (el: HTMLElement) => void;
29
+ }
30
+ declare function PopoverTrigger(inProps: ScopedProps<PopoverTriggerProps>): JSX.Element;
31
+ declare namespace PopoverTrigger {
32
+ var displayName: string;
33
+ }
34
+ interface PopoverPortalProps {
35
+ children?: JSX.Element;
36
+ container?: Element | DocumentFragment | null;
37
+ forceMount?: true;
38
+ }
39
+ declare function PopoverPortal(props: ScopedProps<PopoverPortalProps>): JSX.Element;
40
+ declare namespace PopoverPortal {
41
+ var displayName: string;
42
+ }
43
+ interface PopoverContentProps extends Omit<PopoverContentImplProps, 'trapFocus' | 'disableOutsidePointerEvents'> {
44
+ forceMount?: true;
45
+ }
46
+ declare function PopoverContent(inProps: ScopedProps<PopoverContentProps>): JSX.Element;
47
+ declare namespace PopoverContent {
48
+ var displayName: string;
49
+ }
50
+ interface PopoverContentImplProps extends JSX.HTMLAttributes<HTMLDivElement> {
51
+ ref?: (el: HTMLElement) => void;
52
+ side?: 'top' | 'right' | 'bottom' | 'left';
53
+ sideOffset?: number;
54
+ align?: 'start' | 'center' | 'end';
55
+ alignOffset?: number;
56
+ avoidCollisions?: boolean;
57
+ collisionBoundary?: Element | Element[] | null;
58
+ collisionPadding?: number | Partial<Record<'top' | 'right' | 'bottom' | 'left', number>>;
59
+ arrowPadding?: number;
60
+ sticky?: 'partial' | 'always';
61
+ hideWhenDetached?: boolean;
62
+ trapFocus?: boolean;
63
+ onOpenAutoFocus?: (event: Event) => void;
64
+ onCloseAutoFocus?: (event: Event) => void;
65
+ disableOutsidePointerEvents?: boolean;
66
+ onEscapeKeyDown?: (event: KeyboardEvent) => void;
67
+ onPointerDownOutside?: (event: any) => void;
68
+ onFocusOutside?: (event: any) => void;
69
+ onInteractOutside?: (event: any) => void;
70
+ }
71
+ interface PopoverCloseProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {
72
+ ref?: (el: HTMLElement) => void;
73
+ }
74
+ declare function PopoverClose(inProps: ScopedProps<PopoverCloseProps>): JSX.Element;
75
+ declare namespace PopoverClose {
76
+ var displayName: string;
77
+ }
78
+ interface PopoverArrowProps extends JSX.SvgSVGAttributes<SVGSVGElement> {
79
+ ref?: (el: SVGSVGElement) => void;
80
+ }
81
+ declare function PopoverArrow(inProps: ScopedProps<PopoverArrowProps>): JSX.Element;
82
+ declare namespace PopoverArrow {
83
+ var displayName: string;
84
+ }
85
+ declare const Root: typeof Popover;
86
+ declare const Anchor: typeof PopoverAnchor;
87
+ declare const Trigger: typeof PopoverTrigger;
88
+ declare const PortalExport: typeof PopoverPortal;
89
+ declare const Content: typeof PopoverContent;
90
+ declare const Close: typeof PopoverClose;
91
+ declare const Arrow: typeof PopoverArrow;
92
+
93
+ export { Anchor, Arrow, Close, Content, Popover, PopoverAnchor, type PopoverAnchorProps, PopoverArrow, type PopoverArrowProps, PopoverClose, type PopoverCloseProps, PopoverContent, type PopoverContentProps, PopoverPortal, type PopoverPortalProps, type PopoverProps, PopoverTrigger, type PopoverTriggerProps, PortalExport as Portal, Root, Trigger, createPopoverScope };
package/dist/index.js ADDED
@@ -0,0 +1,323 @@
1
+ import { splitProps, createSignal, createEffect, onCleanup, Show } from 'solid-js';
2
+ import { composeEventHandlers } from '@radix-solid-js/primitive';
3
+ import { mergeRefs } from '@radix-solid-js/compose-refs';
4
+ import { createContextScope } from '@radix-solid-js/context';
5
+ import { DismissableLayer } from '@radix-solid-js/dismissable-layer';
6
+ import { useFocusGuards } from '@radix-solid-js/focus-guards';
7
+ import { FocusScope } from '@radix-solid-js/focus-scope';
8
+ import { createId } from '@radix-solid-js/id';
9
+ import { createPopperScope, Popper, PopperAnchor, PopperContent, PopperArrow } from '@radix-solid-js/popper';
10
+ import { Portal } from '@radix-solid-js/portal';
11
+ import { Presence } from '@radix-solid-js/presence';
12
+ import { Primitive } from '@radix-solid-js/primitive-component';
13
+ import { createControllableSignal } from '@radix-solid-js/use-controllable-state';
14
+ import { hideOthers } from 'aria-hidden';
15
+
16
+ // src/popover.tsx
17
+ var POPOVER_NAME = "Popover";
18
+ var [createPopoverContext, createPopoverScope] = createContextScope(POPOVER_NAME, [
19
+ createPopperScope
20
+ ]);
21
+ var usePopperScope = createPopperScope();
22
+ var [PopoverProvider, usePopoverContext] = createPopoverContext(POPOVER_NAME);
23
+ function Popover(props) {
24
+ const [local] = splitProps(props, [
25
+ "__scopePopover",
26
+ "children",
27
+ "open",
28
+ "defaultOpen",
29
+ "onOpenChange",
30
+ "modal"
31
+ ]);
32
+ const popperScope = usePopperScope(local.__scopePopover);
33
+ const [triggerRef, setTriggerRef] = createSignal(null);
34
+ const [hasCustomAnchor, setHasCustomAnchor] = createSignal(false);
35
+ const contentId = createId();
36
+ const [open, setOpen] = createControllableSignal({
37
+ prop: () => local.open,
38
+ defaultProp: local.defaultOpen ?? false,
39
+ onChange: (value) => local.onOpenChange?.(value)
40
+ });
41
+ const modal = () => local.modal ?? false;
42
+ return /* @__PURE__ */ React.createElement(Popper, { ...popperScope }, /* @__PURE__ */ React.createElement(
43
+ PopoverProvider,
44
+ {
45
+ scope: local.__scopePopover,
46
+ contentId,
47
+ triggerRef: triggerRef(),
48
+ onTriggerRefChange: setTriggerRef,
49
+ open: open(),
50
+ onOpenChange: setOpen,
51
+ onOpenToggle: () => setOpen((prev) => !prev),
52
+ hasCustomAnchor: hasCustomAnchor(),
53
+ onCustomAnchorAdd: () => setHasCustomAnchor(true),
54
+ onCustomAnchorRemove: () => setHasCustomAnchor(false),
55
+ modal: modal()
56
+ },
57
+ local.children
58
+ ));
59
+ }
60
+ Popover.displayName = POPOVER_NAME;
61
+ var ANCHOR_NAME = "PopoverAnchor";
62
+ function PopoverAnchor(inProps) {
63
+ const [local, rest] = splitProps(inProps, ["__scopePopover", "ref"]);
64
+ const context = usePopoverContext(ANCHOR_NAME, local.__scopePopover);
65
+ const popperScope = usePopperScope(local.__scopePopover);
66
+ createEffect(() => {
67
+ context.onCustomAnchorAdd();
68
+ onCleanup(() => context.onCustomAnchorRemove());
69
+ });
70
+ return /* @__PURE__ */ React.createElement(PopperAnchor, { ...popperScope, ...rest, ref: local.ref });
71
+ }
72
+ PopoverAnchor.displayName = ANCHOR_NAME;
73
+ var TRIGGER_NAME = "PopoverTrigger";
74
+ function PopoverTrigger(inProps) {
75
+ const [local, rest] = splitProps(inProps, ["__scopePopover", "ref"]);
76
+ const context = usePopoverContext(TRIGGER_NAME, local.__scopePopover);
77
+ const popperScope = usePopperScope(local.__scopePopover);
78
+ const trigger = /* @__PURE__ */ React.createElement(
79
+ Primitive.button,
80
+ {
81
+ type: "button",
82
+ "aria-haspopup": "dialog",
83
+ "aria-expanded": context.open,
84
+ "aria-controls": context.contentId,
85
+ "data-state": getState(context.open),
86
+ ...rest,
87
+ ref: mergeRefs(local.ref, (el) => context.onTriggerRefChange(el)),
88
+ onClick: composeEventHandlers(rest.onClick, context.onOpenToggle)
89
+ }
90
+ );
91
+ return /* @__PURE__ */ React.createElement(Show, { when: context.hasCustomAnchor, fallback: /* @__PURE__ */ React.createElement(PopperAnchor, { ...popperScope }, trigger) }, trigger);
92
+ }
93
+ PopoverTrigger.displayName = TRIGGER_NAME;
94
+ var PORTAL_NAME = "PopoverPortal";
95
+ var [PortalProvider, usePortalContext] = createPopoverContext(PORTAL_NAME, {
96
+ forceMount: void 0
97
+ });
98
+ function PopoverPortal(props) {
99
+ const [local] = splitProps(props, ["__scopePopover", "forceMount", "children", "container"]);
100
+ return /* @__PURE__ */ React.createElement(PortalProvider, { scope: local.__scopePopover, forceMount: local.forceMount }, /* @__PURE__ */ React.createElement(Portal, { container: local.container }, local.children));
101
+ }
102
+ PopoverPortal.displayName = PORTAL_NAME;
103
+ var CONTENT_NAME = "PopoverContent";
104
+ function PopoverContent(inProps) {
105
+ const [local, rest] = splitProps(inProps, ["__scopePopover", "forceMount"]);
106
+ const portalContext = usePortalContext(CONTENT_NAME, local.__scopePopover);
107
+ const context = usePopoverContext(CONTENT_NAME, local.__scopePopover);
108
+ const forceMount = () => local.forceMount ?? portalContext.forceMount;
109
+ return /* @__PURE__ */ React.createElement(Presence, { present: forceMount() || context.open }, /* @__PURE__ */ React.createElement(
110
+ Show,
111
+ {
112
+ when: context.modal,
113
+ fallback: /* @__PURE__ */ React.createElement(PopoverContentNonModal, { ...rest, __scopePopover: local.__scopePopover })
114
+ },
115
+ /* @__PURE__ */ React.createElement(PopoverContentModal, { ...rest, __scopePopover: local.__scopePopover })
116
+ ));
117
+ }
118
+ PopoverContent.displayName = CONTENT_NAME;
119
+ function PopoverContentModal(inProps) {
120
+ const [local, rest] = splitProps(inProps, [
121
+ "__scopePopover",
122
+ "ref",
123
+ "onCloseAutoFocus",
124
+ "onPointerDownOutside",
125
+ "onFocusOutside"
126
+ ]);
127
+ const context = usePopoverContext(CONTENT_NAME, local.__scopePopover);
128
+ let contentRef;
129
+ let isRightClickOutside = false;
130
+ createEffect(() => {
131
+ if (contentRef) {
132
+ const cleanup = hideOthers(contentRef);
133
+ onCleanup(() => cleanup?.());
134
+ }
135
+ });
136
+ return /* @__PURE__ */ React.createElement(
137
+ PopoverContentImpl,
138
+ {
139
+ ...rest,
140
+ __scopePopover: local.__scopePopover,
141
+ ref: mergeRefs(local.ref, (el) => {
142
+ contentRef = el;
143
+ }),
144
+ trapFocus: context.open,
145
+ disableOutsidePointerEvents: true,
146
+ onCloseAutoFocus: composeEventHandlers(local.onCloseAutoFocus, (event) => {
147
+ event.preventDefault();
148
+ if (!isRightClickOutside) context.triggerRef?.focus();
149
+ }),
150
+ onPointerDownOutside: composeEventHandlers(
151
+ local.onPointerDownOutside,
152
+ (event) => {
153
+ const originalEvent = event.detail.originalEvent;
154
+ const ctrlLeftClick = originalEvent.button === 0 && originalEvent.ctrlKey === true;
155
+ const isRightClick = originalEvent.button === 2 || ctrlLeftClick;
156
+ isRightClickOutside = isRightClick;
157
+ }
158
+ ),
159
+ onFocusOutside: composeEventHandlers(
160
+ local.onFocusOutside,
161
+ (event) => event.preventDefault()
162
+ )
163
+ }
164
+ );
165
+ }
166
+ function PopoverContentNonModal(inProps) {
167
+ const [local, rest] = splitProps(inProps, [
168
+ "__scopePopover",
169
+ "onCloseAutoFocus",
170
+ "onInteractOutside"
171
+ ]);
172
+ const context = usePopoverContext(CONTENT_NAME, local.__scopePopover);
173
+ let hasInteractedOutside = false;
174
+ let hasPointerDownOutside = false;
175
+ return /* @__PURE__ */ React.createElement(
176
+ PopoverContentImpl,
177
+ {
178
+ ...rest,
179
+ __scopePopover: local.__scopePopover,
180
+ trapFocus: false,
181
+ disableOutsidePointerEvents: false,
182
+ onCloseAutoFocus: (event) => {
183
+ local.onCloseAutoFocus?.(event);
184
+ if (!event.defaultPrevented) {
185
+ if (!hasInteractedOutside) context.triggerRef?.focus();
186
+ event.preventDefault();
187
+ }
188
+ hasInteractedOutside = false;
189
+ hasPointerDownOutside = false;
190
+ },
191
+ onInteractOutside: (event) => {
192
+ local.onInteractOutside?.(event);
193
+ if (!event.defaultPrevented) {
194
+ hasInteractedOutside = true;
195
+ if (event.detail.originalEvent.type === "pointerdown") {
196
+ hasPointerDownOutside = true;
197
+ }
198
+ }
199
+ const target = event.target;
200
+ const targetIsTrigger = context.triggerRef?.contains(target);
201
+ if (targetIsTrigger) event.preventDefault();
202
+ if (event.detail.originalEvent.type === "focusin" && hasPointerDownOutside) {
203
+ event.preventDefault();
204
+ }
205
+ }
206
+ }
207
+ );
208
+ }
209
+ function PopoverContentImpl(inProps) {
210
+ const [local, rest] = splitProps(inProps, [
211
+ "__scopePopover",
212
+ "ref",
213
+ "side",
214
+ "sideOffset",
215
+ "align",
216
+ "alignOffset",
217
+ "avoidCollisions",
218
+ "collisionBoundary",
219
+ "collisionPadding",
220
+ "arrowPadding",
221
+ "sticky",
222
+ "hideWhenDetached",
223
+ "trapFocus",
224
+ "onOpenAutoFocus",
225
+ "onCloseAutoFocus",
226
+ "disableOutsidePointerEvents",
227
+ "onEscapeKeyDown",
228
+ "onPointerDownOutside",
229
+ "onFocusOutside",
230
+ "onInteractOutside",
231
+ "style"
232
+ ]);
233
+ const context = usePopoverContext(CONTENT_NAME, local.__scopePopover);
234
+ const popperScope = usePopperScope(local.__scopePopover);
235
+ useFocusGuards();
236
+ return /* @__PURE__ */ React.createElement(
237
+ FocusScope,
238
+ {
239
+ loop: true,
240
+ trapped: local.trapFocus,
241
+ onMountAutoFocus: local.onOpenAutoFocus,
242
+ onUnmountAutoFocus: local.onCloseAutoFocus
243
+ },
244
+ /* @__PURE__ */ React.createElement(
245
+ DismissableLayer,
246
+ {
247
+ asChild: true,
248
+ disableOutsidePointerEvents: local.disableOutsidePointerEvents,
249
+ onInteractOutside: local.onInteractOutside,
250
+ onEscapeKeyDown: local.onEscapeKeyDown,
251
+ onPointerDownOutside: local.onPointerDownOutside,
252
+ onFocusOutside: local.onFocusOutside,
253
+ onDismiss: () => context.onOpenChange(false)
254
+ },
255
+ /* @__PURE__ */ React.createElement(
256
+ PopperContent,
257
+ {
258
+ "data-state": getState(context.open),
259
+ role: "dialog",
260
+ id: context.contentId,
261
+ ...popperScope,
262
+ ...rest,
263
+ ref: local.ref,
264
+ side: local.side,
265
+ sideOffset: local.sideOffset,
266
+ align: local.align,
267
+ alignOffset: local.alignOffset,
268
+ avoidCollisions: local.avoidCollisions,
269
+ collisionBoundary: local.collisionBoundary,
270
+ collisionPadding: local.collisionPadding,
271
+ arrowPadding: local.arrowPadding,
272
+ sticky: local.sticky,
273
+ hideWhenDetached: local.hideWhenDetached,
274
+ style: {
275
+ ...typeof local.style === "object" ? local.style : {},
276
+ // re-namespace exposed content custom properties
277
+ "--radix-popover-content-transform-origin": "var(--radix-popper-transform-origin)",
278
+ "--radix-popover-content-available-width": "var(--radix-popper-available-width)",
279
+ "--radix-popover-content-available-height": "var(--radix-popper-available-height)",
280
+ "--radix-popover-trigger-width": "var(--radix-popper-anchor-width)",
281
+ "--radix-popover-trigger-height": "var(--radix-popper-anchor-height)"
282
+ }
283
+ }
284
+ )
285
+ )
286
+ );
287
+ }
288
+ var CLOSE_NAME = "PopoverClose";
289
+ function PopoverClose(inProps) {
290
+ const [local, rest] = splitProps(inProps, ["__scopePopover", "ref"]);
291
+ const context = usePopoverContext(CLOSE_NAME, local.__scopePopover);
292
+ return /* @__PURE__ */ React.createElement(
293
+ Primitive.button,
294
+ {
295
+ type: "button",
296
+ ...rest,
297
+ ref: local.ref,
298
+ onClick: composeEventHandlers(rest.onClick, () => context.onOpenChange(false))
299
+ }
300
+ );
301
+ }
302
+ PopoverClose.displayName = CLOSE_NAME;
303
+ var ARROW_NAME = "PopoverArrow";
304
+ function PopoverArrow(inProps) {
305
+ const [local, rest] = splitProps(inProps, ["__scopePopover"]);
306
+ const popperScope = usePopperScope(local.__scopePopover);
307
+ return /* @__PURE__ */ React.createElement(PopperArrow, { ...popperScope, ...rest });
308
+ }
309
+ PopoverArrow.displayName = ARROW_NAME;
310
+ function getState(open) {
311
+ return open ? "open" : "closed";
312
+ }
313
+ var Root = Popover;
314
+ var Anchor = PopoverAnchor;
315
+ var Trigger = PopoverTrigger;
316
+ var PortalExport = PopoverPortal;
317
+ var Content = PopoverContent;
318
+ var Close = PopoverClose;
319
+ var Arrow = PopoverArrow;
320
+
321
+ export { Anchor, Arrow, Close, Content, Popover, PopoverAnchor, PopoverArrow, PopoverClose, PopoverContent, PopoverPortal, PopoverTrigger, PortalExport as Portal, Root, Trigger, createPopoverScope };
322
+ //# sourceMappingURL=index.js.map
323
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/popover.tsx"],"names":["PortalPrimitive"],"mappings":"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","file":"index.js","sourcesContent":["import {\n type JSX,\n createSignal,\n createEffect,\n onCleanup,\n splitProps,\n Show,\n} from 'solid-js';\nimport { composeEventHandlers } from '@radix-solid-js/primitive';\nimport { mergeRefs } from '@radix-solid-js/compose-refs';\nimport { createContextScope, type Scope } from '@radix-solid-js/context';\nimport { DismissableLayer } from '@radix-solid-js/dismissable-layer';\nimport { useFocusGuards } from '@radix-solid-js/focus-guards';\nimport { FocusScope } from '@radix-solid-js/focus-scope';\nimport { createId } from '@radix-solid-js/id';\nimport {\n createPopperScope,\n Popper,\n PopperAnchor,\n PopperContent,\n PopperArrow,\n} from '@radix-solid-js/popper';\nimport { Portal as PortalPrimitive } from '@radix-solid-js/portal';\nimport { Presence } from '@radix-solid-js/presence';\nimport { Primitive } from '@radix-solid-js/primitive-component';\nimport { createControllableSignal } from '@radix-solid-js/use-controllable-state';\nimport { hideOthers } from 'aria-hidden';\n\n/* -------------------------------------------------------------------------------------------------\n * Popover\n * -----------------------------------------------------------------------------------------------*/\n\nconst POPOVER_NAME = 'Popover';\n\ntype ScopedProps<P> = P & { __scopePopover?: Scope };\nconst [createPopoverContext, createPopoverScope] = createContextScope(POPOVER_NAME, [\n createPopperScope,\n]);\nconst usePopperScope = createPopperScope();\n\ntype PopoverContextValue = {\n triggerRef: HTMLButtonElement | null;\n onTriggerRefChange: (el: HTMLButtonElement | null) => void;\n contentId: string;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onOpenToggle: () => void;\n hasCustomAnchor: boolean;\n onCustomAnchorAdd: () => void;\n onCustomAnchorRemove: () => void;\n modal: boolean;\n};\n\nconst [PopoverProvider, usePopoverContext] =\n createPopoverContext<PopoverContextValue>(POPOVER_NAME);\n\ninterface PopoverProps {\n children?: JSX.Element;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n modal?: boolean;\n}\n\nfunction Popover(props: ScopedProps<PopoverProps>) {\n const [local] = splitProps(props, [\n '__scopePopover',\n 'children',\n 'open',\n 'defaultOpen',\n 'onOpenChange',\n 'modal',\n ]);\n\n const popperScope = usePopperScope(local.__scopePopover);\n const [triggerRef, setTriggerRef] = createSignal<HTMLButtonElement | null>(null);\n const [hasCustomAnchor, setHasCustomAnchor] = createSignal(false);\n const contentId = createId();\n\n const [open, setOpen] = createControllableSignal({\n prop: () => local.open,\n defaultProp: local.defaultOpen ?? false,\n onChange: (value) => local.onOpenChange?.(value),\n });\n\n const modal = () => local.modal ?? false;\n\n return (\n <Popper {...popperScope}>\n <PopoverProvider\n scope={local.__scopePopover}\n contentId={contentId}\n triggerRef={triggerRef()}\n onTriggerRefChange={setTriggerRef}\n open={open()}\n onOpenChange={setOpen}\n onOpenToggle={() => setOpen((prev) => !prev)}\n hasCustomAnchor={hasCustomAnchor()}\n onCustomAnchorAdd={() => setHasCustomAnchor(true)}\n onCustomAnchorRemove={() => setHasCustomAnchor(false)}\n modal={modal()}\n >\n {local.children}\n </PopoverProvider>\n </Popper>\n );\n}\n\nPopover.displayName = POPOVER_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * PopoverAnchor\n * -----------------------------------------------------------------------------------------------*/\n\nconst ANCHOR_NAME = 'PopoverAnchor';\n\ninterface PopoverAnchorProps extends JSX.HTMLAttributes<HTMLDivElement> {\n ref?: (el: HTMLElement) => void;\n}\n\nfunction PopoverAnchor(inProps: ScopedProps<PopoverAnchorProps>) {\n const [local, rest] = splitProps(inProps, ['__scopePopover', 'ref']);\n const context = usePopoverContext(ANCHOR_NAME, local.__scopePopover);\n const popperScope = usePopperScope(local.__scopePopover);\n\n // Notify the root that a custom anchor has been added\n createEffect(() => {\n context.onCustomAnchorAdd();\n onCleanup(() => context.onCustomAnchorRemove());\n });\n\n return <PopperAnchor {...popperScope} {...rest} ref={local.ref} />;\n}\n\nPopoverAnchor.displayName = ANCHOR_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * PopoverTrigger\n * -----------------------------------------------------------------------------------------------*/\n\nconst TRIGGER_NAME = 'PopoverTrigger';\n\ninterface PopoverTriggerProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {\n ref?: (el: HTMLElement) => void;\n}\n\nfunction PopoverTrigger(inProps: ScopedProps<PopoverTriggerProps>) {\n const [local, rest] = splitProps(inProps, ['__scopePopover', 'ref']);\n const context = usePopoverContext(TRIGGER_NAME, local.__scopePopover);\n const popperScope = usePopperScope(local.__scopePopover);\n\n const trigger = (\n <Primitive.button\n type=\"button\"\n aria-haspopup=\"dialog\"\n aria-expanded={context.open}\n aria-controls={context.contentId}\n data-state={getState(context.open)}\n {...rest}\n ref={mergeRefs(local.ref, (el: HTMLElement) => context.onTriggerRefChange(el as HTMLButtonElement))}\n onClick={composeEventHandlers(rest.onClick as any, context.onOpenToggle)}\n />\n );\n\n return (\n <Show when={context.hasCustomAnchor} fallback={\n <PopperAnchor {...popperScope}>\n {trigger}\n </PopperAnchor>\n }>\n {trigger}\n </Show>\n );\n}\n\nPopoverTrigger.displayName = TRIGGER_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * PopoverPortal\n * -----------------------------------------------------------------------------------------------*/\n\nconst PORTAL_NAME = 'PopoverPortal';\n\ntype PortalContextValue = { forceMount?: true };\nconst [PortalProvider, usePortalContext] = createPopoverContext<PortalContextValue>(PORTAL_NAME, {\n forceMount: undefined,\n});\n\ninterface PopoverPortalProps {\n children?: JSX.Element;\n container?: Element | DocumentFragment | null;\n forceMount?: true;\n}\n\nfunction PopoverPortal(props: ScopedProps<PopoverPortalProps>) {\n const [local] = splitProps(props, ['__scopePopover', 'forceMount', 'children', 'container']);\n\n // Portal is always mounted — visibility is controlled by Presence in PopoverContent.\n // This avoids the dual-Presence problem where the outer Presence would unmount\n // the portal before the inner exit animation completes.\n return (\n <PortalProvider scope={local.__scopePopover} forceMount={local.forceMount}>\n <PortalPrimitive container={local.container}>\n {local.children}\n </PortalPrimitive>\n </PortalProvider>\n );\n}\n\nPopoverPortal.displayName = PORTAL_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * PopoverContent\n * -----------------------------------------------------------------------------------------------*/\n\nconst CONTENT_NAME = 'PopoverContent';\n\ninterface PopoverContentProps extends Omit<PopoverContentImplProps, 'trapFocus' | 'disableOutsidePointerEvents'> {\n forceMount?: true;\n}\n\nfunction PopoverContent(inProps: ScopedProps<PopoverContentProps>) {\n const [local, rest] = splitProps(inProps, ['__scopePopover', 'forceMount']);\n const portalContext = usePortalContext(CONTENT_NAME, local.__scopePopover);\n const context = usePopoverContext(CONTENT_NAME, local.__scopePopover);\n const forceMount = () => local.forceMount ?? portalContext.forceMount;\n\n return (\n <Presence present={forceMount() || context.open}>\n <Show\n when={context.modal}\n fallback={<PopoverContentNonModal {...rest} __scopePopover={local.__scopePopover} />}\n >\n <PopoverContentModal {...rest} __scopePopover={local.__scopePopover} />\n </Show>\n </Presence>\n );\n}\n\nPopoverContent.displayName = CONTENT_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * PopoverContentModal\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PopoverContentTypeProps\n extends Omit<PopoverContentImplProps, 'trapFocus' | 'disableOutsidePointerEvents'> {}\n\nfunction PopoverContentModal(inProps: ScopedProps<PopoverContentTypeProps>) {\n const [local, rest] = splitProps(inProps, [\n '__scopePopover',\n 'ref',\n 'onCloseAutoFocus',\n 'onPointerDownOutside',\n 'onFocusOutside',\n ]);\n const context = usePopoverContext(CONTENT_NAME, local.__scopePopover);\n let contentRef: HTMLDivElement | undefined;\n let isRightClickOutside = false;\n\n // aria-hide everything except the content (better supported equivalent to setting aria-modal)\n createEffect(() => {\n if (contentRef) {\n const cleanup = hideOthers(contentRef);\n onCleanup(() => cleanup?.());\n }\n });\n\n return (\n <PopoverContentImpl\n {...rest}\n __scopePopover={local.__scopePopover}\n ref={mergeRefs(local.ref, (el: HTMLElement) => {\n contentRef = el as HTMLDivElement;\n })}\n // we make sure we're not trapping once it's been closed\n // (closed !== unmounted when animating out)\n trapFocus={context.open}\n disableOutsidePointerEvents\n onCloseAutoFocus={composeEventHandlers(local.onCloseAutoFocus, (event: Event) => {\n event.preventDefault();\n if (!isRightClickOutside) context.triggerRef?.focus();\n })}\n onPointerDownOutside={composeEventHandlers(\n local.onPointerDownOutside,\n (event: any) => {\n const originalEvent = event.detail.originalEvent;\n const ctrlLeftClick = originalEvent.button === 0 && originalEvent.ctrlKey === true;\n const isRightClick = originalEvent.button === 2 || ctrlLeftClick;\n isRightClickOutside = isRightClick;\n },\n )}\n // When focus is trapped, a `focusout` event may still happen.\n // We make sure we don't trigger our `onDismiss` in such case.\n onFocusOutside={composeEventHandlers(\n local.onFocusOutside,\n (event: Event) => event.preventDefault(),\n )}\n />\n );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * PopoverContentNonModal\n * -----------------------------------------------------------------------------------------------*/\n\nfunction PopoverContentNonModal(inProps: ScopedProps<PopoverContentTypeProps>) {\n const [local, rest] = splitProps(inProps, [\n '__scopePopover',\n 'onCloseAutoFocus',\n 'onInteractOutside',\n ]);\n const context = usePopoverContext(CONTENT_NAME, local.__scopePopover);\n let hasInteractedOutside = false;\n let hasPointerDownOutside = false;\n\n return (\n <PopoverContentImpl\n {...rest}\n __scopePopover={local.__scopePopover}\n trapFocus={false}\n disableOutsidePointerEvents={false}\n onCloseAutoFocus={(event: Event) => {\n local.onCloseAutoFocus?.(event);\n\n if (!event.defaultPrevented) {\n if (!hasInteractedOutside) context.triggerRef?.focus();\n // Always prevent auto focus because we either focus manually or want user agent focus\n event.preventDefault();\n }\n\n hasInteractedOutside = false;\n hasPointerDownOutside = false;\n }}\n onInteractOutside={(event: any) => {\n local.onInteractOutside?.(event);\n\n if (!event.defaultPrevented) {\n hasInteractedOutside = true;\n if (event.detail.originalEvent.type === 'pointerdown') {\n hasPointerDownOutside = true;\n }\n }\n\n // Prevent dismissing when clicking the trigger.\n // As the trigger is already setup to close, without doing so would\n // cause it to close and immediately open.\n const target = event.target as HTMLElement;\n const targetIsTrigger = context.triggerRef?.contains(target);\n if (targetIsTrigger) event.preventDefault();\n\n // On Safari if the trigger is inside a container with tabIndex={0}, when clicked\n // we will get the pointer down outside event on the trigger, but then a subsequent\n // focus outside event on the container, we ignore any focus outside event when we've\n // already had a pointer down outside event.\n if (event.detail.originalEvent.type === 'focusin' && hasPointerDownOutside) {\n event.preventDefault();\n }\n }}\n />\n );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * PopoverContentImpl\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PopoverContentImplProps extends JSX.HTMLAttributes<HTMLDivElement> {\n ref?: (el: HTMLElement) => void;\n side?: 'top' | 'right' | 'bottom' | 'left';\n sideOffset?: number;\n align?: 'start' | 'center' | 'end';\n alignOffset?: number;\n avoidCollisions?: boolean;\n collisionBoundary?: Element | Element[] | null;\n collisionPadding?: number | Partial<Record<'top' | 'right' | 'bottom' | 'left', number>>;\n arrowPadding?: number;\n sticky?: 'partial' | 'always';\n hideWhenDetached?: boolean;\n trapFocus?: boolean;\n onOpenAutoFocus?: (event: Event) => void;\n onCloseAutoFocus?: (event: Event) => void;\n disableOutsidePointerEvents?: boolean;\n onEscapeKeyDown?: (event: KeyboardEvent) => void;\n onPointerDownOutside?: (event: any) => void;\n onFocusOutside?: (event: any) => void;\n onInteractOutside?: (event: any) => void;\n}\n\nfunction PopoverContentImpl(inProps: ScopedProps<PopoverContentImplProps>) {\n const [local, rest] = splitProps(inProps, [\n '__scopePopover',\n 'ref',\n 'side',\n 'sideOffset',\n 'align',\n 'alignOffset',\n 'avoidCollisions',\n 'collisionBoundary',\n 'collisionPadding',\n 'arrowPadding',\n 'sticky',\n 'hideWhenDetached',\n 'trapFocus',\n 'onOpenAutoFocus',\n 'onCloseAutoFocus',\n 'disableOutsidePointerEvents',\n 'onEscapeKeyDown',\n 'onPointerDownOutside',\n 'onFocusOutside',\n 'onInteractOutside',\n 'style',\n ]);\n\n const context = usePopoverContext(CONTENT_NAME, local.__scopePopover);\n const popperScope = usePopperScope(local.__scopePopover);\n\n // Make sure the whole tree has focus guards as our `Popover` may be\n // the last element in the DOM (because of the `Portal`)\n useFocusGuards();\n\n return (\n <FocusScope\n loop\n trapped={local.trapFocus}\n onMountAutoFocus={local.onOpenAutoFocus}\n onUnmountAutoFocus={local.onCloseAutoFocus}\n >\n <DismissableLayer\n asChild\n disableOutsidePointerEvents={local.disableOutsidePointerEvents}\n onInteractOutside={local.onInteractOutside}\n onEscapeKeyDown={local.onEscapeKeyDown}\n onPointerDownOutside={local.onPointerDownOutside}\n onFocusOutside={local.onFocusOutside}\n onDismiss={() => context.onOpenChange(false)}\n >\n <PopperContent\n data-state={getState(context.open)}\n role=\"dialog\"\n id={context.contentId}\n {...popperScope}\n {...rest}\n ref={local.ref}\n side={local.side}\n sideOffset={local.sideOffset}\n align={local.align}\n alignOffset={local.alignOffset}\n avoidCollisions={local.avoidCollisions}\n collisionBoundary={local.collisionBoundary}\n collisionPadding={local.collisionPadding}\n arrowPadding={local.arrowPadding}\n sticky={local.sticky}\n hideWhenDetached={local.hideWhenDetached}\n style={{\n ...(typeof local.style === 'object' ? local.style : {}),\n // re-namespace exposed content custom properties\n '--radix-popover-content-transform-origin': 'var(--radix-popper-transform-origin)',\n '--radix-popover-content-available-width': 'var(--radix-popper-available-width)',\n '--radix-popover-content-available-height': 'var(--radix-popper-available-height)',\n '--radix-popover-trigger-width': 'var(--radix-popper-anchor-width)',\n '--radix-popover-trigger-height': 'var(--radix-popper-anchor-height)',\n } as JSX.CSSProperties}\n />\n </DismissableLayer>\n </FocusScope>\n );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * PopoverClose\n * -----------------------------------------------------------------------------------------------*/\n\nconst CLOSE_NAME = 'PopoverClose';\n\ninterface PopoverCloseProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {\n ref?: (el: HTMLElement) => void;\n}\n\nfunction PopoverClose(inProps: ScopedProps<PopoverCloseProps>) {\n const [local, rest] = splitProps(inProps, ['__scopePopover', 'ref']);\n const context = usePopoverContext(CLOSE_NAME, local.__scopePopover);\n\n return (\n <Primitive.button\n type=\"button\"\n {...rest}\n ref={local.ref}\n onClick={composeEventHandlers(rest.onClick as any, () => context.onOpenChange(false))}\n />\n );\n}\n\nPopoverClose.displayName = CLOSE_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * PopoverArrow\n * -----------------------------------------------------------------------------------------------*/\n\nconst ARROW_NAME = 'PopoverArrow';\n\ninterface PopoverArrowProps extends JSX.SvgSVGAttributes<SVGSVGElement> {\n ref?: (el: SVGSVGElement) => void;\n}\n\nfunction PopoverArrow(inProps: ScopedProps<PopoverArrowProps>) {\n const [local, rest] = splitProps(inProps, ['__scopePopover']);\n const popperScope = usePopperScope(local.__scopePopover);\n\n return <PopperArrow {...popperScope} {...rest} />;\n}\n\nPopoverArrow.displayName = ARROW_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * Utils\n * -----------------------------------------------------------------------------------------------*/\n\nfunction getState(open: boolean) {\n return open ? 'open' : 'closed';\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Exports\n * -----------------------------------------------------------------------------------------------*/\n\nconst Root = Popover;\nconst Anchor = PopoverAnchor;\nconst Trigger = PopoverTrigger;\nconst PortalExport = PopoverPortal;\nconst Content = PopoverContent;\nconst Close = PopoverClose;\nconst Arrow = PopoverArrow;\n\nexport {\n createPopoverScope,\n //\n Popover,\n PopoverAnchor,\n PopoverTrigger,\n PopoverPortal,\n PopoverContent,\n PopoverClose,\n PopoverArrow,\n //\n Root,\n Anchor,\n Trigger,\n PortalExport as Portal,\n Content,\n Close,\n Arrow,\n};\nexport type {\n PopoverProps,\n PopoverAnchorProps,\n PopoverTriggerProps,\n PopoverPortalProps,\n PopoverContentProps,\n PopoverCloseProps,\n PopoverArrowProps,\n};\n"]}
package/package.json ADDED
@@ -0,0 +1,65 @@
1
+ {
2
+ "name": "@radix-solid-js/popover",
3
+ "version": "0.1.2",
4
+ "license": "MIT",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": {
12
+ "types": "./dist/index.d.ts",
13
+ "default": "./dist/index.js"
14
+ },
15
+ "require": {
16
+ "types": "./dist/index.d.cts",
17
+ "default": "./dist/index.cjs"
18
+ }
19
+ }
20
+ },
21
+ "files": [
22
+ "dist"
23
+ ],
24
+ "sideEffects": false,
25
+ "scripts": {
26
+ "build": "tsup",
27
+ "clean": "rm -rf dist",
28
+ "typecheck": "tsc --noEmit",
29
+ "test": "vitest run"
30
+ },
31
+ "dependencies": {
32
+ "@radix-solid-js/primitive": "workspace:*",
33
+ "@radix-solid-js/compose-refs": "workspace:*",
34
+ "@radix-solid-js/context": "workspace:*",
35
+ "@radix-solid-js/dismissable-layer": "workspace:*",
36
+ "@radix-solid-js/focus-guards": "workspace:*",
37
+ "@radix-solid-js/focus-scope": "workspace:*",
38
+ "@radix-solid-js/id": "workspace:*",
39
+ "@radix-solid-js/popper": "workspace:*",
40
+ "@radix-solid-js/portal": "workspace:*",
41
+ "@radix-solid-js/presence": "workspace:*",
42
+ "@radix-solid-js/primitive-component": "workspace:*",
43
+ "@radix-solid-js/use-controllable-state": "workspace:*",
44
+ "aria-hidden": "^1.2.6",
45
+ "solid-prevent-scroll": "^0.1.10"
46
+ },
47
+ "peerDependencies": {
48
+ "solid-js": "^1.8.0"
49
+ },
50
+ "devDependencies": {
51
+ "@repo/tsconfig": "workspace:*",
52
+ "tsup": "^8.3.6",
53
+ "typescript": "^5.7.3",
54
+ "solid-js": "^1.9.3",
55
+ "vitest": "^2.1.8"
56
+ },
57
+ "publishConfig": {
58
+ "access": "public"
59
+ },
60
+ "repository": {
61
+ "type": "git",
62
+ "url": "https://github.com/ljho01/shadcn-solid-js.git",
63
+ "directory": "packages/solid/popover"
64
+ }
65
+ }