@zag-js/tooltip 2.0.0-next.0 → 2.0.0-next.1

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.d.mts CHANGED
@@ -2,7 +2,7 @@ export { anatomy } from './tooltip.anatomy.mjs';
2
2
  export { connect } from './tooltip.connect.mjs';
3
3
  export { machine } from './tooltip.machine.mjs';
4
4
  export { props, splitProps } from './tooltip.props.mjs';
5
- export { TooltipApi as Api, ElementIds, TooltipMachine as Machine, OpenChangeDetails, TooltipProps as Props, TooltipService as Service, TriggerProps, TriggerValueChangeDetails } from './tooltip.types.mjs';
5
+ export { TooltipApi as Api, ContentState, ElementIds, TooltipMachine as Machine, OpenChangeDetails, TooltipProps as Props, TooltipService as Service, TriggerProps, TriggerState, TriggerValueChangeDetails } from './tooltip.types.mjs';
6
6
  export { Placement, PositioningOptions } from '@zag-js/popper';
7
7
  import '@zag-js/anatomy';
8
8
  import '@zag-js/core';
package/dist/index.d.ts CHANGED
@@ -2,7 +2,7 @@ export { anatomy } from './tooltip.anatomy.js';
2
2
  export { connect } from './tooltip.connect.js';
3
3
  export { machine } from './tooltip.machine.js';
4
4
  export { props, splitProps } from './tooltip.props.js';
5
- export { TooltipApi as Api, ElementIds, TooltipMachine as Machine, OpenChangeDetails, TooltipProps as Props, TooltipService as Service, TriggerProps, TriggerValueChangeDetails } from './tooltip.types.js';
5
+ export { TooltipApi as Api, ContentState, ElementIds, TooltipMachine as Machine, OpenChangeDetails, TooltipProps as Props, TooltipService as Service, TriggerProps, TriggerState, TriggerValueChangeDetails } from './tooltip.types.js';
6
6
  export { Placement, PositioningOptions } from '@zag-js/popper';
7
7
  import '@zag-js/anatomy';
8
8
  import '@zag-js/core';
