@zag-js/tooltip 1.38.2 → 1.39.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.
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 } from './tooltip.types.mjs';
5
+ export { TooltipApi as Api, ElementIds, TooltipMachine as Machine, OpenChangeDetails, TooltipProps as Props, TooltipService as Service, TriggerProps, 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 } from './tooltip.types.js';
5
+ export { TooltipApi as Api, ElementIds, TooltipMachine as Machine, OpenChangeDetails, TooltipProps as Props, TooltipService as Service, TriggerProps, 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';
@@ -44,7 +44,7 @@ function connect(service, normalize) {
44
44
  const id = prop("id");
45
45
  const hasAriaLabel = !!prop("aria-label");
46
46
  const open = state.matches("open", "closing");
47
- const triggerId = dom.getTriggerId(scope);
47
+ const triggerValue = context.get("triggerValue");
48
48
  const contentId = dom.getContentId(scope);
49
49
  const disabled = prop("disabled");
50
50
  const popperStyles = (0, import_popper.getPlacementStyles)({
@@ -58,13 +58,23 @@ function connect(service, normalize) {
58
58
  if (open2 === nextOpen) return;
59
59
  send({ type: nextOpen ? "open" : "close" });
60
60
  },
61
+ triggerValue,
62
+ setTriggerValue(value) {
63
+ send({ type: "triggerValue.set", value: value ?? void 0 });
64
+ },
61
65
  reposition(options = {}) {
62
66
  send({ type: "positioning.set", options });
63
67
  },
64
- getTriggerProps() {
68
+ getTriggerProps(props = {}) {
69
+ const { value } = props;
70
+ const current = value == null ? false : triggerValue === value;
71
+ const triggerId = dom.getTriggerId(scope, value);
65
72
  return normalize.button({
66
73
  ...import_tooltip.parts.trigger.attrs,
67
74
  id: triggerId,
75
+ "data-ownedby": scope.id,
76
+ "data-value": value,
77
+ "data-current": (0, import_dom_query.dataAttr)(current),
68
78
  dir: prop("dir"),
69
79
  "data-expanded": (0, import_dom_query.dataAttr)(open),
70
80
  "data-state": open ? "open" : "closed",
@@ -73,22 +83,24 @@ function connect(service, normalize) {
73
83
  if (event.defaultPrevented) return;
74
84
  if (disabled) return;
75
85
  if (!prop("closeOnClick")) return;
76
- send({ type: "close", src: "trigger.click" });
86
+ const shouldSwitch = open && value != null && !current;
87
+ send({ type: shouldSwitch ? "triggerValue.set" : "close", src: "trigger.click", value, triggerId });
77
88
  },
78
89
  onFocus(event) {
79
- queueMicrotask(() => {
80
- if (event.defaultPrevented) return;
81
- if (disabled) return;
82
- if (_event.src === "trigger.pointerdown") return;
83
- if (!(0, import_focus_visible.isFocusVisible)()) return;
84
- send({ type: "open", src: "trigger.focus" });
85
- });
90
+ if (event.defaultPrevented) return;
91
+ if (disabled) return;
92
+ if (!(0, import_focus_visible.isFocusVisible)()) return;
93
+ const shouldSwitch = open && value != null && !current;
94
+ send({ type: shouldSwitch ? "triggerValue.set" : "open", src: "trigger.focus", value, triggerId });
86
95
  },
87
96
  onBlur(event) {
88
97
  if (event.defaultPrevented) return;
89
98
  if (disabled) return;
90
- if (id === import_tooltip2.store.get("id")) {
91
- send({ type: "close", src: "trigger.blur" });
99
+ if (id !== import_tooltip2.store.get("id")) return;
100
+ const activeEl = event.relatedTarget ?? scope.getDoc().activeElement;
101
+ const focusedAnotherTrigger = activeEl?.closest(`[data-ownedby="${scope.id}"]`) != null;
102
+ if (!focusedAnotherTrigger) {
103
+ send({ type: "close", src: "trigger.blur", value, triggerId });
92
104
  }
93
105
  },
94
106
  onPointerDown(event) {
@@ -97,20 +109,21 @@ function connect(service, normalize) {
97
109
  if (!(0, import_dom_query.isLeftClick)(event)) return;
98
110
  if (!prop("closeOnPointerDown")) return;
99
111
  if (id === import_tooltip2.store.get("id")) {
100
- send({ type: "close", src: "trigger.pointerdown" });
112
+ send({ type: "close", src: "trigger.pointerdown", value, triggerId });
101
113
  }
102
114
  },
103
115
  onPointerMove(event) {
104
116
  if (event.defaultPrevented) return;
105
117
  if (disabled) return;
106
118
  if (event.pointerType === "touch") return;
107
- send({ type: "pointer.move" });
119
+ const shouldSwitch = open && value != null && !current;
120
+ send({ type: shouldSwitch ? "triggerValue.set" : "pointer.move", value, triggerId });
108
121
  },
109
122
  onPointerOver(event) {
110
123
  if (event.defaultPrevented) return;
111
124
  if (disabled) return;
112
125
  if (event.pointerType === "touch") return;
113
- send({ type: "pointer.move" });
126
+ send({ type: "pointer.move", value, triggerId });
114
127
  },
115
128
  onPointerLeave() {
116
129
  if (disabled) return;
@@ -10,7 +10,7 @@ function connect(service, normalize) {
10
10
  const id = prop("id");
11
11
  const hasAriaLabel = !!prop("aria-label");
12
12
  const open = state.matches("open", "closing");
13
- const triggerId = dom.getTriggerId(scope);
13
+ const triggerValue = context.get("triggerValue");
14
14
  const contentId = dom.getContentId(scope);
15
15
  const disabled = prop("disabled");
16
16
  const popperStyles = getPlacementStyles({
@@ -24,13 +24,23 @@ function connect(service, normalize) {
24
24
  if (open2 === nextOpen) return;
25
25
  send({ type: nextOpen ? "open" : "close" });
26
26
  },
27
+ triggerValue,
28
+ setTriggerValue(value) {
29
+ send({ type: "triggerValue.set", value: value ?? void 0 });
30
+ },
27
31
  reposition(options = {}) {
28
32
  send({ type: "positioning.set", options });
29
33
  },
30
- getTriggerProps() {
34
+ getTriggerProps(props = {}) {
35
+ const { value } = props;
36
+ const current = value == null ? false : triggerValue === value;
37
+ const triggerId = dom.getTriggerId(scope, value);
31
38
  return normalize.button({
32
39
  ...parts.trigger.attrs,
33
40
  id: triggerId,
41
+ "data-ownedby": scope.id,
42
+ "data-value": value,
43
+ "data-current": dataAttr(current),
34
44
  dir: prop("dir"),
35
45
  "data-expanded": dataAttr(open),
36
46
  "data-state": open ? "open" : "closed",
@@ -39,22 +49,24 @@ function connect(service, normalize) {
39
49
  if (event.defaultPrevented) return;
40
50
  if (disabled) return;
41
51
  if (!prop("closeOnClick")) return;
42
- send({ type: "close", src: "trigger.click" });
52
+ const shouldSwitch = open && value != null && !current;
53
+ send({ type: shouldSwitch ? "triggerValue.set" : "close", src: "trigger.click", value, triggerId });
43
54
  },
44
55
  onFocus(event) {
45
- queueMicrotask(() => {
46
- if (event.defaultPrevented) return;
47
- if (disabled) return;
48
- if (_event.src === "trigger.pointerdown") return;
49
- if (!isFocusVisible()) return;
50
- send({ type: "open", src: "trigger.focus" });
51
- });
56
+ if (event.defaultPrevented) return;
57
+ if (disabled) return;
58
+ if (!isFocusVisible()) return;
59
+ const shouldSwitch = open && value != null && !current;
60
+ send({ type: shouldSwitch ? "triggerValue.set" : "open", src: "trigger.focus", value, triggerId });
52
61
  },
53
62
  onBlur(event) {
54
63
  if (event.defaultPrevented) return;
55
64
  if (disabled) return;
56
- if (id === store.get("id")) {
57
- send({ type: "close", src: "trigger.blur" });
65
+ if (id !== store.get("id")) return;
66
+ const activeEl = event.relatedTarget ?? scope.getDoc().activeElement;
67
+ const focusedAnotherTrigger = activeEl?.closest(`[data-ownedby="${scope.id}"]`) != null;
68
+ if (!focusedAnotherTrigger) {
69
+ send({ type: "close", src: "trigger.blur", value, triggerId });
58
70
  }
59
71
  },
60
72
  onPointerDown(event) {
@@ -63,20 +75,21 @@ function connect(service, normalize) {
63
75
  if (!isLeftClick(event)) return;
64
76
  if (!prop("closeOnPointerDown")) return;
65
77
  if (id === store.get("id")) {
66
- send({ type: "close", src: "trigger.pointerdown" });
78
+ send({ type: "close", src: "trigger.pointerdown", value, triggerId });
67
79
  }
68
80
  },
69
81
  onPointerMove(event) {
70
82
  if (event.defaultPrevented) return;
71
83
  if (disabled) return;
72
84
  if (event.pointerType === "touch") return;
73
- send({ type: "pointer.move" });
85
+ const shouldSwitch = open && value != null && !current;
86
+ send({ type: shouldSwitch ? "triggerValue.set" : "pointer.move", value, triggerId });
74
87
  },
75
88
  onPointerOver(event) {
76
89
  if (event.defaultPrevented) return;
77
90
  if (disabled) return;
78
91
  if (event.pointerType === "touch") return;
79
- send({ type: "pointer.move" });
92
+ send({ type: "pointer.move", value, triggerId });
80
93
  },
81
94
  onPointerLeave() {
82
95
  if (disabled) return;
@@ -1,6 +1,6 @@
1
1
  import { Scope } from '@zag-js/core';
2
2
 
3
- declare const getTriggerId: (scope: Scope) => any;
3
+ declare const getTriggerId: (scope: Scope, value?: string) => any;
4
4
  declare const getContentId: (scope: Scope) => any;
5
5
  declare const getArrowId: (scope: Scope) => any;
6
6
  declare const getPositionerId: (scope: Scope) => any;
@@ -8,5 +8,7 @@ declare const getTriggerEl: (scope: Scope) => HTMLElement | null;
8
8
  declare const getContentEl: (scope: Scope) => HTMLElement | null;
9
9
  declare const getPositionerEl: (scope: Scope) => HTMLElement | null;
10
10
  declare const getArrowEl: (scope: Scope) => HTMLElement | null;
11
+ declare const getTriggerEls: (scope: Scope) => HTMLElement[];
12
+ declare const getActiveTriggerEl: (scope: Scope, value: string | null) => HTMLElement | null;
11
13
 
12
- export { getArrowEl, getArrowId, getContentEl, getContentId, getPositionerEl, getPositionerId, getTriggerEl, getTriggerId };
14
+ export { getActiveTriggerEl, getArrowEl, getArrowId, getContentEl, getContentId, getPositionerEl, getPositionerId, getTriggerEl, getTriggerEls, getTriggerId };
@@ -1,6 +1,6 @@
1
1
  import { Scope } from '@zag-js/core';
2
2
 
3
- declare const getTriggerId: (scope: Scope) => any;
3
+ declare const getTriggerId: (scope: Scope, value?: string) => any;
4
4
  declare const getContentId: (scope: Scope) => any;
5
5
  declare const getArrowId: (scope: Scope) => any;
6
6
  declare const getPositionerId: (scope: Scope) => any;
@@ -8,5 +8,7 @@ declare const getTriggerEl: (scope: Scope) => HTMLElement | null;
8
8
  declare const getContentEl: (scope: Scope) => HTMLElement | null;
9
9
  declare const getPositionerEl: (scope: Scope) => HTMLElement | null;
10
10
  declare const getArrowEl: (scope: Scope) => HTMLElement | null;
11
+ declare const getTriggerEls: (scope: Scope) => HTMLElement[];
12
+ declare const getActiveTriggerEl: (scope: Scope, value: string | null) => HTMLElement | null;
11
13
 
12
- export { getArrowEl, getArrowId, getContentEl, getContentId, getPositionerEl, getPositionerId, getTriggerEl, getTriggerId };
14
+ export { getActiveTriggerEl, getArrowEl, getArrowId, getContentEl, getContentId, getPositionerEl, getPositionerId, getTriggerEl, getTriggerEls, getTriggerId };
@@ -20,6 +20,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/tooltip.dom.ts
21
21
  var tooltip_dom_exports = {};
22
22
  __export(tooltip_dom_exports, {
23
+ getActiveTriggerEl: () => getActiveTriggerEl,
23
24
  getArrowEl: () => getArrowEl,
24
25
  getArrowId: () => getArrowId,
25
26
  getContentEl: () => getContentEl,
@@ -27,10 +28,17 @@ __export(tooltip_dom_exports, {
27
28
  getPositionerEl: () => getPositionerEl,
28
29
  getPositionerId: () => getPositionerId,
29
30
  getTriggerEl: () => getTriggerEl,
31
+ getTriggerEls: () => getTriggerEls,
30
32
  getTriggerId: () => getTriggerId
31
33
  });
32
34
  module.exports = __toCommonJS(tooltip_dom_exports);
33
- var getTriggerId = (scope) => scope.ids?.trigger ?? `tooltip:${scope.id}:trigger`;
35
+ var import_dom_query = require("@zag-js/dom-query");
36
+ var import_utils = require("@zag-js/utils");
37
+ var getTriggerId = (scope, value) => {
38
+ const customId = scope.ids?.trigger;
39
+ if (customId != null) return (0, import_utils.isFunction)(customId) ? customId(value) : customId;
40
+ return value ? `tooltip:${scope.id}:trigger:${value}` : `tooltip:${scope.id}:trigger`;
41
+ };
34
42
  var getContentId = (scope) => scope.ids?.content ?? `tooltip:${scope.id}:content`;
35
43
  var getArrowId = (scope) => scope.ids?.arrow ?? `tooltip:${scope.id}:arrow`;
36
44
  var getPositionerId = (scope) => scope.ids?.positioner ?? `tooltip:${scope.id}:popper`;
@@ -38,8 +46,13 @@ var getTriggerEl = (scope) => scope.getById(getTriggerId(scope));
38
46
  var getContentEl = (scope) => scope.getById(getContentId(scope));
39
47
  var getPositionerEl = (scope) => scope.getById(getPositionerId(scope));
40
48
  var getArrowEl = (scope) => scope.getById(getArrowId(scope));
49
+ var getTriggerEls = (scope) => (0, import_dom_query.queryAll)(scope.getDoc(), `[data-scope="tooltip"][data-part="trigger"][data-ownedby="${scope.id}"]`);
50
+ var getActiveTriggerEl = (scope, value) => {
51
+ return value == null ? getTriggerEls(scope)[0] : scope.getById(getTriggerId(scope, value));
52
+ };
41
53
  // Annotate the CommonJS export names for ESM import in node:
42
54
  0 && (module.exports = {
55
+ getActiveTriggerEl,
43
56
  getArrowEl,
44
57
  getArrowId,
45
58
  getContentEl,
@@ -47,5 +60,6 @@ var getArrowEl = (scope) => scope.getById(getArrowId(scope));
47
60
  getPositionerEl,
48
61
  getPositionerId,
49
62
  getTriggerEl,
63
+ getTriggerEls,
50
64
  getTriggerId
51
65
  });
@@ -1,5 +1,11 @@
1
1
  // src/tooltip.dom.ts
2
- var getTriggerId = (scope) => scope.ids?.trigger ?? `tooltip:${scope.id}:trigger`;
2
+ import { queryAll } from "@zag-js/dom-query";
3
+ import { isFunction } from "@zag-js/utils";
4
+ var getTriggerId = (scope, value) => {
5
+ const customId = scope.ids?.trigger;
6
+ if (customId != null) return isFunction(customId) ? customId(value) : customId;
7
+ return value ? `tooltip:${scope.id}:trigger:${value}` : `tooltip:${scope.id}:trigger`;
8
+ };
3
9
  var getContentId = (scope) => scope.ids?.content ?? `tooltip:${scope.id}:content`;
4
10
  var getArrowId = (scope) => scope.ids?.arrow ?? `tooltip:${scope.id}:arrow`;
5
11
  var getPositionerId = (scope) => scope.ids?.positioner ?? `tooltip:${scope.id}:popper`;
@@ -7,7 +13,12 @@ var getTriggerEl = (scope) => scope.getById(getTriggerId(scope));
7
13
  var getContentEl = (scope) => scope.getById(getContentId(scope));
8
14
  var getPositionerEl = (scope) => scope.getById(getPositionerId(scope));
9
15
  var getArrowEl = (scope) => scope.getById(getArrowId(scope));
16
+ var getTriggerEls = (scope) => queryAll(scope.getDoc(), `[data-scope="tooltip"][data-part="trigger"][data-ownedby="${scope.id}"]`);
17
+ var getActiveTriggerEl = (scope, value) => {
18
+ return value == null ? getTriggerEls(scope)[0] : scope.getById(getTriggerId(scope, value));
19
+ };
10
20
  export {
21
+ getActiveTriggerEl,
11
22
  getArrowEl,
12
23
  getArrowId,
13
24
  getContentEl,
@@ -15,5 +26,6 @@ export {
15
26
  getPositionerEl,
16
27
  getPositionerId,
17
28
  getTriggerEl,
29
+ getTriggerEls,
18
30
  getTriggerId
19
31
  };
@@ -37,9 +37,9 @@ var import_core = require("@zag-js/core");
37
37
  var import_dom_query = require("@zag-js/dom-query");
38
38
  var import_focus_visible = require("@zag-js/focus-visible");
39
39
  var import_popper = require("@zag-js/popper");
40
+ var import_utils = require("@zag-js/utils");
40
41
  var dom = __toESM(require("./tooltip.dom.js"));
41
42
  var import_tooltip = require("./tooltip.store.js");
42
- var import_utils = require("@zag-js/utils");
43
43
  var { and, not } = (0, import_core.createGuards)();
44
44
  var machine = (0, import_core.createMachine)({
45
45
  initialState: ({ prop }) => {
@@ -67,9 +67,19 @@ var machine = (0, import_core.createMachine)({
67
67
  };
68
68
  },
69
69
  effects: ["trackFocusVisible", "trackStore"],
70
- context: ({ bindable }) => ({
70
+ context: ({ bindable, prop, scope }) => ({
71
71
  currentPlacement: bindable(() => ({ defaultValue: void 0 })),
72
- hasPointerMoveOpened: bindable(() => ({ defaultValue: false }))
72
+ hasPointerMoveOpened: bindable(() => ({ defaultValue: null })),
73
+ triggerValue: bindable(() => ({
74
+ defaultValue: prop("defaultTriggerValue") ?? null,
75
+ value: prop("triggerValue"),
76
+ onChange(value) {
77
+ const onTriggerValueChange = prop("onTriggerValueChange");
78
+ if (!onTriggerValueChange) return;
79
+ const triggerElement = dom.getActiveTriggerEl(scope, value);
80
+ onTriggerValueChange({ value, triggerElement });
81
+ }
82
+ }))
73
83
  }),
74
84
  watch({ track, action, prop }) {
75
85
  track([() => prop("disabled")], () => {
@@ -78,6 +88,14 @@ var machine = (0, import_core.createMachine)({
78
88
  track([() => prop("open")], () => {
79
89
  action(["toggleVisibility"]);
80
90
  });
91
+ track([() => prop("triggerValue")], () => {
92
+ action(["repositionImmediate"]);
93
+ });
94
+ },
95
+ on: {
96
+ "triggerValue.set": {
97
+ actions: ["setTriggerValue", "repositionImmediate"]
98
+ }
81
99
  },
82
100
  states: {
83
101
  closed: {
@@ -89,11 +107,11 @@ var machine = (0, import_core.createMachine)({
89
107
  open: [
90
108
  {
91
109
  guard: "isOpenControlled",
92
- actions: ["invokeOnOpen"]
110
+ actions: ["setTriggerValue", "invokeOnOpen"]
93
111
  },
94
112
  {
95
113
  target: "open",
96
- actions: ["invokeOnOpen"]
114
+ actions: ["setTriggerValue", "invokeOnOpen"]
97
115
  }
98
116
  ],
99
117
  "pointer.leave": {
@@ -102,12 +120,13 @@ var machine = (0, import_core.createMachine)({
102
120
  "pointer.move": [
103
121
  {
104
122
  guard: and("noVisibleTooltip", not("hasPointerMoveOpened")),
105
- target: "opening"
123
+ target: "opening",
124
+ actions: ["setTriggerValue"]
106
125
  },
107
126
  {
108
127
  guard: not("hasPointerMoveOpened"),
109
128
  target: "open",
110
- actions: ["setPointerMoveOpened", "invokeOnOpen"]
129
+ actions: ["setPointerMoveOpened", "invokeOnOpen", "setTriggerValue"]
111
130
  }
112
131
  ]
113
132
  }
@@ -134,11 +153,11 @@ var machine = (0, import_core.createMachine)({
134
153
  open: [
135
154
  {
136
155
  guard: "isOpenControlled",
137
- actions: ["invokeOnOpen"]
156
+ actions: ["setTriggerValue", "invokeOnOpen"]
138
157
  },
139
158
  {
140
159
  target: "open",
141
- actions: ["invokeOnOpen"]
160
+ actions: ["setTriggerValue", "invokeOnOpen"]
142
161
  }
143
162
  ],
144
163
  "pointer.leave": [
@@ -204,6 +223,12 @@ var machine = (0, import_core.createMachine)({
204
223
  },
205
224
  "positioning.set": {
206
225
  actions: ["reposition"]
226
+ },
227
+ "triggerValue.set": {
228
+ // Transition to closing (which cleans up trackPositioning) then immediately back to open
229
+ // This re-creates the positioning effect with the new trigger
230
+ target: "closing",
231
+ actions: ["setTriggerValue", "immediateReopen"]
207
232
  }
208
233
  }
209
234
  },
@@ -240,13 +265,20 @@ var machine = (0, import_core.createMachine)({
240
265
  {
241
266
  guard: "isOpenControlled",
242
267
  // We trigger toggleVisibility manually since the `ctx.open` has not changed yet (at this point)
243
- actions: ["setPointerMoveOpened", "invokeOnOpen", "toggleVisibility"]
268
+ actions: ["setPointerMoveOpened", "setTriggerValue", "invokeOnOpen", "toggleVisibility"]
244
269
  },
245
270
  {
246
271
  target: "open",
247
- actions: ["setPointerMoveOpened", "invokeOnOpen"]
272
+ actions: ["setPointerMoveOpened", "setTriggerValue", "invokeOnOpen"]
248
273
  }
249
274
  ],
275
+ "triggerValue.set": {
276
+ target: "open",
277
+ actions: ["setTriggerValue", "repositionImmediate"]
278
+ },
279
+ reopen: {
280
+ target: "open"
281
+ },
250
282
  "content.pointer.move": {
251
283
  guard: "isInteractive",
252
284
  target: "open"
@@ -262,7 +294,7 @@ var machine = (0, import_core.createMachine)({
262
294
  noVisibleTooltip: () => import_tooltip.store.get("id") === null,
263
295
  isVisible: ({ prop }) => prop("id") === import_tooltip.store.get("id"),
264
296
  isInteractive: ({ prop }) => !!prop("interactive"),
265
- hasPointerMoveOpened: ({ context }) => context.get("hasPointerMoveOpened"),
297
+ hasPointerMoveOpened: ({ context }) => !!context.get("hasPointerMoveOpened"),
266
298
  isOpenControlled: ({ prop }) => prop("open") !== void 0
267
299
  },
268
300
  actions: {
@@ -289,16 +321,27 @@ var machine = (0, import_core.createMachine)({
289
321
  reposition: ({ context, event, prop, scope }) => {
290
322
  if (event.type !== "positioning.set") return;
291
323
  const getPositionerEl2 = () => dom.getPositionerEl(scope);
292
- return (0, import_popper.getPlacement)(dom.getTriggerEl(scope), getPositionerEl2, {
324
+ const getTriggerEl = () => dom.getActiveTriggerEl(scope, context.get("triggerValue"));
325
+ (0, import_popper.getPlacement)(getTriggerEl, getPositionerEl2, {
293
326
  ...prop("positioning"),
294
327
  ...event.options,
295
- defer: true,
296
328
  listeners: false,
297
329
  onComplete(data) {
298
330
  context.set("currentPlacement", data.placement);
299
331
  }
300
332
  });
301
333
  },
334
+ repositionImmediate: ({ context, event, prop, scope }) => {
335
+ const triggerValue = event.value ?? context.get("triggerValue");
336
+ const getPositionerEl2 = () => dom.getPositionerEl(scope);
337
+ const getTriggerEl = () => dom.getActiveTriggerEl(scope, triggerValue);
338
+ return (0, import_popper.getPlacement)(getTriggerEl, getPositionerEl2, {
339
+ ...prop("positioning"),
340
+ onComplete(data) {
341
+ context.set("currentPlacement", data.placement);
342
+ }
343
+ });
344
+ },
302
345
  toggleVisibility: ({ prop, event, send }) => {
303
346
  queueMicrotask(() => {
304
347
  send({
@@ -307,11 +350,21 @@ var machine = (0, import_core.createMachine)({
307
350
  });
308
351
  });
309
352
  },
310
- setPointerMoveOpened: ({ context }) => {
311
- context.set("hasPointerMoveOpened", true);
353
+ setPointerMoveOpened: ({ context, event }) => {
354
+ const triggerId = event.triggerId ?? event.previousEvent?.triggerId;
355
+ context.set("hasPointerMoveOpened", triggerId ?? null);
312
356
  },
313
357
  clearPointerMoveOpened: ({ context }) => {
314
- context.set("hasPointerMoveOpened", false);
358
+ context.set("hasPointerMoveOpened", null);
359
+ },
360
+ setTriggerValue: ({ context, event }) => {
361
+ if (event.value === void 0) return;
362
+ context.set("triggerValue", event.value);
363
+ },
364
+ immediateReopen: ({ send }) => {
365
+ queueMicrotask(() => {
366
+ send({ type: "reopen" });
367
+ });
315
368
  }
316
369
  },
317
370
  effects: {
@@ -323,7 +376,8 @@ var machine = (0, import_core.createMachine)({
323
376
  context.set("currentPlacement", prop("positioning").placement);
324
377
  }
325
378
  const getPositionerEl2 = () => dom.getPositionerEl(scope);
326
- return (0, import_popper.getPlacement)(dom.getTriggerEl(scope), getPositionerEl2, {
379
+ const getTriggerEl = () => dom.getActiveTriggerEl(scope, context.get("triggerValue"));
380
+ return (0, import_popper.getPlacement)(getTriggerEl, getPositionerEl2, {
327
381
  ...prop("positioning"),
328
382
  defer: true,
329
383
  onComplete(data) {
@@ -336,9 +390,10 @@ var machine = (0, import_core.createMachine)({
336
390
  const onChange = () => send({ type: "close", src: "pointerlock:change" });
337
391
  return (0, import_dom_query.addDomEvent)(doc, "pointerlockchange", onChange, false);
338
392
  },
339
- trackScroll: ({ send, prop, scope }) => {
393
+ trackScroll: ({ send, prop, scope, context }) => {
340
394
  if (!prop("closeOnScroll")) return;
341
- const triggerEl = dom.getTriggerEl(scope);
395
+ const triggerValue = context.get("triggerValue");
396
+ const triggerEl = dom.getActiveTriggerEl(scope, triggerValue);
342
397
  if (!triggerEl) return;
343
398
  const overflowParents = (0, import_dom_query.getOverflowAncestors)(triggerEl);
344
399
  const cleanups = overflowParents.map((overflowParent) => {
@@ -375,15 +430,15 @@ var machine = (0, import_core.createMachine)({
375
430
  };
376
431
  return (0, import_dom_query.addDomEvent)(document, "keydown", onKeyDown, true);
377
432
  },
378
- waitForOpenDelay: ({ send, prop }) => {
433
+ waitForOpenDelay: ({ send, prop, event }) => {
379
434
  const id = setTimeout(() => {
380
- send({ type: "after.openDelay" });
435
+ send({ type: "after.openDelay", previousEvent: event });
381
436
  }, prop("openDelay"));
382
437
  return () => clearTimeout(id);
383
438
  },
384
- waitForCloseDelay: ({ send, prop }) => {
439
+ waitForCloseDelay: ({ send, prop, event }) => {
385
440
  const id = setTimeout(() => {
386
- send({ type: "after.closeDelay" });
441
+ send({ type: "after.closeDelay", previousEvent: event });
387
442
  }, prop("closeDelay"));
388
443
  return () => clearTimeout(id);
389
444
  }
@@ -3,9 +3,9 @@ import { createGuards, createMachine } from "@zag-js/core";
3
3
  import { addDomEvent, getOverflowAncestors, isComposingEvent } from "@zag-js/dom-query";
4
4
  import { trackFocusVisible } from "@zag-js/focus-visible";
5
5
  import { getPlacement } from "@zag-js/popper";
6
+ import { ensureProps } from "@zag-js/utils";
6
7
  import * as dom from "./tooltip.dom.mjs";
7
8
  import { store } from "./tooltip.store.mjs";
8
- import { ensureProps } from "@zag-js/utils";
9
9
  var { and, not } = createGuards();
10
10
  var machine = createMachine({
11
11
  initialState: ({ prop }) => {
@@ -33,9 +33,19 @@ var machine = createMachine({
33
33
  };
34
34
  },
35
35
  effects: ["trackFocusVisible", "trackStore"],
36
- context: ({ bindable }) => ({
36
+ context: ({ bindable, prop, scope }) => ({
37
37
  currentPlacement: bindable(() => ({ defaultValue: void 0 })),
38
- hasPointerMoveOpened: bindable(() => ({ defaultValue: false }))
38
+ hasPointerMoveOpened: bindable(() => ({ defaultValue: null })),
39
+ triggerValue: bindable(() => ({
40
+ defaultValue: prop("defaultTriggerValue") ?? null,
41
+ value: prop("triggerValue"),
42
+ onChange(value) {
43
+ const onTriggerValueChange = prop("onTriggerValueChange");
44
+ if (!onTriggerValueChange) return;
45
+ const triggerElement = dom.getActiveTriggerEl(scope, value);
46
+ onTriggerValueChange({ value, triggerElement });
47
+ }
48
+ }))
39
49
  }),
40
50
  watch({ track, action, prop }) {
41
51
  track([() => prop("disabled")], () => {
@@ -44,6 +54,14 @@ var machine = createMachine({
44
54
  track([() => prop("open")], () => {
45
55
  action(["toggleVisibility"]);
46
56
  });
57
+ track([() => prop("triggerValue")], () => {
58
+ action(["repositionImmediate"]);
59
+ });
60
+ },
61
+ on: {
62
+ "triggerValue.set": {
63
+ actions: ["setTriggerValue", "repositionImmediate"]
64
+ }
47
65
  },
48
66
  states: {
49
67
  closed: {
@@ -55,11 +73,11 @@ var machine = createMachine({
55
73
  open: [
56
74
  {
57
75
  guard: "isOpenControlled",
58
- actions: ["invokeOnOpen"]
76
+ actions: ["setTriggerValue", "invokeOnOpen"]
59
77
  },
60
78
  {
61
79
  target: "open",
62
- actions: ["invokeOnOpen"]
80
+ actions: ["setTriggerValue", "invokeOnOpen"]
63
81
  }
64
82
  ],
65
83
  "pointer.leave": {
@@ -68,12 +86,13 @@ var machine = createMachine({
68
86
  "pointer.move": [
69
87
  {
70
88
  guard: and("noVisibleTooltip", not("hasPointerMoveOpened")),
71
- target: "opening"
89
+ target: "opening",
90
+ actions: ["setTriggerValue"]
72
91
  },
73
92
  {
74
93
  guard: not("hasPointerMoveOpened"),
75
94
  target: "open",
76
- actions: ["setPointerMoveOpened", "invokeOnOpen"]
95
+ actions: ["setPointerMoveOpened", "invokeOnOpen", "setTriggerValue"]
77
96
  }
78
97
  ]
79
98
  }
@@ -100,11 +119,11 @@ var machine = createMachine({
100
119
  open: [
101
120
  {
102
121
  guard: "isOpenControlled",
103
- actions: ["invokeOnOpen"]
122
+ actions: ["setTriggerValue", "invokeOnOpen"]
104
123
  },
105
124
  {
106
125
  target: "open",
107
- actions: ["invokeOnOpen"]
126
+ actions: ["setTriggerValue", "invokeOnOpen"]
108
127
  }
109
128
  ],
110
129
  "pointer.leave": [
@@ -170,6 +189,12 @@ var machine = createMachine({
170
189
  },
171
190
  "positioning.set": {
172
191
  actions: ["reposition"]
192
+ },
193
+ "triggerValue.set": {
194
+ // Transition to closing (which cleans up trackPositioning) then immediately back to open
195
+ // This re-creates the positioning effect with the new trigger
196
+ target: "closing",
197
+ actions: ["setTriggerValue", "immediateReopen"]
173
198
  }
174
199
  }
175
200
  },
@@ -206,13 +231,20 @@ var machine = createMachine({
206
231
  {
207
232
  guard: "isOpenControlled",
208
233
  // We trigger toggleVisibility manually since the `ctx.open` has not changed yet (at this point)
209
- actions: ["setPointerMoveOpened", "invokeOnOpen", "toggleVisibility"]
234
+ actions: ["setPointerMoveOpened", "setTriggerValue", "invokeOnOpen", "toggleVisibility"]
210
235
  },
211
236
  {
212
237
  target: "open",
213
- actions: ["setPointerMoveOpened", "invokeOnOpen"]
238
+ actions: ["setPointerMoveOpened", "setTriggerValue", "invokeOnOpen"]
214
239
  }
215
240
  ],
241
+ "triggerValue.set": {
242
+ target: "open",
243
+ actions: ["setTriggerValue", "repositionImmediate"]
244
+ },
245
+ reopen: {
246
+ target: "open"
247
+ },
216
248
  "content.pointer.move": {
217
249
  guard: "isInteractive",
218
250
  target: "open"
@@ -228,7 +260,7 @@ var machine = createMachine({
228
260
  noVisibleTooltip: () => store.get("id") === null,
229
261
  isVisible: ({ prop }) => prop("id") === store.get("id"),
230
262
  isInteractive: ({ prop }) => !!prop("interactive"),
231
- hasPointerMoveOpened: ({ context }) => context.get("hasPointerMoveOpened"),
263
+ hasPointerMoveOpened: ({ context }) => !!context.get("hasPointerMoveOpened"),
232
264
  isOpenControlled: ({ prop }) => prop("open") !== void 0
233
265
  },
234
266
  actions: {
@@ -255,16 +287,27 @@ var machine = createMachine({
255
287
  reposition: ({ context, event, prop, scope }) => {
256
288
  if (event.type !== "positioning.set") return;
257
289
  const getPositionerEl2 = () => dom.getPositionerEl(scope);
258
- return getPlacement(dom.getTriggerEl(scope), getPositionerEl2, {
290
+ const getTriggerEl = () => dom.getActiveTriggerEl(scope, context.get("triggerValue"));
291
+ getPlacement(getTriggerEl, getPositionerEl2, {
259
292
  ...prop("positioning"),
260
293
  ...event.options,
261
- defer: true,
262
294
  listeners: false,
263
295
  onComplete(data) {
264
296
  context.set("currentPlacement", data.placement);
265
297
  }
266
298
  });
267
299
  },
300
+ repositionImmediate: ({ context, event, prop, scope }) => {
301
+ const triggerValue = event.value ?? context.get("triggerValue");
302
+ const getPositionerEl2 = () => dom.getPositionerEl(scope);
303
+ const getTriggerEl = () => dom.getActiveTriggerEl(scope, triggerValue);
304
+ return getPlacement(getTriggerEl, getPositionerEl2, {
305
+ ...prop("positioning"),
306
+ onComplete(data) {
307
+ context.set("currentPlacement", data.placement);
308
+ }
309
+ });
310
+ },
268
311
  toggleVisibility: ({ prop, event, send }) => {
269
312
  queueMicrotask(() => {
270
313
  send({
@@ -273,11 +316,21 @@ var machine = createMachine({
273
316
  });
274
317
  });
275
318
  },
276
- setPointerMoveOpened: ({ context }) => {
277
- context.set("hasPointerMoveOpened", true);
319
+ setPointerMoveOpened: ({ context, event }) => {
320
+ const triggerId = event.triggerId ?? event.previousEvent?.triggerId;
321
+ context.set("hasPointerMoveOpened", triggerId ?? null);
278
322
  },
279
323
  clearPointerMoveOpened: ({ context }) => {
280
- context.set("hasPointerMoveOpened", false);
324
+ context.set("hasPointerMoveOpened", null);
325
+ },
326
+ setTriggerValue: ({ context, event }) => {
327
+ if (event.value === void 0) return;
328
+ context.set("triggerValue", event.value);
329
+ },
330
+ immediateReopen: ({ send }) => {
331
+ queueMicrotask(() => {
332
+ send({ type: "reopen" });
333
+ });
281
334
  }
282
335
  },
283
336
  effects: {
@@ -289,7 +342,8 @@ var machine = createMachine({
289
342
  context.set("currentPlacement", prop("positioning").placement);
290
343
  }
291
344
  const getPositionerEl2 = () => dom.getPositionerEl(scope);
292
- return getPlacement(dom.getTriggerEl(scope), getPositionerEl2, {
345
+ const getTriggerEl = () => dom.getActiveTriggerEl(scope, context.get("triggerValue"));
346
+ return getPlacement(getTriggerEl, getPositionerEl2, {
293
347
  ...prop("positioning"),
294
348
  defer: true,
295
349
  onComplete(data) {
@@ -302,9 +356,10 @@ var machine = createMachine({
302
356
  const onChange = () => send({ type: "close", src: "pointerlock:change" });
303
357
  return addDomEvent(doc, "pointerlockchange", onChange, false);
304
358
  },
305
- trackScroll: ({ send, prop, scope }) => {
359
+ trackScroll: ({ send, prop, scope, context }) => {
306
360
  if (!prop("closeOnScroll")) return;
307
- const triggerEl = dom.getTriggerEl(scope);
361
+ const triggerValue = context.get("triggerValue");
362
+ const triggerEl = dom.getActiveTriggerEl(scope, triggerValue);
308
363
  if (!triggerEl) return;
309
364
  const overflowParents = getOverflowAncestors(triggerEl);
310
365
  const cleanups = overflowParents.map((overflowParent) => {
@@ -341,15 +396,15 @@ var machine = createMachine({
341
396
  };
342
397
  return addDomEvent(document, "keydown", onKeyDown, true);
343
398
  },
344
- waitForOpenDelay: ({ send, prop }) => {
399
+ waitForOpenDelay: ({ send, prop, event }) => {
345
400
  const id = setTimeout(() => {
346
- send({ type: "after.openDelay" });
401
+ send({ type: "after.openDelay", previousEvent: event });
347
402
  }, prop("openDelay"));
348
403
  return () => clearTimeout(id);
349
404
  },
350
- waitForCloseDelay: ({ send, prop }) => {
405
+ waitForCloseDelay: ({ send, prop, event }) => {
351
406
  const id = setTimeout(() => {
352
- send({ type: "after.closeDelay" });
407
+ send({ type: "after.closeDelay", previousEvent: event });
353
408
  }, prop("closeDelay"));
354
409
  return () => clearTimeout(id);
355
410
  }
@@ -29,10 +29,12 @@ var import_utils = require("@zag-js/utils");
29
29
  var props = (0, import_types.createProps)()([
30
30
  "aria-label",
31
31
  "closeDelay",
32
+ "closeOnClick",
32
33
  "closeOnEscape",
33
34
  "closeOnPointerDown",
34
35
  "closeOnScroll",
35
- "closeOnClick",
36
+ "defaultOpen",
37
+ "defaultTriggerValue",
36
38
  "dir",
37
39
  "disabled",
38
40
  "getRootNode",
@@ -40,10 +42,11 @@ var props = (0, import_types.createProps)()([
40
42
  "ids",
41
43
  "interactive",
42
44
  "onOpenChange",
43
- "defaultOpen",
45
+ "onTriggerValueChange",
44
46
  "open",
45
47
  "openDelay",
46
- "positioning"
48
+ "positioning",
49
+ "triggerValue"
47
50
  ]);
48
51
  var splitProps = (0, import_utils.createSplitProps)(props);
49
52
  // Annotate the CommonJS export names for ESM import in node:
@@ -4,10 +4,12 @@ import { createSplitProps } from "@zag-js/utils";
4
4
  var props = createProps()([
5
5
  "aria-label",
6
6
  "closeDelay",
7
+ "closeOnClick",
7
8
  "closeOnEscape",
8
9
  "closeOnPointerDown",
9
10
  "closeOnScroll",
10
- "closeOnClick",
11
+ "defaultOpen",
12
+ "defaultTriggerValue",
11
13
  "dir",
12
14
  "disabled",
13
15
  "getRootNode",
@@ -15,10 +17,11 @@ var props = createProps()([
15
17
  "ids",
16
18
  "interactive",
17
19
  "onOpenChange",
18
- "defaultOpen",
20
+ "onTriggerValueChange",
19
21
  "open",
20
22
  "openDelay",
21
- "positioning"
23
+ "positioning",
24
+ "triggerValue"
22
25
  ]);
23
26
  var splitProps = createSplitProps(props);
24
27
  export {
@@ -6,8 +6,18 @@ import { PropTypes, RequiredBy, DirectionProperty, CommonProperties } from '@zag
6
6
  interface OpenChangeDetails {
7
7
  open: boolean;
8
8
  }
9
+ interface TriggerValueChangeDetails {
10
+ /**
11
+ * The value of the trigger
12
+ */
13
+ value: string | null;
14
+ /**
15
+ * The trigger element
16
+ */
17
+ triggerElement: HTMLElement | null;
18
+ }
9
19
  type ElementIds = Partial<{
10
- trigger: string;
20
+ trigger: string | ((value?: string) => string);
11
21
  content: string;
12
22
  arrow: string;
13
23
  positioner: string;
@@ -80,6 +90,19 @@ interface TooltipProps extends DirectionProperty, CommonProperties {
80
90
  * Use when you don't need to control the open state of the tooltip.
81
91
  */
82
92
  defaultOpen?: boolean | undefined;
93
+ /**
94
+ * The controlled trigger value
95
+ */
96
+ triggerValue?: string | null | undefined;
97
+ /**
98
+ * The initial trigger value when rendered.
99
+ * Use when you don't need to control the trigger value.
100
+ */
101
+ defaultTriggerValue?: string | null | undefined;
102
+ /**
103
+ * Function called when the trigger value changes.
104
+ */
105
+ onTriggerValueChange?: ((details: TriggerValueChangeDetails) => void) | undefined;
83
106
  }
84
107
  type PropsWithDefault = "openDelay" | "closeDelay" | "closeOnPointerDown" | "closeOnEscape" | "closeOnScroll" | "closeOnClick" | "interactive" | "id" | "positioning";
85
108
  interface TooltipSchema {
@@ -87,7 +110,8 @@ interface TooltipSchema {
87
110
  props: RequiredBy<TooltipProps, PropsWithDefault>;
88
111
  context: {
89
112
  currentPlacement: Placement | undefined;
90
- hasPointerMoveOpened: boolean;
113
+ hasPointerMoveOpened: string | null;
114
+ triggerValue: string | null;
91
115
  };
92
116
  event: EventObject;
93
117
  action: string;
@@ -96,6 +120,12 @@ interface TooltipSchema {
96
120
  }
97
121
  type TooltipService = Service<TooltipSchema>;
98
122
  type TooltipMachine = Machine<TooltipSchema>;
123
+ interface TriggerProps {
124
+ /**
125
+ * The value that identifies this specific trigger
126
+ */
127
+ value?: string;
128
+ }
99
129
  interface TooltipApi<T extends PropTypes = PropTypes> {
100
130
  /**
101
131
  * Whether the tooltip is open.
@@ -105,15 +135,23 @@ interface TooltipApi<T extends PropTypes = PropTypes> {
105
135
  * Function to open the tooltip.
106
136
  */
107
137
  setOpen: (open: boolean) => void;
138
+ /**
139
+ * The trigger value
140
+ */
141
+ triggerValue: string | null;
142
+ /**
143
+ * Function to set the trigger value
144
+ */
145
+ setTriggerValue: (value: string | null) => void;
108
146
  /**
109
147
  * Function to reposition the popover
110
148
  */
111
149
  reposition: (options?: Partial<PositioningOptions>) => void;
112
- getTriggerProps: () => T["button"];
150
+ getTriggerProps: (props?: TriggerProps) => T["button"];
113
151
  getArrowProps: () => T["element"];
114
152
  getArrowTipProps: () => T["element"];
115
153
  getPositionerProps: () => T["element"];
116
154
  getContentProps: () => T["element"];
117
155
  }
118
156
 
119
- export type { ElementIds, OpenChangeDetails, TooltipApi, TooltipMachine, TooltipProps, TooltipSchema, TooltipService };
157
+ export type { ElementIds, OpenChangeDetails, TooltipApi, TooltipMachine, TooltipProps, TooltipSchema, TooltipService, TriggerProps, TriggerValueChangeDetails };
@@ -6,8 +6,18 @@ import { PropTypes, RequiredBy, DirectionProperty, CommonProperties } from '@zag
6
6
  interface OpenChangeDetails {
7
7
  open: boolean;
8
8
  }
9
+ interface TriggerValueChangeDetails {
10
+ /**
11
+ * The value of the trigger
12
+ */
13
+ value: string | null;
14
+ /**
15
+ * The trigger element
16
+ */
17
+ triggerElement: HTMLElement | null;
18
+ }
9
19
  type ElementIds = Partial<{
10
- trigger: string;
20
+ trigger: string | ((value?: string) => string);
11
21
  content: string;
12
22
  arrow: string;
13
23
  positioner: string;
@@ -80,6 +90,19 @@ interface TooltipProps extends DirectionProperty, CommonProperties {
80
90
  * Use when you don't need to control the open state of the tooltip.
81
91
  */
82
92
  defaultOpen?: boolean | undefined;
93
+ /**
94
+ * The controlled trigger value
95
+ */
96
+ triggerValue?: string | null | undefined;
97
+ /**
98
+ * The initial trigger value when rendered.
99
+ * Use when you don't need to control the trigger value.
100
+ */
101
+ defaultTriggerValue?: string | null | undefined;
102
+ /**
103
+ * Function called when the trigger value changes.
104
+ */
105
+ onTriggerValueChange?: ((details: TriggerValueChangeDetails) => void) | undefined;
83
106
  }
84
107
  type PropsWithDefault = "openDelay" | "closeDelay" | "closeOnPointerDown" | "closeOnEscape" | "closeOnScroll" | "closeOnClick" | "interactive" | "id" | "positioning";
85
108
  interface TooltipSchema {
@@ -87,7 +110,8 @@ interface TooltipSchema {
87
110
  props: RequiredBy<TooltipProps, PropsWithDefault>;
88
111
  context: {
89
112
  currentPlacement: Placement | undefined;
90
- hasPointerMoveOpened: boolean;
113
+ hasPointerMoveOpened: string | null;
114
+ triggerValue: string | null;
91
115
  };
92
116
  event: EventObject;
93
117
  action: string;
@@ -96,6 +120,12 @@ interface TooltipSchema {
96
120
  }
97
121
  type TooltipService = Service<TooltipSchema>;
98
122
  type TooltipMachine = Machine<TooltipSchema>;
123
+ interface TriggerProps {
124
+ /**
125
+ * The value that identifies this specific trigger
126
+ */
127
+ value?: string;
128
+ }
99
129
  interface TooltipApi<T extends PropTypes = PropTypes> {
100
130
  /**
101
131
  * Whether the tooltip is open.
@@ -105,15 +135,23 @@ interface TooltipApi<T extends PropTypes = PropTypes> {
105
135
  * Function to open the tooltip.
106
136
  */
107
137
  setOpen: (open: boolean) => void;
138
+ /**
139
+ * The trigger value
140
+ */
141
+ triggerValue: string | null;
142
+ /**
143
+ * Function to set the trigger value
144
+ */
145
+ setTriggerValue: (value: string | null) => void;
108
146
  /**
109
147
  * Function to reposition the popover
110
148
  */
111
149
  reposition: (options?: Partial<PositioningOptions>) => void;
112
- getTriggerProps: () => T["button"];
150
+ getTriggerProps: (props?: TriggerProps) => T["button"];
113
151
  getArrowProps: () => T["element"];
114
152
  getArrowTipProps: () => T["element"];
115
153
  getPositionerProps: () => T["element"];
116
154
  getContentProps: () => T["element"];
117
155
  }
118
156
 
119
- export type { ElementIds, OpenChangeDetails, TooltipApi, TooltipMachine, TooltipProps, TooltipSchema, TooltipService };
157
+ export type { ElementIds, OpenChangeDetails, TooltipApi, TooltipMachine, TooltipProps, TooltipSchema, TooltipService, TriggerProps, TriggerValueChangeDetails };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zag-js/tooltip",
3
- "version": "1.38.2",
3
+ "version": "1.39.0",
4
4
  "description": "Core logic for the tooltip widget implemented as a state machine",
5
5
  "keywords": [
6
6
  "js",
@@ -26,13 +26,13 @@
26
26
  "url": "https://github.com/chakra-ui/zag/issues"
27
27
  },
28
28
  "dependencies": {
29
- "@zag-js/anatomy": "1.38.2",
30
- "@zag-js/core": "1.38.2",
31
- "@zag-js/popper": "1.38.2",
32
- "@zag-js/focus-visible": "1.38.2",
33
- "@zag-js/dom-query": "1.38.2",
34
- "@zag-js/utils": "1.38.2",
35
- "@zag-js/types": "1.38.2"
29
+ "@zag-js/anatomy": "1.39.0",
30
+ "@zag-js/core": "1.39.0",
31
+ "@zag-js/popper": "1.39.0",
32
+ "@zag-js/focus-visible": "1.39.0",
33
+ "@zag-js/dom-query": "1.39.0",
34
+ "@zag-js/utils": "1.39.0",
35
+ "@zag-js/types": "1.39.0"
36
36
  },
37
37
  "devDependencies": {
38
38
  "clean-package": "2.2.0"