@epignosis_llc/gnosis 6.7.8 → 6.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -19,7 +19,7 @@ import TabsContent from './TabsContent.js';
19
19
  import { tabsHeader, container } from './styles.js';
20
20
  import { createElement as jsx } from '../../../node_modules/@emotion/react/dist/emotion-react.browser.esm.js';
21
21
 
22
- var _excluded = ["tabs", "stickyHeader", "selectedTab", "onChangeTab", "inlineEndComponent", "testIds"];
22
+ var _excluded = ["tabs", "stickyHeader", "selectedTab", "controlled", "onChangeTab", "inlineEndComponent", "testIds"];
23
23
  var Tabs = function Tabs(_ref) {
24
24
  var _ref$tabs = _ref.tabs,
25
25
  tabs = _ref$tabs === void 0 ? [] : _ref$tabs,
@@ -27,24 +27,39 @@ var Tabs = function Tabs(_ref) {
27
27
  stickyHeader = _ref$stickyHeader === void 0 ? false : _ref$stickyHeader,
28
28
  _ref$selectedTab = _ref.selectedTab,
29
29
  selectedTab = _ref$selectedTab === void 0 ? 0 : _ref$selectedTab,
30
+ _ref$controlled = _ref.controlled,
31
+ controlled = _ref$controlled === void 0 ? false : _ref$controlled,
30
32
  onChangeTab = _ref.onChangeTab,
31
33
  inlineEndComponent = _ref.inlineEndComponent,
32
34
  testIds = _ref.testIds,
33
35
  rest = _objectWithoutProperties(_ref, _excluded);
34
36
  var _useState = useState(selectedTab),
35
37
  _useState2 = _slicedToArray(_useState, 2),
36
- activeTab = _useState2[0],
37
- setActiveTab = _useState2[1];
38
- var tabsLength = tabs.length - 1;
38
+ internalActiveTab = _useState2[0],
39
+ setInternalActiveTab = _useState2[1];
40
+ // Tabs without content are not rendered, so every index (selection, bounds, keyboard,
41
+ // arrows) refers to this filtered collection — matching what onChangeTab emits.
42
+ var tabsWithContent = tabs.filter(function (tab) {
43
+ return tab.content;
44
+ });
45
+ var tabsLength = tabsWithContent.length - 1;
39
46
  var tabsNavEl = useRef(null);
40
47
  var _useState3 = useState(false),
41
48
  _useState4 = _slicedToArray(_useState3, 2),
42
49
  isOverflowActive = _useState4[0],
43
50
  setIsOverflowActive = _useState4[1];
44
51
  var dir = document.dir;
52
+ var clampTabIndex = function clampTabIndex(index) {
53
+ if (index < 0) return 0;
54
+ if (index > tabsLength) return tabsLength;
55
+ return index;
56
+ };
57
+ var activeTab = controlled ? clampTabIndex(selectedTab) : internalActiveTab;
45
58
  var onSelectTab = function onSelectTab(index) {
46
59
  scrollToTab(index);
47
- setActiveTab(index);
60
+ if (!controlled) {
61
+ setInternalActiveTab(index);
62
+ }
48
63
  onChangeTab && onChangeTab(index);
49
64
  };
50
65
  var showLeftArrow = function showLeftArrow() {
@@ -53,33 +68,21 @@ var Tabs = function Tabs(_ref) {
53
68
  };
54
69
  var handLeftArrowClick = function handLeftArrowClick() {
55
70
  if (activeTab > 0) {
56
- scrollToTab(activeTab - 1);
57
- setActiveTab(function (currentTab) {
58
- return currentTab - 1;
59
- });
71
+ // Route through onSelectTab so controlled parents are notified of the new selection.
72
+ onSelectTab(activeTab - 1);
60
73
  }
61
74
  };
62
75
  var showRightArrow = function showRightArrow() {
63
- if (!isOverflowActive || !tabs.length) return false;
76
+ if (!isOverflowActive || !tabsWithContent.length) return false;
64
77
  return activeTab < tabsLength;
65
78
  };
66
79
  var handRightArrowClick = function handRightArrowClick() {
67
- if (tabs.length && activeTab < tabsLength) {
68
- scrollToTab(activeTab + 1);
69
- setActiveTab(function (currentTab) {
70
- return currentTab + 1;
71
- });
80
+ if (tabsWithContent.length && activeTab < tabsLength) {
81
+ onSelectTab(activeTab + 1);
72
82
  }
73
83
  };
74
84
  useEffect(function () {
75
- var newSelectedTab = selectedTab;
76
- if (selectedTab < 0) {
77
- newSelectedTab = 0;
78
- }
79
- if (selectedTab > tabsLength) {
80
- newSelectedTab = tabsLength;
81
- }
82
- setActiveTab(newSelectedTab);
85
+ setInternalActiveTab(clampTabIndex(selectedTab));
83
86
  }, [selectedTab]);
84
87
  useEffect(function () {
85
88
  toggleTabsArrow();
@@ -108,15 +111,9 @@ var Tabs = function Tabs(_ref) {
108
111
  };
109
112
  var handleKeyDown = function handleKeyDown(e, index) {
110
113
  if (e.key === "ArrowRight" && index < tabsLength) {
111
- // If next tab is undefined, do nothing
112
- if (tabs[index + 1].content) {
113
- onSelectTab(index + 1);
114
- }
114
+ onSelectTab(index + 1);
115
115
  } else if (e.key === "ArrowLeft" && index > 0) {
116
- // If prev tab is undefined, do nothing
117
- if (tabs[index - 1].content) {
118
- onSelectTab(index - 1);
119
- }
116
+ onSelectTab(index - 1);
120
117
  }
121
118
  };
122
119
  return jsx("section", _extends({
@@ -145,9 +142,7 @@ var Tabs = function Tabs(_ref) {
145
142
  ref: tabsNavEl
146
143
  }, (testIds === null || testIds === void 0 ? void 0 : testIds.nav) && {
147
144
  "data-testid": testIds.nav
148
- }), tabs.filter(function (tab) {
149
- return tab.content;
150
- }).map(function (_ref2, index) {
145
+ }), tabsWithContent.map(function (_ref2, index) {
151
146
  var title = _ref2.title,
152
147
  id = _ref2.id;
153
148
  return jsx(TabsNavItem, {
@@ -179,9 +174,7 @@ var Tabs = function Tabs(_ref) {
179
174
  role: "region"
180
175
  }, (testIds === null || testIds === void 0 ? void 0 : testIds.content) && {
181
176
  "data-testid": testIds.content
182
- }), tabs.filter(function (tab) {
183
- return tab.content;
184
- }).map(function (_ref3, index) {
177
+ }), tabsWithContent.map(function (_ref3, index) {
185
178
  var content = _ref3.content;
186
179
  return jsx(TabsContent, {
187
180
  key: index,
@@ -1 +1 @@
1
- {"version":3,"file":"Tabs.js","sources":["../../../../../src/components/Tabs/Tabs.tsx"],"sourcesContent":["import React, { FC, useState, useEffect, useRef } from \"react\";\nimport { SerializedStyles } from \"@emotion/react\";\nimport { ArrowLeftSVG, ArrowRightSVG } from \"../../icons/\";\nimport Button from \"../Button/Button\";\nimport TabsNavItem from \"./TabsNavItem\";\nimport TabsContent from \"./TabsContent\";\nimport { container, tabsHeader } from \"./styles\";\n\nexport type TabObject = {\n title: JSX.Element | string;\n id?: string;\n content?: JSX.Element | string;\n};\n\ntype TabsProps = React.HTMLAttributes<HTMLElement> & {\n stickyHeader?: boolean;\n selectedTab?: number;\n onChangeTab?: (index: number) => void;\n tabs: TabObject[];\n inlineEndComponent?: JSX.Element;\n testIds?: {\n nav?: string;\n content?: string;\n };\n};\n\nconst Tabs: FC<TabsProps> = ({\n tabs = [],\n stickyHeader = false,\n selectedTab = 0,\n onChangeTab,\n inlineEndComponent,\n testIds,\n ...rest\n}) => {\n const [activeTab, setActiveTab] = useState(selectedTab);\n const tabsLength = tabs.length - 1;\n const tabsNavEl = useRef<HTMLDivElement>(null);\n const [isOverflowActive, setIsOverflowActive] = useState(false);\n const dir = document.dir;\n\n const onSelectTab = (index: number): void => {\n scrollToTab(index);\n setActiveTab(index);\n onChangeTab && onChangeTab(index);\n };\n\n const showLeftArrow = () => {\n if (!isOverflowActive) return false;\n return activeTab > 0;\n };\n\n const handLeftArrowClick = () => {\n if (activeTab > 0) {\n scrollToTab(activeTab - 1);\n setActiveTab((currentTab) => currentTab - 1);\n }\n };\n\n const showRightArrow = () => {\n if (!isOverflowActive || !tabs.length) return false;\n return activeTab < tabsLength;\n };\n\n const handRightArrowClick = () => {\n if (tabs.length && activeTab < tabsLength) {\n scrollToTab(activeTab + 1);\n setActiveTab((currentTab) => currentTab + 1);\n }\n };\n\n useEffect(() => {\n let newSelectedTab = selectedTab;\n\n if (selectedTab < 0) {\n newSelectedTab = 0;\n }\n\n if (selectedTab > tabsLength) {\n newSelectedTab = tabsLength;\n }\n\n setActiveTab(newSelectedTab);\n }, [selectedTab]);\n\n useEffect(() => {\n toggleTabsArrow();\n }, [tabsNavEl]);\n\n const toggleTabsArrow = () => {\n const el = tabsNavEl.current;\n if (el) {\n setIsOverflowActive(el.offsetWidth < el.scrollWidth);\n }\n };\n\n // add listener on window resize to toggle tabs arrow visibility\n useEffect(() => {\n window.addEventListener(\"resize\", toggleTabsArrow);\n\n return () => {\n window.removeEventListener(\"resize\", toggleTabsArrow);\n };\n }, []);\n\n //TODO: find a way to perform scrolling to tab\n const scrollToTab = (tabIndex: number) => {\n const tabOffset = document.querySelector(`#tab-${tabIndex}`)?.getBoundingClientRect().x;\n\n const tablist = document.getElementsByTagName(\"nav\")[0];\n tabOffset && tablist.scrollTo(tabOffset > 0 ? tabOffset - 16 : 0, 0);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>, index: number) => {\n if (e.key === \"ArrowRight\" && index < tabsLength) {\n // If next tab is undefined, do nothing\n if (tabs[index + 1].content) {\n onSelectTab(index + 1);\n }\n } else if (e.key === \"ArrowLeft\" && index > 0) {\n // If prev tab is undefined, do nothing\n if (tabs[index - 1].content) {\n onSelectTab(index - 1);\n }\n }\n };\n\n return (\n <section css={container} {...rest}>\n <div className=\"nav-wrapper\" role=\"navigation\" tabIndex={0}>\n {showLeftArrow() && (\n <Button\n data-testid=\"left-arrow\"\n variant=\"link\"\n color=\"secondary\"\n noGutters\n onClick={handLeftArrowClick}\n >\n {dir === \"rtl\" ? <ArrowRightSVG height={22} /> : <ArrowLeftSVG height={22} />}\n </Button>\n )}\n\n <nav\n css={(theme): SerializedStyles => tabsHeader(theme, { stickyHeader })}\n role=\"tablist\"\n ref={tabsNavEl}\n {...(testIds?.nav && { \"data-testid\": testIds.nav })}\n >\n {tabs\n .filter((tab) => tab.content)\n .map(({ title, id }, index) => (\n <TabsNavItem\n id={id}\n key={index}\n index={index}\n title={title}\n isActive={activeTab === index}\n onSelectTab={onSelectTab}\n onKeyDown={(e) => handleKeyDown(e, index)}\n />\n ))}\n {inlineEndComponent && <div className=\"inline-end-component\">{inlineEndComponent}</div>}\n </nav>\n\n {showRightArrow() && (\n <Button\n data-testid=\"right-arrow\"\n variant=\"link\"\n color=\"secondary\"\n noGutters\n onClick={handRightArrowClick}\n >\n {dir === \"rtl\" ? <ArrowLeftSVG height={22} /> : <ArrowRightSVG height={22} />}\n </Button>\n )}\n </div>\n\n <div\n id=\"content\"\n aria-live=\"polite\"\n role=\"region\"\n {...(testIds?.content && { \"data-testid\": testIds.content })}\n >\n {tabs\n .filter((tab) => tab.content)\n .map(({ content }, index) => (\n <TabsContent\n key={index}\n index={index}\n content={content}\n isVisible={activeTab === index}\n />\n ))}\n </div>\n </section>\n );\n};\n\nexport default Tabs;\n"],"names":["Tabs","_ref","_ref$tabs","tabs","_ref$stickyHeader","stickyHeader","_ref$selectedTab","selectedTab","onChangeTab","inlineEndComponent","testIds","rest","_objectWithoutProperties","_excluded","_useState","useState","_useState2","_slicedToArray","activeTab","setActiveTab","tabsLength","length","tabsNavEl","useRef","_useState3","_useState4","isOverflowActive","setIsOverflowActive","dir","document","onSelectTab","index","scrollToTab","showLeftArrow","handLeftArrowClick","currentTab","showRightArrow","handRightArrowClick","useEffect","newSelectedTab","toggleTabsArrow","el","current","offsetWidth","scrollWidth","window","addEventListener","removeEventListener","tabIndex","_document$querySelect","tabOffset","querySelector","concat","getBoundingClientRect","x","tablist","getElementsByTagName","scrollTo","handleKeyDown","e","key","content","___EmotionJSX","_extends","css","container","className","role","Button","variant","color","noGutters","onClick","ArrowRightSVG","height","ArrowLeftSVG","theme","tabsHeader","ref","nav","filter","tab","map","_ref2","title","id","TabsNavItem","isActive","onKeyDown","_ref3","TabsContent","isVisible"],"mappings":"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"}
1
+ {"version":3,"file":"Tabs.js","sources":["../../../../../src/components/Tabs/Tabs.tsx"],"sourcesContent":["import React, { FC, useState, useEffect, useRef } from \"react\";\nimport { SerializedStyles } from \"@emotion/react\";\nimport { ArrowLeftSVG, ArrowRightSVG } from \"../../icons/\";\nimport Button from \"../Button/Button\";\nimport TabsNavItem from \"./TabsNavItem\";\nimport TabsContent from \"./TabsContent\";\nimport { container, tabsHeader } from \"./styles\";\n\nexport type TabObject = {\n title: JSX.Element | string;\n id?: string;\n content?: JSX.Element | string;\n};\n\ntype TabsProps = React.HTMLAttributes<HTMLElement> & {\n stickyHeader?: boolean;\n selectedTab?: number;\n /**\n * When true, the parent owns the active tab: selecting a tab only calls onChangeTab and the\n * component follows selectedTab. Keeps the selection from running ahead of parent state that\n * updates asynchronously (e.g. a URL transition).\n */\n controlled?: boolean;\n onChangeTab?: (index: number) => void;\n tabs: TabObject[];\n inlineEndComponent?: JSX.Element;\n testIds?: {\n nav?: string;\n content?: string;\n };\n};\n\nconst Tabs: FC<TabsProps> = ({\n tabs = [],\n stickyHeader = false,\n selectedTab = 0,\n controlled = false,\n onChangeTab,\n inlineEndComponent,\n testIds,\n ...rest\n}) => {\n const [internalActiveTab, setInternalActiveTab] = useState(selectedTab);\n // Tabs without content are not rendered, so every index (selection, bounds, keyboard,\n // arrows) refers to this filtered collection — matching what onChangeTab emits.\n const tabsWithContent = tabs.filter((tab) => tab.content);\n const tabsLength = tabsWithContent.length - 1;\n const tabsNavEl = useRef<HTMLDivElement>(null);\n const [isOverflowActive, setIsOverflowActive] = useState(false);\n const dir = document.dir;\n\n const clampTabIndex = (index: number): number => {\n if (index < 0) return 0;\n if (index > tabsLength) return tabsLength;\n return index;\n };\n\n const activeTab = controlled ? clampTabIndex(selectedTab) : internalActiveTab;\n\n const onSelectTab = (index: number): void => {\n scrollToTab(index);\n if (!controlled) {\n setInternalActiveTab(index);\n }\n onChangeTab && onChangeTab(index);\n };\n\n const showLeftArrow = () => {\n if (!isOverflowActive) return false;\n return activeTab > 0;\n };\n\n const handLeftArrowClick = () => {\n if (activeTab > 0) {\n // Route through onSelectTab so controlled parents are notified of the new selection.\n onSelectTab(activeTab - 1);\n }\n };\n\n const showRightArrow = () => {\n if (!isOverflowActive || !tabsWithContent.length) return false;\n return activeTab < tabsLength;\n };\n\n const handRightArrowClick = () => {\n if (tabsWithContent.length && activeTab < tabsLength) {\n onSelectTab(activeTab + 1);\n }\n };\n\n useEffect(() => {\n setInternalActiveTab(clampTabIndex(selectedTab));\n }, [selectedTab]);\n\n useEffect(() => {\n toggleTabsArrow();\n }, [tabsNavEl]);\n\n const toggleTabsArrow = () => {\n const el = tabsNavEl.current;\n if (el) {\n setIsOverflowActive(el.offsetWidth < el.scrollWidth);\n }\n };\n\n // add listener on window resize to toggle tabs arrow visibility\n useEffect(() => {\n window.addEventListener(\"resize\", toggleTabsArrow);\n\n return () => {\n window.removeEventListener(\"resize\", toggleTabsArrow);\n };\n }, []);\n\n //TODO: find a way to perform scrolling to tab\n const scrollToTab = (tabIndex: number) => {\n const tabOffset = document.querySelector(`#tab-${tabIndex}`)?.getBoundingClientRect().x;\n\n const tablist = document.getElementsByTagName(\"nav\")[0];\n tabOffset && tablist.scrollTo(tabOffset > 0 ? tabOffset - 16 : 0, 0);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>, index: number) => {\n if (e.key === \"ArrowRight\" && index < tabsLength) {\n onSelectTab(index + 1);\n } else if (e.key === \"ArrowLeft\" && index > 0) {\n onSelectTab(index - 1);\n }\n };\n\n return (\n <section css={container} {...rest}>\n <div className=\"nav-wrapper\" role=\"navigation\" tabIndex={0}>\n {showLeftArrow() && (\n <Button\n data-testid=\"left-arrow\"\n variant=\"link\"\n color=\"secondary\"\n noGutters\n onClick={handLeftArrowClick}\n >\n {dir === \"rtl\" ? <ArrowRightSVG height={22} /> : <ArrowLeftSVG height={22} />}\n </Button>\n )}\n\n <nav\n css={(theme): SerializedStyles => tabsHeader(theme, { stickyHeader })}\n role=\"tablist\"\n ref={tabsNavEl}\n {...(testIds?.nav && { \"data-testid\": testIds.nav })}\n >\n {tabsWithContent.map(({ title, id }, index) => (\n <TabsNavItem\n id={id}\n key={index}\n index={index}\n title={title}\n isActive={activeTab === index}\n onSelectTab={onSelectTab}\n onKeyDown={(e) => handleKeyDown(e, index)}\n />\n ))}\n {inlineEndComponent && <div className=\"inline-end-component\">{inlineEndComponent}</div>}\n </nav>\n\n {showRightArrow() && (\n <Button\n data-testid=\"right-arrow\"\n variant=\"link\"\n color=\"secondary\"\n noGutters\n onClick={handRightArrowClick}\n >\n {dir === \"rtl\" ? <ArrowLeftSVG height={22} /> : <ArrowRightSVG height={22} />}\n </Button>\n )}\n </div>\n\n <div\n id=\"content\"\n aria-live=\"polite\"\n role=\"region\"\n {...(testIds?.content && { \"data-testid\": testIds.content })}\n >\n {tabsWithContent.map(({ content }, index) => (\n <TabsContent\n key={index}\n index={index}\n content={content}\n isVisible={activeTab === index}\n />\n ))}\n </div>\n </section>\n );\n};\n\nexport default Tabs;\n"],"names":["Tabs","_ref","_ref$tabs","tabs","_ref$stickyHeader","stickyHeader","_ref$selectedTab","selectedTab","_ref$controlled","controlled","onChangeTab","inlineEndComponent","testIds","rest","_objectWithoutProperties","_excluded","_useState","useState","_useState2","_slicedToArray","internalActiveTab","setInternalActiveTab","tabsWithContent","filter","tab","content","tabsLength","length","tabsNavEl","useRef","_useState3","_useState4","isOverflowActive","setIsOverflowActive","dir","document","clampTabIndex","index","activeTab","onSelectTab","scrollToTab","showLeftArrow","handLeftArrowClick","showRightArrow","handRightArrowClick","useEffect","toggleTabsArrow","el","current","offsetWidth","scrollWidth","window","addEventListener","removeEventListener","tabIndex","_document$querySelect","tabOffset","querySelector","concat","getBoundingClientRect","x","tablist","getElementsByTagName","scrollTo","handleKeyDown","e","key","___EmotionJSX","_extends","css","container","className","role","Button","variant","color","noGutters","onClick","ArrowRightSVG","height","ArrowLeftSVG","theme","tabsHeader","ref","nav","map","_ref2","title","id","TabsNavItem","isActive","onKeyDown","_ref3","TabsContent","isVisible"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAgCA,IAAMA,IAAmB,GAAG,SAAtBA,IAAmBA,CAAAC,IAAA,EASnB;AAAA,EAAA,IAAAC,SAAA,GAAAD,IAAA,CARJE,IAAI;AAAJA,IAAAA,IAAI,GAAAD,SAAA,KAAG,KAAA,CAAA,GAAA,EAAE,GAAAA,SAAA;IAAAE,iBAAA,GAAAH,IAAA,CACTI,YAAY;AAAZA,IAAAA,YAAY,GAAAD,iBAAA,KAAG,KAAA,CAAA,GAAA,KAAK,GAAAA,iBAAA;IAAAE,gBAAA,GAAAL,IAAA,CACpBM,WAAW;AAAXA,IAAAA,WAAW,GAAAD,gBAAA,KAAG,KAAA,CAAA,GAAA,CAAC,GAAAA,gBAAA;IAAAE,eAAA,GAAAP,IAAA,CACfQ,UAAU;AAAVA,IAAAA,UAAU,GAAAD,eAAA,KAAG,KAAA,CAAA,GAAA,KAAK,GAAAA,eAAA;IAClBE,WAAW,GAAAT,IAAA,CAAXS,WAAW;IACXC,kBAAkB,GAAAV,IAAA,CAAlBU,kBAAkB;IAClBC,OAAO,GAAAX,IAAA,CAAPW,OAAO;AACJC,IAAAA,IAAI,GAAAC,wBAAA,CAAAb,IAAA,EAAAc,SAAA,CAAA,CAAA;AAEP,EAAA,IAAAC,SAAA,GAAkDC,QAAQ,CAACV,WAAW,CAAC;IAAAW,UAAA,GAAAC,cAAA,CAAAH,SAAA,EAAA,CAAA,CAAA;AAAhEI,IAAAA,iBAAiB,GAAAF,UAAA,CAAA,CAAA,CAAA;AAAEG,IAAAA,oBAAoB,GAAAH,UAAA,CAAA,CAAA,CAAA,CAAA;AAC9C;AACA;AACA,EAAA,IAAMI,eAAe,GAAGnB,IAAI,CAACoB,MAAM,CAAC,UAACC,GAAG,EAAA;IAAA,OAAKA,GAAG,CAACC,OAAO,CAAA;GAAC,CAAA,CAAA;AACzD,EAAA,IAAMC,UAAU,GAAGJ,eAAe,CAACK,MAAM,GAAG,CAAC,CAAA;AAC7C,EAAA,IAAMC,SAAS,GAAGC,MAAM,CAAiB,IAAI,CAAC,CAAA;AAC9C,EAAA,IAAAC,UAAA,GAAgDb,QAAQ,CAAC,KAAK,CAAC;IAAAc,UAAA,GAAAZ,cAAA,CAAAW,UAAA,EAAA,CAAA,CAAA;AAAxDE,IAAAA,gBAAgB,GAAAD,UAAA,CAAA,CAAA,CAAA;AAAEE,IAAAA,mBAAmB,GAAAF,UAAA,CAAA,CAAA,CAAA,CAAA;AAC5C,EAAA,IAAMG,GAAG,GAAGC,QAAQ,CAACD,GAAG,CAAA;AAExB,EAAA,IAAME,aAAa,GAAG,SAAhBA,aAAaA,CAAIC,KAAa,EAAa;AAC/C,IAAA,IAAIA,KAAK,GAAG,CAAC,EAAE,OAAO,CAAC,CAAA;AACvB,IAAA,IAAIA,KAAK,GAAGX,UAAU,EAAE,OAAOA,UAAU,CAAA;AACzC,IAAA,OAAOW,KAAK,CAAA;GACb,CAAA;EAED,IAAMC,SAAS,GAAG7B,UAAU,GAAG2B,aAAa,CAAC7B,WAAW,CAAC,GAAGa,iBAAiB,CAAA;AAE7E,EAAA,IAAMmB,WAAW,GAAG,SAAdA,WAAWA,CAAIF,KAAa,EAAW;IAC3CG,WAAW,CAACH,KAAK,CAAC,CAAA;IAClB,IAAI,CAAC5B,UAAU,EAAE;MACfY,oBAAoB,CAACgB,KAAK,CAAC,CAAA;AAC7B,KAAA;AACA3B,IAAAA,WAAW,IAAIA,WAAW,CAAC2B,KAAK,CAAC,CAAA;GAClC,CAAA;AAED,EAAA,IAAMI,aAAa,GAAG,SAAhBA,aAAaA,GAAS;AAC1B,IAAA,IAAI,CAACT,gBAAgB,EAAE,OAAO,KAAK,CAAA;IACnC,OAAOM,SAAS,GAAG,CAAC,CAAA;GACrB,CAAA;AAED,EAAA,IAAMI,kBAAkB,GAAG,SAArBA,kBAAkBA,GAAS;IAC/B,IAAIJ,SAAS,GAAG,CAAC,EAAE;AACjB;AACAC,MAAAA,WAAW,CAACD,SAAS,GAAG,CAAC,CAAC,CAAA;AAC5B,KAAA;GACD,CAAA;AAED,EAAA,IAAMK,cAAc,GAAG,SAAjBA,cAAcA,GAAS;IAC3B,IAAI,CAACX,gBAAgB,IAAI,CAACV,eAAe,CAACK,MAAM,EAAE,OAAO,KAAK,CAAA;IAC9D,OAAOW,SAAS,GAAGZ,UAAU,CAAA;GAC9B,CAAA;AAED,EAAA,IAAMkB,mBAAmB,GAAG,SAAtBA,mBAAmBA,GAAS;AAChC,IAAA,IAAItB,eAAe,CAACK,MAAM,IAAIW,SAAS,GAAGZ,UAAU,EAAE;AACpDa,MAAAA,WAAW,CAACD,SAAS,GAAG,CAAC,CAAC,CAAA;AAC5B,KAAA;GACD,CAAA;AAEDO,EAAAA,SAAS,CAAC,YAAM;AACdxB,IAAAA,oBAAoB,CAACe,aAAa,CAAC7B,WAAW,CAAC,CAAC,CAAA;AAClD,GAAC,EAAE,CAACA,WAAW,CAAC,CAAC,CAAA;AAEjBsC,EAAAA,SAAS,CAAC,YAAM;AACdC,IAAAA,eAAe,EAAE,CAAA;AACnB,GAAC,EAAE,CAAClB,SAAS,CAAC,CAAC,CAAA;AAEf,EAAA,IAAMkB,eAAe,GAAG,SAAlBA,eAAeA,GAAS;AAC5B,IAAA,IAAMC,EAAE,GAAGnB,SAAS,CAACoB,OAAO,CAAA;AAC5B,IAAA,IAAID,EAAE,EAAE;MACNd,mBAAmB,CAACc,EAAE,CAACE,WAAW,GAAGF,EAAE,CAACG,WAAW,CAAC,CAAA;AACtD,KAAA;GACD,CAAA;;AAED;AACAL,EAAAA,SAAS,CAAC,YAAM;AACdM,IAAAA,MAAM,CAACC,gBAAgB,CAAC,QAAQ,EAAEN,eAAe,CAAC,CAAA;AAElD,IAAA,OAAO,YAAM;AACXK,MAAAA,MAAM,CAACE,mBAAmB,CAAC,QAAQ,EAAEP,eAAe,CAAC,CAAA;KACtD,CAAA;GACF,EAAE,EAAE,CAAC,CAAA;;AAEN;AACA,EAAA,IAAMN,WAAW,GAAG,SAAdA,WAAWA,CAAIc,QAAgB,EAAK;AAAA,IAAA,IAAAC,qBAAA,CAAA;IACxC,IAAMC,SAAS,IAAAD,qBAAA,GAAGpB,QAAQ,CAACsB,aAAa,CAAAC,OAAAA,CAAAA,MAAA,CAASJ,QAAQ,CAAE,CAAC,MAAA,IAAA,IAAAC,qBAAA,KAA1CA,KAAAA,CAAAA,GAAAA,KAAAA,CAAAA,GAAAA,qBAAA,CAA4CI,qBAAqB,EAAE,CAACC,CAAC,CAAA;IAEvF,IAAMC,OAAO,GAAG1B,QAAQ,CAAC2B,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AACvDN,IAAAA,SAAS,IAAIK,OAAO,CAACE,QAAQ,CAACP,SAAS,GAAG,CAAC,GAAGA,SAAS,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;GACrE,CAAA;EAED,IAAMQ,aAAa,GAAG,SAAhBA,aAAaA,CAAIC,CAAsC,EAAE5B,KAAa,EAAK;IAC/E,IAAI4B,CAAC,CAACC,GAAG,KAAK,YAAY,IAAI7B,KAAK,GAAGX,UAAU,EAAE;AAChDa,MAAAA,WAAW,CAACF,KAAK,GAAG,CAAC,CAAC,CAAA;KACvB,MAAM,IAAI4B,CAAC,CAACC,GAAG,KAAK,WAAW,IAAI7B,KAAK,GAAG,CAAC,EAAE;AAC7CE,MAAAA,WAAW,CAACF,KAAK,GAAG,CAAC,CAAC,CAAA;AACxB,KAAA;GACD,CAAA;EAED,OACE8B,GAAA,YAAAC,QAAA,CAAA;AAASC,IAAAA,GAAG,EAAEC,SAAAA;GAAezD,EAAAA,IAAI,GAC/BsD,GAAA,CAAA,KAAA,EAAA;AAAKI,IAAAA,SAAS,EAAC,aAAa;AAACC,IAAAA,IAAI,EAAC,YAAY;AAAClB,IAAAA,QAAQ,EAAE,CAAA;AAAE,GAAA,EACxDb,aAAa,EAAE,IACd0B,GAAA,CAACM,MAAM,EAAA;AACL,IAAA,aAAA,EAAY,YAAY;AACxBC,IAAAA,OAAO,EAAC,MAAM;AACdC,IAAAA,KAAK,EAAC,WAAW;IACjBC,SAAS,EAAA,IAAA;AACTC,IAAAA,OAAO,EAAEnC,kBAAAA;AAAmB,GAAA,EAE3BR,GAAG,KAAK,KAAK,GAAGiC,GAAA,CAACW,aAAa,EAAA;AAACC,IAAAA,MAAM,EAAE,EAAA;AAAG,GAAE,CAAC,GAAGZ,GAAA,CAACa,YAAY,EAAA;AAACD,IAAAA,MAAM,EAAE,EAAA;AAAG,GAAE,CACtE,CACT,EAEDZ,GAAA,QAAAC,QAAA,CAAA;AACEC,IAAAA,GAAG,EAAE,SAALA,GAAGA,CAAGY,KAAK,EAAA;MAAA,OAAuBC,UAAU,CAACD,KAAK,EAAE;AAAE5E,QAAAA,YAAY,EAAZA,YAAAA;AAAa,OAAC,CAAC,CAAA;KAAC;AACtEmE,IAAAA,IAAI,EAAC,SAAS;AACdW,IAAAA,GAAG,EAAEvD,SAAAA;GACA,EAAA,CAAAhB,OAAO,KAAPA,IAAAA,IAAAA,OAAO,uBAAPA,OAAO,CAAEwE,GAAG,KAAI;IAAE,aAAa,EAAExE,OAAO,CAACwE,GAAAA;GAAK,CAAA,EAElD9D,eAAe,CAAC+D,GAAG,CAAC,UAAAC,KAAA,EAAgBjD,KAAK,EAAA;AAAA,IAAA,IAAlBkD,KAAK,GAAAD,KAAA,CAALC,KAAK;MAAEC,EAAE,GAAAF,KAAA,CAAFE,EAAE,CAAA;IAAA,OAC/BrB,GAAA,CAACsB,WAAW,EAAA;AACVD,MAAAA,EAAE,EAAEA,EAAG;AACPtB,MAAAA,GAAG,EAAE7B,KAAM;AACXA,MAAAA,KAAK,EAAEA,KAAM;AACbkD,MAAAA,KAAK,EAAEA,KAAM;MACbG,QAAQ,EAAEpD,SAAS,KAAKD,KAAM;AAC9BE,MAAAA,WAAW,EAAEA,WAAY;AACzBoD,MAAAA,SAAS,EAAE,SAAXA,SAASA,CAAG1B,CAAC,EAAA;AAAA,QAAA,OAAKD,aAAa,CAACC,CAAC,EAAE5B,KAAK,CAAC,CAAA;AAAA,OAAA;AAAC,KAC3C,CAAC,CAAA;AAAA,GACH,CAAC,EACD1B,kBAAkB,IAAIwD,GAAA,CAAA,KAAA,EAAA;AAAKI,IAAAA,SAAS,EAAC,sBAAA;GAAwB5D,EAAAA,kBAAwB,CACnF,CAAC,EAELgC,cAAc,EAAE,IACfwB,GAAA,CAACM,MAAM,EAAA;AACL,IAAA,aAAA,EAAY,aAAa;AACzBC,IAAAA,OAAO,EAAC,MAAM;AACdC,IAAAA,KAAK,EAAC,WAAW;IACjBC,SAAS,EAAA,IAAA;AACTC,IAAAA,OAAO,EAAEjC,mBAAAA;AAAoB,GAAA,EAE5BV,GAAG,KAAK,KAAK,GAAGiC,GAAA,CAACa,YAAY,EAAA;AAACD,IAAAA,MAAM,EAAE,EAAA;AAAG,GAAE,CAAC,GAAGZ,GAAA,CAACW,aAAa,EAAA;AAACC,IAAAA,MAAM,EAAE,EAAA;AAAG,GAAE,CACtE,CAEP,CAAC,EAENZ,GAAA,QAAAC,QAAA,CAAA;AACEoB,IAAAA,EAAE,EAAC,SAAS;AACZ,IAAA,WAAA,EAAU,QAAQ;AAClBhB,IAAAA,IAAI,EAAC,QAAA;GACA,EAAA,CAAA5D,OAAO,KAAPA,IAAAA,IAAAA,OAAO,uBAAPA,OAAO,CAAEa,OAAO,KAAI;IAAE,aAAa,EAAEb,OAAO,CAACa,OAAAA;GAAS,CAAA,EAE1DH,eAAe,CAAC+D,GAAG,CAAC,UAAAO,KAAA,EAAcvD,KAAK,EAAA;AAAA,IAAA,IAAhBZ,OAAO,GAAAmE,KAAA,CAAPnE,OAAO,CAAA;IAAA,OAC7B0C,GAAA,CAAC0B,WAAW,EAAA;AACV3B,MAAAA,GAAG,EAAE7B,KAAM;AACXA,MAAAA,KAAK,EAAEA,KAAM;AACbZ,MAAAA,OAAO,EAAEA,OAAQ;MACjBqE,SAAS,EAAExD,SAAS,KAAKD,KAAAA;AAAM,KAChC,CAAC,CAAA;GACH,CACE,CACE,CAAC,CAAA;AAEd;;;;"}
@@ -7,6 +7,7 @@ export type TabObject = {
7
7
  type TabsProps = React.HTMLAttributes<HTMLElement> & {
8
8
  stickyHeader?: boolean;
9
9
  selectedTab?: number;
10
+ controlled?: boolean;
10
11
  onChangeTab?: (index: number) => void;
11
12
  tabs: TabObject[];
12
13
  inlineEndComponent?: JSX.Element;
@@ -28,3 +28,4 @@ export { default as HubSpotSVG } from "./hubspot.svg";
28
28
  export { default as LinkedInIntegrationSVG } from "./linked-in-integration.svg";
29
29
  export { default as WorkdaySVG } from "./workday.svg";
30
30
  export { default as RipplingSVG } from "./rippling.svg";
31
+ export { default as UdemyLogoSVG } from "./udemy.svg";