@adobe/react-spectrum 3.47.1 → 3.47.2

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 (232) hide show
  1. package/dist/private/accordion_vars.css +66 -48
  2. package/dist/private/accordion_vars.css.map +1 -1
  3. package/dist/private/actionbar/ActionBar.cjs.map +1 -1
  4. package/dist/private/actionbar/ActionBar.js.map +1 -1
  5. package/dist/private/actionbar/ActionBar.mjs.map +1 -1
  6. package/dist/private/actionbar/actionbar.css +59 -57
  7. package/dist/private/actionbar/actionbar.css.map +1 -1
  8. package/dist/private/actiongroup/ActionGroup.cjs +1 -1
  9. package/dist/private/actiongroup/ActionGroup.cjs.map +1 -1
  10. package/dist/private/actiongroup/ActionGroup.js +1 -1
  11. package/dist/private/actiongroup/ActionGroup.js.map +1 -1
  12. package/dist/private/actiongroup/ActionGroup.mjs +1 -1
  13. package/dist/private/actiongroup/ActionGroup.mjs.map +1 -1
  14. package/dist/private/actiongroup_vars.css +124 -114
  15. package/dist/private/actiongroup_vars.css.map +1 -1
  16. package/dist/private/autocomplete/MobileSearchAutocomplete.cjs.map +1 -1
  17. package/dist/private/autocomplete/MobileSearchAutocomplete.js.map +1 -1
  18. package/dist/private/autocomplete/MobileSearchAutocomplete.mjs.map +1 -1
  19. package/dist/private/autocomplete/SearchAutocomplete.cjs.map +1 -1
  20. package/dist/private/autocomplete/SearchAutocomplete.js.map +1 -1
  21. package/dist/private/autocomplete/SearchAutocomplete.mjs.map +1 -1
  22. package/dist/private/autocomplete/searchautocomplete.css +6 -6
  23. package/dist/private/autocomplete/searchautocomplete.css.map +1 -1
  24. package/dist/private/avatar_vars.css +12 -7
  25. package/dist/private/avatar_vars.css.map +1 -1
  26. package/dist/private/badge_vars.css +76 -68
  27. package/dist/private/badge_vars.css.map +1 -1
  28. package/dist/private/barloader_vars.css +132 -112
  29. package/dist/private/barloader_vars.css.map +1 -1
  30. package/dist/private/breadcrumb_vars.css +182 -148
  31. package/dist/private/breadcrumb_vars.css.map +1 -1
  32. package/dist/private/button/Button.cjs.map +1 -1
  33. package/dist/private/button/Button.js.map +1 -1
  34. package/dist/private/button/Button.mjs.map +1 -1
  35. package/dist/private/button_vars.css +822 -785
  36. package/dist/private/button_vars.css.map +1 -1
  37. package/dist/private/buttongroup_vars.css +25 -24
  38. package/dist/private/buttongroup_vars.css.map +1 -1
  39. package/dist/private/buttongroup_vars_css.cjs +5 -5
  40. package/dist/private/buttongroup_vars_css.mjs +5 -5
  41. package/dist/private/calendar/CalendarBase.cjs.map +1 -1
  42. package/dist/private/calendar/CalendarBase.js.map +1 -1
  43. package/dist/private/calendar/CalendarBase.mjs.map +1 -1
  44. package/dist/private/calendar_vars.css +280 -256
  45. package/dist/private/calendar_vars.css.map +1 -1
  46. package/dist/private/card/BaseLayout.cjs +2 -2
  47. package/dist/private/card/BaseLayout.cjs.map +1 -1
  48. package/dist/private/card/BaseLayout.js +2 -2
  49. package/dist/private/card/BaseLayout.js.map +1 -1
  50. package/dist/private/card/BaseLayout.mjs +2 -2
  51. package/dist/private/card/BaseLayout.mjs.map +1 -1
  52. package/dist/private/card/CardView.cjs.map +1 -1
  53. package/dist/private/card/CardView.js.map +1 -1
  54. package/dist/private/card/CardView.mjs.map +1 -1
  55. package/dist/private/card_vars.css +995 -907
  56. package/dist/private/card_vars.css.map +1 -1
  57. package/dist/private/checkbox_vars.css +318 -219
  58. package/dist/private/checkbox_vars.css.map +1 -1
  59. package/dist/private/circleloader_vars.css +99 -85
  60. package/dist/private/circleloader_vars.css.map +1 -1
  61. package/dist/private/color/ColorEditor.cjs.map +1 -1
  62. package/dist/private/color/ColorEditor.js.map +1 -1
  63. package/dist/private/color/ColorEditor.mjs.map +1 -1
  64. package/dist/private/color/ColorPicker.css +28 -14
  65. package/dist/private/color/ColorPicker.css.map +1 -1
  66. package/dist/private/color/colorfield.css +3 -3
  67. package/dist/private/color/colorfield.css.map +1 -1
  68. package/dist/private/colorarea_vars.css +36 -29
  69. package/dist/private/colorarea_vars.css.map +1 -1
  70. package/dist/private/colorhandle_vars.css +23 -23
  71. package/dist/private/colorloupe_vars.css +5 -5
  72. package/dist/private/colorloupe_vars.css.map +1 -1
  73. package/dist/private/colorslider_vars.css +34 -34
  74. package/dist/private/colorslider_vars.css.map +1 -1
  75. package/dist/private/colorwheel_vars.css +44 -38
  76. package/dist/private/colorwheel_vars.css.map +1 -1
  77. package/dist/private/combobox/ComboBox.cjs.map +1 -1
  78. package/dist/private/combobox/ComboBox.js.map +1 -1
  79. package/dist/private/combobox/ComboBox.mjs.map +1 -1
  80. package/dist/private/combobox/MobileComboBox.cjs.map +1 -1
  81. package/dist/private/combobox/MobileComboBox.js.map +1 -1
  82. package/dist/private/combobox/MobileComboBox.mjs.map +1 -1
  83. package/dist/private/combobox/combobox.css +6 -6
  84. package/dist/private/combobox/combobox.css.map +1 -1
  85. package/dist/private/contextualhelp/ContextualHelp.cjs.map +1 -1
  86. package/dist/private/contextualhelp/ContextualHelp.js.map +1 -1
  87. package/dist/private/contextualhelp/ContextualHelp.mjs.map +1 -1
  88. package/dist/private/contextualhelp_vars.css +13 -13
  89. package/dist/private/contextualhelp_vars.css.map +1 -1
  90. package/dist/private/datepicker/DatePicker.cjs.map +1 -1
  91. package/dist/private/datepicker/DatePicker.js.map +1 -1
  92. package/dist/private/datepicker/DatePicker.mjs.map +1 -1
  93. package/dist/private/datepicker/DateRangePicker.cjs.map +1 -1
  94. package/dist/private/datepicker/DateRangePicker.js.map +1 -1
  95. package/dist/private/datepicker/DateRangePicker.mjs.map +1 -1
  96. package/dist/private/datepicker/styles.css +33 -31
  97. package/dist/private/datepicker/styles.css.map +1 -1
  98. package/dist/private/dialog/AlertDialog.cjs.map +1 -1
  99. package/dist/private/dialog/AlertDialog.js.map +1 -1
  100. package/dist/private/dialog/AlertDialog.mjs.map +1 -1
  101. package/dist/private/dialog/Dialog.cjs.map +1 -1
  102. package/dist/private/dialog/Dialog.js.map +1 -1
  103. package/dist/private/dialog/Dialog.mjs.map +1 -1
  104. package/dist/private/dialog_vars.css +216 -180
  105. package/dist/private/dialog_vars.css.map +1 -1
  106. package/dist/private/dropdown_vars.css +150 -114
  107. package/dist/private/dropdown_vars.css.map +1 -1
  108. package/dist/private/dropzone/DropZone.cjs.map +1 -1
  109. package/dist/private/dropzone/DropZone.js.map +1 -1
  110. package/dist/private/dropzone/DropZone.mjs.map +1 -1
  111. package/dist/private/dropzone_vars.css +114 -85
  112. package/dist/private/dropzone_vars.css.map +1 -1
  113. package/dist/private/fieldgroup_vars.css +54 -46
  114. package/dist/private/fieldgroup_vars.css.map +1 -1
  115. package/dist/private/fieldlabel_vars.css +183 -169
  116. package/dist/private/fieldlabel_vars.css.map +1 -1
  117. package/dist/private/helptext_vars.css +83 -69
  118. package/dist/private/helptext_vars.css.map +1 -1
  119. package/dist/private/icon_vars.css +52 -36
  120. package/dist/private/icon_vars.css.map +1 -1
  121. package/dist/private/illustratedmessage_vars.css +33 -31
  122. package/dist/private/illustratedmessage_vars.css.map +1 -1
  123. package/dist/private/inlinealert/InlineAlert.cjs.map +1 -1
  124. package/dist/private/inlinealert/InlineAlert.js.map +1 -1
  125. package/dist/private/inlinealert/InlineAlert.mjs.map +1 -1
  126. package/dist/private/inlinealert_vars.css +54 -46
  127. package/dist/private/inlinealert_vars.css.map +1 -1
  128. package/dist/private/inputgroup_vars.css +499 -319
  129. package/dist/private/inputgroup_vars.css.map +1 -1
  130. package/dist/private/label/Label.cjs.map +1 -1
  131. package/dist/private/label/Label.js.map +1 -1
  132. package/dist/private/label/Label.mjs.map +1 -1
  133. package/dist/private/link_vars.css +101 -85
  134. package/dist/private/link_vars.css.map +1 -1
  135. package/dist/private/list/ListView.cjs.map +1 -1
  136. package/dist/private/list/ListView.js.map +1 -1
  137. package/dist/private/list/ListView.mjs.map +1 -1
  138. package/dist/private/list/styles.css +425 -333
  139. package/dist/private/list/styles.css.map +1 -1
  140. package/dist/private/listbox/ListBoxBase.cjs.map +1 -1
  141. package/dist/private/listbox/ListBoxBase.js.map +1 -1
  142. package/dist/private/listbox/ListBoxBase.mjs.map +1 -1
  143. package/dist/private/menu/ActionMenu.cjs.map +1 -1
  144. package/dist/private/menu/ActionMenu.js.map +1 -1
  145. package/dist/private/menu/ActionMenu.mjs.map +1 -1
  146. package/dist/private/menu/Menu.cjs.map +1 -1
  147. package/dist/private/menu/Menu.js.map +1 -1
  148. package/dist/private/menu/Menu.mjs.map +1 -1
  149. package/dist/private/menu/MenuItem.cjs.map +1 -1
  150. package/dist/private/menu/MenuItem.js.map +1 -1
  151. package/dist/private/menu/MenuItem.mjs.map +1 -1
  152. package/dist/private/menu_vars.css +178 -160
  153. package/dist/private/menu_vars.css.map +1 -1
  154. package/dist/private/modal_vars.css +64 -54
  155. package/dist/private/modal_vars.css.map +1 -1
  156. package/dist/private/overlays/overlays.css +7 -5
  157. package/dist/private/overlays/overlays.css.map +1 -1
  158. package/dist/private/package.cjs +1 -1
  159. package/dist/private/package.cjs.map +1 -1
  160. package/dist/private/package.js +1 -1
  161. package/dist/private/package.js.map +1 -1
  162. package/dist/private/package.mjs +1 -1
  163. package/dist/private/package.mjs.map +1 -1
  164. package/dist/private/page_vars.css +54 -46
  165. package/dist/private/page_vars.css.map +1 -1
  166. package/dist/private/picker/Picker.cjs.map +1 -1
  167. package/dist/private/picker/Picker.js.map +1 -1
  168. package/dist/private/picker/Picker.mjs.map +1 -1
  169. package/dist/private/popover_vars.css +105 -83
  170. package/dist/private/popover_vars.css.map +1 -1
  171. package/dist/private/radio_vars.css +257 -163
  172. package/dist/private/radio_vars.css.map +1 -1
  173. package/dist/private/rule_vars.css +73 -63
  174. package/dist/private/rule_vars.css.map +1 -1
  175. package/dist/private/search_vars.css +95 -87
  176. package/dist/private/search_vars.css.map +1 -1
  177. package/dist/private/slider/RangeSlider.cjs.map +1 -1
  178. package/dist/private/slider/RangeSlider.js.map +1 -1
  179. package/dist/private/slider/RangeSlider.mjs.map +1 -1
  180. package/dist/private/slider_vars.css +516 -402
  181. package/dist/private/slider_vars.css.map +1 -1
  182. package/dist/private/statuslight_vars.css +76 -68
  183. package/dist/private/statuslight_vars.css.map +1 -1
  184. package/dist/private/steplist/StepListItem.cjs.map +1 -1
  185. package/dist/private/steplist/StepListItem.js.map +1 -1
  186. package/dist/private/steplist/StepListItem.mjs.map +1 -1
  187. package/dist/private/steplist_vars.css +371 -297
  188. package/dist/private/steplist_vars.css.map +1 -1
  189. package/dist/private/stepper_vars.css +557 -438
  190. package/dist/private/stepper_vars.css.map +1 -1
  191. package/dist/private/table/Resizer.cjs.map +1 -1
  192. package/dist/private/table/Resizer.js.map +1 -1
  193. package/dist/private/table/Resizer.mjs.map +1 -1
  194. package/dist/private/table/TableViewBase.cjs.map +1 -1
  195. package/dist/private/table/TableViewBase.js.map +1 -1
  196. package/dist/private/table/TableViewBase.mjs.map +1 -1
  197. package/dist/private/table/table.css +103 -95
  198. package/dist/private/table/table.css.map +1 -1
  199. package/dist/private/table_vars.css +458 -350
  200. package/dist/private/table_vars.css.map +1 -1
  201. package/dist/private/tabs_vars.css +319 -281
  202. package/dist/private/tabs_vars.css.map +1 -1
  203. package/dist/private/tag/TagGroup.cjs.map +1 -1
  204. package/dist/private/tag/TagGroup.js.map +1 -1
  205. package/dist/private/tag/TagGroup.mjs.map +1 -1
  206. package/dist/private/tags_vars.css +167 -149
  207. package/dist/private/tags_vars.css.map +1 -1
  208. package/dist/private/textfield/TextFieldBase.cjs.map +1 -1
  209. package/dist/private/textfield/TextFieldBase.js.map +1 -1
  210. package/dist/private/textfield/TextFieldBase.mjs.map +1 -1
  211. package/dist/private/textfield_vars.css +278 -250
  212. package/dist/private/textfield_vars.css.map +1 -1
  213. package/dist/private/toast/Toast.cjs.map +1 -1
  214. package/dist/private/toast/Toast.js.map +1 -1
  215. package/dist/private/toast/Toast.mjs.map +1 -1
  216. package/dist/private/toast/toastContainer.css +64 -56
  217. package/dist/private/toast/toastContainer.css.map +1 -1
  218. package/dist/private/toast_vars.css +5 -3
  219. package/dist/private/toast_vars.css.map +1 -1
  220. package/dist/private/toggle_vars.css +287 -211
  221. package/dist/private/toggle_vars.css.map +1 -1
  222. package/dist/private/tooltip_vars.css +150 -127
  223. package/dist/private/tooltip_vars.css.map +1 -1
  224. package/dist/private/tray_vars.css +54 -46
  225. package/dist/private/tray_vars.css.map +1 -1
  226. package/dist/private/typography_index.css +54 -46
  227. package/dist/private/typography_index.css.map +1 -1
  228. package/dist/private/underlay_vars.css +58 -50
  229. package/dist/private/underlay_vars.css.map +1 -1
  230. package/dist/private/well_vars.css +54 -46
  231. package/dist/private/well_vars.css.map +1 -1
  232. package/package.json +6 -6