@@ -51,9 +51,19 @@ function connect(service, normalize) {
51
51
  const disabled = prop("disabled");
52
52
  const popperStyles = (0, import_popper.getPlacementStyles)({
53
53
  ...prop("positioning"),
54
- placement: currentPlacement,
55
- positioned: context.get("positioned")
54
+ placement: currentPlacement
56
55
  });
56
+ function getTriggerState(props = {}) {
57
+ const { value } = props;
58
+ const current = value == null ? false : triggerValue === value;
59
+ return { value, current, open: value == null ? open : open && current };
60
+ }
61
+ function getContentState() {
62
+ const isCurrentTooltip = import_tooltip2.store.get("id") === id;
63
+ const isPrevTooltip = import_tooltip2.store.get("prevId") === id;
64
+ const instant = !!import_tooltip2.store.get("instant") && (open && isCurrentTooltip || isPrevTooltip);
65
+ return { open, instant, placement: currentPlacement, side: currentPlacementSide };
66
+ }
57
67
  return {
58
68
  open,
59
69
  setOpen(nextOpen) {
@@ -68,9 +78,10 @@ function connect(service, normalize) {
68
78
  reposition(options = {}) {
69
79
  send({ type: "positioning.set", options });
70
80
  },
81
+ getTriggerState,
71
82
  getTriggerProps(props = {}) {
72
83
  const { value } = props;
73
- const current = value == null ? false : triggerValue === value;
84
+ const { current } = getTriggerState(props);
74
85
  const triggerId = dom.getTriggerId(scope, value);
75
86
  return normalize.button({
76
87
  ...import_tooltip.parts.trigger.attrs(scope.id),
@@ -158,20 +169,19 @@ function connect(service, normalize) {
158
169
  style: popperStyles.floating
159
170
  });
160
171
  },
172
+ getContentState,
161
173
  getContentProps() {
162
- const isCurrentTooltip = import_tooltip2.store.get("id") === id;
163
- const isPrevTooltip = import_tooltip2.store.get("prevId") === id;
164
- const instant = import_tooltip2.store.get("instant") && (open && isCurrentTooltip || isPrevTooltip);
174
+ const contentState = getContentState();
165
175
  return normalize.element({
166
176
  ...import_tooltip.parts.content.attrs(scope.id),
167
177
  dir: prop("dir"),
168
- hidden: !open,
169
- "data-state": open ? "open" : "closed",
170
- "data-instant": (0, import_dom_query.dataAttr)(instant),
178
+ hidden: !contentState.open,
179
+ "data-state": contentState.open ? "open" : "closed",
180
+ "data-instant": (0, import_dom_query.dataAttr)(contentState.instant),
171
181
  role: hasAriaLabel ? void 0 : "tooltip",
172
182
  id: hasAriaLabel ? void 0 : contentId,
173
- "data-placement": currentPlacement,
174
- "data-side": currentPlacementSide,
183
+ "data-placement": contentState.placement,
184
+ "data-side": contentState.side,
175
185
  onPointerEnter() {
176
186
  send({ type: "content.pointer.move" });
177
187
  },
@@ -17,9 +17,19 @@ function connect(service, normalize) {
17
17
  const disabled = prop("disabled");
18
18
  const popperStyles = getPlacementStyles({
19
19
  ...prop("positioning"),
20
- placement: currentPlacement,
21
- positioned: context.get("positioned")
20
+ placement: currentPlacement
22
21
  });
22
+ function getTriggerState(props = {}) {
23
+ const { value } = props;
24
+ const current = value == null ? false : triggerValue === value;
25
+ return { value, current, open: value == null ? open : open && current };
26
+ }
27
+ function getContentState() {
28
+ const isCurrentTooltip = store.get("id") === id;
29
+ const isPrevTooltip = store.get("prevId") === id;
30
+ const instant = !!store.get("instant") && (open && isCurrentTooltip || isPrevTooltip);
31
+ return { open, instant, placement: currentPlacement, side: currentPlacementSide };
32
+ }
23
33
  return {
24
34
  open,
25
35
  setOpen(nextOpen) {
@@ -34,9 +44,10 @@ function connect(service, normalize) {
34
44
  reposition(options = {}) {
35
45
  send({ type: "positioning.set", options });
36
46
  },
47
+ getTriggerState,
37
48
  getTriggerProps(props = {}) {
38
49
  const { value } = props;
39
- const current = value == null ? false : triggerValue === value;
50
+ const { current } = getTriggerState(props);
40
51
  const triggerId = dom.getTriggerId(scope, value);
41
52
  return normalize.button({
42
53
  ...parts.trigger.attrs(scope.id),
@@ -124,20 +135,19 @@ function connect(service, normalize) {
124
135
  style: popperStyles.floating
125
136
  });
126
137
  },
138
+ getContentState,
127
139
  getContentProps() {
128
- const isCurrentTooltip = store.get("id") === id;
129
- const isPrevTooltip = store.get("prevId") === id;
130
- const instant = store.get("instant") && (open && isCurrentTooltip || isPrevTooltip);
140
+ const contentState = getContentState();
131
141
  return normalize.element({
132
142
  ...parts.content.attrs(scope.id),
133
143
  dir: prop("dir"),
134
- hidden: !open,
135
- "data-state": open ? "open" : "closed",
136
- "data-instant": dataAttr(instant),
144
+ hidden: !contentState.open,
145
+ "data-state": contentState.open ? "open" : "closed",
146
+ "data-instant": dataAttr(contentState.instant),
137
147
  role: hasAriaLabel ? void 0 : "tooltip",
138
148
  id: hasAriaLabel ? void 0 : contentId,
139
- "data-placement": currentPlacement,
140
- "data-side": currentPlacementSide,
149
+ "data-placement": contentState.placement,
150
+ "data-side": contentState.side,
141
151
  onPointerEnter() {
142
152
  send({ type: "content.pointer.move" });
143
153
  },
@@ -79,8 +79,7 @@ var machine = (0, import_core.createMachine)({
79
79
  const triggerElement = dom.getActiveTriggerEl(scope, value);
80
80
  onTriggerValueChange({ value, triggerElement });
81
81
  }
82
- })),
83
- positioned: bindable(() => ({ defaultValue: false }))
82
+ }))
84
83
  }),
85
84
  watch({ track, action, prop }) {
86
85
  track([() => prop("disabled")], () => {
@@ -299,10 +298,10 @@ var machine = (0, import_core.createMachine)({
299
298
  isOpenControlled: ({ prop }) => prop("open") !== void 0
300
299
  },
301
300
  actions: {
302
- setGlobalId: ({ prop }) => {
301
+ setGlobalId: ({ prop, event }) => {
303
302
  const prevId = import_tooltip.store.get("id");
304
- const isInstant = prevId !== null && prevId !== prop("id");
305
- import_tooltip.store.update({ id: prop("id"), prevId: isInstant ? prevId : null, instant: isInstant });
303
+ const isInstant = event.src === "trigger.focus" || prevId !== null && prevId !== prop("id");
304
+ import_tooltip.store.update({ id: prop("id"), prevId: isInstant && prevId !== null ? prevId : null, instant: isInstant });
306
305
  },
307
306
  clearGlobalId: ({ prop }) => {
308
307
  if (prop("id") === import_tooltip.store.get("id")) {
@@ -383,7 +382,6 @@ var machine = (0, import_core.createMachine)({
383
382
  defer: true,
384
383
  onComplete(data) {
385
384
  context.set("currentPlacement", data.placement);
386
- context.set("positioned", true);
387
385
  }
388
386
  });
389
387
  },
@@ -415,7 +413,8 @@ var machine = (0, import_core.createMachine)({
415
413
  let cleanup;
416
414
  queueMicrotask(() => {
417
415
  cleanup = import_tooltip.store.subscribe(() => {
418
- if (import_tooltip.store.get("id") !== prop("id")) {
416
+ const id = import_tooltip.store.get("id");
417
+ if (id !== null && id !== prop("id")) {
419
418
  send({ type: "close", src: "id.change" });
420
419
  }
421
420
  });
@@ -45,8 +45,7 @@ var machine = createMachine({
45
45
  const triggerElement = dom.getActiveTriggerEl(scope, value);
46
46
  onTriggerValueChange({ value, triggerElement });
47
47
  }
48
- })),
49
- positioned: bindable(() => ({ defaultValue: false }))
48
+ }))
50
49
  }),
51
50
  watch({ track, action, prop }) {
52
51
  track([() => prop("disabled")], () => {
@@ -265,10 +264,10 @@ var machine = createMachine({
265
264
  isOpenControlled: ({ prop }) => prop("open") !== void 0
266
265
  },
267
266
  actions: {
268
- setGlobalId: ({ prop }) => {
267
+ setGlobalId: ({ prop, event }) => {
269
268
  const prevId = store.get("id");
270
- const isInstant = prevId !== null && prevId !== prop("id");
271
- store.update({ id: prop("id"), prevId: isInstant ? prevId : null, instant: isInstant });
269
+ const isInstant = event.src === "trigger.focus" || prevId !== null && prevId !== prop("id");
270
+ store.update({ id: prop("id"), prevId: isInstant && prevId !== null ? prevId : null, instant: isInstant });
272
271
  },
273
272
  clearGlobalId: ({ prop }) => {
274
273
  if (prop("id") === store.get("id")) {
@@ -349,7 +348,6 @@ var machine = createMachine({
349
348
  defer: true,
350
349
  onComplete(data) {
351
350
  context.set("currentPlacement", data.placement);
352
- context.set("positioned", true);
353
351
  }
354
352
  });
355
353
  },
@@ -381,7 +379,8 @@ var machine = createMachine({
381
379
  let cleanup;
382
380
  queueMicrotask(() => {
383
381
  cleanup = store.subscribe(() => {
384
- if (store.get("id") !== prop("id")) {
382
+ const id = store.get("id");
383
+ if (id !== null && id !== prop("id")) {
385
384
  send({ type: "close", src: "id.change" });
386
385
  }
387
386
  });
@@ -1,5 +1,5 @@
1
1
  import { Machine, EventObject, Service } from '@zag-js/core';
2
- import { PositioningOptions, Placement } from '@zag-js/popper';
2
+ import { PositioningOptions, Placement, PlacementSide } from '@zag-js/popper';
3
3
  export { Placement, PositioningOptions } from '@zag-js/popper';
4
4
  import { PropTypes, RequiredBy, DirectionProperty, CommonProperties } from '@zag-js/types';
5
5
 
@@ -112,7 +112,6 @@ interface TooltipSchema {
112
112
  currentPlacement: Placement | undefined;
113
113
  hasPointerMoveOpened: string | null;
114
114
  triggerValue: string | null;
115
- positioned: boolean;
116
115
  };
117
116
  event: EventObject;
118
117
  action: string;
@@ -127,6 +126,38 @@ interface TriggerProps {
127
126
  */
128
127
  value?: string;
129
128
  }
129
+ interface TriggerState {
130
+ /**
131
+ * The value that identifies this specific trigger
132
+ */
133
+ value: string | undefined;
134
+ /**
135
+ * Whether this trigger is the one that opened the tooltip
136
+ */
137
+ current: boolean;
138
+ /**
139
+ * Whether the tooltip is open
140
+ */
141
+ open: boolean;
142
+ }
143
+ interface ContentState {
144
+ /**
145
+ * Whether the tooltip is open
146
+ */
147
+ open: boolean;
148
+ /**
149
+ * Whether the tooltip should skip its enter animation, following a rapid switch between triggers
150
+ */
151
+ instant: boolean;
152
+ /**
153
+ * The current placement of the content relative to the trigger
154
+ */
155
+ placement: Placement | undefined;
156
+ /**
157
+ * The side of the trigger the content is placed on
158
+ */
159
+ side: PlacementSide | undefined;
160
+ }
130
161
  interface TooltipApi<T extends PropTypes = PropTypes> {
131
162
  /**
132
163
  * Whether the tooltip is open.
@@ -148,11 +179,19 @@ interface TooltipApi<T extends PropTypes = PropTypes> {
148
179
  * Function to reposition the popover
149
180
  */
150
181
  reposition: (options?: Partial<PositioningOptions>) => void;
182
+ /**
183
+ * Returns the state of a specific trigger, including whether it's the currently active one
184
+ */
185
+ getTriggerState: (props?: TriggerProps) => TriggerState;
151
186
  getTriggerProps: (props?: TriggerProps) => T["button"];
152
187
  getArrowProps: () => T["element"];
153
188
  getArrowTipProps: () => T["element"];
154
189
  getPositionerProps: () => T["element"];
190
+ /**
191
+ * Returns the state of the content
192
+ */
193
+ getContentState: () => ContentState;
155
194
  getContentProps: () => T["element"];
156
195
  }
157
196
 
158
- export type { ElementIds, OpenChangeDetails, TooltipApi, TooltipMachine, TooltipProps, TooltipSchema, TooltipService, TriggerProps, TriggerValueChangeDetails };
197
+ export type { ContentState, ElementIds, OpenChangeDetails, TooltipApi, TooltipMachine, TooltipProps, TooltipSchema, TooltipService, TriggerProps, TriggerState, TriggerValueChangeDetails };
@@ -1,5 +1,5 @@
1
1
  import { Machine, EventObject, Service } from '@zag-js/core';
2
- import { PositioningOptions, Placement } from '@zag-js/popper';
2
+ import { PositioningOptions, Placement, PlacementSide } from '@zag-js/popper';
3
3
  export { Placement, PositioningOptions } from '@zag-js/popper';
4
4
  import { PropTypes, RequiredBy, DirectionProperty, CommonProperties } from '@zag-js/types';
5
5
 
@@ -112,7 +112,6 @@ interface TooltipSchema {
112
112
  currentPlacement: Placement | undefined;
113
113
  hasPointerMoveOpened: string | null;
114
114
  triggerValue: string | null;
115
- positioned: boolean;
116
115
  };
117
116
  event: EventObject;
118
117
  action: string;
@@ -127,6 +126,38 @@ interface TriggerProps {
127
126
  */
128
127
  value?: string;
129
128
  }
129
+ interface TriggerState {
130
+ /**
131
+ * The value that identifies this specific trigger
132
+ */
133
+ value: string | undefined;
134
+ /**
135
+ * Whether this trigger is the one that opened the tooltip
136
+ */
137
+ current: boolean;
138
+ /**
139
+ * Whether the tooltip is open
140
+ */
141
+ open: boolean;
142
+ }
143
+ interface ContentState {
144
+ /**
145
+ * Whether the tooltip is open
146
+ */
147
+ open: boolean;
148
+ /**
149
+ * Whether the tooltip should skip its enter animation, following a rapid switch between triggers
150
+ */
151
+ instant: boolean;
152
+ /**
153
+ * The current placement of the content relative to the trigger
154
+ */
155
+ placement: Placement | undefined;
156
+ /**
157
+ * The side of the trigger the content is placed on
158
+ */
159
+ side: PlacementSide | undefined;
160
+ }
130
161
  interface TooltipApi<T extends PropTypes = PropTypes> {
131
162
  /**
132
163
  * Whether the tooltip is open.
@@ -148,11 +179,19 @@ interface TooltipApi<T extends PropTypes = PropTypes> {
148
179
  * Function to reposition the popover
149
180
  */
150
181
  reposition: (options?: Partial<PositioningOptions>) => void;
182
+ /**
183
+ * Returns the state of a specific trigger, including whether it's the currently active one
184
+ */
185
+ getTriggerState: (props?: TriggerProps) => TriggerState;
151
186
  getTriggerProps: (props?: TriggerProps) => T["button"];
152
187
  getArrowProps: () => T["element"];
153
188
  getArrowTipProps: () => T["element"];
154
189
  getPositionerProps: () => T["element"];
190
+ /**
191
+ * Returns the state of the content
192
+ */
193
+ getContentState: () => ContentState;
155
194
  getContentProps: () => T["element"];
156
195
  }
157
196
 
158
- export type { ElementIds, OpenChangeDetails, TooltipApi, TooltipMachine, TooltipProps, TooltipSchema, TooltipService, TriggerProps, TriggerValueChangeDetails };
197
+ export type { ContentState, ElementIds, OpenChangeDetails, TooltipApi, TooltipMachine, TooltipProps, TooltipSchema, TooltipService, TriggerProps, TriggerState, TriggerValueChangeDetails };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zag-js/tooltip",
3
- "version": "2.0.0-next.0",
3
+ "version": "2.0.0-next.1",
4
4
  "description": "Core logic for the tooltip widget implemented as a state machine",
5
5
  "keywords": [
6
6
  "js",
@@ -14,7 +14,10 @@
14
14
  "author": "Segun Adebayo <sage@adebayosegun.com>",
15
15
  "homepage": "https://github.com/chakra-ui/zag#readme",
16
16
  "license": "MIT",
17
- "repository": "https://github.com/chakra-ui/zag/tree/main/packages/tooltip",
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "https://github.com/chakra-ui/zag/tree/main/packages/tooltip"
20
+ },
18
21
  "sideEffects": false,
19
22
  "files": [
20
23
  "dist"
@@ -26,13 +29,13 @@
26
29
  "url": "https://github.com/chakra-ui/zag/issues"
27
30
  },
28
31
  "dependencies": {
29
- "@zag-js/anatomy": "2.0.0-next.0",
30
- "@zag-js/core": "2.0.0-next.0",
31
- "@zag-js/popper": "2.0.0-next.0",
32
- "@zag-js/focus-visible": "2.0.0-next.0",
33
- "@zag-js/dom-query": "2.0.0-next.0",
34
- "@zag-js/utils": "2.0.0-next.0",
35
- "@zag-js/types": "2.0.0-next.0"
32
+ "@zag-js/anatomy": "2.0.0-next.1",
33
+ "@zag-js/core": "2.0.0-next.1",
34
+ "@zag-js/popper": "2.0.0-next.1",
35
+ "@zag-js/focus-visible": "2.0.0-next.1",
36
+ "@zag-js/dom-query": "2.0.0-next.1",
37
+ "@zag-js/utils": "2.0.0-next.1",
38
+ "@zag-js/types": "2.0.0-next.1"
36
39
  },
37
40
  "devDependencies": {
38
41
  "clean-package": "2.2.0"