@servicetitan/anvil2 1.46.2 → 1.46.3

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 (164) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/{Avatar-CyGjhToG.js → Avatar-3d5Kv2CF.js} +2 -2
  3. package/dist/{Avatar-CyGjhToG.js.map → Avatar-3d5Kv2CF.js.map} +1 -1
  4. package/dist/{Avatar-D07f9NH_.js → Avatar-DJ3oJNsv.js} +2 -2
  5. package/dist/{Avatar-D07f9NH_.js.map → Avatar-DJ3oJNsv.js.map} +1 -1
  6. package/dist/Avatar.js +2 -2
  7. package/dist/{Calendar-X9qUi6Vx.js → Calendar-Cn0fOgog.js} +99 -48
  8. package/dist/Calendar-Cn0fOgog.js.map +1 -0
  9. package/dist/Calendar.js +1 -1
  10. package/dist/{Checkbox-CcYtto5f.js → Checkbox-C5PX8wur.js} +2 -2
  11. package/dist/{Checkbox-CcYtto5f.js.map → Checkbox-C5PX8wur.js.map} +1 -1
  12. package/dist/{Checkbox-BDohwHXQ.js → Checkbox-DAODkzN3.js} +2 -2
  13. package/dist/{Checkbox-BDohwHXQ.js.map → Checkbox-DAODkzN3.js.map} +1 -1
  14. package/dist/Checkbox.js +2 -2
  15. package/dist/{Chip-Bz-vlQ4D.js → Chip-DLU13qe-.js} +2 -2
  16. package/dist/{Chip-Bz-vlQ4D.js.map → Chip-DLU13qe-.js.map} +1 -1
  17. package/dist/Chip.js +1 -1
  18. package/dist/{Combobox-DQmW8Tyl.js → Combobox-DO8cIvRQ.js} +6 -6
  19. package/dist/{Combobox-DQmW8Tyl.js.map → Combobox-DO8cIvRQ.js.map} +1 -1
  20. package/dist/Combobox.js +1 -1
  21. package/dist/{DateField-C43nfkbx.js → DateField-qHdgwSlB.js} +35 -101
  22. package/dist/DateField-qHdgwSlB.js.map +1 -0
  23. package/dist/DateField.js +1 -1
  24. package/dist/{DateFieldRange-g7n5QYww.js → DateFieldRange-GNpWV70g.js} +54 -55
  25. package/dist/DateFieldRange-GNpWV70g.js.map +1 -0
  26. package/dist/DateFieldRange.js +1 -1
  27. package/dist/{DateFieldSingle-D3tneqeG.js → DateFieldSingle-B9caNibj.js} +50 -52
  28. package/dist/DateFieldSingle-B9caNibj.js.map +1 -0
  29. package/dist/DateFieldSingle.js +1 -1
  30. package/dist/{DateFieldYearless-3JBVj3wn.js → DateFieldYearless-BmeKGaDc.js} +2 -2
  31. package/dist/{DateFieldYearless-3JBVj3wn.js.map → DateFieldYearless-BmeKGaDc.js.map} +1 -1
  32. package/dist/DateFieldYearless.js +1 -1
  33. package/dist/{DaysOfTheWeek-RcPgDoM3.js → DaysOfTheWeek-DPH13VCK.js} +3 -3
  34. package/dist/{DaysOfTheWeek-RcPgDoM3.js.map → DaysOfTheWeek-DPH13VCK.js.map} +1 -1
  35. package/dist/DaysOfTheWeek.js +1 -1
  36. package/dist/{Dialog-FNJ16gY6.js → Dialog-BHFLnFNQ.js} +5 -5
  37. package/dist/{Dialog-FNJ16gY6.js.map → Dialog-BHFLnFNQ.js.map} +1 -1
  38. package/dist/Dialog.js +1 -1
  39. package/dist/{Drawer-DT31CMRd.js → Drawer-BDA7Sjj9.js} +5 -5
  40. package/dist/{Drawer-DT31CMRd.js.map → Drawer-BDA7Sjj9.js.map} +1 -1
  41. package/dist/Drawer.js +1 -1
  42. package/dist/{FieldLabel-BP8QK5UR.js → FieldLabel-Bgl3iu13.js} +2 -2
  43. package/dist/{FieldLabel-BP8QK5UR.js.map → FieldLabel-Bgl3iu13.js.map} +1 -1
  44. package/dist/FieldLabel.js +1 -1
  45. package/dist/{InputMask-CPuYMcw9.js → InputMask-B13KumrK.js} +2 -2
  46. package/dist/{InputMask-CPuYMcw9.js.map → InputMask-B13KumrK.js.map} +1 -1
  47. package/dist/InputMask.js +1 -1
  48. package/dist/{ListView-BJI8BQJ-.js → ListView-C-cVQZHp.js} +3 -3
  49. package/dist/{ListView-BJI8BQJ-.js.map → ListView-C-cVQZHp.js.map} +1 -1
  50. package/dist/ListView.js +1 -1
  51. package/dist/{Listbox-CUhMbFm2.js → Listbox-DxGx630W.js} +2 -2
  52. package/dist/{Listbox-CUhMbFm2.js.map → Listbox-DxGx630W.js.map} +1 -1
  53. package/dist/Listbox.js +1 -1
  54. package/dist/{Menu-t_11BIhU.js → Menu-DUZqzpwg.js} +6 -8
  55. package/dist/Menu-DUZqzpwg.js.map +1 -0
  56. package/dist/Menu.js +1 -1
  57. package/dist/{NumberField-Bjf9Tyvf.js → NumberField-DWPAy1eG.js} +7 -7
  58. package/dist/{NumberField-Bjf9Tyvf.js.map → NumberField-DWPAy1eG.js.map} +1 -1
  59. package/dist/NumberField.css +9 -6
  60. package/dist/NumberField.js +1 -1
  61. package/dist/{Page-BAyXnhz2.js → Page-BfH2mGSt.js} +7 -7
  62. package/dist/{Page-BAyXnhz2.js.map → Page-BfH2mGSt.js.map} +1 -1
  63. package/dist/Page.js +1 -1
  64. package/dist/{Pagination-DCBic619.js → Pagination-B_G9QcHf.js} +3 -3
  65. package/dist/{Pagination-DCBic619.js.map → Pagination-B_G9QcHf.js.map} +1 -1
  66. package/dist/Pagination.js +1 -1
  67. package/dist/{Popover-CrksxqKk.js → Popover-v8R920kj.js} +135 -200
  68. package/dist/Popover-v8R920kj.js.map +1 -0
  69. package/dist/Popover.js +1 -1
  70. package/dist/{ProgressBar-CgsAW2d8.js → ProgressBar-BWN2yv1s.js} +2 -2
  71. package/dist/{ProgressBar-CgsAW2d8.js.map → ProgressBar-BWN2yv1s.js.map} +1 -1
  72. package/dist/ProgressBar.js +1 -1
  73. package/dist/{Radio-C_rvxw74.js → Radio-C5riI-do.js} +2 -2
  74. package/dist/{Radio-C_rvxw74.js.map → Radio-C5riI-do.js.map} +1 -1
  75. package/dist/Radio.js +2 -2
  76. package/dist/{RadioGroup-DxBblSrx.js → RadioGroup-B7O06pVu.js} +2 -2
  77. package/dist/{RadioGroup-DxBblSrx.js.map → RadioGroup-B7O06pVu.js.map} +1 -1
  78. package/dist/{SearchField-Bb0uObwG.js → SearchField-CbwGErC4.js} +2 -2
  79. package/dist/{SearchField-Bb0uObwG.js.map → SearchField-CbwGErC4.js.map} +1 -1
  80. package/dist/SearchField.js +1 -1
  81. package/dist/{SegmentedControl-DC4BpdH5.js → SegmentedControl-CLDdes8W.js} +2 -2
  82. package/dist/{SegmentedControl-DC4BpdH5.js.map → SegmentedControl-CLDdes8W.js.map} +1 -1
  83. package/dist/SegmentedControl.js +1 -1
  84. package/dist/{SelectCard-DunNE9R3.js → SelectCard-Ca07K1FW.js} +3 -3
  85. package/dist/{SelectCard-DunNE9R3.js.map → SelectCard-Ca07K1FW.js.map} +1 -1
  86. package/dist/SelectCard.js +1 -1
  87. package/dist/{SelectTrigger-BYysLREL.js → SelectTrigger-CaXX1SHG.js} +3 -3
  88. package/dist/{SelectTrigger-BYysLREL.js.map → SelectTrigger-CaXX1SHG.js.map} +1 -1
  89. package/dist/SelectTrigger.js +1 -1
  90. package/dist/{SelectTriggerBase-DqUpJgzk.js → SelectTriggerBase-C7TLCna1.js} +3 -3
  91. package/dist/{SelectTriggerBase-DqUpJgzk.js.map → SelectTriggerBase-C7TLCna1.js.map} +1 -1
  92. package/dist/{SideNav-B9AWmF_H.js → SideNav-nqq5sAwz.js} +2 -2
  93. package/dist/{SideNav-B9AWmF_H.js.map → SideNav-nqq5sAwz.js.map} +1 -1
  94. package/dist/SideNav.js +1 -1
  95. package/dist/{Stepper-DHTrvfXw.js → Stepper-DQ_Hm-AI.js} +2 -2
  96. package/dist/{Stepper-DHTrvfXw.js.map → Stepper-DQ_Hm-AI.js.map} +1 -1
  97. package/dist/Stepper.js +1 -1
  98. package/dist/{Tab-0zx9hsw8.js → Tab-CzNx3IdF.js} +2 -2
  99. package/dist/{Tab-0zx9hsw8.js.map → Tab-CzNx3IdF.js.map} +1 -1
  100. package/dist/Tab.js +1 -1
  101. package/dist/{TextField-CFWs3lm9.js → TextField-D9gD-34Q.js} +3 -3
  102. package/dist/{TextField-CFWs3lm9.js.map → TextField-D9gD-34Q.js.map} +1 -1
  103. package/dist/{TextField-Cge6IRo5.js → TextField-uCHgwO5F.js} +2 -2
  104. package/dist/{TextField-Cge6IRo5.js.map → TextField-uCHgwO5F.js.map} +1 -1
  105. package/dist/TextField.js +1 -1
  106. package/dist/{Textarea-CXd3NKkW.js → Textarea-B2-6m291.js} +3 -3
  107. package/dist/{Textarea-CXd3NKkW.js.map → Textarea-B2-6m291.js.map} +1 -1
  108. package/dist/Textarea.js +1 -1
  109. package/dist/{TimeField-4v5aCwiG.js → TimeField-B5Jgy-Zg.js} +21 -8
  110. package/dist/TimeField-B5Jgy-Zg.js.map +1 -0
  111. package/dist/TimeField.js +1 -1
  112. package/dist/Toast.js +2 -2
  113. package/dist/{Toaster-bON5Xc1P.js → Toaster-CHyB-Mxs.js} +3 -3
  114. package/dist/{Toaster-bON5Xc1P.js.map → Toaster-CHyB-Mxs.js.map} +1 -1
  115. package/dist/{Toaster-D-rNSLTq.js → Toaster-CyiGDKMh.js} +3 -3
  116. package/dist/{Toaster-D-rNSLTq.js.map → Toaster-CyiGDKMh.js.map} +1 -1
  117. package/dist/{Toolbar-B2Jsuptz.js → Toolbar-BXGTrR6o.js} +16 -15
  118. package/dist/Toolbar-BXGTrR6o.js.map +1 -0
  119. package/dist/Toolbar.js +1 -1
  120. package/dist/{Tooltip-CtCLw_vx.js → Tooltip-DhtVlhah.js} +2 -2
  121. package/dist/{Tooltip-CtCLw_vx.js.map → Tooltip-DhtVlhah.js.map} +1 -1
  122. package/dist/Tooltip.js +1 -1
  123. package/dist/beta.js +1 -1
  124. package/dist/components/Calendar/Calendar.d.ts +5 -0
  125. package/dist/components/Calendar/CalendarNowButton.d.ts +3 -1
  126. package/dist/components/Popover/Popover.d.ts +136 -1
  127. package/dist/components/Popover/PopoverTrigger.d.ts +0 -1
  128. package/dist/components/Popover/internal/PopoverContext.d.ts +5 -3
  129. package/dist/components/Popover/internal/usePopoverContext.d.ts +6 -4
  130. package/dist/hooks/useMergeRefs/useMergeRefs.d.ts +11 -0
  131. package/dist/index.js +43 -43
  132. package/dist/internal/hooks/useFocusWithin/useFocusWithin.d.ts +2 -1
  133. package/dist/internal/hooks/useKeyboardFocusables/useKeyboardFocusables.d.ts +0 -1
  134. package/dist/internal/hooks/useOnClickOutside/useOnClickOutside.d.ts +5 -1
  135. package/dist/{useFocusWithin-BhhgRXdZ.js → useFocusWithin-hi77jsrB.js} +6 -3
  136. package/dist/useFocusWithin-hi77jsrB.js.map +1 -0
  137. package/dist/{useDialogTransitionStates-C1TtiwA_.js → useKeyboardFocusables-ek2mYel-.js} +45 -4
  138. package/dist/useKeyboardFocusables-ek2mYel-.js.map +1 -0
  139. package/dist/useMergeRefs-Dfmtq9cI.js +22 -0
  140. package/dist/useMergeRefs-Dfmtq9cI.js.map +1 -0
  141. package/dist/useMergeRefs.js +1 -1
  142. package/dist/{useOnClickOutside-B1ddwORK.js → useOnClickOutside-C5AZE_I6.js} +6 -65
  143. package/dist/useOnClickOutside-C5AZE_I6.js.map +1 -0
  144. package/dist/utils-CnKBdBNm.js +50 -0
  145. package/dist/utils-CnKBdBNm.js.map +1 -0
  146. package/package.json +1 -1
  147. package/dist/Calendar-X9qUi6Vx.js.map +0 -1
  148. package/dist/DateField-C43nfkbx.js.map +0 -1
  149. package/dist/DateFieldRange-g7n5QYww.js.map +0 -1
  150. package/dist/DateFieldSingle-D3tneqeG.js.map +0 -1
  151. package/dist/Menu-t_11BIhU.js.map +0 -1
  152. package/dist/Popover-CrksxqKk.js.map +0 -1
  153. package/dist/TimeField-4v5aCwiG.js.map +0 -1
  154. package/dist/Toolbar-B2Jsuptz.js.map +0 -1
  155. package/dist/components/DateFieldSingle/internal/useDateFieldOrchestration.d.ts +0 -17
  156. package/dist/useDateFieldOrchestration-DyAc3gPJ.js +0 -138
  157. package/dist/useDateFieldOrchestration-DyAc3gPJ.js.map +0 -1
  158. package/dist/useDialogTransitionStates-C1TtiwA_.js.map +0 -1
  159. package/dist/useFocusWithin-BhhgRXdZ.js.map +0 -1
  160. package/dist/useMergeRefs-Bde85AWI.js +0 -21
  161. package/dist/useMergeRefs-Bde85AWI.js.map +0 -1
  162. package/dist/useOnClickOutside-B1ddwORK.js.map +0 -1
  163. package/dist/usePopoverCloseDelayWorkaround-BZcjPkvT.js +0 -18
  164. package/dist/usePopoverCloseDelayWorkaround-BZcjPkvT.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  # @servicetitan/anvil2
