se-design 1.0.73-dev3 → 1.0.73-dev7

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.
Files changed (45) hide show
  1. package/dist/components/CustomModal/index.d.ts +4 -6
  2. package/dist/components/MenuList/index.d.ts +3 -2
  3. package/dist/components/Popover/index.d.ts +2 -2
  4. package/dist/index12.js +30 -18
  5. package/dist/index12.js.map +1 -1
  6. package/dist/index15.js +1 -1
  7. package/dist/index17.js +36 -33
  8. package/dist/index17.js.map +1 -1
  9. package/dist/index18.js +129 -124
  10. package/dist/index18.js.map +1 -1
  11. package/dist/index192.js +2 -2
  12. package/dist/{index229.js → index193.js} +1 -1
  13. package/dist/{index229.js.map → index193.js.map} +1 -1
  14. package/dist/index194.js +26 -0
  15. package/dist/index194.js.map +1 -0
  16. package/dist/index197.js +20 -80
  17. package/dist/index197.js.map +1 -1
  18. package/dist/index199.js +82 -21
  19. package/dist/index199.js.map +1 -1
  20. package/dist/{index207.js → index208.js} +1 -1
  21. package/dist/{index207.js.map → index208.js.map} +1 -1
  22. package/dist/{index215.js → index216.js} +1 -1
  23. package/dist/{index215.js.map → index216.js.map} +1 -1
  24. package/dist/{index218.js → index219.js} +1 -1
  25. package/dist/{index218.js.map → index219.js.map} +1 -1
  26. package/dist/{index227.js → index228.js} +1 -1
  27. package/dist/{index227.js.map → index228.js.map} +1 -1
  28. package/dist/index24.js +1 -1
  29. package/dist/index27.js +1 -1
  30. package/dist/index28.js +94 -90
  31. package/dist/index28.js.map +1 -1
  32. package/dist/index32.js +42 -44
  33. package/dist/index32.js.map +1 -1
  34. package/dist/index37.js +1 -1
  35. package/dist/index39.js +1 -1
  36. package/dist/index44.js +1 -1
  37. package/dist/index45.js +2 -2
  38. package/dist/index48.js +1 -1
  39. package/dist/index52.js +1 -1
  40. package/dist/index62.js +1 -1
  41. package/dist/index64.js +52 -60
  42. package/dist/index64.js.map +1 -1
  43. package/package.json +1 -1
  44. package/dist/index195.js +0 -27
  45. package/dist/index195.js.map +0 -1
package/dist/index28.js CHANGED
@@ -1,143 +1,147 @@
1
- import o, { useState as F, useMemo as R, useRef as S, useEffect as _ } from "react";
2
- import { Icon as $ } from "./index5.js";
3
- import { Popover as j } from "./index18.js";
4
- import { MenuList as B } from "./index17.js";
5
- import { useStableId as z } from "./index190.js";
6
- import { getA11yNameAttributes as H } from "./index71.js";
1
+ import r, { useState as A, useMemo as _, useRef as F, useEffect as j } from "react";
2
+ import { Icon as O } from "./index5.js";
3
+ import { Popover as B } from "./index18.js";
4
+ import { MenuList as z } from "./index17.js";
5
+ import { useStableId as H } from "./index190.js";
6
+ import { getA11yNameAttributes as U } from "./index71.js";
7
7
  import { useTabsA11y as V, getPanelId as q } from "./index69.js";
8
8
  /* empty css */
