@zag-js/tabs 0.19.1 → 0.21.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
@@ -5,9 +5,15 @@ import { StateMachine } from '@zag-js/core';
5
5
 
6
6
  declare const anatomy: _zag_js_anatomy.AnatomyInstance<"root" | "list" | "trigger" | "content" | "indicator">;
7
7
 
8
- type IntlTranslations = {
8
+ interface ValueChangeDetails {
9
+ value: string;
10
+ }
11
+ interface FocusChangeDetails {
12
+ focusedValue: string;
13
+ }
14
+ interface IntlTranslations {
9
15
  tablistLabel?: string;
10
- };
16
+ }
11
17
  type ElementIds = Partial<{
12
18
  root: string;
13
19
  trigger: string;
@@ -15,14 +21,7 @@ type ElementIds = Partial<{
15
21
  content: string;
16
22
  indicator: string;
17
23
  }>;
18
- type TriggerProps = {
19
- value: string;
20
- disabled?: boolean;
21
- };
22
- type ContentProps = {
23
- value: string;
24
- };
25
- type PublicContext = DirectionProperty & CommonProperties & {
24
+ interface PublicContext extends DirectionProperty, CommonProperties {
26
25
  /**
27
26
  * The ids of the elements in the tabs. Useful for composition.
28
27
  */
@@ -58,16 +57,12 @@ type PublicContext = DirectionProperty & CommonProperties & {
58
57
  /**
59
58
  * Callback to be called when the selected/active tab changes
60
59
  */
61
- onChange?: (details: {
62
- value: string;
63
- }) => void;
60
+ onValueChange?: (details: ValueChangeDetails) => void;
64
61
  /**
65
62
  * Callback to be called when the focused tab changes
66
63
  */
67
- onFocus?: (details: {
68
- value: string;
69
- }) => void;
70
- };
64
+ onFocusChange?: (details: FocusChangeDetails) => void;
65
+ }
71
66
  type UserDefinedContext = RequiredBy<PublicContext, "id">;
72
67
  type ComputedContext = Readonly<{
73
68
  /**
@@ -82,13 +77,25 @@ type ComputedContext = Readonly<{
82
77
  isVertical: boolean;
83
78
  }>;
84
79
  type PrivateContext = Context<{}>;
85
- type MachineContext = PublicContext & ComputedContext & PrivateContext;
86
- type MachineState = {
80
+ interface MachineContext extends PublicContext, ComputedContext, PrivateContext {
81
+ }
82
+ interface MachineState {
87
83
  value: "idle" | "focused";
88
- };
84
+ }
89
85
  type State = StateMachine.State<MachineContext, MachineState>;
90
86
  type Send = StateMachine.Send<StateMachine.AnyEventObject>;
91
- type MachineApi<T extends PropTypes = PropTypes> = {
87
+ interface TriggerProps {
88
+ value: string;
89
+ disabled?: boolean;
90
+ }
91
+ interface TriggerState {
92
+ isSelected: boolean;
93
+ isFocused: boolean;
94
+ }
95
+ interface ContentProps {
96
+ value: string;
97
+ }
98
+ interface MachineApi<T extends PropTypes = PropTypes> {
92
99
  /**
93
100
  * The current value of the tabs.
94
101
  */
@@ -110,15 +117,19 @@ type MachineApi<T extends PropTypes = PropTypes> = {
110
117
  */
111
118
  clearValue(): void;
112
119
  /**
113
- * Sets the indicator rect to the tab with the given id.
120
+ * Sets the indicator rect to the tab with the given value
121
+ */
122
+ setIndicatorRect(value: string): void;
123
+ /**
124
+ * Returns the state of the trigger with the given props
114
125
  */
115
- setIndicatorRect(id: string | null | undefined): void;
126
+ getTriggerState(props: TriggerProps): TriggerState;
116
127
  rootProps: T["element"];
117
128
  tablistProps: T["element"];
118
129
  getTriggerProps(props: TriggerProps): T["button"];
119
- getContentProps({ value }: ContentProps): T["element"];
130
+ getContentProps(props: ContentProps): T["element"];
120
131
  indicatorProps: T["element"];
121
- };
132
+ }
122
133
 
123
134
  declare function connect<T extends PropTypes>(state: State, send: Send, normalize: NormalizeProps<T>): MachineApi<T>;
124
135
 
package/dist/index.d.ts CHANGED
@@ -5,9 +5,15 @@ import { StateMachine } from '@zag-js/core';
5
5
 
6
6
  declare const anatomy: _zag_js_anatomy.AnatomyInstance<"root" | "list" | "trigger" | "content" | "indicator">;
7
7
 
8
- type IntlTranslations = {
8
+ interface ValueChangeDetails {
9
+ value: string;
10
+ }
11
+ interface FocusChangeDetails {
12
+ focusedValue: string;
13
+ }
14
+ interface IntlTranslations {
9
15
  tablistLabel?: string;
10
- };
16
+ }
11
17
  type ElementIds = Partial<{
12
18
  root: string;
13
19
  trigger: string;
@@ -15,14 +21,7 @@ type ElementIds = Partial<{
15
21
  content: string;
16
22
  indicator: string;
17
23
  }>;
18
- type TriggerProps = {
19
- value: string;
20
- disabled?: boolean;
21
- };
22
- type ContentProps = {
23
- value: string;
24
- };
25
- type PublicContext = DirectionProperty & CommonProperties & {
24
+ interface PublicContext extends DirectionProperty, CommonProperties {
26
25
  /**
27
26
  * The ids of the elements in the tabs. Useful for composition.
28
27
  */
@@ -58,16 +57,12 @@ type PublicContext = DirectionProperty & CommonProperties & {
58
57
  /**
59
58
  * Callback to be called when the selected/active tab changes
60
59
  */
61
- onChange?: (details: {
62
- value: string;
63
- }) => void;
60
+ onValueChange?: (details: ValueChangeDetails) => void;
64
61
  /**
65
62
  * Callback to be called when the focused tab changes
66
63
  */
67
- onFocus?: (details: {
68
- value: string;
69
- }) => void;
70
- };
64
+ onFocusChange?: (details: FocusChangeDetails) => void;
65
+ }
71
66
  type UserDefinedContext = RequiredBy<PublicContext, "id">;
72
67
  type ComputedContext = Readonly<{
73
68
  /**
@@ -82,13 +77,25 @@ type ComputedContext = Readonly<{
82
77
  isVertical: boolean;
83
78
  }>;
84
79
  type PrivateContext = Context<{}>;
85
- type MachineContext = PublicContext & ComputedContext & PrivateContext;
86
- type MachineState = {
80
+ interface MachineContext extends PublicContext, ComputedContext, PrivateContext {
81
+ }
82
+ interface MachineState {
87
83
  value: "idle" | "focused";
88
- };
84
+ }
89
85
  type State = StateMachine.State<MachineContext, MachineState>;
90
86
  type Send = StateMachine.Send<StateMachine.AnyEventObject>;
91
- type MachineApi<T extends PropTypes = PropTypes> = {
87
+ interface TriggerProps {
88
+ value: string;
89
+ disabled?: boolean;
90
+ }
91
+ interface TriggerState {
92
+ isSelected: boolean;
93
+ isFocused: boolean;
94
+ }
95
+ interface ContentProps {
96
+ value: string;
97
+ }
98
+ interface MachineApi<T extends PropTypes = PropTypes> {
92
99
  /**
93
100
  * The current value of the tabs.
94
101
  */
@@ -110,15 +117,19 @@ type MachineApi<T extends PropTypes = PropTypes> = {
110
117
  */
111
118
  clearValue(): void;
112
119
  /**
113
- * Sets the indicator rect to the tab with the given id.
120
+ * Sets the indicator rect to the tab with the given value
121
+ */
122
+ setIndicatorRect(value: string): void;
123
+ /**
124
+ * Returns the state of the trigger with the given props
114
125
  */
115
- setIndicatorRect(id: string | null | undefined): void;
126
+ getTriggerState(props: TriggerProps): TriggerState;
116
127
  rootProps: T["element"];
117
128
  tablistProps: T["element"];
118
129
  getTriggerProps(props: TriggerProps): T["button"];
119
- getContentProps({ value }: ContentProps): T["element"];
130
+ getContentProps(props: ContentProps): T["element"];
120
131
  indicatorProps: T["element"];
121
- };
132
+ }
122
133
 
123
134
  declare function connect<T extends PropTypes>(state: State, send: Send, normalize: NormalizeProps<T>): MachineApi<T>;
124
135
 
package/dist/index.js CHANGED
@@ -93,6 +93,13 @@ var dom = (0, import_dom_query.createScope)({
93
93
  function connect(state, send, normalize) {
94
94
  const translations = state.context.translations;
95
95
  const isFocused = state.matches("focused");
96
+ function getTriggerState(props) {
97
+ return {
98
+ isSelected: state.context.value === props.value,
99
+ isFocused: state.context.focusedValue === props.value,
100
+ isDisabled: !!props.disabled
101
+ };
102
+ }
96
103
  return {
97
104
  value: state.context.value,
98
105
  focusedValue: state.context.focusedValue,
@@ -103,9 +110,11 @@ function connect(state, send, normalize) {
103
110
  clearValue() {
104
111
  send({ type: "CLEAR_VALUE" });
105
112
  },
106
- setIndicatorRect(id) {
113
+ setIndicatorRect(value) {
114
+ const id = dom.getTriggerId(state.context, value);
107
115
  send({ type: "SET_INDICATOR_RECT", id });
108
116
  },
117
+ getTriggerState,
109
118
  rootProps: normalize.element({
110
119
  ...parts.root.attrs,
111
120
  id: dom.getRootId(state.context),
@@ -117,6 +126,7 @@ function connect(state, send, normalize) {
117
126
  ...parts.list.attrs,
118
127
  id: dom.getTablistId(state.context),
119
128
  role: "tablist",
129
+ dir: state.context.dir,
120
130
  "data-focus": (0, import_dom_query2.dataAttr)(isFocused),
121
131
  "aria-orientation": state.context.orientation,
122
132
  "data-orientation": state.context.orientation,
@@ -157,22 +167,24 @@ function connect(state, send, normalize) {
157
167
  }),
158
168
  getTriggerProps(props) {
159
169
  const { value, disabled } = props;
160
- const selected = state.context.value === value;
170
+ const triggerState = getTriggerState(props);
161
171
  return normalize.button({
162
172
  ...parts.trigger.attrs,
163
173
  role: "tab",
164
174
  type: "button",
165
175
  disabled,
176
+ dir: state.context.dir,
166
177
  "data-orientation": state.context.orientation,
167
178
  "data-disabled": (0, import_dom_query2.dataAttr)(disabled),
168
179
  "aria-disabled": disabled,
169
180
  "data-value": value,
170
- "aria-selected": selected,
171
- "data-selected": (0, import_dom_query2.dataAttr)(selected),
181
+ "aria-selected": triggerState.isSelected,
182
+ "data-selected": (0, import_dom_query2.dataAttr)(triggerState.isSelected),
183
+ "data-focus": (0, import_dom_query2.dataAttr)(triggerState.isFocused),
172
184
  "aria-controls": dom.getContentId(state.context, value),
173
185
  "data-ownedby": dom.getTablistId(state.context),
174
186
  id: dom.getTriggerId(state.context, value),
175
- tabIndex: selected ? 0 : -1,
187
+ tabIndex: triggerState.isSelected ? 0 : -1,
176
188
  onFocus() {
177
189
  send({ type: "TAB_FOCUS", value });
178
190
  },
@@ -192,16 +204,19 @@ function connect(state, send, normalize) {
192
204
  }
193
205
  });
194
206
  },
195
- getContentProps({ value }) {
207
+ getContentProps(props) {
208
+ const { value } = props;
196
209
  const selected = state.context.value === value;
197
210
  return normalize.element({
198
211
  ...parts.content.attrs,
212
+ dir: state.context.dir,
199
213
  id: dom.getContentId(state.context, value),
200
214
  tabIndex: 0,
201
215
  "aria-labelledby": dom.getTriggerId(state.context, value),
202
216
  role: "tabpanel",
203
217
  "data-ownedby": dom.getTablistId(state.context),
204
218
  "data-selected": (0, import_dom_query2.dataAttr)(selected),
219
+ "data-orientation": state.context.orientation,
205
220
  hidden: !selected
206
221
  });
207
222
  },
@@ -458,12 +473,12 @@ var invoke = {
458
473
  change: (ctx) => {
459
474
  if (ctx.value == null)
460
475
  return;
461
- ctx.onChange?.({ value: ctx.value });
476
+ ctx.onValueChange?.({ value: ctx.value });
462
477
  },
463
478
  focusChange: (ctx) => {
464
479
  if (ctx.focusedValue == null)
465
480
  return;
466
- ctx.onFocus?.({ value: ctx.focusedValue });
481
+ ctx.onFocusChange?.({ focusedValue: ctx.focusedValue });
467
482
  }
468
483
  };
469
484
  var set = {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/tabs.anatomy.ts","../src/tabs.connect.ts","../src/tabs.dom.ts","../src/tabs.machine.ts"],"sourcesContent":["export { anatomy } from \"./tabs.anatomy\"\nexport { connect } from \"./tabs.connect\"\nexport { machine } from \"./tabs.machine\"\nexport type { ContentProps, UserDefinedContext as Context, MachineApi as Api, TriggerProps } from \"./tabs.types\"\n","import { createAnatomy } from \"@zag-js/anatomy\"\n\nexport const anatomy = createAnatomy(\"tabs\").parts(\"root\", \"list\", \"trigger\", \"content\", \"indicator\")\nexport const parts = anatomy.build()\n","import { getEventKey, type EventKeyMap } from \"@zag-js/dom-event\"\nimport { dataAttr, isSafari, isSelfEvent } from \"@zag-js/dom-query\"\nimport type { NormalizeProps, PropTypes } from \"@zag-js/types\"\nimport { parts } from \"./tabs.anatomy\"\nimport { dom } from \"./tabs.dom\"\nimport type { ContentProps, MachineApi, Send, State, TriggerProps } from \"./tabs.types\"\n\nexport function connect<T extends PropTypes>(state: State, send: Send, normalize: NormalizeProps<T>): MachineApi<T> {\n const translations = state.context.translations\n const isFocused = state.matches(\"focused\")\n\n return {\n value: state.context.value,\n focusedValue: state.context.focusedValue,\n previousValues: Array.from(state.context.previousValues),\n\n setValue(value: string) {\n send({ type: \"SET_VALUE\", value })\n },\n\n clearValue() {\n send({ type: \"CLEAR_VALUE\" })\n },\n\n setIndicatorRect(id: string | null | undefined) {\n send({ type: \"SET_INDICATOR_RECT\", id })\n },\n\n rootProps: normalize.element({\n ...parts.root.attrs,\n id: dom.getRootId(state.context),\n \"data-orientation\": state.context.orientation,\n \"data-focus\": dataAttr(isFocused),\n dir: state.context.dir,\n }),\n\n tablistProps: normalize.element({\n ...parts.list.attrs,\n id: dom.getTablistId(state.context),\n role: \"tablist\",\n \"data-focus\": dataAttr(isFocused),\n \"aria-orientation\": state.context.orientation,\n \"data-orientation\": state.context.orientation,\n \"aria-label\": translations.tablistLabel,\n onKeyDown(event) {\n if (!isSelfEvent(event)) return\n\n const keyMap: EventKeyMap = {\n ArrowDown() {\n send(\"ARROW_DOWN\")\n },\n ArrowUp() {\n send(\"ARROW_UP\")\n },\n ArrowLeft() {\n send(\"ARROW_LEFT\")\n },\n ArrowRight() {\n send(\"ARROW_RIGHT\")\n },\n Home() {\n send(\"HOME\")\n },\n End() {\n send(\"END\")\n },\n Enter() {\n send({ type: \"ENTER\", value: state.context.focusedValue })\n },\n }\n\n let key = getEventKey(event, state.context)\n const exec = keyMap[key]\n\n if (exec) {\n event.preventDefault()\n exec(event)\n }\n },\n }),\n\n getTriggerProps(props: TriggerProps) {\n const { value, disabled } = props\n const selected = state.context.value === value\n\n return normalize.button({\n ...parts.trigger.attrs,\n role: \"tab\",\n type: \"button\",\n disabled,\n \"data-orientation\": state.context.orientation,\n \"data-disabled\": dataAttr(disabled),\n \"aria-disabled\": disabled,\n \"data-value\": value,\n \"aria-selected\": selected,\n \"data-selected\": dataAttr(selected),\n \"aria-controls\": dom.getContentId(state.context, value),\n \"data-ownedby\": dom.getTablistId(state.context),\n id: dom.getTriggerId(state.context, value),\n tabIndex: selected ? 0 : -1,\n onFocus() {\n send({ type: \"TAB_FOCUS\", value })\n },\n onBlur(event) {\n const target = event.relatedTarget as HTMLElement | null\n if (target?.getAttribute(\"role\") !== \"tab\") {\n send({ type: \"TAB_BLUR\" })\n }\n },\n onClick(event) {\n if (disabled) return\n if (isSafari()) {\n event.currentTarget.focus()\n }\n send({ type: \"TAB_CLICK\", value })\n },\n })\n },\n\n getContentProps({ value }: ContentProps) {\n const selected = state.context.value === value\n return normalize.element({\n ...parts.content.attrs,\n id: dom.getContentId(state.context, value),\n tabIndex: 0,\n \"aria-labelledby\": dom.getTriggerId(state.context, value),\n role: \"tabpanel\",\n \"data-ownedby\": dom.getTablistId(state.context),\n \"data-selected\": dataAttr(selected),\n hidden: !selected,\n })\n },\n\n indicatorProps: normalize.element({\n id: dom.getIndicatorId(state.context),\n ...parts.indicator.attrs,\n \"data-orientation\": state.context.orientation,\n style: {\n \"--transition-duration\": \"150ms\",\n \"--transition-property\": \"left, right, top, bottom, width, height\",\n position: \"absolute\",\n willChange: \"var(--transition-property)\",\n transitionProperty: \"var(--transition-property)\",\n transitionDuration: state.context.canIndicatorTransition ? \"var(--transition-duration)\" : \"0ms\",\n transitionTimingFunction: \"var(--transition-timing-function)\",\n ...state.context.indicatorRect,\n },\n }),\n }\n}\n","import { createScope, itemById, nextById, prevById, queryAll } from \"@zag-js/dom-query\"\nimport { first, last } from \"@zag-js/utils\"\nimport type { MachineContext as Ctx } from \"./tabs.types\"\n\nexport const dom = createScope({\n getRootId: (ctx: Ctx) => ctx.ids?.root ?? `tabs:${ctx.id}`,\n getTablistId: (ctx: Ctx) => ctx.ids?.tablist ?? `tabs:${ctx.id}:list`,\n getContentId: (ctx: Ctx, id: string) => ctx.ids?.content ?? `tabs:${ctx.id}:content-${id}`,\n getTriggerId: (ctx: Ctx, id: string) => ctx.ids?.trigger ?? `tabs:${ctx.id}:trigger-${id}`,\n getIndicatorId: (ctx: Ctx) => ctx.ids?.indicator ?? `tabs:${ctx.id}:indicator`,\n\n getTablistEl: (ctx: Ctx) => dom.getById(ctx, dom.getTablistId(ctx)),\n getContentEl: (ctx: Ctx, id: string) => dom.getById(ctx, dom.getContentId(ctx, id)),\n getTriggerEl: (ctx: Ctx, id: string) => dom.getById(ctx, dom.getTriggerId(ctx, id)),\n getIndicatorEl: (ctx: Ctx) => dom.getById(ctx, dom.getIndicatorId(ctx)),\n\n getElements: (ctx: Ctx) => {\n const ownerId = CSS.escape(dom.getTablistId(ctx))\n const selector = `[role=tab][data-ownedby='${ownerId}']:not([disabled])`\n return queryAll(dom.getTablistEl(ctx), selector)\n },\n\n getFirstEl: (ctx: Ctx) => first(dom.getElements(ctx)),\n getLastEl: (ctx: Ctx) => last(dom.getElements(ctx)),\n getNextEl: (ctx: Ctx, id: string) => nextById(dom.getElements(ctx), dom.getTriggerId(ctx, id), ctx.loop),\n getPrevEl: (ctx: Ctx, id: string) => prevById(dom.getElements(ctx), dom.getTriggerId(ctx, id), ctx.loop),\n getActiveContentEl: (ctx: Ctx) => {\n if (!ctx.value) return\n return dom.getContentEl(ctx, ctx.value)\n },\n getActiveTabEl: (ctx: Ctx) => {\n if (!ctx.value) return\n return dom.getTriggerEl(ctx, ctx.value)\n },\n\n getOffsetRect: (el: HTMLElement | undefined) => {\n return {\n left: el?.offsetLeft ?? 0,\n top: el?.offsetTop ?? 0,\n width: el?.offsetWidth ?? 0,\n height: el?.offsetHeight ?? 0,\n }\n },\n\n getRectById: (ctx: Ctx, id: string) => {\n const tab = itemById(dom.getElements(ctx), dom.getTriggerId(ctx, id))\n return dom.resolveRect(dom.getOffsetRect(tab), ctx.orientation)\n },\n\n resolveRect(rect: Record<\"width\" | \"height\" | \"left\" | \"top\", number>, orientation?: \"horizontal\" | \"vertical\") {\n const sizeProp = orientation === \"vertical\" ? \"height\" : \"width\"\n const placementProp = orientation === \"vertical\" ? \"top\" : \"left\"\n return {\n [placementProp]: `${rect[placementProp]}px`,\n [sizeProp]: `${rect[sizeProp]}px`,\n }\n },\n})\n","import { createMachine, guards } from \"@zag-js/core\"\nimport { nextTick, raf } from \"@zag-js/dom-query\"\nimport { trackElementRect } from \"@zag-js/element-rect\"\nimport { getFocusables } from \"@zag-js/tabbable\"\nimport { compact, isEqual } from \"@zag-js/utils\"\nimport { dom } from \"./tabs.dom\"\nimport type { MachineContext, MachineState, UserDefinedContext } from \"./tabs.types\"\n\nconst { not } = guards\n\nexport function machine(userContext: UserDefinedContext) {\n const ctx = compact(userContext)\n return createMachine<MachineContext, MachineState>(\n {\n initial: \"idle\",\n\n context: {\n dir: \"ltr\",\n orientation: \"horizontal\",\n activationMode: \"automatic\",\n value: null,\n focusedValue: null,\n previousValues: [],\n indicatorRect: {\n left: \"0px\",\n top: \"0px\",\n width: \"0px\",\n height: \"0px\",\n },\n canIndicatorTransition: false,\n isIndicatorRendered: false,\n loop: true,\n translations: {},\n ...ctx,\n },\n\n computed: {\n isHorizontal: (ctx) => ctx.orientation === \"horizontal\",\n isVertical: (ctx) => ctx.orientation === \"vertical\",\n },\n\n created: [\"setPrevSelectedTabs\"],\n\n entry: [\"checkRenderedElements\", \"syncIndicatorRect\", \"setContentTabIndex\"],\n\n exit: [\"cleanupObserver\"],\n\n watch: {\n value: [\"enableIndicatorTransition\", \"setPrevSelectedTabs\", \"syncIndicatorRect\", \"setContentTabIndex\"],\n dir: [\"syncIndicatorRect\"],\n orientation: [\"syncIndicatorRect\"],\n },\n\n on: {\n SET_VALUE: {\n actions: \"setValue\",\n },\n CLEAR_VALUE: {\n actions: \"clearValue\",\n },\n SET_INDICATOR_RECT: {\n actions: \"setIndicatorRect\",\n },\n },\n\n states: {\n idle: {\n on: {\n TAB_FOCUS: [\n {\n guard: \"selectOnFocus\",\n target: \"focused\",\n actions: [\"setFocusedValue\", \"setValue\"],\n },\n {\n target: \"focused\",\n actions: \"setFocusedValue\",\n },\n ],\n TAB_CLICK: {\n target: \"focused\",\n actions: [\"setFocusedValue\", \"setValue\"],\n },\n },\n },\n focused: {\n on: {\n TAB_CLICK: {\n target: \"focused\",\n actions: [\"setFocusedValue\", \"setValue\"],\n },\n ARROW_LEFT: {\n guard: \"isHorizontal\",\n actions: \"focusPrevTab\",\n },\n ARROW_RIGHT: {\n guard: \"isHorizontal\",\n actions: \"focusNextTab\",\n },\n ARROW_UP: {\n guard: \"isVertical\",\n actions: \"focusPrevTab\",\n },\n ARROW_DOWN: {\n guard: \"isVertical\",\n actions: \"focusNextTab\",\n },\n HOME: {\n actions: \"focusFirstTab\",\n },\n END: {\n actions: \"focusLastTab\",\n },\n ENTER: {\n guard: not(\"selectOnFocus\"),\n actions: \"setValue\",\n },\n TAB_FOCUS: [\n {\n guard: \"selectOnFocus\",\n actions: [\"setFocusedValue\", \"setValue\"],\n },\n { actions: \"setFocusedValue\" },\n ],\n TAB_BLUR: {\n target: \"idle\",\n actions: \"clearFocusedValue\",\n },\n },\n },\n },\n },\n {\n guards: {\n isVertical: (ctx) => ctx.isVertical,\n isHorizontal: (ctx) => ctx.isHorizontal,\n selectOnFocus: (ctx) => ctx.activationMode === \"automatic\",\n },\n\n actions: {\n setFocusedValue(ctx, evt) {\n set.focusedValue(ctx, evt.value)\n },\n clearFocusedValue(ctx) {\n set.focusedValue(ctx, null)\n },\n setValue(ctx, evt) {\n set.value(ctx, evt.value)\n },\n clearValue(ctx) {\n set.value(ctx, null)\n },\n focusFirstTab(ctx) {\n raf(() => dom.getFirstEl(ctx)?.focus())\n },\n focusLastTab(ctx) {\n raf(() => dom.getLastEl(ctx)?.focus())\n },\n focusNextTab(ctx) {\n if (!ctx.focusedValue) return\n const next = dom.getNextEl(ctx, ctx.focusedValue)\n raf(() => next?.focus())\n },\n focusPrevTab(ctx) {\n if (!ctx.focusedValue) return\n const prev = dom.getPrevEl(ctx, ctx.focusedValue)\n raf(() => prev?.focus())\n },\n checkRenderedElements(ctx) {\n ctx.isIndicatorRendered = !!dom.getIndicatorEl(ctx)\n },\n setPrevSelectedTabs(ctx) {\n if (ctx.value != null) {\n ctx.previousValues = pushUnique(ctx.previousValues, ctx.value)\n }\n },\n // if tab panel contains focusable elements, remove the tabindex attribute\n setContentTabIndex(ctx) {\n raf(() => {\n const panel = dom.getActiveContentEl(ctx)\n if (!panel) return\n const focusables = getFocusables(panel)\n if (focusables.length > 0) {\n panel.removeAttribute(\"tabindex\")\n } else {\n panel.setAttribute(\"tabindex\", \"0\")\n }\n })\n },\n cleanupObserver(ctx) {\n ctx.indicatorCleanup?.()\n },\n enableIndicatorTransition(ctx) {\n ctx.canIndicatorTransition = true\n },\n setIndicatorRect(ctx, evt) {\n const value = evt.id ?? ctx.value\n if (!ctx.isIndicatorRendered || !value) return\n\n const tabEl = dom.getTriggerEl(ctx, value)\n if (!tabEl) return\n\n ctx.indicatorRect = dom.getRectById(ctx, value)\n nextTick(() => {\n ctx.canIndicatorTransition = false\n })\n },\n syncIndicatorRect(ctx) {\n ctx.indicatorCleanup?.()\n\n const value = ctx.value\n if (!ctx.isIndicatorRendered || !value) return\n\n const tabEl = dom.getActiveTabEl(ctx)\n if (!tabEl) return\n\n ctx.indicatorCleanup = trackElementRect(tabEl, {\n getRect(el) {\n return dom.getOffsetRect(el)\n },\n onChange(rect) {\n ctx.indicatorRect = dom.resolveRect(rect, ctx.orientation)\n nextTick(() => {\n ctx.canIndicatorTransition = false\n })\n },\n })\n },\n },\n },\n )\n}\n\n// function to push value array and remove previous instances of value\nfunction pushUnique(arr: string[], value: any) {\n const newArr = Array.from(arr).slice()\n const index = newArr.indexOf(value)\n if (index > -1) {\n newArr.splice(index, 1)\n }\n newArr.push(value)\n return newArr\n}\n\nconst invoke = {\n change: (ctx: MachineContext) => {\n if (ctx.value == null) return\n ctx.onChange?.({ value: ctx.value })\n },\n focusChange: (ctx: MachineContext) => {\n if (ctx.focusedValue == null) return\n ctx.onFocus?.({ value: ctx.focusedValue })\n },\n}\n\nconst set = {\n value: (ctx: MachineContext, value: string | null) => {\n if (isEqual(value, ctx.value)) return\n ctx.value = value\n invoke.change(ctx)\n },\n focusedValue: (ctx: MachineContext, value: string | null) => {\n if (isEqual(value, ctx.focusedValue)) return\n ctx.focusedValue = value\n invoke.focusChange(ctx)\n },\n}\n"],"mappings":"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","names":["import_dom_query","import_dom_query","import_utils","ctx"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/tabs.anatomy.ts","../src/tabs.connect.ts","../src/tabs.dom.ts","../src/tabs.machine.ts"],"sourcesContent":["export { anatomy } from \"./tabs.anatomy\"\nexport { connect } from \"./tabs.connect\"\nexport { machine } from \"./tabs.machine\"\nexport type { ContentProps, UserDefinedContext as Context, MachineApi as Api, TriggerProps } from \"./tabs.types\"\n","import { createAnatomy } from \"@zag-js/anatomy\"\n\nexport const anatomy = createAnatomy(\"tabs\").parts(\"root\", \"list\", \"trigger\", \"content\", \"indicator\")\nexport const parts = anatomy.build()\n","import { getEventKey, type EventKeyMap } from \"@zag-js/dom-event\"\nimport { dataAttr, isSafari, isSelfEvent } from \"@zag-js/dom-query\"\nimport type { NormalizeProps, PropTypes } from \"@zag-js/types\"\nimport { parts } from \"./tabs.anatomy\"\nimport { dom } from \"./tabs.dom\"\nimport type { MachineApi, Send, State, TriggerProps } from \"./tabs.types\"\n\nexport function connect<T extends PropTypes>(state: State, send: Send, normalize: NormalizeProps<T>): MachineApi<T> {\n const translations = state.context.translations\n const isFocused = state.matches(\"focused\")\n\n function getTriggerState(props: TriggerProps) {\n return {\n isSelected: state.context.value === props.value,\n isFocused: state.context.focusedValue === props.value,\n isDisabled: !!props.disabled,\n }\n }\n\n return {\n value: state.context.value,\n focusedValue: state.context.focusedValue,\n previousValues: Array.from(state.context.previousValues),\n\n setValue(value) {\n send({ type: \"SET_VALUE\", value })\n },\n\n clearValue() {\n send({ type: \"CLEAR_VALUE\" })\n },\n\n setIndicatorRect(value) {\n const id = dom.getTriggerId(state.context, value)\n send({ type: \"SET_INDICATOR_RECT\", id })\n },\n\n getTriggerState,\n\n rootProps: normalize.element({\n ...parts.root.attrs,\n id: dom.getRootId(state.context),\n \"data-orientation\": state.context.orientation,\n \"data-focus\": dataAttr(isFocused),\n dir: state.context.dir,\n }),\n\n tablistProps: normalize.element({\n ...parts.list.attrs,\n id: dom.getTablistId(state.context),\n role: \"tablist\",\n dir: state.context.dir,\n \"data-focus\": dataAttr(isFocused),\n \"aria-orientation\": state.context.orientation,\n \"data-orientation\": state.context.orientation,\n \"aria-label\": translations.tablistLabel,\n onKeyDown(event) {\n if (!isSelfEvent(event)) return\n\n const keyMap: EventKeyMap = {\n ArrowDown() {\n send(\"ARROW_DOWN\")\n },\n ArrowUp() {\n send(\"ARROW_UP\")\n },\n ArrowLeft() {\n send(\"ARROW_LEFT\")\n },\n ArrowRight() {\n send(\"ARROW_RIGHT\")\n },\n Home() {\n send(\"HOME\")\n },\n End() {\n send(\"END\")\n },\n Enter() {\n send({ type: \"ENTER\", value: state.context.focusedValue })\n },\n }\n\n let key = getEventKey(event, state.context)\n const exec = keyMap[key]\n\n if (exec) {\n event.preventDefault()\n exec(event)\n }\n },\n }),\n\n getTriggerProps(props) {\n const { value, disabled } = props\n const triggerState = getTriggerState(props)\n\n return normalize.button({\n ...parts.trigger.attrs,\n role: \"tab\",\n type: \"button\",\n disabled,\n dir: state.context.dir,\n \"data-orientation\": state.context.orientation,\n \"data-disabled\": dataAttr(disabled),\n \"aria-disabled\": disabled,\n \"data-value\": value,\n \"aria-selected\": triggerState.isSelected,\n \"data-selected\": dataAttr(triggerState.isSelected),\n \"data-focus\": dataAttr(triggerState.isFocused),\n \"aria-controls\": dom.getContentId(state.context, value),\n \"data-ownedby\": dom.getTablistId(state.context),\n id: dom.getTriggerId(state.context, value),\n tabIndex: triggerState.isSelected ? 0 : -1,\n onFocus() {\n send({ type: \"TAB_FOCUS\", value })\n },\n onBlur(event) {\n const target = event.relatedTarget as HTMLElement | null\n if (target?.getAttribute(\"role\") !== \"tab\") {\n send({ type: \"TAB_BLUR\" })\n }\n },\n onClick(event) {\n if (disabled) return\n if (isSafari()) {\n event.currentTarget.focus()\n }\n send({ type: \"TAB_CLICK\", value })\n },\n })\n },\n\n getContentProps(props) {\n const { value } = props\n const selected = state.context.value === value\n return normalize.element({\n ...parts.content.attrs,\n dir: state.context.dir,\n id: dom.getContentId(state.context, value),\n tabIndex: 0,\n \"aria-labelledby\": dom.getTriggerId(state.context, value),\n role: \"tabpanel\",\n \"data-ownedby\": dom.getTablistId(state.context),\n \"data-selected\": dataAttr(selected),\n \"data-orientation\": state.context.orientation,\n hidden: !selected,\n })\n },\n\n indicatorProps: normalize.element({\n id: dom.getIndicatorId(state.context),\n ...parts.indicator.attrs,\n \"data-orientation\": state.context.orientation,\n style: {\n \"--transition-duration\": \"150ms\",\n \"--transition-property\": \"left, right, top, bottom, width, height\",\n position: \"absolute\",\n willChange: \"var(--transition-property)\",\n transitionProperty: \"var(--transition-property)\",\n transitionDuration: state.context.canIndicatorTransition ? \"var(--transition-duration)\" : \"0ms\",\n transitionTimingFunction: \"var(--transition-timing-function)\",\n ...state.context.indicatorRect,\n },\n }),\n }\n}\n","import { createScope, itemById, nextById, prevById, queryAll } from \"@zag-js/dom-query\"\nimport { first, last } from \"@zag-js/utils\"\nimport type { MachineContext as Ctx } from \"./tabs.types\"\n\nexport const dom = createScope({\n getRootId: (ctx: Ctx) => ctx.ids?.root ?? `tabs:${ctx.id}`,\n getTablistId: (ctx: Ctx) => ctx.ids?.tablist ?? `tabs:${ctx.id}:list`,\n getContentId: (ctx: Ctx, id: string) => ctx.ids?.content ?? `tabs:${ctx.id}:content-${id}`,\n getTriggerId: (ctx: Ctx, id: string) => ctx.ids?.trigger ?? `tabs:${ctx.id}:trigger-${id}`,\n getIndicatorId: (ctx: Ctx) => ctx.ids?.indicator ?? `tabs:${ctx.id}:indicator`,\n\n getTablistEl: (ctx: Ctx) => dom.getById(ctx, dom.getTablistId(ctx)),\n getContentEl: (ctx: Ctx, id: string) => dom.getById(ctx, dom.getContentId(ctx, id)),\n getTriggerEl: (ctx: Ctx, id: string) => dom.getById(ctx, dom.getTriggerId(ctx, id)),\n getIndicatorEl: (ctx: Ctx) => dom.getById(ctx, dom.getIndicatorId(ctx)),\n\n getElements: (ctx: Ctx) => {\n const ownerId = CSS.escape(dom.getTablistId(ctx))\n const selector = `[role=tab][data-ownedby='${ownerId}']:not([disabled])`\n return queryAll(dom.getTablistEl(ctx), selector)\n },\n\n getFirstEl: (ctx: Ctx) => first(dom.getElements(ctx)),\n getLastEl: (ctx: Ctx) => last(dom.getElements(ctx)),\n getNextEl: (ctx: Ctx, id: string) => nextById(dom.getElements(ctx), dom.getTriggerId(ctx, id), ctx.loop),\n getPrevEl: (ctx: Ctx, id: string) => prevById(dom.getElements(ctx), dom.getTriggerId(ctx, id), ctx.loop),\n getActiveContentEl: (ctx: Ctx) => {\n if (!ctx.value) return\n return dom.getContentEl(ctx, ctx.value)\n },\n getActiveTabEl: (ctx: Ctx) => {\n if (!ctx.value) return\n return dom.getTriggerEl(ctx, ctx.value)\n },\n\n getOffsetRect: (el: HTMLElement | undefined) => {\n return {\n left: el?.offsetLeft ?? 0,\n top: el?.offsetTop ?? 0,\n width: el?.offsetWidth ?? 0,\n height: el?.offsetHeight ?? 0,\n }\n },\n\n getRectById: (ctx: Ctx, id: string) => {\n const tab = itemById(dom.getElements(ctx), dom.getTriggerId(ctx, id))\n return dom.resolveRect(dom.getOffsetRect(tab), ctx.orientation)\n },\n\n resolveRect(rect: Record<\"width\" | \"height\" | \"left\" | \"top\", number>, orientation?: \"horizontal\" | \"vertical\") {\n const sizeProp = orientation === \"vertical\" ? \"height\" : \"width\"\n const placementProp = orientation === \"vertical\" ? \"top\" : \"left\"\n return {\n [placementProp]: `${rect[placementProp]}px`,\n [sizeProp]: `${rect[sizeProp]}px`,\n }\n },\n})\n","import { createMachine, guards } from \"@zag-js/core\"\nimport { nextTick, raf } from \"@zag-js/dom-query\"\nimport { trackElementRect } from \"@zag-js/element-rect\"\nimport { getFocusables } from \"@zag-js/tabbable\"\nimport { compact, isEqual } from \"@zag-js/utils\"\nimport { dom } from \"./tabs.dom\"\nimport type { MachineContext, MachineState, UserDefinedContext } from \"./tabs.types\"\n\nconst { not } = guards\n\nexport function machine(userContext: UserDefinedContext) {\n const ctx = compact(userContext)\n return createMachine<MachineContext, MachineState>(\n {\n initial: \"idle\",\n\n context: {\n dir: \"ltr\",\n orientation: \"horizontal\",\n activationMode: \"automatic\",\n value: null,\n focusedValue: null,\n previousValues: [],\n indicatorRect: {\n left: \"0px\",\n top: \"0px\",\n width: \"0px\",\n height: \"0px\",\n },\n canIndicatorTransition: false,\n isIndicatorRendered: false,\n loop: true,\n translations: {},\n ...ctx,\n },\n\n computed: {\n isHorizontal: (ctx) => ctx.orientation === \"horizontal\",\n isVertical: (ctx) => ctx.orientation === \"vertical\",\n },\n\n created: [\"setPrevSelectedTabs\"],\n\n entry: [\"checkRenderedElements\", \"syncIndicatorRect\", \"setContentTabIndex\"],\n\n exit: [\"cleanupObserver\"],\n\n watch: {\n value: [\"enableIndicatorTransition\", \"setPrevSelectedTabs\", \"syncIndicatorRect\", \"setContentTabIndex\"],\n dir: [\"syncIndicatorRect\"],\n orientation: [\"syncIndicatorRect\"],\n },\n\n on: {\n SET_VALUE: {\n actions: \"setValue\",\n },\n CLEAR_VALUE: {\n actions: \"clearValue\",\n },\n SET_INDICATOR_RECT: {\n actions: \"setIndicatorRect\",\n },\n },\n\n states: {\n idle: {\n on: {\n TAB_FOCUS: [\n {\n guard: \"selectOnFocus\",\n target: \"focused\",\n actions: [\"setFocusedValue\", \"setValue\"],\n },\n {\n target: \"focused\",\n actions: \"setFocusedValue\",\n },\n ],\n TAB_CLICK: {\n target: \"focused\",\n actions: [\"setFocusedValue\", \"setValue\"],\n },\n },\n },\n focused: {\n on: {\n TAB_CLICK: {\n target: \"focused\",\n actions: [\"setFocusedValue\", \"setValue\"],\n },\n ARROW_LEFT: {\n guard: \"isHorizontal\",\n actions: \"focusPrevTab\",\n },\n ARROW_RIGHT: {\n guard: \"isHorizontal\",\n actions: \"focusNextTab\",\n },\n ARROW_UP: {\n guard: \"isVertical\",\n actions: \"focusPrevTab\",\n },\n ARROW_DOWN: {\n guard: \"isVertical\",\n actions: \"focusNextTab\",\n },\n HOME: {\n actions: \"focusFirstTab\",\n },\n END: {\n actions: \"focusLastTab\",\n },\n ENTER: {\n guard: not(\"selectOnFocus\"),\n actions: \"setValue\",\n },\n TAB_FOCUS: [\n {\n guard: \"selectOnFocus\",\n actions: [\"setFocusedValue\", \"setValue\"],\n },\n { actions: \"setFocusedValue\" },\n ],\n TAB_BLUR: {\n target: \"idle\",\n actions: \"clearFocusedValue\",\n },\n },\n },\n },\n },\n {\n guards: {\n isVertical: (ctx) => ctx.isVertical,\n isHorizontal: (ctx) => ctx.isHorizontal,\n selectOnFocus: (ctx) => ctx.activationMode === \"automatic\",\n },\n\n actions: {\n setFocusedValue(ctx, evt) {\n set.focusedValue(ctx, evt.value)\n },\n clearFocusedValue(ctx) {\n set.focusedValue(ctx, null)\n },\n setValue(ctx, evt) {\n set.value(ctx, evt.value)\n },\n clearValue(ctx) {\n set.value(ctx, null)\n },\n focusFirstTab(ctx) {\n raf(() => dom.getFirstEl(ctx)?.focus())\n },\n focusLastTab(ctx) {\n raf(() => dom.getLastEl(ctx)?.focus())\n },\n focusNextTab(ctx) {\n if (!ctx.focusedValue) return\n const next = dom.getNextEl(ctx, ctx.focusedValue)\n raf(() => next?.focus())\n },\n focusPrevTab(ctx) {\n if (!ctx.focusedValue) return\n const prev = dom.getPrevEl(ctx, ctx.focusedValue)\n raf(() => prev?.focus())\n },\n checkRenderedElements(ctx) {\n ctx.isIndicatorRendered = !!dom.getIndicatorEl(ctx)\n },\n setPrevSelectedTabs(ctx) {\n if (ctx.value != null) {\n ctx.previousValues = pushUnique(ctx.previousValues, ctx.value)\n }\n },\n // if tab panel contains focusable elements, remove the tabindex attribute\n setContentTabIndex(ctx) {\n raf(() => {\n const panel = dom.getActiveContentEl(ctx)\n if (!panel) return\n const focusables = getFocusables(panel)\n if (focusables.length > 0) {\n panel.removeAttribute(\"tabindex\")\n } else {\n panel.setAttribute(\"tabindex\", \"0\")\n }\n })\n },\n cleanupObserver(ctx) {\n ctx.indicatorCleanup?.()\n },\n enableIndicatorTransition(ctx) {\n ctx.canIndicatorTransition = true\n },\n setIndicatorRect(ctx, evt) {\n const value = evt.id ?? ctx.value\n if (!ctx.isIndicatorRendered || !value) return\n\n const tabEl = dom.getTriggerEl(ctx, value)\n if (!tabEl) return\n\n ctx.indicatorRect = dom.getRectById(ctx, value)\n nextTick(() => {\n ctx.canIndicatorTransition = false\n })\n },\n syncIndicatorRect(ctx) {\n ctx.indicatorCleanup?.()\n\n const value = ctx.value\n if (!ctx.isIndicatorRendered || !value) return\n\n const tabEl = dom.getActiveTabEl(ctx)\n if (!tabEl) return\n\n ctx.indicatorCleanup = trackElementRect(tabEl, {\n getRect(el) {\n return dom.getOffsetRect(el)\n },\n onChange(rect) {\n ctx.indicatorRect = dom.resolveRect(rect, ctx.orientation)\n nextTick(() => {\n ctx.canIndicatorTransition = false\n })\n },\n })\n },\n },\n },\n )\n}\n\n// function to push value array and remove previous instances of value\nfunction pushUnique(arr: string[], value: any) {\n const newArr = Array.from(arr).slice()\n const index = newArr.indexOf(value)\n if (index > -1) {\n newArr.splice(index, 1)\n }\n newArr.push(value)\n return newArr\n}\n\nconst invoke = {\n change: (ctx: MachineContext) => {\n if (ctx.value == null) return\n ctx.onValueChange?.({ value: ctx.value })\n },\n focusChange: (ctx: MachineContext) => {\n if (ctx.focusedValue == null) return\n ctx.onFocusChange?.({ focusedValue: ctx.focusedValue })\n },\n}\n\nconst set = {\n value: (ctx: MachineContext, value: string | null) => {\n if (isEqual(value, ctx.value)) return\n ctx.value = value\n invoke.change(ctx)\n },\n focusedValue: (ctx: MachineContext, value: string | null) => {\n if (isEqual(value, ctx.focusedValue)) return\n ctx.focusedValue = value\n invoke.focusChange(ctx)\n },\n}\n"],"mappings":"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","names":["import_dom_query","import_dom_query","import_utils","ctx"]}
package/dist/index.mjs CHANGED
@@ -65,6 +65,13 @@ var dom = createScope({
65
65
  function connect(state, send, normalize) {
66
66
  const translations = state.context.translations;
67
67
  const isFocused = state.matches("focused");
68
+ function getTriggerState(props) {
69
+ return {
70
+ isSelected: state.context.value === props.value,
71
+ isFocused: state.context.focusedValue === props.value,
72
+ isDisabled: !!props.disabled
73
+ };
74
+ }
68
75
  return {
69
76
  value: state.context.value,
70
77
  focusedValue: state.context.focusedValue,
@@ -75,9 +82,11 @@ function connect(state, send, normalize) {
75
82
  clearValue() {
76
83
  send({ type: "CLEAR_VALUE" });
77
84
  },
78
- setIndicatorRect(id) {
85
+ setIndicatorRect(value) {
86
+ const id = dom.getTriggerId(state.context, value);
79
87
  send({ type: "SET_INDICATOR_RECT", id });
80
88
  },
89
+ getTriggerState,
81
90
  rootProps: normalize.element({
82
91
  ...parts.root.attrs,
83
92
  id: dom.getRootId(state.context),
@@ -89,6 +98,7 @@ function connect(state, send, normalize) {
89
98
  ...parts.list.attrs,
90
99
  id: dom.getTablistId(state.context),
91
100
  role: "tablist",
101
+ dir: state.context.dir,
92
102
  "data-focus": dataAttr(isFocused),
93
103
  "aria-orientation": state.context.orientation,
94
104
  "data-orientation": state.context.orientation,
@@ -129,22 +139,24 @@ function connect(state, send, normalize) {
129
139
  }),
130
140
  getTriggerProps(props) {
131
141
  const { value, disabled } = props;
132
- const selected = state.context.value === value;
142
+ const triggerState = getTriggerState(props);
133
143
  return normalize.button({
134
144
  ...parts.trigger.attrs,
135
145
  role: "tab",
136
146
  type: "button",
137
147
  disabled,
148
+ dir: state.context.dir,
138
149
  "data-orientation": state.context.orientation,
139
150
  "data-disabled": dataAttr(disabled),
140
151
  "aria-disabled": disabled,
141
152
  "data-value": value,
142
- "aria-selected": selected,
143
- "data-selected": dataAttr(selected),
153
+ "aria-selected": triggerState.isSelected,
154
+ "data-selected": dataAttr(triggerState.isSelected),
155
+ "data-focus": dataAttr(triggerState.isFocused),
144
156
  "aria-controls": dom.getContentId(state.context, value),
145
157
  "data-ownedby": dom.getTablistId(state.context),
146
158
  id: dom.getTriggerId(state.context, value),
147
- tabIndex: selected ? 0 : -1,
159
+ tabIndex: triggerState.isSelected ? 0 : -1,
148
160
  onFocus() {
149
161
  send({ type: "TAB_FOCUS", value });
150
162
  },
@@ -164,16 +176,19 @@ function connect(state, send, normalize) {
164
176
  }
165
177
  });
166
178
  },
167
- getContentProps({ value }) {
179
+ getContentProps(props) {
180
+ const { value } = props;
168
181
  const selected = state.context.value === value;
169
182
  return normalize.element({
170
183
  ...parts.content.attrs,
184
+ dir: state.context.dir,
171
185
  id: dom.getContentId(state.context, value),
172
186
  tabIndex: 0,
173
187
  "aria-labelledby": dom.getTriggerId(state.context, value),
174
188
  role: "tabpanel",
175
189
  "data-ownedby": dom.getTablistId(state.context),
176
190
  "data-selected": dataAttr(selected),
191
+ "data-orientation": state.context.orientation,
177
192
  hidden: !selected
178
193
  });
179
194
  },
@@ -430,12 +445,12 @@ var invoke = {
430
445
  change: (ctx) => {
431
446
  if (ctx.value == null)
432
447
  return;
433
- ctx.onChange?.({ value: ctx.value });
448
+ ctx.onValueChange?.({ value: ctx.value });
434
449
  },
435
450
  focusChange: (ctx) => {
436
451
  if (ctx.focusedValue == null)
437
452
  return;
438
- ctx.onFocus?.({ value: ctx.focusedValue });
453
+ ctx.onFocusChange?.({ focusedValue: ctx.focusedValue });
439
454
  }
440
455
  };
441
456
  var set = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tabs.anatomy.ts","../src/tabs.connect.ts","../src/tabs.dom.ts","../src/tabs.machine.ts"],"sourcesContent":["import { createAnatomy } from \"@zag-js/anatomy\"\n\nexport const anatomy = createAnatomy(\"tabs\").parts(\"root\", \"list\", \"trigger\", \"content\", \"indicator\")\nexport const parts = anatomy.build()\n","import { getEventKey, type EventKeyMap } from \"@zag-js/dom-event\"\nimport { dataAttr, isSafari, isSelfEvent } from \"@zag-js/dom-query\"\nimport type { NormalizeProps, PropTypes } from \"@zag-js/types\"\nimport { parts } from \"./tabs.anatomy\"\nimport { dom } from \"./tabs.dom\"\nimport type { ContentProps, MachineApi, Send, State, TriggerProps } from \"./tabs.types\"\n\nexport function connect<T extends PropTypes>(state: State, send: Send, normalize: NormalizeProps<T>): MachineApi<T> {\n const translations = state.context.translations\n const isFocused = state.matches(\"focused\")\n\n return {\n value: state.context.value,\n focusedValue: state.context.focusedValue,\n previousValues: Array.from(state.context.previousValues),\n\n setValue(value: string) {\n send({ type: \"SET_VALUE\", value })\n },\n\n clearValue() {\n send({ type: \"CLEAR_VALUE\" })\n },\n\n setIndicatorRect(id: string | null | undefined) {\n send({ type: \"SET_INDICATOR_RECT\", id })\n },\n\n rootProps: normalize.element({\n ...parts.root.attrs,\n id: dom.getRootId(state.context),\n \"data-orientation\": state.context.orientation,\n \"data-focus\": dataAttr(isFocused),\n dir: state.context.dir,\n }),\n\n tablistProps: normalize.element({\n ...parts.list.attrs,\n id: dom.getTablistId(state.context),\n role: \"tablist\",\n \"data-focus\": dataAttr(isFocused),\n \"aria-orientation\": state.context.orientation,\n \"data-orientation\": state.context.orientation,\n \"aria-label\": translations.tablistLabel,\n onKeyDown(event) {\n if (!isSelfEvent(event)) return\n\n const keyMap: EventKeyMap = {\n ArrowDown() {\n send(\"ARROW_DOWN\")\n },\n ArrowUp() {\n send(\"ARROW_UP\")\n },\n ArrowLeft() {\n send(\"ARROW_LEFT\")\n },\n ArrowRight() {\n send(\"ARROW_RIGHT\")\n },\n Home() {\n send(\"HOME\")\n },\n End() {\n send(\"END\")\n },\n Enter() {\n send({ type: \"ENTER\", value: state.context.focusedValue })\n },\n }\n\n let key = getEventKey(event, state.context)\n const exec = keyMap[key]\n\n if (exec) {\n event.preventDefault()\n exec(event)\n }\n },\n }),\n\n getTriggerProps(props: TriggerProps) {\n const { value, disabled } = props\n const selected = state.context.value === value\n\n return normalize.button({\n ...parts.trigger.attrs,\n role: \"tab\",\n type: \"button\",\n disabled,\n \"data-orientation\": state.context.orientation,\n \"data-disabled\": dataAttr(disabled),\n \"aria-disabled\": disabled,\n \"data-value\": value,\n \"aria-selected\": selected,\n \"data-selected\": dataAttr(selected),\n \"aria-controls\": dom.getContentId(state.context, value),\n \"data-ownedby\": dom.getTablistId(state.context),\n id: dom.getTriggerId(state.context, value),\n tabIndex: selected ? 0 : -1,\n onFocus() {\n send({ type: \"TAB_FOCUS\", value })\n },\n onBlur(event) {\n const target = event.relatedTarget as HTMLElement | null\n if (target?.getAttribute(\"role\") !== \"tab\") {\n send({ type: \"TAB_BLUR\" })\n }\n },\n onClick(event) {\n if (disabled) return\n if (isSafari()) {\n event.currentTarget.focus()\n }\n send({ type: \"TAB_CLICK\", value })\n },\n })\n },\n\n getContentProps({ value }: ContentProps) {\n const selected = state.context.value === value\n return normalize.element({\n ...parts.content.attrs,\n id: dom.getContentId(state.context, value),\n tabIndex: 0,\n \"aria-labelledby\": dom.getTriggerId(state.context, value),\n role: \"tabpanel\",\n \"data-ownedby\": dom.getTablistId(state.context),\n \"data-selected\": dataAttr(selected),\n hidden: !selected,\n })\n },\n\n indicatorProps: normalize.element({\n id: dom.getIndicatorId(state.context),\n ...parts.indicator.attrs,\n \"data-orientation\": state.context.orientation,\n style: {\n \"--transition-duration\": \"150ms\",\n \"--transition-property\": \"left, right, top, bottom, width, height\",\n position: \"absolute\",\n willChange: \"var(--transition-property)\",\n transitionProperty: \"var(--transition-property)\",\n transitionDuration: state.context.canIndicatorTransition ? \"var(--transition-duration)\" : \"0ms\",\n transitionTimingFunction: \"var(--transition-timing-function)\",\n ...state.context.indicatorRect,\n },\n }),\n }\n}\n","import { createScope, itemById, nextById, prevById, queryAll } from \"@zag-js/dom-query\"\nimport { first, last } from \"@zag-js/utils\"\nimport type { MachineContext as Ctx } from \"./tabs.types\"\n\nexport const dom = createScope({\n getRootId: (ctx: Ctx) => ctx.ids?.root ?? `tabs:${ctx.id}`,\n getTablistId: (ctx: Ctx) => ctx.ids?.tablist ?? `tabs:${ctx.id}:list`,\n getContentId: (ctx: Ctx, id: string) => ctx.ids?.content ?? `tabs:${ctx.id}:content-${id}`,\n getTriggerId: (ctx: Ctx, id: string) => ctx.ids?.trigger ?? `tabs:${ctx.id}:trigger-${id}`,\n getIndicatorId: (ctx: Ctx) => ctx.ids?.indicator ?? `tabs:${ctx.id}:indicator`,\n\n getTablistEl: (ctx: Ctx) => dom.getById(ctx, dom.getTablistId(ctx)),\n getContentEl: (ctx: Ctx, id: string) => dom.getById(ctx, dom.getContentId(ctx, id)),\n getTriggerEl: (ctx: Ctx, id: string) => dom.getById(ctx, dom.getTriggerId(ctx, id)),\n getIndicatorEl: (ctx: Ctx) => dom.getById(ctx, dom.getIndicatorId(ctx)),\n\n getElements: (ctx: Ctx) => {\n const ownerId = CSS.escape(dom.getTablistId(ctx))\n const selector = `[role=tab][data-ownedby='${ownerId}']:not([disabled])`\n return queryAll(dom.getTablistEl(ctx), selector)\n },\n\n getFirstEl: (ctx: Ctx) => first(dom.getElements(ctx)),\n getLastEl: (ctx: Ctx) => last(dom.getElements(ctx)),\n getNextEl: (ctx: Ctx, id: string) => nextById(dom.getElements(ctx), dom.getTriggerId(ctx, id), ctx.loop),\n getPrevEl: (ctx: Ctx, id: string) => prevById(dom.getElements(ctx), dom.getTriggerId(ctx, id), ctx.loop),\n getActiveContentEl: (ctx: Ctx) => {\n if (!ctx.value) return\n return dom.getContentEl(ctx, ctx.value)\n },\n getActiveTabEl: (ctx: Ctx) => {\n if (!ctx.value) return\n return dom.getTriggerEl(ctx, ctx.value)\n },\n\n getOffsetRect: (el: HTMLElement | undefined) => {\n return {\n left: el?.offsetLeft ?? 0,\n top: el?.offsetTop ?? 0,\n width: el?.offsetWidth ?? 0,\n height: el?.offsetHeight ?? 0,\n }\n },\n\n getRectById: (ctx: Ctx, id: string) => {\n const tab = itemById(dom.getElements(ctx), dom.getTriggerId(ctx, id))\n return dom.resolveRect(dom.getOffsetRect(tab), ctx.orientation)\n },\n\n resolveRect(rect: Record<\"width\" | \"height\" | \"left\" | \"top\", number>, orientation?: \"horizontal\" | \"vertical\") {\n const sizeProp = orientation === \"vertical\" ? \"height\" : \"width\"\n const placementProp = orientation === \"vertical\" ? \"top\" : \"left\"\n return {\n [placementProp]: `${rect[placementProp]}px`,\n [sizeProp]: `${rect[sizeProp]}px`,\n }\n },\n})\n","import { createMachine, guards } from \"@zag-js/core\"\nimport { nextTick, raf } from \"@zag-js/dom-query\"\nimport { trackElementRect } from \"@zag-js/element-rect\"\nimport { getFocusables } from \"@zag-js/tabbable\"\nimport { compact, isEqual } from \"@zag-js/utils\"\nimport { dom } from \"./tabs.dom\"\nimport type { MachineContext, MachineState, UserDefinedContext } from \"./tabs.types\"\n\nconst { not } = guards\n\nexport function machine(userContext: UserDefinedContext) {\n const ctx = compact(userContext)\n return createMachine<MachineContext, MachineState>(\n {\n initial: \"idle\",\n\n context: {\n dir: \"ltr\",\n orientation: \"horizontal\",\n activationMode: \"automatic\",\n value: null,\n focusedValue: null,\n previousValues: [],\n indicatorRect: {\n left: \"0px\",\n top: \"0px\",\n width: \"0px\",\n height: \"0px\",\n },\n canIndicatorTransition: false,\n isIndicatorRendered: false,\n loop: true,\n translations: {},\n ...ctx,\n },\n\n computed: {\n isHorizontal: (ctx) => ctx.orientation === \"horizontal\",\n isVertical: (ctx) => ctx.orientation === \"vertical\",\n },\n\n created: [\"setPrevSelectedTabs\"],\n\n entry: [\"checkRenderedElements\", \"syncIndicatorRect\", \"setContentTabIndex\"],\n\n exit: [\"cleanupObserver\"],\n\n watch: {\n value: [\"enableIndicatorTransition\", \"setPrevSelectedTabs\", \"syncIndicatorRect\", \"setContentTabIndex\"],\n dir: [\"syncIndicatorRect\"],\n orientation: [\"syncIndicatorRect\"],\n },\n\n on: {\n SET_VALUE: {\n actions: \"setValue\",\n },\n CLEAR_VALUE: {\n actions: \"clearValue\",\n },\n SET_INDICATOR_RECT: {\n actions: \"setIndicatorRect\",\n },\n },\n\n states: {\n idle: {\n on: {\n TAB_FOCUS: [\n {\n guard: \"selectOnFocus\",\n target: \"focused\",\n actions: [\"setFocusedValue\", \"setValue\"],\n },\n {\n target: \"focused\",\n actions: \"setFocusedValue\",\n },\n ],\n TAB_CLICK: {\n target: \"focused\",\n actions: [\"setFocusedValue\", \"setValue\"],\n },\n },\n },\n focused: {\n on: {\n TAB_CLICK: {\n target: \"focused\",\n actions: [\"setFocusedValue\", \"setValue\"],\n },\n ARROW_LEFT: {\n guard: \"isHorizontal\",\n actions: \"focusPrevTab\",\n },\n ARROW_RIGHT: {\n guard: \"isHorizontal\",\n actions: \"focusNextTab\",\n },\n ARROW_UP: {\n guard: \"isVertical\",\n actions: \"focusPrevTab\",\n },\n ARROW_DOWN: {\n guard: \"isVertical\",\n actions: \"focusNextTab\",\n },\n HOME: {\n actions: \"focusFirstTab\",\n },\n END: {\n actions: \"focusLastTab\",\n },\n ENTER: {\n guard: not(\"selectOnFocus\"),\n actions: \"setValue\",\n },\n TAB_FOCUS: [\n {\n guard: \"selectOnFocus\",\n actions: [\"setFocusedValue\", \"setValue\"],\n },\n { actions: \"setFocusedValue\" },\n ],\n TAB_BLUR: {\n target: \"idle\",\n actions: \"clearFocusedValue\",\n },\n },\n },\n },\n },\n {\n guards: {\n isVertical: (ctx) => ctx.isVertical,\n isHorizontal: (ctx) => ctx.isHorizontal,\n selectOnFocus: (ctx) => ctx.activationMode === \"automatic\",\n },\n\n actions: {\n setFocusedValue(ctx, evt) {\n set.focusedValue(ctx, evt.value)\n },\n clearFocusedValue(ctx) {\n set.focusedValue(ctx, null)\n },\n setValue(ctx, evt) {\n set.value(ctx, evt.value)\n },\n clearValue(ctx) {\n set.value(ctx, null)\n },\n focusFirstTab(ctx) {\n raf(() => dom.getFirstEl(ctx)?.focus())\n },\n focusLastTab(ctx) {\n raf(() => dom.getLastEl(ctx)?.focus())\n },\n focusNextTab(ctx) {\n if (!ctx.focusedValue) return\n const next = dom.getNextEl(ctx, ctx.focusedValue)\n raf(() => next?.focus())\n },\n focusPrevTab(ctx) {\n if (!ctx.focusedValue) return\n const prev = dom.getPrevEl(ctx, ctx.focusedValue)\n raf(() => prev?.focus())\n },\n checkRenderedElements(ctx) {\n ctx.isIndicatorRendered = !!dom.getIndicatorEl(ctx)\n },\n setPrevSelectedTabs(ctx) {\n if (ctx.value != null) {\n ctx.previousValues = pushUnique(ctx.previousValues, ctx.value)\n }\n },\n // if tab panel contains focusable elements, remove the tabindex attribute\n setContentTabIndex(ctx) {\n raf(() => {\n const panel = dom.getActiveContentEl(ctx)\n if (!panel) return\n const focusables = getFocusables(panel)\n if (focusables.length > 0) {\n panel.removeAttribute(\"tabindex\")\n } else {\n panel.setAttribute(\"tabindex\", \"0\")\n }\n })\n },\n cleanupObserver(ctx) {\n ctx.indicatorCleanup?.()\n },\n enableIndicatorTransition(ctx) {\n ctx.canIndicatorTransition = true\n },\n setIndicatorRect(ctx, evt) {\n const value = evt.id ?? ctx.value\n if (!ctx.isIndicatorRendered || !value) return\n\n const tabEl = dom.getTriggerEl(ctx, value)\n if (!tabEl) return\n\n ctx.indicatorRect = dom.getRectById(ctx, value)\n nextTick(() => {\n ctx.canIndicatorTransition = false\n })\n },\n syncIndicatorRect(ctx) {\n ctx.indicatorCleanup?.()\n\n const value = ctx.value\n if (!ctx.isIndicatorRendered || !value) return\n\n const tabEl = dom.getActiveTabEl(ctx)\n if (!tabEl) return\n\n ctx.indicatorCleanup = trackElementRect(tabEl, {\n getRect(el) {\n return dom.getOffsetRect(el)\n },\n onChange(rect) {\n ctx.indicatorRect = dom.resolveRect(rect, ctx.orientation)\n nextTick(() => {\n ctx.canIndicatorTransition = false\n })\n },\n })\n },\n },\n },\n )\n}\n\n// function to push value array and remove previous instances of value\nfunction pushUnique(arr: string[], value: any) {\n const newArr = Array.from(arr).slice()\n const index = newArr.indexOf(value)\n if (index > -1) {\n newArr.splice(index, 1)\n }\n newArr.push(value)\n return newArr\n}\n\nconst invoke = {\n change: (ctx: MachineContext) => {\n if (ctx.value == null) return\n ctx.onChange?.({ value: ctx.value })\n },\n focusChange: (ctx: MachineContext) => {\n if (ctx.focusedValue == null) return\n ctx.onFocus?.({ value: ctx.focusedValue })\n },\n}\n\nconst set = {\n value: (ctx: MachineContext, value: string | null) => {\n if (isEqual(value, ctx.value)) return\n ctx.value = value\n invoke.change(ctx)\n },\n focusedValue: (ctx: MachineContext, value: string | null) => {\n if (isEqual(value, ctx.focusedValue)) return\n ctx.focusedValue = value\n invoke.focusChange(ctx)\n },\n}\n"],"mappings":"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","names":["ctx"]}
1
+ {"version":3,"sources":["../src/tabs.anatomy.ts","../src/tabs.connect.ts","../src/tabs.dom.ts","../src/tabs.machine.ts"],"sourcesContent":["import { createAnatomy } from \"@zag-js/anatomy\"\n\nexport const anatomy = createAnatomy(\"tabs\").parts(\"root\", \"list\", \"trigger\", \"content\", \"indicator\")\nexport const parts = anatomy.build()\n","import { getEventKey, type EventKeyMap } from \"@zag-js/dom-event\"\nimport { dataAttr, isSafari, isSelfEvent } from \"@zag-js/dom-query\"\nimport type { NormalizeProps, PropTypes } from \"@zag-js/types\"\nimport { parts } from \"./tabs.anatomy\"\nimport { dom } from \"./tabs.dom\"\nimport type { MachineApi, Send, State, TriggerProps } from \"./tabs.types\"\n\nexport function connect<T extends PropTypes>(state: State, send: Send, normalize: NormalizeProps<T>): MachineApi<T> {\n const translations = state.context.translations\n const isFocused = state.matches(\"focused\")\n\n function getTriggerState(props: TriggerProps) {\n return {\n isSelected: state.context.value === props.value,\n isFocused: state.context.focusedValue === props.value,\n isDisabled: !!props.disabled,\n }\n }\n\n return {\n value: state.context.value,\n focusedValue: state.context.focusedValue,\n previousValues: Array.from(state.context.previousValues),\n\n setValue(value) {\n send({ type: \"SET_VALUE\", value })\n },\n\n clearValue() {\n send({ type: \"CLEAR_VALUE\" })\n },\n\n setIndicatorRect(value) {\n const id = dom.getTriggerId(state.context, value)\n send({ type: \"SET_INDICATOR_RECT\", id })\n },\n\n getTriggerState,\n\n rootProps: normalize.element({\n ...parts.root.attrs,\n id: dom.getRootId(state.context),\n \"data-orientation\": state.context.orientation,\n \"data-focus\": dataAttr(isFocused),\n dir: state.context.dir,\n }),\n\n tablistProps: normalize.element({\n ...parts.list.attrs,\n id: dom.getTablistId(state.context),\n role: \"tablist\",\n dir: state.context.dir,\n \"data-focus\": dataAttr(isFocused),\n \"aria-orientation\": state.context.orientation,\n \"data-orientation\": state.context.orientation,\n \"aria-label\": translations.tablistLabel,\n onKeyDown(event) {\n if (!isSelfEvent(event)) return\n\n const keyMap: EventKeyMap = {\n ArrowDown() {\n send(\"ARROW_DOWN\")\n },\n ArrowUp() {\n send(\"ARROW_UP\")\n },\n ArrowLeft() {\n send(\"ARROW_LEFT\")\n },\n ArrowRight() {\n send(\"ARROW_RIGHT\")\n },\n Home() {\n send(\"HOME\")\n },\n End() {\n send(\"END\")\n },\n Enter() {\n send({ type: \"ENTER\", value: state.context.focusedValue })\n },\n }\n\n let key = getEventKey(event, state.context)\n const exec = keyMap[key]\n\n if (exec) {\n event.preventDefault()\n exec(event)\n }\n },\n }),\n\n getTriggerProps(props) {\n const { value, disabled } = props\n const triggerState = getTriggerState(props)\n\n return normalize.button({\n ...parts.trigger.attrs,\n role: \"tab\",\n type: \"button\",\n disabled,\n dir: state.context.dir,\n \"data-orientation\": state.context.orientation,\n \"data-disabled\": dataAttr(disabled),\n \"aria-disabled\": disabled,\n \"data-value\": value,\n \"aria-selected\": triggerState.isSelected,\n \"data-selected\": dataAttr(triggerState.isSelected),\n \"data-focus\": dataAttr(triggerState.isFocused),\n \"aria-controls\": dom.getContentId(state.context, value),\n \"data-ownedby\": dom.getTablistId(state.context),\n id: dom.getTriggerId(state.context, value),\n tabIndex: triggerState.isSelected ? 0 : -1,\n onFocus() {\n send({ type: \"TAB_FOCUS\", value })\n },\n onBlur(event) {\n const target = event.relatedTarget as HTMLElement | null\n if (target?.getAttribute(\"role\") !== \"tab\") {\n send({ type: \"TAB_BLUR\" })\n }\n },\n onClick(event) {\n if (disabled) return\n if (isSafari()) {\n event.currentTarget.focus()\n }\n send({ type: \"TAB_CLICK\", value })\n },\n })\n },\n\n getContentProps(props) {\n const { value } = props\n const selected = state.context.value === value\n return normalize.element({\n ...parts.content.attrs,\n dir: state.context.dir,\n id: dom.getContentId(state.context, value),\n tabIndex: 0,\n \"aria-labelledby\": dom.getTriggerId(state.context, value),\n role: \"tabpanel\",\n \"data-ownedby\": dom.getTablistId(state.context),\n \"data-selected\": dataAttr(selected),\n \"data-orientation\": state.context.orientation,\n hidden: !selected,\n })\n },\n\n indicatorProps: normalize.element({\n id: dom.getIndicatorId(state.context),\n ...parts.indicator.attrs,\n \"data-orientation\": state.context.orientation,\n style: {\n \"--transition-duration\": \"150ms\",\n \"--transition-property\": \"left, right, top, bottom, width, height\",\n position: \"absolute\",\n willChange: \"var(--transition-property)\",\n transitionProperty: \"var(--transition-property)\",\n transitionDuration: state.context.canIndicatorTransition ? \"var(--transition-duration)\" : \"0ms\",\n transitionTimingFunction: \"var(--transition-timing-function)\",\n ...state.context.indicatorRect,\n },\n }),\n }\n}\n","import { createScope, itemById, nextById, prevById, queryAll } from \"@zag-js/dom-query\"\nimport { first, last } from \"@zag-js/utils\"\nimport type { MachineContext as Ctx } from \"./tabs.types\"\n\nexport const dom = createScope({\n getRootId: (ctx: Ctx) => ctx.ids?.root ?? `tabs:${ctx.id}`,\n getTablistId: (ctx: Ctx) => ctx.ids?.tablist ?? `tabs:${ctx.id}:list`,\n getContentId: (ctx: Ctx, id: string) => ctx.ids?.content ?? `tabs:${ctx.id}:content-${id}`,\n getTriggerId: (ctx: Ctx, id: string) => ctx.ids?.trigger ?? `tabs:${ctx.id}:trigger-${id}`,\n getIndicatorId: (ctx: Ctx) => ctx.ids?.indicator ?? `tabs:${ctx.id}:indicator`,\n\n getTablistEl: (ctx: Ctx) => dom.getById(ctx, dom.getTablistId(ctx)),\n getContentEl: (ctx: Ctx, id: string) => dom.getById(ctx, dom.getContentId(ctx, id)),\n getTriggerEl: (ctx: Ctx, id: string) => dom.getById(ctx, dom.getTriggerId(ctx, id)),\n getIndicatorEl: (ctx: Ctx) => dom.getById(ctx, dom.getIndicatorId(ctx)),\n\n getElements: (ctx: Ctx) => {\n const ownerId = CSS.escape(dom.getTablistId(ctx))\n const selector = `[role=tab][data-ownedby='${ownerId}']:not([disabled])`\n return queryAll(dom.getTablistEl(ctx), selector)\n },\n\n getFirstEl: (ctx: Ctx) => first(dom.getElements(ctx)),\n getLastEl: (ctx: Ctx) => last(dom.getElements(ctx)),\n getNextEl: (ctx: Ctx, id: string) => nextById(dom.getElements(ctx), dom.getTriggerId(ctx, id), ctx.loop),\n getPrevEl: (ctx: Ctx, id: string) => prevById(dom.getElements(ctx), dom.getTriggerId(ctx, id), ctx.loop),\n getActiveContentEl: (ctx: Ctx) => {\n if (!ctx.value) return\n return dom.getContentEl(ctx, ctx.value)\n },\n getActiveTabEl: (ctx: Ctx) => {\n if (!ctx.value) return\n return dom.getTriggerEl(ctx, ctx.value)\n },\n\n getOffsetRect: (el: HTMLElement | undefined) => {\n return {\n left: el?.offsetLeft ?? 0,\n top: el?.offsetTop ?? 0,\n width: el?.offsetWidth ?? 0,\n height: el?.offsetHeight ?? 0,\n }\n },\n\n getRectById: (ctx: Ctx, id: string) => {\n const tab = itemById(dom.getElements(ctx), dom.getTriggerId(ctx, id))\n return dom.resolveRect(dom.getOffsetRect(tab), ctx.orientation)\n },\n\n resolveRect(rect: Record<\"width\" | \"height\" | \"left\" | \"top\", number>, orientation?: \"horizontal\" | \"vertical\") {\n const sizeProp = orientation === \"vertical\" ? \"height\" : \"width\"\n const placementProp = orientation === \"vertical\" ? \"top\" : \"left\"\n return {\n [placementProp]: `${rect[placementProp]}px`,\n [sizeProp]: `${rect[sizeProp]}px`,\n }\n },\n})\n","import { createMachine, guards } from \"@zag-js/core\"\nimport { nextTick, raf } from \"@zag-js/dom-query\"\nimport { trackElementRect } from \"@zag-js/element-rect\"\nimport { getFocusables } from \"@zag-js/tabbable\"\nimport { compact, isEqual } from \"@zag-js/utils\"\nimport { dom } from \"./tabs.dom\"\nimport type { MachineContext, MachineState, UserDefinedContext } from \"./tabs.types\"\n\nconst { not } = guards\n\nexport function machine(userContext: UserDefinedContext) {\n const ctx = compact(userContext)\n return createMachine<MachineContext, MachineState>(\n {\n initial: \"idle\",\n\n context: {\n dir: \"ltr\",\n orientation: \"horizontal\",\n activationMode: \"automatic\",\n value: null,\n focusedValue: null,\n previousValues: [],\n indicatorRect: {\n left: \"0px\",\n top: \"0px\",\n width: \"0px\",\n height: \"0px\",\n },\n canIndicatorTransition: false,\n isIndicatorRendered: false,\n loop: true,\n translations: {},\n ...ctx,\n },\n\n computed: {\n isHorizontal: (ctx) => ctx.orientation === \"horizontal\",\n isVertical: (ctx) => ctx.orientation === \"vertical\",\n },\n\n created: [\"setPrevSelectedTabs\"],\n\n entry: [\"checkRenderedElements\", \"syncIndicatorRect\", \"setContentTabIndex\"],\n\n exit: [\"cleanupObserver\"],\n\n watch: {\n value: [\"enableIndicatorTransition\", \"setPrevSelectedTabs\", \"syncIndicatorRect\", \"setContentTabIndex\"],\n dir: [\"syncIndicatorRect\"],\n orientation: [\"syncIndicatorRect\"],\n },\n\n on: {\n SET_VALUE: {\n actions: \"setValue\",\n },\n CLEAR_VALUE: {\n actions: \"clearValue\",\n },\n SET_INDICATOR_RECT: {\n actions: \"setIndicatorRect\",\n },\n },\n\n states: {\n idle: {\n on: {\n TAB_FOCUS: [\n {\n guard: \"selectOnFocus\",\n target: \"focused\",\n actions: [\"setFocusedValue\", \"setValue\"],\n },\n {\n target: \"focused\",\n actions: \"setFocusedValue\",\n },\n ],\n TAB_CLICK: {\n target: \"focused\",\n actions: [\"setFocusedValue\", \"setValue\"],\n },\n },\n },\n focused: {\n on: {\n TAB_CLICK: {\n target: \"focused\",\n actions: [\"setFocusedValue\", \"setValue\"],\n },\n ARROW_LEFT: {\n guard: \"isHorizontal\",\n actions: \"focusPrevTab\",\n },\n ARROW_RIGHT: {\n guard: \"isHorizontal\",\n actions: \"focusNextTab\",\n },\n ARROW_UP: {\n guard: \"isVertical\",\n actions: \"focusPrevTab\",\n },\n ARROW_DOWN: {\n guard: \"isVertical\",\n actions: \"focusNextTab\",\n },\n HOME: {\n actions: \"focusFirstTab\",\n },\n END: {\n actions: \"focusLastTab\",\n },\n ENTER: {\n guard: not(\"selectOnFocus\"),\n actions: \"setValue\",\n },\n TAB_FOCUS: [\n {\n guard: \"selectOnFocus\",\n actions: [\"setFocusedValue\", \"setValue\"],\n },\n { actions: \"setFocusedValue\" },\n ],\n TAB_BLUR: {\n target: \"idle\",\n actions: \"clearFocusedValue\",\n },\n },\n },\n },\n },\n {\n guards: {\n isVertical: (ctx) => ctx.isVertical,\n isHorizontal: (ctx) => ctx.isHorizontal,\n selectOnFocus: (ctx) => ctx.activationMode === \"automatic\",\n },\n\n actions: {\n setFocusedValue(ctx, evt) {\n set.focusedValue(ctx, evt.value)\n },\n clearFocusedValue(ctx) {\n set.focusedValue(ctx, null)\n },\n setValue(ctx, evt) {\n set.value(ctx, evt.value)\n },\n clearValue(ctx) {\n set.value(ctx, null)\n },\n focusFirstTab(ctx) {\n raf(() => dom.getFirstEl(ctx)?.focus())\n },\n focusLastTab(ctx) {\n raf(() => dom.getLastEl(ctx)?.focus())\n },\n focusNextTab(ctx) {\n if (!ctx.focusedValue) return\n const next = dom.getNextEl(ctx, ctx.focusedValue)\n raf(() => next?.focus())\n },\n focusPrevTab(ctx) {\n if (!ctx.focusedValue) return\n const prev = dom.getPrevEl(ctx, ctx.focusedValue)\n raf(() => prev?.focus())\n },\n checkRenderedElements(ctx) {\n ctx.isIndicatorRendered = !!dom.getIndicatorEl(ctx)\n },\n setPrevSelectedTabs(ctx) {\n if (ctx.value != null) {\n ctx.previousValues = pushUnique(ctx.previousValues, ctx.value)\n }\n },\n // if tab panel contains focusable elements, remove the tabindex attribute\n setContentTabIndex(ctx) {\n raf(() => {\n const panel = dom.getActiveContentEl(ctx)\n if (!panel) return\n const focusables = getFocusables(panel)\n if (focusables.length > 0) {\n panel.removeAttribute(\"tabindex\")\n } else {\n panel.setAttribute(\"tabindex\", \"0\")\n }\n })\n },\n cleanupObserver(ctx) {\n ctx.indicatorCleanup?.()\n },\n enableIndicatorTransition(ctx) {\n ctx.canIndicatorTransition = true\n },\n setIndicatorRect(ctx, evt) {\n const value = evt.id ?? ctx.value\n if (!ctx.isIndicatorRendered || !value) return\n\n const tabEl = dom.getTriggerEl(ctx, value)\n if (!tabEl) return\n\n ctx.indicatorRect = dom.getRectById(ctx, value)\n nextTick(() => {\n ctx.canIndicatorTransition = false\n })\n },\n syncIndicatorRect(ctx) {\n ctx.indicatorCleanup?.()\n\n const value = ctx.value\n if (!ctx.isIndicatorRendered || !value) return\n\n const tabEl = dom.getActiveTabEl(ctx)\n if (!tabEl) return\n\n ctx.indicatorCleanup = trackElementRect(tabEl, {\n getRect(el) {\n return dom.getOffsetRect(el)\n },\n onChange(rect) {\n ctx.indicatorRect = dom.resolveRect(rect, ctx.orientation)\n nextTick(() => {\n ctx.canIndicatorTransition = false\n })\n },\n })\n },\n },\n },\n )\n}\n\n// function to push value array and remove previous instances of value\nfunction pushUnique(arr: string[], value: any) {\n const newArr = Array.from(arr).slice()\n const index = newArr.indexOf(value)\n if (index > -1) {\n newArr.splice(index, 1)\n }\n newArr.push(value)\n return newArr\n}\n\nconst invoke = {\n change: (ctx: MachineContext) => {\n if (ctx.value == null) return\n ctx.onValueChange?.({ value: ctx.value })\n },\n focusChange: (ctx: MachineContext) => {\n if (ctx.focusedValue == null) return\n ctx.onFocusChange?.({ focusedValue: ctx.focusedValue })\n },\n}\n\nconst set = {\n value: (ctx: MachineContext, value: string | null) => {\n if (isEqual(value, ctx.value)) return\n ctx.value = value\n invoke.change(ctx)\n },\n focusedValue: (ctx: MachineContext, value: string | null) => {\n if (isEqual(value, ctx.focusedValue)) return\n ctx.focusedValue = value\n invoke.focusChange(ctx)\n },\n}\n"],"mappings":"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","names":["ctx"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zag-js/tabs",
3
- "version": "0.19.1",
3
+ "version": "0.21.0",
4
4
  "description": "Core logic for the tabs widget implemented as a state machine",
5
5
  "keywords": [
6
6
  "js",
@@ -27,14 +27,14 @@
27
27
  "url": "https://github.com/chakra-ui/zag/issues"
28
28
  },
29
29
  "dependencies": {
30
- "@zag-js/anatomy": "0.19.1",
31
- "@zag-js/dom-query": "0.19.1",
32
- "@zag-js/dom-event": "0.19.1",
33
- "@zag-js/element-rect": "0.19.1",
34
- "@zag-js/tabbable": "0.19.1",
35
- "@zag-js/utils": "0.19.1",
36
- "@zag-js/core": "0.19.1",
37
- "@zag-js/types": "0.19.1"
30
+ "@zag-js/anatomy": "0.21.0",
31
+ "@zag-js/dom-query": "0.21.0",
32
+ "@zag-js/dom-event": "0.21.0",
33
+ "@zag-js/element-rect": "0.21.0",
34
+ "@zag-js/tabbable": "0.21.0",
35
+ "@zag-js/utils": "0.21.0",
36
+ "@zag-js/core": "0.21.0",
37
+ "@zag-js/types": "0.21.0"
38
38
  },
39
39
  "devDependencies": {
40
40
  "clean-package": "2.2.0"
@@ -3,18 +3,26 @@ import { dataAttr, isSafari, isSelfEvent } from "@zag-js/dom-query"
3
3
  import type { NormalizeProps, PropTypes } from "@zag-js/types"
4
4
  import { parts } from "./tabs.anatomy"
5
5
  import { dom } from "./tabs.dom"
6
- import type { ContentProps, MachineApi, Send, State, TriggerProps } from "./tabs.types"
6
+ import type { MachineApi, Send, State, TriggerProps } from "./tabs.types"
7
7
 
8
8
  export function connect<T extends PropTypes>(state: State, send: Send, normalize: NormalizeProps<T>): MachineApi<T> {
9
9
  const translations = state.context.translations
10
10
  const isFocused = state.matches("focused")
11
11
 
12
+ function getTriggerState(props: TriggerProps) {
13
+ return {
14
+ isSelected: state.context.value === props.value,
15
+ isFocused: state.context.focusedValue === props.value,
16
+ isDisabled: !!props.disabled,
17
+ }
18
+ }
19
+
12
20
  return {
13
21
  value: state.context.value,
14
22
  focusedValue: state.context.focusedValue,
15
23
  previousValues: Array.from(state.context.previousValues),
16
24
 
17
- setValue(value: string) {
25
+ setValue(value) {
18
26
  send({ type: "SET_VALUE", value })
19
27
  },
20
28
 
@@ -22,10 +30,13 @@ export function connect<T extends PropTypes>(state: State, send: Send, normalize
22
30
  send({ type: "CLEAR_VALUE" })
23
31
  },
24
32
 
25
- setIndicatorRect(id: string | null | undefined) {
33
+ setIndicatorRect(value) {
34
+ const id = dom.getTriggerId(state.context, value)
26
35
  send({ type: "SET_INDICATOR_RECT", id })
27
36
  },
28
37
 
38
+ getTriggerState,
39
+
29
40
  rootProps: normalize.element({
30
41
  ...parts.root.attrs,
31
42
  id: dom.getRootId(state.context),
@@ -38,6 +49,7 @@ export function connect<T extends PropTypes>(state: State, send: Send, normalize
38
49
  ...parts.list.attrs,
39
50
  id: dom.getTablistId(state.context),
40
51
  role: "tablist",
52
+ dir: state.context.dir,
41
53
  "data-focus": dataAttr(isFocused),
42
54
  "aria-orientation": state.context.orientation,
43
55
  "data-orientation": state.context.orientation,
@@ -79,25 +91,27 @@ export function connect<T extends PropTypes>(state: State, send: Send, normalize
79
91
  },
80
92
  }),
81
93
 
82
- getTriggerProps(props: TriggerProps) {
94
+ getTriggerProps(props) {
83
95
  const { value, disabled } = props
84
- const selected = state.context.value === value
96
+ const triggerState = getTriggerState(props)
85
97
 
86
98
  return normalize.button({
87
99
  ...parts.trigger.attrs,
88
100
  role: "tab",
89
101
  type: "button",
90
102
  disabled,
103
+ dir: state.context.dir,
91
104
  "data-orientation": state.context.orientation,
92
105
  "data-disabled": dataAttr(disabled),
93
106
  "aria-disabled": disabled,
94
107
  "data-value": value,
95
- "aria-selected": selected,
96
- "data-selected": dataAttr(selected),
108
+ "aria-selected": triggerState.isSelected,
109
+ "data-selected": dataAttr(triggerState.isSelected),
110
+ "data-focus": dataAttr(triggerState.isFocused),
97
111
  "aria-controls": dom.getContentId(state.context, value),
98
112
  "data-ownedby": dom.getTablistId(state.context),
99
113
  id: dom.getTriggerId(state.context, value),
100
- tabIndex: selected ? 0 : -1,
114
+ tabIndex: triggerState.isSelected ? 0 : -1,
101
115
  onFocus() {
102
116
  send({ type: "TAB_FOCUS", value })
103
117
  },
@@ -117,16 +131,19 @@ export function connect<T extends PropTypes>(state: State, send: Send, normalize
117
131
  })
118
132
  },
119
133
 
120
- getContentProps({ value }: ContentProps) {
134
+ getContentProps(props) {
135
+ const { value } = props
121
136
  const selected = state.context.value === value
122
137
  return normalize.element({
123
138
  ...parts.content.attrs,
139
+ dir: state.context.dir,
124
140
  id: dom.getContentId(state.context, value),
125
141
  tabIndex: 0,
126
142
  "aria-labelledby": dom.getTriggerId(state.context, value),
127
143
  role: "tabpanel",
128
144
  "data-ownedby": dom.getTablistId(state.context),
129
145
  "data-selected": dataAttr(selected),
146
+ "data-orientation": state.context.orientation,
130
147
  hidden: !selected,
131
148
  })
132
149
  },
@@ -245,11 +245,11 @@ function pushUnique(arr: string[], value: any) {
245
245
  const invoke = {
246
246
  change: (ctx: MachineContext) => {
247
247
  if (ctx.value == null) return
248
- ctx.onChange?.({ value: ctx.value })
248
+ ctx.onValueChange?.({ value: ctx.value })
249
249
  },
250
250
  focusChange: (ctx: MachineContext) => {
251
251
  if (ctx.focusedValue == null) return
252
- ctx.onFocus?.({ value: ctx.focusedValue })
252
+ ctx.onFocusChange?.({ focusedValue: ctx.focusedValue })
253
253
  },
254
254
  }
255
255
 
package/src/tabs.types.ts CHANGED
@@ -1,7 +1,23 @@
1
1
  import type { StateMachine as S } from "@zag-js/core"
2
2
  import type { CommonProperties, Context, DirectionProperty, PropTypes, RequiredBy } from "@zag-js/types"
3
3
 
4
- type IntlTranslations = {
4
+ /* -----------------------------------------------------------------------------
5
+ * Callback details
6
+ * -----------------------------------------------------------------------------*/
7
+
8
+ export interface ValueChangeDetails {
9
+ value: string
10
+ }
11
+
12
+ export interface FocusChangeDetails {
13
+ focusedValue: string
14
+ }
15
+
16
+ /* -----------------------------------------------------------------------------
17
+ * Machine context
18
+ * -----------------------------------------------------------------------------*/
19
+
20
+ interface IntlTranslations {
5
21
  tablistLabel?: string
6
22
  }
7
23
 
@@ -13,59 +29,49 @@ type ElementIds = Partial<{
13
29
  indicator: string
14
30
  }>
15
31
 
16
- export type TriggerProps = {
17
- value: string
18
- disabled?: boolean
19
- }
20
-
21
- export type ContentProps = {
22
- value: string
32
+ interface PublicContext extends DirectionProperty, CommonProperties {
33
+ /**
34
+ * The ids of the elements in the tabs. Useful for composition.
35
+ */
36
+ ids?: ElementIds
37
+ /**
38
+ * Specifies the localized strings that identifies the accessibility elements and their states
39
+ */
40
+ translations: IntlTranslations
41
+ /**
42
+ * Whether the keyboard navigation will loop from last tab to first, and vice versa.
43
+ * @default true
44
+ */
45
+ loop: boolean
46
+ /**
47
+ * The selected tab id
48
+ */
49
+ value: string | null
50
+ /**
51
+ * The orientation of the tabs. Can be `horizontal` or `vertical`
52
+ * - `horizontal`: only left and right arrow key navigation will work.
53
+ * - `vertical`: only up and down arrow key navigation will work.
54
+ *
55
+ * @default "horizontal"
56
+ */
57
+ orientation?: "horizontal" | "vertical"
58
+ /**
59
+ * The activation mode of the tabs. Can be `manual` or `automatic`
60
+ * - `manual`: Tabs are activated when clicked or press `enter` key.
61
+ * - `automatic`: Tabs are activated when receiving focus
62
+ * @default "automatic"
63
+ */
64
+ activationMode?: "manual" | "automatic"
65
+ /**
66
+ * Callback to be called when the selected/active tab changes
67
+ */
68
+ onValueChange?: (details: ValueChangeDetails) => void
69
+ /**
70
+ * Callback to be called when the focused tab changes
71
+ */
72
+ onFocusChange?: (details: FocusChangeDetails) => void
23
73
  }
24
74
 
25
- type PublicContext = DirectionProperty &
26
- CommonProperties & {
27
- /**
28
- * The ids of the elements in the tabs. Useful for composition.
29
- */
30
- ids?: ElementIds
31
- /**
32
- * Specifies the localized strings that identifies the accessibility elements and their states
33
- */
34
- translations: IntlTranslations
35
- /**
36
- * Whether the keyboard navigation will loop from last tab to first, and vice versa.
37
- * @default true
38
- */
39
- loop: boolean
40
- /**
41
- * The selected tab id
42
- */
43
- value: string | null
44
- /**
45
- * The orientation of the tabs. Can be `horizontal` or `vertical`
46
- * - `horizontal`: only left and right arrow key navigation will work.
47
- * - `vertical`: only up and down arrow key navigation will work.
48
- *
49
- * @default "horizontal"
50
- */
51
- orientation?: "horizontal" | "vertical"
52
- /**
53
- * The activation mode of the tabs. Can be `manual` or `automatic`
54
- * - `manual`: Tabs are activated when clicked or press `enter` key.
55
- * - `automatic`: Tabs are activated when receiving focus
56
- * @default "automatic"
57
- */
58
- activationMode?: "manual" | "automatic"
59
- /**
60
- * Callback to be called when the selected/active tab changes
61
- */
62
- onChange?: (details: { value: string }) => void
63
- /**
64
- * Callback to be called when the focused tab changes
65
- */
66
- onFocus?: (details: { value: string }) => void
67
- }
68
-
69
75
  export type UserDefinedContext = RequiredBy<PublicContext, "id">
70
76
 
71
77
  type ComputedContext = Readonly<{
@@ -114,9 +120,9 @@ type PrivateContext = Context<{
114
120
  indicatorCleanup?: VoidFunction | null
115
121
  }>
116
122
 
117
- export type MachineContext = PublicContext & ComputedContext & PrivateContext
123
+ export interface MachineContext extends PublicContext, ComputedContext, PrivateContext {}
118
124
 
119
- export type MachineState = {
125
+ export interface MachineState {
120
126
  value: "idle" | "focused"
121
127
  }
122
128
 
@@ -124,7 +130,25 @@ export type State = S.State<MachineContext, MachineState>
124
130
 
125
131
  export type Send = S.Send<S.AnyEventObject>
126
132
 
127
- export type MachineApi<T extends PropTypes = PropTypes> = {
133
+ /* -----------------------------------------------------------------------------
134
+ * Component API
135
+ * -----------------------------------------------------------------------------*/
136
+
137
+ export interface TriggerProps {
138
+ value: string
139
+ disabled?: boolean
140
+ }
141
+
142
+ export interface TriggerState {
143
+ isSelected: boolean
144
+ isFocused: boolean
145
+ }
146
+
147
+ export interface ContentProps {
148
+ value: string
149
+ }
150
+
151
+ export interface MachineApi<T extends PropTypes = PropTypes> {
128
152
  /**
129
153
  * The current value of the tabs.
130
154
  */
@@ -146,12 +170,17 @@ export type MachineApi<T extends PropTypes = PropTypes> = {
146
170
  */
147
171
  clearValue(): void
148
172
  /**
149
- * Sets the indicator rect to the tab with the given id.
173
+ * Sets the indicator rect to the tab with the given value
150
174
  */
151
- setIndicatorRect(id: string | null | undefined): void
175
+ setIndicatorRect(value: string): void
176
+ /**
177
+ * Returns the state of the trigger with the given props
178
+ */
179
+ getTriggerState(props: TriggerProps): TriggerState
180
+
152
181
  rootProps: T["element"]
153
182
  tablistProps: T["element"]
154
183
  getTriggerProps(props: TriggerProps): T["button"]
155
- getContentProps({ value }: ContentProps): T["element"]
184
+ getContentProps(props: ContentProps): T["element"]
156
185
  indicatorProps: T["element"]
157
186
  }