@nation-a/ui 0.5.1 → 0.7.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.cjs CHANGED
@@ -593,6 +593,8 @@ function toArray$1(v2) {
593
593
  if (!v2) return [];
594
594
  return Array.isArray(v2) ? v2 : [v2];
595
595
  }
596
+ var first = (v2) => v2[0];
597
+ var last = (v2) => v2[v2.length - 1];
596
598
  var isString = (v2) => typeof v2 === "string";
597
599
  var isFunction = (v2) => typeof v2 === "function";
598
600
  var fnToString = Function.prototype.toString;
@@ -629,6 +631,7 @@ function ensure(c, m2) {
629
631
  if (c == null) throw new Error(m2);
630
632
  }
631
633
  var isObject = (v2) => typeof v2 === "object" && v2 !== null;
634
+ var dataAttr = (guard) => guard ? "" : void 0;
632
635
  var ELEMENT_NODE = 1;
633
636
  var DOCUMENT_NODE = 9;
634
637
  var DOCUMENT_FRAGMENT_NODE = 11;
@@ -645,6 +648,7 @@ function isRootElement(node) {
645
648
  var isNode = (el) => isObject(el) && el.nodeType !== void 0;
646
649
  var isShadowRoot = (el) => isNode(el) && el.nodeType === DOCUMENT_FRAGMENT_NODE && "host" in el;
647
650
  var isInputElement = (el) => isHTMLElement(el) && el.localName === "input";
651
+ var isAnchorElement = (el) => !!(el == null ? void 0 : el.matches("a[href]"));
648
652
  var isElementVisible = (el) => {
649
653
  if (!isHTMLElement(el)) return false;
650
654
  return el.offsetWidth > 0 || el.offsetHeight > 0 || el.getClientRects().length > 0;
@@ -715,8 +719,20 @@ function getPlatform() {
715
719
  const agent = navigator.userAgentData;
716
720
  return (agent == null ? void 0 : agent.platform) ?? navigator.platform;
717
721
  }
722
+ function getUserAgent() {
723
+ const ua2 = navigator.userAgentData;
724
+ if (ua2 && Array.isArray(ua2.brands)) {
725
+ return ua2.brands.map(({ brand, version }) => `${brand}/${version}`).join(" ");
726
+ }
727
+ return navigator.userAgent;
728
+ }
718
729
  var pt = (v2) => isDom() && v2.test(getPlatform());
730
+ var ua = (v2) => isDom() && v2.test(getUserAgent());
731
+ var vn = (v2) => isDom() && v2.test(navigator.vendor);
719
732
  var isMac = () => pt(/^Mac/);
733
+ var isSafari = () => isApple() && vn(/apple/i);
734
+ var isFirefox = () => ua(/firefox\//i);
735
+ var isApple = () => pt(/mac|iphone|ipad|ipod/i);
720
736
  var isIos = () => pt(/iP(hone|ad|od)|iOS/);
721
737
  function getComposedPath(event) {
722
738
  var _a, _b, _c;
@@ -726,9 +742,39 @@ function getEventTarget(event) {
726
742
  const composedPath = getComposedPath(event);
727
743
  return (composedPath == null ? void 0 : composedPath[0]) ?? event.target;
728
744
  }
745
+ var isSelfTarget = (event) => {
746
+ return contains(event.currentTarget, getEventTarget(event));
747
+ };
748
+ function isComposingEvent(event) {
749
+ return getNativeEvent(event).isComposing;
750
+ }
729
751
  var isContextMenuEvent = (e) => {
730
752
  return e.button === 2 || isMac() && e.ctrlKey && e.button === 0;
731
753
  };
754
+ var keyMap = {
755
+ Up: "ArrowUp",
756
+ Down: "ArrowDown",
757
+ Esc: "Escape",
758
+ " ": "Space",
759
+ ",": "Comma",
760
+ Left: "ArrowLeft",
761
+ Right: "ArrowRight"
762
+ };
763
+ var rtlKeyMap = {
764
+ ArrowLeft: "ArrowRight",
765
+ ArrowRight: "ArrowLeft"
766
+ };
767
+ function getEventKey(event, options = {}) {
768
+ const { dir = "ltr", orientation = "horizontal" } = options;
769
+ let key = event.key;
770
+ key = keyMap[key] ?? key;
771
+ const isRtl = dir === "rtl" && orientation === "horizontal";
772
+ if (isRtl && key in rtlKeyMap) key = rtlKeyMap[key];
773
+ return key;
774
+ }
775
+ function getNativeEvent(event) {
776
+ return event.nativeEvent ?? event;
777
+ }
732
778
  var addDomEvent = (target, eventName, handler, options) => {
733
779
  const node = typeof target === "function" ? target() : target;
734
780
  node == null ? void 0 : node.addEventListener(eventName, handler, options);
@@ -807,6 +853,26 @@ function raf$2(fn) {
807
853
  cleanup == null ? void 0 : cleanup();
808
854
  };
809
855
  }
856
+ function queueBeforeEvent(el, type, cb) {
857
+ const cancelTimer = raf$2(() => {
858
+ el.removeEventListener(type, exec, true);
859
+ cb();
860
+ });
861
+ const exec = () => {
862
+ cancelTimer();
863
+ cb();
864
+ };
865
+ el.addEventListener(type, exec, { once: true, capture: true });
866
+ return cancelTimer;
867
+ }
868
+ function clickIfLink(el) {
869
+ const click = () => el.click();
870
+ if (isFirefox()) {
871
+ queueBeforeEvent(el, "keyup", click);
872
+ } else {
873
+ queueMicrotask(click);
874
+ }
875
+ }
810
876
  function getNearestOverflowAncestor(el) {
811
877
  const parentNode = getParentNode$1(el);
812
878
  if (isRootElement(parentNode)) return getDocument(parentNode).body;
@@ -819,6 +885,28 @@ function isOverflowElement(el) {
819
885
  const { overflow, overflowX, overflowY, display } = win.getComputedStyle(el);
820
886
  return OVERFLOW_RE.test(overflow + overflowY + overflowX) && !["inline", "contents"].includes(display);
821
887
  }
888
+ function queryAll(root, selector) {
889
+ return Array.from((root == null ? void 0 : root.querySelectorAll(selector)) ?? []);
890
+ }
891
+ var defaultItemToId = (v2) => v2.id;
892
+ function itemById(v2, id, itemToId = defaultItemToId) {
893
+ return v2.find((item) => itemToId(item) === id);
894
+ }
895
+ function indexOfId(v2, id, itemToId = defaultItemToId) {
896
+ const item = itemById(v2, id, itemToId);
897
+ return item ? v2.indexOf(item) : -1;
898
+ }
899
+ function nextById(v2, id, loop2 = true) {
900
+ let idx = indexOfId(v2, id);
901
+ idx = loop2 ? (idx + 1) % v2.length : Math.min(idx + 1, v2.length - 1);
902
+ return v2[idx];
903
+ }
904
+ function prevById(v2, id, loop2 = true) {
905
+ let idx = indexOfId(v2, id);
906
+ if (idx === -1) return loop2 ? v2[v2.length - 1] : null;
907
+ idx = loop2 ? (idx - 1 + v2.length) % v2.length : Math.max(0, idx - 1);
908
+ return v2[idx];
909
+ }
822
910
  var cleanups = /* @__PURE__ */ new WeakMap();
823
911
  function set(element, key, setup) {
824
912
  if (!cleanups.has(element)) {
@@ -935,6 +1023,25 @@ function mergeProps(...args) {
935
1023
  }
936
1024
  return result;
937
1025
  }
1026
+ function createGuards() {
1027
+ return {
1028
+ and: (...guards) => {
1029
+ return function andGuard(params) {
1030
+ return guards.every((str) => params.guard(str));
1031
+ };
1032
+ },
1033
+ or: (...guards) => {
1034
+ return function orGuard(params) {
1035
+ return guards.some((str) => params.guard(str));
1036
+ };
1037
+ },
1038
+ not: (guard) => {
1039
+ return function notGuard(params) {
1040
+ return !params.guard(guard);
1041
+ };
1042
+ }
1043
+ };
1044
+ }
938
1045
  function createMachine(config2) {
939
1046
  return config2;
940
1047
  }
@@ -1831,7 +1938,7 @@ const [PresenceProvider, usePresenceContext] = createContext({
1831
1938
  providerName: "<PresenceProvider />"
1832
1939
  });
1833
1940
  const splitPresenceProps = (props) => createSplitProps()(props, ["immediate", "lazyMount", "onExitComplete", "present", "unmountOnExit"]);
1834
- function connect$1(service, _normalize) {
1941
+ function connect$2(service, _normalize) {
1835
1942
  const { state, send, context: context2 } = service;
1836
1943
  const present = state.matches("mounted", "unmountSuspended");
1837
1944
  return {
@@ -1846,7 +1953,7 @@ function connect$1(service, _normalize) {
1846
1953
  }
1847
1954
  };
1848
1955
  }
1849
- var machine$1 = createMachine({
1956
+ var machine$2 = createMachine({
1850
1957
  props({ props: props2 }) {
1851
1958
  return { ...props2, present: !!props2.present };
1852
1959
  },
@@ -2013,8 +2120,8 @@ const usePresence = (props = {}) => {
2013
2120
  present,
2014
2121
  onExitComplete: useEvent(props.onExitComplete)
2015
2122
  };
2016
- const service = useMachine(machine$1, machineProps);
2017
- const api = connect$1(service);
2123
+ const service = useMachine(machine$2, machineProps);
2124
+ const api = connect$2(service);
2018
2125
  if (api.present) {
2019
2126
  wasEverPresent.current = true;
2020
2127
  }
@@ -2793,7 +2900,7 @@ function preventBodyScroll(_document) {
2793
2900
  body.removeAttribute(LOCK_CLASSNAME);
2794
2901
  };
2795
2902
  }
2796
- var anatomy = createAnatomy("dialog").parts(
2903
+ var anatomy$1 = createAnatomy("dialog").parts(
2797
2904
  "trigger",
2798
2905
  "backdrop",
2799
2906
  "positioner",
@@ -2802,7 +2909,7 @@ var anatomy = createAnatomy("dialog").parts(
2802
2909
  "description",
2803
2910
  "closeTrigger"
2804
2911
  );
2805
- var parts = anatomy.build();
2912
+ var parts$1 = anatomy$1.build();
2806
2913
  var getPositionerId = (ctx2) => {
2807
2914
  var _a;
2808
2915
  return ((_a = ctx2.ids) == null ? void 0 : _a.positioner) ?? `dialog:${ctx2.id}:positioner`;
@@ -2811,11 +2918,11 @@ var getBackdropId = (ctx2) => {
2811
2918
  var _a;
2812
2919
  return ((_a = ctx2.ids) == null ? void 0 : _a.backdrop) ?? `dialog:${ctx2.id}:backdrop`;
2813
2920
  };
2814
- var getContentId = (ctx2) => {
2921
+ var getContentId$1 = (ctx2) => {
2815
2922
  var _a;
2816
2923
  return ((_a = ctx2.ids) == null ? void 0 : _a.content) ?? `dialog:${ctx2.id}:content`;
2817
2924
  };
2818
- var getTriggerId = (ctx2) => {
2925
+ var getTriggerId$1 = (ctx2) => {
2819
2926
  var _a;
2820
2927
  return ((_a = ctx2.ids) == null ? void 0 : _a.trigger) ?? `dialog:${ctx2.id}:trigger`;
2821
2928
  };
@@ -2831,14 +2938,14 @@ var getCloseTriggerId = (ctx2) => {
2831
2938
  var _a;
2832
2939
  return ((_a = ctx2.ids) == null ? void 0 : _a.closeTrigger) ?? `dialog:${ctx2.id}:close`;
2833
2940
  };
2834
- var getContentEl = (ctx2) => ctx2.getById(getContentId(ctx2));
2941
+ var getContentEl$1 = (ctx2) => ctx2.getById(getContentId$1(ctx2));
2835
2942
  var getPositionerEl = (ctx2) => ctx2.getById(getPositionerId(ctx2));
2836
2943
  var getBackdropEl = (ctx2) => ctx2.getById(getBackdropId(ctx2));
2837
- var getTriggerEl = (ctx2) => ctx2.getById(getTriggerId(ctx2));
2944
+ var getTriggerEl$1 = (ctx2) => ctx2.getById(getTriggerId$1(ctx2));
2838
2945
  var getTitleEl = (ctx2) => ctx2.getById(getTitleId(ctx2));
2839
2946
  var getDescriptionEl = (ctx2) => ctx2.getById(getDescriptionId(ctx2));
2840
2947
  var getCloseTriggerEl = (ctx2) => ctx2.getById(getCloseTriggerId(ctx2));
2841
- function connect(service, normalize) {
2948
+ function connect$1(service, normalize) {
2842
2949
  const { state, send, context: context2, prop, scope } = service;
2843
2950
  const ariaLabel = prop("aria-label");
2844
2951
  const open = state.matches("open");
@@ -2851,14 +2958,14 @@ function connect(service, normalize) {
2851
2958
  },
2852
2959
  getTriggerProps() {
2853
2960
  return normalize.button({
2854
- ...parts.trigger.attrs,
2961
+ ...parts$1.trigger.attrs,
2855
2962
  dir: prop("dir"),
2856
- id: getTriggerId(scope),
2963
+ id: getTriggerId$1(scope),
2857
2964
  "aria-haspopup": "dialog",
2858
2965
  type: "button",
2859
2966
  "aria-expanded": open,
2860
2967
  "data-state": open ? "open" : "closed",
2861
- "aria-controls": getContentId(scope),
2968
+ "aria-controls": getContentId$1(scope),
2862
2969
  onClick(event) {
2863
2970
  if (event.defaultPrevented) return;
2864
2971
  send({ type: "TOGGLE" });
@@ -2867,7 +2974,7 @@ function connect(service, normalize) {
2867
2974
  },
2868
2975
  getBackdropProps() {
2869
2976
  return normalize.element({
2870
- ...parts.backdrop.attrs,
2977
+ ...parts$1.backdrop.attrs,
2871
2978
  dir: prop("dir"),
2872
2979
  hidden: !open,
2873
2980
  id: getBackdropId(scope),
@@ -2876,7 +2983,7 @@ function connect(service, normalize) {
2876
2983
  },
2877
2984
  getPositionerProps() {
2878
2985
  return normalize.element({
2879
- ...parts.positioner.attrs,
2986
+ ...parts$1.positioner.attrs,
2880
2987
  dir: prop("dir"),
2881
2988
  id: getPositionerId(scope),
2882
2989
  style: {
@@ -2887,11 +2994,11 @@ function connect(service, normalize) {
2887
2994
  getContentProps() {
2888
2995
  const rendered = context2.get("rendered");
2889
2996
  return normalize.element({
2890
- ...parts.content.attrs,
2997
+ ...parts$1.content.attrs,
2891
2998
  dir: prop("dir"),
2892
2999
  role: prop("role"),
2893
3000
  hidden: !open,
2894
- id: getContentId(scope),
3001
+ id: getContentId$1(scope),
2895
3002
  tabIndex: -1,
2896
3003
  "data-state": open ? "open" : "closed",
2897
3004
  "aria-modal": true,
@@ -2902,21 +3009,21 @@ function connect(service, normalize) {
2902
3009
  },
2903
3010
  getTitleProps() {
2904
3011
  return normalize.element({
2905
- ...parts.title.attrs,
3012
+ ...parts$1.title.attrs,
2906
3013
  dir: prop("dir"),
2907
3014
  id: getTitleId(scope)
2908
3015
  });
2909
3016
  },
2910
3017
  getDescriptionProps() {
2911
3018
  return normalize.element({
2912
- ...parts.description.attrs,
3019
+ ...parts$1.description.attrs,
2913
3020
  dir: prop("dir"),
2914
3021
  id: getDescriptionId(scope)
2915
3022
  });
2916
3023
  },
2917
3024
  getCloseTriggerProps() {
2918
3025
  return normalize.button({
2919
- ...parts.closeTrigger.attrs,
3026
+ ...parts$1.closeTrigger.attrs,
2920
3027
  dir: prop("dir"),
2921
3028
  id: getCloseTriggerId(scope),
2922
3029
  type: "button",
@@ -2929,7 +3036,7 @@ function connect(service, normalize) {
2929
3036
  }
2930
3037
  };
2931
3038
  }
2932
- var machine = createMachine({
3039
+ var machine$1 = createMachine({
2933
3040
  props({ props: props2, scope }) {
2934
3041
  const alertDialog = props2.role === "alertdialog";
2935
3042
  const initialFocusEl = alertDialog ? () => getCloseTriggerEl(scope) : void 0;
@@ -3025,11 +3132,11 @@ var machine = createMachine({
3025
3132
  },
3026
3133
  effects: {
3027
3134
  trackDismissableElement({ scope, send, prop }) {
3028
- const getContentEl2 = () => getContentEl(scope);
3135
+ const getContentEl2 = () => getContentEl$1(scope);
3029
3136
  return trackDismissableElement(getContentEl2, {
3030
3137
  defer: true,
3031
3138
  pointerBlocking: prop("modal"),
3032
- exclude: [getTriggerEl(scope)],
3139
+ exclude: [getTriggerEl$1(scope)],
3033
3140
  onInteractOutside(event) {
3034
3141
  var _a;
3035
3142
  (_a = prop("onInteractOutside")) == null ? void 0 : _a(event);
@@ -3058,7 +3165,7 @@ var machine = createMachine({
3058
3165
  },
3059
3166
  trapFocus({ scope, prop }) {
3060
3167
  if (!prop("trapFocus") || !prop("modal")) return;
3061
- const contentEl = () => getContentEl(scope);
3168
+ const contentEl = () => getContentEl$1(scope);
3062
3169
  return trapFocus(contentEl, {
3063
3170
  preventScroll: true,
3064
3171
  returnFocusOnDeactivate: !!prop("restoreFocus"),
@@ -3071,8 +3178,8 @@ var machine = createMachine({
3071
3178
  },
3072
3179
  hideContentBelow({ scope, prop }) {
3073
3180
  if (!prop("modal")) return;
3074
- const getElements = () => [getContentEl(scope)];
3075
- return ariaHidden(getElements, { defer: true });
3181
+ const getElements2 = () => [getContentEl$1(scope)];
3182
+ return ariaHidden(getElements2, { defer: true });
3076
3183
  }
3077
3184
  },
3078
3185
  actions: {
@@ -3086,7 +3193,7 @@ var machine = createMachine({
3086
3193
  },
3087
3194
  syncZIndex({ scope }) {
3088
3195
  raf$2(() => {
3089
- const contentEl = getContentEl(scope);
3196
+ const contentEl = getContentEl$1(scope);
3090
3197
  if (!contentEl) return;
3091
3198
  const styles = getComputedStyle(contentEl);
3092
3199
  const elems = [getPositionerEl(scope), getBackdropEl(scope)];
@@ -3148,8 +3255,8 @@ const useDialog = (props) => {
3148
3255
  dir,
3149
3256
  ...props
3150
3257
  };
3151
- const service = useMachine(machine, machineProps);
3152
- return connect(service, normalizeProps);
3258
+ const service = useMachine(machine$1, machineProps);
3259
+ return connect$1(service, normalizeProps);
3153
3260
  };
3154
3261
  const DialogRoot = (props) => {
3155
3262
  const [presenceProps, { children, ...localProps }] = splitPresenceProps(props);
@@ -3205,6 +3312,595 @@ const getPortalNode = (cb) => {
3205
3312
  };
3206
3313
  const subscribe = () => () => {
3207
3314
  };
3315
+ const [TabsProvider, useTabsContext] = createContext({
3316
+ name: "TabsContext",
3317
+ hookName: "useTabsContext",
3318
+ providerName: "<TabsProvider />"
3319
+ });
3320
+ const TabList = React.forwardRef((props, ref) => {
3321
+ const tabs = useTabsContext();
3322
+ const mergedProps = mergeProps(tabs.getListProps(), props);
3323
+ return /* @__PURE__ */ jsxRuntime.jsx(ark.div, { ...mergedProps, ref });
3324
+ });
3325
+ TabList.displayName = "TabList";
3326
+ const TabTrigger = React.forwardRef((props, ref) => {
3327
+ const [tabProps, localProps] = createSplitProps()(props, ["disabled", "value"]);
3328
+ const tabs = useTabsContext();
3329
+ const mergedProps = mergeProps(tabs.getTriggerProps(tabProps), localProps);
3330
+ return /* @__PURE__ */ jsxRuntime.jsx(ark.button, { ...mergedProps, ref });
3331
+ });
3332
+ TabTrigger.displayName = "TabTrigger";
3333
+ var anatomy = createAnatomy("tabs").parts("root", "list", "trigger", "content", "indicator");
3334
+ var parts = anatomy.build();
3335
+ var getRootId = (ctx2) => {
3336
+ var _a;
3337
+ return ((_a = ctx2.ids) == null ? void 0 : _a.root) ?? `tabs:${ctx2.id}`;
3338
+ };
3339
+ var getListId = (ctx2) => {
3340
+ var _a;
3341
+ return ((_a = ctx2.ids) == null ? void 0 : _a.list) ?? `tabs:${ctx2.id}:list`;
3342
+ };
3343
+ var getContentId = (ctx2, id) => {
3344
+ var _a;
3345
+ return ((_a = ctx2.ids) == null ? void 0 : _a.content) ?? `tabs:${ctx2.id}:content-${id}`;
3346
+ };
3347
+ var getTriggerId = (ctx2, id) => {
3348
+ var _a;
3349
+ return ((_a = ctx2.ids) == null ? void 0 : _a.trigger) ?? `tabs:${ctx2.id}:trigger-${id}`;
3350
+ };
3351
+ var getIndicatorId = (ctx2) => {
3352
+ var _a;
3353
+ return ((_a = ctx2.ids) == null ? void 0 : _a.indicator) ?? `tabs:${ctx2.id}:indicator`;
3354
+ };
3355
+ var getListEl = (ctx2) => ctx2.getById(getListId(ctx2));
3356
+ var getContentEl = (ctx2, id) => ctx2.getById(getContentId(ctx2, id));
3357
+ var getTriggerEl = (ctx2, id) => ctx2.getById(getTriggerId(ctx2, id));
3358
+ var getIndicatorEl = (ctx2) => ctx2.getById(getIndicatorId(ctx2));
3359
+ var getElements = (ctx2) => {
3360
+ const ownerId = CSS.escape(getListId(ctx2));
3361
+ const selector = `[role=tab][data-ownedby='${ownerId}']:not([disabled])`;
3362
+ return queryAll(getListEl(ctx2), selector);
3363
+ };
3364
+ var getFirstTriggerEl = (ctx2) => first(getElements(ctx2));
3365
+ var getLastTriggerEl = (ctx2) => last(getElements(ctx2));
3366
+ var getNextTriggerEl = (ctx2, opts) => nextById(getElements(ctx2), getTriggerId(ctx2, opts.value), opts.loopFocus);
3367
+ var getPrevTriggerEl = (ctx2, opts) => prevById(getElements(ctx2), getTriggerId(ctx2, opts.value), opts.loopFocus);
3368
+ var getOffsetRect = (el) => {
3369
+ return {
3370
+ left: (el == null ? void 0 : el.offsetLeft) ?? 0,
3371
+ top: (el == null ? void 0 : el.offsetTop) ?? 0,
3372
+ width: (el == null ? void 0 : el.offsetWidth) ?? 0,
3373
+ height: (el == null ? void 0 : el.offsetHeight) ?? 0
3374
+ };
3375
+ };
3376
+ var getRectById = (ctx2, id) => {
3377
+ const tab = itemById(getElements(ctx2), getTriggerId(ctx2, id));
3378
+ return resolveRect(getOffsetRect(tab));
3379
+ };
3380
+ var resolveRect = (rect) => ({
3381
+ width: `${rect.width}px`,
3382
+ height: `${rect.height}px`,
3383
+ left: `${rect.left}px`,
3384
+ top: `${rect.top}px`
3385
+ });
3386
+ function connect(service, normalize) {
3387
+ const { state, send, context: context2, prop, scope } = service;
3388
+ const translations = prop("translations");
3389
+ const focused = state.matches("focused");
3390
+ const isVertical = prop("orientation") === "vertical";
3391
+ const isHorizontal = prop("orientation") === "horizontal";
3392
+ const composite = prop("composite");
3393
+ function getTriggerState(props2) {
3394
+ return {
3395
+ selected: context2.get("value") === props2.value,
3396
+ focused: context2.get("focusedValue") === props2.value,
3397
+ disabled: !!props2.disabled
3398
+ };
3399
+ }
3400
+ return {
3401
+ value: context2.get("value"),
3402
+ focusedValue: context2.get("focusedValue"),
3403
+ setValue(value) {
3404
+ send({ type: "SET_VALUE", value });
3405
+ },
3406
+ clearValue() {
3407
+ send({ type: "CLEAR_VALUE" });
3408
+ },
3409
+ setIndicatorRect(value) {
3410
+ const id = getTriggerId(scope, value);
3411
+ send({ type: "SET_INDICATOR_RECT", id });
3412
+ },
3413
+ syncTabIndex() {
3414
+ send({ type: "SYNC_TAB_INDEX" });
3415
+ },
3416
+ selectNext(fromValue) {
3417
+ send({ type: "TAB_FOCUS", value: fromValue, src: "selectNext" });
3418
+ send({ type: "ARROW_NEXT", src: "selectNext" });
3419
+ },
3420
+ selectPrev(fromValue) {
3421
+ send({ type: "TAB_FOCUS", value: fromValue, src: "selectPrev" });
3422
+ send({ type: "ARROW_PREV", src: "selectPrev" });
3423
+ },
3424
+ focus() {
3425
+ var _a;
3426
+ const value = context2.get("value");
3427
+ if (!value) return;
3428
+ (_a = getTriggerEl(scope, value)) == null ? void 0 : _a.focus();
3429
+ },
3430
+ getRootProps() {
3431
+ return normalize.element({
3432
+ ...parts.root.attrs,
3433
+ id: getRootId(scope),
3434
+ "data-orientation": prop("orientation"),
3435
+ "data-focus": dataAttr(focused),
3436
+ dir: prop("dir")
3437
+ });
3438
+ },
3439
+ getListProps() {
3440
+ return normalize.element({
3441
+ ...parts.list.attrs,
3442
+ id: getListId(scope),
3443
+ role: "tablist",
3444
+ dir: prop("dir"),
3445
+ "data-focus": dataAttr(focused),
3446
+ "aria-orientation": prop("orientation"),
3447
+ "data-orientation": prop("orientation"),
3448
+ "aria-label": translations == null ? void 0 : translations.listLabel,
3449
+ onKeyDown(event) {
3450
+ if (event.defaultPrevented) return;
3451
+ if (!isSelfTarget(event)) return;
3452
+ if (isComposingEvent(event)) return;
3453
+ const keyMap2 = {
3454
+ ArrowDown() {
3455
+ if (isHorizontal) return;
3456
+ send({ type: "ARROW_NEXT", key: "ArrowDown" });
3457
+ },
3458
+ ArrowUp() {
3459
+ if (isHorizontal) return;
3460
+ send({ type: "ARROW_PREV", key: "ArrowUp" });
3461
+ },
3462
+ ArrowLeft() {
3463
+ if (isVertical) return;
3464
+ send({ type: "ARROW_PREV", key: "ArrowLeft" });
3465
+ },
3466
+ ArrowRight() {
3467
+ if (isVertical) return;
3468
+ send({ type: "ARROW_NEXT", key: "ArrowRight" });
3469
+ },
3470
+ Home() {
3471
+ send({ type: "HOME" });
3472
+ },
3473
+ End() {
3474
+ send({ type: "END" });
3475
+ },
3476
+ Enter() {
3477
+ send({ type: "ENTER" });
3478
+ }
3479
+ };
3480
+ let key = getEventKey(event, {
3481
+ dir: prop("dir"),
3482
+ orientation: prop("orientation")
3483
+ });
3484
+ const exec = keyMap2[key];
3485
+ if (exec) {
3486
+ event.preventDefault();
3487
+ exec(event);
3488
+ }
3489
+ }
3490
+ });
3491
+ },
3492
+ getTriggerState,
3493
+ getTriggerProps(props2) {
3494
+ const { value, disabled } = props2;
3495
+ const triggerState = getTriggerState(props2);
3496
+ return normalize.button({
3497
+ ...parts.trigger.attrs,
3498
+ role: "tab",
3499
+ type: "button",
3500
+ disabled,
3501
+ dir: prop("dir"),
3502
+ "data-orientation": prop("orientation"),
3503
+ "data-disabled": dataAttr(disabled),
3504
+ "aria-disabled": disabled,
3505
+ "data-value": value,
3506
+ "aria-selected": triggerState.selected,
3507
+ "data-selected": dataAttr(triggerState.selected),
3508
+ "data-focus": dataAttr(triggerState.focused),
3509
+ "aria-controls": triggerState.selected ? getContentId(scope, value) : void 0,
3510
+ "data-ownedby": getListId(scope),
3511
+ "data-ssr": dataAttr(context2.get("ssr")),
3512
+ id: getTriggerId(scope, value),
3513
+ tabIndex: triggerState.selected && composite ? 0 : -1,
3514
+ onFocus() {
3515
+ send({ type: "TAB_FOCUS", value });
3516
+ },
3517
+ onBlur(event) {
3518
+ const target = event.relatedTarget;
3519
+ if ((target == null ? void 0 : target.getAttribute("role")) !== "tab") {
3520
+ send({ type: "TAB_BLUR" });
3521
+ }
3522
+ },
3523
+ onClick(event) {
3524
+ if (event.defaultPrevented) return;
3525
+ if (disabled) return;
3526
+ if (isSafari()) {
3527
+ event.currentTarget.focus();
3528
+ }
3529
+ send({ type: "TAB_CLICK", value });
3530
+ }
3531
+ });
3532
+ },
3533
+ getContentProps(props2) {
3534
+ const { value } = props2;
3535
+ const selected = context2.get("value") === value;
3536
+ return normalize.element({
3537
+ ...parts.content.attrs,
3538
+ dir: prop("dir"),
3539
+ id: getContentId(scope, value),
3540
+ tabIndex: composite ? 0 : -1,
3541
+ "aria-labelledby": getTriggerId(scope, value),
3542
+ role: "tabpanel",
3543
+ "data-ownedby": getListId(scope),
3544
+ "data-selected": dataAttr(selected),
3545
+ "data-orientation": prop("orientation"),
3546
+ hidden: !selected
3547
+ });
3548
+ },
3549
+ getIndicatorProps() {
3550
+ const indicatorRect = context2.get("indicatorRect");
3551
+ const indicatorTransition = context2.get("indicatorTransition");
3552
+ return normalize.element({
3553
+ id: getIndicatorId(scope),
3554
+ ...parts.indicator.attrs,
3555
+ dir: prop("dir"),
3556
+ "data-orientation": prop("orientation"),
3557
+ style: {
3558
+ "--transition-property": "left, right, top, bottom, width, height",
3559
+ "--left": indicatorRect.left,
3560
+ "--top": indicatorRect.top,
3561
+ "--width": indicatorRect.width,
3562
+ "--height": indicatorRect.height,
3563
+ position: "absolute",
3564
+ willChange: "var(--transition-property)",
3565
+ transitionProperty: "var(--transition-property)",
3566
+ transitionDuration: indicatorTransition ? "var(--transition-duration, 150ms)" : "0ms",
3567
+ transitionTimingFunction: "var(--transition-timing-function)",
3568
+ [isHorizontal ? "left" : "top"]: isHorizontal ? "var(--left)" : "var(--top)"
3569
+ }
3570
+ });
3571
+ }
3572
+ };
3573
+ }
3574
+ var { not } = createGuards();
3575
+ var machine = createMachine({
3576
+ props({ props: props2 }) {
3577
+ return {
3578
+ dir: "ltr",
3579
+ orientation: "horizontal",
3580
+ activationMode: "automatic",
3581
+ loopFocus: true,
3582
+ composite: true,
3583
+ navigate(details) {
3584
+ clickIfLink(details.node);
3585
+ },
3586
+ defaultValue: null,
3587
+ ...props2
3588
+ };
3589
+ },
3590
+ initialState() {
3591
+ return "idle";
3592
+ },
3593
+ context({ prop, bindable }) {
3594
+ return {
3595
+ value: bindable(() => ({
3596
+ defaultValue: prop("defaultValue"),
3597
+ value: prop("value"),
3598
+ onChange(value) {
3599
+ var _a;
3600
+ (_a = prop("onValueChange")) == null ? void 0 : _a({ value });
3601
+ }
3602
+ })),
3603
+ focusedValue: bindable(() => ({
3604
+ defaultValue: prop("value") || prop("defaultValue"),
3605
+ sync: true,
3606
+ onChange(value) {
3607
+ var _a;
3608
+ (_a = prop("onFocusChange")) == null ? void 0 : _a({ focusedValue: value });
3609
+ }
3610
+ })),
3611
+ ssr: bindable(() => ({ defaultValue: true })),
3612
+ indicatorTransition: bindable(() => ({ defaultValue: false })),
3613
+ indicatorRect: bindable(() => ({
3614
+ defaultValue: { left: "0px", top: "0px", width: "0px", height: "0px" }
3615
+ }))
3616
+ };
3617
+ },
3618
+ watch({ context: context2, prop, track, action }) {
3619
+ track([() => context2.get("value")], () => {
3620
+ action(["allowIndicatorTransition", "syncIndicatorRect", "syncTabIndex", "navigateIfNeeded"]);
3621
+ });
3622
+ track([() => prop("dir"), () => prop("orientation")], () => {
3623
+ action(["syncIndicatorRect"]);
3624
+ });
3625
+ },
3626
+ on: {
3627
+ SET_VALUE: {
3628
+ actions: ["setValue"]
3629
+ },
3630
+ CLEAR_VALUE: {
3631
+ actions: ["clearValue"]
3632
+ },
3633
+ SET_INDICATOR_RECT: {
3634
+ actions: ["setIndicatorRect"]
3635
+ },
3636
+ SYNC_TAB_INDEX: {
3637
+ actions: ["syncTabIndex"]
3638
+ }
3639
+ },
3640
+ entry: ["syncIndicatorRect", "syncTabIndex", "syncSsr"],
3641
+ exit: ["cleanupObserver"],
3642
+ states: {
3643
+ idle: {
3644
+ on: {
3645
+ TAB_FOCUS: {
3646
+ target: "focused",
3647
+ actions: ["setFocusedValue"]
3648
+ },
3649
+ TAB_CLICK: {
3650
+ target: "focused",
3651
+ actions: ["setFocusedValue", "setValue"]
3652
+ }
3653
+ }
3654
+ },
3655
+ focused: {
3656
+ on: {
3657
+ TAB_CLICK: {
3658
+ target: "focused",
3659
+ actions: ["setFocusedValue", "setValue"]
3660
+ },
3661
+ ARROW_PREV: [
3662
+ {
3663
+ guard: "selectOnFocus",
3664
+ actions: ["focusPrevTab", "selectFocusedTab"]
3665
+ },
3666
+ {
3667
+ actions: ["focusPrevTab"]
3668
+ }
3669
+ ],
3670
+ ARROW_NEXT: [
3671
+ {
3672
+ guard: "selectOnFocus",
3673
+ actions: ["focusNextTab", "selectFocusedTab"]
3674
+ },
3675
+ {
3676
+ actions: ["focusNextTab"]
3677
+ }
3678
+ ],
3679
+ HOME: [
3680
+ {
3681
+ guard: "selectOnFocus",
3682
+ actions: ["focusFirstTab", "selectFocusedTab"]
3683
+ },
3684
+ {
3685
+ actions: ["focusFirstTab"]
3686
+ }
3687
+ ],
3688
+ END: [
3689
+ {
3690
+ guard: "selectOnFocus",
3691
+ actions: ["focusLastTab", "selectFocusedTab"]
3692
+ },
3693
+ {
3694
+ actions: ["focusLastTab"]
3695
+ }
3696
+ ],
3697
+ ENTER: {
3698
+ guard: not("selectOnFocus"),
3699
+ actions: ["selectFocusedTab"]
3700
+ },
3701
+ TAB_FOCUS: {
3702
+ actions: ["setFocusedValue"]
3703
+ },
3704
+ TAB_BLUR: {
3705
+ target: "idle",
3706
+ actions: ["clearFocusedValue"]
3707
+ }
3708
+ }
3709
+ }
3710
+ },
3711
+ implementations: {
3712
+ guards: {
3713
+ selectOnFocus: ({ prop }) => prop("activationMode") === "automatic"
3714
+ },
3715
+ actions: {
3716
+ selectFocusedTab({ context: context2, prop }) {
3717
+ raf$2(() => {
3718
+ const focusedValue = context2.get("focusedValue");
3719
+ if (!focusedValue) return;
3720
+ const nullable = prop("deselectable") && context2.get("value") === focusedValue;
3721
+ const value = nullable ? null : focusedValue;
3722
+ context2.set("value", value);
3723
+ });
3724
+ },
3725
+ setFocusedValue({ context: context2, event, flush: flush2 }) {
3726
+ if (event.value == null) return;
3727
+ flush2(() => {
3728
+ context2.set("focusedValue", event.value);
3729
+ });
3730
+ },
3731
+ clearFocusedValue({ context: context2 }) {
3732
+ context2.set("focusedValue", null);
3733
+ },
3734
+ setValue({ context: context2, event, prop }) {
3735
+ const nullable = prop("deselectable") && context2.get("value") === context2.get("focusedValue");
3736
+ context2.set("value", nullable ? null : event.value);
3737
+ },
3738
+ clearValue({ context: context2 }) {
3739
+ context2.set("value", null);
3740
+ },
3741
+ focusFirstTab({ scope }) {
3742
+ raf$2(() => {
3743
+ var _a;
3744
+ (_a = getFirstTriggerEl(scope)) == null ? void 0 : _a.focus();
3745
+ });
3746
+ },
3747
+ focusLastTab({ scope }) {
3748
+ raf$2(() => {
3749
+ var _a;
3750
+ (_a = getLastTriggerEl(scope)) == null ? void 0 : _a.focus();
3751
+ });
3752
+ },
3753
+ focusNextTab({ context: context2, prop, scope, event }) {
3754
+ const focusedValue = event.value ?? context2.get("focusedValue");
3755
+ if (!focusedValue) return;
3756
+ const triggerEl = getNextTriggerEl(scope, {
3757
+ value: focusedValue,
3758
+ loopFocus: prop("loopFocus")
3759
+ });
3760
+ raf$2(() => {
3761
+ if (prop("composite")) {
3762
+ triggerEl == null ? void 0 : triggerEl.focus();
3763
+ } else if ((triggerEl == null ? void 0 : triggerEl.dataset.value) != null) {
3764
+ context2.set("focusedValue", triggerEl.dataset.value);
3765
+ }
3766
+ });
3767
+ },
3768
+ focusPrevTab({ context: context2, prop, scope, event }) {
3769
+ const focusedValue = event.value ?? context2.get("focusedValue");
3770
+ if (!focusedValue) return;
3771
+ const triggerEl = getPrevTriggerEl(scope, {
3772
+ value: focusedValue,
3773
+ loopFocus: prop("loopFocus")
3774
+ });
3775
+ raf$2(() => {
3776
+ if (prop("composite")) {
3777
+ triggerEl == null ? void 0 : triggerEl.focus();
3778
+ } else if ((triggerEl == null ? void 0 : triggerEl.dataset.value) != null) {
3779
+ context2.set("focusedValue", triggerEl.dataset.value);
3780
+ }
3781
+ });
3782
+ },
3783
+ syncTabIndex({ context: context2, scope }) {
3784
+ raf$2(() => {
3785
+ const value = context2.get("value");
3786
+ if (!value) return;
3787
+ const contentEl = getContentEl(scope, value);
3788
+ if (!contentEl) return;
3789
+ const focusables = getFocusables(contentEl);
3790
+ if (focusables.length > 0) {
3791
+ contentEl.removeAttribute("tabindex");
3792
+ } else {
3793
+ contentEl.setAttribute("tabindex", "0");
3794
+ }
3795
+ });
3796
+ },
3797
+ cleanupObserver({ refs }) {
3798
+ const cleanup = refs.get("indicatorCleanup");
3799
+ if (cleanup) cleanup();
3800
+ },
3801
+ allowIndicatorTransition({ context: context2 }) {
3802
+ context2.set("indicatorTransition", true);
3803
+ },
3804
+ setIndicatorRect({ context: context2, event, scope }) {
3805
+ const value = event.id ?? context2.get("value");
3806
+ const indicatorEl = getIndicatorEl(scope);
3807
+ if (!indicatorEl || !value) return;
3808
+ const triggerEl = getTriggerEl(scope, value);
3809
+ if (!triggerEl) return;
3810
+ context2.set("indicatorRect", getRectById(scope, value));
3811
+ nextTick(() => {
3812
+ context2.set("indicatorTransition", false);
3813
+ });
3814
+ },
3815
+ syncSsr({ context: context2 }) {
3816
+ context2.set("ssr", false);
3817
+ },
3818
+ syncIndicatorRect({ context: context2, refs, scope }) {
3819
+ const cleanup = refs.get("indicatorCleanup");
3820
+ if (cleanup) cleanup();
3821
+ const value = context2.get("value");
3822
+ if (!value) return;
3823
+ const triggerEl = getTriggerEl(scope, value);
3824
+ const indicatorEl = getIndicatorEl(scope);
3825
+ if (!triggerEl || !indicatorEl) return;
3826
+ const exec = () => {
3827
+ const rect = getOffsetRect(triggerEl);
3828
+ context2.set("indicatorRect", resolveRect(rect));
3829
+ nextTick(() => {
3830
+ context2.set("indicatorTransition", false);
3831
+ });
3832
+ };
3833
+ exec();
3834
+ const win = scope.getWin();
3835
+ const obs = new win.ResizeObserver(exec);
3836
+ obs.observe(triggerEl);
3837
+ refs.set("indicatorCleanup", () => obs.disconnect());
3838
+ },
3839
+ navigateIfNeeded({ context: context2, prop, scope }) {
3840
+ var _a;
3841
+ const value = context2.get("value");
3842
+ if (!value) return;
3843
+ const triggerEl = getTriggerEl(scope, value);
3844
+ if (!isAnchorElement(triggerEl)) return;
3845
+ (_a = prop("navigate")) == null ? void 0 : _a({ value, node: triggerEl });
3846
+ }
3847
+ }
3848
+ }
3849
+ });
3850
+ createProps()([
3851
+ "activationMode",
3852
+ "composite",
3853
+ "deselectable",
3854
+ "dir",
3855
+ "getRootNode",
3856
+ "id",
3857
+ "ids",
3858
+ "loopFocus",
3859
+ "navigate",
3860
+ "onFocusChange",
3861
+ "onValueChange",
3862
+ "orientation",
3863
+ "translations",
3864
+ "value",
3865
+ "defaultValue"
3866
+ ]);
3867
+ createProps()(["disabled", "value"]);
3868
+ createProps()(["value"]);
3869
+ const useTabs = (props) => {
3870
+ const id = React.useId();
3871
+ const { getRootNode } = useEnvironmentContext();
3872
+ const { dir } = useLocaleContext();
3873
+ const machineProps = {
3874
+ id,
3875
+ dir,
3876
+ getRootNode,
3877
+ ...props
3878
+ };
3879
+ const service = useMachine(machine, machineProps);
3880
+ return connect(service, normalizeProps);
3881
+ };
3882
+ const TabsRoot = React.forwardRef((props, ref) => {
3883
+ const [renderStrategyProps, tabsProps] = splitRenderStrategyProps(props);
3884
+ const [useTabsProps, localprops] = createSplitProps()(tabsProps, [
3885
+ "activationMode",
3886
+ "composite",
3887
+ "defaultValue",
3888
+ "deselectable",
3889
+ "id",
3890
+ "ids",
3891
+ "loopFocus",
3892
+ "navigate",
3893
+ "onFocusChange",
3894
+ "onValueChange",
3895
+ "orientation",
3896
+ "translations",
3897
+ "value"
3898
+ ]);
3899
+ const tabs = useTabs(useTabsProps);
3900
+ const mergedProps = mergeProps(tabs.getRootProps(), localprops);
3901
+ return /* @__PURE__ */ jsxRuntime.jsx(TabsProvider, { value: tabs, children: /* @__PURE__ */ jsxRuntime.jsx(RenderStrategyPropsProvider, { value: renderStrategyProps, children: /* @__PURE__ */ jsxRuntime.jsx(ark.div, { ...mergedProps, ref }) }) });
3902
+ });
3903
+ TabsRoot.displayName = "TabsRoot";
3208
3904
  const spinnerRecipe = cva({
3209
3905
  base: {
3210
3906
  display: "inline-block",
@@ -3832,7 +4528,7 @@ const createStyleContext = (recipe) => {
3832
4528
  };
3833
4529
  const dialogRecipe = sva({
3834
4530
  className: "dialog",
3835
- slots: [...anatomy.keys(), "header", "footer", "body"],
4531
+ slots: [...anatomy$1.keys(), "header", "footer", "body"],
3836
4532
  base: {
3837
4533
  backdrop: {
3838
4534
  backdropFilter: "blur(4px)",
@@ -3917,16 +4613,16 @@ const dialogRecipe = sva({
3917
4613
  }
3918
4614
  }
3919
4615
  });
3920
- const { withRootProvider, withContext } = createStyleContext(dialogRecipe);
3921
- const Root = withRootProvider(DialogRoot);
3922
- const Backdrop$1 = withContext(DialogBackdrop, "backdrop");
3923
- const Trigger = withContext(DialogTrigger, "trigger");
3924
- const Content = withContext(DialogContent, "content");
3925
- const Title = withContext(DialogTitle, "title");
3926
- const Description = withContext(DialogDescription, "description");
3927
- const Positioner = withContext(DialogPositioner, "positioner");
3928
- const Header = withContext(ark.header, "header");
3929
- const Footer = withContext(
4616
+ const { withRootProvider: withRootProvider$1, withContext: withContext$1 } = createStyleContext(dialogRecipe);
4617
+ const Root$1 = withRootProvider$1(DialogRoot);
4618
+ const Backdrop$1 = withContext$1(DialogBackdrop, "backdrop");
4619
+ const Trigger$1 = withContext$1(DialogTrigger, "trigger");
4620
+ const Content = withContext$1(DialogContent, "content");
4621
+ const Title = withContext$1(DialogTitle, "title");
4622
+ const Description = withContext$1(DialogDescription, "description");
4623
+ const Positioner = withContext$1(DialogPositioner, "positioner");
4624
+ const Header = withContext$1(ark.header, "header");
4625
+ const Footer = withContext$1(
3930
4626
  ({ orientation = "horizontal", className, ...props }) => {
3931
4627
  return /* @__PURE__ */ jsxRuntime.jsx(
3932
4628
  ark.footer,
@@ -3944,12 +4640,12 @@ const Footer = withContext(
3944
4640
  },
3945
4641
  "footer"
3946
4642
  );
3947
- const Body = withContext(ark.main, "body");
3948
- const CloseTrigger = withContext(DialogCloseTrigger, "closeTrigger");
4643
+ const Body = withContext$1(ark.main, "body");
4644
+ const CloseTrigger = withContext$1(DialogCloseTrigger, "closeTrigger");
3949
4645
  const Dialog = {
3950
- Root,
4646
+ Root: Root$1,
3951
4647
  Backdrop: Backdrop$1,
3952
- Trigger,
4648
+ Trigger: Trigger$1,
3953
4649
  Content,
3954
4650
  Title,
3955
4651
  Description,
@@ -7750,6 +8446,220 @@ const BottomSheet = (props) => {
7750
8446
  };
7751
8447
  BottomSheetFrame.displayName = "BottomSheetFrame";
7752
8448
  Backdrop.displayName = "Backdrop";
8449
+ const navigationRecipe = sva({
8450
+ className: "navigation",
8451
+ slots: anatomy.keys(),
8452
+ base: {
8453
+ root: {
8454
+ bg: "surface.layer_1",
8455
+ zIndex: 10
8456
+ },
8457
+ list: {
8458
+ width: "100%",
8459
+ display: "flex",
8460
+ flexDirection: "row",
8461
+ justifyContent: "space-around",
8462
+ bg: "surface.layer_1",
8463
+ pt: 2,
8464
+ pb: 8
8465
+ },
8466
+ trigger: {
8467
+ display: "flex",
8468
+ flexDirection: "column",
8469
+ alignItems: "center",
8470
+ justifyContent: "center",
8471
+ h: "48px",
8472
+ w: "64px",
8473
+ px: 2,
8474
+ textStyle: "label.sm",
8475
+ color: "content.neutral.subtlest",
8476
+ transitionDuration: "normal",
8477
+ transitionProperty: "background, border-color, color, box-shadow",
8478
+ transitionTimingFunction: "default",
8479
+ userSelect: "none",
8480
+ rounded: "lg",
8481
+ cursor: "pointer",
8482
+ _hover: {
8483
+ bg: "background.neutral.selected"
8484
+ },
8485
+ _selected: {
8486
+ color: "content.neutral.default",
8487
+ bg: "background.neutral.default"
8488
+ }
8489
+ }
8490
+ }
8491
+ });
8492
+ const { withRootProvider, withContext } = createStyleContext(navigationRecipe);
8493
+ const Root = withRootProvider(TabsRoot);
8494
+ const Trigger = withContext(
8495
+ ({ icon, label, ...props }) => /* @__PURE__ */ jsxRuntime.jsxs(TabTrigger, { ...props, children: [
8496
+ icon,
8497
+ label
8498
+ ] }),
8499
+ "trigger"
8500
+ );
8501
+ const List = withContext(TabList, "list");
8502
+ const Navigation = {
8503
+ Root,
8504
+ Item: Trigger,
8505
+ List
8506
+ };
8507
+ const tagRecipe = cva({
8508
+ base: {
8509
+ display: "inline-flex",
8510
+ alignItems: "center",
8511
+ justifyContent: "center",
8512
+ gap: 1,
8513
+ px: 2,
8514
+ py: 1,
8515
+ textStyle: "label.md",
8516
+ height: "fit-content",
8517
+ width: "fit-content",
8518
+ cursor: "default"
8519
+ },
8520
+ variants: {
8521
+ color: {
8522
+ neutral: {},
8523
+ black: {},
8524
+ white: {}
8525
+ },
8526
+ background: {
8527
+ on: {},
8528
+ off: {}
8529
+ },
8530
+ radius: {
8531
+ sm: { borderRadius: "sm" },
8532
+ full: { borderRadius: "full" }
8533
+ },
8534
+ avatar: {
8535
+ true: {
8536
+ borderRadius: "full",
8537
+ pl: 1
8538
+ },
8539
+ false: {}
8540
+ }
8541
+ },
8542
+ compoundVariants: [
8543
+ {
8544
+ avatar: true,
8545
+ color: "white",
8546
+ css: {
8547
+ background: "background.static.whiteAlpha.bold",
8548
+ color: "content.static.black.default"
8549
+ }
8550
+ },
8551
+ {
8552
+ avatar: true,
8553
+ color: "neutral",
8554
+ css: {
8555
+ background: "background.neutral.selected",
8556
+ color: "content.neutral.default"
8557
+ }
8558
+ },
8559
+ {
8560
+ avatar: true,
8561
+ color: "black",
8562
+ css: {
8563
+ background: "background.static.blackAlpha.default",
8564
+ color: "content.static.white.default"
8565
+ }
8566
+ },
8567
+ {
8568
+ avatar: false,
8569
+ background: "on",
8570
+ color: "neutral",
8571
+ css: {
8572
+ background: "background.neutral.selected",
8573
+ color: "content.neutral.default"
8574
+ }
8575
+ },
8576
+ {
8577
+ avatar: false,
8578
+ background: "on",
8579
+ color: "black",
8580
+ css: {
8581
+ background: "background.static.blackAlpha.default",
8582
+ color: "content.static.white.default"
8583
+ }
8584
+ },
8585
+ {
8586
+ avatar: false,
8587
+ background: "on",
8588
+ color: "white",
8589
+ css: {
8590
+ background: "background.static.whiteAlpha.selected",
8591
+ color: "content.static.black.default"
8592
+ }
8593
+ },
8594
+ {
8595
+ avatar: false,
8596
+ background: "off",
8597
+ color: "neutral",
8598
+ css: {
8599
+ background: "transparent",
8600
+ color: "content.neutral.default"
8601
+ }
8602
+ },
8603
+ {
8604
+ avatar: false,
8605
+ background: "off",
8606
+ color: "black",
8607
+ css: {
8608
+ background: "transparent",
8609
+ color: "content.static.black.default"
8610
+ }
8611
+ },
8612
+ {
8613
+ avatar: false,
8614
+ background: "off",
8615
+ color: "white",
8616
+ css: {
8617
+ background: "transparent",
8618
+ color: "content.static.white.default"
8619
+ }
8620
+ }
8621
+ ],
8622
+ defaultVariants: {
8623
+ background: "on",
8624
+ radius: "sm",
8625
+ color: "neutral",
8626
+ avatar: false
8627
+ }
8628
+ });
8629
+ function CloseOutlineIcon({ size = 24, color = "currentColor", ...props }) {
8630
+ return /* @__PURE__ */ jsxRuntime.jsx(
8631
+ "svg",
8632
+ {
8633
+ width: size,
8634
+ height: size,
8635
+ viewBox: "0 0 24 24",
8636
+ fill: "none",
8637
+ xmlns: "http://www.w3.org/2000/svg",
8638
+ strokeWidth: "0",
8639
+ color,
8640
+ ...props,
8641
+ children: /* @__PURE__ */ jsxRuntime.jsx(
8642
+ "path",
8643
+ {
8644
+ id: "Union",
8645
+ fillRule: "evenodd",
8646
+ clipRule: "evenodd",
8647
+ d: "M18.7071 6.70711C19.0976 6.31658 19.0976 5.68342 18.7071 5.29289C18.3166 4.90237 17.6834 4.90237 17.2929 5.29289L12 10.5858L6.70711 5.29289C6.31658 4.90237 5.68342 4.90237 5.29289 5.29289C4.90237 5.68342 4.90237 6.31658 5.29289 6.70711L10.5858 12L5.29289 17.2929C4.90237 17.6834 4.90237 18.3166 5.29289 18.7071C5.68342 19.0976 6.31658 19.0976 6.70711 18.7071L12 13.4142L17.2929 18.7071C17.6834 19.0976 18.3166 19.0976 18.7071 18.7071C19.0976 18.3166 19.0976 17.6834 18.7071 17.2929L13.4142 12L18.7071 6.70711Z",
8648
+ fill: "currentColor"
8649
+ }
8650
+ )
8651
+ }
8652
+ );
8653
+ }
8654
+ const Tag = React.forwardRef(({ color, background, radius, imageSrc, text, onDeleteClick, ...rest }, ref) => {
8655
+ const StyledTag = styled(ark.div, tagRecipe);
8656
+ return /* @__PURE__ */ jsxRuntime.jsxs(StyledTag, { color, background, radius, avatar: !!imageSrc, ref, ...rest, children: [
8657
+ imageSrc ? /* @__PURE__ */ jsxRuntime.jsx(styled.img, { src: imageSrc, width: 8, height: 8, borderRadius: "full", overflow: "hidden", alt: "avatar thumbnail" }) : null,
8658
+ text,
8659
+ onDeleteClick ? /* @__PURE__ */ jsxRuntime.jsx(CloseOutlineIcon, { size: 12, onClick: onDeleteClick, cursor: "pointer" }) : null
8660
+ ] });
8661
+ });
8662
+ Tag.displayName = "Tag";
7753
8663
  function definePreset(preset2) {
7754
8664
  return preset2;
7755
8665
  }
@@ -8054,8 +8964,10 @@ exports.BottomSheet = BottomSheet;
8054
8964
  exports.Button = Button;
8055
8965
  exports.Dialog = Dialog;
8056
8966
  exports.IconButton = IconButton;
8967
+ exports.Navigation = Navigation;
8057
8968
  exports.Portal = Portal;
8058
8969
  exports.Spinner = Spinner;
8970
+ exports.Tag = Tag;
8059
8971
  exports.Text = Text;
8060
8972
  exports.preset = preset;
8061
8973
  //# sourceMappingURL=index.cjs.map