@salt-ds/lab 1.0.0-alpha.10 → 1.0.0-alpha.11

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 (153) hide show
  1. package/dist-cjs/common-hooks/useKeyboardNavigation.js +0 -3
  2. package/dist-cjs/common-hooks/useKeyboardNavigation.js.map +1 -1
  3. package/dist-cjs/dialog/DialogTitle.css.js +1 -1
  4. package/dist-cjs/dialog/DialogTitle.js +2 -3
  5. package/dist-cjs/dialog/DialogTitle.js.map +1 -1
  6. package/dist-cjs/dropdown/Dropdown.js +5 -2
  7. package/dist-cjs/dropdown/Dropdown.js.map +1 -1
  8. package/dist-cjs/dropdown/useDropdown.js +12 -0
  9. package/dist-cjs/dropdown/useDropdown.js.map +1 -1
  10. package/dist-cjs/index.js +15 -1
  11. package/dist-cjs/index.js.map +1 -1
  12. package/dist-cjs/list/useList.js +0 -1
  13. package/dist-cjs/list/useList.js.map +1 -1
  14. package/dist-cjs/list-next/ListItemNext.css.js +6 -0
  15. package/dist-cjs/list-next/ListItemNext.css.js.map +1 -0
  16. package/dist-cjs/list-next/ListItemNext.js +74 -0
  17. package/dist-cjs/list-next/ListItemNext.js.map +1 -0
  18. package/dist-cjs/list-next/ListNext.css.js +6 -0
  19. package/dist-cjs/list-next/ListNext.css.js.map +1 -0
  20. package/dist-cjs/list-next/ListNext.js +92 -0
  21. package/dist-cjs/list-next/ListNext.js.map +1 -0
  22. package/dist-cjs/list-next/ListNextContext.js +18 -0
  23. package/dist-cjs/list-next/ListNextContext.js.map +1 -0
  24. package/dist-cjs/list-next/useList.js +188 -0
  25. package/dist-cjs/list-next/useList.js.map +1 -0
  26. package/dist-cjs/logo/Logo.css.js +1 -1
  27. package/dist-cjs/logo/Logo.js +4 -36
  28. package/dist-cjs/logo/Logo.js.map +1 -1
  29. package/dist-cjs/logo/LogoImage.js +24 -0
  30. package/dist-cjs/logo/LogoImage.js.map +1 -0
  31. package/dist-cjs/logo/LogoSeparator.css.js +6 -0
  32. package/dist-cjs/logo/LogoSeparator.css.js.map +1 -0
  33. package/dist-cjs/logo/LogoSeparator.js +32 -0
  34. package/dist-cjs/logo/LogoSeparator.js.map +1 -0
  35. package/dist-cjs/query-input/internal/QueryInputBody.js +5 -5
  36. package/dist-cjs/query-input/internal/QueryInputBody.js.map +1 -1
  37. package/dist-cjs/tabs-next/OverflowMenu.js +49 -0
  38. package/dist-cjs/tabs-next/OverflowMenu.js.map +1 -0
  39. package/dist-cjs/tabs-next/TabNext.css.js +6 -0
  40. package/dist-cjs/tabs-next/TabNext.css.js.map +1 -0
  41. package/dist-cjs/tabs-next/TabNext.js +87 -0
  42. package/dist-cjs/tabs-next/TabNext.js.map +1 -0
  43. package/dist-cjs/tabs-next/TabNextContext.js +23 -0
  44. package/dist-cjs/tabs-next/TabNextContext.js.map +1 -0
  45. package/dist-cjs/tabs-next/TabstripNext.css.js +6 -0
  46. package/dist-cjs/tabs-next/TabstripNext.css.js.map +1 -0
  47. package/dist-cjs/tabs-next/TabstripNext.js +180 -0
  48. package/dist-cjs/tabs-next/TabstripNext.js.map +1 -0
  49. package/dist-cjs/toggle-button/ToggleButton.css.js +1 -1
  50. package/dist-cjs/toggle-button/ToggleButton.js +44 -74
  51. package/dist-cjs/toggle-button/ToggleButton.js.map +1 -1
  52. package/dist-cjs/toggle-button-group/ToggleButtonGroup.css.js +6 -0
  53. package/dist-cjs/toggle-button-group/ToggleButtonGroup.js +111 -0
  54. package/dist-cjs/toggle-button-group/ToggleButtonGroup.js.map +1 -0
  55. package/dist-cjs/toggle-button-group/ToggleButtonGroupContext.js +15 -0
  56. package/dist-cjs/toggle-button-group/ToggleButtonGroupContext.js.map +1 -0
  57. package/dist-es/common-hooks/useKeyboardNavigation.js +0 -3
  58. package/dist-es/common-hooks/useKeyboardNavigation.js.map +1 -1
  59. package/dist-es/dialog/DialogTitle.css.js +1 -1
  60. package/dist-es/dialog/DialogTitle.js +3 -4
  61. package/dist-es/dialog/DialogTitle.js.map +1 -1
  62. package/dist-es/dropdown/Dropdown.js +5 -2
  63. package/dist-es/dropdown/Dropdown.js.map +1 -1
  64. package/dist-es/dropdown/useDropdown.js +12 -0
  65. package/dist-es/dropdown/useDropdown.js.map +1 -1
  66. package/dist-es/index.js +8 -1
  67. package/dist-es/index.js.map +1 -1
  68. package/dist-es/list/useList.js +0 -1
  69. package/dist-es/list/useList.js.map +1 -1
  70. package/dist-es/list-next/ListItemNext.css.js +4 -0
  71. package/dist-es/list-next/ListItemNext.css.js.map +1 -0
  72. package/dist-es/list-next/ListItemNext.js +70 -0
  73. package/dist-es/list-next/ListItemNext.js.map +1 -0
  74. package/dist-es/list-next/ListNext.css.js +4 -0
  75. package/dist-es/list-next/ListNext.css.js.map +1 -0
  76. package/dist-es/list-next/ListNext.js +88 -0
  77. package/dist-es/list-next/ListNext.js.map +1 -0
  78. package/dist-es/list-next/ListNextContext.js +13 -0
  79. package/dist-es/list-next/ListNextContext.js.map +1 -0
  80. package/dist-es/list-next/useList.js +184 -0
  81. package/dist-es/list-next/useList.js.map +1 -0
  82. package/dist-es/logo/Logo.css.js +1 -1
  83. package/dist-es/logo/Logo.js +5 -37
  84. package/dist-es/logo/Logo.js.map +1 -1
  85. package/dist-es/logo/LogoImage.js +20 -0
  86. package/dist-es/logo/LogoImage.js.map +1 -0
  87. package/dist-es/logo/LogoSeparator.css.js +4 -0
  88. package/dist-es/logo/LogoSeparator.css.js.map +1 -0
  89. package/dist-es/logo/LogoSeparator.js +28 -0
  90. package/dist-es/logo/LogoSeparator.js.map +1 -0
  91. package/dist-es/query-input/internal/QueryInputBody.js +5 -5
  92. package/dist-es/query-input/internal/QueryInputBody.js.map +1 -1
  93. package/dist-es/tabs-next/OverflowMenu.js +45 -0
  94. package/dist-es/tabs-next/OverflowMenu.js.map +1 -0
  95. package/dist-es/tabs-next/TabNext.css.js +4 -0
  96. package/dist-es/tabs-next/TabNext.css.js.map +1 -0
  97. package/dist-es/tabs-next/TabNext.js +79 -0
  98. package/dist-es/tabs-next/TabNext.js.map +1 -0
  99. package/dist-es/tabs-next/TabNextContext.js +18 -0
  100. package/dist-es/tabs-next/TabNextContext.js.map +1 -0
  101. package/dist-es/tabs-next/TabstripNext.css.js +4 -0
  102. package/dist-es/tabs-next/TabstripNext.css.js.map +1 -0
  103. package/dist-es/tabs-next/TabstripNext.js +172 -0
  104. package/dist-es/tabs-next/TabstripNext.js.map +1 -0
  105. package/dist-es/toggle-button/ToggleButton.css.js +1 -1
  106. package/dist-es/toggle-button/ToggleButton.js +45 -75
  107. package/dist-es/toggle-button/ToggleButton.js.map +1 -1
  108. package/dist-es/toggle-button-group/ToggleButtonGroup.css.js +4 -0
  109. package/dist-es/toggle-button-group/ToggleButtonGroup.js +107 -0
  110. package/dist-es/toggle-button-group/ToggleButtonGroup.js.map +1 -0
  111. package/dist-es/toggle-button-group/ToggleButtonGroupContext.js +10 -0
  112. package/dist-es/toggle-button-group/ToggleButtonGroupContext.js.map +1 -0
  113. package/dist-types/dropdown/useDropdown.d.ts +1 -1
  114. package/dist-types/index.d.ts +3 -0
  115. package/dist-types/list-next/ListItemNext.d.ts +11 -0
  116. package/dist-types/list-next/ListNext.d.ts +10 -0
  117. package/dist-types/list-next/ListNextContext.d.ts +10 -0
  118. package/dist-types/list-next/index.d.ts +2 -0
  119. package/dist-types/list-next/useList.d.ts +29 -0
  120. package/dist-types/logo/Logo.d.ts +3 -31
  121. package/dist-types/logo/LogoImage.d.ts +5 -0
  122. package/dist-types/logo/LogoSeparator.d.ts +3 -0
  123. package/dist-types/logo/index.d.ts +2 -0
  124. package/dist-types/tabs-next/OverflowMenu.d.ts +11 -0
  125. package/dist-types/tabs-next/TabNext.d.ts +5 -0
  126. package/dist-types/tabs-next/TabNextContext.d.ts +17 -0
  127. package/dist-types/tabs-next/TabstripNext.d.ts +10 -0
  128. package/dist-types/tabs-next/index.d.ts +2 -0
  129. package/dist-types/toggle-button/ToggleButton.d.ts +6 -11
  130. package/dist-types/toggle-button/index.d.ts +0 -1
  131. package/dist-types/toggle-button-group/ToggleButtonGroup.d.ts +25 -0
  132. package/dist-types/toggle-button-group/ToggleButtonGroupContext.d.ts +10 -0
  133. package/dist-types/toggle-button-group/index.d.ts +2 -0
  134. package/package.json +6 -4
  135. package/dist-cjs/logo/internal/LogoTitle.js +0 -28
  136. package/dist-cjs/logo/internal/LogoTitle.js.map +0 -1
  137. package/dist-cjs/toggle-button/ToggleButtonGroup.css.js +0 -6
  138. package/dist-cjs/toggle-button/ToggleButtonGroup.js +0 -147
  139. package/dist-cjs/toggle-button/ToggleButtonGroup.js.map +0 -1
  140. package/dist-cjs/toggle-button/internal/ToggleButtonGroupContext.js +0 -10
  141. package/dist-cjs/toggle-button/internal/ToggleButtonGroupContext.js.map +0 -1
  142. package/dist-es/logo/internal/LogoTitle.js +0 -24
  143. package/dist-es/logo/internal/LogoTitle.js.map +0 -1
  144. package/dist-es/toggle-button/ToggleButtonGroup.css.js +0 -4
  145. package/dist-es/toggle-button/ToggleButtonGroup.js +0 -143
  146. package/dist-es/toggle-button/ToggleButtonGroup.js.map +0 -1
  147. package/dist-es/toggle-button/internal/ToggleButtonGroupContext.js +0 -6
  148. package/dist-es/toggle-button/internal/ToggleButtonGroupContext.js.map +0 -1
  149. package/dist-types/logo/internal/LogoTitle.d.ts +0 -6
  150. package/dist-types/toggle-button/ToggleButtonGroup.d.ts +0 -18
  151. package/dist-types/toggle-button/internal/ToggleButtonGroupContext.d.ts +0 -14
  152. /package/dist-cjs/{toggle-button → toggle-button-group}/ToggleButtonGroup.css.js.map +0 -0
  153. /package/dist-es/{toggle-button → toggle-button-group}/ToggleButtonGroup.css.js.map +0 -0
