@redsift/design-system 11.5.0 → 11.6.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (285) hide show
  1. package/_internal/Alert2.js +197 -0
  2. package/_internal/Alert2.js.map +1 -0
  3. package/_internal/AppBar.js +248 -0
  4. package/_internal/AppBar.js.map +1 -0
  5. package/_internal/AppContainer.js +142 -0
  6. package/_internal/AppContainer.js.map +1 -0
  7. package/_internal/AppContent.js +92 -0
  8. package/_internal/AppContent.js.map +1 -0
  9. package/_internal/Badge2.js +142 -0
  10. package/_internal/Badge2.js.map +1 -0
  11. package/_internal/BreadcrumbItem.js +91 -0
  12. package/_internal/BreadcrumbItem.js.map +1 -0
  13. package/_internal/Breadcrumbs2.js +94 -0
  14. package/_internal/Breadcrumbs2.js.map +1 -0
  15. package/_internal/Button2.js +91 -0
  16. package/_internal/Button2.js.map +1 -0
  17. package/_internal/ButtonGroup.js +181 -0
  18. package/_internal/ButtonGroup.js.map +1 -0
  19. package/_internal/ButtonLink.js +84 -0
  20. package/_internal/ButtonLink.js.map +1 -0
  21. package/_internal/Card2.js +157 -0
  22. package/_internal/Card2.js.map +1 -0
  23. package/_internal/CardActions.js +44 -0
  24. package/_internal/CardActions.js.map +1 -0
  25. package/_internal/CardBody.js +42 -0
  26. package/_internal/CardBody.js.map +1 -0
  27. package/_internal/CardHeader.js +83 -0
  28. package/_internal/CardHeader.js.map +1 -0
  29. package/_internal/Checkbox2.js +244 -0
  30. package/_internal/Checkbox2.js.map +1 -0
  31. package/_internal/CheckboxGroup.js +188 -0
  32. package/_internal/CheckboxGroup.js.map +1 -0
  33. package/_internal/ConditionalWrapper.js +13 -0
  34. package/_internal/ConditionalWrapper.js.map +1 -0
  35. package/_internal/DetailedCard.js +6916 -0
  36. package/_internal/DetailedCard.js.map +1 -0
  37. package/_internal/DetailedCardCollapsibleSectionItems.js +64 -0
  38. package/_internal/DetailedCardCollapsibleSectionItems.js.map +1 -0
  39. package/_internal/DetailedCardHeader.js +67 -0
  40. package/_internal/DetailedCardHeader.js.map +1 -0
  41. package/_internal/DetailedCardSection.js +172 -0
  42. package/_internal/DetailedCardSection.js.map +1 -0
  43. package/_internal/DetailedCardSectionItem.js +94 -0
  44. package/_internal/DetailedCardSectionItem.js.map +1 -0
  45. package/_internal/Flexbox2.js +93 -0
  46. package/_internal/Flexbox2.js.map +1 -0
  47. package/_internal/Grid2.js +95 -0
  48. package/_internal/Grid2.js.map +1 -0
  49. package/_internal/GridItem.js +40 -0
  50. package/_internal/GridItem.js.map +1 -0
  51. package/_internal/Heading2.js +113 -0
  52. package/_internal/Heading2.js.map +1 -0
  53. package/_internal/Icon2.js +211 -0
  54. package/_internal/Icon2.js.map +1 -0
  55. package/_internal/IconButton.js +80 -0
  56. package/_internal/IconButton.js.map +1 -0
  57. package/_internal/IconButtonLink.js +75 -0
  58. package/_internal/IconButtonLink.js.map +1 -0
  59. package/_internal/Item2.js +399 -0
  60. package/_internal/Item2.js.map +1 -0
  61. package/_internal/Link2.js +67 -0
  62. package/_internal/Link2.js.map +1 -0
  63. package/_internal/LinkButton.js +66 -0
  64. package/_internal/LinkButton.js.map +1 -0
  65. package/_internal/Listbox2.js +274 -0
  66. package/_internal/Listbox2.js.map +1 -0
  67. package/_internal/Number2.js +111 -0
  68. package/_internal/Number2.js.map +1 -0
  69. package/_internal/NumberField.js +3974 -0
  70. package/_internal/NumberField.js.map +1 -0
  71. package/_internal/Pill2.js +405 -0
  72. package/_internal/Pill2.js.map +1 -0
  73. package/_internal/ProgressBar.js +69 -0
  74. package/_internal/ProgressBar.js.map +1 -0
  75. package/_internal/Radio2.js +237 -0
  76. package/_internal/Radio2.js.map +1 -0
  77. package/_internal/RadioGroup.js +176 -0
  78. package/_internal/RadioGroup.js.map +1 -0
  79. package/_internal/Shield2.js +225 -0
  80. package/_internal/Shield2.js.map +1 -0
  81. package/_internal/SideNavigationMenu.js +591 -0
  82. package/_internal/SideNavigationMenu.js.map +1 -0
  83. package/_internal/SideNavigationMenuItem.js +304 -0
  84. package/_internal/SideNavigationMenuItem.js.map +1 -0
  85. package/_internal/Skeleton2.js +42 -0
  86. package/_internal/Skeleton2.js.map +1 -0
  87. package/_internal/SkeletonCircle.js +58 -0
  88. package/_internal/SkeletonCircle.js.map +1 -0
  89. package/_internal/SkeletonText.js +77 -0
  90. package/_internal/SkeletonText.js.map +1 -0
  91. package/_internal/Spinner2.js +333 -0
  92. package/_internal/Spinner2.js.map +1 -0
  93. package/_internal/Switch2.js +320 -0
  94. package/_internal/Switch2.js.map +1 -0
  95. package/_internal/SwitchGroup.js +188 -0
  96. package/_internal/SwitchGroup.js.map +1 -0
  97. package/_internal/Text2.js +51 -0
  98. package/_internal/Text2.js.map +1 -0
  99. package/_internal/TextArea.js +444 -0
  100. package/_internal/TextArea.js.map +1 -0
  101. package/_internal/TextField.js +473 -0
  102. package/_internal/TextField.js.map +1 -0
  103. package/_internal/_rollupPluginBabelHelpers.js +133 -0
  104. package/_internal/_rollupPluginBabelHelpers.js.map +1 -0
  105. package/_internal/alert.js +2 -0
  106. package/_internal/alert.js.map +1 -0
  107. package/_internal/app-bar.js +2 -0
  108. package/_internal/app-bar.js.map +1 -0
  109. package/_internal/app-container.js +3 -0
  110. package/_internal/app-container.js.map +1 -0
  111. package/_internal/app-content.js +2 -0
  112. package/_internal/app-content.js.map +1 -0
  113. package/_internal/app-side-panel.js +3 -0
  114. package/_internal/app-side-panel.js.map +1 -0
  115. package/_internal/badge.js +2 -0
  116. package/_internal/badge.js.map +1 -0
  117. package/_internal/breadcrumb-item.js +2 -0
  118. package/_internal/breadcrumb-item.js.map +1 -0
  119. package/_internal/breadcrumbs.js +2 -0
  120. package/_internal/breadcrumbs.js.map +1 -0
  121. package/_internal/button-group.js +2 -0
  122. package/_internal/button-group.js.map +1 -0
  123. package/_internal/button-link.js +2 -0
  124. package/_internal/button-link.js.map +1 -0
  125. package/_internal/button.js +3 -0
  126. package/_internal/button.js.map +1 -0
  127. package/_internal/card-actions.js +2 -0
  128. package/_internal/card-actions.js.map +1 -0
  129. package/_internal/card-body.js +2 -0
  130. package/_internal/card-body.js.map +1 -0
  131. package/_internal/card-header.js +2 -0
  132. package/_internal/card-header.js.map +1 -0
  133. package/_internal/card.js +2 -0
  134. package/_internal/card.js.map +1 -0
  135. package/_internal/checkbox-group.js +2 -0
  136. package/_internal/checkbox-group.js.map +1 -0
  137. package/_internal/checkbox.js +2 -0
  138. package/_internal/checkbox.js.map +1 -0
  139. package/_internal/colors.js +98 -0
  140. package/_internal/colors.js.map +1 -0
  141. package/_internal/conditional-wrapper.js +2 -0
  142. package/_internal/conditional-wrapper.js.map +1 -0
  143. package/_internal/context.js +6 -0
  144. package/_internal/context.js.map +1 -0
  145. package/_internal/context2.js +300 -0
  146. package/_internal/context2.js.map +1 -0
  147. package/_internal/context3.js +6 -0
  148. package/_internal/context3.js.map +1 -0
  149. package/_internal/context4.js +6 -0
  150. package/_internal/context4.js.map +1 -0
  151. package/_internal/context5.js +6 -0
  152. package/_internal/context5.js.map +1 -0
  153. package/_internal/detailed-card-collapsible-section-items.js +2 -0
  154. package/_internal/detailed-card-collapsible-section-items.js.map +1 -0
  155. package/_internal/detailed-card-header.js +2 -0
  156. package/_internal/detailed-card-header.js.map +1 -0
  157. package/_internal/detailed-card-section-item.js +2 -0
  158. package/_internal/detailed-card-section-item.js.map +1 -0
  159. package/_internal/detailed-card-section.js +2 -0
  160. package/_internal/detailed-card-section.js.map +1 -0
  161. package/_internal/detailed-card.js +2 -0
  162. package/_internal/detailed-card.js.map +1 -0
  163. package/_internal/filterComponents.js +24 -0
  164. package/_internal/filterComponents.js.map +1 -0
  165. package/_internal/flexbox.js +2 -0
  166. package/_internal/flexbox.js.map +1 -0
  167. package/_internal/focus-within-group.js +3 -0
  168. package/_internal/focus-within-group.js.map +1 -0
  169. package/_internal/fonts.js +10 -0
  170. package/_internal/fonts.js.map +1 -0
  171. package/_internal/gradient-border.js +38 -0
  172. package/_internal/gradient-border.js.map +1 -0
  173. package/_internal/grid-item.js +2 -0
  174. package/_internal/grid-item.js.map +1 -0
  175. package/_internal/grid.js +2 -0
  176. package/_internal/grid.js.map +1 -0
  177. package/_internal/heading.js +3 -0
  178. package/_internal/heading.js.map +1 -0
  179. package/_internal/icon-button-link.js +2 -0
  180. package/_internal/icon-button-link.js.map +1 -0
  181. package/_internal/icon-button.js +3 -0
  182. package/_internal/icon-button.js.map +1 -0
  183. package/_internal/icon.js +2 -0
  184. package/_internal/icon.js.map +1 -0
  185. package/_internal/isComponent.js +15 -0
  186. package/_internal/isComponent.js.map +1 -0
  187. package/_internal/item.js +2 -0
  188. package/_internal/item.js.map +1 -0
  189. package/_internal/link-button.js +2 -0
  190. package/_internal/link-button.js.map +1 -0
  191. package/_internal/link.js +3 -0
  192. package/_internal/link.js.map +1 -0
  193. package/_internal/listbox.js +3 -0
  194. package/_internal/listbox.js.map +1 -0
  195. package/_internal/number-field.js +2 -0
  196. package/_internal/number-field.js.map +1 -0
  197. package/_internal/number.js +2 -0
  198. package/_internal/number.js.map +1 -0
  199. package/_internal/partitionComponents.js +26 -0
  200. package/_internal/partitionComponents.js.map +1 -0
  201. package/_internal/pill.js +2 -0
  202. package/_internal/pill.js.map +1 -0
  203. package/_internal/progress-bar.js +2 -0
  204. package/_internal/progress-bar.js.map +1 -0
  205. package/_internal/radio-group.js +2 -0
  206. package/_internal/radio-group.js.map +1 -0
  207. package/_internal/radio.js +2 -0
  208. package/_internal/radio.js.map +1 -0
  209. package/_internal/redsift-design-tokens.js +1391 -0
  210. package/_internal/redsift-design-tokens.js.map +1 -0
  211. package/_internal/shared.js +2 -0
  212. package/_internal/shared.js.map +1 -0
  213. package/_internal/shield.js +2 -0
  214. package/_internal/shield.js.map +1 -0
  215. package/_internal/side-navigation-menu-bar.js +3 -0
  216. package/_internal/side-navigation-menu-bar.js.map +1 -0
  217. package/_internal/side-navigation-menu-item.js +2 -0
  218. package/_internal/side-navigation-menu-item.js.map +1 -0
  219. package/_internal/side-navigation-menu.js +2 -0
  220. package/_internal/side-navigation-menu.js.map +1 -0
  221. package/_internal/skeleton-circle.js +2 -0
  222. package/_internal/skeleton-circle.js.map +1 -0
  223. package/_internal/skeleton-text.js +3 -0
  224. package/_internal/skeleton-text.js.map +1 -0
  225. package/_internal/skeleton.js +2 -0
  226. package/_internal/skeleton.js.map +1 -0
  227. package/_internal/spinner.js +2 -0
  228. package/_internal/spinner.js.map +1 -0
  229. package/_internal/styles.js +235 -0
  230. package/_internal/styles.js.map +1 -0
  231. package/_internal/styles2.js +47 -0
  232. package/_internal/styles2.js.map +1 -0
  233. package/_internal/styles3.js +145 -0
  234. package/_internal/styles3.js.map +1 -0
  235. package/_internal/styles4.js +250 -0
  236. package/_internal/styles4.js.map +1 -0
  237. package/_internal/styles5.js +143 -0
  238. package/_internal/styles5.js.map +1 -0
  239. package/_internal/styles6.js +84 -0
  240. package/_internal/styles6.js.map +1 -0
  241. package/_internal/switch-group.js +2 -0
  242. package/_internal/switch-group.js.map +1 -0
  243. package/_internal/switch.js +2 -0
  244. package/_internal/switch.js.map +1 -0
  245. package/_internal/text-area.js +2 -0
  246. package/_internal/text-area.js.map +1 -0
  247. package/_internal/text-field.js +2 -0
  248. package/_internal/text-field.js.map +1 -0
  249. package/_internal/text.js +3 -0
  250. package/_internal/text.js.map +1 -0
  251. package/_internal/theme.js +2 -0
  252. package/_internal/theme.js.map +1 -0
  253. package/_internal/types.js +15 -0
  254. package/_internal/types.js.map +1 -0
  255. package/_internal/types2.js +26 -0
  256. package/_internal/types2.js.map +1 -0
  257. package/_internal/types3.js +20 -0
  258. package/_internal/types3.js.map +1 -0
  259. package/_internal/useAppSidePanel.js +337 -0
  260. package/_internal/useAppSidePanel.js.map +1 -0
  261. package/_internal/useFocusOnList.js +541 -0
  262. package/_internal/useFocusOnList.js.map +1 -0
  263. package/_internal/useFocusOnListItem.js +203 -0
  264. package/_internal/useFocusOnListItem.js.map +1 -0
  265. package/_internal/useFocusRing.js +669 -0
  266. package/_internal/useFocusRing.js.map +1 -0
  267. package/_internal/useId.js +42 -0
  268. package/_internal/useId.js.map +1 -0
  269. package/_internal/useIsLoaded.js +14 -0
  270. package/_internal/useIsLoaded.js.map +1 -0
  271. package/_internal/useListboxItem.js +129 -0
  272. package/_internal/useListboxItem.js.map +1 -0
  273. package/_internal/useMessageFormatter.js +143 -0
  274. package/_internal/useMessageFormatter.js.map +1 -0
  275. package/_internal/useNumberFormatter.js +239 -0
  276. package/_internal/useNumberFormatter.js.map +1 -0
  277. package/_internal/useSideNavigationMenuBar.js +373 -0
  278. package/_internal/useSideNavigationMenuBar.js.map +1 -0
  279. package/_internal/useTheme.js +15 -0
  280. package/_internal/useTheme.js.map +1 -0
  281. package/_internal/warnIfNoAccessibleLabelFound.js +20 -0
  282. package/_internal/warnIfNoAccessibleLabelFound.js.map +1 -0
  283. package/index.js +315 -24243
  284. package/index.js.map +1 -1
  285. package/package.json +3 -3
