bits-ui 2.13.0 → 2.14.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.
@@ -0,0 +1,40 @@
1
+ <script lang="ts">
2
+ import { boxWith, mergeProps } from "svelte-toolbelt";
3
+ import { PopoverOverlayState } from "../popover.svelte.js";
4
+ import type { PopoverOverlayProps } from "../types.js";
5
+ import { createId } from "../../../internal/create-id.js";
6
+ import PresenceLayer from "../../utilities/presence-layer/presence-layer.svelte";
7
+
8
+ const uid = $props.id();
9
+
10
+ let {
11
+ id = createId(uid),
12
+ forceMount = false,
13
+ child,
14
+ children,
15
+ ref = $bindable(null),
16
+ ...restProps
17
+ }: PopoverOverlayProps = $props();
18
+
19
+ const overlayState = PopoverOverlayState.create({
20
+ id: boxWith(() => id),
21
+ ref: boxWith(
22
+ () => ref,
23
+ (v) => (ref = v)
24
+ ),
25
+ });
26
+
27
+ const mergedProps = $derived(mergeProps(restProps, overlayState.props));
28
+ </script>
29
+
30
+ <PresenceLayer open={overlayState.root.opts.open.current || forceMount} ref={overlayState.opts.ref}>
31
+ {#snippet presence()}
32
+ {#if child}
33
+ {@render child({ props: mergeProps(mergedProps), ...overlayState.snippetProps })}
34
+ {:else}
35
+ <div {...mergeProps(mergedProps)}>
36
+ {@render children?.(overlayState.snippetProps)}
37
+ </div>
38
+ {/if}
39
+ {/snippet}
40
+ </PresenceLayer>
@@ -0,0 +1,4 @@
1
+ import type { PopoverOverlayProps } from "../types.js";
2
+ declare const PopoverOverlay: import("svelte").Component<PopoverOverlayProps, {}, "ref">;
3
+ type PopoverOverlay = ReturnType<typeof PopoverOverlay>;
4
+ export default PopoverOverlay;
@@ -5,4 +5,5 @@ export { default as ContentStatic } from "./components/popover-content-static.sv
5
5
  export { default as Trigger } from "./components/popover-trigger.svelte";
6
6
  export { default as Close } from "./components/popover-close.svelte";
7
7
  export { default as Portal } from "../utilities/portal/portal.svelte";
8
- export type { PopoverRootProps as RootProps, PopoverArrowProps as ArrowProps, PopoverContentProps as ContentProps, PopoverContentStaticProps as ContentStaticProps, PopoverTriggerProps as TriggerProps, PopoverCloseProps as CloseProps, PopoverPortalProps as PortalProps, } from "./types.js";
8
+ export { default as Overlay } from "./components/popover-overlay.svelte";
9
+ export type { PopoverRootProps as RootProps, PopoverArrowProps as ArrowProps, PopoverContentProps as ContentProps, PopoverContentStaticProps as ContentStaticProps, PopoverTriggerProps as TriggerProps, PopoverCloseProps as CloseProps, PopoverPortalProps as PortalProps, PopoverOverlayProps as OverlayProps, } from "./types.js";
@@ -5,3 +5,4 @@ export { default as ContentStatic } from "./components/popover-content-static.sv
5
5
  export { default as Trigger } from "./components/popover-trigger.svelte";
6
6
  export { default as Close } from "./components/popover-close.svelte";
7
7
  export { default as Portal } from "../utilities/portal/portal.svelte";
8
+ export { default as Overlay } from "./components/popover-overlay.svelte";
@@ -87,4 +87,23 @@ export declare class PopoverCloseState {
87
87
  readonly type: "button";
88
88
  };
89
89
  }
90
+ interface PopoverOverlayStateOpts extends WithRefOpts {
91
+ }
92
+ export declare class PopoverOverlayState {
93
+ static create(opts: PopoverOverlayStateOpts): PopoverOverlayState;
94
+ readonly opts: PopoverOverlayStateOpts;
95
+ readonly root: PopoverRootState;
96
+ readonly attachment: RefAttachment;
97
+ constructor(opts: PopoverOverlayStateOpts, root: PopoverRootState);
98
+ readonly snippetProps: {
99
+ open: boolean;
100
+ };
101
+ readonly props: {
102
+ readonly id: string;
103
+ readonly style: {
104
+ readonly pointerEvents: "auto";
105
+ };
106
+ readonly "data-state": "open" | "closed";
107
+ };
108
+ }
90
109
  export {};
@@ -6,7 +6,7 @@ import { isElement } from "../../internal/is.js";
6
6
  import { OpenChangeComplete } from "../../internal/open-change-complete.js";
7
7
  const popoverAttrs = createBitsAttrs({
8
8
  component: "popover",
9
- parts: ["root", "trigger", "content", "close"],
9
+ parts: ["root", "trigger", "content", "close", "overlay"],
10
10
  });
11
11
  const PopoverRootContext = new Context("Popover.Root");
12
12
  export class PopoverRootState {
@@ -172,3 +172,26 @@ export class PopoverCloseState {
172
172
  ...this.attachment,
173
173
  }));