9
- function s() {
10
- return s = Object.assign ? Object.assign.bind() : function(l) {
11
- for (var t = 1; t < arguments.length; t++) {
12
- var i = arguments[t];
13
- for (var c in i) ({}).hasOwnProperty.call(i, c) && (l[c] = i[c]);
9
+ function i() {
10
+ return i = Object.assign ? Object.assign.bind() : function(s) {
11
+ for (var o = 1; o < arguments.length; o++) {
12
+ var c = arguments[o];
13
+ for (var d in c) ({}).hasOwnProperty.call(c, d) && (s[d] = c[d]);
14
14
  }
15
- return l;
16
- }, s.apply(null, arguments);
15
+ return s;
16
+ }, i.apply(null, arguments);
17
17
  }
18
- const ee = ({
19
- defaultActiveTab: l,
20
- tabs: t,
21
- onTabChange: i,
22
- primaryTabCount: c,
23
- headingLevel: v,
24
- id: A,
25
- ariaLabel: D = "Tabs",
26
- ariaLabelledBy: L,
27
- panelId: f
18
+ const re = ({
19
+ defaultActiveTab: s,
20
+ tabs: o,
21
+ onTabChange: c,
22
+ primaryTabCount: d,
23
+ headingLevel: g,
24
+ id: $,
25
+ ariaLabel: L = "Tabs",
26
+ ariaLabelledBy: K,
27
+ panelId: p
28
28
  }) => {
29
- const O = l || (t[0] ? t[0].id : ""), [d, g] = F(O), [p, h] = F(!1), T = c ?? t?.length, b = t.slice(0, T), m = t.slice(T), u = m.find((e) => e.id === d), w = t.some((e) => e.renderTabContent), y = z(A, "tabs"), M = R(() => {
30
- const e = b.filter((a) => !a.disabled), r = m.filter((a) => !a.disabled), n = e.map((a) => a.id);
31
- return r.length > 0 ? [...n, "overflow"] : n;
32
- }, [b, m]), {
33
- getTabProps: E,
34
- getPanelProps: K,
35
- handleKeyDown: I,
36
- setFocusedTabId: x
29
+ const M = s || (o[0] ? o[0].id : ""), [m, w] = A(M), [y, h] = A(!1), T = d ?? o?.length, f = o.slice(0, T), u = o.slice(T), b = u.find((e) => e.id === m), E = o.some((e) => e.renderTabContent), k = H($, "tabs"), R = _(() => {
30
+ const e = f.filter((l) => !l.disabled), t = u.filter((l) => !l.disabled), n = e.map((l) => l.id);
31
+ return t.length > 0 ? [...n, "overflow"] : n;
32
+ }, [f, u]), {
33
+ getTabProps: I,
34
+ getPanelProps: S,
35
+ handleKeyDown: x,
36
+ setFocusedTabId: C
37
37
  } = V({
38
- itemIds: M,
39
- activeItem: d,
38
+ itemIds: R,
39
+ activeItem: m,
40
40
  orientation: "horizontal",
41
- idBase: y,
42
- includePanelLinks: w || !!f,
43
- externalPanelId: f
44
- }), k = S(null);
45
- _(() => {
46
- g(l || "");
47
- }, [l]);
48
- const C = (e) => {
49
- g(e?.id), i?.(e?.id);
50
- }, P = (e, r) => e.id === r;
51
- if (v && t.length === 1) {
52
- const e = t[0];
53
- return /* @__PURE__ */ o.createElement(o.Fragment, null, /* @__PURE__ */ o.createElement(v, {
41
+ idBase: k,
42
+ includePanelLinks: E || !!p,
43
+ externalPanelId: p
44
+ }), N = F(null), v = F(!1);
45
+ j(() => {
46
+ w(s || "");
47
+ }, [s]);
48
+ const P = (e) => {
49
+ w(e?.id), c?.(e?.id);
50
+ }, D = (e, t) => e.id === t;
51
+ if (g && o.length === 1) {
52
+ const e = o[0];
53
+ return /* @__PURE__ */ r.createElement(r.Fragment, null, /* @__PURE__ */ r.createElement(g, {
54
54
  className: "se-design-tabs se-design-tabs-heading"
55
- }, e.label), /* @__PURE__ */ o.createElement("div", {
55
+ }, e.label), /* @__PURE__ */ r.createElement("div", {
56
56
  className: "se-design-tabs-content"
57
- }, /* @__PURE__ */ o.createElement("div", {
57
+ }, /* @__PURE__ */ r.createElement("div", {
58
58
  className: "tab-content block"
59
59
  }, e?.renderTabContent && e?.renderTabContent(e))));
60
60
  }
61
- return /* @__PURE__ */ o.createElement(o.Fragment, null, /* @__PURE__ */ o.createElement("div", s({
61
+ return /* @__PURE__ */ r.createElement(r.Fragment, null, /* @__PURE__ */ r.createElement("div", i({
62
62
  className: "se-design-tabs flex items-stretch relative border rounded-md border-[var(--color-gray-400)] w-fit",
63
63
  role: "tablist",
64
64
  "data-automation-id": "tabs-container"
65
- }, H({
66
- ariaLabel: D,
67
- ariaLabelledBy: L
68
- })), b.map((e) => {
69
- const r = d === e.id, n = !!e.disabled, a = E(e.id);
70
- return /* @__PURE__ */ o.createElement("button", s({
65
+ }, U({
66
+ ariaLabel: L,
67
+ ariaLabelledBy: K
68
+ })), f.map((e) => {
69
+ const t = m === e.id, n = !!e.disabled, l = I(e.id);
70
+ return /* @__PURE__ */ r.createElement("button", i({
71
71
  type: "button",
72
72
  key: e.id
73
- }, a, {
73
+ }, l, {
74
74
  disabled: n,
75
75
  "aria-label": e.ariaLabel,
76
- onFocus: () => !n && x(e.id),
77
- onKeyDown: I,
78
- onClick: () => C(e),
79
- className: `se-design-tab-item flex items-center text-base px-3 py-0.5 min-w-0 border-l first:border-l-0 first:rounded-l-[0.3rem] last:rounded-r-[0.3rem] border-[var(--color-gray-400)] ${n ? "" : "focus-outline"} ${n ? "text-[var(--color-gray-400)] cursor-not-allowed" : r ? "se-design-tab-item-active text-[var(--color-white)] bg-[var(--color-blue-500)] font-medium hover:cursor-pointer" : "text-[var(--color-gray-700)] font-normal hover:bg-[var(--color-gray-50)] hover:text-[var(--color-gray-900)] cursor-pointer transition-all duration-200 ease-in-out"}`,
76
+ onFocus: () => !n && C(e.id),
77
+ onKeyDown: x,
78
+ onClick: () => P(e),
79
+ className: `se-design-tab-item flex items-center text-base px-3 py-0.5 min-w-0 border-l first:border-l-0 first:rounded-l-[0.3rem] last:rounded-r-[0.3rem] border-[var(--color-gray-400)] ${n ? "" : "focus-outline"} ${n ? "text-[var(--color-gray-400)] cursor-not-allowed" : t ? "se-design-tab-item-active text-[var(--color-white)] bg-[var(--color-blue-500)] font-medium hover:cursor-pointer" : "text-[var(--color-gray-700)] font-normal hover:bg-[var(--color-gray-50)] hover:text-[var(--color-gray-900)] cursor-pointer transition-all duration-200 ease-in-out"}`,
80
80
  "data-automation-id": `tab-item-${e.automationId || e.id || ""}`
81
81
  }), e.label);
82
- }), m.length > 0 && /* @__PURE__ */ o.createElement(j, {
82
+ }), u.length > 0 && /* @__PURE__ */ r.createElement(B, {
83
83
  className: "se-design-overflow-tabs",
84
84
  position: "bottom-left",
85
- automationId: "tabs-kebab-menu",
86
85
  noBorder: !0,
87
86
  disableClickToggle: !0,
88
87
  onPopoverToggle: (e) => {
89
- e || k.current?.focus();
88
+ e || (v.current && N.current?.focus(), v.current = !1);
90
89
  },
91
90
  renderPopoverSrcElement: ({
92
91
  displayPopover: e,
93
- togglePopover: r
92
+ togglePopover: t
94
93
  }) => {
95
- const n = E("overflow"), a = u ? q(u.id, y) : void 0;
96
- return /* @__PURE__ */ o.createElement("div", s({}, n, {
97
- ref: (N) => {
98
- k.current = N, n.ref(N);
94
+ const n = I("overflow"), l = b ? q(b.id, k) : void 0;
95
+ return /* @__PURE__ */ r.createElement("div", i({}, n, {
96
+ ref: (a) => {
97
+ N.current = a, n.ref(a);
99
98
  },
100
- "aria-controls": a,
99
+ "aria-controls": l,
101
100
  "aria-haspopup": "true",
102
101
  "aria-expanded": e,
103
- onClick: () => r(),
104
- onFocus: () => x("overflow"),
105
- onKeyDown: I,
106
- className: `overflow-tabs-src-element focus-outline border-l px-3 py-0.5 rounded-r-md font-medium hover:cursor-pointer transition-all duration-200 ease-in-out ${e ? "bg-[var(--color-blue-100)]" : ""} ${u?.label ? "bg-[var(--color-blue-500)]" : "hover:bg-[var(--color-gray-50)]"}`,
102
+ onClick: () => {
103
+ v.current = !1, t(!0);
104
+ },
105
+ onFocus: () => C("overflow"),
106
+ "data-automation-id": "tabs-kebab-menu",
107
+ onKeyDown: (a) => {
108
+ a.key === "Enter" || a.key === " " || a.key === "ArrowDown" ? (a.preventDefault(), v.current = !0, t(!0)) : a.key === "ArrowUp" ? (a.preventDefault(), v.current = !0, t("last")) : x(a);
109
+ },
110
+ className: `overflow-tabs-src-element focus-outline border-l px-3 py-0.5 rounded-r-md font-medium hover:cursor-pointer transition-all duration-200 ease-in-out ${e ? "bg-[var(--color-blue-100)]" : ""} ${b?.label ? "bg-[var(--color-blue-500)]" : "hover:bg-[var(--color-gray-50)]"}`,
107
111
  onMouseEnter: () => h(!0),
108
112
  onMouseLeave: () => h(!1)
109
- }), u?.label ? /* @__PURE__ */ o.createElement(o.Fragment, null, /* @__PURE__ */ o.createElement("span", {
113
+ }), b?.label ? /* @__PURE__ */ r.createElement(r.Fragment, null, /* @__PURE__ */ r.createElement("span", {
110
114
  className: "text-[var(--color-white)]"
111
- }, u?.label), /* @__PURE__ */ o.createElement($, {
115
+ }, b?.label), /* @__PURE__ */ r.createElement(O, {
112
116
  name: "chevron",
113
117
  rotation: e ? "180" : "0",
114
- stroke: p ? "var(--color-gray-100)" : "var(--color-white)"
115
- })) : /* @__PURE__ */ o.createElement($, {
118
+ stroke: y ? "var(--color-gray-100)" : "var(--color-white)"
119
+ })) : /* @__PURE__ */ r.createElement(O, {
116
120
  name: "kebab-menu",
117
- fill: p ? "var(--color-gray-900)" : "var(--color-gray-700)"
121
+ fill: y ? "var(--color-gray-900)" : "var(--color-gray-700)"
118
122
  }));
119
123
  },
120
124
  renderPopoverContents: ({
121
125
  closePopoverCb: e
122
- }) => /* @__PURE__ */ o.createElement(B, {
123
- items: m.map((r) => ({
124
- id: r?.id,
125
- label: r?.label,
126
- automationId: r?.automationId || r?.id,
126
+ }) => /* @__PURE__ */ r.createElement(z, {
127
+ items: u.map((t) => ({
128
+ id: t?.id,
129
+ label: t?.label,
130
+ automationId: t?.automationId || t?.id,
127
131
  onClick: () => {
128
- C(r), e();
132
+ P(t), e();
129
133
  }
130
134
  }))
131
135
  })
132
- })), w && /* @__PURE__ */ o.createElement("div", {
136
+ })), E && /* @__PURE__ */ r.createElement("div", {
133
137
  className: "se-design-tabs-content"
134
- }, t.map((e) => /* @__PURE__ */ o.createElement("div", s({
138
+ }, o.map((e) => /* @__PURE__ */ r.createElement("div", i({
135
139
  key: e.id
136
- }, K(e.id), {
137
- className: `tab-content ${P(e, d) ? "block" : "hidden"}`
138
- }), P(e, d) && e.renderTabContent?.(e)))));
140
+ }, S(e.id), {
141
+ className: `tab-content ${D(e, m) ? "block" : "hidden"}`
142
+ }), D(e, m) && e.renderTabContent?.(e)))));
139
143
  };
140
144
  export {
141
- ee as Tabs
145
+ re as Tabs
142
146
  };
143
147
  //# sourceMappingURL=index28.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index28.js","sources":["../src/components/Tabs/index.tsx"],"sourcesContent":["import React, { FC, ReactNode, useState, useEffect, useMemo, useRef } from 'react';\nimport { Icon } from '../Icon';\nimport { Popover } from '../Popover';\nimport { MenuList } from '../MenuList';\nimport { useStableId } from '../../utils/useStableId';\nimport { useTabsA11y, getPanelId, getA11yNameAttributes } from '../../utils/a11y';\n\nimport './style.scss';\n\ninterface TabProps {\n label: string;\n id: string;\n disabled?: boolean;\n renderTabContent?: (tab: TabProps) => ReactNode;\n automationId?: string;\n ariaLabel?: string;\n}\ninterface TabsProps {\n defaultActiveTab?: string;\n tabs: TabProps[];\n onTabChange?: (tabId: string) => void;\n primaryTabCount?: number; // prop for controlling primary tabs\n headingLevel?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'span'; // heading tag to render single tab as a heading element when only one tab is present\n automationId?: string;\n id?: string; // custom ID for baseId (passed to useStableId)\n ariaLabel?: string; // Accessible name when no visible label exists\n ariaLabelledBy?: string; // ID of element that labels this tablist (preferred over ariaLabel)\n panelId?: string; // When consumer manages a single external panel, pass its id here\n}\n\nexport const Tabs: FC<TabsProps> = ({\n defaultActiveTab,\n tabs,\n onTabChange,\n primaryTabCount,\n headingLevel: HeadingTag,\n id,\n ariaLabel = 'Tabs',\n ariaLabelledBy,\n panelId\n}) => {\n const defaultTabId = defaultActiveTab || (tabs[0] ? tabs[0].id : '');\n const [activeTab, setActiveTab] = useState(defaultTabId);\n const [isIconTabHover, setIsIconTabHover] = useState(false);\n\n const visibleTabCount = primaryTabCount ?? tabs?.length;\n const visibleTabs = tabs.slice(0, visibleTabCount);\n const overflowTabs = tabs.slice(visibleTabCount);\n const activeOverflowTab = overflowTabs.find((tab) => tab.id === activeTab);\n\n // Only render internal panels if at least one tab provides content via renderTabContent\n const hasPanelContent = tabs.some(t => t.renderTabContent);\n\n // A11y setup\n const baseId = useStableId(id, 'tabs');\n const itemIds = useMemo(() => {\n const enabledVisibleTabs = visibleTabs.filter(t => !t.disabled);\n const enabledOverflowTabs = overflowTabs.filter(t => !t.disabled);\n const visibleIds = enabledVisibleTabs.map(t => t.id);\n return enabledOverflowTabs.length > 0 ? [...visibleIds, 'overflow'] : visibleIds;\n }, [visibleTabs, overflowTabs]);\n\n const { getTabProps, getPanelProps, handleKeyDown, setFocusedTabId } = useTabsA11y({\n itemIds,\n activeItem: activeTab,\n orientation: 'horizontal',\n idBase: baseId,\n includePanelLinks: hasPanelContent || !!panelId,\n externalPanelId: panelId\n });\n\n // Ref for the overflow button div — needed to return focus after menu closes\n const overflowDivRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n setActiveTab(defaultActiveTab || '');\n }, [defaultActiveTab]);\n\n const handleTabClick = (tab: TabProps) => {\n setActiveTab(tab?.id);\n onTabChange?.(tab?.id);\n };\n\n const isTabActive = (tab: TabProps, activeTab: string) => {\n return tab.id === activeTab;\n };\n\n if (HeadingTag && tabs.length === 1) {\n const singleTab = tabs[0];\n return (\n <>\n <HeadingTag className=\"se-design-tabs se-design-tabs-heading\">\n {singleTab.label}\n </HeadingTag>\n <div className=\"se-design-tabs-content\">\n <div className=\"tab-content block\">\n {singleTab?.renderTabContent && singleTab?.renderTabContent(singleTab)}\n </div>\n </div>\n </>\n );\n }\n\n return (\n <>\n <div\n className=\"se-design-tabs flex items-stretch relative border rounded-md border-[var(--color-gray-400)] w-fit\"\n role=\"tablist\"\n data-automation-id=\"tabs-container\"\n {...getA11yNameAttributes({\n ariaLabel,\n ariaLabelledBy\n })}\n >\n {visibleTabs.map((tab) => {\n const isActive = activeTab === tab.id;\n const isDisabled = !!tab.disabled;\n const tabProps = getTabProps(tab.id);\n return (\n <button\n type=\"button\"\n key={tab.id}\n {...tabProps}\n disabled={isDisabled}\n aria-label={tab.ariaLabel}\n onFocus={() => !isDisabled && setFocusedTabId(tab.id)}\n onKeyDown={handleKeyDown}\n onClick={() => handleTabClick(tab)}\n className={`se-design-tab-item flex items-center text-base px-3 py-0.5 min-w-0 border-l first:border-l-0 first:rounded-l-[0.3rem] last:rounded-r-[0.3rem] border-[var(--color-gray-400)] ${!isDisabled ? 'focus-outline' : ''} ${\n isDisabled\n ? 'text-[var(--color-gray-400)] cursor-not-allowed'\n : isActive\n ? 'se-design-tab-item-active text-[var(--color-white)] bg-[var(--color-blue-500)] font-medium hover:cursor-pointer'\n : 'text-[var(--color-gray-700)] font-normal hover:bg-[var(--color-gray-50)] hover:text-[var(--color-gray-900)] cursor-pointer transition-all duration-200 ease-in-out'\n }`}\n data-automation-id={`tab-item-${tab.automationId || tab.id || ''}`}\n >\n {tab.label}\n </button>\n );\n })}\n\n {overflowTabs.length > 0 && (\n <Popover\n className=\"se-design-overflow-tabs\"\n position=\"bottom-left\"\n automationId=\"tabs-kebab-menu\"\n noBorder\n disableClickToggle={true}\n onPopoverToggle={(isOpen) => {\n // Return focus to the overflow button when the menu closes (e.g. Escape)\n if (!isOpen) overflowDivRef.current?.focus();\n }}\n renderPopoverSrcElement={({ displayPopover, togglePopover }) => {\n const overflowTabProps = getTabProps('overflow');\n const overflowAriaControls = activeOverflowTab\n ? getPanelId(activeOverflowTab.id, baseId)\n : undefined;\n\n return (\n <div\n {...overflowTabProps}\n ref={(el) => { overflowDivRef.current = el; overflowTabProps.ref(el); }}\n aria-controls={overflowAriaControls}\n aria-haspopup=\"true\"\n aria-expanded={displayPopover}\n onClick={() => togglePopover()}\n onFocus={() => setFocusedTabId('overflow')}\n onKeyDown={handleKeyDown}\n className={`overflow-tabs-src-element focus-outline border-l px-3 py-0.5 rounded-r-md font-medium hover:cursor-pointer transition-all duration-200 ease-in-out ${\n displayPopover ? 'bg-[var(--color-blue-100)]' : ''\n } ${activeOverflowTab?.label ? 'bg-[var(--color-blue-500)]' : 'hover:bg-[var(--color-gray-50)]'}`}\n onMouseEnter={() => setIsIconTabHover(true)}\n onMouseLeave={() => setIsIconTabHover(false)}\n >\n {activeOverflowTab?.label ? (\n <>\n <span className=\"text-[var(--color-white)]\">{activeOverflowTab?.label}</span>\n <Icon\n name=\"chevron\"\n rotation={displayPopover ? '180' : '0'}\n stroke={isIconTabHover ? 'var(--color-gray-100)' : 'var(--color-white)'}\n />\n </>\n ) : (\n <Icon name=\"kebab-menu\" fill={isIconTabHover ? 'var(--color-gray-900)' : 'var(--color-gray-700)'} />\n )}\n </div>\n );\n }}\n renderPopoverContents={({ closePopoverCb }) => (\n <MenuList\n items={overflowTabs.map((tab) => ({\n id: tab?.id,\n label: tab?.label,\n automationId: tab?.automationId || tab?.id,\n onClick: () => {\n handleTabClick(tab);\n closePopoverCb();\n }\n }))}\n />\n )}\n />\n )}\n </div>\n\n {hasPanelContent && (\n <div className=\"se-design-tabs-content\">\n {tabs.map((tab) => (\n <div\n key={tab.id}\n {...getPanelProps(tab.id)}\n className={`tab-content ${isTabActive(tab, activeTab) ? 'block' : 'hidden'}`}\n >\n {isTabActive(tab, activeTab) && tab.renderTabContent?.(tab)}\n </div>\n ))}\n </div>\n )}\n </>\n );\n};\n"],"names":["Tabs","defaultActiveTab","tabs","onTabChange","primaryTabCount","headingLevel","HeadingTag","id","ariaLabel","ariaLabelledBy","panelId","defaultTabId","activeTab","setActiveTab","useState","isIconTabHover","setIsIconTabHover","visibleTabCount","length","visibleTabs","slice","overflowTabs","activeOverflowTab","find","tab","hasPanelContent","some","t","renderTabContent","baseId","useStableId","itemIds","useMemo","enabledVisibleTabs","filter","disabled","enabledOverflowTabs","visibleIds","map","getTabProps","getPanelProps","handleKeyDown","setFocusedTabId","useTabsA11y","activeItem","orientation","idBase","includePanelLinks","externalPanelId","overflowDivRef","useRef","useEffect","handleTabClick","isTabActive","singleTab","createElement","React","Fragment","className","label","_extends","role","getA11yNameAttributes","isActive","isDisabled","tabProps","type","key","onFocus","onKeyDown","onClick","automationId","Popover","position","noBorder","disableClickToggle","onPopoverToggle","isOpen","current","focus","renderPopoverSrcElement","displayPopover","togglePopover","overflowTabProps","overflowAriaControls","getPanelId","undefined","ref","el","onMouseEnter","onMouseLeave","Icon","name","rotation","stroke","fill","renderPopoverContents","closePopoverCb","MenuList","items"],"mappings":"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"}
1
+ {"version":3,"file":"index28.js","sources":["../src/components/Tabs/index.tsx"],"sourcesContent":["import React, { FC, ReactNode, useState, useEffect, useMemo, useRef } from 'react';\nimport { Icon } from '../Icon';\nimport { Popover } from '../Popover';\nimport { MenuList } from '../MenuList';\nimport { useStableId } from '../../utils/useStableId';\nimport { useTabsA11y, getPanelId, getA11yNameAttributes } from '../../utils/a11y';\n\nimport './style.scss';\n\ninterface TabProps {\n label: string;\n id: string;\n disabled?: boolean;\n renderTabContent?: (tab: TabProps) => ReactNode;\n automationId?: string;\n ariaLabel?: string;\n}\ninterface TabsProps {\n defaultActiveTab?: string;\n tabs: TabProps[];\n onTabChange?: (tabId: string) => void;\n primaryTabCount?: number; // prop for controlling primary tabs\n headingLevel?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'span'; // heading tag to render single tab as a heading element when only one tab is present\n automationId?: string;\n id?: string; // custom ID for baseId (passed to useStableId)\n ariaLabel?: string; // Accessible name when no visible label exists\n ariaLabelledBy?: string; // ID of element that labels this tablist (preferred over ariaLabel)\n panelId?: string; // When consumer manages a single external panel, pass its id here\n}\n\nexport const Tabs: FC<TabsProps> = ({\n defaultActiveTab,\n tabs,\n onTabChange,\n primaryTabCount,\n headingLevel: HeadingTag,\n id,\n ariaLabel = 'Tabs',\n ariaLabelledBy,\n panelId\n}) => {\n const defaultTabId = defaultActiveTab || (tabs[0] ? tabs[0].id : '');\n const [activeTab, setActiveTab] = useState(defaultTabId);\n const [isIconTabHover, setIsIconTabHover] = useState(false);\n\n const visibleTabCount = primaryTabCount ?? tabs?.length;\n const visibleTabs = tabs.slice(0, visibleTabCount);\n const overflowTabs = tabs.slice(visibleTabCount);\n const activeOverflowTab = overflowTabs.find((tab) => tab.id === activeTab);\n\n // Only render internal panels if at least one tab provides content via renderTabContent\n const hasPanelContent = tabs.some(t => t.renderTabContent);\n\n // A11y setup\n const baseId = useStableId(id, 'tabs');\n const itemIds = useMemo(() => {\n const enabledVisibleTabs = visibleTabs.filter(t => !t.disabled);\n const enabledOverflowTabs = overflowTabs.filter(t => !t.disabled);\n const visibleIds = enabledVisibleTabs.map(t => t.id);\n return enabledOverflowTabs.length > 0 ? [...visibleIds, 'overflow'] : visibleIds;\n }, [visibleTabs, overflowTabs]);\n\n const { getTabProps, getPanelProps, handleKeyDown, setFocusedTabId } = useTabsA11y({\n itemIds,\n activeItem: activeTab,\n orientation: 'horizontal',\n idBase: baseId,\n includePanelLinks: hasPanelContent || !!panelId,\n externalPanelId: panelId\n });\n\n // Ref for the overflow button div — needed to return focus after menu closes\n const overflowDivRef = useRef<HTMLDivElement>(null);\n // Track whether the overflow popover was opened via keyboard — only return focus\n // programmatically in that case (mouse-opened popovers should not trigger :focus-visible on close)\n const wasKeyboardOpenedRef = useRef(false);\n\n useEffect(() => {\n setActiveTab(defaultActiveTab || '');\n }, [defaultActiveTab]);\n\n const handleTabClick = (tab: TabProps) => {\n setActiveTab(tab?.id);\n onTabChange?.(tab?.id);\n };\n\n const isTabActive = (tab: TabProps, activeTab: string) => {\n return tab.id === activeTab;\n };\n\n if (HeadingTag && tabs.length === 1) {\n const singleTab = tabs[0];\n return (\n <>\n <HeadingTag className=\"se-design-tabs se-design-tabs-heading\">\n {singleTab.label}\n </HeadingTag>\n <div className=\"se-design-tabs-content\">\n <div className=\"tab-content block\">\n {singleTab?.renderTabContent && singleTab?.renderTabContent(singleTab)}\n </div>\n </div>\n </>\n );\n }\n\n return (\n <>\n <div\n className=\"se-design-tabs flex items-stretch relative border rounded-md border-[var(--color-gray-400)] w-fit\"\n role=\"tablist\"\n data-automation-id=\"tabs-container\"\n {...getA11yNameAttributes({\n ariaLabel,\n ariaLabelledBy\n })}\n >\n {visibleTabs.map((tab) => {\n const isActive = activeTab === tab.id;\n const isDisabled = !!tab.disabled;\n const tabProps = getTabProps(tab.id);\n return (\n <button\n type=\"button\"\n key={tab.id}\n {...tabProps}\n disabled={isDisabled}\n aria-label={tab.ariaLabel}\n onFocus={() => !isDisabled && setFocusedTabId(tab.id)}\n onKeyDown={handleKeyDown}\n onClick={() => handleTabClick(tab)}\n className={`se-design-tab-item flex items-center text-base px-3 py-0.5 min-w-0 border-l first:border-l-0 first:rounded-l-[0.3rem] last:rounded-r-[0.3rem] border-[var(--color-gray-400)] ${!isDisabled ? 'focus-outline' : ''} ${\n isDisabled\n ? 'text-[var(--color-gray-400)] cursor-not-allowed'\n : isActive\n ? 'se-design-tab-item-active text-[var(--color-white)] bg-[var(--color-blue-500)] font-medium hover:cursor-pointer'\n : 'text-[var(--color-gray-700)] font-normal hover:bg-[var(--color-gray-50)] hover:text-[var(--color-gray-900)] cursor-pointer transition-all duration-200 ease-in-out'\n }`}\n data-automation-id={`tab-item-${tab.automationId || tab.id || ''}`}\n >\n {tab.label}\n </button>\n );\n })}\n\n {overflowTabs.length > 0 && (\n <Popover\n className=\"se-design-overflow-tabs\"\n position=\"bottom-left\"\n noBorder\n disableClickToggle={true}\n onPopoverToggle={(isOpen) => {\n if (!isOpen) {\n // Only return focus programmatically when the popover was opened via keyboard.\n // Mouse-opened popovers must not call .focus() — programmatic focus after a\n // pointer interaction triggers :focus-visible intermittently across browsers.\n if (wasKeyboardOpenedRef.current) overflowDivRef.current?.focus();\n wasKeyboardOpenedRef.current = false;\n }\n }}\n renderPopoverSrcElement={({ displayPopover, togglePopover }) => {\n const overflowTabProps = getTabProps('overflow');\n const overflowAriaControls = activeOverflowTab\n ? getPanelId(activeOverflowTab.id, baseId)\n : undefined;\n\n return (\n <div\n {...overflowTabProps}\n ref={(el) => { overflowDivRef.current = el; overflowTabProps.ref(el); }}\n aria-controls={overflowAriaControls}\n aria-haspopup=\"true\"\n aria-expanded={displayPopover}\n onClick={() => { wasKeyboardOpenedRef.current = false; togglePopover(true); }}\n onFocus={() => setFocusedTabId('overflow')}\n data-automation-id=\"tabs-kebab-menu\"\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ' || e.key === 'ArrowDown') {\n e.preventDefault();\n wasKeyboardOpenedRef.current = true;\n togglePopover(true);\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n wasKeyboardOpenedRef.current = true;\n togglePopover('last');\n } else {\n handleKeyDown(e);\n }\n }}\n className={`overflow-tabs-src-element focus-outline border-l px-3 py-0.5 rounded-r-md font-medium hover:cursor-pointer transition-all duration-200 ease-in-out ${\n displayPopover ? 'bg-[var(--color-blue-100)]' : ''\n } ${activeOverflowTab?.label ? 'bg-[var(--color-blue-500)]' : 'hover:bg-[var(--color-gray-50)]'}`}\n onMouseEnter={() => setIsIconTabHover(true)}\n onMouseLeave={() => setIsIconTabHover(false)}\n >\n {activeOverflowTab?.label ? (\n <>\n <span className=\"text-[var(--color-white)]\">{activeOverflowTab?.label}</span>\n <Icon\n name=\"chevron\"\n rotation={displayPopover ? '180' : '0'}\n stroke={isIconTabHover ? 'var(--color-gray-100)' : 'var(--color-white)'}\n />\n </>\n ) : (\n <Icon name=\"kebab-menu\" fill={isIconTabHover ? 'var(--color-gray-900)' : 'var(--color-gray-700)'} />\n )}\n </div>\n );\n }}\n renderPopoverContents={({ closePopoverCb }) => (\n <MenuList\n items={overflowTabs.map((tab) => ({\n id: tab?.id,\n label: tab?.label,\n automationId: tab?.automationId || tab?.id,\n onClick: () => {\n handleTabClick(tab);\n closePopoverCb();\n }\n }))}\n />\n )}\n />\n )}\n </div>\n\n {hasPanelContent && (\n <div className=\"se-design-tabs-content\">\n {tabs.map((tab) => (\n <div\n key={tab.id}\n {...getPanelProps(tab.id)}\n className={`tab-content ${isTabActive(tab, activeTab) ? 'block' : 'hidden'}`}\n >\n {isTabActive(tab, activeTab) && tab.renderTabContent?.(tab)}\n </div>\n ))}\n </div>\n )}\n </>\n );\n};\n"],"names":["Tabs","defaultActiveTab","tabs","onTabChange","primaryTabCount","headingLevel","HeadingTag","id","ariaLabel","ariaLabelledBy","panelId","defaultTabId","activeTab","setActiveTab","useState","isIconTabHover","setIsIconTabHover","visibleTabCount","length","visibleTabs","slice","overflowTabs","activeOverflowTab","find","tab","hasPanelContent","some","t","renderTabContent","baseId","useStableId","itemIds","useMemo","enabledVisibleTabs","filter","disabled","enabledOverflowTabs","visibleIds","map","getTabProps","getPanelProps","handleKeyDown","setFocusedTabId","useTabsA11y","activeItem","orientation","idBase","includePanelLinks","externalPanelId","overflowDivRef","useRef","wasKeyboardOpenedRef","useEffect","handleTabClick","isTabActive","singleTab","createElement","React","Fragment","className","label","_extends","role","getA11yNameAttributes","isActive","isDisabled","tabProps","type","key","onFocus","onKeyDown","onClick","automationId","Popover","position","noBorder","disableClickToggle","onPopoverToggle","isOpen","current","focus","renderPopoverSrcElement","displayPopover","togglePopover","overflowTabProps","overflowAriaControls","getPanelId","undefined","ref","el","e","preventDefault","onMouseEnter","onMouseLeave","Icon","name","rotation","stroke","fill","renderPopoverContents","closePopoverCb","MenuList","items"],"mappings":"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"}
package/dist/index32.js CHANGED
@@ -1,77 +1,75 @@
1
- import t, { useRef as $ } from "react";
1
+ import e, { useRef as $ } from "react";
2
2
  import { useStableId as y } from "./index190.js";
3
- function L(e) {
3
+ function L(a) {
4
4
  const {
5
- label: u,
5
+ label: s,
6
6
  value: n,
7
- checked: r,
8
- disabled: a,
9
- name: c,
10
- onChange: i,
7
+ checked: l,
8
+ disabled: t,
9
+ name: i,
10
+ onChange: u,
11
11
  width: m,
12
12
  radioLabelClassName: f = "",
13
- radioContainerClassName: h = "",
14
- automationId: p = "",
13
+ radioContainerClassName: p = "",
14
+ automationId: h = "",
15
15
  bgColor: b = "var(--color-white)",
16
16
  withBorder: x = !0,
17
- content: d
18
- } = e, o = $(null), s = y(void 0, `${c}-${n}`);
19
- t.useLayoutEffect(() => {
20
- o.current && (o.current.checked = r);
21
- }, [r]);
17
+ content: c
18
+ } = a, o = $(null), d = y(void 0, `${i}-${n}`);
19
+ e.useLayoutEffect(() => {
20
+ o.current && (o.current.checked = l);
21
+ }, [l]);
22
22
  const C = () => {
23
- a || (o.current?.focus(), o.current?.click());
24
- }, g = (l) => {
25
- l.preventDefault(), l.stopPropagation(), a || (o.current?.focus(), i?.({
26
- ...e,
27
- checked: !0
28
- }));
29
- }, k = (l) => {
30
- l.stopPropagation();
31
- }, v = () => {
32
- i?.({
33
- ...e,
23
+ t || (o.current?.focus(), o.current?.click());
24
+ }, g = (r) => {
25
+ r.stopPropagation();
26
+ }, k = (r) => {
27
+ r.stopPropagation();
28
+ }, w = () => {
29
+ u?.({
30
+ ...a,
34
31
  checked: !0
35
32
  });
36
- }, w = r ? "border-[var(--color-blue-500)]" : "border-[var(--color-gray-400)]";
37
- return /* @__PURE__ */ t.createElement("div", {
38
- className: `se-design-radio-container flex flex-col justify-center items-start gap-2 ${a ? "cursor-not-allowed" : "cursor-pointer"} ${x ? `border ${w} p-4` : ""} rounded-[6px] transition-colors duration-300 ${a ? "opacity-50" : ""} ${h}`,
33
+ }, v = l ? "border-[var(--color-blue-500)]" : "border-[var(--color-gray-400)]";
34
+ return /* @__PURE__ */ e.createElement("div", {
35
+ className: `se-design-radio-container flex flex-col justify-center items-start gap-2 ${t ? "cursor-not-allowed" : "cursor-pointer"} ${x ? `border ${v} p-4` : ""} rounded-[6px] transition-colors duration-300 ${t ? "opacity-50" : ""} ${p}`,
39
36
  onClick: C,
40
37
  style: {
41
38
  width: m || "auto",
42
39
  backgroundColor: b
43
40
  },
44
- "data-automation-id": p
45
- }, /* @__PURE__ */ t.createElement("div", {
41
+ "data-automation-id": h
42
+ }, /* @__PURE__ */ e.createElement("div", {
46
43
  className: "flex items-center gap-[0.625rem]",
47
44
  "data-automation-id": "radio-field-content"
48
- }, /* @__PURE__ */ t.createElement("input", {
45
+ }, /* @__PURE__ */ e.createElement("input", {
49
46
  ref: o,
50
47
  type: "radio",
51
- id: s,
52
- name: c,
48
+ id: d,
49
+ name: i,
53
50
  value: n,
54
- disabled: a,
51
+ disabled: t,
55
52
  className: "radio-field-input cursor-pointer accent-[var(--color-blue-500)] disabled:cursor-not-allowed disabled:opacity-50 text-[var(--color-blue-500)] w-[14px] h-[14px] p-[3px]",
56
53
  onClick: k,
57
- onChange: v
58
- }), /* @__PURE__ */ t.createElement("label", {
59
- htmlFor: s,
60
- className: `${e.helperLabel ? "flex flex-col gap-[6px] " : ""}${a ? "cursor-not-allowed" : "cursor-pointer"}`,
54
+ onChange: w
55
+ }), /* @__PURE__ */ e.createElement("label", {
56
+ htmlFor: d,
57
+ className: `${a.helperLabel ? "flex flex-col gap-[6px] " : ""}${t ? "cursor-not-allowed" : "cursor-pointer"}`,
61
58
  "data-automation-id": "radio-field-label",
62
59
  onClick: g
63
- }, /* @__PURE__ */ t.createElement("span", {
60
+ }, /* @__PURE__ */ e.createElement("span", {
64
61
  className: `text-sm text-[var(--color-gray-800)] ${f} `,
65
62
  style: {
66
63
  fontSize: "16px",
67
64
  fontWeight: "400"
68
65
  }
69
- }, u))), r && d && /* @__PURE__ */ t.createElement("div", {
70
- className: "radio-child-content pl-[1.5rem] w-full"
71
- }, d()), e.helperLabel && /* @__PURE__ */ t.createElement("span", {
72
- className: `text-sm font-normal text-[var(--color-gray-600)] ${e.maxWidth ? `max-w-[${e.maxWidth}]` : "max-w-full"} break-words whitespace-normal`,
66
+ }, s))), l && c && /* @__PURE__ */ e.createElement("div", {
67
+ className: "radio-child-content pl-[1.5rem] w-full",
68
+ onClick: (r) => r.stopPropagation()
69
+ }, c()), a.helperLabel && /* @__PURE__ */ e.createElement("span", {
70
+ className: `text-sm font-normal text-[var(--color-gray-600)] ${a.maxWidth ? `max-w-[${a.maxWidth}]` : "max-w-full"} break-words whitespace-normal`,
73
71
  "data-automation-id": "radio-field-helper-text"
74
- }, e.helperLabel));
72
+ }, a.helperLabel));
75
73
  }
76
74
  export {
77
75
  L as Radio
@@ -1 +1 @@
1
- {"version":3,"file":"index32.js","sources":["../src/components/Radio/index.tsx"],"sourcesContent":["import React, { useRef } from 'react';\nimport { useStableId } from '../../utils/useStableId';\n\nexport interface RadioProps {\n label: string;\n value: string;\n checked: boolean;\n disabled: boolean;\n name: string;\n onChange?: (props: RadioProps) => void;\n helperLabel?: string;\n maxWidth?: string;\n width?: string;\n radioLabelClassName?: string;\n radioContainerClassName?: string;\n automationId?: string;\n withBorder?: boolean;\n bgColor?: string;\n content?: () => React.ReactNode;\n}\n\nexport function Radio(props: RadioProps) {\n const {\n label,\n value,\n checked,\n disabled,\n name,\n onChange,\n width,\n radioLabelClassName = '',\n radioContainerClassName = '',\n automationId = '',\n bgColor = 'var(--color-white)',\n withBorder = true,\n content\n } = props;\n const radioRef = useRef<HTMLInputElement>(null);\n const inputId = useStableId(undefined, `${name}-${value}`);\n\n // Sync DOM checked state with prop — bypasses React's controlled-input restore mechanism\n // which resets DOM.checked=false after the first click on an unselected radio.\n React.useLayoutEffect(() => {\n if (radioRef.current) {\n radioRef.current.checked = checked;\n }\n }, [checked]);\n\n const handleContainerClick = () => {\n if (!disabled) {\n radioRef.current?.focus();\n radioRef.current?.click();\n }\n };\n\n const handleLabelClick = (e: React.MouseEvent<HTMLLabelElement>) => {\n // Prevent native htmlFor redirect (avoids double-firing onChange) while keeping htmlFor for SR association\n e.preventDefault();\n e.stopPropagation();\n if (!disabled) {\n radioRef.current?.focus();\n onChange?.({ ...props, checked: true });\n }\n };\n\n const handleInputClick = (e: React.MouseEvent<HTMLInputElement>) => {\n e.stopPropagation();\n };\n\n const handleInputChange = () => {\n onChange?.({ ...props, checked: true });\n };\n\n const borderColor = checked ? 'border-[var(--color-blue-500)]' : 'border-[var(--color-gray-400)]';\n\n return (\n <div\n className={`se-design-radio-container flex flex-col justify-center items-start gap-2 ${\n disabled ? 'cursor-not-allowed' : 'cursor-pointer'\n } ${\n withBorder ? `border ${borderColor} p-4` : ''\n } rounded-[6px] transition-colors duration-300 ${disabled ? 'opacity-50' : ''} ${radioContainerClassName}`}\n onClick={handleContainerClick}\n style={{ width: width || 'auto', backgroundColor: bgColor }}\n data-automation-id={automationId}\n >\n <div className=\"flex items-center gap-[0.625rem]\" data-automation-id=\"radio-field-content\">\n <input\n ref={radioRef}\n type=\"radio\"\n id={inputId}\n name={name}\n value={value}\n disabled={disabled}\n className=\"radio-field-input cursor-pointer accent-[var(--color-blue-500)] disabled:cursor-not-allowed disabled:opacity-50 text-[var(--color-blue-500)] w-[14px] h-[14px] p-[3px]\"\n onClick={handleInputClick}\n onChange={handleInputChange}\n />\n <label\n htmlFor={inputId}\n className={`${props.helperLabel ? 'flex flex-col gap-[6px] ' : ''}${\n disabled ? 'cursor-not-allowed' : 'cursor-pointer'\n }`}\n data-automation-id=\"radio-field-label\"\n onClick={handleLabelClick}\n >\n <span\n className={`text-sm text-[var(--color-gray-800)] ${radioLabelClassName} `}\n style={{ fontSize: '16px', fontWeight: '400' }}\n >\n {label}\n </span>\n </label>\n </div>\n {checked && content && <div className=\"radio-child-content pl-[1.5rem] w-full\">{content()}</div>}\n {props.helperLabel && (\n <span\n className={`text-sm font-normal text-[var(--color-gray-600)] ${\n props.maxWidth ? `max-w-[${props.maxWidth}]` : 'max-w-full'\n } break-words whitespace-normal`}\n data-automation-id=\"radio-field-helper-text\"\n >\n {props.helperLabel}\n </span>\n )}\n </div>\n );\n}\n"],"names":["Radio","props","label","value","checked","disabled","name","onChange","width","radioLabelClassName","radioContainerClassName","automationId","bgColor","withBorder","content","radioRef","useRef","inputId","useStableId","undefined","React","useLayoutEffect","current","handleContainerClick","focus","click","handleLabelClick","e","preventDefault","stopPropagation","handleInputClick","handleInputChange","borderColor","createElement","className","onClick","style","backgroundColor","ref","type","id","htmlFor","helperLabel","fontSize","fontWeight","maxWidth"],"mappings":"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"}
1
+ {"version":3,"file":"index32.js","sources":["../src/components/Radio/index.tsx"],"sourcesContent":["import React, { useRef } from 'react';\nimport { useStableId } from '../../utils/useStableId';\n\nexport interface RadioProps {\n label: string;\n value: string;\n checked: boolean;\n disabled: boolean;\n name: string;\n onChange?: (props: RadioProps) => void;\n helperLabel?: string;\n maxWidth?: string;\n width?: string;\n radioLabelClassName?: string;\n radioContainerClassName?: string;\n automationId?: string;\n withBorder?: boolean;\n bgColor?: string;\n content?: () => React.ReactNode;\n}\n\nexport function Radio(props: RadioProps) {\n const {\n label,\n value,\n checked,\n disabled,\n name,\n onChange,\n width,\n radioLabelClassName = '',\n radioContainerClassName = '',\n automationId = '',\n bgColor = 'var(--color-white)',\n withBorder = true,\n content\n } = props;\n const radioRef = useRef<HTMLInputElement>(null);\n const inputId = useStableId(undefined, `${name}-${value}`);\n\n // Sync DOM checked state with prop — bypasses React's controlled-input restore mechanism\n // which resets DOM.checked=false after the first click on an unselected radio.\n React.useLayoutEffect(() => {\n if (radioRef.current) {\n radioRef.current.checked = checked;\n }\n }, [checked]);\n\n const handleContainerClick = () => {\n if (!disabled) {\n radioRef.current?.focus();\n radioRef.current?.click();\n }\n };\n\n const handleLabelClick = (e: React.MouseEvent<HTMLLabelElement>) => {\n // Stop label click from bubbling to container (which would double-fire handleContainerClick).\n // No preventDefault — native htmlFor redirect fires a new click on the input, which handles\n // check + focus + onChange via handleInputChange. No manual replication needed.\n e.stopPropagation();\n };\n\n const handleInputClick = (e: React.MouseEvent<HTMLInputElement>) => {\n e.stopPropagation();\n };\n\n const handleInputChange = () => {\n onChange?.({ ...props, checked: true });\n };\n\n const borderColor = checked ? 'border-[var(--color-blue-500)]' : 'border-[var(--color-gray-400)]';\n\n return (\n <div\n className={`se-design-radio-container flex flex-col justify-center items-start gap-2 ${\n disabled ? 'cursor-not-allowed' : 'cursor-pointer'\n } ${\n withBorder ? `border ${borderColor} p-4` : ''\n } rounded-[6px] transition-colors duration-300 ${disabled ? 'opacity-50' : ''} ${radioContainerClassName}`}\n onClick={handleContainerClick}\n style={{ width: width || 'auto', backgroundColor: bgColor }}\n data-automation-id={automationId}\n >\n <div className=\"flex items-center gap-[0.625rem]\" data-automation-id=\"radio-field-content\">\n <input\n ref={radioRef}\n type=\"radio\"\n id={inputId}\n name={name}\n value={value}\n disabled={disabled}\n className=\"radio-field-input cursor-pointer accent-[var(--color-blue-500)] disabled:cursor-not-allowed disabled:opacity-50 text-[var(--color-blue-500)] w-[14px] h-[14px] p-[3px]\"\n onClick={handleInputClick}\n onChange={handleInputChange}\n />\n <label\n htmlFor={inputId}\n className={`${props.helperLabel ? 'flex flex-col gap-[6px] ' : ''}${\n disabled ? 'cursor-not-allowed' : 'cursor-pointer'\n }`}\n data-automation-id=\"radio-field-label\"\n onClick={handleLabelClick}\n >\n <span\n className={`text-sm text-[var(--color-gray-800)] ${radioLabelClassName} `}\n style={{ fontSize: '16px', fontWeight: '400' }}\n >\n {label}\n </span>\n </label>\n </div>\n {checked && content && (\n <div className=\"radio-child-content pl-[1.5rem] w-full\" onClick={(e) => e.stopPropagation()}>\n {content()}\n </div>\n )}\n {props.helperLabel && (\n <span\n className={`text-sm font-normal text-[var(--color-gray-600)] ${\n props.maxWidth ? `max-w-[${props.maxWidth}]` : 'max-w-full'\n } break-words whitespace-normal`}\n data-automation-id=\"radio-field-helper-text\"\n >\n {props.helperLabel}\n </span>\n )}\n </div>\n );\n}\n"],"names":["Radio","props","label","value","checked","disabled","name","onChange","width","radioLabelClassName","radioContainerClassName","automationId","bgColor","withBorder","content","radioRef","useRef","inputId","useStableId","undefined","React","useLayoutEffect","current","handleContainerClick","focus","click","handleLabelClick","e","stopPropagation","handleInputClick","handleInputChange","borderColor","createElement","className","onClick","style","backgroundColor","ref","type","id","htmlFor","helperLabel","fontSize","fontWeight","maxWidth"],"mappings":"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"}
package/dist/index37.js CHANGED
@@ -3,7 +3,7 @@ import { Popover as ve } from "./index18.js";
3
3
  import { Icon as we } from "./index5.js";
4
4
  import { Checkbox as Ee } from "./index22.js";
5
5
  import { Button as G } from "./index3.js";
6
- import { useCombobox as ke } from "./index197.js";
6
+ import { useCombobox as ke } from "./index199.js";
7
7
  import { useStableId as be } from "./index190.js";
8
8
  /* empty css */
9
9
  function g() {
package/dist/index39.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import a, { useState as d, useRef as $, useEffect as r, useMemo as D } from "react";
2
2
  import { Icon as g } from "./index5.js";
3
3
  import { LabelChip as F } from "./index10.js";
4
- import { debounce as L } from "./index207.js";
4
+ import { debounce as L } from "./index208.js";
5
5
  /* empty css */
6
6
  function z(p) {
7
7
  const {
package/dist/index44.js CHANGED
@@ -3,7 +3,7 @@ import e, { useState as S, useRef as k, useCallback as P, useEffect as Y } from
3
3
  import { Icon as x } from "./index5.js";
4
4
  import { useStableId as Z } from "./index190.js";
5
5
  import { getA11yNameAttributes as L } from "./index71.js";
6
- import { useCombobox as ee } from "./index197.js";
6
+ import { useCombobox as ee } from "./index199.js";
7
7
  function u() {
8
8
  return u = Object.assign ? Object.assign.bind() : function(o) {
9
9
  for (var s = 1; s < arguments.length; s++) {
package/dist/index45.js CHANGED
@@ -1,10 +1,10 @@
1
1
  import t, { useState as m, useRef as h, useCallback as f, useEffect as x } from "react";
2
2
  /* empty css */
3
- import g from "./index215.js";
3
+ import g from "./index216.js";
4
4
  import { Icon as T } from "./index5.js";
5
5
  import { useStableId as E } from "./index190.js";
6
6
  import { getA11yNameAttributes as ce } from "./index71.js";
7
- import { useCombobox as se } from "./index197.js";
7
+ import { useCombobox as se } from "./index199.js";
8
8
  function c() {
9
9
  return c = Object.assign ? Object.assign.bind() : function(s) {
10
10
  for (var i = 1; i < arguments.length; i++) {
package/dist/index48.js CHANGED
@@ -28,7 +28,7 @@ import { Popover as $ } from "./index18.js";
28
28
  /* empty css */
29
29
  /* empty css */
30
30
  /* empty css */
31
- import { TabButton as j } from "./index218.js";
31
+ import { TabButton as j } from "./index219.js";
32
32
  /* empty css */
33
33
  /* empty css */
34
34
  /* empty css */
package/dist/index52.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import e, { useEffect as d } from "react";
2
- import { delay as m } from "./index227.js";
2
+ import { delay as m } from "./index228.js";
3
3
  import { Icon as i } from "./index5.js";
4
4
  const g = (r) => {
5
5
  const {
package/dist/index62.js CHANGED
@@ -2,7 +2,7 @@ import F, { useState as ot, useRef as X, useEffect as $ } from "react";
2
2
  import { createPortal as nt } from "react-dom";
3
3
  import { Icon as it } from "./index5.js";
4
4
  import { Button as rt } from "./index3.js";
5
- import { debounce as lt } from "./index207.js";
5
+ import { debounce as lt } from "./index208.js";
6
6
  const q = 500, S = 50, U = 150, st = {
7
7
  "top-left": {
8
8
  rotate: "315",