@pzerelles/headlessui-svelte 2.1.2-next.50 → 2.1.2-next.52

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.
@@ -21,8 +21,6 @@
21
21
  <script lang="ts">
22
22
  import { useId } from "../hooks/use-id.js"
23
23
  import ElementOrComponent from "../utils/ElementOrComponent.svelte"
24
- import { mergeProps } from "../utils/render.js"
25
- import TransitionChild from "../transition/TransitionChild.svelte"
26
24
  import {
27
25
  createDisclosurePanelContext,
28
26
  DisclosureStates,
@@ -70,6 +68,9 @@
70
68
  ? (usesOpenClosedState.value & State.Open) === State.Open
71
69
  : context.disclosureState === DisclosureStates.Open
72
70
  },
71
+ get asChild() {
72
+ return theirProps.asChild
73
+ },
73
74
  })
74
75
 
75
76
  const slot = $derived({
@@ -13,6 +13,7 @@ export declare function useTransition(options: {
13
13
  start?(show: boolean): void;
14
14
  end?(show: boolean): void;
15
15
  };
16
+ asChild?: boolean;
16
17
  }): {
17
18
  readonly visible: boolean;
18
19
  readonly data: TransitionData;
@@ -1,6 +1,7 @@
1
+ import { hasChildren, useNesting, } from "../transition/context.svelte.js";
1
2
  import { disposables, useDisposables } from "../utils/disposables.js";
2
3
  import { once } from "../utils/once.js";
3
- import { untrack } from "svelte";
4
+ import { setContext, untrack } from "svelte";
4
5
  /**
5
6
  * ```
6
7
  * ┌──────┐ │ ┌──────────────┐
@@ -36,12 +37,19 @@ export function transitionDataAttributes(data) {
36
37
  return attributes;
37
38
  }
38
39
  export function useTransition(options) {
39
- const { enabled, element, show, events } = $derived(options);
40
+ const { enabled, element, show, events, asChild } = $derived(options);
40
41
  let visible = $state((() => show)());
41
42
  let flags = $state((() => (enabled && visible ? TransitionState.Enter | TransitionState.Closed : TransitionState.None))());
42
43
  let inFlight = $state(false);
43
44
  let cancelled = $state(false);
44
45
  const d = useDisposables();
46
+ const nestingBag = useNesting({
47
+ done: () => {
48
+ if (show)
49
+ return;
50
+ visible = false;
51
+ },
52
+ });
45
53
  function retry(enabled, show, node, d) {
46
54
  if (!enabled)
47
55
  return;
@@ -50,7 +58,7 @@ export function useTransition(options) {
50
58
  }
51
59
  if (!node) {
52
60
  // Retry if the DOM node isn't available yet
53
- if (show) {
61
+ if (show && !asChild) {
54
62
  flags |= TransitionState.Enter | TransitionState.Closed;
55
63
  return d.nextFrame(() => retry(enabled, show, node, d));
56
64
  }
@@ -115,7 +123,7 @@ export function useTransition(options) {
115
123
  }
116
124
  inFlight = false;
117
125
  flags = 0;
118
- if (!show) {
126
+ if (!show && !hasChildren(nestingBag)) {
119
127
  visible = false;
120
128
  }
121
129
  events?.end?.(show);
@@ -134,6 +142,23 @@ export function useTransition(options) {
134
142
  leave: enabled ? !!(flags & TransitionState.Leave) : undefined,
135
143
  transition: enabled ? !!(flags & (TransitionState.Enter | TransitionState.Leave)) : undefined,
136
144
  });
145
+ $effect(() => {
146
+ if (enabled)
147
+ untrack(() => {
148
+ setContext("NestingContext", nestingBag);
149
+ setContext("TransitionContext", {
150
+ get show() {
151
+ return show;
152
+ },
153
+ get appear() {
154
+ return false;
155
+ },
156
+ get initial() {
157
+ return false;
158
+ },
159
+ });
160
+ });
161
+ });
137
162
  return {
138
163
  get visible() {
139
164
  return enabled ? visible : show;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pzerelles/headlessui-svelte",
3
- "version": "2.1.2-next.50",
3
+ "version": "2.1.2-next.52",
4
4
  "scripts": {
5
5
  "dev": "vite dev",
6
6
  "build": "vite build && npm run package",