@@ -0,0 +1,239 @@
1
+ import { u as useLocale } from './context2.js';
2
+ import { useMemo } from 'react';
3
+ import { a as _defineProperty, _ as _objectSpread2 } from './_rollupPluginBabelHelpers.js';
4
+
5
+ /* eslint-disable prefer-const */
6
+ // @ts-nocheck
7
+
8
+ /*
9
+ * Copyright 2020 Adobe. All rights reserved.
10
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
11
+ * you may not use this file except in compliance with the License. You may obtain a copy
12
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
13
+ *
14
+ * Unless required by applicable law or agreed to in writing, software distributed under
15
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
16
+ * OF ANY KIND, either express or implied. See the License for the specific language
17
+ * governing permissions and limitations under the License.
18
+ */
19
+
20
+ let formatterCache = new Map();
21
+ let supportsSignDisplay = false;
22
+ try {
23
+ // @ts-ignore
24
+ supportsSignDisplay = new Intl.NumberFormat('de-DE', {
25
+ signDisplay: 'exceptZero'
26
+ }).resolvedOptions().signDisplay === 'exceptZero';
27
+ // eslint-disable-next-line no-empty
28
+ } catch (e) {}
29
+ let supportsUnit = false;
30
+ try {
31
+ // @ts-ignore
32
+ supportsUnit = new Intl.NumberFormat('de-DE', {
33
+ style: 'unit',
34
+ unit: 'degree'
35
+ }).resolvedOptions().style === 'unit';
36
+ // eslint-disable-next-line no-empty
37
+ } catch (e) {}
38
+
39
+ // Polyfill for units since Safari doesn't support them yet. See https://bugs.webkit.org/show_bug.cgi?id=215438.
40
+ // Currently only polyfilling the unit degree in narrow format for ColorSlider in our supported locales.
41
+ // Values were determined by switching to each locale manually in Chrome.
42
+ const UNITS = {
43
+ degree: {
44
+ narrow: {
45
+ default: '°',
46
+ 'ja-JP': ' 度',
47
+ 'zh-TW': '度',
48
+ 'sl-SI': ' °'
49
+ // Arabic?? But Safari already doesn't use Arabic digits so might be ok...
50
+ // https://bugs.webkit.org/show_bug.cgi?id=218139
51
+ }
52
+ }
53
+ };
54
+
55
+ /**
56
+ * A wrapper around Intl.NumberFormat providing additional options, polyfills, and caching for performance.
57
+ */
58
+ class NumberFormatter {
59
+ constructor(locale) {
60
+ let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
61
+ _defineProperty(this, "numberFormatter", void 0);
62
+ _defineProperty(this, "options", void 0);
63
+ this.numberFormatter = getCachedNumberFormatter(locale, options);
64
+ this.options = options;
65
+ }
66
+
67
+ /** Formats a number value as a string, according to the locale and options provided to the constructor. */
68
+ format(value) {
69
+ let res = '';
70
+ if (!supportsSignDisplay && this.options.signDisplay != null) {
71
+ res = numberFormatSignDisplayPolyfill(this.numberFormatter, this.options.signDisplay, value);
72
+ } else {
73
+ res = this.numberFormatter.format(value);
74
+ }
75
+ if (this.options.style === 'unit' && !supportsUnit) {
76
+ var _UNITS$unit;
77
+ let {
78
+ unit,
79
+ unitDisplay = 'short',
80
+ locale
81
+ } = this.resolvedOptions();
82
+ if (!unit) {
83
+ return res;
84
+ }
85
+ let values = (_UNITS$unit = UNITS[unit]) === null || _UNITS$unit === void 0 ? void 0 : _UNITS$unit[unitDisplay];
86
+ res += values[locale] || values.default;
87
+ }
88
+ return res;
89
+ }
90
+
91
+ /** Formats a number to an array of parts such as separators, digits, punctuation, and more. */
92
+ formatToParts(value) {
93
+ // TODO: implement signDisplay for formatToParts
94
+ // @ts-ignore
95
+ return this.numberFormatter.formatToParts(value);
96
+ }
97
+
98
+ /** Formats a number range as a string. */
99
+ formatRange(start, end) {
100
+ // @ts-ignore
101
+ if (typeof this.numberFormatter.formatRange === 'function') {
102
+ // @ts-ignore
103
+ return this.numberFormatter.formatRange(start, end);
104
+ }
105
+ if (end < start) {
106
+ throw new RangeError('End date must be >= start date');
107
+ }
108
+
109
+ // Very basic fallback for old browsers.
110
+ return `${this.format(start)} – ${this.format(end)}`;
111
+ }
112
+
113
+ /** Formats a number range as an array of parts. */
114
+ formatRangeToParts(start, end) {
115
+ // @ts-ignore
116
+ if (typeof this.numberFormatter.formatRangeToParts === 'function') {
117
+ // @ts-ignore
118
+ return this.numberFormatter.formatRangeToParts(start, end);
119
+ }
120
+ if (end < start) {
121
+ throw new RangeError('End date must be >= start date');
122
+ }
123
+ let startParts = this.numberFormatter.formatToParts(start);
124
+ let endParts = this.numberFormatter.formatToParts(end);
125
+ return [...startParts.map(p => _objectSpread2(_objectSpread2({}, p), {}, {
126
+ source: 'startRange'
127
+ })), {
128
+ type: 'literal',
129
+ value: ' – ',
130
+ source: 'shared'
131
+ }, ...endParts.map(p => _objectSpread2(_objectSpread2({}, p), {}, {
132
+ source: 'endRange'
133
+ }))];
134
+ }
135
+
136
+ /** Returns the resolved formatting options based on the values passed to the constructor. */
137
+ resolvedOptions() {
138
+ let options = this.numberFormatter.resolvedOptions();
139
+ if (!supportsSignDisplay && this.options.signDisplay != null) {
140
+ options = _objectSpread2(_objectSpread2({}, options), {}, {
141
+ signDisplay: this.options.signDisplay
142
+ });
143
+ }
144
+ if (!supportsUnit && this.options.style === 'unit') {
145
+ options = _objectSpread2(_objectSpread2({}, options), {}, {
146
+ style: 'unit',
147
+ unit: this.options.unit,
148
+ unitDisplay: this.options.unitDisplay
149
+ });
150
+ }
151
+ return options;
152
+ }
153
+ }
154
+ function getCachedNumberFormatter(locale) {
155
+ let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
156
+ let {
157
+ numberingSystem
158
+ } = options;
159
+ if (numberingSystem && locale.includes('-nu-')) {
160
+ if (!locale.includes('-u-')) {
161
+ locale += '-u-';
162
+ }
163
+ locale += `-nu-${numberingSystem}`;
164
+ }
165
+ if (options.style === 'unit' && !supportsUnit) {
166
+ var _UNITS$unit2;
167
+ let {
168
+ unit,
169
+ unitDisplay = 'short'
170
+ } = options;
171
+ if (!unit) {
172
+ throw new Error('unit option must be provided with style: "unit"');
173
+ }
174
+ if (!((_UNITS$unit2 = UNITS[unit]) !== null && _UNITS$unit2 !== void 0 && _UNITS$unit2[unitDisplay])) {
175
+ throw new Error(`Unsupported unit ${unit} with unitDisplay = ${unitDisplay}`);
176
+ }
177
+ options = _objectSpread2(_objectSpread2({}, options), {}, {
178
+ style: 'decimal'
179
+ });
180
+ }
181
+ let cacheKey = locale + (options ? Object.entries(options).sort((a, b) => a[0] < b[0] ? -1 : 1).join() : '');
182
+ if (formatterCache.has(cacheKey)) {
183
+ return formatterCache.get(cacheKey);
184
+ }
185
+ let numberFormatter = new Intl.NumberFormat(locale, options);
186
+ formatterCache.set(cacheKey, numberFormatter);
187
+ return numberFormatter;
188
+ }
189
+
190
+ /** @private - exported for tests */
191
+ function numberFormatSignDisplayPolyfill(numberFormat, signDisplay, num) {
192
+ if (signDisplay === 'auto') {
193
+ return numberFormat.format(num);
194
+ } else if (signDisplay === 'never') {
195
+ return numberFormat.format(Math.abs(num));
196
+ } else {
197
+ let needsPositiveSign = false;
198
+ if (signDisplay === 'always') {
199
+ needsPositiveSign = num > 0 || Object.is(num, 0);
200
+ } else if (signDisplay === 'exceptZero') {
201
+ if (Object.is(num, -0) || Object.is(num, 0)) {
202
+ num = Math.abs(num);
203
+ } else {
204
+ needsPositiveSign = num > 0;
205
+ }
206
+ }
207
+ if (needsPositiveSign) {
208
+ let negative = numberFormat.format(-num);
209
+ let noSign = numberFormat.format(num);
210
+ // ignore RTL/LTR marker character
211
+ let minus = negative.replace(noSign, '').replace(/\u200e|\u061C/, '');
212
+ if ([...minus].length !== 1) {
213
+ console.warn('@react-aria/i18n polyfill for NumberFormat signDisplay: Unsupported case');
214
+ }
215
+ let positive = negative.replace(noSign, '!!!').replace(minus, '+').replace('!!!', noSign);
216
+ return positive;
217
+ } else {
218
+ return numberFormat.format(num);
219
+ }
220
+ }
221
+ }
222
+
223
+ /* eslint-disable prefer-const */
224
+
225
+ /**
226
+ * Provides localized number formatting for the current locale. Automatically updates when the locale changes,
227
+ * and handles caching of the number formatter for performance.
228
+ * @param options - Formatting options.
229
+ */
230
+ function useNumberFormatter() {
231
+ let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
232
+ let {
233
+ locale
234
+ } = useLocale();
235
+ return useMemo(() => new NumberFormatter(locale, options), [locale, options]);
236
+ }
237
+
238
+ export { NumberFormatter as N, useNumberFormatter as u };
239
+ //# sourceMappingURL=useNumberFormatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useNumberFormatter.js","sources":["../../src/react-aria/internationalized/number/NumberFormatter.ts","../../src/react-aria/react-aria/i18n/useNumberFormatter.ts"],"sourcesContent":["/* eslint-disable prefer-const */\n// @ts-nocheck\n\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nlet formatterCache = new Map<string, Intl.NumberFormat>();\n\nlet supportsSignDisplay = false;\ntry {\n // @ts-ignore\n supportsSignDisplay =\n new Intl.NumberFormat('de-DE', { signDisplay: 'exceptZero' }).resolvedOptions().signDisplay === 'exceptZero';\n // eslint-disable-next-line no-empty\n} catch (e) {}\n\nlet supportsUnit = false;\ntry {\n // @ts-ignore\n supportsUnit = new Intl.NumberFormat('de-DE', { style: 'unit', unit: 'degree' }).resolvedOptions().style === 'unit';\n // eslint-disable-next-line no-empty\n} catch (e) {}\n\n// Polyfill for units since Safari doesn't support them yet. See https://bugs.webkit.org/show_bug.cgi?id=215438.\n// Currently only polyfilling the unit degree in narrow format for ColorSlider in our supported locales.\n// Values were determined by switching to each locale manually in Chrome.\nconst UNITS = {\n degree: {\n narrow: {\n default: '°',\n 'ja-JP': ' 度',\n 'zh-TW': '度',\n 'sl-SI': ' °',\n // Arabic?? But Safari already doesn't use Arabic digits so might be ok...\n // https://bugs.webkit.org/show_bug.cgi?id=218139\n },\n },\n};\n\nexport interface NumberFormatOptions extends Intl.NumberFormatOptions {\n /** Overrides default numbering system for the current locale. */\n numberingSystem?: string;\n}\n\ninterface NumberRangeFormatPart extends Intl.NumberFormatPart {\n source: 'startRange' | 'endRange' | 'shared';\n}\n\n/**\n * A wrapper around Intl.NumberFormat providing additional options, polyfills, and caching for performance.\n */\nexport class NumberFormatter implements Intl.NumberFormat {\n private numberFormatter: Intl.NumberFormat;\n private options: NumberFormatOptions;\n\n constructor(locale: string, options: NumberFormatOptions = {}) {\n this.numberFormatter = getCachedNumberFormatter(locale, options);\n this.options = options;\n }\n\n /** Formats a number value as a string, according to the locale and options provided to the constructor. */\n format(value: number): string {\n let res = '';\n if (!supportsSignDisplay && this.options.signDisplay != null) {\n res = numberFormatSignDisplayPolyfill(this.numberFormatter, this.options.signDisplay, value);\n } else {\n res = this.numberFormatter.format(value);\n }\n\n if (this.options.style === 'unit' && !supportsUnit) {\n let { unit, unitDisplay = 'short', locale } = this.resolvedOptions();\n if (!unit) {\n return res;\n }\n let values = UNITS[unit]?.[unitDisplay];\n res += values[locale] || values.default;\n }\n\n return res;\n }\n\n /** Formats a number to an array of parts such as separators, digits, punctuation, and more. */\n formatToParts(value: number): Intl.NumberFormatPart[] {\n // TODO: implement signDisplay for formatToParts\n // @ts-ignore\n return this.numberFormatter.formatToParts(value);\n }\n\n /** Formats a number range as a string. */\n formatRange(start: number, end: number): string {\n // @ts-ignore\n if (typeof this.numberFormatter.formatRange === 'function') {\n // @ts-ignore\n return this.numberFormatter.formatRange(start, end);\n }\n\n if (end < start) {\n throw new RangeError('End date must be >= start date');\n }\n\n // Very basic fallback for old browsers.\n return `${this.format(start)} – ${this.format(end)}`;\n }\n\n /** Formats a number range as an array of parts. */\n formatRangeToParts(start: number, end: number): NumberRangeFormatPart[] {\n // @ts-ignore\n if (typeof this.numberFormatter.formatRangeToParts === 'function') {\n // @ts-ignore\n return this.numberFormatter.formatRangeToParts(start, end);\n }\n\n if (end < start) {\n throw new RangeError('End date must be >= start date');\n }\n\n let startParts = this.numberFormatter.formatToParts(start);\n let endParts = this.numberFormatter.formatToParts(end);\n return [\n ...startParts.map((p) => ({ ...p, source: 'startRange' } as NumberRangeFormatPart)),\n { type: 'literal', value: ' – ', source: 'shared' },\n ...endParts.map((p) => ({ ...p, source: 'endRange' } as NumberRangeFormatPart)),\n ];\n }\n\n /** Returns the resolved formatting options based on the values passed to the constructor. */\n resolvedOptions(): Intl.ResolvedNumberFormatOptions {\n let options = this.numberFormatter.resolvedOptions();\n if (!supportsSignDisplay && this.options.signDisplay != null) {\n options = { ...options, signDisplay: this.options.signDisplay };\n }\n\n if (!supportsUnit && this.options.style === 'unit') {\n options = { ...options, style: 'unit', unit: this.options.unit, unitDisplay: this.options.unitDisplay };\n }\n\n return options;\n }\n}\n\nfunction getCachedNumberFormatter(locale: string, options: NumberFormatOptions = {}): Intl.NumberFormat {\n let { numberingSystem } = options;\n if (numberingSystem && locale.includes('-nu-')) {\n if (!locale.includes('-u-')) {\n locale += '-u-';\n }\n locale += `-nu-${numberingSystem}`;\n }\n\n if (options.style === 'unit' && !supportsUnit) {\n let { unit, unitDisplay = 'short' } = options;\n if (!unit) {\n throw new Error('unit option must be provided with style: \"unit\"');\n }\n if (!UNITS[unit]?.[unitDisplay]) {\n throw new Error(`Unsupported unit ${unit} with unitDisplay = ${unitDisplay}`);\n }\n options = { ...options, style: 'decimal' };\n }\n\n let cacheKey =\n locale +\n (options\n ? Object.entries(options)\n .sort((a, b) => (a[0] < b[0] ? -1 : 1))\n .join()\n : '');\n if (formatterCache.has(cacheKey)) {\n return formatterCache.get(cacheKey)!;\n }\n\n let numberFormatter = new Intl.NumberFormat(locale, options);\n formatterCache.set(cacheKey, numberFormatter);\n return numberFormatter;\n}\n\n/** @private - exported for tests */\nexport function numberFormatSignDisplayPolyfill(numberFormat: Intl.NumberFormat, signDisplay: string, num: number) {\n if (signDisplay === 'auto') {\n return numberFormat.format(num);\n } else if (signDisplay === 'never') {\n return numberFormat.format(Math.abs(num));\n } else {\n let needsPositiveSign = false;\n if (signDisplay === 'always') {\n needsPositiveSign = num > 0 || Object.is(num, 0);\n } else if (signDisplay === 'exceptZero') {\n if (Object.is(num, -0) || Object.is(num, 0)) {\n num = Math.abs(num);\n } else {\n needsPositiveSign = num > 0;\n }\n }\n\n if (needsPositiveSign) {\n let negative = numberFormat.format(-num);\n let noSign = numberFormat.format(num);\n // ignore RTL/LTR marker character\n let minus = negative.replace(noSign, '').replace(/\\u200e|\\u061C/, '');\n if ([...minus].length !== 1) {\n console.warn('@react-aria/i18n polyfill for NumberFormat signDisplay: Unsupported case');\n }\n let positive = negative.replace(noSign, '!!!').replace(minus, '+').replace('!!!', noSign);\n return positive;\n } else {\n return numberFormat.format(num);\n }\n }\n}\n","/* eslint-disable prefer-const */\n// @ts-nocheck\n/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport { NumberFormatOptions, NumberFormatter } from '../../internationalized/number';\nimport { useLocale } from './context';\nimport { useMemo } from 'react';\n\n/**\n * Provides localized number formatting for the current locale. Automatically updates when the locale changes,\n * and handles caching of the number formatter for performance.\n * @param options - Formatting options.\n */\nexport function useNumberFormatter(options: NumberFormatOptions = {}): Intl.NumberFormat {\n let { locale } = useLocale();\n return useMemo(() => new NumberFormatter(locale, options), [locale, options]);\n}\n"],"names":["formatterCache","Map","supportsSignDisplay","Intl","NumberFormat","signDisplay","resolvedOptions","e","supportsUnit","style","unit","UNITS","degree","narrow","default","NumberFormatter","constructor","locale","options","arguments","length","undefined","_defineProperty","numberFormatter","getCachedNumberFormatter","format","value","res","numberFormatSignDisplayPolyfill","_UNITS$unit","unitDisplay","values","formatToParts","formatRange","start","end","RangeError","formatRangeToParts","startParts","endParts","map","p","_objectSpread","source","type","numberingSystem","includes","_UNITS$unit2","Error","cacheKey","Object","entries","sort","a","b","join","has","get","set","numberFormat","num","Math","abs","needsPositiveSign","is","negative","noSign","minus","replace","console","warn","positive","useNumberFormatter","useLocale","useMemo"],"mappings":"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"}
@@ -0,0 +1,373 @@
1
+ import { b as _objectWithoutProperties, c as _extends } from './_rollupPluginBabelHelpers.js';
2
+ import React__default, { useState, useEffect, forwardRef, useRef, useContext, useMemo } from 'react';
3
+ import classNames from 'classnames';
4
+ import { w as warnIfNoAccessibleLabelFound } from './warnIfNoAccessibleLabelFound.js';
5
+ import styled, { css } from 'styled-components';
6
+ import { S as SideNavigationMenuBarVariant, b as SideNavigationMenuBarContext, a as SideNavigationMenuItem } from './SideNavigationMenuItem.js';
7
+ import { f as filterComponents } from './filterComponents.js';
8
+ import { a as SideNavigationMenu } from './SideNavigationMenu.js';
9
+ import { A as AppContainerContext } from './context.js';
10
+ import { u as useTheme, a as ThemeProvider } from './useTheme.js';
11
+ import { A as AppSidePanelVariant } from './types.js';
12
+
13
+ /**
14
+ * Get the bounding rect of a component.
15
+ */
16
+ const useBoundingClientRect = (ref, deps) => {
17
+ const [boundingRect, setBoundingRect] = useState({});
18
+ useEffect(() => {
19
+ if (ref.current) {
20
+ setBoundingRect(ref.current.getBoundingClientRect());
21
+ }
22
+ }, deps);
23
+ return boundingRect;
24
+ };
25
+
26
+ /**
27
+ * Component style.
28
+ */
29
+ const StyledSideNavigationMenuBar = styled.nav`
30
+ background-color: ${_ref => {
31
+ let {
32
+ $theme
33
+ } = _ref;
34
+ return `var(--redsift-color-${$theme}-components-side-navigation-background)`;
35
+ }};
36
+ box-sizing: content-box;
37
+ overflow-x: hidden;
38
+ overflow-y: auto;
39
+ scrollbar-gutter: stable;
40
+ transition: width 300ms ease-out;
41
+ width: ${_ref2 => {
42
+ let {
43
+ $variant
44
+ } = _ref2;
45
+ return $variant === SideNavigationMenuBarVariant.shrinked ? '64px' : '250px';
46
+ }};
47
+
48
+ ${_ref3 => {
49
+ let {
50
+ $marginTop = 0
51
+ } = _ref3;
52
+ return $marginTop ? css`
53
+ height: calc(100% - ${$marginTop}px);
54
+ ` : '';
55
+ }}
56
+
57
+ ul {
58
+ list-style: none;
59
+ margin: unset;
60
+ padding: unset;
61
+ }
62
+
63
+ scrollbar-color: ${_ref4 => {
64
+ let {
65
+ $theme
66
+ } = _ref4;
67
+ return `var(--redsift-color-${$theme}-components-side-navigation-scrollbar-resting) transparent`;
68
+ }};
69
+ scrollbar-width: thin;
70
+
71
+ &::-webkit-scrollbar {
72
+ block-size: 9px;
73
+ inline-size: 9px;
74
+ }
75
+
76
+ &::-webkit-scrollbar-thumb {
77
+ background-clip: padding-box;
78
+ background-color: ${_ref5 => {
79
+ let {
80
+ $theme
81
+ } = _ref5;
82
+ return `var(--redsift-color-${$theme}-components-side-navigation-scrollbar-resting)`;
83
+ }};
84
+ border-radius: 0px;
85
+ border-left: 2px solid transparent;
86
+ border-right: 2px solid transparent;
87
+ }
88
+
89
+ &::-webkit-scrollbar-track {
90
+ background-color: transparent;
91
+ }
92
+
93
+ &::-webkit-scrollbar-thumb:horizontal,
94
+ &::-webkit-scrollbar-thumb:vertical {
95
+ &:hover {
96
+ background-color: ${_ref6 => {
97
+ let {
98
+ $theme
99
+ } = _ref6;
100
+ return `var(--redsift-color-${$theme}-components-side-navigation-scrollbar-hover)`;
101
+ }};
102
+ }
103
+ }
104
+
105
+ &::-webkit-scrollbar-corner {
106
+ visibility: hidden;
107
+ }
108
+ `;
109
+
110
+ const _excluded$1 = ["aria-label", "aria-labelledby", "canHaveMultipleMenuOpenAtOnce", "children", "className", "isDisabled", "menubarProps", "menubarRef", "theme", "variant"];
111
+ const COMPONENT_NAME = 'SideNavigationMenuBar';
112
+ const CLASSNAME = 'redsift-side-navigation-menu-bar';
113
+
114
+ /**
115
+ * Hook to store the previous index for further use
116
+ */
117
+ const usePrevious = value => {
118
+ const ref = useRef(0);
119
+ useEffect(() => {
120
+ ref.current = value;
121
+ }, [value]);
122
+ return ref.current;
123
+ };
124
+
125
+ /**
126
+ * The SideNavigationMenuBar component.
127
+ */
128
+ const SideNavigationMenuBar = /*#__PURE__*/forwardRef((props, ref) => {
129
+ const navRef = ref || useRef();
130
+ const {
131
+ 'aria-label': ariaLabel,
132
+ 'aria-labelledby': ariaLabelledby,
133
+ canHaveMultipleMenuOpenAtOnce,
134
+ children,
135
+ className,
136
+ isDisabled,
137
+ menubarProps = {},
138
+ menubarRef = useRef(),
139
+ theme: propsTheme,
140
+ variant: propsVariant = SideNavigationMenuBarVariant.standard
141
+ } = props,
142
+ forwardedProps = _objectWithoutProperties(props, _excluded$1);
143
+ warnIfNoAccessibleLabelFound(props, undefined, 'SideNavigationMenuBar');
144
+ const appContainerState = useContext(AppContainerContext);
145
+ const theme = useTheme(propsTheme);
146
+ const {
147
+ top
148
+ } = useBoundingClientRect(navRef, [children]);
149
+ const [variant, setVariant] = useState(appContainerState ? appContainerState.sidePanelVariant === AppSidePanelVariant.hidden ? SideNavigationMenuBarVariant.shrinked : appContainerState.sidePanelVariant : propsVariant);
150
+ const [currentOpenMenuId, setCurrentOpenMenuId] = useState();
151
+ useEffect(() => {
152
+ setVariant(propsVariant);
153
+ }, [propsVariant]);
154
+ useEffect(() => {
155
+ if (appContainerState && appContainerState.sidePanelVariant && appContainerState.sidePanelVariant !== variant) {
156
+ setVariant(appContainerState.sidePanelVariant === AppSidePanelVariant.hidden ? SideNavigationMenuBarVariant.shrinked : appContainerState.sidePanelVariant);
157
+ }
158
+ }, [appContainerState === null || appContainerState === void 0 ? void 0 : appContainerState.sidePanelVariant]);
159
+
160
+ /**
161
+ * Create an array containing only valid children being either SideNavigationMenu or SideNavigationMenuItem.
162
+ */
163
+ const childArray = filterComponents([SideNavigationMenu, SideNavigationMenuItem])(children);
164
+ const navItems = childArray.map((child, index) => {
165
+ var _child$key, _child$key2;
166
+ return /*#__PURE__*/React__default.createElement("li", {
167
+ key: (_child$key = child.key) !== null && _child$key !== void 0 ? _child$key : index,
168
+ role: "none"
169
+ }, /*#__PURE__*/React__default.cloneElement(child, {
170
+ isDisabled: child.props.isDisabled || isDisabled || undefined,
171
+ key: (_child$key2 = child.key) !== null && _child$key2 !== void 0 ? _child$key2 : index,
172
+ tabIndex: index === 0 ? 0 : -1
173
+ }));
174
+ });
175
+ const menuItems = useRef(new Set()).current;
176
+ const [currentIndex, setCurrentIndex] = useState(0);
177
+ const previousIndex = usePrevious(currentIndex);
178
+ const first = () => setCurrentIndex(0);
179
+ const last = () => setCurrentIndex(menuItems.size - 1);
180
+ const next = () => {
181
+ const index = currentIndex === menuItems.size - 1 ? 0 : currentIndex + 1;
182
+ setCurrentIndex(index);
183
+ };
184
+ const previous = () => {
185
+ const index = currentIndex === 0 ? menuItems.size - 1 : currentIndex - 1;
186
+ setCurrentIndex(index);
187
+ };
188
+ const match = event => {
189
+ const items = Array.from(menuItems);
190
+
191
+ // Reorder the array, starting with the currentNode
192
+ const reorderedItems = [...items.slice(currentIndex), ...items.slice(0, currentIndex)];
193
+
194
+ // Find all nodes that begin with the pressed letter
195
+ const matches = reorderedItems.filter(menuItem => {
196
+ const {
197
+ textContent
198
+ } = menuItem;
199
+ // istanbul ignore next
200
+ const firstLetter = textContent === null || textContent === void 0 ? void 0 : textContent.toLowerCase().charAt(0);
201
+ return event.key === firstLetter;
202
+ });
203
+
204
+ // Exit early if there are no matches
205
+ if (!matches.length) {
206
+ return;
207
+ }
208
+
209
+ // If the focused item is a match, focus the next match.
210
+ // Otherwise, focus the first match
211
+ const currentNode = items[currentIndex];
212
+ const nextMatch = matches.includes(currentNode) ? matches[1] : matches[0];
213
+ const index = items.findIndex(item => {
214
+ return item === nextMatch;
215
+ });
216
+ setCurrentIndex(index);
217
+ };
218
+ const keyDown = e => {
219
+ var _menubarProps$onKeyDo, _currentNode$parentNo;
220
+ (_menubarProps$onKeyDo = menubarProps.onKeyDown) === null || _menubarProps$onKeyDo === void 0 ? void 0 : _menubarProps$onKeyDo.call(menubarProps, e);
221
+ e.stopPropagation();
222
+ const currentNode = e.target;
223
+ // istanbul ignore next
224
+ const parentMenu = currentNode === null || currentNode === void 0 ? void 0 : (_currentNode$parentNo = currentNode.parentNode) === null || _currentNode$parentNo === void 0 ? void 0 : _currentNode$parentNo.parentNode;
225
+ const isFromSubmenu = parentMenu.getAttribute('role') === 'menu';
226
+ switch (e.code) {
227
+ case 'ArrowUp':
228
+ e.preventDefault();
229
+ previous();
230
+ break;
231
+ case 'ArrowDown':
232
+ e.preventDefault();
233
+ next();
234
+ break;
235
+ case 'ArrowRight':
236
+ e.preventDefault();
237
+ if (isFromSubmenu) {
238
+ next();
239
+ }
240
+ break;
241
+ case 'End':
242
+ e.preventDefault();
243
+ last();
244
+ break;
245
+ case 'Home':
246
+ e.preventDefault();
247
+ first();
248
+ break;
249
+ case 'Enter':
250
+ case 'Space':
251
+ e.preventDefault();
252
+ currentNode.click();
253
+ break;
254
+ default:
255
+ match(e);
256
+ break;
257
+ }
258
+ };
259
+ const value = useMemo(() => ({
260
+ menuItems,
261
+ sideNavigationMenuBarVariant: variant,
262
+ setSideNavigationMenuBarVariant: setVariant,
263
+ currentOpenMenuId,
264
+ setCurrentOpenMenuId: value => {
265
+ if (!canHaveMultipleMenuOpenAtOnce) {
266
+ setCurrentOpenMenuId(value);
267
+ }
268
+ }
269
+ }), [menuItems, variant, setVariant, currentOpenMenuId, setCurrentOpenMenuId]);
270
+ useEffect(() => {
271
+ if (currentIndex !== previousIndex) {
272
+ const items = Array.from(menuItems);
273
+ const currentNode = items[currentIndex];
274
+ const previousNode = items[previousIndex];
275
+
276
+ // istanbul ignore next
277
+ previousNode === null || previousNode === void 0 ? void 0 : previousNode.setAttribute('tabindex', '-1');
278
+ currentNode === null || currentNode === void 0 ? void 0 : currentNode.setAttribute('tabindex', '0');
279
+ currentNode === null || currentNode === void 0 ? void 0 : currentNode.focus();
280
+ }
281
+ }, [currentIndex, previousIndex, menuItems]);
282
+ return /*#__PURE__*/React__default.createElement(ThemeProvider, {
283
+ value: {
284
+ theme
285
+ }
286
+ }, /*#__PURE__*/React__default.createElement(StyledSideNavigationMenuBar, _extends({}, forwardedProps, {
287
+ $isDisabled: isDisabled,
288
+ $marginTop: top,
289
+ $theme: theme,
290
+ $variant: variant,
291
+ "aria-label": ariaLabel,
292
+ "aria-labelledby": ariaLabelledby,
293
+ className: classNames(SideNavigationMenuBar.className, className),
294
+ ref: navRef
295
+ }), /*#__PURE__*/React__default.createElement(SideNavigationMenuBarContext.Provider, {
296
+ value: value
297
+ }, /*#__PURE__*/React__default.createElement("ul", _extends({}, menubarProps, {
298
+ "aria-label": ariaLabel,
299
+ "aria-labelledby": ariaLabelledby,
300
+ "aria-orientation": "vertical",
301
+ onKeyDown: keyDown,
302
+ ref: menubarRef,
303
+ role: "menubar"
304
+ }), navItems))));
305
+ });
306
+ SideNavigationMenuBar.className = CLASSNAME;
307
+ SideNavigationMenuBar.displayName = COMPONENT_NAME;
308
+
309
+ const _excluded = ["title", "href", "ref"],
310
+ _excluded2 = ["title", "children", "ref"],
311
+ _excluded3 = ["title", "href", "ref"];
312
+ const isMenu = item => {
313
+ return item.children !== undefined;
314
+ };
315
+ const useSideNavigationMenuBar = _ref => {
316
+ let {
317
+ items,
318
+ isActive
319
+ } = _ref;
320
+ const menuBarChildren = [];
321
+ items.map(item => {
322
+ if (!isMenu(item)) {
323
+ const {
324
+ title,
325
+ href,
326
+ ref
327
+ } = item,
328
+ rest = _objectWithoutProperties(item, _excluded);
329
+ menuBarChildren.push( /*#__PURE__*/React__default.createElement(SideNavigationMenuItem, _extends({
330
+ key: title,
331
+ isCurrent: isActive ? isActive(href) : undefined
332
+ }, rest, {
333
+ href: href,
334
+ ref: ref
335
+ }), title));
336
+ } else {
337
+ const {
338
+ title,
339
+ children,
340
+ ref
341
+ } = item,
342
+ rest = _objectWithoutProperties(item, _excluded2);
343
+ menuBarChildren.push( /*#__PURE__*/React__default.createElement(SideNavigationMenu, _extends({
344
+ key: title,
345
+ "aria-label": title,
346
+ isExpanded: isActive ? children.filter(child => isActive(child.href)).length > 0 : undefined,
347
+ hasBadge: children.filter(child => child.badge).length > 0
348
+ }, rest, {
349
+ ref: ref
350
+ }), children.map(child => {
351
+ const {
352
+ title,
353
+ href,
354
+ ref
355
+ } = child,
356
+ rest = _objectWithoutProperties(child, _excluded3);
357
+ return /*#__PURE__*/React__default.createElement(SideNavigationMenuItem, _extends({
358
+ key: title,
359
+ href: href,
360
+ isCurrent: isActive ? isActive(href) : undefined
361
+ }, rest, {
362
+ ref: ref
363
+ }), title);
364
+ })));
365
+ }
366
+ });
367
+ return {
368
+ children: menuBarChildren
369
+ };
370
+ };
371
+
372
+ export { SideNavigationMenuBar as S, useSideNavigationMenuBar as a, useBoundingClientRect as u };
373
+ //# sourceMappingURL=useSideNavigationMenuBar.js.map