2
2
 
3
+ ## 1.46.3
4
+
5
+ ### Patch Changes
6
+
7
+ - [#1523](https://github.com/servicetitan/hammer/pull/1523) [`13be930`](https://github.com/servicetitan/hammer/commit/13be930e99b9386c9f9e4b9fbe7446f3157af220) Thanks [@AdamLantz](https://github.com/AdamLantz)! - [Popover] Fix an issue where `onClickOutside` was not called if `Popover` was not given a controlled value
8
+
9
+ - [#1523](https://github.com/servicetitan/hammer/pull/1523) [`13be930`](https://github.com/servicetitan/hammer/commit/13be930e99b9386c9f9e4b9fbe7446f3157af220) Thanks [@AdamLantz](https://github.com/AdamLantz)! - [Popover] Fix issue where the onClose prop was cached incorrectly resulting in stale data challenges
10
+
11
+ - [#1562](https://github.com/servicetitan/hammer/pull/1562) [`0639f3f`](https://github.com/servicetitan/hammer/commit/0639f3f8d9efdca3b3957e738afc11f498ceff1e) Thanks [@AdamLantz](https://github.com/AdamLantz)! - [NumberField] Fix text of neighboring elements being selected when using increment and decrement buttons
12
+
13
+ - [#1523](https://github.com/servicetitan/hammer/pull/1523) [`13be930`](https://github.com/servicetitan/hammer/commit/13be930e99b9386c9f9e4b9fbe7446f3157af220) Thanks [@AdamLantz](https://github.com/AdamLantz)! - [Popover] Rework focus management to be more performant and only run when `modal` is `true`
14
+
15
+ - [#1523](https://github.com/servicetitan/hammer/pull/1523) [`13be930`](https://github.com/servicetitan/hammer/commit/13be930e99b9386c9f9e4b9fbe7446f3157af220) Thanks [@AdamLantz](https://github.com/AdamLantz)! - [Popover] Expose openPopover and closePopover functions on Popover ref
16
+
17
+ - [#1523](https://github.com/servicetitan/hammer/pull/1523) [`13be930`](https://github.com/servicetitan/hammer/commit/13be930e99b9386c9f9e4b9fbe7446f3157af220) Thanks [@AdamLantz](https://github.com/AdamLantz)! - [DateField, DateFieldSingle, DateFieldRange] Fix invalid state change during render
18
+
19
+ - [#1559](https://github.com/servicetitan/hammer/pull/1559) [`a947a8a`](https://github.com/servicetitan/hammer/commit/a947a8a91360ab5c787bb6e6209f7d94f121d198) Thanks [@w-a-t-s-o-n](https://github.com/w-a-t-s-o-n)! - [Menu] Fix scroll container height bug
20
+
21
+ - [#1523](https://github.com/servicetitan/hammer/pull/1523) [`13be930`](https://github.com/servicetitan/hammer/commit/13be930e99b9386c9f9e4b9fbe7446f3157af220) Thanks [@AdamLantz](https://github.com/AdamLantz)! - [Popover] Remove setTimeout from open/close functions
22
+
23
+ - [#1523](https://github.com/servicetitan/hammer/pull/1523) [`13be930`](https://github.com/servicetitan/hammer/commit/13be930e99b9386c9f9e4b9fbe7446f3157af220) Thanks [@AdamLantz](https://github.com/AdamLantz)! - [Popover] Fix issue where `defaultOpen` did nothing
24
+
25
+ - [#1523](https://github.com/servicetitan/hammer/pull/1523) [`13be930`](https://github.com/servicetitan/hammer/commit/13be930e99b9386c9f9e4b9fbe7446f3157af220) Thanks [@AdamLantz](https://github.com/AdamLantz)! - [Calendar] Fix inability keyboard navigate to today, next month, and previous month buttons
26
+
3
27
  ## 1.46.2
4
28
 
5
29
  ### Patch Changes
@@ -1,5 +1,5 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
- import { A as AvatarGroup, a as Avatar$1 } from './Avatar-D07f9NH_.js';
2
+ import { A as AvatarGroup, a as Avatar$1 } from './Avatar-DJ3oJNsv.js';
3
3
  import { forwardRef } from 'react';
4
4
 
5
5
  const AvatarElement = forwardRef(
@@ -32,4 +32,4 @@ const Avatar = Object.assign(AvatarElement, {
32
32
  });
33
33
 
34
34
  export { Avatar as A };
35
- //# sourceMappingURL=Avatar-CyGjhToG.js.map
35
+ //# sourceMappingURL=Avatar-3d5Kv2CF.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Avatar-CyGjhToG.js","sources":["../src/components/Avatar/Avatar.tsx"],"sourcesContent":["import {\n Avatar as CoreAvatar,\n AvatarProps as CoreAvatarProps,\n} from \"./internal/Avatar\";\nimport { Ref, forwardRef } from \"react\";\nimport { DistributiveOmit } from \"../../types\";\nimport { AvatarGroup } from \"./AvatarGroup\";\n\n/**\n * Props for the Avatar component\n * @property {string} name - Full name used for alt text and screen reader\n * @property {string} [color] - Custom color of the Avatar\n * @property {string} [image] - Image source to be used for Avatar\n * @property {\"small\" | \"medium\" | \"large\"} [size] - Size of the Avatar\n * @property {\"online\" | \"offline\"} [status] - Online status of the Avatar\n * @extends ComponentPropsWithoutRef<\"span\">\n * @extends Omit<AvatarBaseProps, \"initials\">\n * @extends Omit<LayoutUtilProps, \"flex\" | \"flexBasis\" | \"flexGrow\" | \"flexShrink\">\n * @extends DataTrackingId\n */\nexport type AvatarProps = DistributiveOmit<CoreAvatarProps, \"size\"> & {\n size?: Extract<CoreAvatarProps[\"size\"], \"small\" | \"medium\" | \"large\">;\n};\n\n/**\n * Avatar component for displaying user avatars with initials or images.\n *\n * Features:\n * - Displays user initials when no image is provided\n * - Supports custom colors and sizes\n * - Shows online/offline status\n * - Fully accessible with screen reader support\n * - Automatic image fallback handling\n * - Automatic tracking ID generation for analytics\n *\n * @example\n * <Avatar name=\"John Doe\" size=\"medium\" status=\"online\" />\n */\nconst AvatarElement = forwardRef(\n (props: AvatarProps, ref: Ref<HTMLSpanElement>) => {\n return <CoreAvatar ref={ref} {...props} />;\n },\n);\nAvatarElement.displayName = CoreAvatar.displayName;\n\nexport const Avatar = Object.assign(AvatarElement, {\n /**\n * AvatarGroup component for displaying multiple avatars in a group.\n *\n * Features:\n * - Displays multiple avatars in a stacked layout\n * - Handles overflow with a count indicator\n * - Maintains consistent sizing across all avatars\n * - Supports custom styling and layout\n * - Automatically adjusts z-index for proper stacking\n * - Fully accessible with screen reader support\n *\n * @example\n * <Avatar.Group max={3}>\n * <Avatar name=\"John Doe\" />\n * <Avatar name=\"Jane Smith\" />\n * <Avatar name=\"Bob Johnson\" />\n * <Avatar name=\"Alice Brown\" />\n * </Avatar.Group>\n */\n Group: AvatarGroup,\n});\n"],"names":["CoreAvatar"],"mappings":";;;;AAsCA,MAAM,aAAA,GAAgB,UAAA;AAAA,EACpB,CAAC,OAAoB,GAAA,KAA8B;AACjD,IAAA,uBAAO,GAAA,CAACA,QAAA,EAAA,EAAW,GAAA,EAAW,GAAG,KAAA,EAAO,CAAA;AAAA,EAC1C;AACF,CAAA;AACA,aAAA,CAAc,cAAcA,QAAA,CAAW,WAAA;AAEhC,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,aAAA,EAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBjD,KAAA,EAAO;AACT,CAAC;;;;"}
1
+ {"version":3,"file":"Avatar-3d5Kv2CF.js","sources":["../src/components/Avatar/Avatar.tsx"],"sourcesContent":["import {\n Avatar as CoreAvatar,\n AvatarProps as CoreAvatarProps,\n} from \"./internal/Avatar\";\nimport { Ref, forwardRef } from \"react\";\nimport { DistributiveOmit } from \"../../types\";\nimport { AvatarGroup } from \"./AvatarGroup\";\n\n/**\n * Props for the Avatar component\n * @property {string} name - Full name used for alt text and screen reader\n * @property {string} [color] - Custom color of the Avatar\n * @property {string} [image] - Image source to be used for Avatar\n * @property {\"small\" | \"medium\" | \"large\"} [size] - Size of the Avatar\n * @property {\"online\" | \"offline\"} [status] - Online status of the Avatar\n * @extends ComponentPropsWithoutRef<\"span\">\n * @extends Omit<AvatarBaseProps, \"initials\">\n * @extends Omit<LayoutUtilProps, \"flex\" | \"flexBasis\" | \"flexGrow\" | \"flexShrink\">\n * @extends DataTrackingId\n */\nexport type AvatarProps = DistributiveOmit<CoreAvatarProps, \"size\"> & {\n size?: Extract<CoreAvatarProps[\"size\"], \"small\" | \"medium\" | \"large\">;\n};\n\n/**\n * Avatar component for displaying user avatars with initials or images.\n *\n * Features:\n * - Displays user initials when no image is provided\n * - Supports custom colors and sizes\n * - Shows online/offline status\n * - Fully accessible with screen reader support\n * - Automatic image fallback handling\n * - Automatic tracking ID generation for analytics\n *\n * @example\n * <Avatar name=\"John Doe\" size=\"medium\" status=\"online\" />\n */\nconst AvatarElement = forwardRef(\n (props: AvatarProps, ref: Ref<HTMLSpanElement>) => {\n return <CoreAvatar ref={ref} {...props} />;\n },\n);\nAvatarElement.displayName = CoreAvatar.displayName;\n\nexport const Avatar = Object.assign(AvatarElement, {\n /**\n * AvatarGroup component for displaying multiple avatars in a group.\n *\n * Features:\n * - Displays multiple avatars in a stacked layout\n * - Handles overflow with a count indicator\n * - Maintains consistent sizing across all avatars\n * - Supports custom styling and layout\n * - Automatically adjusts z-index for proper stacking\n * - Fully accessible with screen reader support\n *\n * @example\n * <Avatar.Group max={3}>\n * <Avatar name=\"John Doe\" />\n * <Avatar name=\"Jane Smith\" />\n * <Avatar name=\"Bob Johnson\" />\n * <Avatar name=\"Alice Brown\" />\n * </Avatar.Group>\n */\n Group: AvatarGroup,\n});\n"],"names":["CoreAvatar"],"mappings":";;;;AAsCA,MAAM,aAAA,GAAgB,UAAA;AAAA,EACpB,CAAC,OAAoB,GAAA,KAA8B;AACjD,IAAA,uBAAO,GAAA,CAACA,QAAA,EAAA,EAAW,GAAA,EAAW,GAAG,KAAA,EAAO,CAAA;AAAA,EAC1C;AACF,CAAA;AACA,aAAA,CAAc,cAAcA,QAAA,CAAW,WAAA;AAEhC,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,aAAA,EAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBjD,KAAA,EAAO;AACT,CAAC;;;;"}
@@ -5,7 +5,7 @@ import { u as useAccessibleColor, t as tinycolor } from './useAccessibleColor-BY
5
5
  import { S as SrOnly } from './SrOnly-CTsYSuby.js';
6
6
  import { T as ThemeProviderContext } from './ThemeProviderContext-l52GohYT.js';
7
7
  import { u as usePrefersColorScheme } from './usePrefersColorScheme-_hT7dK7_.js';
8
- import { u as useMergeRefs } from './useMergeRefs-Bde85AWI.js';
8
+ import { u as useMergeRefs } from './useMergeRefs-Dfmtq9cI.js';
9
9
  import { u as useLayoutPropsUtil } from './useLayoutPropsUtil-DjD5IMh0.js';
10
10
 
11
11
  import './Avatar.css';function getInitial(name) {
@@ -253,4 +253,4 @@ const Avatar = Object.assign(AvatarElement, {
253
253
  });
254
254
 
255
255
  export { AvatarGroup as A, Avatar as a };
256
- //# sourceMappingURL=Avatar-D07f9NH_.js.map
256
+ //# sourceMappingURL=Avatar-DJ3oJNsv.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Avatar-D07f9NH_.js","sources":["../src/internal/functions/getInitial.ts","../src/components/Avatar/internal/AvatarBase.tsx","../src/components/Avatar/AvatarGroup.tsx","../src/components/Avatar/internal/Avatar.tsx"],"sourcesContent":["/**\n * Extracts initials from a full name string.\n *\n * Features:\n * - Handles single names (returns first two characters)\n * - Handles multiple names (returns first and last name initials)\n * - Automatically capitalizes all initials\n * - Filters out empty strings and whitespace\n * - Handles edge cases like empty names and single characters\n * - Preserves proper capitalization rules\n * - Returns undefined for empty or falsy input\n *\n * @param name - The full name string to extract initials from\n * @returns The initials as a string, or undefined if name is empty\n */\nexport function getInitial(name: string) {\n if (!name) return undefined;\n\n const nameArray = name.split(\" \").filter(Boolean);\n\n if (nameArray.length > 1)\n return `${nameArray[0][0]?.toUpperCase()}${nameArray[\n nameArray.length - 1\n ][0].toUpperCase()}`;\n\n if (nameArray[0][1]) {\n return `${nameArray[0][0].toUpperCase()}${nameArray[0][1].toLowerCase()}`;\n }\n return `${nameArray[0][0].toUpperCase()}`;\n}\n","import {\n ComponentPropsWithoutRef,\n forwardRef,\n useContext,\n useRef,\n useState,\n useEffect,\n useMemo,\n} from \"react\";\nimport cx from \"classnames\";\nimport tinycolor from \"tinycolor2\";\n\nimport { LayoutUtilProps, Size } from \"../../../types\";\nimport { SrOnly } from \"../../SrOnly\";\nimport {\n useAccessibleColor,\n useMergeRefs,\n usePrefersColorScheme,\n} from \"../../../hooks\";\n\nimport styles from \"./AvatarBase.module.scss\";\nimport { ThemeProviderContext } from \"../../../providers/ThemeProvider/internal/ThemeProviderContext\";\n\n/**\n * Props for the AvatarBase component\n * @extends ComponentPropsWithoutRef<\"span\">\n * @extends Omit<LayoutUtilProps, \"flex\" | \"flexBasis\" | \"flexGrow\" | \"flexShrink\">\n */\nexport type AvatarBaseProps = ComponentPropsWithoutRef<\"span\"> &\n Omit<LayoutUtilProps, \"flex\" | \"flexBasis\" | \"flexGrow\" | \"flexShrink\"> & {\n /**\n * Full name\n * @accessibility This is used for alt text and Screenreader\n */\n name: string;\n /**\n * Custom color of the AvatarBase\n */\n color?: string;\n /**\n * Image source to be used for AvatarBase\n */\n image?: string;\n /**\n * Initials to display if no image is provided\n */\n initials?: string;\n /**\n * @default medium\n */\n size?: Extract<Size, \"xsmall\" | \"small\" | \"medium\" | \"large\">;\n /**\n * Online status of the AvatarBase\n */\n status?: \"online\" | \"offline\";\n };\n\n/**\n * Base Avatar component that handles the core avatar functionality.\n *\n * Features:\n * - Renders user avatars with images or initials\n * - Supports custom colors with accessible contrast\n * - Shows online/offline status indicator\n * - Handles image loading errors gracefully\n * - Supports light and dark themes\n * - Fully accessible with screen reader support\n *\n * @example\n * <AvatarBase name=\"John Doe\" size=\"medium\" status=\"online\" />\n */\nexport const AvatarBase = forwardRef<HTMLSpanElement, AvatarBaseProps>(\n (props, ref) => {\n const {\n className,\n color,\n status,\n name,\n image,\n initials,\n style,\n size,\n ...rest\n } = props;\n\n const elRef = useRef<HTMLSpanElement>(null);\n const imgRef = useRef<HTMLImageElement>(null);\n const [hasImageErrored, setHasImageErrored] = useState(false);\n const avatarBaseClassNames = cx(styles[\"avatar-base\"], className, {\n [styles[`${size}`]]: size,\n });\n const onlineIndicatorClassNames = cx(styles[\"indicator\"], {\n [styles[\"offline\"]]: !status || status === \"offline\",\n [styles[\"online\"]]: status && status === \"online\",\n });\n\n const { mode: themeMode } = useContext(ThemeProviderContext);\n const { mode: sysMode } = usePrefersColorScheme();\n const mode = themeMode ?? sysMode;\n\n const { foreground, background, border } = useAccessibleColor(color, mode);\n\n const styleWithColor = {\n \"--int-bg-color\": color && background,\n \"--int-font-color\": color && foreground,\n \"--int-border-color\": color && border,\n ...style,\n };\n\n const onlineIndicatorBorderColor = useMemo(() => {\n if (mode === \"dark\") {\n if (color) {\n return tinycolor(background).brighten(20).toHexString();\n }\n }\n return \"var(--background-color)\";\n }, [color, mode, background]);\n\n const onlineIndicatorStyles = {\n \"--int-border-color\": onlineIndicatorBorderColor,\n } as React.CSSProperties;\n\n const onlineString = status;\n const srOnly = [name, onlineString].filter(Boolean).join(\" \");\n\n // if the image prop updates, also reset the error state for the new image\n useEffect(() => {\n if (image) {\n setHasImageErrored(false);\n }\n }, [image]);\n\n // if the image is already complete on our first render (likely due to SSR),\n // check the error state of the already complete image\n useEffect(() => {\n if (image && imgRef.current && imgRef.current.complete) {\n const img = new Image();\n img.onerror = () => setHasImageErrored(true);\n img.src = image;\n }\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n return (\n <span\n className={avatarBaseClassNames}\n style={styleWithColor}\n data-anv=\"avatarBase\"\n {...rest}\n ref={useMergeRefs([elRef, ref])}\n >\n {image && !hasImageErrored ? (\n <img\n className={styles[\"img\"]}\n aria-hidden\n src={image}\n alt={name}\n onError={() => setHasImageErrored(true)}\n ref={imgRef}\n />\n ) : initials ? (\n <span className={styles[\"initial\"]} aria-hidden>\n {initials}\n </span>\n ) : (\n <span aria-hidden>?</span>\n )}\n\n {status && (\n <span\n aria-hidden\n className={onlineIndicatorClassNames}\n style={onlineIndicatorStyles}\n />\n )}\n\n <SrOnly>{srOnly}</SrOnly>\n </span>\n );\n },\n);\n\nAvatarBase.displayName = \"AvatarBase\";\n","import {\n ComponentPropsWithoutRef,\n forwardRef,\n Children,\n isValidElement,\n cloneElement,\n CSSProperties,\n ReactElement,\n} from \"react\";\nimport cx from \"classnames\";\nimport styles from \"./AvatarGroup.module.scss\";\nimport avatarBaseStyles from \"./internal/AvatarBase.module.scss\";\nimport type { LayoutUtilProps } from \"../../types\";\nimport { useLayoutPropsUtil } from \"../../internal/hooks\";\nimport { AvatarBase } from \"./internal/AvatarBase\";\n\n/**\n * Props for the AvatarGroup component\n * @property {number} [max] - Maximum number of avatars to display before truncating\n * @extends LayoutUtilProps\n * @extends ComponentPropsWithoutRef<\"span\">\n */\nexport type AvatarGroupProps = LayoutUtilProps &\n ComponentPropsWithoutRef<\"span\"> & {\n /**\n * Max child to show before truncating\n */\n max?: number;\n };\n\n/**\n * AvatarGroup component for displaying multiple avatars in a group.\n *\n * Features:\n * - Displays multiple avatars in a stacked layout\n * - Handles overflow with a count indicator\n * - Maintains consistent sizing across all avatars\n * - Supports custom styling and layout\n * - Automatically adjusts z-index for proper stacking\n * - Fully accessible with screen reader support\n *\n * @example\n * <Avatar.Group max={3}>\n * <Avatar name=\"John Doe\" />\n * <Avatar name=\"Jane Smith\" />\n * <Avatar name=\"Bob Johnson\" />\n * <Avatar name=\"Alice Brown\" />\n * </Avatar.Group>\n */\nexport const AvatarGroup = forwardRef<HTMLSpanElement, AvatarGroupProps>(\n (props, ref) => {\n const { layoutStyles, componentProps } = useLayoutPropsUtil(props);\n const { className, max, style, children, ...rest } = componentProps;\n const childrenArr = Children.toArray(children);\n const inferredSize =\n (isValidElement(childrenArr[0]) && childrenArr[0].props.size) ?? \"medium\";\n const isOverflowing = max ? max < childrenArr.length : false;\n\n const overflowCount = max && childrenArr.length - max;\n\n const avatarGroupClassNames = cx(styles[\"avatar-group\"], className, {\n [styles[`${inferredSize}`]]: inferredSize,\n });\n\n const avatarBaseOverflowClassNames = cx(\n avatarBaseStyles[\"avatar-base-overflow\"],\n {\n [avatarBaseStyles[\"overflow-ten-plus\"]]:\n overflowCount && overflowCount > 9,\n },\n );\n\n const styleCombined = {\n ...style,\n ...layoutStyles,\n };\n return (\n <span\n ref={ref}\n className={avatarGroupClassNames}\n style={styleCombined}\n data-anv=\"avatar-group\"\n {...rest}\n >\n {childrenArr.map((child, i) => {\n let childEl = child;\n if (isValidElement(child)) {\n const nIndex = childrenArr.length - i;\n const nStyle: CSSProperties = {\n ...child.props.style,\n zIndex: nIndex,\n };\n childEl = cloneElement(child as ReactElement, {\n style: nStyle,\n });\n }\n\n if (!max) return childEl;\n if (i < max) return childEl;\n return null;\n })}\n {isOverflowing && max && (\n <AvatarBase\n className={avatarBaseOverflowClassNames}\n name={`+${overflowCount}`}\n initials={`+${overflowCount}`}\n size={inferredSize}\n />\n )}\n </span>\n );\n },\n);\n\nAvatarGroup.displayName = \"AvatarGroup\";\n","import { ComponentPropsWithoutRef, forwardRef, useMemo } from \"react\";\nimport { AvatarGroup } from \"../AvatarGroup\";\nimport { LayoutUtilProps } from \"../../../types\";\nimport { getInitial } from \"../../../internal/functions\";\n\nimport { useLayoutPropsUtil } from \"../../../internal/hooks\";\nimport { AvatarBase, AvatarBaseProps } from \"./AvatarBase\";\n\n/**\n * Props for the Avatar component\n * @property {string} name - Full name of the user. Used for alt text and screen reader announcements\n * @property {string} [color] - Custom color of the avatar. Should maintain sufficient contrast ratio for accessibility\n * @property {string} [image] - Image source to be used for avatar. Falls back to initials if image fails to load\n * @property {Extract<Size, \"small\" | \"medium\" | \"large\">} [size] - Size of the Avatar\n * @property {\"online\" | \"offline\"} [status] - Online status of the Avatar\n * @extends ComponentPropsWithoutRef<\"span\">\n * @extends Omit<AvatarBaseProps, \"initials\">\n * @extends Omit<LayoutUtilProps, \"flex\" | \"flexBasis\" | \"flexGrow\" | \"flexShrink\">\n */\nexport type AvatarProps = ComponentPropsWithoutRef<\"span\"> &\n Omit<AvatarBaseProps, \"initials\"> &\n Omit<LayoutUtilProps, \"flex\" | \"flexBasis\" | \"flexGrow\" | \"flexShrink\">;\n\nconst AvatarElement = forwardRef<HTMLSpanElement, AvatarProps>((props, ref) => {\n const { layoutStyles, componentProps } = useLayoutPropsUtil(props);\n const { name, style, ...rest } = componentProps;\n\n const styleWithLayout = useMemo(() => {\n return {\n ...layoutStyles,\n ...style,\n };\n }, [layoutStyles, style]);\n\n const initials = getInitial(name);\n\n return (\n <AvatarBase\n style={styleWithLayout}\n data-anv=\"avatar\"\n name={name}\n ref={ref}\n initials={rest.size === \"small\" ? initials?.[0] : initials}\n {...rest}\n />\n );\n});\n\nAvatarElement.displayName = \"Avatar\";\n\n/**\n * Avatar component for displaying user avatars with initials or images.\n *\n * Features:\n * - Displays user initials when no image is provided\n * - Supports custom colors and sizes\n * - Shows online/offline status\n * - Fully accessible with screen reader support\n * - Automatic image fallback handling\n * - Supports layout utilities for positioning and spacing\n *\n * @example\n * <Avatar\n * name=\"John Doe\"\n * image=\"https://example.com/avatar.jpg\"\n * size=\"medium\"\n * status=\"online\"\n * />\n */\nexport const Avatar = Object.assign(AvatarElement, {\n /**\n * AvatarGroup component for displaying multiple avatars in a group.\n *\n * Features:\n * - Displays multiple avatars in a stacked layout\n * - Handles overflow with a count indicator\n * - Maintains consistent sizing across all avatars\n * - Supports custom styling and layout\n * - Automatically adjusts z-index for proper stacking\n * - Fully accessible with screen reader support\n *\n * @example\n * <Avatar.Group max={3}>\n * <Avatar name=\"John Doe\" />\n * <Avatar name=\"Jane Smith\" />\n * <Avatar name=\"Bob Johnson\" />\n * <Avatar name=\"Alice Brown\" />\n * </Avatar.Group>\n */\n Group: AvatarGroup,\n});\n"],"names":["styles"],"mappings":"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"}
1
+ {"version":3,"file":"Avatar-DJ3oJNsv.js","sources":["../src/internal/functions/getInitial.ts","../src/components/Avatar/internal/AvatarBase.tsx","../src/components/Avatar/AvatarGroup.tsx","../src/components/Avatar/internal/Avatar.tsx"],"sourcesContent":["/**\n * Extracts initials from a full name string.\n *\n * Features:\n * - Handles single names (returns first two characters)\n * - Handles multiple names (returns first and last name initials)\n * - Automatically capitalizes all initials\n * - Filters out empty strings and whitespace\n * - Handles edge cases like empty names and single characters\n * - Preserves proper capitalization rules\n * - Returns undefined for empty or falsy input\n *\n * @param name - The full name string to extract initials from\n * @returns The initials as a string, or undefined if name is empty\n */\nexport function getInitial(name: string) {\n if (!name) return undefined;\n\n const nameArray = name.split(\" \").filter(Boolean);\n\n if (nameArray.length > 1)\n return `${nameArray[0][0]?.toUpperCase()}${nameArray[\n nameArray.length - 1\n ][0].toUpperCase()}`;\n\n if (nameArray[0][1]) {\n return `${nameArray[0][0].toUpperCase()}${nameArray[0][1].toLowerCase()}`;\n }\n return `${nameArray[0][0].toUpperCase()}`;\n}\n","import {\n ComponentPropsWithoutRef,\n forwardRef,\n useContext,\n useRef,\n useState,\n useEffect,\n useMemo,\n} from \"react\";\nimport cx from \"classnames\";\nimport tinycolor from \"tinycolor2\";\n\nimport { LayoutUtilProps, Size } from \"../../../types\";\nimport { SrOnly } from \"../../SrOnly\";\nimport {\n useAccessibleColor,\n useMergeRefs,\n usePrefersColorScheme,\n} from \"../../../hooks\";\n\nimport styles from \"./AvatarBase.module.scss\";\nimport { ThemeProviderContext } from \"../../../providers/ThemeProvider/internal/ThemeProviderContext\";\n\n/**\n * Props for the AvatarBase component\n * @extends ComponentPropsWithoutRef<\"span\">\n * @extends Omit<LayoutUtilProps, \"flex\" | \"flexBasis\" | \"flexGrow\" | \"flexShrink\">\n */\nexport type AvatarBaseProps = ComponentPropsWithoutRef<\"span\"> &\n Omit<LayoutUtilProps, \"flex\" | \"flexBasis\" | \"flexGrow\" | \"flexShrink\"> & {\n /**\n * Full name\n * @accessibility This is used for alt text and Screenreader\n */\n name: string;\n /**\n * Custom color of the AvatarBase\n */\n color?: string;\n /**\n * Image source to be used for AvatarBase\n */\n image?: string;\n /**\n * Initials to display if no image is provided\n */\n initials?: string;\n /**\n * @default medium\n */\n size?: Extract<Size, \"xsmall\" | \"small\" | \"medium\" | \"large\">;\n /**\n * Online status of the AvatarBase\n */\n status?: \"online\" | \"offline\";\n };\n\n/**\n * Base Avatar component that handles the core avatar functionality.\n *\n * Features:\n * - Renders user avatars with images or initials\n * - Supports custom colors with accessible contrast\n * - Shows online/offline status indicator\n * - Handles image loading errors gracefully\n * - Supports light and dark themes\n * - Fully accessible with screen reader support\n *\n * @example\n * <AvatarBase name=\"John Doe\" size=\"medium\" status=\"online\" />\n */\nexport const AvatarBase = forwardRef<HTMLSpanElement, AvatarBaseProps>(\n (props, ref) => {\n const {\n className,\n color,\n status,\n name,\n image,\n initials,\n style,\n size,\n ...rest\n } = props;\n\n const elRef = useRef<HTMLSpanElement>(null);\n const imgRef = useRef<HTMLImageElement>(null);\n const [hasImageErrored, setHasImageErrored] = useState(false);\n const avatarBaseClassNames = cx(styles[\"avatar-base\"], className, {\n [styles[`${size}`]]: size,\n });\n const onlineIndicatorClassNames = cx(styles[\"indicator\"], {\n [styles[\"offline\"]]: !status || status === \"offline\",\n [styles[\"online\"]]: status && status === \"online\",\n });\n\n const { mode: themeMode } = useContext(ThemeProviderContext);\n const { mode: sysMode } = usePrefersColorScheme();\n const mode = themeMode ?? sysMode;\n\n const { foreground, background, border } = useAccessibleColor(color, mode);\n\n const styleWithColor = {\n \"--int-bg-color\": color && background,\n \"--int-font-color\": color && foreground,\n \"--int-border-color\": color && border,\n ...style,\n };\n\n const onlineIndicatorBorderColor = useMemo(() => {\n if (mode === \"dark\") {\n if (color) {\n return tinycolor(background).brighten(20).toHexString();\n }\n }\n return \"var(--background-color)\";\n }, [color, mode, background]);\n\n const onlineIndicatorStyles = {\n \"--int-border-color\": onlineIndicatorBorderColor,\n } as React.CSSProperties;\n\n const onlineString = status;\n const srOnly = [name, onlineString].filter(Boolean).join(\" \");\n\n // if the image prop updates, also reset the error state for the new image\n useEffect(() => {\n if (image) {\n setHasImageErrored(false);\n }\n }, [image]);\n\n // if the image is already complete on our first render (likely due to SSR),\n // check the error state of the already complete image\n useEffect(() => {\n if (image && imgRef.current && imgRef.current.complete) {\n const img = new Image();\n img.onerror = () => setHasImageErrored(true);\n img.src = image;\n }\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n return (\n <span\n className={avatarBaseClassNames}\n style={styleWithColor}\n data-anv=\"avatarBase\"\n {...rest}\n ref={useMergeRefs([elRef, ref])}\n >\n {image && !hasImageErrored ? (\n <img\n className={styles[\"img\"]}\n aria-hidden\n src={image}\n alt={name}\n onError={() => setHasImageErrored(true)}\n ref={imgRef}\n />\n ) : initials ? (\n <span className={styles[\"initial\"]} aria-hidden>\n {initials}\n </span>\n ) : (\n <span aria-hidden>?</span>\n )}\n\n {status && (\n <span\n aria-hidden\n className={onlineIndicatorClassNames}\n style={onlineIndicatorStyles}\n />\n )}\n\n <SrOnly>{srOnly}</SrOnly>\n </span>\n );\n },\n);\n\nAvatarBase.displayName = \"AvatarBase\";\n","import {\n ComponentPropsWithoutRef,\n forwardRef,\n Children,\n isValidElement,\n cloneElement,\n CSSProperties,\n ReactElement,\n} from \"react\";\nimport cx from \"classnames\";\nimport styles from \"./AvatarGroup.module.scss\";\nimport avatarBaseStyles from \"./internal/AvatarBase.module.scss\";\nimport type { LayoutUtilProps } from \"../../types\";\nimport { useLayoutPropsUtil } from \"../../internal/hooks\";\nimport { AvatarBase } from \"./internal/AvatarBase\";\n\n/**\n * Props for the AvatarGroup component\n * @property {number} [max] - Maximum number of avatars to display before truncating\n * @extends LayoutUtilProps\n * @extends ComponentPropsWithoutRef<\"span\">\n */\nexport type AvatarGroupProps = LayoutUtilProps &\n ComponentPropsWithoutRef<\"span\"> & {\n /**\n * Max child to show before truncating\n */\n max?: number;\n };\n\n/**\n * AvatarGroup component for displaying multiple avatars in a group.\n *\n * Features:\n * - Displays multiple avatars in a stacked layout\n * - Handles overflow with a count indicator\n * - Maintains consistent sizing across all avatars\n * - Supports custom styling and layout\n * - Automatically adjusts z-index for proper stacking\n * - Fully accessible with screen reader support\n *\n * @example\n * <Avatar.Group max={3}>\n * <Avatar name=\"John Doe\" />\n * <Avatar name=\"Jane Smith\" />\n * <Avatar name=\"Bob Johnson\" />\n * <Avatar name=\"Alice Brown\" />\n * </Avatar.Group>\n */\nexport const AvatarGroup = forwardRef<HTMLSpanElement, AvatarGroupProps>(\n (props, ref) => {\n const { layoutStyles, componentProps } = useLayoutPropsUtil(props);\n const { className, max, style, children, ...rest } = componentProps;\n const childrenArr = Children.toArray(children);\n const inferredSize =\n (isValidElement(childrenArr[0]) && childrenArr[0].props.size) ?? \"medium\";\n const isOverflowing = max ? max < childrenArr.length : false;\n\n const overflowCount = max && childrenArr.length - max;\n\n const avatarGroupClassNames = cx(styles[\"avatar-group\"], className, {\n [styles[`${inferredSize}`]]: inferredSize,\n });\n\n const avatarBaseOverflowClassNames = cx(\n avatarBaseStyles[\"avatar-base-overflow\"],\n {\n [avatarBaseStyles[\"overflow-ten-plus\"]]:\n overflowCount && overflowCount > 9,\n },\n );\n\n const styleCombined = {\n ...style,\n ...layoutStyles,\n };\n return (\n <span\n ref={ref}\n className={avatarGroupClassNames}\n style={styleCombined}\n data-anv=\"avatar-group\"\n {...rest}\n >\n {childrenArr.map((child, i) => {\n let childEl = child;\n if (isValidElement(child)) {\n const nIndex = childrenArr.length - i;\n const nStyle: CSSProperties = {\n ...child.props.style,\n zIndex: nIndex,\n };\n childEl = cloneElement(child as ReactElement, {\n style: nStyle,\n });\n }\n\n if (!max) return childEl;\n if (i < max) return childEl;\n return null;\n })}\n {isOverflowing && max && (\n <AvatarBase\n className={avatarBaseOverflowClassNames}\n name={`+${overflowCount}`}\n initials={`+${overflowCount}`}\n size={inferredSize}\n />\n )}\n </span>\n );\n },\n);\n\nAvatarGroup.displayName = \"AvatarGroup\";\n","import { ComponentPropsWithoutRef, forwardRef, useMemo } from \"react\";\nimport { AvatarGroup } from \"../AvatarGroup\";\nimport { LayoutUtilProps } from \"../../../types\";\nimport { getInitial } from \"../../../internal/functions\";\n\nimport { useLayoutPropsUtil } from \"../../../internal/hooks\";\nimport { AvatarBase, AvatarBaseProps } from \"./AvatarBase\";\n\n/**\n * Props for the Avatar component\n * @property {string} name - Full name of the user. Used for alt text and screen reader announcements\n * @property {string} [color] - Custom color of the avatar. Should maintain sufficient contrast ratio for accessibility\n * @property {string} [image] - Image source to be used for avatar. Falls back to initials if image fails to load\n * @property {Extract<Size, \"small\" | \"medium\" | \"large\">} [size] - Size of the Avatar\n * @property {\"online\" | \"offline\"} [status] - Online status of the Avatar\n * @extends ComponentPropsWithoutRef<\"span\">\n * @extends Omit<AvatarBaseProps, \"initials\">\n * @extends Omit<LayoutUtilProps, \"flex\" | \"flexBasis\" | \"flexGrow\" | \"flexShrink\">\n */\nexport type AvatarProps = ComponentPropsWithoutRef<\"span\"> &\n Omit<AvatarBaseProps, \"initials\"> &\n Omit<LayoutUtilProps, \"flex\" | \"flexBasis\" | \"flexGrow\" | \"flexShrink\">;\n\nconst AvatarElement = forwardRef<HTMLSpanElement, AvatarProps>((props, ref) => {\n const { layoutStyles, componentProps } = useLayoutPropsUtil(props);\n const { name, style, ...rest } = componentProps;\n\n const styleWithLayout = useMemo(() => {\n return {\n ...layoutStyles,\n ...style,\n };\n }, [layoutStyles, style]);\n\n const initials = getInitial(name);\n\n return (\n <AvatarBase\n style={styleWithLayout}\n data-anv=\"avatar\"\n name={name}\n ref={ref}\n initials={rest.size === \"small\" ? initials?.[0] : initials}\n {...rest}\n />\n );\n});\n\nAvatarElement.displayName = \"Avatar\";\n\n/**\n * Avatar component for displaying user avatars with initials or images.\n *\n * Features:\n * - Displays user initials when no image is provided\n * - Supports custom colors and sizes\n * - Shows online/offline status\n * - Fully accessible with screen reader support\n * - Automatic image fallback handling\n * - Supports layout utilities for positioning and spacing\n *\n * @example\n * <Avatar\n * name=\"John Doe\"\n * image=\"https://example.com/avatar.jpg\"\n * size=\"medium\"\n * status=\"online\"\n * />\n */\nexport const Avatar = Object.assign(AvatarElement, {\n /**\n * AvatarGroup component for displaying multiple avatars in a group.\n *\n * Features:\n * - Displays multiple avatars in a stacked layout\n * - Handles overflow with a count indicator\n * - Maintains consistent sizing across all avatars\n * - Supports custom styling and layout\n * - Automatically adjusts z-index for proper stacking\n * - Fully accessible with screen reader support\n *\n * @example\n * <Avatar.Group max={3}>\n * <Avatar name=\"John Doe\" />\n * <Avatar name=\"Jane Smith\" />\n * <Avatar name=\"Bob Johnson\" />\n * <Avatar name=\"Alice Brown\" />\n * </Avatar.Group>\n */\n Group: AvatarGroup,\n});\n"],"names":["styles"],"mappings":";;;;;;;;;;AAeO,SAAS,WAAW,IAAA,EAAc;AACvC,EAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAElB,EAAA,MAAM,YAAY,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,OAAO,OAAO,CAAA;AAEhD,EAAA,IAAI,UAAU,MAAA,GAAS,CAAA;AACrB,IAAA,OAAO,GAAG,SAAA,CAAU,CAAC,CAAA,CAAE,CAAC,GAAG,WAAA,EAAa,CAAA,EAAG,SAAA,CACzC,UAAU,MAAA,GAAS,CACrB,EAAE,CAAC,CAAA,CAAE,aAAa,CAAA,CAAA;AAEpB,EAAA,IAAI,SAAA,CAAU,CAAC,CAAA,CAAE,CAAC,CAAA,EAAG;AACnB,IAAA,OAAO,CAAA,EAAG,SAAA,CAAU,CAAC,CAAA,CAAE,CAAC,CAAA,CAAE,WAAA,EAAa,CAAA,EAAG,UAAU,CAAC,CAAA,CAAE,CAAC,CAAA,CAAE,aAAa,CAAA,CAAA;AAAA,EACzE;AACA,EAAA,OAAO,GAAG,SAAA,CAAU,CAAC,EAAE,CAAC,CAAA,CAAE,aAAa,CAAA,CAAA;AACzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC0CO,MAAM,UAAA,GAAa,UAAA;AAAA,EACxB,CAAC,OAAO,GAAA,KAAQ;AACd,IAAA,MAAM;AAAA,MACJ,SAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA;AAAA,MACA,GAAG;AAAA,KACL,GAAI,KAAA;AAEJ,IAAA,MAAM,KAAA,GAAQ,OAAwB,IAAI,CAAA;AAC1C,IAAA,MAAM,MAAA,GAAS,OAAyB,IAAI,CAAA;AAC5C,IAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,SAAS,KAAK,CAAA;AAC5D,IAAA,MAAM,oBAAA,GAAuB,EAAA,CAAGA,gBAAA,CAAO,aAAa,GAAG,SAAA,EAAW;AAAA,MAChE,CAACA,gBAAA,CAAO,CAAA,EAAG,IAAI,CAAA,CAAE,CAAC,GAAG;AAAA,KACtB,CAAA;AACD,IAAA,MAAM,yBAAA,GAA4B,EAAA,CAAGA,gBAAA,CAAO,WAAW,CAAA,EAAG;AAAA,MACxD,CAACA,gBAAA,CAAO,SAAS,CAAC,GAAG,CAAC,UAAU,MAAA,KAAW,SAAA;AAAA,MAC3C,CAACA,gBAAA,CAAO,QAAQ,CAAC,GAAG,UAAU,MAAA,KAAW;AAAA,KAC1C,CAAA;AAED,IAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAU,GAAI,WAAW,oBAAoB,CAAA;AAC3D,IAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,qBAAA,EAAsB;AAChD,IAAA,MAAM,OAAO,SAAA,IAAa,OAAA;AAE1B,IAAA,MAAM,EAAE,UAAA,EAAY,UAAA,EAAY,QAAO,GAAI,kBAAA,CAAmB,OAAO,IAAI,CAAA;AAEzE,IAAA,MAAM,cAAA,GAAiB;AAAA,MACrB,kBAAkB,KAAA,IAAS,UAAA;AAAA,MAC3B,oBAAoB,KAAA,IAAS,UAAA;AAAA,MAC7B,sBAAsB,KAAA,IAAS,MAAA;AAAA,MAC/B,GAAG;AAAA,KACL;AAEA,IAAA,MAAM,0BAAA,GAA6B,QAAQ,MAAM;AAC/C,MAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,OAAO,UAAU,UAAU,CAAA,CAAE,QAAA,CAAS,EAAE,EAAE,WAAA,EAAY;AAAA,QACxD;AAAA,MACF;AACA,MAAA,OAAO,yBAAA;AAAA,IACT,CAAA,EAAG,CAAC,KAAA,EAAO,IAAA,EAAM,UAAU,CAAC,CAAA;AAE5B,IAAA,MAAM,qBAAA,GAAwB;AAAA,MAC5B,oBAAA,EAAsB;AAAA,KACxB;AAEA,IAAA,MAAM,YAAA,GAAe,MAAA;AACrB,IAAA,MAAM,MAAA,GAAS,CAAC,IAAA,EAAM,YAAY,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAG5D,IAAA,SAAA,CAAU,MAAM;AACd,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,kBAAA,CAAmB,KAAK,CAAA;AAAA,MAC1B;AAAA,IACF,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAIV,IAAA,SAAA,CAAU,MAAM;AACd,MAAA,IAAI,KAAA,IAAS,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,QAAQ,QAAA,EAAU;AACtD,QAAA,MAAM,GAAA,GAAM,IAAI,KAAA,EAAM;AACtB,QAAA,GAAA,CAAI,OAAA,GAAU,MAAM,kBAAA,CAAmB,IAAI,CAAA;AAC3C,QAAA,GAAA,CAAI,GAAA,GAAM,KAAA;AAAA,MACZ;AAAA,IACF,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,uBACE,IAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,oBAAA;AAAA,QACX,KAAA,EAAO,cAAA;AAAA,QACP,UAAA,EAAS,YAAA;AAAA,QACR,GAAG,IAAA;AAAA,QACJ,GAAA,EAAK,YAAA,CAAa,CAAC,KAAA,EAAO,GAAG,CAAC,CAAA;AAAA,QAE7B,QAAA,EAAA;AAAA,UAAA,KAAA,IAAS,CAAC,eAAA,mBACT,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAWA,iBAAO,KAAK,CAAA;AAAA,cACvB,aAAA,EAAW,IAAA;AAAA,cACX,GAAA,EAAK,KAAA;AAAA,cACL,GAAA,EAAK,IAAA;AAAA,cACL,OAAA,EAAS,MAAM,kBAAA,CAAmB,IAAI,CAAA;AAAA,cACtC,GAAA,EAAK;AAAA;AAAA,cAEL,QAAA,mBACF,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAWA,iBAAO,SAAS,CAAA,EAAG,aAAA,EAAW,IAAA,EAC5C,oBACH,CAAA,mBAEA,GAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAW,MAAC,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,UAGpB,MAAA,oBACC,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,aAAA,EAAW,IAAA;AAAA,cACX,SAAA,EAAW,yBAAA;AAAA,cACX,KAAA,EAAO;AAAA;AAAA,WACT;AAAA,0BAGF,GAAA,CAAC,UAAQ,QAAA,EAAA,MAAA,EAAO;AAAA;AAAA;AAAA,KAClB;AAAA,EAEJ;AACF,CAAA;AAEA,UAAA,CAAW,WAAA,GAAc,YAAA;;ACpIlB,MAAM,WAAA,GAAc,UAAA;AAAA,EACzB,CAAC,OAAO,GAAA,KAAQ;AACd,IAAA,MAAM,EAAE,YAAA,EAAc,cAAA,EAAe,GAAI,mBAAmB,KAAK,CAAA;AACjE,IAAA,MAAM,EAAE,SAAA,EAAW,GAAA,EAAK,OAAO,QAAA,EAAU,GAAG,MAAK,GAAI,cAAA;AACrD,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA;AAC7C,IAAA,MAAM,YAAA,GAAA,CACH,cAAA,CAAe,WAAA,CAAY,CAAC,CAAC,KAAK,WAAA,CAAY,CAAC,CAAA,CAAE,KAAA,CAAM,IAAA,KAAS,QAAA;AACnE,IAAA,MAAM,aAAA,GAAgB,GAAA,GAAM,GAAA,GAAM,WAAA,CAAY,MAAA,GAAS,KAAA;AAEvD,IAAA,MAAM,aAAA,GAAgB,GAAA,IAAO,WAAA,CAAY,MAAA,GAAS,GAAA;AAElD,IAAA,MAAM,qBAAA,GAAwB,EAAA,CAAG,MAAA,CAAO,cAAc,GAAG,SAAA,EAAW;AAAA,MAClE,CAAC,MAAA,CAAO,CAAA,EAAG,YAAY,CAAA,CAAE,CAAC,GAAG;AAAA,KAC9B,CAAA;AAED,IAAA,MAAM,4BAAA,GAA+B,EAAA;AAAA,MACnC,iBAAiB,sBAAsB,CAAA;AAAA,MACvC;AAAA,QACE,CAAC,gBAAA,CAAiB,mBAAmB,CAAC,GACpC,iBAAiB,aAAA,GAAgB;AAAA;AACrC,KACF;AAEA,IAAA,MAAM,aAAA,GAAgB;AAAA,MACpB,GAAG,KAAA;AAAA,MACH,GAAG;AAAA,KACL;AACA,IAAA,uBACE,IAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,qBAAA;AAAA,QACX,KAAA,EAAO,aAAA;AAAA,QACP,UAAA,EAAS,cAAA;AAAA,QACR,GAAG,IAAA;AAAA,QAEH,QAAA,EAAA;AAAA,UAAA,WAAA,CAAY,GAAA,CAAI,CAAC,KAAA,EAAO,CAAA,KAAM;AAC7B,YAAA,IAAI,OAAA,GAAU,KAAA;AACd,YAAA,IAAI,cAAA,CAAe,KAAK,CAAA,EAAG;AACzB,cAAA,MAAM,MAAA,GAAS,YAAY,MAAA,GAAS,CAAA;AACpC,cAAA,MAAM,MAAA,GAAwB;AAAA,gBAC5B,GAAG,MAAM,KAAA,CAAM,KAAA;AAAA,gBACf,MAAA,EAAQ;AAAA,eACV;AACA,cAAA,OAAA,GAAU,aAAa,KAAA,EAAuB;AAAA,gBAC5C,KAAA,EAAO;AAAA,eACR,CAAA;AAAA,YACH;AAEA,YAAA,IAAI,CAAC,KAAK,OAAO,OAAA;AACjB,YAAA,IAAI,CAAA,GAAI,KAAK,OAAO,OAAA;AACpB,YAAA,OAAO,IAAA;AAAA,UACT,CAAC,CAAA;AAAA,UACA,iBAAiB,GAAA,oBAChB,GAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,4BAAA;AAAA,cACX,IAAA,EAAM,IAAI,aAAa,CAAA,CAAA;AAAA,cACvB,QAAA,EAAU,IAAI,aAAa,CAAA,CAAA;AAAA,cAC3B,IAAA,EAAM;AAAA;AAAA;AACR;AAAA;AAAA,KAEJ;AAAA,EAEJ;AACF;AAEA,WAAA,CAAY,WAAA,GAAc,aAAA;;AC3F1B,MAAM,aAAA,GAAgB,UAAA,CAAyC,CAAC,KAAA,EAAO,GAAA,KAAQ;AAC7E,EAAA,MAAM,EAAE,YAAA,EAAc,cAAA,EAAe,GAAI,mBAAmB,KAAK,CAAA;AACjE,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAO,GAAG,MAAK,GAAI,cAAA;AAEjC,EAAA,MAAM,eAAA,GAAkB,QAAQ,MAAM;AACpC,IAAA,OAAO;AAAA,MACL,GAAG,YAAA;AAAA,MACH,GAAG;AAAA,KACL;AAAA,EACF,CAAA,EAAG,CAAC,YAAA,EAAc,KAAK,CAAC,CAAA;AAExB,EAAA,MAAM,QAAA,GAAW,WAAW,IAAI,CAAA;AAEhC,EAAA,uBACE,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,eAAA;AAAA,MACP,UAAA,EAAS,QAAA;AAAA,MACT,IAAA;AAAA,MACA,GAAA;AAAA,MACA,UAAU,IAAA,CAAK,IAAA,KAAS,OAAA,GAAU,QAAA,GAAW,CAAC,CAAA,GAAI,QAAA;AAAA,MACjD,GAAG;AAAA;AAAA,GACN;AAEJ,CAAC,CAAA;AAED,aAAA,CAAc,WAAA,GAAc,QAAA;AAqBrB,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,aAAA,EAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBjD,KAAA,EAAO;AACT,CAAC;;;;"}
package/dist/Avatar.js CHANGED
@@ -1,3 +1,3 @@
1
- export { A as Avatar, A as default } from './Avatar-CyGjhToG.js';
2
- export { A as AvatarGroup } from './Avatar-D07f9NH_.js';
1
+ export { A as Avatar, A as default } from './Avatar-3d5Kv2CF.js';
2
+ export { A as AvatarGroup } from './Avatar-DJ3oJNsv.js';
3
3
  //# sourceMappingURL=Avatar.js.map
@@ -9,8 +9,8 @@ import { c as cx } from './index-tZvMCc77.js';
9
9
  import { S as SrOnly } from './SrOnly-CTsYSuby.js';
10
10
  import { u as useSwipe } from './useSwipe-Cp-CJxLU.js';
11
11
  import { G as Grid } from './Grid-MGUC698u.js';
12
- import { S as SelectCard } from './SelectCard-DunNE9R3.js';
13
- import { u as useMergeRefs } from './useMergeRefs-Bde85AWI.js';
12
+ import { S as SelectCard } from './SelectCard-Ca07K1FW.js';
13
+ import { u as useMergeRefs } from './useMergeRefs-Dfmtq9cI.js';
14
14
  import { flushSync } from 'react-dom';
15
15
  import { u as useOptionallyControlledState } from './useOptionallyControlledState-DbDuos5L.js';
16
16
  import { u as usePrevious } from './usePrevious-Bvq-5auG.js';
@@ -8252,7 +8252,7 @@ function rangeUpdater(value, newDate, setValue, onSelection) {
8252
8252
 
8253
8253
  const CalendarNow = forwardRef(
8254
8254
  (props, ref) => {
8255
- const { onClick, ...rest } = props;
8255
+ const { onClick, onClickFixed, ...rest } = props;
8256
8256
  const {
8257
8257
  setFocusedDate,
8258
8258
  setSelectedMonth,
@@ -8271,7 +8271,8 @@ const CalendarNow = forwardRef(
8271
8271
  const nToday = DateTime.fromISO(DateTime.now().toISO(), {
8272
8272
  zone: defaultTimeZone
8273
8273
  }).startOf("day");
8274
- const onClickHandler = () => {
8274
+ const onClickHandler = (e) => {
8275
+ onClickFixed?.(e);
8275
8276
  setFocusedDate(nToday);
8276
8277
  setSelectedMonth(nToday.month);
8277
8278
  setSelectedYear(nToday.year);
@@ -10364,6 +10365,7 @@ const YearSelector = forwardRef(
10364
10365
  );
10365
10366
  YearSelector.displayName = "YearSelector";
10366
10367
 
10368
+ const toolbarFocusStates = ["month", "year", "next", "prev", "now"];
10367
10369
  const CalendarElement = forwardRef(
10368
10370
  (props, ref) => {
10369
10371
  const uid = useId();
@@ -10391,18 +10393,26 @@ const CalendarElement = forwardRef(
10391
10393
  range,
10392
10394
  className,
10393
10395
  _disableAutofocus,
10396
+ _disableFocus,
10394
10397
  ...remainingProps
10395
10398
  } = componentProps;
10396
10399
  const calendarRef = useRef(null);
10397
10400
  const combinedRef = useMergeRefs([ref, calendarRef]);
10398
10401
  const lastIValue = useRef(iValue);
10399
- const buttonsRef = useRef(void 0);
10400
10402
  const yearButtonRef = useRef(null);
10401
10403
  const monthButtonRef = useRef(null);
10404
+ const headerRef = useRef(null);
10405
+ const [toolbarFocus, setToolbarFocus] = useState(toolbarFocusStates[0]);
10402
10406
  const [calendarWidth, setCalendarWidth] = useState(
10403
10407
  void 0
10404
10408
  );
10405
10409
  const [calendarSelectionState, setCalendarSelectionState] = useState("day");
10410
+ const visibleHeaderButtons = useMemo(() => {
10411
+ if (calendarSelectionState !== "day") {
10412
+ return toolbarFocusStates.slice(0, 2);
10413
+ }
10414
+ return toolbarFocusStates;
10415
+ }, [calendarSelectionState]);
10406
10416
  useEffect(() => {
10407
10417
  if (!calendarRef.current || style?.width != null) return;
10408
10418
  const resizeObserver = new ResizeObserver((entries) => {
@@ -10567,41 +10577,45 @@ const CalendarElement = forwardRef(
10567
10577
  unavailableDates,
10568
10578
  unavailable,
10569
10579
  value,
10570
- startDay
10580
+ startDay,
10581
+ _disableAutofocus
10571
10582
  ]);
10572
- const updateHeaderButtons = useCallback(() => {
10573
- buttonsRef.current = calendarRef.current?.querySelectorAll(
10574
- "[data-calendar-header-button]"
10575
- );
10576
- }, []);
10577
- useEffect(() => {
10578
- updateHeaderButtons();
10579
- }, [updateHeaderButtons]);
10580
- const handleHeaderKeyDown = useCallback((e) => {
10581
- const target = e.target;
10582
- if (!buttonsRef.current || buttonsRef.current.length === 0) {
10583
- return;
10584
- }
10585
- const buttonArray = Array.from(buttonsRef.current);
10586
- const currentIndex = buttonArray.indexOf(target);
10587
- if (currentIndex === -1) return;
10588
- let newIndex;
10589
- switch (e.key) {
10590
- case "ArrowLeft":
10591
- e.preventDefault();
10592
- newIndex = currentIndex > 0 ? currentIndex - 1 : buttonArray.length - 1;
10593
- buttonArray[newIndex].focus();
10594
- break;
10595
- case "ArrowRight":
10596
- e.preventDefault();
10597
- newIndex = currentIndex < buttonArray.length - 1 ? currentIndex + 1 : 0;
10598
- buttonArray[newIndex].focus();
10599
- break;
10600
- }
10601
- }, []);
10583
+ const handleHeaderKeyDown = useCallback(
10584
+ (e) => {
10585
+ switch (e.key) {
10586
+ case "ArrowLeft":
10587
+ e.preventDefault();
10588
+ setToolbarFocus((previousToolbarFocus) => {
10589
+ const newToolbarFocus = previousToolbarFocus === visibleHeaderButtons[0] ? visibleHeaderButtons[visibleHeaderButtons.length - 1] : visibleHeaderButtons[visibleHeaderButtons.indexOf(previousToolbarFocus) - 1] ?? visibleHeaderButtons[visibleHeaderButtons.length - 1];
10590
+ const button = headerRef.current?.querySelector(
10591
+ `[data-calendar-header-button-name="${newToolbarFocus}"]`
10592
+ );
10593
+ if (button && "focus" in button && typeof button.focus === "function") {
10594
+ button.focus();
10595
+ }
10596
+ return newToolbarFocus;
10597
+ });
10598
+ break;
10599
+ case "ArrowRight":
10600
+ e.preventDefault();
10601
+ setToolbarFocus((previousToolbarFocus) => {
10602
+ const newToolbarFocus = previousToolbarFocus === visibleHeaderButtons[visibleHeaderButtons.length - 1] ? visibleHeaderButtons[0] : visibleHeaderButtons[visibleHeaderButtons.indexOf(previousToolbarFocus) + 1] ?? visibleHeaderButtons[0];
10603
+ const button = headerRef.current?.querySelector(
10604
+ `[data-calendar-header-button-name="${newToolbarFocus}"]`
10605
+ );
10606
+ if (button && "focus" in button && typeof button.focus === "function") {
10607
+ button.focus();
10608
+ }
10609
+ return newToolbarFocus;
10610
+ });
10611
+ }
10612
+ },
10613
+ [visibleHeaderButtons]
10614
+ );
10602
10615
  const handleMonthSelection = useCallback(
10603
10616
  (month) => {
10604
10617
  monthButtonRef.current?.focus();
10618
+ setToolbarFocus(toolbarFocusStates[0]);
10605
10619
  setSelectedMonth(month);
10606
10620
  setFocusedDate(
10607
10621
  DateTime.fromObject({
@@ -10612,12 +10626,14 @@ const CalendarElement = forwardRef(
10612
10626
  );
10613
10627
  setCalendarSelectionState("day");
10614
10628
  },
10629
+ // eslint-disable-next-line react-hooks/exhaustive-deps
10615
10630
  [focusedDate]
10616
10631
  );
10617
10632
  const handleYearSelection = useCallback(
10618
10633
  (year) => {
10619
10634
  if (year === null) return;
10620
10635
  yearButtonRef.current?.focus();
10636
+ setToolbarFocus(toolbarFocusStates[1]);
10621
10637
  setSelectedYear(year);
10622
10638
  setFocusedDate(
10623
10639
  DateTime.fromObject({
@@ -10628,7 +10644,8 @@ const CalendarElement = forwardRef(
10628
10644
  );
10629
10645
  setCalendarSelectionState("day");
10630
10646
  },
10631
- [defaultTimeZone, focusedDate?.month]
10647
+ // eslint-disable-next-line react-hooks/exhaustive-deps
10648
+ [focusedDate?.month]
10632
10649
  );
10633
10650
  return /* @__PURE__ */ jsx(CalendarContext.Provider, { value: providerValue, children: /* @__PURE__ */ jsxs(
10634
10651
  "div",
@@ -10643,6 +10660,7 @@ const CalendarElement = forwardRef(
10643
10660
  /* @__PURE__ */ jsx("div", { className: styles$1["header"], children: /* @__PURE__ */ jsxs(
10644
10661
  "span",
10645
10662
  {
10663
+ ref: headerRef,
10646
10664
  "aria-label": "Calendar navigation",
10647
10665
  role: "toolbar",
10648
10666
  onKeyDown: handleHeaderKeyDown,
@@ -10652,29 +10670,62 @@ const CalendarElement = forwardRef(
10652
10670
  CalendarMonthButton,
10653
10671
  {
10654
10672
  ref: monthButtonRef,
10673
+ tabIndex: _disableFocus ? -1 : toolbarFocus === toolbarFocusStates[0] ? 0 : -1,
10655
10674
  "data-calendar-header-button": true,
10675
+ "data-calendar-header-button-name": toolbarFocusStates[0],
10656
10676
  calendarSelectionState,
10657
- onClick: () => setCalendarSelectionState(
10658
- (prev) => prev === "month" ? "day" : "month"
10659
- )
10677
+ onClick: () => {
10678
+ setCalendarSelectionState(
10679
+ (prev) => prev === "month" ? "day" : "month"
10680
+ );
10681
+ setToolbarFocus(toolbarFocusStates[0]);
10682
+ }
10660
10683
  }
10661
10684
  ),
10662
10685
  /* @__PURE__ */ jsx(
10663
10686
  CalendarYearButton,
10664
10687
  {
10665
10688
  ref: yearButtonRef,
10666
- tabIndex: -1,
10689
+ tabIndex: _disableFocus ? -1 : toolbarFocus === toolbarFocusStates[1] ? 0 : -1,
10667
10690
  "data-calendar-header-button": true,
10691
+ "data-calendar-header-button-name": toolbarFocusStates[1],
10668
10692
  calendarSelectionState,
10669
- onClick: () => setCalendarSelectionState(
10670
- (prev) => prev === "year" ? "day" : "year"
10671
- )
10693
+ onClick: () => {
10694
+ setCalendarSelectionState(
10695
+ (prev) => prev === "year" ? "day" : "year"
10696
+ );
10697
+ setToolbarFocus(toolbarFocusStates[1]);
10698
+ }
10672
10699
  }
10673
10700
  ),
10674
10701
  calendarSelectionState === "day" && /* @__PURE__ */ jsxs(Fragment, { children: [
10675
- /* @__PURE__ */ jsx(CalendarPrev, { tabIndex: -1, "data-calendar-header-button": true }),
10676
- /* @__PURE__ */ jsx(CalendarNext, { tabIndex: -1, "data-calendar-header-button": true }),
10677
- /* @__PURE__ */ jsx(CalendarNow, { tabIndex: -1, "data-calendar-header-button": true })
10702
+ /* @__PURE__ */ jsx(
10703
+ CalendarPrev,
10704
+ {
10705
+ tabIndex: _disableFocus ? -1 : toolbarFocus === toolbarFocusStates[2] ? 0 : -1,
10706
+ "data-calendar-header-button": true,
10707
+ "data-calendar-header-button-name": toolbarFocusStates[2],
10708
+ onClick: () => setToolbarFocus(toolbarFocusStates[2])
10709
+ }
10710
+ ),
10711
+ /* @__PURE__ */ jsx(
10712
+ CalendarNext,
10713
+ {
10714
+ tabIndex: _disableFocus ? -1 : toolbarFocus === toolbarFocusStates[3] ? 0 : -1,
10715
+ "data-calendar-header-button": true,
10716
+ "data-calendar-header-button-name": toolbarFocusStates[3],
10717
+ onClick: () => setToolbarFocus(toolbarFocusStates[3])
10718
+ }
10719
+ ),
10720
+ /* @__PURE__ */ jsx(
10721
+ CalendarNow,
10722
+ {
10723
+ tabIndex: _disableFocus ? -1 : toolbarFocus === toolbarFocusStates[4] ? 0 : -1,
10724
+ "data-calendar-header-button": true,
10725
+ "data-calendar-header-button-name": toolbarFocusStates[4],
10726
+ onClickFixed: () => setToolbarFocus(toolbarFocusStates[4])
10727
+ }
10728
+ )
10678
10729
  ] })
10679
10730
  ]
10680
10731
  }
@@ -10781,4 +10832,4 @@ const Calendar = Object.assign(CalendarElement, {
10781
10832
  });
10782
10833
 
10783
10834
  export { Calendar as C, DateTime as D, CalendarNow as a, CalendarYearButton as b, CalendarPrev as c, CalendarNext as d, CalendarMonthButton as e, CalendarMonth as f, isValidDate as i, toDateString as t };
10784
- //# sourceMappingURL=Calendar-X9qUi6Vx.js.map
10835
+ //# sourceMappingURL=Calendar-Cn0fOgog.js.map