@@ -0,0 +1,6 @@
1
+ 'use strict';
2
+
3
+ var css_248z = "/* Class applied to root Tab element */\n.saltTabNext {\n align-items: center;\n justify-content: center;\n appearance: none;\n display: inline-flex;\n background: var(--salt-navigable-primary-background);\n border: 0 solid transparent;\n border-radius: 0;\n white-space: pre;\n min-width: 4em;\n min-height: calc(var(--salt-size-base) + var(--salt-spacing-100));\n padding-inline: var(--salt-spacing-100);\n padding-block: var(--salt-spacing-50);\n position: relative;\n flex-shrink: 0;\n\n color: var(--salt-text-secondary-foreground);\n font-weight: var(--salt-navigable-fontWeight);\n font-family: var(--salt-text-fontFamily);\n text-align: var(--salt-text-textAlign);\n letter-spacing: var(--salt-text-letterSpacing);\n line-height: var(--salt-text-lineHeight);\n font-size: var(--salt-text-fontSize);\n}\n\n.saltTabNext:hover {\n cursor: var(--salt-navigable-cursor-hover);\n background: var(--salt-navigable-primary-background-hover);\n color: var(--salt-text-primary-foreground);\n}\n\n.saltTabNext:hover::before,\n.saltTabNext:focus-visible::before {\n content: \"\";\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n height: var(--salt-size-bar);\n background: var(--salt-navigable-indicator-hover);\n}\n\n.saltTabNext:focus-visible {\n outline: var(--salt-focused-outline);\n background: var(--salt-navigable-primary-background-hover);\n color: var(--salt-text-primary-foreground);\n}\n\n.saltTabNext[aria-selected=\"true\"] {\n color: var(--salt-text-primary-foreground);\n}\n\n.saltTabNext[aria-selected=\"true\"]::after {\n content: \"\";\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n height: var(--salt-size-bar);\n background: var(--salt-navigable-indicator-active);\n}\n\n.saltTabNext:disabled {\n cursor: var(--salt-navigable-cursor-disabled);\n color: var(--salt-text-primary-foreground-disabled);\n background: var(--salt-navigable-primary-background);\n}\n\n.saltTabNext:disabled:before {\n background: transparent;\n}\n";
4
+
5
+ module.exports = css_248z;
6
+ //# sourceMappingURL=TabNext.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabNext.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,87 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+ var core = require('@salt-ds/core');
7
+ var React = require('react');
8
+ var styles = require('@salt-ds/styles');
9
+ var window = require('@salt-ds/window');
10
+ var TabNext$1 = require('./TabNext.css.js');
11
+ var clsx = require('clsx');
12
+ var reactOverflow = require('@fluentui/react-overflow');
13
+ var TabNextContext = require('./TabNextContext.js');
14
+
15
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
16
+
17
+ var clsx__default = /*#__PURE__*/_interopDefaultLegacy(clsx);
18
+
19
+ const withBaseName = core.makePrefixer("saltTabNext");
20
+ const TabNext = React.forwardRef(function Tab(props, ref) {
21
+ const {
22
+ children,
23
+ className,
24
+ disabled: disabledProp,
25
+ onClick,
26
+ onFocus,
27
+ value,
28
+ ...rest
29
+ } = props;
30
+ const targetWindow = window.useWindow();
31
+ styles.useComponentCssInjection({
32
+ testId: "salt-tab-next",
33
+ css: TabNext$1,
34
+ window: targetWindow
35
+ });
36
+ const {
37
+ isSelected,
38
+ select,
39
+ isFocusable,
40
+ setFocusable,
41
+ disabled: tabstripDisabled,
42
+ unregisterTab,
43
+ registerTab
44
+ } = TabNextContext.useTabs();
45
+ const selected = isSelected(value);
46
+ const focusable = isFocusable(value);
47
+ const disabled = tabstripDisabled || disabledProp;
48
+ const handleClick = (event) => {
49
+ select(event);
50
+ onClick == null ? void 0 : onClick(event);
51
+ };
52
+ const handleFocus = (event) => {
53
+ setFocusable(value);
54
+ onFocus == null ? void 0 : onFocus(event);
55
+ };
56
+ React.useEffect(() => {
57
+ registerTab({ value, label: children });
58
+ return () => unregisterTab(value);
59
+ }, [children, registerTab, unregisterTab, value]);
60
+ return /* @__PURE__ */ jsxRuntime.jsx(reactOverflow.OverflowItem, {
61
+ id: value,
62
+ priority: selected ? 2 : 1,
63
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", {
64
+ className: withBaseName("wrapper"),
65
+ children: /* @__PURE__ */ jsxRuntime.jsx("button", {
66
+ className: clsx__default["default"](withBaseName(), className),
67
+ "data-value": value,
68
+ "aria-selected": selected,
69
+ disabled,
70
+ value,
71
+ ref,
72
+ role: "tab",
73
+ onClick: handleClick,
74
+ onFocus: handleFocus,
75
+ tabIndex: focusable && !disabled ? 0 : -1,
76
+ ...rest,
77
+ children: /* @__PURE__ */ jsxRuntime.jsx("span", {
78
+ className: withBaseName("label"),
79
+ children
80
+ })
81
+ })
82
+ })
83
+ });
84
+ });
85
+
86
+ exports.TabNext = TabNext;
87
+ //# sourceMappingURL=TabNext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabNext.js","sources":["../src/tabs-next/TabNext.tsx"],"sourcesContent":["import { makePrefixer } from \"@salt-ds/core\";\nimport {\n forwardRef,\n ReactElement,\n ComponentPropsWithoutRef,\n MouseEvent,\n FocusEvent,\n useEffect,\n} from \"react\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\n\nimport tabCss from \"./TabNext.css\";\nimport clsx from \"clsx\";\nimport { OverflowItem } from \"@fluentui/react-overflow\";\nimport { useTabs } from \"./TabNextContext\";\n\nconst withBaseName = makePrefixer(\"saltTabNext\");\n\nexport interface TabNextProps extends ComponentPropsWithoutRef<\"button\"> {\n /* Value prop is mandatory and must be unique in order for overflow to work. */\n value: string;\n}\n\nexport const TabNext = forwardRef<HTMLButtonElement, TabNextProps>(function Tab(\n props,\n ref\n): ReactElement<TabNextProps> {\n const {\n children,\n className,\n disabled: disabledProp,\n onClick,\n onFocus,\n value,\n ...rest\n } = props;\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-tab-next\",\n css: tabCss,\n window: targetWindow,\n });\n const {\n isSelected,\n select,\n isFocusable,\n setFocusable,\n disabled: tabstripDisabled,\n unregisterTab,\n registerTab,\n } = useTabs();\n const selected = isSelected(value);\n const focusable = isFocusable(value);\n const disabled = tabstripDisabled || disabledProp;\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n select(event);\n onClick?.(event);\n };\n\n const handleFocus = (event: FocusEvent<HTMLButtonElement>) => {\n setFocusable(value);\n onFocus?.(event);\n };\n\n useEffect(() => {\n registerTab({ value, label: children });\n return () => unregisterTab(value);\n }, [children, registerTab, unregisterTab, value]);\n\n return (\n <OverflowItem id={value} priority={selected ? 2 : 1}>\n <div className={withBaseName(\"wrapper\")}>\n <button\n className={clsx(withBaseName(), className)}\n data-value={value}\n aria-selected={selected}\n disabled={disabled}\n value={value}\n ref={ref}\n role=\"tab\"\n onClick={handleClick}\n onFocus={handleFocus}\n tabIndex={focusable && !disabled ? 0 : -1}\n {...rest}\n >\n <span className={withBaseName(\"label\")}>{children}</span>\n </button>\n </div>\n </OverflowItem>\n );\n});\n"],"names":["makePrefixer","forwardRef","useWindow","useComponentCssInjection","tabCss","useTabs","useEffect","jsx","OverflowItem","clsx"],"mappings":";;;;;;;;;;;;;;;;;;AAiBA,MAAM,YAAA,GAAeA,kBAAa,aAAa,CAAA,CAAA;AAOxC,MAAM,OAAU,GAAAC,gBAAA,CAA4C,SAAS,GAAA,CAC1E,OACA,GAC4B,EAAA;AAC5B,EAAM,MAAA;AAAA,IACJ,QAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAU,EAAA,YAAA;AAAA,IACV,OAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACG,GAAA,IAAA;AAAA,GACD,GAAA,KAAA,CAAA;AACJ,EAAA,MAAM,eAAeC,gBAAU,EAAA,CAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,eAAA;AAAA,IACR,GAAK,EAAAC,SAAA;AAAA,IACL,MAAQ,EAAA,YAAA;AAAA,GACT,CAAA,CAAA;AACD,EAAM,MAAA;AAAA,IACJ,UAAA;AAAA,IACA,MAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,QAAU,EAAA,gBAAA;AAAA,IACV,aAAA;AAAA,IACA,WAAA;AAAA,MACEC,sBAAQ,EAAA,CAAA;AACZ,EAAM,MAAA,QAAA,GAAW,WAAW,KAAK,CAAA,CAAA;AACjC,EAAM,MAAA,SAAA,GAAY,YAAY,KAAK,CAAA,CAAA;AACnC,EAAA,MAAM,WAAW,gBAAoB,IAAA,YAAA,CAAA;AAErC,EAAM,MAAA,WAAA,GAAc,CAAC,KAAyC,KAAA;AAC5D,IAAA,MAAA,CAAO,KAAK,CAAA,CAAA;AACZ,IAAU,OAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,OAAA,CAAA,KAAA,CAAA,CAAA;AAAA,GACZ,CAAA;AAEA,EAAM,MAAA,WAAA,GAAc,CAAC,KAAyC,KAAA;AAC5D,IAAA,YAAA,CAAa,KAAK,CAAA,CAAA;AAClB,IAAU,OAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,OAAA,CAAA,KAAA,CAAA,CAAA;AAAA,GACZ,CAAA;AAEA,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,WAAA,CAAY,EAAE,KAAA,EAAO,KAAO,EAAA,QAAA,EAAU,CAAA,CAAA;AACtC,IAAO,OAAA,MAAM,cAAc,KAAK,CAAA,CAAA;AAAA,KAC/B,CAAC,QAAA,EAAU,WAAa,EAAA,aAAA,EAAe,KAAK,CAAC,CAAA,CAAA;AAEhD,EAAA,uBACGC,cAAA,CAAAC,0BAAA,EAAA;AAAA,IAAa,EAAI,EAAA,KAAA;AAAA,IAAO,QAAA,EAAU,WAAW,CAAI,GAAA,CAAA;AAAA,IAChD,QAAC,kBAAAD,cAAA,CAAA,KAAA,EAAA;AAAA,MAAI,SAAA,EAAW,aAAa,SAAS,CAAA;AAAA,MACpC,QAAC,kBAAAA,cAAA,CAAA,QAAA,EAAA;AAAA,QACC,SAAW,EAAAE,wBAAA,CAAK,YAAa,EAAA,EAAG,SAAS,CAAA;AAAA,QACzC,YAAY,EAAA,KAAA;AAAA,QACZ,eAAe,EAAA,QAAA;AAAA,QACf,QAAA;AAAA,QACA,KAAA;AAAA,QACA,GAAA;AAAA,QACA,IAAK,EAAA,KAAA;AAAA,QACL,OAAS,EAAA,WAAA;AAAA,QACT,OAAS,EAAA,WAAA;AAAA,QACT,QAAU,EAAA,SAAA,IAAa,CAAC,QAAA,GAAW,CAAI,GAAA,CAAA,CAAA;AAAA,QACtC,GAAG,IAAA;AAAA,QAEJ,QAAC,kBAAAF,cAAA,CAAA,MAAA,EAAA;AAAA,UAAK,SAAA,EAAW,aAAa,OAAO,CAAA;AAAA,UAAI,QAAA;AAAA,SAAS,CAAA;AAAA,OACpD,CAAA;AAAA,KACF,CAAA;AAAA,GACF,CAAA,CAAA;AAEJ,CAAC;;;;"}
@@ -0,0 +1,23 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var core = require('@salt-ds/core');
6
+ var React = require('react');
7
+
8
+ const TabsContext = core.createContext("TabsContext", {
9
+ disabled: false,
10
+ select: () => void 0,
11
+ isSelected: () => false,
12
+ setFocusable: () => void 0,
13
+ isFocusable: () => false,
14
+ registerTab: () => void 0,
15
+ unregisterTab: () => void 0
16
+ });
17
+ function useTabs() {
18
+ return React.useContext(TabsContext);
19
+ }
20
+
21
+ exports.TabsContext = TabsContext;
22
+ exports.useTabs = useTabs;
23
+ //# sourceMappingURL=TabNextContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabNextContext.js","sources":["../src/tabs-next/TabNextContext.tsx"],"sourcesContent":["import { createContext } from \"@salt-ds/core\";\nimport { ReactNode, SyntheticEvent, useContext } from \"react\";\n\ntype TabValue = {\n value: string;\n label: ReactNode;\n};\n\nexport interface TabsContextValue {\n disabled?: boolean;\n select: (event: SyntheticEvent<HTMLButtonElement>) => void;\n isSelected: (id: string) => boolean;\n setFocusable: (id: string) => void;\n isFocusable: (id: string) => boolean;\n registerTab: (tab: TabValue) => void;\n unregisterTab: (id: string) => void;\n}\n\nexport const TabsContext = createContext<TabsContextValue>(\"TabsContext\", {\n disabled: false,\n select: () => undefined,\n isSelected: () => false,\n setFocusable: () => undefined,\n isFocusable: () => false,\n registerTab: () => undefined,\n unregisterTab: () => undefined,\n});\n\nexport function useTabs() {\n return useContext(TabsContext);\n}\n"],"names":["createContext","useContext"],"mappings":";;;;;;;AAkBa,MAAA,WAAA,GAAcA,mBAAgC,aAAe,EAAA;AAAA,EACxE,QAAU,EAAA,KAAA;AAAA,EACV,QAAQ,MAAM,KAAA,CAAA;AAAA,EACd,YAAY,MAAM,KAAA;AAAA,EAClB,cAAc,MAAM,KAAA,CAAA;AAAA,EACpB,aAAa,MAAM,KAAA;AAAA,EACnB,aAAa,MAAM,KAAA,CAAA;AAAA,EACnB,eAAe,MAAM,KAAA,CAAA;AACvB,CAAC,EAAA;AAEM,SAAS,OAAU,GAAA;AACxB,EAAA,OAAOC,iBAAW,WAAW,CAAA,CAAA;AAC/B;;;;;"}
@@ -0,0 +1,6 @@
1
+ 'use strict';
2
+
3
+ var css_248z = "/* Component class applied to the root element */\n.saltTabstripNext {\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n position: relative;\n background: transparent;\n width: 100%;\n}\n\n.saltTabstripNext::before {\n content: \"\";\n position: absolute;\n inset: auto 0 0 0;\n height: var(--salt-size-border);\n background: var(--salt-container-primary-borderColor);\n}\n\n.saltTabstripNext .saltTabNext-wrapper {\n padding-right: var(--salt-spacing-50);\n}\n";
4
+
5
+ module.exports = css_248z;
6
+ //# sourceMappingURL=TabstripNext.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabstripNext.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,180 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+ var core = require('@salt-ds/core');
7
+ var clsx = require('clsx');
8
+ var React = require('react');
9
+ var styles = require('@salt-ds/styles');
10
+ var window = require('@salt-ds/window');
11
+ var reactOverflow = require('@fluentui/react-overflow');
12
+ var OverflowMenu = require('./OverflowMenu.js');
13
+ var TabstripNext$1 = require('./TabstripNext.css.js');
14
+ var TabNextContext = require('./TabNextContext.js');
15
+
16
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
17
+
18
+ var clsx__default = /*#__PURE__*/_interopDefaultLegacy(clsx);
19
+
20
+ const withBaseName = core.makePrefixer("saltTabstripNext");
21
+ const TabstripNext = React.forwardRef(
22
+ function TabstripNext2(props, ref) {
23
+ const {
24
+ children,
25
+ className,
26
+ disabled,
27
+ selected: selectedProp,
28
+ defaultSelected,
29
+ onChange,
30
+ onKeyDown,
31
+ ...rest
32
+ } = props;
33
+ const targetWindow = window.useWindow();
34
+ styles.useComponentCssInjection({
35
+ testId: "salt-tabstrip-next",
36
+ css: TabstripNext$1,
37
+ window: targetWindow
38
+ });
39
+ const tabstripRef = React.useRef(null);
40
+ const handleRef = core.useForkRef(tabstripRef, ref);
41
+ const [selected, setSelected] = core.useControlled({
42
+ controlled: selectedProp,
43
+ default: defaultSelected,
44
+ name: "TabstripNext",
45
+ state: "selected"
46
+ });
47
+ const [focusable, setFocusableState] = React.useState(
48
+ selected
49
+ );
50
+ const [overflowOpen, setOverflowOpen] = React.useState(false);
51
+ const select = React.useCallback(
52
+ (event) => {
53
+ const newValue = event.currentTarget.value;
54
+ setSelected(newValue);
55
+ if (selected !== newValue) {
56
+ onChange == null ? void 0 : onChange(event, { value: newValue });
57
+ }
58
+ },
59
+ [onChange, selected, setSelected]
60
+ );
61
+ const isSelected = React.useCallback(
62
+ (id) => {
63
+ return selected === id;
64
+ },
65
+ [selected]
66
+ );
67
+ const setFocusable = React.useCallback((id) => {
68
+ setFocusableState(id);
69
+ }, []);
70
+ const isFocusable = React.useCallback(
71
+ (id) => {
72
+ return focusable === id || !focusable;
73
+ },
74
+ [focusable]
75
+ );
76
+ const [tabList, setTabList] = React.useState([]);
77
+ const registerTab = React.useCallback((tab) => {
78
+ setTabList((list) => list.concat([tab]));
79
+ }, []);
80
+ const unregisterTab = React.useCallback((id) => {
81
+ setTabList((list) => list.filter((item) => item.value !== id));
82
+ }, []);
83
+ const handleKeyDown = (event) => {
84
+ var _a, _b, _c, _d, _e, _f;
85
+ if (overflowOpen)
86
+ return;
87
+ const elements = Array.from(
88
+ (_b = (_a = tabstripRef.current) == null ? void 0 : _a.querySelectorAll(
89
+ `div:not([data-overflowing]) > [role="tab"]:not([disabled])`
90
+ )) != null ? _b : []
91
+ );
92
+ const currentIndex = elements.findIndex(
93
+ (element) => element === (targetWindow == null ? void 0 : targetWindow.document.activeElement)
94
+ );
95
+ if (currentIndex < 0)
96
+ return;
97
+ switch (event.key) {
98
+ case "ArrowDown":
99
+ case "ArrowRight":
100
+ (_c = elements[Math.min(currentIndex + 1, elements.length)]) == null ? void 0 : _c.focus();
101
+ break;
102
+ case "ArrowUp":
103
+ case "ArrowLeft":
104
+ (_d = elements[Math.max(0, currentIndex - 1)]) == null ? void 0 : _d.focus();
105
+ break;
106
+ case "Home":
107
+ (_e = elements[0]) == null ? void 0 : _e.focus();
108
+ break;
109
+ case "End":
110
+ (_f = elements[elements.length - 1]) == null ? void 0 : _f.focus();
111
+ }
112
+ onKeyDown == null ? void 0 : onKeyDown(event);
113
+ };
114
+ const handleOverflowItemClick = (event, item) => {
115
+ if (item) {
116
+ setSelected(item.value);
117
+ requestAnimationFrame(() => {
118
+ var _a;
119
+ const element = (_a = tabstripRef.current) == null ? void 0 : _a.querySelector(
120
+ `[value="${item.value}"]`
121
+ );
122
+ if (element instanceof HTMLElement) {
123
+ element == null ? void 0 : element.focus();
124
+ }
125
+ });
126
+ if (selected !== item.value) {
127
+ onChange == null ? void 0 : onChange(event, { value: item.value });
128
+ }
129
+ }
130
+ };
131
+ const handleOverflowOpenChange = (isOpen) => {
132
+ setOverflowOpen(isOpen);
133
+ };
134
+ const value = React.useMemo(
135
+ () => ({
136
+ select,
137
+ isSelected,
138
+ setFocusable,
139
+ isFocusable,
140
+ registerTab,
141
+ unregisterTab
142
+ }),
143
+ [
144
+ select,
145
+ isSelected,
146
+ setFocusable,
147
+ isFocusable,
148
+ registerTab,
149
+ unregisterTab
150
+ ]
151
+ );
152
+ return /* @__PURE__ */ jsxRuntime.jsx(TabNextContext.TabsContext.Provider, {
153
+ value,
154
+ children: /* @__PURE__ */ jsxRuntime.jsx(reactOverflow.Overflow, {
155
+ ref: handleRef,
156
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", {
157
+ role: "tablist",
158
+ className: clsx__default["default"](
159
+ withBaseName(),
160
+ withBaseName("horizontal"),
161
+ className
162
+ ),
163
+ onKeyDown: handleKeyDown,
164
+ ...rest,
165
+ children: [
166
+ children,
167
+ /* @__PURE__ */ jsxRuntime.jsx(OverflowMenu.OverflowMenu, {
168
+ tabs: tabList,
169
+ onOpenChange: handleOverflowOpenChange,
170
+ onSelectionChange: handleOverflowItemClick
171
+ })
172
+ ]
173
+ })
174
+ })
175
+ });
176
+ }
177
+ );
178
+
179
+ exports.TabstripNext = TabstripNext;
180
+ //# sourceMappingURL=TabstripNext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabstripNext.js","sources":["../src/tabs-next/TabstripNext.tsx"],"sourcesContent":["import { makePrefixer, useControlled, useForkRef } from \"@salt-ds/core\";\nimport clsx from \"clsx\";\nimport {\n ComponentPropsWithoutRef,\n forwardRef,\n ReactNode,\n SyntheticEvent,\n KeyboardEvent,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { Overflow } from \"@fluentui/react-overflow\";\nimport { OverflowMenu } from \"./OverflowMenu\";\nimport tabstripCss from \"./TabstripNext.css\";\nimport { TabsContext } from \"./TabNextContext\";\nimport { SelectionChangeHandler } from \"../common-hooks\";\n\nconst withBaseName = makePrefixer(\"saltTabstripNext\");\n\nexport interface TabstripNextProps\n extends Omit<ComponentPropsWithoutRef<\"div\">, \"onChange\"> {\n disabled?: boolean;\n /* Value for the uncontrolled version. */\n selected?: string;\n /* Callback for the controlled version. */\n onChange?: (e: SyntheticEvent, data: { value: string }) => void;\n /* Initial value for the uncontrolled version. */\n defaultSelected?: string;\n}\n\ntype TabValue = {\n value: string;\n label: ReactNode;\n};\n\nexport const TabstripNext = forwardRef<HTMLDivElement, TabstripNextProps>(\n function TabstripNext(props, ref) {\n const {\n children,\n className,\n disabled,\n selected: selectedProp,\n defaultSelected,\n onChange,\n onKeyDown,\n ...rest\n } = props;\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-tabstrip-next\",\n css: tabstripCss,\n window: targetWindow,\n });\n\n const tabstripRef = useRef<HTMLDivElement>(null);\n const handleRef = useForkRef(tabstripRef, ref);\n\n const [selected, setSelected] = useControlled({\n controlled: selectedProp,\n default: defaultSelected,\n name: \"TabstripNext\",\n state: \"selected\",\n });\n const [focusable, setFocusableState] = useState<string | undefined>(\n selected\n );\n const [overflowOpen, setOverflowOpen] = useState(false);\n\n const select = useCallback(\n (event: SyntheticEvent<HTMLButtonElement>) => {\n const newValue = event.currentTarget.value;\n setSelected(newValue);\n if (selected !== newValue) {\n onChange?.(event, { value: newValue });\n }\n },\n [onChange, selected, setSelected]\n );\n\n const isSelected = useCallback(\n (id: string | undefined) => {\n return selected === id;\n },\n [selected]\n );\n\n const setFocusable = useCallback((id: string | undefined) => {\n setFocusableState(id);\n }, []);\n\n const isFocusable = useCallback(\n (id: string | undefined) => {\n return focusable === id || !focusable;\n },\n [focusable]\n );\n\n const [tabList, setTabList] = useState<TabValue[]>([]);\n const registerTab = useCallback((tab: TabValue) => {\n setTabList((list) => list.concat([tab]));\n }, []);\n\n const unregisterTab = useCallback((id: string) => {\n setTabList((list) => list.filter((item) => item.value !== id));\n }, []);\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (overflowOpen) return;\n\n const elements: HTMLElement[] = Array.from(\n tabstripRef.current?.querySelectorAll(\n `div:not([data-overflowing]) > [role=\"tab\"]:not([disabled])`\n ) ?? []\n );\n\n const currentIndex = elements.findIndex(\n (element) => element === targetWindow?.document.activeElement\n );\n\n if (currentIndex < 0) return;\n\n switch (event.key) {\n case \"ArrowDown\":\n case \"ArrowRight\":\n elements[Math.min(currentIndex + 1, elements.length)]?.focus();\n break;\n case \"ArrowUp\":\n case \"ArrowLeft\":\n elements[Math.max(0, currentIndex - 1)]?.focus();\n break;\n case \"Home\":\n elements[0]?.focus();\n break;\n case \"End\":\n elements[elements.length - 1]?.focus();\n }\n\n onKeyDown?.(event);\n };\n\n const handleOverflowItemClick: SelectionChangeHandler<TabValue> = (\n event,\n item\n ) => {\n if (item) {\n setSelected(item.value);\n requestAnimationFrame(() => {\n const element = tabstripRef.current?.querySelector(\n `[value=\"${item.value}\"]`\n );\n if (element instanceof HTMLElement) {\n element?.focus();\n }\n });\n if (selected !== item.value) {\n onChange?.(event, { value: item.value });\n }\n }\n };\n\n const handleOverflowOpenChange = (isOpen: boolean) => {\n setOverflowOpen(isOpen);\n };\n\n const value = useMemo(\n () => ({\n select,\n isSelected,\n setFocusable,\n isFocusable,\n registerTab,\n unregisterTab,\n }),\n [\n select,\n isSelected,\n setFocusable,\n isFocusable,\n registerTab,\n unregisterTab,\n ]\n );\n\n return (\n <TabsContext.Provider value={value}>\n <Overflow ref={handleRef}>\n <div\n role=\"tablist\"\n className={clsx(\n withBaseName(),\n withBaseName(\"horizontal\"),\n className\n )}\n onKeyDown={handleKeyDown}\n {...rest}\n >\n {children}\n <OverflowMenu\n tabs={tabList}\n onOpenChange={handleOverflowOpenChange}\n onSelectionChange={handleOverflowItemClick}\n />\n </div>\n </Overflow>\n </TabsContext.Provider>\n );\n }\n);\n"],"names":["makePrefixer","forwardRef","TabstripNext","useWindow","useComponentCssInjection","tabstripCss","useRef","useForkRef","useControlled","useState","useCallback","useMemo","jsx","TabsContext","Overflow","jsxs","clsx","OverflowMenu"],"mappings":";;;;;;;;;;;;;;;;;;;AAqBA,MAAM,YAAA,GAAeA,kBAAa,kBAAkB,CAAA,CAAA;AAkB7C,MAAM,YAAe,GAAAC,gBAAA;AAAA,EAC1B,SAASC,aAAa,CAAA,KAAA,EAAO,GAAK,EAAA;AAChC,IAAM,MAAA;AAAA,MACJ,QAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAU,EAAA,YAAA;AAAA,MACV,eAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACG,GAAA,IAAA;AAAA,KACD,GAAA,KAAA,CAAA;AACJ,IAAA,MAAM,eAAeC,gBAAU,EAAA,CAAA;AAC/B,IAAyBC,+BAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,oBAAA;AAAA,MACR,GAAK,EAAAC,cAAA;AAAA,MACL,MAAQ,EAAA,YAAA;AAAA,KACT,CAAA,CAAA;AAED,IAAM,MAAA,WAAA,GAAcC,aAAuB,IAAI,CAAA,CAAA;AAC/C,IAAM,MAAA,SAAA,GAAYC,eAAW,CAAA,WAAA,EAAa,GAAG,CAAA,CAAA;AAE7C,IAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIC,kBAAc,CAAA;AAAA,MAC5C,UAAY,EAAA,YAAA;AAAA,MACZ,OAAS,EAAA,eAAA;AAAA,MACT,IAAM,EAAA,cAAA;AAAA,MACN,KAAO,EAAA,UAAA;AAAA,KACR,CAAA,CAAA;AACD,IAAM,MAAA,CAAC,SAAW,EAAA,iBAAiB,CAAI,GAAAC,cAAA;AAAA,MACrC,QAAA;AAAA,KACF,CAAA;AACA,IAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAS,KAAK,CAAA,CAAA;AAEtD,IAAA,MAAM,MAAS,GAAAC,iBAAA;AAAA,MACb,CAAC,KAA6C,KAAA;AAC5C,QAAM,MAAA,QAAA,GAAW,MAAM,aAAc,CAAA,KAAA,CAAA;AACrC,QAAA,WAAA,CAAY,QAAQ,CAAA,CAAA;AACpB,QAAA,IAAI,aAAa,QAAU,EAAA;AACzB,UAAW,QAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,QAAA,CAAA,KAAA,EAAO,EAAE,KAAA,EAAO,QAAS,EAAA,CAAA,CAAA;AAAA,SACtC;AAAA,OACF;AAAA,MACA,CAAC,QAAU,EAAA,QAAA,EAAU,WAAW,CAAA;AAAA,KAClC,CAAA;AAEA,IAAA,MAAM,UAAa,GAAAA,iBAAA;AAAA,MACjB,CAAC,EAA2B,KAAA;AAC1B,QAAA,OAAO,QAAa,KAAA,EAAA,CAAA;AAAA,OACtB;AAAA,MACA,CAAC,QAAQ,CAAA;AAAA,KACX,CAAA;AAEA,IAAM,MAAA,YAAA,GAAeA,iBAAY,CAAA,CAAC,EAA2B,KAAA;AAC3D,MAAA,iBAAA,CAAkB,EAAE,CAAA,CAAA;AAAA,KACtB,EAAG,EAAE,CAAA,CAAA;AAEL,IAAA,MAAM,WAAc,GAAAA,iBAAA;AAAA,MAClB,CAAC,EAA2B,KAAA;AAC1B,QAAO,OAAA,SAAA,KAAc,MAAM,CAAC,SAAA,CAAA;AAAA,OAC9B;AAAA,MACA,CAAC,SAAS,CAAA;AAAA,KACZ,CAAA;AAEA,IAAA,MAAM,CAAC,OAAS,EAAA,UAAU,CAAI,GAAAD,cAAA,CAAqB,EAAE,CAAA,CAAA;AACrD,IAAM,MAAA,WAAA,GAAcC,iBAAY,CAAA,CAAC,GAAkB,KAAA;AACjD,MAAA,UAAA,CAAW,CAAC,IAAS,KAAA,IAAA,CAAK,OAAO,CAAC,GAAG,CAAC,CAAC,CAAA,CAAA;AAAA,KACzC,EAAG,EAAE,CAAA,CAAA;AAEL,IAAM,MAAA,aAAA,GAAgBA,iBAAY,CAAA,CAAC,EAAe,KAAA;AAChD,MAAW,UAAA,CAAA,CAAC,SAAS,IAAK,CAAA,MAAA,CAAO,CAAC,IAAS,KAAA,IAAA,CAAK,KAAU,KAAA,EAAE,CAAC,CAAA,CAAA;AAAA,KAC/D,EAAG,EAAE,CAAA,CAAA;AAEL,IAAM,MAAA,aAAA,GAAgB,CAAC,KAAyC,KAAA;AA9GpE,MAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AA+GM,MAAI,IAAA,YAAA;AAAc,QAAA,OAAA;AAElB,MAAA,MAAM,WAA0B,KAAM,CAAA,IAAA;AAAA,QACpC,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,WAAA,CAAY,YAAZ,IAAqB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,gBAAA;AAAA,UACnB,CAAA,0DAAA,CAAA;AAAA,SAAA,KADF,YAEK,EAAC;AAAA,OACR,CAAA;AAEA,MAAA,MAAM,eAAe,QAAS,CAAA,SAAA;AAAA,QAC5B,CAAC,OAAA,KAAY,OAAY,MAAA,YAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,YAAA,CAAc,QAAS,CAAA,aAAA,CAAA;AAAA,OAClD,CAAA;AAEA,MAAA,IAAI,YAAe,GAAA,CAAA;AAAG,QAAA,OAAA;AAEtB,MAAA,QAAQ,KAAM,CAAA,GAAA;AAAA,QACP,KAAA,WAAA,CAAA;AAAA,QACA,KAAA,YAAA;AACH,UAAA,CAAA,EAAA,GAAA,QAAA,CAAS,KAAK,GAAI,CAAA,YAAA,GAAe,GAAG,QAAS,CAAA,MAAM,OAAnD,IAAuD,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,KAAA,EAAA,CAAA;AACvD,UAAA,MAAA;AAAA,QACG,KAAA,SAAA,CAAA;AAAA,QACA,KAAA,WAAA;AACH,UAAA,CAAA,EAAA,GAAA,QAAA,CAAS,KAAK,GAAI,CAAA,CAAA,EAAG,YAAe,GAAA,CAAC,OAArC,IAAyC,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,KAAA,EAAA,CAAA;AACzC,UAAA,MAAA;AAAA,QACG,KAAA,MAAA;AACH,UAAA,CAAA,EAAA,GAAA,QAAA,CAAS,OAAT,IAAa,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,KAAA,EAAA,CAAA;AACb,UAAA,MAAA;AAAA,QACG,KAAA,KAAA;AACH,UAAS,CAAA,EAAA,GAAA,QAAA,CAAA,QAAA,CAAS,MAAS,GAAA,CAAA,CAAA,KAA3B,IAA+B,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,KAAA,EAAA,CAAA;AAAA,OAAA;AAGnC,MAAY,SAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,SAAA,CAAA,KAAA,CAAA,CAAA;AAAA,KACd,CAAA;AAEA,IAAM,MAAA,uBAAA,GAA4D,CAChE,KAAA,EACA,IACG,KAAA;AACH,MAAA,IAAI,IAAM,EAAA;AACR,QAAA,WAAA,CAAY,KAAK,KAAK,CAAA,CAAA;AACtB,QAAA,qBAAA,CAAsB,MAAM;AAtJpC,UAAA,IAAA,EAAA,CAAA;AAuJU,UAAM,MAAA,OAAA,GAAA,CAAU,EAAY,GAAA,WAAA,CAAA,OAAA,KAAZ,IAAqB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,aAAA;AAAA,YACnC,WAAW,IAAK,CAAA,KAAA,CAAA,EAAA,CAAA;AAAA,WAAA,CAAA;AAElB,UAAA,IAAI,mBAAmB,WAAa,EAAA;AAClC,YAAS,OAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,OAAA,CAAA,KAAA,EAAA,CAAA;AAAA,WACX;AAAA,SACD,CAAA,CAAA;AACD,QAAI,IAAA,QAAA,KAAa,KAAK,KAAO,EAAA;AAC3B,UAAA,QAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,QAAA,CAAW,KAAO,EAAA,EAAE,KAAO,EAAA,IAAA,CAAK,KAAM,EAAA,CAAA,CAAA;AAAA,SACxC;AAAA,OACF;AAAA,KACF,CAAA;AAEA,IAAM,MAAA,wBAAA,GAA2B,CAAC,MAAoB,KAAA;AACpD,MAAA,eAAA,CAAgB,MAAM,CAAA,CAAA;AAAA,KACxB,CAAA;AAEA,IAAA,MAAM,KAAQ,GAAAC,aAAA;AAAA,MACZ,OAAO;AAAA,QACL,MAAA;AAAA,QACA,UAAA;AAAA,QACA,YAAA;AAAA,QACA,WAAA;AAAA,QACA,WAAA;AAAA,QACA,aAAA;AAAA,OACF,CAAA;AAAA,MACA;AAAA,QACE,MAAA;AAAA,QACA,UAAA;AAAA,QACA,YAAA;AAAA,QACA,WAAA;AAAA,QACA,WAAA;AAAA,QACA,aAAA;AAAA,OACF;AAAA,KACF,CAAA;AAEA,IACE,uBAAAC,cAAA,CAACC,2BAAY,QAAZ,EAAA;AAAA,MAAqB,KAAA;AAAA,MACpB,QAAC,kBAAAD,cAAA,CAAAE,sBAAA,EAAA;AAAA,QAAS,GAAK,EAAA,SAAA;AAAA,QACb,QAAC,kBAAAC,eAAA,CAAA,KAAA,EAAA;AAAA,UACC,IAAK,EAAA,SAAA;AAAA,UACL,SAAW,EAAAC,wBAAA;AAAA,YACT,YAAa,EAAA;AAAA,YACb,aAAa,YAAY,CAAA;AAAA,YACzB,SAAA;AAAA,WACF;AAAA,UACA,SAAW,EAAA,aAAA;AAAA,UACV,GAAG,IAAA;AAAA,UAEH,QAAA,EAAA;AAAA,YAAA,QAAA;AAAA,4BACAJ,cAAA,CAAAK,yBAAA,EAAA;AAAA,cACC,IAAM,EAAA,OAAA;AAAA,cACN,YAAc,EAAA,wBAAA;AAAA,cACd,iBAAmB,EAAA,uBAAA;AAAA,aACrB,CAAA;AAAA,WAAA;AAAA,SACF,CAAA;AAAA,OACF,CAAA;AAAA,KACF,CAAA,CAAA;AAAA,GAEJ;AACF;;;;"}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var css_248z = ".salt-density-touch {\n --toggleButton-icon-padding: 11px;\n}\n\n.salt-density-low {\n --toggleButton-icon-padding: 7px;\n}\n\n.salt-density-medium {\n --toggleButton-icon-padding: 5px;\n}\n\n.salt-density-high {\n --toggleButton-icon-padding: 1px;\n}\n\n.saltToggleButton-horizontal.saltToggleButton-iconOnly {\n padding: var(--saltToggleButton-icon-padding, var(--toggleButton-icon-padding));\n}\n\n.saltToggleButton {\n --saltButton-text-color: var(--salt-text-primary-foreground);\n --saltButton-text-color-disabled: var(--salt-text-primary-foreground-disabled);\n\n --saltIcon-color: var(--salt-text-primary-foreground);\n}\n\n.saltToggleButton-disabled.saltButton-disabled {\n --saltButton-text-color-active: var(--salt-text-primary-foreground-disabled);\n --saltButton-text-color-hover: var(--salt-text-primary-foreground-disabled);\n\n --saltIcon-color: var(--salt-text-primary-foreground-disabled);\n}\n\n/* CTA */\n.saltToggleButton-cta {\n --saltButton-background: var(--salt-selectable-background);\n --saltButton-background-hover: var(--salt-selectable-cta-background-hover);\n --saltButton-background-active: var(--salt-selectable-cta-background-selected);\n --saltButton-background-disabled: var(--salt-selectable-background-disabled);\n --saltButton-text-color-hover: var(--salt-selectable-cta-foreground-hover);\n --saltButton-text-color-active: var(--salt-selectable-cta-foreground-selected);\n}\n.saltToggleButton-cta.saltToggleButton-disabled.saltButton-disabled {\n --saltButton-background-hover: var(--salt-selectable-background-disabled);\n --saltButton-background-active: var(--salt-selectable-cta-background-disabled);\n}\n.saltToggleButton-cta.saltToggleButton-disabled {\n --saltButton-background-active: var(--salt-selectable-cta-background-selectedDisabled);\n --saltButton-text-color-active: var(--salt-selectable-cta-foreground-selectedDisabled);\n\n --saltIcon-color-active: var(--salt-selectable-cta-foreground-selectedDisabled);\n}\n.saltToggleButton-cta.saltToggleButton-toggled {\n --saltButton-background: var(--salt-selectable-cta-background-selected);\n --saltButton-background-hover: var(--salt-selectable-cta-background-selected);\n --saltButton-text-color: var(--salt-selectable-cta-foreground-selected);\n --saltButton-text-color-hover: var(--salt-selectable-cta-foreground-selected);\n\n --saltIcon-color: var(--salt-selectable-cta-foreground-selected);\n}\n.saltToggleButton-cta.saltToggleButton-toggled.saltToggleButton-disabled {\n --saltButton-background-disabled: var(--salt-selectable-cta-background-selectedDisabled);\n --saltButton-background-hover: var(--salt-selectable-cta-background-selectedDisabled);\n --saltButton-text-color-disabled: var(--salt-selectable-cta-foreground-selectedDisabled);\n --saltButton-text-color-hover: var(--salt-selectable-cta-foreground-selectedDisabled);\n\n --saltIcon-color: var(--salt-selectable-cta-foreground-selectedDisabled);\n}\n\n/* Primary */\n.saltToggleButton-primary {\n --saltButton-background: var(--salt-selectable-background);\n --saltButton-background-hover: var(--salt-selectable-primary-background-hover);\n --saltButton-background-active: var(--salt-selectable-primary-background-selected);\n --saltButton-background-disabled: var(--salt-selectable-primary-background-disabled);\n --saltButton-text-color-hover: var(--salt-selectable-primary-foreground-hover);\n --saltButton-text-color-active: var(--salt-selectable-primary-foreground-selected);\n}\n.saltToggleButton-primary.saltToggleButton-disabled.saltButton-disabled {\n --saltButton-background-active: var(--salt-selectable-primary-background-disabled);\n --saltButton-background-hover: var(--salt-selectable-background-disabled);\n}\n.saltToggleButton-primary.saltToggleButton-disabled.saltButton-active {\n --saltButton-background-active: var(--salt-selectable-primary-background-selectedDisabled);\n --saltButton-text-color-active: var(--salt-selectable-primary-foreground-selectedDisabled);\n}\n.saltToggleButton-primary.saltToggleButton-toggled {\n --saltButton-background: var(--salt-selectable-primary-background-selected);\n --saltButton-background-hover: var(--salt-selectable-primary-background-selected);\n --saltButton-text-color: var(--salt-selectable-primary-foreground-selected);\n --saltButton-text-color-hover: var(--salt-selectable-primary-foreground-selected);\n\n --saltIcon-color: var(--salt-selectable-primary-foreground-selected);\n}\n.saltToggleButton-primary.saltToggleButton-toggled.saltToggleButton-disabled {\n --saltButton-background-disabled: var(--salt-selectable-primary-background-selectedDisabled);\n --saltButton-background-hover: var(--salt-selectable-primary-background-selectedDisabled);\n --saltButton-text-color-disabled: var(--salt-selectable-primary-foreground-selectedDisabled);\n --saltButton-text-color-hover: var(--salt-selectable-primary-foreground-selectedDisabled);\n\n --saltIcon-color: var(--salt-selectable-primary-foreground-selectedDisabled);\n}\n\n/* Secondary */\n.saltToggleButton-secondary {\n --saltButton-background: var(--salt-selectable-background);\n --saltButton-background-hover: var(--salt-selectable-secondary-background-hover);\n --saltButton-background-active: var(--salt-selectable-secondary-background-selected);\n --saltButton-background-disabled: var(--salt-selectable-background-disabled);\n --saltButton-text-color-hover: var(--salt-selectable-secondary-foreground-hover);\n --saltButton-text-color-active: var(--salt-selectable-secondary-foreground-selected);\n}\n.saltToggleButton-secondary.saltToggleButton-disabled.saltButton-disabled {\n --saltButton-background-active: var(--salt-selectable-secondary-background-disabled);\n --saltButton-background-hover: var(--salt-selectable-background-disabled);\n}\n.saltToggleButton-secondary.saltToggleButton-disabled.saltButton-active {\n --saltButton-background-active: var(--salt-selectable-secondary-background-selectedDisabled);\n --saltButton-text-color-active: var(--salt-selectable-secondary-foreground-selectedDisabled);\n\n --saltIcon-color-active: var(--salt-selectable-secondary-foreground-selectedDisabled);\n}\n.saltToggleButton-secondary.saltToggleButton-toggled {\n --saltButton-background: var(--salt-selectable-secondary-background-selected);\n --saltButton-background-hover: var(--salt-selectable-secondary-background-selected);\n --saltButton-text-color: var(--salt-selectable-secondary-foreground-selected);\n --saltButton-text-color-hover: var(--salt-selectable-secondary-foreground-selected);\n\n --saltIcon-color: var(--salt-selectable-secondary-foreground-selected);\n}\n.saltToggleButton-secondary.saltToggleButton-toggled.saltToggleButton-disabled {\n --saltButton-background-disabled: var(--salt-selectable-secondary-background-selectedDisabled);\n --saltButton-background-hover: var(--salt-selectable-secondary-background-selectedDisabled);\n --saltButton-text-color-disabled: var(--salt-selectable-secondary-foreground-selectedDisabled);\n --saltButton-text-color-hover: var(--salt-selectable-secondary-foreground-selectedDisabled);\n\n --saltIcon-color: var(--salt-selectable-secondary-foreground-selectedDisabled);\n}\n";
3
+ var css_248z = ".saltToggleButton {\n align-items: center;\n justify-content: center;\n appearance: none;\n display: inline-flex;\n background: var(--salt-actionable-secondary-background);\n border: 0 solid transparent;\n border-radius: 0;\n white-space: pre;\n height: var(--salt-size-base);\n color: var(--salt-actionable-secondary-foreground);\n text-transform: var(--salt-actionable-textTransform);\n font-weight: var(--salt-actionable-secondary-fontWeight);\n font-family: var(--salt-text-fontFamily);\n text-align: var(--salt-actionable-textAlign);\n letter-spacing: var(--salt-actionable-letterSpacing);\n line-height: var(--salt-text-lineHeight);\n font-size: var(--salt-text-fontSize);\n padding-inline: var(--salt-spacing-100);\n gap: var(--salt-spacing-50);\n --saltIcon-color: var(--salt-actionable-secondary-foreground);\n}\n\n.saltToggleButton:hover {\n background: var(--salt-actionable-secondary-background-hover);\n color: var(--salt-actionable-secondary-foreground-hover);\n cursor: var(--salt-actionable-cursor-hover);\n --saltIcon-color: var(--salt-actionable-secondary-foreground-hover);\n}\n\n.saltToggleButton:focus-visible {\n outline: var(--salt-focused-outline);\n background: var(--salt-actionable-secondary-background-hover);\n color: var(--salt-actionable-secondary-foreground-hover);\n cursor: var(--salt-actionable-cursor-hover);\n --saltIcon-color: var(--salt-actionable-secondary-foreground-hover);\n}\n\n.saltToggleButton[aria-checked=\"true\"]:focus-visible {\n background: var(--salt-actionable-secondary-background-active);\n color: var(--salt-actionable-secondary-foreground-active);\n cursor: var(--salt-actionable-cursor-active);\n --saltIcon-color: var(--salt-actionable-secondary-foreground-active);\n}\n\n.saltToggleButton[aria-checked=\"true\"] {\n background: var(--salt-actionable-secondary-background-active);\n color: var(--salt-actionable-secondary-foreground-active);\n cursor: var(--salt-actionable-cursor-active);\n --saltIcon-color: var(--salt-actionable-secondary-foreground-active);\n}\n\n.saltToggleButton:disabled {\n background: var(--salt-actionable-secondary-background-disabled);\n cursor: var(--salt-actionable-cursor-disabled);\n color: var(--salt-actionable-secondary-foreground-disabled);\n --saltIcon-color: var(--salt-actionable-secondary-foreground-disabled);\n}\n";
4
4
 
