bits-ui 2.13.1 → 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>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bits-ui",
3
- "version": "2.13.1",
3
+ "version": "2.14.0",
4
4
  "license": "MIT",
5
5
  "repository": "github:huntabyte/bits-ui",
6
6
  "funding": "https://github.com/sponsors/huntabyte",