@@ -1 +1 @@
1
- {"mappings":"AA4DA;;;;;AAKE;;;;AAKA;;;;AAKA;;;;AAIA;;;;AAIA;;;;AAKA;;;;AAQA;;;;AAIA;;;;AAMF;;;;;;;;AAUE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+SA","sources":["packages/@adobe/spectrum-css-temp/components/tabs/vars.css"],"sourcesContent":["/*\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\n@import './index.css';\n@import './skin.css';\n"],"names":[],"version":3,"file":"tabs_vars.css.map"}
1
+ {"mappings":"AA4DA;;;;EAKE;;;;EAKA;;;;EAKA;;;;EAIA;;;;EAIA;;;;EAKA;;;;EAQA;;;;EAIA;;;;;AAMF;;;;;;;EAUE;;;;;;;;;;;;;EAsBE;;;;;;;;AAQF;;;;;EAKE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAuFE;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiCN;;;;;;AAME;;;;;AAiBF;;;;;;;;;EAUM;;;;;;;;;;;;;;;;;;;;;AAqBN;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAgDA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA8CA;;;;;;;;;;IAWI;;;;;;IAMJ;;;;;;;;;;;EAWE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAgCE;;;;;;;;;;;;;;;;;;MAcE","sources":["packages/@adobe/spectrum-css-temp/components/tabs/vars.css"],"sourcesContent":["/*\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\n@import './index.css';\n@import './skin.css';\n"],"names":[],"version":3,"file":"tabs_vars.css.map"}
@@ -1 +1 @@
1
- {"mappings":"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","sources":["packages/@adobe/react-spectrum/src/tag/TagGroup.tsx"],"sourcesContent":["/*\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 {ActionButton} from '../button/ActionButton';\n\nimport {AriaTagGroupProps, useTagGroup} from 'react-aria/useTagGroup';\nimport {classNames} from '../utils/classNames';\nimport {\n Collection,\n DOMRef,\n Node,\n SpectrumLabelableProps,\n StyleProps,\n Validation\n} from '@react-types/shared';\nimport {Field} from '../label/Field';\nimport {FocusRing} from 'react-aria/FocusRing';\nimport {FocusScope} from 'react-aria/FocusScope';\nimport intlMessages from '../../intl/tag/*.json';\n// @ts-ignore\nimport {ListCollection} from 'react-stately/private/list/ListCollection';\nimport {ListKeyboardDelegate} from 'react-aria/ListKeyboardDelegate';\nimport {Provider, useProvider, useProviderProps} from '../provider/Provider';\nimport React, {JSX, ReactNode, useCallback, useEffect, useMemo, useRef, useState} from 'react';\nimport styles from '@adobe/spectrum-css-temp/components/tags/vars.css';\nimport {Tag} from './Tag';\nimport {useDOMRef} from '../utils/useDOMRef';\nimport {useFormProps} from '../form/Form';\nimport {useId} from 'react-aria/useId';\nimport {useLayoutEffect} from 'react-aria/private/utils/useLayoutEffect';\nimport {useListState} from 'react-stately/useListState';\nimport {useLocale} from 'react-aria/I18nProvider';\nimport {useLocalizedStringFormatter} from 'react-aria/useLocalizedStringFormatter';\nimport {useResizeObserver} from 'react-aria/private/utils/useResizeObserver';\nimport {useValueEffect} from 'react-aria/private/utils/useValueEffect';\n\nconst TAG_STYLES = {\n medium: {\n height: 24,\n margin: 4\n },\n large: {\n height: 30,\n margin: 5\n }\n};\n\nexport interface SpectrumTagGroupProps<T>\n extends\n Omit<\n AriaTagGroupProps<T>,\n | 'selectionMode'\n | 'disallowEmptySelection'\n | 'selectedKeys'\n | 'defaultSelectedKeys'\n | 'onSelectionChange'\n | 'selectionBehavior'\n | 'disabledKeys'\n >,\n StyleProps,\n Omit<SpectrumLabelableProps, 'isRequired' | 'necessityIndicator'>,\n Pick<Validation<any>, 'isInvalid' | 'validationState'> {\n /** The label to display on the action button. */\n actionLabel?: string;\n /** Handler that is called when the action button is pressed. */\n onAction?: () => void;\n /** Sets what the TagGroup should render when there are no tags to display. */\n renderEmptyState?: () => JSX.Element;\n /**\n * Limit the number of rows initially shown. This will render a button that allows the user to\n * expand to show all tags.\n */\n maxRows?: number;\n}\n\n/**\n * Tags allow users to categorize content. They can represent keywords or people, and are grouped to\n * describe an item or a search request.\n */\nexport const TagGroup = React.forwardRef(function TagGroup<T extends object>(\n props: SpectrumTagGroupProps<T>,\n ref: DOMRef<HTMLDivElement>\n) {\n props = useProviderProps(props);\n props = useFormProps(props);\n let {\n maxRows,\n children,\n actionLabel,\n onAction,\n labelPosition,\n renderEmptyState = () => stringFormatter.format('noTags')\n } = props;\n let domRef = useDOMRef(ref);\n let containerRef = useRef<HTMLDivElement>(null);\n let tagsRef = useRef<HTMLDivElement | null>(null);\n let {direction} = useLocale();\n let {scale} = useProvider();\n let stringFormatter = useLocalizedStringFormatter(intlMessages, '@react-spectrum/tag');\n let [isCollapsed, setIsCollapsed] = useState(maxRows != null);\n let state = useListState(props);\n let [tagState, setTagState] = useValueEffect({\n visibleTagCount: state.collection.size,\n showCollapseButton: false\n });\n let keyboardDelegate = useMemo(() => {\n let collection = (\n isCollapsed\n ? new ListCollection([...state.collection].slice(0, tagState.visibleTagCount))\n : new ListCollection([...state.collection])\n ) as Collection<Node<T>>;\n return new ListKeyboardDelegate({\n collection,\n ref: tagsRef,\n direction,\n orientation: 'horizontal'\n });\n }, [\n direction,\n isCollapsed,\n state.collection,\n tagState.visibleTagCount,\n tagsRef\n ]) as ListKeyboardDelegate<T>;\n // Remove onAction from props so it doesn't make it into useGridList.\n delete props.onAction;\n let {gridProps, labelProps, descriptionProps, errorMessageProps} = useTagGroup(\n {...props, keyboardDelegate},\n state,\n tagsRef\n );\n let actionsId = useId();\n let actionsRef = useRef<HTMLDivElement>(null);\n\n let updateVisibleTagCount = useCallback(() => {\n if (maxRows && maxRows > 0) {\n let computeVisibleTagCount = () => {\n // Refs can be null at runtime.\n let currContainerRef: HTMLDivElement | null = containerRef.current;\n let currTagsRef: HTMLDivElement | null = tagsRef.current;\n let currActionsRef: HTMLDivElement | null = actionsRef.current;\n if (!currContainerRef || !currTagsRef || !currActionsRef || state.collection.size === 0) {\n return {\n visibleTagCount: 0,\n showCollapseButton: false\n };\n }\n\n // Count rows and show tags until we hit the maxRows.\n let tags = [...currTagsRef.children];\n let currY = -Infinity;\n let rowCount = 0;\n let index = 0;\n let tagWidths: number[] = [];\n for (let tag of tags) {\n let {width, y} = tag.getBoundingClientRect();\n\n if (y !== currY) {\n currY = y;\n rowCount++;\n }\n\n if (maxRows && rowCount > maxRows) {\n break;\n }\n tagWidths.push(width);\n index++;\n }\n\n // Remove tags until there is space for the collapse button and action button (if present) on the last row.\n let buttons = [...currActionsRef.children];\n if (\n maxRows &&\n buttons.length > 0 &&\n rowCount >= maxRows &&\n currContainerRef.parentElement\n ) {\n let buttonsWidth = buttons.reduce(\n (acc, curr) => (acc += curr.getBoundingClientRect().width),\n 0\n );\n buttonsWidth += TAG_STYLES[scale].margin * 2 * buttons.length;\n let end = direction === 'ltr' ? 'right' : 'left';\n let containerEnd = currContainerRef.parentElement.getBoundingClientRect()[end];\n let lastTagEnd = tags[index - 1]?.getBoundingClientRect()[end];\n lastTagEnd += TAG_STYLES[scale].margin;\n let availableWidth = containerEnd - lastTagEnd;\n\n while (availableWidth < buttonsWidth && index > 0) {\n availableWidth += tagWidths.pop()!;\n index--;\n }\n }\n\n return {\n visibleTagCount: Math.max(index, 1),\n showCollapseButton: index < state.collection.size\n };\n };\n\n setTagState(function* () {\n // Update to show all items.\n yield {visibleTagCount: state.collection.size, showCollapseButton: true};\n\n // Measure, and update to show the items until maxRows is reached.\n yield computeVisibleTagCount();\n });\n }\n }, [maxRows, setTagState, direction, scale, state.collection.size]);\n\n useResizeObserver({ref: containerRef, onResize: updateVisibleTagCount});\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useLayoutEffect(updateVisibleTagCount, [children]);\n\n useEffect(() => {\n // Recalculate visible tags when fonts are loaded.\n document.fonts?.ready.then(() => updateVisibleTagCount());\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n let visibleTags = useMemo(\n () =>\n [...state.collection].slice(\n 0,\n isCollapsed ? tagState.visibleTagCount : state.collection.size\n ),\n [isCollapsed, state.collection, tagState.visibleTagCount]\n );\n\n let handlePressCollapse = () => {\n // Prevents button from losing focus if focusedKey got collapsed.\n state.selectionManager.setFocusedKey(null);\n setIsCollapsed(prevCollapsed => !prevCollapsed);\n };\n\n let showActions = tagState.showCollapseButton || (actionLabel && onAction);\n let isEmpty = state.collection.size === 0;\n\n let containerStyle = useMemo(() => {\n if (maxRows == null || !isCollapsed || isEmpty) {\n return undefined;\n }\n let maxHeight = (TAG_STYLES[scale].height + TAG_STYLES[scale].margin * 2) * maxRows;\n return {maxHeight, overflow: 'hidden'};\n }, [isCollapsed, maxRows, isEmpty, scale]);\n\n return (\n <FocusScope>\n <Field\n {...props}\n labelProps={labelProps}\n descriptionProps={descriptionProps}\n errorMessageProps={errorMessageProps}\n showErrorIcon\n ref={domRef}\n elementType=\"span\"\n wrapperClassName={classNames(styles, 'spectrum-Tags-fieldWrapper', {\n 'spectrum-Tags-fieldWrapper--positionSide': labelPosition === 'side'\n })}>\n <div\n ref={containerRef}\n style={containerStyle}\n className={classNames(styles, 'spectrum-Tags-container', {\n 'spectrum-Tags-container--empty': isEmpty\n })}>\n <FocusRing focusRingClass={classNames(styles, 'focus-ring')}>\n <div ref={tagsRef} {...gridProps} className={classNames(styles, 'spectrum-Tags')}>\n {visibleTags.map(item => (\n <Tag {...item.props} key={item.key} item={item} state={state}>\n {item.rendered}\n </Tag>\n ))}\n {isEmpty && (\n <div className={classNames(styles, 'spectrum-Tags-empty-state')}>\n {renderEmptyState()}\n </div>\n )}\n </div>\n </FocusRing>\n {showActions && !isEmpty && (\n <Provider isDisabled={false}>\n <div\n role=\"group\"\n ref={actionsRef}\n id={actionsId}\n aria-label={stringFormatter.format('actions')}\n aria-labelledby={`${gridProps.id} ${actionsId}`}\n className={classNames(styles, 'spectrum-Tags-actions')}>\n {tagState.showCollapseButton && (\n <ActionButton\n isQuiet\n onPress={handlePressCollapse}\n UNSAFE_className={classNames(styles, 'spectrum-Tags-actionButton')}>\n {isCollapsed\n ? stringFormatter.format('showAllButtonLabel', {\n tagCount: state.collection.size\n })\n : stringFormatter.format('hideButtonLabel')}\n </ActionButton>\n )}\n {actionLabel && onAction && (\n <ActionButton\n isQuiet\n onPress={() => onAction?.()}\n UNSAFE_className={classNames(styles, 'spectrum-Tags-actionButton')}>\n {actionLabel}\n </ActionButton>\n )}\n </div>\n </Provider>\n )}\n </div>\n </Field>\n </FocusScope>\n );\n}) as <T>(props: SpectrumTagGroupProps<T> & {ref?: DOMRef<HTMLDivElement>}) => ReactNode;\n"],"names":[],"version":3,"file":"TagGroup.cjs.map"}
1
+ {"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;CAUC;;;;;;;;;;;;;;;;;;;;;;AAiCD,MAAM,mCAAa;IACjB,QAAQ;QACN,QAAQ;QACR,QAAQ;IACV;IACA,OAAO;QACL,QAAQ;QACR,QAAQ;IACV;AACF;AAkCO,MAAM,0DAAW,CAAA,GAAA,sCAAI,EAAE,UAAU,CAAC,SAAS,SAChD,KAA+B,EAC/B,GAA2B;IAE3B,QAAQ,CAAA,GAAA,0CAAe,EAAE;IACzB,QAAQ,CAAA,GAAA,sCAAW,EAAE;IACrB,IAAI,WACF,OAAO,YACP,QAAQ,eACR,WAAW,YACX,QAAQ,iBACR,aAAa,oBACb,mBAAmB,IAAM,gBAAgB,MAAM,CAAC,WACjD,GAAG;IACJ,IAAI,SAAS,CAAA,GAAA,mCAAQ,EAAE;IACvB,IAAI,eAAe,CAAA,GAAA,mBAAK,EAAkB;IAC1C,IAAI,UAAU,CAAA,GAAA,mBAAK,EAAyB;IAC5C,IAAI,aAAC,SAAS,EAAC,GAAG,CAAA,GAAA,sCAAQ;IAC1B,IAAI,SAAC,KAAK,EAAC,GAAG,CAAA,GAAA,qCAAU;IACxB,IAAI,kBAAkB,CAAA,GAAA,uEAA0B,EAAE,CAAA,GAAA,mDAAW,GAAG;IAChE,IAAI,CAAC,aAAa,eAAe,GAAG,CAAA,GAAA,qBAAO,EAAE,WAAW;IACxD,IAAI,QAAQ,CAAA,GAAA,4CAAW,EAAE;IACzB,IAAI,CAAC,UAAU,YAAY,GAAG,CAAA,GAAA,yDAAa,EAAE;QAC3C,iBAAiB,MAAM,UAAU,CAAC,IAAI;QACtC,oBAAoB;IACtB;IACA,IAAI,mBAAmB,CAAA,GAAA,oBAAM,EAAE;QAC7B,IAAI,aACF,cACI,IAAI,CAAA,GAAA,2DAAa,EAAE;eAAI,MAAM,UAAU;SAAC,CAAC,KAAK,CAAC,GAAG,SAAS,eAAe,KAC1E,IAAI,CAAA,GAAA,2DAAa,EAAE;eAAI,MAAM,UAAU;SAAC;QAE9C,OAAO,IAAI,CAAA,GAAA,yDAAmB,EAAE;wBAC9B;YACA,KAAK;uBACL;YACA,aAAa;QACf;IACF,GAAG;QACD;QACA;QACA,MAAM,UAAU;QAChB,SAAS,eAAe;QACxB;KACD;IACD,qEAAqE;IACrE,OAAO,MAAM,QAAQ;IACrB,IAAI,aAAC,SAAS,cAAE,UAAU,oBAAE,gBAAgB,qBAAE,iBAAiB,EAAC,GAAG,CAAA,GAAA,uCAAU,EAC3E;QAAC,GAAG,KAAK;0BAAE;IAAgB,GAC3B,OACA;IAEF,IAAI,YAAY,CAAA,GAAA,2BAAI;IACpB,IAAI,aAAa,CAAA,GAAA,mBAAK,EAAkB;IAExC,IAAI,wBAAwB,CAAA,GAAA,wBAAU,EAAE;QACtC,IAAI,WAAW,UAAU,GAAG;YAC1B,IAAI,yBAAyB;gBAC3B,+BAA+B;gBAC/B,IAAI,mBAA0C,aAAa,OAAO;gBAClE,IAAI,cAAqC,QAAQ,OAAO;gBACxD,IAAI,iBAAwC,WAAW,OAAO;gBAC9D,IAAI,CAAC,oBAAoB,CAAC,eAAe,CAAC,kBAAkB,MAAM,UAAU,CAAC,IAAI,KAAK,GACpF,OAAO;oBACL,iBAAiB;oBACjB,oBAAoB;gBACtB;gBAGF,qDAAqD;gBACrD,IAAI,OAAO;uBAAI,YAAY,QAAQ;iBAAC;gBACpC,IAAI,QAAQ,CAAC;gBACb,IAAI,WAAW;gBACf,IAAI,QAAQ;gBACZ,IAAI,YAAsB,EAAE;gBAC5B,KAAK,IAAI,OAAO,KAAM;oBACpB,IAAI,SAAC,KAAK,KAAE,CAAC,EAAC,GAAG,IAAI,qBAAqB;oBAE1C,IAAI,MAAM,OAAO;wBACf,QAAQ;wBACR;oBACF;oBAEA,IAAI,WAAW,WAAW,SACxB;oBAEF,UAAU,IAAI,CAAC;oBACf;gBACF;gBAEA,2GAA2G;gBAC3G,IAAI,UAAU;uBAAI,eAAe,QAAQ;iBAAC;gBAC1C,IACE,WACA,QAAQ,MAAM,GAAG,KACjB,YAAY,WACZ,iBAAiB,aAAa,EAC9B;oBACA,IAAI,eAAe,QAAQ,MAAM,CAC/B,CAAC,KAAK,OAAU,OAAO,KAAK,qBAAqB,GAAG,KAAK,EACzD;oBAEF,gBAAgB,gCAAU,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,QAAQ,MAAM;oBAC7D,IAAI,MAAM,cAAc,QAAQ,UAAU;oBAC1C,IAAI,eAAe,iBAAiB,aAAa,CAAC,qBAAqB,EAAE,CAAC,IAAI;oBAC9E,IAAI,aAAa,IAAI,CAAC,QAAQ,EAAE,EAAE,uBAAuB,CAAC,IAAI;oBAC9D,cAAc,gCAAU,CAAC,MAAM,CAAC,MAAM;oBACtC,IAAI,iBAAiB,eAAe;oBAEpC,MAAO,iBAAiB,gBAAgB,QAAQ,EAAG;wBACjD,kBAAkB,UAAU,GAAG;wBAC/B;oBACF;gBACF;gBAEA,OAAO;oBACL,iBAAiB,KAAK,GAAG,CAAC,OAAO;oBACjC,oBAAoB,QAAQ,MAAM,UAAU,CAAC,IAAI;gBACnD;YACF;YAEA,YAAY;gBACV,4BAA4B;gBAC5B,MAAM;oBAAC,iBAAiB,MAAM,UAAU,CAAC,IAAI;oBAAE,oBAAoB;gBAAI;gBAEvE,kEAAkE;gBAClE,MAAM;YACR;QACF;IACF,GAAG;QAAC;QAAS;QAAa;QAAW;QAAO,MAAM,UAAU,CAAC,IAAI;KAAC;IAElE,CAAA,GAAA,+DAAgB,EAAE;QAAC,KAAK;QAAc,UAAU;IAAqB;IACrE,uDAAuD;IACvD,CAAA,GAAA,2DAAc,EAAE,uBAAuB;QAAC;KAAS;IAEjD,CAAA,GAAA,sBAAQ,EAAE;QACR,kDAAkD;QAClD,SAAS,KAAK,EAAE,MAAM,KAAK,IAAM;IACjC,uDAAuD;IACzD,GAAG,EAAE;IAEL,IAAI,cAAc,CAAA,GAAA,oBAAM,EACtB,IACE;eAAI,MAAM,UAAU;SAAC,CAAC,KAAK,CACzB,GACA,cAAc,SAAS,eAAe,GAAG,MAAM,UAAU,CAAC,IAAI,GAElE;QAAC;QAAa,MAAM,UAAU;QAAE,SAAS,eAAe;KAAC;IAG3D,IAAI,sBAAsB;QACxB,iEAAiE;QACjE,MAAM,gBAAgB,CAAC,aAAa,CAAC;QACrC,eAAe,CAAA,gBAAiB,CAAC;IACnC;IAEA,IAAI,cAAc,SAAS,kBAAkB,IAAK,eAAe;IACjE,IAAI,UAAU,MAAM,UAAU,CAAC,IAAI,KAAK;IAExC,IAAI,iBAAiB,CAAA,GAAA,oBAAM,EAAE;QAC3B,IAAI,WAAW,QAAQ,CAAC,eAAe,SACrC,OAAO;QAET,IAAI,YAAY,AAAC,CAAA,gCAAU,CAAC,MAAM,CAAC,MAAM,GAAG,gCAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAA,IAAK;QAC5E,OAAO;uBAAC;YAAW,UAAU;QAAQ;IACvC,GAAG;QAAC;QAAa;QAAS;QAAS;KAAM;IAEzC,qBACE,0DAAC,CAAA,GAAA,qCAAS,uBACR,0DAAC,CAAA,GAAA,+BAAI;QACF,GAAG,KAAK;QACT,YAAY;QACZ,kBAAkB;QAClB,mBAAmB;QACnB,eAAA;QACA,KAAK;QACL,aAAY;QACZ,kBAAkB,CAAA,GAAA,oCAAS,EAAE,CAAA,GAAA,mDAAK,GAAG,8BAA8B;YACjE,4CAA4C,kBAAkB;QAChE;qBACA,0DAAC;QACC,KAAK;QACL,OAAO;QACP,WAAW,CAAA,GAAA,oCAAS,EAAE,CAAA,GAAA,mDAAK,GAAG,2BAA2B;YACvD,kCAAkC;QACpC;qBACA,0DAAC,CAAA,GAAA,mCAAQ;QAAE,gBAAgB,CAAA,GAAA,oCAAS,EAAE,CAAA,GAAA,mDAAK,GAAG;qBAC5C,0DAAC;QAAI,KAAK;QAAU,GAAG,SAAS;QAAE,WAAW,CAAA,GAAA,oCAAS,EAAE,CAAA,GAAA,mDAAK,GAAG;OAC7D,YAAY,GAAG,CAAC,CAAA,qBACf,0DAAC,CAAA,GAAA,6BAAE;YAAG,GAAG,KAAK,KAAK;YAAE,KAAK,KAAK,GAAG;YAAE,MAAM;YAAM,OAAO;WACpD,KAAK,QAAQ,IAGjB,yBACC,0DAAC;QAAI,WAAW,CAAA,GAAA,oCAAS,EAAE,CAAA,GAAA,mDAAK,GAAG;OAChC,uBAKR,eAAe,CAAC,yBACf,0DAAC,CAAA,GAAA,kCAAO;QAAE,YAAY;qBACpB,0DAAC;QACC,MAAK;QACL,KAAK;QACL,IAAI;QACJ,cAAY,gBAAgB,MAAM,CAAC;QACnC,mBAAiB,GAAG,UAAU,EAAE,CAAC,CAAC,EAAE,WAAW;QAC/C,WAAW,CAAA,GAAA,oCAAS,EAAE,CAAA,GAAA,mDAAK,GAAG;OAC7B,SAAS,kBAAkB,kBAC1B,0DAAC,CAAA,GAAA,sCAAW;QACV,SAAA;QACA,SAAS;QACT,kBAAkB,CAAA,GAAA,oCAAS,EAAE,CAAA,GAAA,mDAAK,GAAG;OACpC,cACG,gBAAgB,MAAM,CAAC,sBAAsB;QAC3C,UAAU,MAAM,UAAU,CAAC,IAAI;IACjC,KACA,gBAAgB,MAAM,CAAC,qBAG9B,eAAe,0BACd,0DAAC,CAAA,GAAA,sCAAW;QACV,SAAA;QACA,SAAS,IAAM;QACf,kBAAkB,CAAA,GAAA,oCAAS,EAAE,CAAA,GAAA,mDAAK,GAAG;OACpC;AAUrB","sources":["packages/@adobe/react-spectrum/src/tag/TagGroup.tsx"],"sourcesContent":["/*\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 {ActionButton} from '../button/ActionButton';\nimport {AriaTagGroupProps, useTagGroup} from 'react-aria/useTagGroup';\nimport {classNames} from '../utils/classNames';\nimport {\n Collection,\n DOMRef,\n Node,\n SpectrumLabelableProps,\n StyleProps,\n Validation\n} from '@react-types/shared';\nimport {Field} from '../label/Field';\nimport {FocusRing} from 'react-aria/FocusRing';\nimport {FocusScope} from 'react-aria/FocusScope';\nimport intlMessages from '../../intl/tag/*.json';\nimport {ListCollection} from 'react-stately/private/list/ListCollection';\nimport {ListKeyboardDelegate} from 'react-aria/ListKeyboardDelegate';\nimport {Provider, useProvider, useProviderProps} from '../provider/Provider';\nimport React, {JSX, ReactNode, useCallback, useEffect, useMemo, useRef, useState} from 'react';\nimport styles from '@adobe/spectrum-css-temp/components/tags/vars.css';\nimport {Tag} from './Tag';\nimport {useDOMRef} from '../utils/useDOMRef';\nimport {useFormProps} from '../form/Form';\nimport {useId} from 'react-aria/useId';\nimport {useLayoutEffect} from 'react-aria/private/utils/useLayoutEffect';\nimport {useListState} from 'react-stately/useListState';\nimport {useLocale} from 'react-aria/I18nProvider';\nimport {useLocalizedStringFormatter} from 'react-aria/useLocalizedStringFormatter';\nimport {useResizeObserver} from 'react-aria/private/utils/useResizeObserver';\nimport {useValueEffect} from 'react-aria/private/utils/useValueEffect';\n\nconst TAG_STYLES = {\n medium: {\n height: 24,\n margin: 4\n },\n large: {\n height: 30,\n margin: 5\n }\n};\n\nexport interface SpectrumTagGroupProps<T>\n extends\n Omit<\n AriaTagGroupProps<T>,\n | 'selectionMode'\n | 'disallowEmptySelection'\n | 'selectedKeys'\n | 'defaultSelectedKeys'\n | 'onSelectionChange'\n | 'selectionBehavior'\n | 'disabledKeys'\n >,\n StyleProps,\n Omit<SpectrumLabelableProps, 'isRequired' | 'necessityIndicator'>,\n Pick<Validation<any>, 'isInvalid' | 'validationState'> {\n /** The label to display on the action button. */\n actionLabel?: string;\n /** Handler that is called when the action button is pressed. */\n onAction?: () => void;\n /** Sets what the TagGroup should render when there are no tags to display. */\n renderEmptyState?: () => JSX.Element;\n /**\n * Limit the number of rows initially shown. This will render a button that allows the user to\n * expand to show all tags.\n */\n maxRows?: number;\n}\n\n/**\n * Tags allow users to categorize content. They can represent keywords or people, and are grouped to\n * describe an item or a search request.\n */\nexport const TagGroup = React.forwardRef(function TagGroup<T extends object>(\n props: SpectrumTagGroupProps<T>,\n ref: DOMRef<HTMLDivElement>\n) {\n props = useProviderProps(props);\n props = useFormProps(props);\n let {\n maxRows,\n children,\n actionLabel,\n onAction,\n labelPosition,\n renderEmptyState = () => stringFormatter.format('noTags')\n } = props;\n let domRef = useDOMRef(ref);\n let containerRef = useRef<HTMLDivElement>(null);\n let tagsRef = useRef<HTMLDivElement | null>(null);\n let {direction} = useLocale();\n let {scale} = useProvider();\n let stringFormatter = useLocalizedStringFormatter(intlMessages, '@react-spectrum/tag');\n let [isCollapsed, setIsCollapsed] = useState(maxRows != null);\n let state = useListState(props);\n let [tagState, setTagState] = useValueEffect({\n visibleTagCount: state.collection.size,\n showCollapseButton: false\n });\n let keyboardDelegate = useMemo(() => {\n let collection = (\n isCollapsed\n ? new ListCollection([...state.collection].slice(0, tagState.visibleTagCount))\n : new ListCollection([...state.collection])\n ) as Collection<Node<T>>;\n return new ListKeyboardDelegate({\n collection,\n ref: tagsRef,\n direction,\n orientation: 'horizontal'\n });\n }, [\n direction,\n isCollapsed,\n state.collection,\n tagState.visibleTagCount,\n tagsRef\n ]) as ListKeyboardDelegate<T>;\n // Remove onAction from props so it doesn't make it into useGridList.\n delete props.onAction;\n let {gridProps, labelProps, descriptionProps, errorMessageProps} = useTagGroup(\n {...props, keyboardDelegate},\n state,\n tagsRef\n );\n let actionsId = useId();\n let actionsRef = useRef<HTMLDivElement>(null);\n\n let updateVisibleTagCount = useCallback(() => {\n if (maxRows && maxRows > 0) {\n let computeVisibleTagCount = () => {\n // Refs can be null at runtime.\n let currContainerRef: HTMLDivElement | null = containerRef.current;\n let currTagsRef: HTMLDivElement | null = tagsRef.current;\n let currActionsRef: HTMLDivElement | null = actionsRef.current;\n if (!currContainerRef || !currTagsRef || !currActionsRef || state.collection.size === 0) {\n return {\n visibleTagCount: 0,\n showCollapseButton: false\n };\n }\n\n // Count rows and show tags until we hit the maxRows.\n let tags = [...currTagsRef.children];\n let currY = -Infinity;\n let rowCount = 0;\n let index = 0;\n let tagWidths: number[] = [];\n for (let tag of tags) {\n let {width, y} = tag.getBoundingClientRect();\n\n if (y !== currY) {\n currY = y;\n rowCount++;\n }\n\n if (maxRows && rowCount > maxRows) {\n break;\n }\n tagWidths.push(width);\n index++;\n }\n\n // Remove tags until there is space for the collapse button and action button (if present) on the last row.\n let buttons = [...currActionsRef.children];\n if (\n maxRows &&\n buttons.length > 0 &&\n rowCount >= maxRows &&\n currContainerRef.parentElement\n ) {\n let buttonsWidth = buttons.reduce(\n (acc, curr) => (acc += curr.getBoundingClientRect().width),\n 0\n );\n buttonsWidth += TAG_STYLES[scale].margin * 2 * buttons.length;\n let end = direction === 'ltr' ? 'right' : 'left';\n let containerEnd = currContainerRef.parentElement.getBoundingClientRect()[end];\n let lastTagEnd = tags[index - 1]?.getBoundingClientRect()[end];\n lastTagEnd += TAG_STYLES[scale].margin;\n let availableWidth = containerEnd - lastTagEnd;\n\n while (availableWidth < buttonsWidth && index > 0) {\n availableWidth += tagWidths.pop()!;\n index--;\n }\n }\n\n return {\n visibleTagCount: Math.max(index, 1),\n showCollapseButton: index < state.collection.size\n };\n };\n\n setTagState(function* () {\n // Update to show all items.\n yield {visibleTagCount: state.collection.size, showCollapseButton: true};\n\n // Measure, and update to show the items until maxRows is reached.\n yield computeVisibleTagCount();\n });\n }\n }, [maxRows, setTagState, direction, scale, state.collection.size]);\n\n useResizeObserver({ref: containerRef, onResize: updateVisibleTagCount});\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useLayoutEffect(updateVisibleTagCount, [children]);\n\n useEffect(() => {\n // Recalculate visible tags when fonts are loaded.\n document.fonts?.ready.then(() => updateVisibleTagCount());\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n let visibleTags = useMemo(\n () =>\n [...state.collection].slice(\n 0,\n isCollapsed ? tagState.visibleTagCount : state.collection.size\n ),\n [isCollapsed, state.collection, tagState.visibleTagCount]\n );\n\n let handlePressCollapse = () => {\n // Prevents button from losing focus if focusedKey got collapsed.\n state.selectionManager.setFocusedKey(null);\n setIsCollapsed(prevCollapsed => !prevCollapsed);\n };\n\n let showActions = tagState.showCollapseButton || (actionLabel && onAction);\n let isEmpty = state.collection.size === 0;\n\n let containerStyle = useMemo(() => {\n if (maxRows == null || !isCollapsed || isEmpty) {\n return undefined;\n }\n let maxHeight = (TAG_STYLES[scale].height + TAG_STYLES[scale].margin * 2) * maxRows;\n return {maxHeight, overflow: 'hidden'};\n }, [isCollapsed, maxRows, isEmpty, scale]);\n\n return (\n <FocusScope>\n <Field\n {...props}\n labelProps={labelProps}\n descriptionProps={descriptionProps}\n errorMessageProps={errorMessageProps}\n showErrorIcon\n ref={domRef}\n elementType=\"span\"\n wrapperClassName={classNames(styles, 'spectrum-Tags-fieldWrapper', {\n 'spectrum-Tags-fieldWrapper--positionSide': labelPosition === 'side'\n })}>\n <div\n ref={containerRef}\n style={containerStyle}\n className={classNames(styles, 'spectrum-Tags-container', {\n 'spectrum-Tags-container--empty': isEmpty\n })}>\n <FocusRing focusRingClass={classNames(styles, 'focus-ring')}>\n <div ref={tagsRef} {...gridProps} className={classNames(styles, 'spectrum-Tags')}>\n {visibleTags.map(item => (\n <Tag {...item.props} key={item.key} item={item} state={state}>\n {item.rendered}\n </Tag>\n ))}\n {isEmpty && (\n <div className={classNames(styles, 'spectrum-Tags-empty-state')}>\n {renderEmptyState()}\n </div>\n )}\n </div>\n </FocusRing>\n {showActions && !isEmpty && (\n <Provider isDisabled={false}>\n <div\n role=\"group\"\n ref={actionsRef}\n id={actionsId}\n aria-label={stringFormatter.format('actions')}\n aria-labelledby={`${gridProps.id} ${actionsId}`}\n className={classNames(styles, 'spectrum-Tags-actions')}>\n {tagState.showCollapseButton && (\n <ActionButton\n isQuiet\n onPress={handlePressCollapse}\n UNSAFE_className={classNames(styles, 'spectrum-Tags-actionButton')}>\n {isCollapsed\n ? stringFormatter.format('showAllButtonLabel', {\n tagCount: state.collection.size\n })\n : stringFormatter.format('hideButtonLabel')}\n </ActionButton>\n )}\n {actionLabel && onAction && (\n <ActionButton\n isQuiet\n onPress={() => onAction?.()}\n UNSAFE_className={classNames(styles, 'spectrum-Tags-actionButton')}>\n {actionLabel}\n </ActionButton>\n )}\n </div>\n </Provider>\n )}\n </div>\n </Field>\n </FocusScope>\n );\n}) as <T>(props: SpectrumTagGroupProps<T> & {ref?: DOMRef<HTMLDivElement>}) => ReactNode;\n"],"names":[],"version":3,"file":"TagGroup.cjs.map"}
@@ -1 +1 @@
1
- {"mappings":"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","sources":["packages/@adobe/react-spectrum/src/tag/TagGroup.tsx"],"sourcesContent":["/*\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 {ActionButton} from '../button/ActionButton';\n\nimport {AriaTagGroupProps, useTagGroup} from 'react-aria/useTagGroup';\nimport {classNames} from '../utils/classNames';\nimport {\n Collection,\n DOMRef,\n Node,\n SpectrumLabelableProps,\n StyleProps,\n Validation\n} from '@react-types/shared';\nimport {Field} from '../label/Field';\nimport {FocusRing} from 'react-aria/FocusRing';\nimport {FocusScope} from 'react-aria/FocusScope';\nimport intlMessages from '../../intl/tag/*.json';\n// @ts-ignore\nimport {ListCollection} from 'react-stately/private/list/ListCollection';\nimport {ListKeyboardDelegate} from 'react-aria/ListKeyboardDelegate';\nimport {Provider, useProvider, useProviderProps} from '../provider/Provider';\nimport React, {JSX, ReactNode, useCallback, useEffect, useMemo, useRef, useState} from 'react';\nimport styles from '@adobe/spectrum-css-temp/components/tags/vars.css';\nimport {Tag} from './Tag';\nimport {useDOMRef} from '../utils/useDOMRef';\nimport {useFormProps} from '../form/Form';\nimport {useId} from 'react-aria/useId';\nimport {useLayoutEffect} from 'react-aria/private/utils/useLayoutEffect';\nimport {useListState} from 'react-stately/useListState';\nimport {useLocale} from 'react-aria/I18nProvider';\nimport {useLocalizedStringFormatter} from 'react-aria/useLocalizedStringFormatter';\nimport {useResizeObserver} from 'react-aria/private/utils/useResizeObserver';\nimport {useValueEffect} from 'react-aria/private/utils/useValueEffect';\n\nconst TAG_STYLES = {\n medium: {\n height: 24,\n margin: 4\n },\n large: {\n height: 30,\n margin: 5\n }\n};\n\nexport interface SpectrumTagGroupProps<T>\n extends\n Omit<\n AriaTagGroupProps<T>,\n | 'selectionMode'\n | 'disallowEmptySelection'\n | 'selectedKeys'\n | 'defaultSelectedKeys'\n | 'onSelectionChange'\n | 'selectionBehavior'\n | 'disabledKeys'\n >,\n StyleProps,\n Omit<SpectrumLabelableProps, 'isRequired' | 'necessityIndicator'>,\n Pick<Validation<any>, 'isInvalid' | 'validationState'> {\n /** The label to display on the action button. */\n actionLabel?: string;\n /** Handler that is called when the action button is pressed. */\n onAction?: () => void;\n /** Sets what the TagGroup should render when there are no tags to display. */\n renderEmptyState?: () => JSX.Element;\n /**\n * Limit the number of rows initially shown. This will render a button that allows the user to\n * expand to show all tags.\n */\n maxRows?: number;\n}\n\n/**\n * Tags allow users to categorize content. They can represent keywords or people, and are grouped to\n * describe an item or a search request.\n */\nexport const TagGroup = React.forwardRef(function TagGroup<T extends object>(\n props: SpectrumTagGroupProps<T>,\n ref: DOMRef<HTMLDivElement>\n) {\n props = useProviderProps(props);\n props = useFormProps(props);\n let {\n maxRows,\n children,\n actionLabel,\n onAction,\n labelPosition,\n renderEmptyState = () => stringFormatter.format('noTags')\n } = props;\n let domRef = useDOMRef(ref);\n let containerRef = useRef<HTMLDivElement>(null);\n let tagsRef = useRef<HTMLDivElement | null>(null);\n let {direction} = useLocale();\n let {scale} = useProvider();\n let stringFormatter = useLocalizedStringFormatter(intlMessages, '@react-spectrum/tag');\n let [isCollapsed, setIsCollapsed] = useState(maxRows != null);\n let state = useListState(props);\n let [tagState, setTagState] = useValueEffect({\n visibleTagCount: state.collection.size,\n showCollapseButton: false\n });\n let keyboardDelegate = useMemo(() => {\n let collection = (\n isCollapsed\n ? new ListCollection([...state.collection].slice(0, tagState.visibleTagCount))\n : new ListCollection([...state.collection])\n ) as Collection<Node<T>>;\n return new ListKeyboardDelegate({\n collection,\n ref: tagsRef,\n direction,\n orientation: 'horizontal'\n });\n }, [\n direction,\n isCollapsed,\n state.collection,\n tagState.visibleTagCount,\n tagsRef\n ]) as ListKeyboardDelegate<T>;\n // Remove onAction from props so it doesn't make it into useGridList.\n delete props.onAction;\n let {gridProps, labelProps, descriptionProps, errorMessageProps} = useTagGroup(\n {...props, keyboardDelegate},\n state,\n tagsRef\n );\n let actionsId = useId();\n let actionsRef = useRef<HTMLDivElement>(null);\n\n let updateVisibleTagCount = useCallback(() => {\n if (maxRows && maxRows > 0) {\n let computeVisibleTagCount = () => {\n // Refs can be null at runtime.\n let currContainerRef: HTMLDivElement | null = containerRef.current;\n let currTagsRef: HTMLDivElement | null = tagsRef.current;\n let currActionsRef: HTMLDivElement | null = actionsRef.current;\n if (!currContainerRef || !currTagsRef || !currActionsRef || state.collection.size === 0) {\n return {\n visibleTagCount: 0,\n showCollapseButton: false\n };\n }\n\n // Count rows and show tags until we hit the maxRows.\n let tags = [...currTagsRef.children];\n let currY = -Infinity;\n let rowCount = 0;\n let index = 0;\n let tagWidths: number[] = [];\n for (let tag of tags) {\n let {width, y} = tag.getBoundingClientRect();\n\n if (y !== currY) {\n currY = y;\n rowCount++;\n }\n\n if (maxRows && rowCount > maxRows) {\n break;\n }\n tagWidths.push(width);\n index++;\n }\n\n // Remove tags until there is space for the collapse button and action button (if present) on the last row.\n let buttons = [...currActionsRef.children];\n if (\n maxRows &&\n buttons.length > 0 &&\n rowCount >= maxRows &&\n currContainerRef.parentElement\n ) {\n let buttonsWidth = buttons.reduce(\n (acc, curr) => (acc += curr.getBoundingClientRect().width),\n 0\n );\n buttonsWidth += TAG_STYLES[scale].margin * 2 * buttons.length;\n let end = direction === 'ltr' ? 'right' : 'left';\n let containerEnd = currContainerRef.parentElement.getBoundingClientRect()[end];\n let lastTagEnd = tags[index - 1]?.getBoundingClientRect()[end];\n lastTagEnd += TAG_STYLES[scale].margin;\n let availableWidth = containerEnd - lastTagEnd;\n\n while (availableWidth < buttonsWidth && index > 0) {\n availableWidth += tagWidths.pop()!;\n index--;\n }\n }\n\n return {\n visibleTagCount: Math.max(index, 1),\n showCollapseButton: index < state.collection.size\n };\n };\n\n setTagState(function* () {\n // Update to show all items.\n yield {visibleTagCount: state.collection.size, showCollapseButton: true};\n\n // Measure, and update to show the items until maxRows is reached.\n yield computeVisibleTagCount();\n });\n }\n }, [maxRows, setTagState, direction, scale, state.collection.size]);\n\n useResizeObserver({ref: containerRef, onResize: updateVisibleTagCount});\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useLayoutEffect(updateVisibleTagCount, [children]);\n\n useEffect(() => {\n // Recalculate visible tags when fonts are loaded.\n document.fonts?.ready.then(() => updateVisibleTagCount());\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n let visibleTags = useMemo(\n () =>\n [...state.collection].slice(\n 0,\n isCollapsed ? tagState.visibleTagCount : state.collection.size\n ),\n [isCollapsed, state.collection, tagState.visibleTagCount]\n );\n\n let handlePressCollapse = () => {\n // Prevents button from losing focus if focusedKey got collapsed.\n state.selectionManager.setFocusedKey(null);\n setIsCollapsed(prevCollapsed => !prevCollapsed);\n };\n\n let showActions = tagState.showCollapseButton || (actionLabel && onAction);\n let isEmpty = state.collection.size === 0;\n\n let containerStyle = useMemo(() => {\n if (maxRows == null || !isCollapsed || isEmpty) {\n return undefined;\n }\n let maxHeight = (TAG_STYLES[scale].height + TAG_STYLES[scale].margin * 2) * maxRows;\n return {maxHeight, overflow: 'hidden'};\n }, [isCollapsed, maxRows, isEmpty, scale]);\n\n return (\n <FocusScope>\n <Field\n {...props}\n labelProps={labelProps}\n descriptionProps={descriptionProps}\n errorMessageProps={errorMessageProps}\n showErrorIcon\n ref={domRef}\n elementType=\"span\"\n wrapperClassName={classNames(styles, 'spectrum-Tags-fieldWrapper', {\n 'spectrum-Tags-fieldWrapper--positionSide': labelPosition === 'side'\n })}>\n <div\n ref={containerRef}\n style={containerStyle}\n className={classNames(styles, 'spectrum-Tags-container', {\n 'spectrum-Tags-container--empty': isEmpty\n })}>\n <FocusRing focusRingClass={classNames(styles, 'focus-ring')}>\n <div ref={tagsRef} {...gridProps} className={classNames(styles, 'spectrum-Tags')}>\n {visibleTags.map(item => (\n <Tag {...item.props} key={item.key} item={item} state={state}>\n {item.rendered}\n </Tag>\n ))}\n {isEmpty && (\n <div className={classNames(styles, 'spectrum-Tags-empty-state')}>\n {renderEmptyState()}\n </div>\n )}\n </div>\n </FocusRing>\n {showActions && !isEmpty && (\n <Provider isDisabled={false}>\n <div\n role=\"group\"\n ref={actionsRef}\n id={actionsId}\n aria-label={stringFormatter.format('actions')}\n aria-labelledby={`${gridProps.id} ${actionsId}`}\n className={classNames(styles, 'spectrum-Tags-actions')}>\n {tagState.showCollapseButton && (\n <ActionButton\n isQuiet\n onPress={handlePressCollapse}\n UNSAFE_className={classNames(styles, 'spectrum-Tags-actionButton')}>\n {isCollapsed\n ? stringFormatter.format('showAllButtonLabel', {\n tagCount: state.collection.size\n })\n : stringFormatter.format('hideButtonLabel')}\n </ActionButton>\n )}\n {actionLabel && onAction && (\n <ActionButton\n isQuiet\n onPress={() => onAction?.()}\n UNSAFE_className={classNames(styles, 'spectrum-Tags-actionButton')}>\n {actionLabel}\n </ActionButton>\n )}\n </div>\n </Provider>\n )}\n </div>\n </Field>\n </FocusScope>\n );\n}) as <T>(props: SpectrumTagGroupProps<T> & {ref?: DOMRef<HTMLDivElement>}) => ReactNode;\n"],"names":[],"version":3,"file":"TagGroup.js.map"}
1
+ {"mappings":"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","sources":["packages/@adobe/react-spectrum/src/tag/TagGroup.tsx"],"sourcesContent":["/*\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 {ActionButton} from '../button/ActionButton';\nimport {AriaTagGroupProps, useTagGroup} from 'react-aria/useTagGroup';\nimport {classNames} from '../utils/classNames';\nimport {\n Collection,\n DOMRef,\n Node,\n SpectrumLabelableProps,\n StyleProps,\n Validation\n} from '@react-types/shared';\nimport {Field} from '../label/Field';\nimport {FocusRing} from 'react-aria/FocusRing';\nimport {FocusScope} from 'react-aria/FocusScope';\nimport intlMessages from '../../intl/tag/*.json';\nimport {ListCollection} from 'react-stately/private/list/ListCollection';\nimport {ListKeyboardDelegate} from 'react-aria/ListKeyboardDelegate';\nimport {Provider, useProvider, useProviderProps} from '../provider/Provider';\nimport React, {JSX, ReactNode, useCallback, useEffect, useMemo, useRef, useState} from 'react';\nimport styles from '@adobe/spectrum-css-temp/components/tags/vars.css';\nimport {Tag} from './Tag';\nimport {useDOMRef} from '../utils/useDOMRef';\nimport {useFormProps} from '../form/Form';\nimport {useId} from 'react-aria/useId';\nimport {useLayoutEffect} from 'react-aria/private/utils/useLayoutEffect';\nimport {useListState} from 'react-stately/useListState';\nimport {useLocale} from 'react-aria/I18nProvider';\nimport {useLocalizedStringFormatter} from 'react-aria/useLocalizedStringFormatter';\nimport {useResizeObserver} from 'react-aria/private/utils/useResizeObserver';\nimport {useValueEffect} from 'react-aria/private/utils/useValueEffect';\n\nconst TAG_STYLES = {\n medium: {\n height: 24,\n margin: 4\n },\n large: {\n height: 30,\n margin: 5\n }\n};\n\nexport interface SpectrumTagGroupProps<T>\n extends\n Omit<\n AriaTagGroupProps<T>,\n | 'selectionMode'\n | 'disallowEmptySelection'\n | 'selectedKeys'\n | 'defaultSelectedKeys'\n | 'onSelectionChange'\n | 'selectionBehavior'\n | 'disabledKeys'\n >,\n StyleProps,\n Omit<SpectrumLabelableProps, 'isRequired' | 'necessityIndicator'>,\n Pick<Validation<any>, 'isInvalid' | 'validationState'> {\n /** The label to display on the action button. */\n actionLabel?: string;\n /** Handler that is called when the action button is pressed. */\n onAction?: () => void;\n /** Sets what the TagGroup should render when there are no tags to display. */\n renderEmptyState?: () => JSX.Element;\n /**\n * Limit the number of rows initially shown. This will render a button that allows the user to\n * expand to show all tags.\n */\n maxRows?: number;\n}\n\n/**\n * Tags allow users to categorize content. They can represent keywords or people, and are grouped to\n * describe an item or a search request.\n */\nexport const TagGroup = React.forwardRef(function TagGroup<T extends object>(\n props: SpectrumTagGroupProps<T>,\n ref: DOMRef<HTMLDivElement>\n) {\n props = useProviderProps(props);\n props = useFormProps(props);\n let {\n maxRows,\n children,\n actionLabel,\n onAction,\n labelPosition,\n renderEmptyState = () => stringFormatter.format('noTags')\n } = props;\n let domRef = useDOMRef(ref);\n let containerRef = useRef<HTMLDivElement>(null);\n let tagsRef = useRef<HTMLDivElement | null>(null);\n let {direction} = useLocale();\n let {scale} = useProvider();\n let stringFormatter = useLocalizedStringFormatter(intlMessages, '@react-spectrum/tag');\n let [isCollapsed, setIsCollapsed] = useState(maxRows != null);\n let state = useListState(props);\n let [tagState, setTagState] = useValueEffect({\n visibleTagCount: state.collection.size,\n showCollapseButton: false\n });\n let keyboardDelegate = useMemo(() => {\n let collection = (\n isCollapsed\n ? new ListCollection([...state.collection].slice(0, tagState.visibleTagCount))\n : new ListCollection([...state.collection])\n ) as Collection<Node<T>>;\n return new ListKeyboardDelegate({\n collection,\n ref: tagsRef,\n direction,\n orientation: 'horizontal'\n });\n }, [\n direction,\n isCollapsed,\n state.collection,\n tagState.visibleTagCount,\n tagsRef\n ]) as ListKeyboardDelegate<T>;\n // Remove onAction from props so it doesn't make it into useGridList.\n delete props.onAction;\n let {gridProps, labelProps, descriptionProps, errorMessageProps} = useTagGroup(\n {...props, keyboardDelegate},\n state,\n tagsRef\n );\n let actionsId = useId();\n let actionsRef = useRef<HTMLDivElement>(null);\n\n let updateVisibleTagCount = useCallback(() => {\n if (maxRows && maxRows > 0) {\n let computeVisibleTagCount = () => {\n // Refs can be null at runtime.\n let currContainerRef: HTMLDivElement | null = containerRef.current;\n let currTagsRef: HTMLDivElement | null = tagsRef.current;\n let currActionsRef: HTMLDivElement | null = actionsRef.current;\n if (!currContainerRef || !currTagsRef || !currActionsRef || state.collection.size === 0) {\n return {\n visibleTagCount: 0,\n showCollapseButton: false\n };\n }\n\n // Count rows and show tags until we hit the maxRows.\n let tags = [...currTagsRef.children];\n let currY = -Infinity;\n let rowCount = 0;\n let index = 0;\n let tagWidths: number[] = [];\n for (let tag of tags) {\n let {width, y} = tag.getBoundingClientRect();\n\n if (y !== currY) {\n currY = y;\n rowCount++;\n }\n\n if (maxRows && rowCount > maxRows) {\n break;\n }\n tagWidths.push(width);\n index++;\n }\n\n // Remove tags until there is space for the collapse button and action button (if present) on the last row.\n let buttons = [...currActionsRef.children];\n if (\n maxRows &&\n buttons.length > 0 &&\n rowCount >= maxRows &&\n currContainerRef.parentElement\n ) {\n let buttonsWidth = buttons.reduce(\n (acc, curr) => (acc += curr.getBoundingClientRect().width),\n 0\n );\n buttonsWidth += TAG_STYLES[scale].margin * 2 * buttons.length;\n let end = direction === 'ltr' ? 'right' : 'left';\n let containerEnd = currContainerRef.parentElement.getBoundingClientRect()[end];\n let lastTagEnd = tags[index - 1]?.getBoundingClientRect()[end];\n lastTagEnd += TAG_STYLES[scale].margin;\n let availableWidth = containerEnd - lastTagEnd;\n\n while (availableWidth < buttonsWidth && index > 0) {\n availableWidth += tagWidths.pop()!;\n index--;\n }\n }\n\n return {\n visibleTagCount: Math.max(index, 1),\n showCollapseButton: index < state.collection.size\n };\n };\n\n setTagState(function* () {\n // Update to show all items.\n yield {visibleTagCount: state.collection.size, showCollapseButton: true};\n\n // Measure, and update to show the items until maxRows is reached.\n yield computeVisibleTagCount();\n });\n }\n }, [maxRows, setTagState, direction, scale, state.collection.size]);\n\n useResizeObserver({ref: containerRef, onResize: updateVisibleTagCount});\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useLayoutEffect(updateVisibleTagCount, [children]);\n\n useEffect(() => {\n // Recalculate visible tags when fonts are loaded.\n document.fonts?.ready.then(() => updateVisibleTagCount());\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n let visibleTags = useMemo(\n () =>\n [...state.collection].slice(\n 0,\n isCollapsed ? tagState.visibleTagCount : state.collection.size\n ),\n [isCollapsed, state.collection, tagState.visibleTagCount]\n );\n\n let handlePressCollapse = () => {\n // Prevents button from losing focus if focusedKey got collapsed.\n state.selectionManager.setFocusedKey(null);\n setIsCollapsed(prevCollapsed => !prevCollapsed);\n };\n\n let showActions = tagState.showCollapseButton || (actionLabel && onAction);\n let isEmpty = state.collection.size === 0;\n\n let containerStyle = useMemo(() => {\n if (maxRows == null || !isCollapsed || isEmpty) {\n return undefined;\n }\n let maxHeight = (TAG_STYLES[scale].height + TAG_STYLES[scale].margin * 2) * maxRows;\n return {maxHeight, overflow: 'hidden'};\n }, [isCollapsed, maxRows, isEmpty, scale]);\n\n return (\n <FocusScope>\n <Field\n {...props}\n labelProps={labelProps}\n descriptionProps={descriptionProps}\n errorMessageProps={errorMessageProps}\n showErrorIcon\n ref={domRef}\n elementType=\"span\"\n wrapperClassName={classNames(styles, 'spectrum-Tags-fieldWrapper', {\n 'spectrum-Tags-fieldWrapper--positionSide': labelPosition === 'side'\n })}>\n <div\n ref={containerRef}\n style={containerStyle}\n className={classNames(styles, 'spectrum-Tags-container', {\n 'spectrum-Tags-container--empty': isEmpty\n })}>\n <FocusRing focusRingClass={classNames(styles, 'focus-ring')}>\n <div ref={tagsRef} {...gridProps} className={classNames(styles, 'spectrum-Tags')}>\n {visibleTags.map(item => (\n <Tag {...item.props} key={item.key} item={item} state={state}>\n {item.rendered}\n </Tag>\n ))}\n {isEmpty && (\n <div className={classNames(styles, 'spectrum-Tags-empty-state')}>\n {renderEmptyState()}\n </div>\n )}\n </div>\n </FocusRing>\n {showActions && !isEmpty && (\n <Provider isDisabled={false}>\n <div\n role=\"group\"\n ref={actionsRef}\n id={actionsId}\n aria-label={stringFormatter.format('actions')}\n aria-labelledby={`${gridProps.id} ${actionsId}`}\n className={classNames(styles, 'spectrum-Tags-actions')}>\n {tagState.showCollapseButton && (\n <ActionButton\n isQuiet\n onPress={handlePressCollapse}\n UNSAFE_className={classNames(styles, 'spectrum-Tags-actionButton')}>\n {isCollapsed\n ? stringFormatter.format('showAllButtonLabel', {\n tagCount: state.collection.size\n })\n : stringFormatter.format('hideButtonLabel')}\n </ActionButton>\n )}\n {actionLabel && onAction && (\n <ActionButton\n isQuiet\n onPress={() => onAction?.()}\n UNSAFE_className={classNames(styles, 'spectrum-Tags-actionButton')}>\n {actionLabel}\n </ActionButton>\n )}\n </div>\n </Provider>\n )}\n </div>\n </Field>\n </FocusScope>\n );\n}) as <T>(props: SpectrumTagGroupProps<T> & {ref?: DOMRef<HTMLDivElement>}) => ReactNode;\n"],"names":[],"version":3,"file":"TagGroup.js.map"}
@@ -1 +1 @@
1
- {"mappings":"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","sources":["packages/@adobe/react-spectrum/src/tag/TagGroup.tsx"],"sourcesContent":["/*\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 {ActionButton} from '../button/ActionButton';\n\nimport {AriaTagGroupProps, useTagGroup} from 'react-aria/useTagGroup';\nimport {classNames} from '../utils/classNames';\nimport {\n Collection,\n DOMRef,\n Node,\n SpectrumLabelableProps,\n StyleProps,\n Validation\n} from '@react-types/shared';\nimport {Field} from '../label/Field';\nimport {FocusRing} from 'react-aria/FocusRing';\nimport {FocusScope} from 'react-aria/FocusScope';\nimport intlMessages from '../../intl/tag/*.json';\n// @ts-ignore\nimport {ListCollection} from 'react-stately/private/list/ListCollection';\nimport {ListKeyboardDelegate} from 'react-aria/ListKeyboardDelegate';\nimport {Provider, useProvider, useProviderProps} from '../provider/Provider';\nimport React, {JSX, ReactNode, useCallback, useEffect, useMemo, useRef, useState} from 'react';\nimport styles from '@adobe/spectrum-css-temp/components/tags/vars.css';\nimport {Tag} from './Tag';\nimport {useDOMRef} from '../utils/useDOMRef';\nimport {useFormProps} from '../form/Form';\nimport {useId} from 'react-aria/useId';\nimport {useLayoutEffect} from 'react-aria/private/utils/useLayoutEffect';\nimport {useListState} from 'react-stately/useListState';\nimport {useLocale} from 'react-aria/I18nProvider';\nimport {useLocalizedStringFormatter} from 'react-aria/useLocalizedStringFormatter';\nimport {useResizeObserver} from 'react-aria/private/utils/useResizeObserver';\nimport {useValueEffect} from 'react-aria/private/utils/useValueEffect';\n\nconst TAG_STYLES = {\n medium: {\n height: 24,\n margin: 4\n },\n large: {\n height: 30,\n margin: 5\n }\n};\n\nexport interface SpectrumTagGroupProps<T>\n extends\n Omit<\n AriaTagGroupProps<T>,\n | 'selectionMode'\n | 'disallowEmptySelection'\n | 'selectedKeys'\n | 'defaultSelectedKeys'\n | 'onSelectionChange'\n | 'selectionBehavior'\n | 'disabledKeys'\n >,\n StyleProps,\n Omit<SpectrumLabelableProps, 'isRequired' | 'necessityIndicator'>,\n Pick<Validation<any>, 'isInvalid' | 'validationState'> {\n /** The label to display on the action button. */\n actionLabel?: string;\n /** Handler that is called when the action button is pressed. */\n onAction?: () => void;\n /** Sets what the TagGroup should render when there are no tags to display. */\n renderEmptyState?: () => JSX.Element;\n /**\n * Limit the number of rows initially shown. This will render a button that allows the user to\n * expand to show all tags.\n */\n maxRows?: number;\n}\n\n/**\n * Tags allow users to categorize content. They can represent keywords or people, and are grouped to\n * describe an item or a search request.\n */\nexport const TagGroup = React.forwardRef(function TagGroup<T extends object>(\n props: SpectrumTagGroupProps<T>,\n ref: DOMRef<HTMLDivElement>\n) {\n props = useProviderProps(props);\n props = useFormProps(props);\n let {\n maxRows,\n children,\n actionLabel,\n onAction,\n labelPosition,\n renderEmptyState = () => stringFormatter.format('noTags')\n } = props;\n let domRef = useDOMRef(ref);\n let containerRef = useRef<HTMLDivElement>(null);\n let tagsRef = useRef<HTMLDivElement | null>(null);\n let {direction} = useLocale();\n let {scale} = useProvider();\n let stringFormatter = useLocalizedStringFormatter(intlMessages, '@react-spectrum/tag');\n let [isCollapsed, setIsCollapsed] = useState(maxRows != null);\n let state = useListState(props);\n let [tagState, setTagState] = useValueEffect({\n visibleTagCount: state.collection.size,\n showCollapseButton: false\n });\n let keyboardDelegate = useMemo(() => {\n let collection = (\n isCollapsed\n ? new ListCollection([...state.collection].slice(0, tagState.visibleTagCount))\n : new ListCollection([...state.collection])\n ) as Collection<Node<T>>;\n return new ListKeyboardDelegate({\n collection,\n ref: tagsRef,\n direction,\n orientation: 'horizontal'\n });\n }, [\n direction,\n isCollapsed,\n state.collection,\n tagState.visibleTagCount,\n tagsRef\n ]) as ListKeyboardDelegate<T>;\n // Remove onAction from props so it doesn't make it into useGridList.\n delete props.onAction;\n let {gridProps, labelProps, descriptionProps, errorMessageProps} = useTagGroup(\n {...props, keyboardDelegate},\n state,\n tagsRef\n );\n let actionsId = useId();\n let actionsRef = useRef<HTMLDivElement>(null);\n\n let updateVisibleTagCount = useCallback(() => {\n if (maxRows && maxRows > 0) {\n let computeVisibleTagCount = () => {\n // Refs can be null at runtime.\n let currContainerRef: HTMLDivElement | null = containerRef.current;\n let currTagsRef: HTMLDivElement | null = tagsRef.current;\n let currActionsRef: HTMLDivElement | null = actionsRef.current;\n if (!currContainerRef || !currTagsRef || !currActionsRef || state.collection.size === 0) {\n return {\n visibleTagCount: 0,\n showCollapseButton: false\n };\n }\n\n // Count rows and show tags until we hit the maxRows.\n let tags = [...currTagsRef.children];\n let currY = -Infinity;\n let rowCount = 0;\n let index = 0;\n let tagWidths: number[] = [];\n for (let tag of tags) {\n let {width, y} = tag.getBoundingClientRect();\n\n if (y !== currY) {\n currY = y;\n rowCount++;\n }\n\n if (maxRows && rowCount > maxRows) {\n break;\n }\n tagWidths.push(width);\n index++;\n }\n\n // Remove tags until there is space for the collapse button and action button (if present) on the last row.\n let buttons = [...currActionsRef.children];\n if (\n maxRows &&\n buttons.length > 0 &&\n rowCount >= maxRows &&\n currContainerRef.parentElement\n ) {\n let buttonsWidth = buttons.reduce(\n (acc, curr) => (acc += curr.getBoundingClientRect().width),\n 0\n );\n buttonsWidth += TAG_STYLES[scale].margin * 2 * buttons.length;\n let end = direction === 'ltr' ? 'right' : 'left';\n let containerEnd = currContainerRef.parentElement.getBoundingClientRect()[end];\n let lastTagEnd = tags[index - 1]?.getBoundingClientRect()[end];\n lastTagEnd += TAG_STYLES[scale].margin;\n let availableWidth = containerEnd - lastTagEnd;\n\n while (availableWidth < buttonsWidth && index > 0) {\n availableWidth += tagWidths.pop()!;\n index--;\n }\n }\n\n return {\n visibleTagCount: Math.max(index, 1),\n showCollapseButton: index < state.collection.size\n };\n };\n\n setTagState(function* () {\n // Update to show all items.\n yield {visibleTagCount: state.collection.size, showCollapseButton: true};\n\n // Measure, and update to show the items until maxRows is reached.\n yield computeVisibleTagCount();\n });\n }\n }, [maxRows, setTagState, direction, scale, state.collection.size]);\n\n useResizeObserver({ref: containerRef, onResize: updateVisibleTagCount});\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useLayoutEffect(updateVisibleTagCount, [children]);\n\n useEffect(() => {\n // Recalculate visible tags when fonts are loaded.\n document.fonts?.ready.then(() => updateVisibleTagCount());\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n let visibleTags = useMemo(\n () =>\n [...state.collection].slice(\n 0,\n isCollapsed ? tagState.visibleTagCount : state.collection.size\n ),\n [isCollapsed, state.collection, tagState.visibleTagCount]\n );\n\n let handlePressCollapse = () => {\n // Prevents button from losing focus if focusedKey got collapsed.\n state.selectionManager.setFocusedKey(null);\n setIsCollapsed(prevCollapsed => !prevCollapsed);\n };\n\n let showActions = tagState.showCollapseButton || (actionLabel && onAction);\n let isEmpty = state.collection.size === 0;\n\n let containerStyle = useMemo(() => {\n if (maxRows == null || !isCollapsed || isEmpty) {\n return undefined;\n }\n let maxHeight = (TAG_STYLES[scale].height + TAG_STYLES[scale].margin * 2) * maxRows;\n return {maxHeight, overflow: 'hidden'};\n }, [isCollapsed, maxRows, isEmpty, scale]);\n\n return (\n <FocusScope>\n <Field\n {...props}\n labelProps={labelProps}\n descriptionProps={descriptionProps}\n errorMessageProps={errorMessageProps}\n showErrorIcon\n ref={domRef}\n elementType=\"span\"\n wrapperClassName={classNames(styles, 'spectrum-Tags-fieldWrapper', {\n 'spectrum-Tags-fieldWrapper--positionSide': labelPosition === 'side'\n })}>\n <div\n ref={containerRef}\n style={containerStyle}\n className={classNames(styles, 'spectrum-Tags-container', {\n 'spectrum-Tags-container--empty': isEmpty\n })}>\n <FocusRing focusRingClass={classNames(styles, 'focus-ring')}>\n <div ref={tagsRef} {...gridProps} className={classNames(styles, 'spectrum-Tags')}>\n {visibleTags.map(item => (\n <Tag {...item.props} key={item.key} item={item} state={state}>\n {item.rendered}\n </Tag>\n ))}\n {isEmpty && (\n <div className={classNames(styles, 'spectrum-Tags-empty-state')}>\n {renderEmptyState()}\n </div>\n )}\n </div>\n </FocusRing>\n {showActions && !isEmpty && (\n <Provider isDisabled={false}>\n <div\n role=\"group\"\n ref={actionsRef}\n id={actionsId}\n aria-label={stringFormatter.format('actions')}\n aria-labelledby={`${gridProps.id} ${actionsId}`}\n className={classNames(styles, 'spectrum-Tags-actions')}>\n {tagState.showCollapseButton && (\n <ActionButton\n isQuiet\n onPress={handlePressCollapse}\n UNSAFE_className={classNames(styles, 'spectrum-Tags-actionButton')}>\n {isCollapsed\n ? stringFormatter.format('showAllButtonLabel', {\n tagCount: state.collection.size\n })\n : stringFormatter.format('hideButtonLabel')}\n </ActionButton>\n )}\n {actionLabel && onAction && (\n <ActionButton\n isQuiet\n onPress={() => onAction?.()}\n UNSAFE_className={classNames(styles, 'spectrum-Tags-actionButton')}>\n {actionLabel}\n </ActionButton>\n )}\n </div>\n </Provider>\n )}\n </div>\n </Field>\n </FocusScope>\n );\n}) as <T>(props: SpectrumTagGroupProps<T> & {ref?: DOMRef<HTMLDivElement>}) => ReactNode;\n"],"names":[],"version":3,"file":"TagGroup.mjs.map"}
1
+ {"mappings":"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","sources":["packages/@adobe/react-spectrum/src/tag/TagGroup.tsx"],"sourcesContent":["/*\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 {ActionButton} from '../button/ActionButton';\nimport {AriaTagGroupProps, useTagGroup} from 'react-aria/useTagGroup';\nimport {classNames} from '../utils/classNames';\nimport {\n Collection,\n DOMRef,\n Node,\n SpectrumLabelableProps,\n StyleProps,\n Validation\n} from '@react-types/shared';\nimport {Field} from '../label/Field';\nimport {FocusRing} from 'react-aria/FocusRing';\nimport {FocusScope} from 'react-aria/FocusScope';\nimport intlMessages from '../../intl/tag/*.json';\nimport {ListCollection} from 'react-stately/private/list/ListCollection';\nimport {ListKeyboardDelegate} from 'react-aria/ListKeyboardDelegate';\nimport {Provider, useProvider, useProviderProps} from '../provider/Provider';\nimport React, {JSX, ReactNode, useCallback, useEffect, useMemo, useRef, useState} from 'react';\nimport styles from '@adobe/spectrum-css-temp/components/tags/vars.css';\nimport {Tag} from './Tag';\nimport {useDOMRef} from '../utils/useDOMRef';\nimport {useFormProps} from '../form/Form';\nimport {useId} from 'react-aria/useId';\nimport {useLayoutEffect} from 'react-aria/private/utils/useLayoutEffect';\nimport {useListState} from 'react-stately/useListState';\nimport {useLocale} from 'react-aria/I18nProvider';\nimport {useLocalizedStringFormatter} from 'react-aria/useLocalizedStringFormatter';\nimport {useResizeObserver} from 'react-aria/private/utils/useResizeObserver';\nimport {useValueEffect} from 'react-aria/private/utils/useValueEffect';\n\nconst TAG_STYLES = {\n medium: {\n height: 24,\n margin: 4\n },\n large: {\n height: 30,\n margin: 5\n }\n};\n\nexport interface SpectrumTagGroupProps<T>\n extends\n Omit<\n AriaTagGroupProps<T>,\n | 'selectionMode'\n | 'disallowEmptySelection'\n | 'selectedKeys'\n | 'defaultSelectedKeys'\n | 'onSelectionChange'\n | 'selectionBehavior'\n | 'disabledKeys'\n >,\n StyleProps,\n Omit<SpectrumLabelableProps, 'isRequired' | 'necessityIndicator'>,\n Pick<Validation<any>, 'isInvalid' | 'validationState'> {\n /** The label to display on the action button. */\n actionLabel?: string;\n /** Handler that is called when the action button is pressed. */\n onAction?: () => void;\n /** Sets what the TagGroup should render when there are no tags to display. */\n renderEmptyState?: () => JSX.Element;\n /**\n * Limit the number of rows initially shown. This will render a button that allows the user to\n * expand to show all tags.\n */\n maxRows?: number;\n}\n\n/**\n * Tags allow users to categorize content. They can represent keywords or people, and are grouped to\n * describe an item or a search request.\n */\nexport const TagGroup = React.forwardRef(function TagGroup<T extends object>(\n props: SpectrumTagGroupProps<T>,\n ref: DOMRef<HTMLDivElement>\n) {\n props = useProviderProps(props);\n props = useFormProps(props);\n let {\n maxRows,\n children,\n actionLabel,\n onAction,\n labelPosition,\n renderEmptyState = () => stringFormatter.format('noTags')\n } = props;\n let domRef = useDOMRef(ref);\n let containerRef = useRef<HTMLDivElement>(null);\n let tagsRef = useRef<HTMLDivElement | null>(null);\n let {direction} = useLocale();\n let {scale} = useProvider();\n let stringFormatter = useLocalizedStringFormatter(intlMessages, '@react-spectrum/tag');\n let [isCollapsed, setIsCollapsed] = useState(maxRows != null);\n let state = useListState(props);\n let [tagState, setTagState] = useValueEffect({\n visibleTagCount: state.collection.size,\n showCollapseButton: false\n });\n let keyboardDelegate = useMemo(() => {\n let collection = (\n isCollapsed\n ? new ListCollection([...state.collection].slice(0, tagState.visibleTagCount))\n : new ListCollection([...state.collection])\n ) as Collection<Node<T>>;\n return new ListKeyboardDelegate({\n collection,\n ref: tagsRef,\n direction,\n orientation: 'horizontal'\n });\n }, [\n direction,\n isCollapsed,\n state.collection,\n tagState.visibleTagCount,\n tagsRef\n ]) as ListKeyboardDelegate<T>;\n // Remove onAction from props so it doesn't make it into useGridList.\n delete props.onAction;\n let {gridProps, labelProps, descriptionProps, errorMessageProps} = useTagGroup(\n {...props, keyboardDelegate},\n state,\n tagsRef\n );\n let actionsId = useId();\n let actionsRef = useRef<HTMLDivElement>(null);\n\n let updateVisibleTagCount = useCallback(() => {\n if (maxRows && maxRows > 0) {\n let computeVisibleTagCount = () => {\n // Refs can be null at runtime.\n let currContainerRef: HTMLDivElement | null = containerRef.current;\n let currTagsRef: HTMLDivElement | null = tagsRef.current;\n let currActionsRef: HTMLDivElement | null = actionsRef.current;\n if (!currContainerRef || !currTagsRef || !currActionsRef || state.collection.size === 0) {\n return {\n visibleTagCount: 0,\n showCollapseButton: false\n };\n }\n\n // Count rows and show tags until we hit the maxRows.\n let tags = [...currTagsRef.children];\n let currY = -Infinity;\n let rowCount = 0;\n let index = 0;\n let tagWidths: number[] = [];\n for (let tag of tags) {\n let {width, y} = tag.getBoundingClientRect();\n\n if (y !== currY) {\n currY = y;\n rowCount++;\n }\n\n if (maxRows && rowCount > maxRows) {\n break;\n }\n tagWidths.push(width);\n index++;\n }\n\n // Remove tags until there is space for the collapse button and action button (if present) on the last row.\n let buttons = [...currActionsRef.children];\n if (\n maxRows &&\n buttons.length > 0 &&\n rowCount >= maxRows &&\n currContainerRef.parentElement\n ) {\n let buttonsWidth = buttons.reduce(\n (acc, curr) => (acc += curr.getBoundingClientRect().width),\n 0\n );\n buttonsWidth += TAG_STYLES[scale].margin * 2 * buttons.length;\n let end = direction === 'ltr' ? 'right' : 'left';\n let containerEnd = currContainerRef.parentElement.getBoundingClientRect()[end];\n let lastTagEnd = tags[index - 1]?.getBoundingClientRect()[end];\n lastTagEnd += TAG_STYLES[scale].margin;\n let availableWidth = containerEnd - lastTagEnd;\n\n while (availableWidth < buttonsWidth && index > 0) {\n availableWidth += tagWidths.pop()!;\n index--;\n }\n }\n\n return {\n visibleTagCount: Math.max(index, 1),\n showCollapseButton: index < state.collection.size\n };\n };\n\n setTagState(function* () {\n // Update to show all items.\n yield {visibleTagCount: state.collection.size, showCollapseButton: true};\n\n // Measure, and update to show the items until maxRows is reached.\n yield computeVisibleTagCount();\n });\n }\n }, [maxRows, setTagState, direction, scale, state.collection.size]);\n\n useResizeObserver({ref: containerRef, onResize: updateVisibleTagCount});\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useLayoutEffect(updateVisibleTagCount, [children]);\n\n useEffect(() => {\n // Recalculate visible tags when fonts are loaded.\n document.fonts?.ready.then(() => updateVisibleTagCount());\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n let visibleTags = useMemo(\n () =>\n [...state.collection].slice(\n 0,\n isCollapsed ? tagState.visibleTagCount : state.collection.size\n ),\n [isCollapsed, state.collection, tagState.visibleTagCount]\n );\n\n let handlePressCollapse = () => {\n // Prevents button from losing focus if focusedKey got collapsed.\n state.selectionManager.setFocusedKey(null);\n setIsCollapsed(prevCollapsed => !prevCollapsed);\n };\n\n let showActions = tagState.showCollapseButton || (actionLabel && onAction);\n let isEmpty = state.collection.size === 0;\n\n let containerStyle = useMemo(() => {\n if (maxRows == null || !isCollapsed || isEmpty) {\n return undefined;\n }\n let maxHeight = (TAG_STYLES[scale].height + TAG_STYLES[scale].margin * 2) * maxRows;\n return {maxHeight, overflow: 'hidden'};\n }, [isCollapsed, maxRows, isEmpty, scale]);\n\n return (\n <FocusScope>\n <Field\n {...props}\n labelProps={labelProps}\n descriptionProps={descriptionProps}\n errorMessageProps={errorMessageProps}\n showErrorIcon\n ref={domRef}\n elementType=\"span\"\n wrapperClassName={classNames(styles, 'spectrum-Tags-fieldWrapper', {\n 'spectrum-Tags-fieldWrapper--positionSide': labelPosition === 'side'\n })}>\n <div\n ref={containerRef}\n style={containerStyle}\n className={classNames(styles, 'spectrum-Tags-container', {\n 'spectrum-Tags-container--empty': isEmpty\n })}>\n <FocusRing focusRingClass={classNames(styles, 'focus-ring')}>\n <div ref={tagsRef} {...gridProps} className={classNames(styles, 'spectrum-Tags')}>\n {visibleTags.map(item => (\n <Tag {...item.props} key={item.key} item={item} state={state}>\n {item.rendered}\n </Tag>\n ))}\n {isEmpty && (\n <div className={classNames(styles, 'spectrum-Tags-empty-state')}>\n {renderEmptyState()}\n </div>\n )}\n </div>\n </FocusRing>\n {showActions && !isEmpty && (\n <Provider isDisabled={false}>\n <div\n role=\"group\"\n ref={actionsRef}\n id={actionsId}\n aria-label={stringFormatter.format('actions')}\n aria-labelledby={`${gridProps.id} ${actionsId}`}\n className={classNames(styles, 'spectrum-Tags-actions')}>\n {tagState.showCollapseButton && (\n <ActionButton\n isQuiet\n onPress={handlePressCollapse}\n UNSAFE_className={classNames(styles, 'spectrum-Tags-actionButton')}>\n {isCollapsed\n ? stringFormatter.format('showAllButtonLabel', {\n tagCount: state.collection.size\n })\n : stringFormatter.format('hideButtonLabel')}\n </ActionButton>\n )}\n {actionLabel && onAction && (\n <ActionButton\n isQuiet\n onPress={() => onAction?.()}\n UNSAFE_className={classNames(styles, 'spectrum-Tags-actionButton')}>\n {actionLabel}\n </ActionButton>\n )}\n </div>\n </Provider>\n )}\n </div>\n </Field>\n </FocusScope>\n );\n}) as <T>(props: SpectrumTagGroupProps<T> & {ref?: DOMRef<HTMLDivElement>}) => ReactNode;\n"],"names":[],"version":3,"file":"TagGroup.mjs.map"}