174
174
  }
175
+ export class PopoverOverlayState {
176
+ static create(opts) {
177
+ return new PopoverOverlayState(opts, PopoverRootContext.get());
178
+ }
179
+ opts;
180
+ root;
181
+ attachment;
182
+ constructor(opts, root) {
183
+ this.opts = opts;
184
+ this.root = root;
185
+ this.attachment = attachRef(this.opts.ref);
186
+ }
187
+ snippetProps = $derived.by(() => ({ open: this.root.opts.open.current }));
188
+ props = $derived.by(() => ({
189
+ id: this.opts.id.current,
190
+ [popoverAttrs.overlay]: "",
191
+ style: {
192
+ pointerEvents: "auto",
193
+ },
194
+ "data-state": getDataOpenClosed(this.root.opts.open.current),
195
+ ...this.attachment,
196
+ }));
197
+ }
@@ -4,6 +4,7 @@ import type { OnChangeFn, WithChild, WithChildNoChildrenSnippetProps, WithChildr
4
4
  import type { BitsPrimitiveButtonAttributes, BitsPrimitiveDivAttributes } from "../../shared/attributes.js";
5
5
  import type { FloatingContentSnippetProps, StaticContentSnippetProps } from "../../shared/types.js";
6
6
  import type { PortalProps } from "../../types.js";
7
+ import type { PresenceLayerProps } from "../utilities/presence-layer/types.js";
7
8
  export type PopoverRootPropsWithoutHTML = WithChildren<{
8
9
  /**
9
10
  * The open state of the popover.
@@ -31,3 +32,8 @@ export type PopoverArrowPropsWithoutHTML = ArrowPropsWithoutHTML;
31
32
  export type PopoverArrowProps = ArrowProps;
32
33
  export type PopoverPortalPropsWithoutHTML = PortalProps;
33
34
  export type PopoverPortalProps = PortalProps;
35
+ export type PopoverOverlaySnippetProps = {
36
+ open: boolean;
37
+ };
38
+ export type PopoverOverlayPropsWithoutHTML = WithChild<PresenceLayerProps, PopoverOverlaySnippetProps>;
39
+ export type PopoverOverlayProps = PopoverOverlayPropsWithoutHTML & Without<BitsPrimitiveDivAttributes, PopoverOverlayPropsWithoutHTML>;
@@ -193,6 +193,8 @@ function isValidEvent(e, node) {
193
193
  const targetIsContextMenuTrigger = Boolean(target.closest(`[${CONTEXT_MENU_TRIGGER_ATTR}]`));
194
194
  if ("button" in e && e.button > 0 && !targetIsContextMenuTrigger)
195
195
  return false;
196
+ if ("button" in e && e.button === 0 && targetIsContextMenuTrigger)
197
+ return true;
196
198
  const nodeIsContextMenu = Boolean(node.closest(`[${CONTEXT_MENU_CONTENT_ATTR}]`));
197
199
  if (targetIsContextMenuTrigger && nodeIsContextMenu)
198
200
  return false;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bits-ui",
3
- "version": "2.13.0",
3
+ "version": "2.14.0",
4
4
  "license": "MIT",
5
5
  "repository": "github:huntabyte/bits-ui",
6
6
  "funding": "https://github.com/sponsors/huntabyte",