5
5
  module.exports = css_248z;
6
6
  //# sourceMappingURL=ToggleButton.css.js.map
@@ -3,29 +3,28 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
+ var React = require('react');
6
7
  var core = require('@salt-ds/core');
7
8
  var clsx = require('clsx');
8
- var React = require('react');
9
- var ToggleButtonGroupContext = require('./internal/ToggleButtonGroupContext.js');
9
+ require('../toggle-button-group/ToggleButtonGroup.js');
10
+ var ToggleButtonGroupContext = require('../toggle-button-group/ToggleButtonGroupContext.js');
10
11
  var window = require('@salt-ds/window');
11
12
  var styles = require('@salt-ds/styles');
12
13
  var ToggleButton$1 = require('./ToggleButton.css.js');
13
14
 
14
15
  const withBaseName = core.makePrefixer("saltToggleButton");
15
16
  const ToggleButton = React.forwardRef(
16
- (props, ref) => {
17
+ function ToggleButton2(props, ref) {
17
18
  const {
18
- "aria-label": ariaLabel,
19
+ children,
19
20
  className,
20
- onToggle,
21
- toggled = false,
22
- tooltipText = ariaLabel,
23
- variant: variantProp = "primary",
24
21
  disabled: disabledProp,
25
- disableTooltip: disableTooltipProp,
26
- focusableWhenDisabled: focusableWhenDisabledProp,
27
- "data-button-index": index,
28
- ...restProps
22
+ value,
23
+ onClick,
24
+ onFocus,
25
+ onChange,
26
+ selected: selectedProp,
27
+ ...rest
29
28
  } = props;
30
29
  const targetWindow = window.useWindow();
31
30
  styles.useComponentCssInjection({
@@ -33,70 +32,41 @@ const ToggleButton = React.forwardRef(
33
32
  css: ToggleButton$1,
34
33
  window: targetWindow
35
34
  });
36
- const [iconOnly, setIconOnly] = React.useState(false);
37
35
  const buttonRef = React.useRef(null);
38
- const groupContext = React.useContext(ToggleButtonGroupContext.ToggleButtonGroupContext);
39
- const handleIconOnlyButton = React.useCallback(
40
- (button) => {
41
- setIconOnly(
42
- (button == null ? void 0 : button.querySelector(".saltIcon")) != null && (button == null ? void 0 : button.childElementCount) === 1
43
- );
44
- },
45
- [setIconOnly]
46
- );
47
- const {
48
- register,
49
- unregister,
50
- disabled = disabledProp,
51
- disableTooltip = disableTooltipProp,
52
- focusableWhenDisabled = focusableWhenDisabledProp,
53
- orientation = "horizontal",
54
- variant = variantProp
55
- } = groupContext || {};
56
- React.useEffect(() => {
57
- if (index !== void 0 && register && unregister && (!disabled || focusableWhenDisabled)) {
58
- register(buttonRef.current, index);
59
- return function cleanup() {
60
- unregister(index);
61
- };
62
- }
63
- }, [index, disabled, focusableWhenDisabled, register, unregister]);
64
- const handleToggle = (event) => {
65
- if (!disabled) {
66
- onToggle == null ? void 0 : onToggle(event, !toggled);
67
- }
36
+ const handleRef = core.useForkRef(ref, buttonRef);
37
+ const toggleButtonGroup = ToggleButtonGroupContext.useToggleButtonGroup();
38
+ const toggleButtonGroupSelected = toggleButtonGroup ? toggleButtonGroup.isSelected(value) : selectedProp;
39
+ const focusable = toggleButtonGroup ? toggleButtonGroup == null ? void 0 : toggleButtonGroup.isFocused(value) : true;
40
+ const disabled = (toggleButtonGroup == null ? void 0 : toggleButtonGroup.disabled) || disabledProp;
41
+ const [selected, setSelected] = core.useControlled({
42
+ controlled: toggleButtonGroupSelected,
43
+ default: Boolean(selectedProp),
44
+ name: "ToggleButton",
45
+ state: "selected"
46
+ });
47
+ const handleClick = (event) => {
48
+ toggleButtonGroup == null ? void 0 : toggleButtonGroup.select(event);
49
+ setSelected(!selected);
50
+ onChange == null ? void 0 : onChange(event);
51
+ onClick == null ? void 0 : onClick(event);
52
+ };
53
+ const handleFocus = (event) => {
54
+ toggleButtonGroup == null ? void 0 : toggleButtonGroup.focus(value);
55
+ onFocus == null ? void 0 : onFocus(event);
68
56
  };
69
- const tabIndex = toggled && !disabled ? 0 : -1;
70
- return /* @__PURE__ */ jsxRuntime.jsx(core.Tooltip, {
71
- content: tooltipText,
72
- disabled: disableTooltip,
73
- placement: orientation === "horizontal" ? "bottom" : "right",
74
- children: /* @__PURE__ */ jsxRuntime.jsx(core.Button, {
75
- ref: handleIconOnlyButton,
76
- "aria-checked": toggled,
77
- "aria-label": ariaLabel,
78
- "aria-posinset": index !== void 0 ? index + 1 : void 0,
79
- className: clsx.clsx(
80
- withBaseName(),
81
- withBaseName(orientation),
82
- {
83
- [withBaseName("primary")]: variant === "primary",
84
- [withBaseName("cta")]: variant === "cta",
85
- [withBaseName("secondary")]: variant === "secondary",
86
- [withBaseName("toggled")]: toggled,
87
- [withBaseName("disabled")]: disabled,
88
- [withBaseName("iconOnly")]: iconOnly
89
- },
90
- className
91
- ),
92
- onClick: handleToggle,
93
- disabled,
94
- focusableWhenDisabled,
95
- role: groupContext ? "radio" : "checkbox",
96
- tabIndex: groupContext ? tabIndex : void 0,
97
- variant,
98
- ...restProps
99
- })
57
+ const ariaChecked = selected && !disabled;
58
+ return /* @__PURE__ */ jsxRuntime.jsx("button", {
59
+ "aria-checked": ariaChecked,
60
+ className: clsx.clsx(withBaseName(), className),
61
+ disabled,
62
+ role: toggleButtonGroup ? "radio" : "checkbox",
63
+ ref: handleRef,
64
+ onClick: handleClick,
65
+ onFocus: handleFocus,
66
+ tabIndex: focusable && !disabled ? 0 : -1,
67
+ value,
68
+ ...rest,
69
+ children
100
70
  });
101
71
  }
102
72
  );
@@ -1 +1 @@
1
- {"version":3,"file":"ToggleButton.js","sources":["../src/toggle-button/ToggleButton.tsx"],"sourcesContent":["import { Button, ButtonProps, makePrefixer, Tooltip } from \"@salt-ds/core\";\nimport { clsx } from \"clsx\";\nimport {\n forwardRef,\n SyntheticEvent,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { ToggleButtonGroupContext } from \"./internal/ToggleButtonGroupContext\";\n\nimport { useWindow } from \"@salt-ds/window\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\n\nimport toggleButtonCss from \"./ToggleButton.css\";\n\nconst withBaseName = makePrefixer(\"saltToggleButton\");\n\nexport type ToggleButtonToggleEventHandler = (\n event: SyntheticEvent<HTMLButtonElement>,\n toggled: boolean\n) => void;\n\nexport interface ToggleButtonProps extends ButtonProps {\n \"aria-label\"?: string;\n \"data-button-index\"?: number;\n toggled?: boolean;\n tooltipText?: string;\n disableTooltip?: boolean;\n onToggle?: ToggleButtonToggleEventHandler;\n}\n\nexport const ToggleButton = forwardRef<HTMLButtonElement, ToggleButtonProps>(\n (props, ref) => {\n const {\n \"aria-label\": ariaLabel,\n className,\n onToggle,\n toggled = false,\n tooltipText = ariaLabel,\n variant: variantProp = \"primary\",\n disabled: disabledProp,\n disableTooltip: disableTooltipProp,\n focusableWhenDisabled: focusableWhenDisabledProp,\n \"data-button-index\": index,\n ...restProps\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-toggle-button\",\n css: toggleButtonCss,\n window: targetWindow,\n });\n\n const [iconOnly, setIconOnly] = useState(false);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const groupContext = useContext(ToggleButtonGroupContext);\n\n const handleIconOnlyButton = useCallback(\n (button: HTMLButtonElement | null) => {\n setIconOnly(\n button?.querySelector(\".saltIcon\") != null &&\n button?.childElementCount === 1\n );\n },\n [setIconOnly]\n );\n\n const {\n register,\n unregister,\n disabled = disabledProp,\n disableTooltip = disableTooltipProp,\n focusableWhenDisabled = focusableWhenDisabledProp,\n orientation = \"horizontal\",\n variant = variantProp,\n } = groupContext || {};\n\n useEffect(() => {\n if (\n index !== undefined &&\n register &&\n unregister &&\n (!disabled || focusableWhenDisabled)\n ) {\n register(buttonRef.current, index);\n\n return function cleanup() {\n unregister(index);\n };\n }\n }, [index, disabled, focusableWhenDisabled, register, unregister]);\n\n const handleToggle = (event: SyntheticEvent<HTMLButtonElement>) => {\n if (!disabled) {\n onToggle?.(event, !toggled);\n }\n };\n\n const tabIndex = toggled && !disabled ? 0 : -1;\n\n return (\n <Tooltip\n content={tooltipText}\n disabled={disableTooltip}\n placement={orientation === \"horizontal\" ? \"bottom\" : \"right\"}\n >\n <Button\n ref={handleIconOnlyButton}\n aria-checked={toggled}\n aria-label={ariaLabel}\n aria-posinset={index !== undefined ? index + 1 : undefined}\n className={clsx(\n withBaseName(),\n withBaseName(orientation),\n {\n [withBaseName(\"primary\")]: variant === \"primary\",\n [withBaseName(\"cta\")]: variant === \"cta\",\n [withBaseName(\"secondary\")]: variant === \"secondary\",\n [withBaseName(\"toggled\")]: toggled,\n [withBaseName(\"disabled\")]: disabled,\n [withBaseName(\"iconOnly\")]: iconOnly,\n },\n className\n )}\n onClick={handleToggle}\n disabled={disabled}\n focusableWhenDisabled={focusableWhenDisabled}\n role={groupContext ? \"radio\" : \"checkbox\"}\n tabIndex={groupContext ? tabIndex : undefined}\n variant={variant}\n {...restProps}\n />\n </Tooltip>\n );\n }\n);\n"],"names":["makePrefixer","forwardRef","useWindow","useComponentCssInjection","toggleButtonCss","useState","useRef","useContext","ToggleButtonGroupContext","useCallback","useEffect","jsx","Tooltip","Button","clsx"],"mappings":"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"}
1
+ {"version":3,"file":"ToggleButton.js","sources":["../src/toggle-button/ToggleButton.tsx"],"sourcesContent":["import {\n ComponentProps,\n forwardRef,\n useRef,\n MouseEvent,\n FocusEvent,\n} from \"react\";\nimport { makePrefixer, useControlled, useForkRef } from \"@salt-ds/core\";\nimport { clsx } from \"clsx\";\nimport { useToggleButtonGroup } from \"../toggle-button-group\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\n\nimport toggleButtonCss from \"./ToggleButton.css\";\n\nexport interface ToggleButtonProps extends ComponentProps<\"button\"> {\n selected?: boolean;\n onChange?: (event: MouseEvent<HTMLButtonElement>) => void;\n value: string | ReadonlyArray<string> | number | undefined;\n}\n\nconst withBaseName = makePrefixer(\"saltToggleButton\");\n\nexport const ToggleButton = forwardRef<HTMLButtonElement, ToggleButtonProps>(\n function ToggleButton(props, ref) {\n const {\n children,\n className,\n disabled: disabledProp,\n value,\n onClick,\n onFocus,\n onChange,\n selected: selectedProp,\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-toggle-button\",\n css: toggleButtonCss,\n window: targetWindow,\n });\n\n const buttonRef = useRef<HTMLButtonElement>(null);\n const handleRef = useForkRef(ref, buttonRef);\n\n const toggleButtonGroup = useToggleButtonGroup();\n\n const toggleButtonGroupSelected = toggleButtonGroup\n ? toggleButtonGroup.isSelected(value)\n : selectedProp;\n const focusable = toggleButtonGroup\n ? toggleButtonGroup?.isFocused(value)\n : true;\n const disabled = toggleButtonGroup?.disabled || disabledProp;\n\n const [selected, setSelected] = useControlled({\n controlled: toggleButtonGroupSelected,\n default: Boolean(selectedProp),\n name: \"ToggleButton\",\n state: \"selected\",\n });\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n toggleButtonGroup?.select(event);\n setSelected(!selected);\n onChange?.(event);\n onClick?.(event);\n };\n\n const handleFocus = (event: FocusEvent<HTMLButtonElement>) => {\n toggleButtonGroup?.focus(value);\n onFocus?.(event);\n };\n\n const ariaChecked = selected && !disabled;\n\n return (\n <button\n aria-checked={ariaChecked}\n className={clsx(withBaseName(), className)}\n disabled={disabled}\n role={toggleButtonGroup ? \"radio\" : \"checkbox\"}\n ref={handleRef}\n onClick={handleClick}\n onFocus={handleFocus}\n tabIndex={focusable && !disabled ? 0 : -1}\n value={value}\n {...rest}\n >\n {children}\n </button>\n );\n }\n);\n"],"names":["makePrefixer","forwardRef","ToggleButton","useWindow","useComponentCssInjection","toggleButtonCss","useRef","useForkRef","useToggleButtonGroup","useControlled","jsx","clsx"],"mappings":";;;;;;;;;;;;;;AAqBA,MAAM,YAAA,GAAeA,kBAAa,kBAAkB,CAAA,CAAA;AAE7C,MAAM,YAAe,GAAAC,gBAAA;AAAA,EAC1B,SAASC,aAAa,CAAA,KAAA,EAAO,GAAK,EAAA;AAChC,IAAM,MAAA;AAAA,MACJ,QAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAU,EAAA,YAAA;AAAA,MACV,KAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAU,EAAA,YAAA;AAAA,MACP,GAAA,IAAA;AAAA,KACD,GAAA,KAAA,CAAA;AAEJ,IAAA,MAAM,eAAeC,gBAAU,EAAA,CAAA;AAC/B,IAAyBC,+BAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,oBAAA;AAAA,MACR,GAAK,EAAAC,cAAA;AAAA,MACL,MAAQ,EAAA,YAAA;AAAA,KACT,CAAA,CAAA;AAED,IAAM,MAAA,SAAA,GAAYC,aAA0B,IAAI,CAAA,CAAA;AAChD,IAAM,MAAA,SAAA,GAAYC,eAAW,CAAA,GAAA,EAAK,SAAS,CAAA,CAAA;AAE3C,IAAA,MAAM,oBAAoBC,6CAAqB,EAAA,CAAA;AAE/C,IAAA,MAAM,yBAA4B,GAAA,iBAAA,GAC9B,iBAAkB,CAAA,UAAA,CAAW,KAAK,CAClC,GAAA,YAAA,CAAA;AACJ,IAAA,MAAM,SAAY,GAAA,iBAAA,GACd,iBAAmB,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,iBAAA,CAAA,SAAA,CAAU,KAC7B,CAAA,GAAA,IAAA,CAAA;AACJ,IAAM,MAAA,QAAA,GAAA,CAAW,uDAAmB,QAAY,KAAA,YAAA,CAAA;AAEhD,IAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIC,kBAAc,CAAA;AAAA,MAC5C,UAAY,EAAA,yBAAA;AAAA,MACZ,OAAA,EAAS,QAAQ,YAAY,CAAA;AAAA,MAC7B,IAAM,EAAA,cAAA;AAAA,MACN,KAAO,EAAA,UAAA;AAAA,KACR,CAAA,CAAA;AAED,IAAM,MAAA,WAAA,GAAc,CAAC,KAAyC,KAAA;AAC5D,MAAA,iBAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,iBAAA,CAAmB,MAAO,CAAA,KAAA,CAAA,CAAA;AAC1B,MAAA,WAAA,CAAY,CAAC,QAAQ,CAAA,CAAA;AACrB,MAAW,QAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,QAAA,CAAA,KAAA,CAAA,CAAA;AACX,MAAU,OAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,OAAA,CAAA,KAAA,CAAA,CAAA;AAAA,KACZ,CAAA;AAEA,IAAM,MAAA,WAAA,GAAc,CAAC,KAAyC,KAAA;AAC5D,MAAA,iBAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,iBAAA,CAAmB,KAAM,CAAA,KAAA,CAAA,CAAA;AACzB,MAAU,OAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,OAAA,CAAA,KAAA,CAAA,CAAA;AAAA,KACZ,CAAA;AAEA,IAAM,MAAA,WAAA,GAAc,YAAY,CAAC,QAAA,CAAA;AAEjC,IAAA,uBACGC,cAAA,CAAA,QAAA,EAAA;AAAA,MACC,cAAc,EAAA,WAAA;AAAA,MACd,SAAW,EAAAC,SAAA,CAAK,YAAa,EAAA,EAAG,SAAS,CAAA;AAAA,MACzC,QAAA;AAAA,MACA,IAAA,EAAM,oBAAoB,OAAU,GAAA,UAAA;AAAA,MACpC,GAAK,EAAA,SAAA;AAAA,MACL,OAAS,EAAA,WAAA;AAAA,MACT,OAAS,EAAA,WAAA;AAAA,MACT,QAAU,EAAA,SAAA,IAAa,CAAC,QAAA,GAAW,CAAI,GAAA,CAAA,CAAA;AAAA,MACvC,KAAA;AAAA,MACC,GAAG,IAAA;AAAA,MAEH,QAAA;AAAA,KACH,CAAA,CAAA;AAAA,GAEJ;AACF;;;;"}
@@ -0,0 +1,6 @@
1
+ 'use strict';
2
+
3
+ var css_248z = ".saltToggleButtonGroup {\n display: flex;\n background: var(--salt-container-primary-background);\n border: var(--salt-size-border) var(--salt-container-borderStyle) var(--salt-container-primary-borderColor);\n width: fit-content;\n gap: var(--salt-spacing-50);\n padding: calc(var(--salt-spacing-50) - var(--salt-size-border));\n flex-direction: row;\n}\n\n.saltToggleButtonGroup-horizontal .saltToggleButton {\n height: calc(var(--salt-size-base) - var(--salt-spacing-100));\n}\n\n.saltToggleButtonGroup-vertical {\n flex-direction: column;\n}\n\n.saltToggleButtonGroup-vertical .saltToggleButton {\n justify-content: start;\n}\n";
4
+
5
+ module.exports = css_248z;
6
+ //# sourceMappingURL=ToggleButtonGroup.css.js.map