@chayns-ui/core 0.9.4 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/dist/accordion.css +3 -1
  2. package/dist/badge.css +28 -3
  3. package/dist/banner.css +2 -0
  4. package/dist/breadcrumb.css +63 -0
  5. package/dist/button.css +103 -35
  6. package/dist/card.css +39 -0
  7. package/dist/checkbox.css +3 -3
  8. package/dist/combo-box.css +2 -0
  9. package/dist/components/accordion/Accordion.d.ts +3 -4
  10. package/dist/components/accordion/Accordion.d.ts.map +1 -1
  11. package/dist/components/accordion/Accordion.js +37 -23
  12. package/dist/components/accordion/Accordion.js.map +1 -1
  13. package/dist/components/accordion/Accordion.types.d.ts +7 -2
  14. package/dist/components/accordion/Accordion.types.d.ts.map +1 -1
  15. package/dist/components/accordion/Accordion.types.js +7 -1
  16. package/dist/components/accordion/Accordion.types.js.map +1 -1
  17. package/dist/components/accordion-group/AccordionGroup.d.ts.map +1 -1
  18. package/dist/components/accordion-group/AccordionGroup.js +1 -0
  19. package/dist/components/accordion-group/AccordionGroup.js.map +1 -1
  20. package/dist/components/avatar/Avatar.d.ts.map +1 -1
  21. package/dist/components/avatar/Avatar.js +1 -0
  22. package/dist/components/avatar/Avatar.js.map +1 -1
  23. package/dist/components/avatar/Avatar.types.d.ts +9 -1
  24. package/dist/components/avatar/Avatar.types.d.ts.map +1 -1
  25. package/dist/components/avatar/Avatar.types.js +17 -0
  26. package/dist/components/avatar/Avatar.types.js.map +1 -0
  27. package/dist/components/avatar-group/AvatarGroup.d.ts.map +1 -1
  28. package/dist/components/avatar-group/AvatarGroup.js +4 -3
  29. package/dist/components/avatar-group/AvatarGroup.js.map +1 -1
  30. package/dist/components/badge/Badge.d.ts.map +1 -1
  31. package/dist/components/badge/Badge.js +1 -0
  32. package/dist/components/badge/Badge.js.map +1 -1
  33. package/dist/components/badge/Badge.types.d.ts +13 -0
  34. package/dist/components/badge/Badge.types.d.ts.map +1 -1
  35. package/dist/components/badge/Badge.types.js +16 -1
  36. package/dist/components/badge/Badge.types.js.map +1 -1
  37. package/dist/components/banner/Banner.d.ts.map +1 -1
  38. package/dist/components/banner/Banner.js +1 -0
  39. package/dist/components/banner/Banner.js.map +1 -1
  40. package/dist/components/banner/Banner.types.d.ts +7 -0
  41. package/dist/components/banner/Banner.types.d.ts.map +1 -1
  42. package/dist/components/banner/Banner.types.js +9 -1
  43. package/dist/components/banner/Banner.types.js.map +1 -1
  44. package/dist/components/breadcrumb/Breadcrumb.d.ts +4 -0
  45. package/dist/components/breadcrumb/Breadcrumb.d.ts.map +1 -0
  46. package/dist/components/breadcrumb/Breadcrumb.js +35 -0
  47. package/dist/components/breadcrumb/Breadcrumb.js.map +1 -0
  48. package/dist/components/breadcrumb/Breadcrumb.types.d.ts +13 -0
  49. package/dist/components/breadcrumb/Breadcrumb.types.d.ts.map +1 -0
  50. package/dist/components/button/Button.d.ts.map +1 -1
  51. package/dist/components/button/Button.js +1 -0
  52. package/dist/components/button/Button.js.map +1 -1
  53. package/dist/components/button/Button.types.d.ts +7 -0
  54. package/dist/components/button/Button.types.d.ts.map +1 -1
  55. package/dist/components/button/Button.types.js +9 -1
  56. package/dist/components/button/Button.types.js.map +1 -1
  57. package/dist/components/button/button-icon/ButtonIcon.d.ts.map +1 -1
  58. package/dist/components/button/button-icon/ButtonIcon.js +7 -3
  59. package/dist/components/button/button-icon/ButtonIcon.js.map +1 -1
  60. package/dist/components/card/Card.d.ts.map +1 -1
  61. package/dist/components/card/Card.js +2 -0
  62. package/dist/components/card/Card.js.map +1 -1
  63. package/dist/components/checkbox/Checkbox.d.ts.map +1 -1
  64. package/dist/components/checkbox/Checkbox.js +1 -0
  65. package/dist/components/checkbox/Checkbox.js.map +1 -1
  66. package/dist/components/combo-box/ComboBox.d.ts.map +1 -1
  67. package/dist/components/combo-box/ComboBox.js +27 -8
  68. package/dist/components/combo-box/ComboBox.js.map +1 -1
  69. package/dist/components/date-time-picker/DateTimePicker.d.ts.map +1 -1
  70. package/dist/components/date-time-picker/DateTimePicker.js +31 -239
  71. package/dist/components/date-time-picker/DateTimePicker.js.map +1 -1
  72. package/dist/components/date-time-picker/DateTimePicker.types.d.ts +12 -0
  73. package/dist/components/date-time-picker/DateTimePicker.types.d.ts.map +1 -1
  74. package/dist/components/date-time-picker/DateTimePicker.types.js +15 -1
  75. package/dist/components/date-time-picker/DateTimePicker.types.js.map +1 -1
  76. package/dist/components/date-time-picker/date-time-picker-utils.d.ts +4 -0
  77. package/dist/components/date-time-picker/date-time-picker-utils.d.ts.map +1 -0
  78. package/dist/components/date-time-picker/date-time-picker-utils.js +19 -0
  79. package/dist/components/date-time-picker/date-time-picker-utils.js.map +1 -0
  80. package/dist/components/date-time-picker/hooks/useDateTimePickerValue.d.ts +37 -0
  81. package/dist/components/date-time-picker/hooks/useDateTimePickerValue.d.ts.map +1 -0
  82. package/dist/components/date-time-picker/hooks/useDateTimePickerValue.js +156 -0
  83. package/dist/components/date-time-picker/hooks/useDateTimePickerValue.js.map +1 -0
  84. package/dist/components/date-time-picker/sizer/PickerSizer.d.ts +7 -0
  85. package/dist/components/date-time-picker/sizer/PickerSizer.d.ts.map +1 -0
  86. package/dist/components/date-time-picker/sizer/PickerSizer.js +15 -0
  87. package/dist/components/date-time-picker/sizer/PickerSizer.js.map +1 -0
  88. package/dist/components/date-time-picker/wheel/Wheel.d.ts +14 -0
  89. package/dist/components/date-time-picker/wheel/Wheel.d.ts.map +1 -0
  90. package/dist/components/date-time-picker/wheel/Wheel.js +136 -0
  91. package/dist/components/date-time-picker/wheel/Wheel.js.map +1 -0
  92. package/dist/components/icon-button/IconButton.d.ts.map +1 -1
  93. package/dist/components/icon-button/IconButton.js +1 -0
  94. package/dist/components/icon-button/IconButton.js.map +1 -1
  95. package/dist/components/list/List.d.ts +15 -10
  96. package/dist/components/list/List.d.ts.map +1 -1
  97. package/dist/components/list/List.js +19 -7
  98. package/dist/components/list/List.js.map +1 -1
  99. package/dist/components/list/List.types.d.ts +2 -2
  100. package/dist/components/list/List.types.d.ts.map +1 -1
  101. package/dist/components/pagination/Pagination.d.ts +4 -0
  102. package/dist/components/pagination/Pagination.d.ts.map +1 -0
  103. package/dist/components/pagination/Pagination.js +57 -0
  104. package/dist/components/pagination/Pagination.js.map +1 -0
  105. package/dist/components/pagination/Pagination.types.d.ts +15 -0
  106. package/dist/components/pagination/Pagination.types.d.ts.map +1 -0
  107. package/dist/components/pagination/pagination-pages.d.ts +2 -0
  108. package/dist/components/pagination/pagination-pages.d.ts.map +1 -0
  109. package/dist/components/pagination/pagination-pages.js +35 -0
  110. package/dist/components/pagination/pagination-pages.js.map +1 -0
  111. package/dist/components/popup/Popup.d.ts +4 -1
  112. package/dist/components/popup/Popup.d.ts.map +1 -1
  113. package/dist/components/popup/Popup.js +25 -18
  114. package/dist/components/popup/Popup.js.map +1 -1
  115. package/dist/components/popup/PopupList.d.ts +4 -1
  116. package/dist/components/popup/PopupList.d.ts.map +1 -1
  117. package/dist/components/popup/PopupList.js +7 -1
  118. package/dist/components/popup/PopupList.js.map +1 -1
  119. package/dist/components/progress/Progress.d.ts.map +1 -1
  120. package/dist/components/progress/Progress.js +1 -0
  121. package/dist/components/progress/Progress.js.map +1 -1
  122. package/dist/components/progress/Progress.types.d.ts +1 -1
  123. package/dist/components/progress/Progress.types.d.ts.map +1 -1
  124. package/dist/components/radio-group/RadioGroup.d.ts.map +1 -1
  125. package/dist/components/radio-group/RadioGroup.js +2 -0
  126. package/dist/components/radio-group/RadioGroup.js.map +1 -1
  127. package/dist/components/segmented-control/SegmentedControl.d.ts.map +1 -1
  128. package/dist/components/segmented-control/SegmentedControl.js +78 -25
  129. package/dist/components/segmented-control/SegmentedControl.js.map +1 -1
  130. package/dist/components/segmented-control/SegmentedControl.types.d.ts +1 -1
  131. package/dist/components/segmented-control/SegmentedControl.types.d.ts.map +1 -1
  132. package/dist/components/segmented-control/SegmentedControlContext.d.ts +2 -0
  133. package/dist/components/segmented-control/SegmentedControlContext.d.ts.map +1 -1
  134. package/dist/components/segmented-control/SegmentedControlContext.js.map +1 -1
  135. package/dist/components/skeleton/Skeleton.d.ts.map +1 -1
  136. package/dist/components/skeleton/Skeleton.js +1 -0
  137. package/dist/components/skeleton/Skeleton.js.map +1 -1
  138. package/dist/components/skeleton/Skeleton.types.d.ts +6 -0
  139. package/dist/components/skeleton/Skeleton.types.d.ts.map +1 -1
  140. package/dist/components/skeleton/Skeleton.types.js +8 -1
  141. package/dist/components/skeleton/Skeleton.types.js.map +1 -1
  142. package/dist/components/slider/Slider.d.ts +4 -0
  143. package/dist/components/slider/Slider.d.ts.map +1 -0
  144. package/dist/components/slider/Slider.js +61 -0
  145. package/dist/components/slider/Slider.js.map +1 -0
  146. package/dist/components/slider/Slider.types.d.ts +10 -0
  147. package/dist/components/slider/Slider.types.d.ts.map +1 -0
  148. package/dist/components/spinner/Spinner.d.ts.map +1 -1
  149. package/dist/components/spinner/Spinner.js +1 -0
  150. package/dist/components/spinner/Spinner.js.map +1 -1
  151. package/dist/components/split-button/SplitButton.d.ts.map +1 -1
  152. package/dist/components/split-button/SplitButton.js +2 -1
  153. package/dist/components/split-button/SplitButton.js.map +1 -1
  154. package/dist/components/stepper/Stepper.d.ts +4 -0
  155. package/dist/components/stepper/Stepper.d.ts.map +1 -0
  156. package/dist/components/stepper/Stepper.js +60 -0
  157. package/dist/components/stepper/Stepper.js.map +1 -0
  158. package/dist/components/stepper/Stepper.types.d.ts +27 -0
  159. package/dist/components/stepper/Stepper.types.d.ts.map +1 -0
  160. package/dist/components/stepper/Stepper.types.js +25 -0
  161. package/dist/components/stepper/Stepper.types.js.map +1 -0
  162. package/dist/components/stepper/stepper-values.d.ts +6 -0
  163. package/dist/components/stepper/stepper-values.d.ts.map +1 -0
  164. package/dist/components/stepper/stepper-values.js +26 -0
  165. package/dist/components/stepper/stepper-values.js.map +1 -0
  166. package/dist/components/switch/Switch.d.ts.map +1 -1
  167. package/dist/components/switch/Switch.js +1 -0
  168. package/dist/components/switch/Switch.js.map +1 -1
  169. package/dist/components/text-area/TextArea.d.ts.map +1 -1
  170. package/dist/components/text-area/TextArea.js +1 -0
  171. package/dist/components/text-area/TextArea.js.map +1 -1
  172. package/dist/components/text-field/TextField.d.ts.map +1 -1
  173. package/dist/components/text-field/TextField.js +1 -0
  174. package/dist/components/text-field/TextField.js.map +1 -1
  175. package/dist/components/tooltip/Tooltip.d.ts +4 -0
  176. package/dist/components/tooltip/Tooltip.d.ts.map +1 -0
  177. package/dist/components/tooltip/Tooltip.js +75 -0
  178. package/dist/components/tooltip/Tooltip.js.map +1 -0
  179. package/dist/components/tooltip/Tooltip.types.d.ts +12 -0
  180. package/dist/components/tooltip/Tooltip.types.d.ts.map +1 -0
  181. package/dist/components/tooltip/hooks/useTooltipInteraction.d.ts +11 -0
  182. package/dist/components/tooltip/hooks/useTooltipInteraction.d.ts.map +1 -0
  183. package/dist/components/tooltip/hooks/useTooltipInteraction.js +59 -0
  184. package/dist/components/tooltip/hooks/useTooltipInteraction.js.map +1 -0
  185. package/dist/components/tooltip/tooltip-trigger-props.d.ts +4 -0
  186. package/dist/components/tooltip/tooltip-trigger-props.d.ts.map +1 -0
  187. package/dist/components/tooltip/tooltip-trigger-props.js +25 -0
  188. package/dist/components/tooltip/tooltip-trigger-props.js.map +1 -0
  189. package/dist/date-time-picker.css +33 -2
  190. package/dist/hooks/useOverlayPosition.d.ts +4 -0
  191. package/dist/hooks/useOverlayPosition.d.ts.map +1 -0
  192. package/dist/hooks/useOverlayPosition.js +60 -0
  193. package/dist/hooks/useOverlayPosition.js.map +1 -0
  194. package/dist/index.d.ts +21 -7
  195. package/dist/index.d.ts.map +1 -1
  196. package/dist/index.js +14 -7
  197. package/dist/pagination.css +54 -0
  198. package/dist/popup.css +4 -0
  199. package/dist/progress.css +1 -1
  200. package/dist/segmented-control.css +2 -0
  201. package/dist/slider.css +109 -0
  202. package/dist/split-button.css +2 -79
  203. package/dist/stepper.css +77 -0
  204. package/dist/styles.css +5 -0
  205. package/dist/tooltip.css +68 -0
  206. package/dist/utils/native-ref.d.ts +4 -0
  207. package/dist/utils/native-ref.d.ts.map +1 -0
  208. package/dist/utils/native-ref.js +24 -0
  209. package/dist/utils/native-ref.js.map +1 -0
  210. package/package.json +7 -2
@@ -1 +1 @@
1
- {"version":3,"file":"IconButton.d.ts","sourceRoot":"","sources":["../../../src/components/icon-button/IconButton.tsx"],"names":[],"mappings":"AAKA,QAAA,MAAM,UAAU;;;;;;8DAkCd,CAAC;AAEH,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"IconButton.d.ts","sourceRoot":"","sources":["../../../src/components/icon-button/IconButton.tsx"],"names":[],"mappings":"AAKA,QAAA,MAAM,UAAU;;;;;;8DAkCd,CAAC;AAIH,eAAe,UAAU,CAAC"}
@@ -19,6 +19,7 @@ var IconButton = forwardRef(function IconButton({ "aria-busy": ariaBusy, classNa
19
19
  children: /* @__PURE__ */ jsx(ButtonIcon, { icon: loading ? "fa-spinner" : icon })
20
20
  });
21
21
  });
22
+ IconButton.displayName = "IconButton";
22
23
  //#endregion
23
24
  export { IconButton as default };
24
25
 
@@ -1 +1 @@
1
- {"version":3,"file":"IconButton.js","names":[],"sources":["../../../src/components/icon-button/IconButton.tsx"],"sourcesContent":["import { forwardRef } from 'react';\n\nimport type { IconButtonProps } from './IconButton.types.js';\nimport ButtonIcon from '../button/button-icon/ButtonIcon.js';\n\nconst IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(function IconButton(\n {\n 'aria-busy': ariaBusy,\n className,\n disabled,\n icon,\n loading = false,\n type = 'button',\n variant,\n ...buttonProps\n },\n ref,\n) {\n const resolvedClassName = [\n 'chayns-icon-button',\n `chayns-icon-button--${variant}`,\n loading ? 'chayns-icon-button--loading' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button\n {...buttonProps}\n aria-busy={loading ? true : ariaBusy}\n className={resolvedClassName}\n disabled={loading || disabled}\n ref={ref}\n type={type}\n >\n <ButtonIcon icon={loading ? 'fa-spinner' : icon} />\n </button>\n );\n});\n\nexport default IconButton;\n"],"mappings":";;;;AAKA,IAAM,aAAa,WAA+C,SAAS,WACzE,EACE,aAAa,UACb,WACA,UACA,MACA,UAAU,OACV,OAAO,UACP,SACA,GAAG,eAEL,KACA;CACA,MAAM,oBAAoB;EACxB;EACA,uBAAuB;EACvB,UAAU,gCAAgC;EAC1C;CACF,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;CAEX,OACE,oBAAC,UAAD;EACE,GAAI;EACJ,aAAW,UAAU,OAAO;EAC5B,WAAW;EACX,UAAU,WAAW;EAChB;EACC;EAEN,UAAA,oBAAC,YAAD,EAAY,MAAM,UAAU,eAAe,KAAO,CAAA;CAC5C,CAAA;AAEZ,CAAC"}
1
+ {"version":3,"file":"IconButton.js","names":[],"sources":["../../../src/components/icon-button/IconButton.tsx"],"sourcesContent":["import { forwardRef } from 'react';\n\nimport type { IconButtonProps } from './IconButton.types.js';\nimport ButtonIcon from '../button/button-icon/ButtonIcon.js';\n\nconst IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(function IconButton(\n {\n 'aria-busy': ariaBusy,\n className,\n disabled,\n icon,\n loading = false,\n type = 'button',\n variant,\n ...buttonProps\n },\n ref,\n) {\n const resolvedClassName = [\n 'chayns-icon-button',\n `chayns-icon-button--${variant}`,\n loading ? 'chayns-icon-button--loading' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button\n {...buttonProps}\n aria-busy={loading ? true : ariaBusy}\n className={resolvedClassName}\n disabled={loading || disabled}\n ref={ref}\n type={type}\n >\n <ButtonIcon icon={loading ? 'fa-spinner' : icon} />\n </button>\n );\n});\n\nIconButton.displayName = 'IconButton';\n\nexport default IconButton;\n"],"mappings":";;;;AAKA,IAAM,aAAa,WAA+C,SAAS,WACzE,EACE,aAAa,UACb,WACA,UACA,MACA,UAAU,OACV,OAAO,UACP,SACA,GAAG,eAEL,KACA;CACA,MAAM,oBAAoB;EACxB;EACA,uBAAuB;EACvB,UAAU,gCAAgC;EAC1C;CACF,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;CAEX,OACE,oBAAC,UAAD;EACE,GAAI;EACJ,aAAW,UAAU,OAAO;EAC5B,WAAW;EACX,UAAU,WAAW;EAChB;EACC;EAEN,UAAA,oBAAC,YAAD,EAAY,MAAM,UAAU,eAAe,KAAO,CAAA;CAC5C,CAAA;AAEZ,CAAC;AAED,WAAW,cAAc"}
@@ -1,15 +1,20 @@
1
- import type { ListItemActionProps, ListItemPartProps, ListItemStatusProps } from './List.types.js';
2
- declare function Action(props: ListItemActionProps): import("react").JSX.Element;
3
- declare function Status({ label }: ListItemStatusProps): import("react").JSX.Element;
1
+ import type { ListItemPartProps, ListItemStatusProps } from './List.types.js';
4
2
  declare const List: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLUListElement>, HTMLUListElement>, "ref"> & import("react").RefAttributes<HTMLUListElement>> & {
5
3
  Item: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").LiHTMLAttributes<HTMLLIElement>, HTMLLIElement>, "ref"> & import("react").RefAttributes<HTMLLIElement>> & {
6
- Action: typeof Action;
7
- Body: ({ children, className: consumerClassName }: ListItemPartProps) => import("react").JSX.Element;
8
- Description: ({ children, className: consumerClassName }: ListItemPartProps) => import("react").JSX.Element;
9
- Leading: ({ children, className: consumerClassName }: ListItemPartProps) => import("react").JSX.Element;
10
- Status: typeof Status;
11
- Title: ({ children, className: consumerClassName }: ListItemPartProps) => import("react").JSX.Element;
12
- Trailing: ({ children, className: consumerClassName }: ListItemPartProps) => import("react").JSX.Element;
4
+ Action: import("react").ForwardRefExoticComponent<(Omit<Omit<import("react").DetailedHTMLProps<import("react").AnchorHTMLAttributes<HTMLAnchorElement>, HTMLAnchorElement>, "children"> & {
5
+ children: import("react").ReactNode;
6
+ href: string;
7
+ }, "ref"> | Omit<Omit<import("react").DetailedHTMLProps<import("react").ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "children" | "type"> & {
8
+ children: import("react").ReactNode;
9
+ href?: never;
10
+ type?: never;
11
+ }, "ref">) & import("react").RefAttributes<HTMLButtonElement | HTMLAnchorElement>>;
12
+ Body: import("react").ForwardRefExoticComponent<Omit<ListItemPartProps, "ref"> & import("react").RefAttributes<HTMLSpanElement>>;
13
+ Description: import("react").ForwardRefExoticComponent<Omit<ListItemPartProps, "ref"> & import("react").RefAttributes<HTMLSpanElement>>;
14
+ Leading: import("react").ForwardRefExoticComponent<Omit<ListItemPartProps, "ref"> & import("react").RefAttributes<HTMLSpanElement>>;
15
+ Status: import("react").ForwardRefExoticComponent<Omit<ListItemStatusProps, "ref"> & import("react").RefAttributes<HTMLSpanElement>>;
16
+ Title: import("react").ForwardRefExoticComponent<Omit<ListItemPartProps, "ref"> & import("react").RefAttributes<HTMLSpanElement>>;
17
+ Trailing: import("react").ForwardRefExoticComponent<Omit<ListItemPartProps, "ref"> & import("react").RefAttributes<HTMLSpanElement>>;
13
18
  };
14
19
  };
15
20
  export default List;
@@ -1 +1 @@
1
- {"version":3,"file":"List.d.ts","sourceRoot":"","sources":["../../../src/components/list/List.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,mBAAmB,EACnB,iBAAiB,EAEjB,mBAAmB,EAEpB,MAAM,iBAAiB,CAAC;AAkBzB,iBAAS,MAAM,CAAC,KAAK,EAAE,mBAAmB,+BAsBzC;AAaD,iBAAS,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,mBAAmB,+BAS7C;AAiBD,QAAA,MAAM,IAAI;;;2DAlCiE,iBAAiB;kEAAjB,iBAAiB;8DAAjB,iBAAiB;;4DAAjB,iBAAiB;+DAAjB,iBAAiB;;CA4C1F,CAAC;AAEH,eAAe,IAAI,CAAC"}
1
+ {"version":3,"file":"List.d.ts","sourceRoot":"","sources":["../../../src/components/list/List.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEV,iBAAiB,EAEjB,mBAAmB,EAEpB,MAAM,iBAAiB,CAAC;AA4GzB,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;;;CAUR,CAAC;AAOH,eAAe,IAAI,CAAC"}
@@ -15,7 +15,7 @@ var Item = forwardRef(function Item({ children, className, ...itemProps }, ref)
15
15
  })
16
16
  });
17
17
  });
18
- function Action(props) {
18
+ var Action = forwardRef(function Action(props, ref) {
19
19
  useListItemContext("Action");
20
20
  if (props.href !== void 0) {
21
21
  const { children, className, href, ...anchorProps } = props;
@@ -24,6 +24,7 @@ function Action(props) {
24
24
  ...anchorProps,
25
25
  className: resolvedClassName,
26
26
  href,
27
+ ref,
27
28
  children
28
29
  });
29
30
  }
@@ -32,25 +33,32 @@ function Action(props) {
32
33
  return /* @__PURE__ */ jsx("button", {
33
34
  ...buttonProps,
34
35
  className: resolvedClassName,
36
+ ref,
35
37
  type: "button",
36
38
  children
37
39
  });
38
- }
40
+ });
39
41
  function createPart(name) {
40
42
  const className = `chayns-list-item__${name.toLowerCase()}`;
41
- return function ListItemPart({ children, className: consumerClassName }) {
43
+ const ListItemPart = forwardRef(function ListItemPart({ children, className: consumerClassName, ...spanProps }, ref) {
42
44
  useListItemContext(name);
43
45
  const resolvedClassName = [className, consumerClassName].filter(Boolean).join(" ");
44
46
  return /* @__PURE__ */ jsx("span", {
47
+ ...spanProps,
45
48
  className: resolvedClassName,
49
+ ref,
46
50
  children
47
51
  });
48
- };
52
+ });
53
+ ListItemPart.displayName = `List.Item.${name}`;
54
+ return ListItemPart;
49
55
  }
50
- function Status({ label }) {
56
+ var Status = forwardRef(function Status({ label, className, ...spanProps }, ref) {
51
57
  useListItemContext("Status");
52
58
  return /* @__PURE__ */ jsxs("span", {
53
- className: "chayns-list-item__status",
59
+ ...spanProps,
60
+ className: ["chayns-list-item__status", className].filter(Boolean).join(" "),
61
+ ref,
54
62
  children: [/* @__PURE__ */ jsx("span", {
55
63
  "aria-hidden": "true",
56
64
  className: "chayns-list-item__status-dot"
@@ -59,7 +67,7 @@ function Status({ label }) {
59
67
  children: label
60
68
  })]
61
69
  });
62
- }
70
+ });
63
71
  var ListRoot = forwardRef(function List({ children, className, ...listProps }, ref) {
64
72
  const resolvedClassName = ["chayns-list", className].filter(Boolean).join(" ");
65
73
  return /* @__PURE__ */ jsx(ListContext.Provider, {
@@ -81,6 +89,10 @@ var List = Object.assign(ListRoot, { Item: Object.assign(Item, {
81
89
  Title: createPart("Title"),
82
90
  Trailing: createPart("Trailing")
83
91
  }) });
92
+ Item.displayName = "List.Item";
93
+ Object.assign(Action, { displayName: "List.Item.Action" });
94
+ Object.assign(Status, { displayName: "List.Item.Status" });
95
+ ListRoot.displayName = "List";
84
96
  //#endregion
85
97
  export { List as default };
86
98
 
@@ -1 +1 @@
1
- {"version":3,"file":"List.js","names":[],"sources":["../../../src/components/list/List.tsx"],"sourcesContent":["import { forwardRef } from 'react';\n\nimport { ListContext, ListItemContext, useListContext, useListItemContext } from './ListContext.js';\nimport type {\n ListItemActionProps,\n ListItemPartProps,\n ListItemProps,\n ListItemStatusProps,\n ListProps,\n} from './List.types.js';\n\nconst Item = forwardRef<HTMLLIElement, ListItemProps>(function Item(\n { children, className, ...itemProps },\n ref,\n) {\n useListContext();\n const resolvedClassName = ['chayns-list-item', className].filter(Boolean).join(' ');\n\n return (\n <ListItemContext.Provider value>\n <li {...itemProps} className={resolvedClassName} ref={ref}>\n {children}\n </li>\n </ListItemContext.Provider>\n );\n});\n\nfunction Action(props: ListItemActionProps) {\n useListItemContext('Action');\n\n if (props.href !== undefined) {\n const { children, className, href, ...anchorProps } = props;\n const resolvedClassName = ['chayns-list-item__action', className].filter(Boolean).join(' ');\n\n return (\n <a {...anchorProps} className={resolvedClassName} href={href}>\n {children}\n </a>\n );\n }\n\n const { children, className, ...buttonProps } = props;\n const resolvedClassName = ['chayns-list-item__action', className].filter(Boolean).join(' ');\n\n return (\n <button {...buttonProps} className={resolvedClassName} type=\"button\">\n {children}\n </button>\n );\n}\n\nfunction createPart(name: 'Leading' | 'Body' | 'Title' | 'Description' | 'Trailing') {\n const className = `chayns-list-item__${name.toLowerCase()}`;\n\n return function ListItemPart({ children, className: consumerClassName }: ListItemPartProps) {\n useListItemContext(name);\n const resolvedClassName = [className, consumerClassName].filter(Boolean).join(' ');\n\n return <span className={resolvedClassName}>{children}</span>;\n };\n}\n\nfunction Status({ label }: ListItemStatusProps) {\n useListItemContext('Status');\n\n return (\n <span className=\"chayns-list-item__status\">\n <span aria-hidden=\"true\" className=\"chayns-list-item__status-dot\" />\n <span className=\"chayns-visually-hidden\">{label}</span>\n </span>\n );\n}\n\nconst ListRoot = forwardRef<HTMLUListElement, ListProps>(function List(\n { children, className, ...listProps },\n ref,\n) {\n const resolvedClassName = ['chayns-list', className].filter(Boolean).join(' ');\n\n return (\n <ListContext.Provider value>\n <ul {...listProps} className={resolvedClassName} ref={ref}>\n {children}\n </ul>\n </ListContext.Provider>\n );\n});\n\nconst List = Object.assign(ListRoot, {\n Item: Object.assign(Item, {\n Action,\n Body: createPart('Body'),\n Description: createPart('Description'),\n Leading: createPart('Leading'),\n Status,\n Title: createPart('Title'),\n Trailing: createPart('Trailing'),\n }),\n});\n\nexport default List;\n"],"mappings":";;;;AAWA,IAAM,OAAO,WAAyC,SAAS,KAC7D,EAAE,UAAU,WAAW,GAAG,aAC1B,KACA;CACA,eAAe;CACf,MAAM,oBAAoB,CAAC,oBAAoB,SAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;CAElF,OACE,oBAAC,gBAAgB,UAAjB;EAA0B,OAAA;EACxB,UAAA,oBAAC,MAAD;GAAI,GAAI;GAAW,WAAW;GAAwB;GACnD;EACC,CAAA;CACoB,CAAA;AAE9B,CAAC;AAED,SAAS,OAAO,OAA4B;CAC1C,mBAAmB,QAAQ;CAE3B,IAAI,MAAM,SAAS,KAAA,GAAW;EAC5B,MAAM,EAAE,UAAU,WAAW,MAAM,GAAG,gBAAgB;EACtD,MAAM,oBAAoB,CAAC,4BAA4B,SAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;EAE1F,OACE,oBAAC,KAAD;GAAG,GAAI;GAAa,WAAW;GAAyB;GACrD;EACA,CAAA;CAEP;CAEA,MAAM,EAAE,UAAU,WAAW,GAAG,gBAAgB;CAChD,MAAM,oBAAoB,CAAC,4BAA4B,SAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;CAE1F,OACE,oBAAC,UAAD;EAAQ,GAAI;EAAa,WAAW;EAAmB,MAAK;EACzD;CACK,CAAA;AAEZ;AAEA,SAAS,WAAW,MAAiE;CACnF,MAAM,YAAY,qBAAqB,KAAK,YAAY;CAExD,OAAO,SAAS,aAAa,EAAE,UAAU,WAAW,qBAAwC;EAC1F,mBAAmB,IAAI;EACvB,MAAM,oBAAoB,CAAC,WAAW,iBAAiB,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;EAEjF,OAAO,oBAAC,QAAD;GAAM,WAAW;GAAoB;EAAe,CAAA;CAC7D;AACF;AAEA,SAAS,OAAO,EAAE,SAA8B;CAC9C,mBAAmB,QAAQ;CAE3B,OACE,qBAAC,QAAD;EAAM,WAAU;EAAhB,UAAA,CACE,oBAAC,QAAD;GAAM,eAAY;GAAO,WAAU;EAAgC,CAAA,GACnE,oBAAC,QAAD;GAAM,WAAU;GAA0B,UAAA;EAAY,CAAA,CAClD;;AAEV;AAEA,IAAM,WAAW,WAAwC,SAAS,KAChE,EAAE,UAAU,WAAW,GAAG,aAC1B,KACA;CACA,MAAM,oBAAoB,CAAC,eAAe,SAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;CAE7E,OACE,oBAAC,YAAY,UAAb;EAAsB,OAAA;EACpB,UAAA,oBAAC,MAAD;GAAI,GAAI;GAAW,WAAW;GAAwB;GACnD;EACC,CAAA;CACgB,CAAA;AAE1B,CAAC;AAED,IAAM,OAAO,OAAO,OAAO,UAAU,EACnC,MAAM,OAAO,OAAO,MAAM;CACxB;CACA,MAAM,WAAW,MAAM;CACvB,aAAa,WAAW,aAAa;CACrC,SAAS,WAAW,SAAS;CAC7B;CACA,OAAO,WAAW,OAAO;CACzB,UAAU,WAAW,UAAU;AACjC,CAAC,EACH,CAAC"}
1
+ {"version":3,"file":"List.js","names":[],"sources":["../../../src/components/list/List.tsx"],"sourcesContent":["import { forwardRef, type Ref } from 'react';\n\nimport { ListContext, ListItemContext, useListContext, useListItemContext } from './ListContext.js';\nimport type {\n ListItemActionProps,\n ListItemPartProps,\n ListItemProps,\n ListItemStatusProps,\n ListProps,\n} from './List.types.js';\n\nconst Item = forwardRef<HTMLLIElement, ListItemProps>(function Item(\n { children, className, ...itemProps },\n ref,\n) {\n useListContext();\n const resolvedClassName = ['chayns-list-item', className].filter(Boolean).join(' ');\n\n return (\n <ListItemContext.Provider value>\n <li {...itemProps} className={resolvedClassName} ref={ref}>\n {children}\n </li>\n </ListItemContext.Provider>\n );\n});\n\nconst Action = forwardRef<HTMLAnchorElement | HTMLButtonElement, ListItemActionProps>(\n function Action(props, ref) {\n useListItemContext('Action');\n\n if (props.href !== undefined) {\n const { children, className, href, ...anchorProps } = props;\n const resolvedClassName = ['chayns-list-item__action', className].filter(Boolean).join(' ');\n\n return (\n <a\n {...anchorProps}\n className={resolvedClassName}\n href={href}\n ref={ref as Ref<HTMLAnchorElement>}\n >\n {children}\n </a>\n );\n }\n\n const { children, className, ...buttonProps } = props;\n const resolvedClassName = ['chayns-list-item__action', className].filter(Boolean).join(' ');\n\n return (\n <button\n {...buttonProps}\n className={resolvedClassName}\n ref={ref as Ref<HTMLButtonElement>}\n type=\"button\"\n >\n {children}\n </button>\n );\n },\n);\n\nfunction createPart(name: 'Leading' | 'Body' | 'Title' | 'Description' | 'Trailing') {\n const className = `chayns-list-item__${name.toLowerCase()}`;\n\n const ListItemPart = forwardRef<HTMLSpanElement, ListItemPartProps>(function ListItemPart(\n { children, className: consumerClassName, ...spanProps },\n ref,\n ) {\n useListItemContext(name);\n const resolvedClassName = [className, consumerClassName].filter(Boolean).join(' ');\n\n return (\n <span {...spanProps} className={resolvedClassName} ref={ref}>\n {children}\n </span>\n );\n });\n\n ListItemPart.displayName = `List.Item.${name}`;\n return ListItemPart;\n}\n\nconst Status = forwardRef<HTMLSpanElement, ListItemStatusProps>(function Status(\n { label, className, ...spanProps },\n ref,\n) {\n useListItemContext('Status');\n\n return (\n <span\n {...spanProps}\n className={['chayns-list-item__status', className].filter(Boolean).join(' ')}\n ref={ref}\n >\n <span aria-hidden=\"true\" className=\"chayns-list-item__status-dot\" />\n <span className=\"chayns-visually-hidden\">{label}</span>\n </span>\n );\n});\n\nconst ListRoot = forwardRef<HTMLUListElement, ListProps>(function List(\n { children, className, ...listProps },\n ref,\n) {\n const resolvedClassName = ['chayns-list', className].filter(Boolean).join(' ');\n\n return (\n <ListContext.Provider value>\n <ul {...listProps} className={resolvedClassName} ref={ref}>\n {children}\n </ul>\n </ListContext.Provider>\n );\n});\n\nconst List = Object.assign(ListRoot, {\n Item: Object.assign(Item, {\n Action,\n Body: createPart('Body'),\n Description: createPart('Description'),\n Leading: createPart('Leading'),\n Status,\n Title: createPart('Title'),\n Trailing: createPart('Trailing'),\n }),\n});\n\nItem.displayName = 'List.Item';\nObject.assign(Action, { displayName: 'List.Item.Action' });\nObject.assign(Status, { displayName: 'List.Item.Status' });\nListRoot.displayName = 'List';\n\nexport default List;\n"],"mappings":";;;;AAWA,IAAM,OAAO,WAAyC,SAAS,KAC7D,EAAE,UAAU,WAAW,GAAG,aAC1B,KACA;CACA,eAAe;CACf,MAAM,oBAAoB,CAAC,oBAAoB,SAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;CAElF,OACE,oBAAC,gBAAgB,UAAjB;EAA0B,OAAA;EACxB,UAAA,oBAAC,MAAD;GAAI,GAAI;GAAW,WAAW;GAAwB;GACnD;EACC,CAAA;CACoB,CAAA;AAE9B,CAAC;AAED,IAAM,SAAS,WACb,SAAS,OAAO,OAAO,KAAK;CAC1B,mBAAmB,QAAQ;CAE3B,IAAI,MAAM,SAAS,KAAA,GAAW;EAC5B,MAAM,EAAE,UAAU,WAAW,MAAM,GAAG,gBAAgB;EACtD,MAAM,oBAAoB,CAAC,4BAA4B,SAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;EAE1F,OACE,oBAAC,KAAD;GACE,GAAI;GACJ,WAAW;GACL;GACD;GAEJ;EACA,CAAA;CAEP;CAEA,MAAM,EAAE,UAAU,WAAW,GAAG,gBAAgB;CAChD,MAAM,oBAAoB,CAAC,4BAA4B,SAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;CAE1F,OACE,oBAAC,UAAD;EACE,GAAI;EACJ,WAAW;EACN;EACL,MAAK;EAEJ;CACK,CAAA;AAEZ,CACF;AAEA,SAAS,WAAW,MAAiE;CACnF,MAAM,YAAY,qBAAqB,KAAK,YAAY;CAExD,MAAM,eAAe,WAA+C,SAAS,aAC3E,EAAE,UAAU,WAAW,mBAAmB,GAAG,aAC7C,KACA;EACA,mBAAmB,IAAI;EACvB,MAAM,oBAAoB,CAAC,WAAW,iBAAiB,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;EAEjF,OACE,oBAAC,QAAD;GAAM,GAAI;GAAW,WAAW;GAAwB;GACrD;EACG,CAAA;CAEV,CAAC;CAED,aAAa,cAAc,aAAa;CACxC,OAAO;AACT;AAEA,IAAM,SAAS,WAAiD,SAAS,OACvE,EAAE,OAAO,WAAW,GAAG,aACvB,KACA;CACA,mBAAmB,QAAQ;CAE3B,OACE,qBAAC,QAAD;EACE,GAAI;EACJ,WAAW,CAAC,4BAA4B,SAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;EACtE;EAHP,UAAA,CAKE,oBAAC,QAAD;GAAM,eAAY;GAAO,WAAU;EAAgC,CAAA,GACnE,oBAAC,QAAD;GAAM,WAAU;GAA0B,UAAA;EAAY,CAAA,CAClD;;AAEV,CAAC;AAED,IAAM,WAAW,WAAwC,SAAS,KAChE,EAAE,UAAU,WAAW,GAAG,aAC1B,KACA;CACA,MAAM,oBAAoB,CAAC,eAAe,SAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;CAE7E,OACE,oBAAC,YAAY,UAAb;EAAsB,OAAA;EACpB,UAAA,oBAAC,MAAD;GAAI,GAAI;GAAW,WAAW;GAAwB;GACnD;EACC,CAAA;CACgB,CAAA;AAE1B,CAAC;AAED,IAAM,OAAO,OAAO,OAAO,UAAU,EACnC,MAAM,OAAO,OAAO,MAAM;CACxB;CACA,MAAM,WAAW,MAAM;CACvB,aAAa,WAAW,aAAa;CACrC,SAAS,WAAW,SAAS;CAC7B;CACA,OAAO,WAAW,OAAO;CACzB,UAAU,WAAW,UAAU;AACjC,CAAC,EACH,CAAC;AAED,KAAK,cAAc;AACnB,OAAO,OAAO,QAAQ,EAAE,aAAa,mBAAmB,CAAC;AACzD,OAAO,OAAO,QAAQ,EAAE,aAAa,mBAAmB,CAAC;AACzD,SAAS,cAAc"}
@@ -9,11 +9,11 @@ export type ListItemActionProps = (Omit<ComponentPropsWithRef<'a'>, 'children'>
9
9
  href?: never;
10
10
  type?: never;
11
11
  });
12
- export interface ListItemPartProps {
12
+ export interface ListItemPartProps extends ComponentPropsWithRef<'span'> {
13
13
  children: ReactNode;
14
14
  className?: string;
15
15
  }
16
- export interface ListItemStatusProps {
16
+ export interface ListItemStatusProps extends Omit<ComponentPropsWithRef<'span'>, 'children'> {
17
17
  /** Localized description of the otherwise colour-only status dot. */
18
18
  label: Exclude<ReactNode, boolean | null | undefined>;
19
19
  }
@@ -1 +1 @@
1
- {"version":3,"file":"List.types.d.ts","sourceRoot":"","sources":["../../../src/components/list/List.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE9D,MAAM,MAAM,SAAS,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;AACpD,MAAM,MAAM,aAAa,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;AAExD,MAAM,MAAM,mBAAmB,GAC3B,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,GAAG;IAAE,QAAQ,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GACtF,CAAC,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC,GAAG;IAC5D,QAAQ,EAAE,SAAS,CAAC;IACpB,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,IAAI,CAAC,EAAE,KAAK,CAAC;CACd,CAAC,CAAC;AAEP,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,qEAAqE;IACrE,KAAK,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;CACvD"}
1
+ {"version":3,"file":"List.types.d.ts","sourceRoot":"","sources":["../../../src/components/list/List.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE9D,MAAM,MAAM,SAAS,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;AACpD,MAAM,MAAM,aAAa,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;AAExD,MAAM,MAAM,mBAAmB,GAC3B,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,GAAG;IAAE,QAAQ,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GACtF,CAAC,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC,GAAG;IAC5D,QAAQ,EAAE,SAAS,CAAC;IACpB,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,IAAI,CAAC,EAAE,KAAK,CAAC;CACd,CAAC,CAAC;AAEP,MAAM,WAAW,iBAAkB,SAAQ,qBAAqB,CAAC,MAAM,CAAC;IACtE,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAoB,SAAQ,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC;IAC1F,qEAAqE;IACrE,KAAK,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;CACvD"}
@@ -0,0 +1,4 @@
1
+ import type { PaginationProps } from './Pagination.types.js';
2
+ declare const Pagination: import("react").ForwardRefExoticComponent<Omit<PaginationProps, "ref"> & import("react").RefAttributes<HTMLElement>>;
3
+ export default Pagination;
4
+ //# sourceMappingURL=Pagination.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Pagination.d.ts","sourceRoot":"","sources":["../../../src/components/pagination/Pagination.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,QAAA,MAAM,UAAU,sHA0Ed,CAAC;AAEH,eAAe,UAAU,CAAC"}
@@ -0,0 +1,57 @@
1
+ import ButtonIcon from "../button/button-icon/ButtonIcon.js";
2
+ import { paginationPages } from "./pagination-pages.js";
3
+ import { forwardRef } from "react";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ //#region src/components/pagination/Pagination.tsx
6
+ var Pagination = forwardRef(function Pagination({ className, labels, onClick, onPageChange, page, pageCount, ...navProps }, ref) {
7
+ if (!Number.isSafeInteger(pageCount) || pageCount < 1 || !Number.isSafeInteger(page) || page < 1 || page > pageCount) throw new Error("Pagination requires pageCount >= 1 and page within 1..pageCount.");
8
+ function handleClick(event) {
9
+ onClick?.(event);
10
+ if (event.defaultPrevented || !(event.target instanceof Element)) return;
11
+ const button = event.target.closest("button[data-page]");
12
+ if (!button || !event.currentTarget.contains(button) || button.disabled) return;
13
+ const next = Number(button.dataset.page);
14
+ if (next !== page) onPageChange(next);
15
+ }
16
+ return /* @__PURE__ */ jsxs("nav", {
17
+ ...navProps,
18
+ className: ["chayns-pagination", className].filter(Boolean).join(" "),
19
+ onClick: handleClick,
20
+ ref,
21
+ children: [
22
+ /* @__PURE__ */ jsx("button", {
23
+ "aria-label": labels.previous,
24
+ className: "chayns-pagination__arrow",
25
+ "data-page": page - 1,
26
+ disabled: page === 1,
27
+ type: "button",
28
+ children: /* @__PURE__ */ jsx(ButtonIcon, { icon: "fa-chevron-left" })
29
+ }),
30
+ paginationPages(page, pageCount).map((item, index) => item === "ellipsis" ? /* @__PURE__ */ jsx("span", {
31
+ "aria-hidden": "true",
32
+ className: "chayns-pagination__ellipsis",
33
+ children: "…"
34
+ }, `ellipsis-${index}`) : /* @__PURE__ */ jsx("button", {
35
+ "aria-current": item === page ? "page" : void 0,
36
+ "aria-label": labels.pageLabel(item),
37
+ className: "chayns-pagination__page",
38
+ "data-page": item,
39
+ type: "button",
40
+ children: item
41
+ }, item)),
42
+ /* @__PURE__ */ jsx("button", {
43
+ "aria-label": labels.next,
44
+ className: "chayns-pagination__arrow",
45
+ "data-page": page + 1,
46
+ disabled: page === pageCount,
47
+ type: "button",
48
+ children: /* @__PURE__ */ jsx(ButtonIcon, { icon: "fa-chevron-right" })
49
+ })
50
+ ]
51
+ });
52
+ });
53
+ Pagination.displayName = "Pagination";
54
+ //#endregion
55
+ export { Pagination as default };
56
+
57
+ //# sourceMappingURL=Pagination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Pagination.js","names":[],"sources":["../../../src/components/pagination/Pagination.tsx"],"sourcesContent":["import { forwardRef, type MouseEvent } from 'react';\nimport ButtonIcon from '../button/button-icon/ButtonIcon.js';\nimport { paginationPages } from './pagination-pages.js';\nimport type { PaginationProps } from './Pagination.types.js';\n\nconst Pagination = forwardRef<HTMLElement, PaginationProps>(function Pagination(\n { className, labels, onClick, onPageChange, page, pageCount, ...navProps },\n ref,\n) {\n if (\n !Number.isSafeInteger(pageCount) ||\n pageCount < 1 ||\n !Number.isSafeInteger(page) ||\n page < 1 ||\n page > pageCount\n ) {\n throw new Error('Pagination requires pageCount >= 1 and page within 1..pageCount.');\n }\n\n function handleClick(event: MouseEvent<HTMLElement>) {\n onClick?.(event);\n if (event.defaultPrevented || !(event.target instanceof Element)) return;\n const button = event.target.closest<HTMLButtonElement>('button[data-page]');\n if (!button || !event.currentTarget.contains(button) || button.disabled) return;\n const next = Number(button.dataset.page);\n if (next !== page) onPageChange(next);\n }\n\n return (\n // Native child buttons emit clicks for pointer and keyboard; the nav delegates both.\n // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-noninteractive-element-interactions\n <nav\n {...navProps}\n className={['chayns-pagination', className].filter(Boolean).join(' ')}\n onClick={handleClick}\n ref={ref}\n >\n <button\n aria-label={labels.previous}\n className=\"chayns-pagination__arrow\"\n data-page={page - 1}\n disabled={page === 1}\n type=\"button\"\n >\n <ButtonIcon icon=\"fa-chevron-left\" />\n </button>\n {paginationPages(page, pageCount).map((item, index) =>\n item === 'ellipsis' ? (\n <span\n aria-hidden=\"true\"\n className=\"chayns-pagination__ellipsis\"\n key={`ellipsis-${index}`}\n >\n …\n </span>\n ) : (\n <button\n aria-current={item === page ? 'page' : undefined}\n aria-label={labels.pageLabel(item)}\n className=\"chayns-pagination__page\"\n data-page={item}\n key={item}\n type=\"button\"\n >\n {item}\n </button>\n ),\n )}\n <button\n aria-label={labels.next}\n className=\"chayns-pagination__arrow\"\n data-page={page + 1}\n disabled={page === pageCount}\n type=\"button\"\n >\n <ButtonIcon icon=\"fa-chevron-right\" />\n </button>\n </nav>\n );\n});\nPagination.displayName = 'Pagination';\nexport default Pagination;\n"],"mappings":";;;;;AAKA,IAAM,aAAa,WAAyC,SAAS,WACnE,EAAE,WAAW,QAAQ,SAAS,cAAc,MAAM,WAAW,GAAG,YAChE,KACA;CACA,IACE,CAAC,OAAO,cAAc,SAAS,KAC/B,YAAY,KACZ,CAAC,OAAO,cAAc,IAAI,KAC1B,OAAO,KACP,OAAO,WAEP,MAAM,IAAI,MAAM,kEAAkE;CAGpF,SAAS,YAAY,OAAgC;EACnD,UAAU,KAAK;EACf,IAAI,MAAM,oBAAoB,EAAE,MAAM,kBAAkB,UAAU;EAClE,MAAM,SAAS,MAAM,OAAO,QAA2B,mBAAmB;EAC1E,IAAI,CAAC,UAAU,CAAC,MAAM,cAAc,SAAS,MAAM,KAAK,OAAO,UAAU;EACzE,MAAM,OAAO,OAAO,OAAO,QAAQ,IAAI;EACvC,IAAI,SAAS,MAAM,aAAa,IAAI;CACtC;CAEA,OAGE,qBAAC,OAAD;EACE,GAAI;EACJ,WAAW,CAAC,qBAAqB,SAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;EACpE,SAAS;EACJ;EAJP,UAAA;GAME,oBAAC,UAAD;IACE,cAAY,OAAO;IACnB,WAAU;IACV,aAAW,OAAO;IAClB,UAAU,SAAS;IACnB,MAAK;IAEL,UAAA,oBAAC,YAAD,EAAY,MAAK,kBAAmB,CAAA;GAC9B,CAAA;GACP,gBAAgB,MAAM,SAAS,CAAC,CAAC,KAAK,MAAM,UAC3C,SAAS,aACP,oBAAC,QAAD;IACE,eAAY;IACZ,WAAU;IAEX,UAAA;GAEK,GAHC,YAAY,OAGb,IAEN,oBAAC,UAAD;IACE,gBAAc,SAAS,OAAO,SAAS,KAAA;IACvC,cAAY,OAAO,UAAU,IAAI;IACjC,WAAU;IACV,aAAW;IAEX,MAAK;IAEJ,UAAA;GACK,GAJD,IAIC,CAEZ;GACA,oBAAC,UAAD;IACE,cAAY,OAAO;IACnB,WAAU;IACV,aAAW,OAAO;IAClB,UAAU,SAAS;IACnB,MAAK;IAEL,UAAA,oBAAC,YAAD,EAAY,MAAK,mBAAoB,CAAA;GAC/B,CAAA;EACL;;AAET,CAAC;AACD,WAAW,cAAc"}
@@ -0,0 +1,15 @@
1
+ import type { ComponentPropsWithRef } from 'react';
2
+ export interface PaginationLabels {
3
+ previous: string;
4
+ next: string;
5
+ /** Localized accessible name, for example "Seite 3". */
6
+ pageLabel: (page: number) => string;
7
+ }
8
+ /** Page-loaded collections; use explicit load-more for feeds and Breadcrumb for hierarchy. */
9
+ export interface PaginationProps extends Omit<ComponentPropsWithRef<'nav'>, 'children'> {
10
+ page: number;
11
+ pageCount: number;
12
+ onPageChange: (page: number) => void;
13
+ labels: PaginationLabels;
14
+ }
15
+ //# sourceMappingURL=Pagination.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Pagination.types.d.ts","sourceRoot":"","sources":["../../../src/components/pagination/Pagination.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,OAAO,CAAC;AAEnD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACrC;AAED,8FAA8F;AAC9F,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;IACrF,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,MAAM,EAAE,gBAAgB,CAAC;CAC1B"}
@@ -0,0 +1,2 @@
1
+ export declare function paginationPages(page: number, pageCount: number): (number | 'ellipsis')[];
2
+ //# sourceMappingURL=pagination-pages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination-pages.d.ts","sourceRoot":"","sources":["../../../src/components/pagination/pagination-pages.ts"],"names":[],"mappings":"AAAA,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,CAAC,MAAM,GAAG,UAAU,CAAC,EAAE,CAMxF"}
@@ -0,0 +1,35 @@
1
+ //#region src/components/pagination/pagination-pages.ts
2
+ function paginationPages(page, pageCount) {
3
+ if (pageCount <= 7) return Array.from({ length: pageCount }, (_, index) => index + 1);
4
+ if (page <= 4) return [
5
+ 1,
6
+ 2,
7
+ 3,
8
+ 4,
9
+ 5,
10
+ "ellipsis",
11
+ pageCount
12
+ ];
13
+ if (page >= pageCount - 3) return [
14
+ 1,
15
+ "ellipsis",
16
+ pageCount - 4,
17
+ pageCount - 3,
18
+ pageCount - 2,
19
+ pageCount - 1,
20
+ pageCount
21
+ ];
22
+ return [
23
+ 1,
24
+ "ellipsis",
25
+ page - 1,
26
+ page,
27
+ page + 1,
28
+ "ellipsis",
29
+ pageCount
30
+ ];
31
+ }
32
+ //#endregion
33
+ export { paginationPages };
34
+
35
+ //# sourceMappingURL=pagination-pages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination-pages.js","names":[],"sources":["../../../src/components/pagination/pagination-pages.ts"],"sourcesContent":["export function paginationPages(page: number, pageCount: number): (number | 'ellipsis')[] {\n if (pageCount <= 7) return Array.from({ length: pageCount }, (_, index) => index + 1);\n if (page <= 4) return [1, 2, 3, 4, 5, 'ellipsis', pageCount];\n if (page >= pageCount - 3)\n return [1, 'ellipsis', pageCount - 4, pageCount - 3, pageCount - 2, pageCount - 1, pageCount];\n return [1, 'ellipsis', page - 1, page, page + 1, 'ellipsis', pageCount];\n}\n"],"mappings":";AAAA,SAAgB,gBAAgB,MAAc,WAA4C;CACxF,IAAI,aAAa,GAAG,OAAO,MAAM,KAAK,EAAE,QAAQ,UAAU,IAAI,GAAG,UAAU,QAAQ,CAAC;CACpF,IAAI,QAAQ,GAAG,OAAO;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAY;CAAS;CAC3D,IAAI,QAAQ,YAAY,GACtB,OAAO;EAAC;EAAG;EAAY,YAAY;EAAG,YAAY;EAAG,YAAY;EAAG,YAAY;EAAG;CAAS;CAC9F,OAAO;EAAC;EAAG;EAAY,OAAO;EAAG;EAAM,OAAO;EAAG;EAAY;CAAS;AACxE"}
@@ -1,5 +1,8 @@
1
1
  import type { PopupProps, PopupTriggerProps } from './Popup.types.js';
2
- declare const _default: (({ children, closeOnEscape, closeOnOutsidePress, defaultOpen, onOpenChange, open, }: PopupProps) => import("react").JSX.Element) & {
2
+ declare const _default: {
3
+ ({ children, closeOnEscape, closeOnOutsidePress, defaultOpen, onOpenChange, open, }: PopupProps): import("react").JSX.Element;
4
+ displayName: string;
5
+ } & {
3
6
  Trigger: import("react").ForwardRefExoticComponent<Omit<PopupTriggerProps, "ref"> & import("react").RefAttributes<HTMLButtonElement>>;
4
7
  Content: import("react").ForwardRefExoticComponent<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
5
8
  };
@@ -1 +1 @@
1
- {"version":3,"file":"Popup.d.ts","sourceRoot":"","sources":["../../../src/components/popup/Popup.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAqB,UAAU,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;8GAuFtF,UAAU;;;;AAkDb,wBAAyD"}
1
+ {"version":3,"file":"Popup.d.ts","sourceRoot":"","sources":["../../../src/components/popup/Popup.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAqB,UAAU,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;;yFAsFtF,UAAU;;;;;;AA0Db,wBAAyD"}
@@ -1,4 +1,6 @@
1
- import { cloneElement, createContext, forwardRef, isValidElement, useCallback, useContext, useEffect, useId, useRef, useState } from "react";
1
+ import { composeNativeRefs } from "../../utils/native-ref.js";
2
+ import { useOverlayPosition } from "../../hooks/useOverlayPosition.js";
3
+ import { cloneElement, createContext, forwardRef, isValidElement, useCallback, useContext, useEffect, useId, useMemo, useRef, useState } from "react";
2
4
  import { jsx } from "react/jsx-runtime";
3
5
  import { createPortal } from "react-dom";
4
6
  //#region src/components/popup/Popup.tsx
@@ -10,17 +12,22 @@ function usePopup(part) {
10
12
  }
11
13
  var Trigger = forwardRef(function Trigger({ asChild = false, children, onClick, ...props }, ref) {
12
14
  const popup = usePopup("Trigger");
13
- const setRef = (node) => {
14
- popup.setTriggerElement(node);
15
- if (typeof ref === "function") ref(node);
16
- else if (ref) ref.current = node;
17
- };
15
+ const child = asChild && isValidElement(children) ? children : void 0;
16
+ const descriptorRef = child ? Object.getOwnPropertyDescriptor(child, "ref")?.value : void 0;
17
+ const childRef = child?.props.ref ?? descriptorRef;
18
+ const setTriggerElement = popup.setTriggerElement;
19
+ const setRef = useMemo(() => composeNativeRefs(childRef, setTriggerElement, ref), [
20
+ childRef,
21
+ setTriggerElement,
22
+ ref
23
+ ]);
18
24
  const triggerProps = {
19
25
  ...props,
20
26
  "aria-controls": popup.contentId,
21
27
  "aria-expanded": popup.open,
22
28
  onClick: (event) => {
23
- onClick?.(event);
29
+ child?.props.onClick?.(event);
30
+ if (!event.defaultPrevented) onClick?.(event);
24
31
  if (!event.defaultPrevented) popup.setOpen(!popup.open);
25
32
  },
26
33
  ref: setRef
@@ -36,14 +43,8 @@ var Trigger = forwardRef(function Trigger({ asChild = false, children, onClick,
36
43
  var Content = forwardRef(function Content({ children, ...props }, ref) {
37
44
  const popup = usePopup("Content");
38
45
  const contentRef = useRef(null);
39
- useEffect(() => {
40
- if (popup.open) contentRef.current?.querySelector("[role=\"menuitem\"]")?.focus();
41
- }, [popup.open]);
42
- function setRef(element) {
43
- contentRef.current = element;
44
- if (typeof ref === "function") ref(element);
45
- else if (ref) ref.current = element;
46
- }
46
+ useOverlayPosition(contentRef, popup.triggerElement, popup.open);
47
+ const setRef = useMemo(() => composeNativeRefs(contentRef, ref), [ref]);
47
48
  if (!popup.open || typeof document === "undefined") return null;
48
49
  return createPortal(/* @__PURE__ */ jsx("div", {
49
50
  ...props,
@@ -70,7 +71,7 @@ var Root = ({ children, closeOnEscape = true, closeOnOutsidePress = true, defaul
70
71
  useEffect(() => {
71
72
  if (!isOpen) return;
72
73
  const key = (event) => {
73
- if (event.key === "Escape" && closeOnEscape) {
74
+ if (event.key === "Escape" && closeOnEscape && !event.defaultPrevented) {
74
75
  event.preventDefault();
75
76
  setOpen(false);
76
77
  }
@@ -81,7 +82,9 @@ var Root = ({ children, closeOnEscape = true, closeOnOutsidePress = true, defaul
81
82
  if (closeOnOutsidePress && target instanceof Node && !triggerElement?.contains(target) && !document.getElementById(contentId)?.contains(target)) setOpen(false, false);
82
83
  };
83
84
  const menuAction = (event) => {
84
- if (event.target.closest("[role=\"menuitem\"]")) setOpen(false);
85
+ if (event.defaultPrevented || !(event.target instanceof Element)) return;
86
+ const item = event.target.closest("[role=\"menuitem\"]");
87
+ if (item && document.getElementById(contentId)?.contains(item)) setOpen(false);
85
88
  };
86
89
  document.addEventListener("keydown", key);
87
90
  document.addEventListener("pointerdown", outside);
@@ -104,11 +107,15 @@ var Root = ({ children, closeOnEscape = true, closeOnOutsidePress = true, defaul
104
107
  contentId,
105
108
  open: isOpen,
106
109
  setOpen,
107
- setTriggerElement
110
+ setTriggerElement,
111
+ triggerElement
108
112
  },
109
113
  children
110
114
  });
111
115
  };
116
+ Trigger.displayName = "Popup.Trigger";
117
+ Content.displayName = "Popup.Content";
118
+ Root.displayName = "Popup";
112
119
  var Popup_default = Object.assign(Root, {
113
120
  Trigger,
114
121
  Content
@@ -1 +1 @@
1
- {"version":3,"file":"Popup.js","names":[],"sources":["../../../src/components/popup/Popup.tsx"],"sourcesContent":["import {\n cloneElement,\n createContext,\n forwardRef,\n isValidElement,\n useCallback,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport type { PopupContentProps, PopupProps, PopupTriggerProps } from './Popup.types.js';\n\ninterface PopupContextValue {\n contentId: string;\n open: boolean;\n setOpen: (open: boolean, restore?: boolean) => void;\n setTriggerElement: (element: HTMLButtonElement | null) => void;\n}\nconst PopupContext = createContext<PopupContextValue | null>(null);\nfunction usePopup(part: string) {\n const context = useContext(PopupContext);\n if (!context) throw new Error(`Popup.${part} must be rendered within Popup.`);\n return context;\n}\n\nconst Trigger = forwardRef<HTMLButtonElement, PopupTriggerProps>(function Trigger(\n { asChild = false, children, onClick, ...props },\n ref,\n) {\n const popup = usePopup('Trigger');\n const setRef = (node: HTMLButtonElement | null) => {\n popup.setTriggerElement(node);\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n };\n const triggerProps = {\n ...props,\n 'aria-controls': popup.contentId,\n 'aria-expanded': popup.open,\n onClick: (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (!event.defaultPrevented) popup.setOpen(!popup.open);\n },\n ref: setRef,\n };\n\n if (asChild && isValidElement(children)) {\n // eslint-disable-next-line react-hooks/refs\n return cloneElement(children, triggerProps);\n }\n\n return (\n <button {...triggerProps} ref={setRef} type=\"button\">\n {children}\n </button>\n );\n});\nconst Content = forwardRef<HTMLDivElement, PopupContentProps>(function Content(\n { children, ...props },\n ref,\n) {\n const popup = usePopup('Content');\n const contentRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (popup.open) {\n contentRef.current?.querySelector<HTMLElement>('[role=\"menuitem\"]')?.focus();\n }\n }, [popup.open]);\n\n function setRef(element: HTMLDivElement | null) {\n contentRef.current = element;\n\n if (typeof ref === 'function') ref(element);\n else if (ref) ref.current = element;\n }\n\n if (!popup.open || typeof document === 'undefined') return null;\n return createPortal(\n <div\n {...props}\n className={['chayns-popup', props.className].filter(Boolean).join(' ')}\n id={popup.contentId}\n ref={setRef}\n >\n {children}\n </div>,\n document.body,\n );\n});\nconst Root = ({\n children,\n closeOnEscape = true,\n closeOnOutsidePress = true,\n defaultOpen = false,\n onOpenChange,\n open,\n}: PopupProps) => {\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const [triggerElement, setTriggerElement] = useState<HTMLButtonElement | null>(null);\n const contentId = useId();\n const isOpen = open ?? uncontrolledOpen;\n const setOpen = useCallback(\n (next: boolean, restore = true) => {\n if (open === undefined) setUncontrolledOpen(next);\n onOpenChange?.(next);\n if (!next && restore) queueMicrotask(() => triggerElement?.focus());\n },\n [onOpenChange, open, triggerElement],\n );\n useEffect(() => {\n if (!isOpen) return;\n const key = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && closeOnEscape) {\n event.preventDefault();\n setOpen(false);\n }\n if (event.key === 'Tab') setOpen(false, false);\n };\n const outside = (event: PointerEvent) => {\n const target = event.target;\n if (\n closeOnOutsidePress &&\n target instanceof Node &&\n !triggerElement?.contains(target) &&\n !document.getElementById(contentId)?.contains(target)\n )\n setOpen(false, false);\n };\n const menuAction = (event: MouseEvent) => {\n if ((event.target as HTMLElement).closest('[role=\"menuitem\"]')) setOpen(false);\n };\n document.addEventListener('keydown', key);\n document.addEventListener('pointerdown', outside);\n document.addEventListener('click', menuAction);\n return () => {\n document.removeEventListener('keydown', key);\n document.removeEventListener('pointerdown', outside);\n document.removeEventListener('click', menuAction);\n };\n }, [isOpen, closeOnEscape, closeOnOutsidePress, contentId, setOpen, triggerElement]);\n return (\n <PopupContext.Provider value={{ contentId, open: isOpen, setOpen, setTriggerElement }}>\n {children}\n </PopupContext.Provider>\n );\n};\nexport default Object.assign(Root, { Trigger, Content });\n"],"mappings":";;;;AAqBA,IAAM,eAAe,cAAwC,IAAI;AACjE,SAAS,SAAS,MAAc;CAC9B,MAAM,UAAU,WAAW,YAAY;CACvC,IAAI,CAAC,SAAS,MAAM,IAAI,MAAM,SAAS,KAAK,gCAAgC;CAC5E,OAAO;AACT;AAEA,IAAM,UAAU,WAAiD,SAAS,QACxE,EAAE,UAAU,OAAO,UAAU,SAAS,GAAG,SACzC,KACA;CACA,MAAM,QAAQ,SAAS,SAAS;CAChC,MAAM,UAAU,SAAmC;EACjD,MAAM,kBAAkB,IAAI;EAC5B,IAAI,OAAO,QAAQ,YAAY,IAAI,IAAI;OAClC,IAAI,KAAK,IAAI,UAAU;CAC9B;CACA,MAAM,eAAe;EACnB,GAAG;EACH,iBAAiB,MAAM;EACvB,iBAAiB,MAAM;EACvB,UAAU,UAA+C;GACvD,UAAU,KAAK;GACf,IAAI,CAAC,MAAM,kBAAkB,MAAM,QAAQ,CAAC,MAAM,IAAI;EACxD;EACA,KAAK;CACP;CAEA,IAAI,WAAW,eAAe,QAAQ,GAEpC,OAAO,aAAa,UAAU,YAAY;CAG5C,OACE,oBAAC,UAAD;EAAQ,GAAI;EAAc,KAAK;EAAQ,MAAK;EACzC;CACK,CAAA;AAEZ,CAAC;AACD,IAAM,UAAU,WAA8C,SAAS,QACrE,EAAE,UAAU,GAAG,SACf,KACA;CACA,MAAM,QAAQ,SAAS,SAAS;CAChC,MAAM,aAAa,OAAuB,IAAI;CAE9C,gBAAgB;EACd,IAAI,MAAM,MACR,WAAW,SAAS,cAA2B,qBAAmB,CAAC,EAAE,MAAM;CAE/E,GAAG,CAAC,MAAM,IAAI,CAAC;CAEf,SAAS,OAAO,SAAgC;EAC9C,WAAW,UAAU;EAErB,IAAI,OAAO,QAAQ,YAAY,IAAI,OAAO;OACrC,IAAI,KAAK,IAAI,UAAU;CAC9B;CAEA,IAAI,CAAC,MAAM,QAAQ,OAAO,aAAa,aAAa,OAAO;CAC3D,OAAO,aACL,oBAAC,OAAD;EACE,GAAI;EACJ,WAAW,CAAC,gBAAgB,MAAM,SAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;EACrE,IAAI,MAAM;EACV,KAAK;EAEJ;CACE,CAAA,GACL,SAAS,IACX;AACF,CAAC;AACD,IAAM,QAAQ,EACZ,UACA,gBAAgB,MAChB,sBAAsB,MACtB,cAAc,OACd,cACA,WACgB;CAChB,MAAM,CAAC,kBAAkB,uBAAuB,SAAS,WAAW;CACpE,MAAM,CAAC,gBAAgB,qBAAqB,SAAmC,IAAI;CACnF,MAAM,YAAY,MAAM;CACxB,MAAM,SAAS,QAAQ;CACvB,MAAM,UAAU,aACb,MAAe,UAAU,SAAS;EACjC,IAAI,SAAS,KAAA,GAAW,oBAAoB,IAAI;EAChD,eAAe,IAAI;EACnB,IAAI,CAAC,QAAQ,SAAS,qBAAqB,gBAAgB,MAAM,CAAC;CACpE,GACA;EAAC;EAAc;EAAM;CAAc,CACrC;CACA,gBAAgB;EACd,IAAI,CAAC,QAAQ;EACb,MAAM,OAAO,UAAyB;GACpC,IAAI,MAAM,QAAQ,YAAY,eAAe;IAC3C,MAAM,eAAe;IACrB,QAAQ,KAAK;GACf;GACA,IAAI,MAAM,QAAQ,OAAO,QAAQ,OAAO,KAAK;EAC/C;EACA,MAAM,WAAW,UAAwB;GACvC,MAAM,SAAS,MAAM;GACrB,IACE,uBACA,kBAAkB,QAClB,CAAC,gBAAgB,SAAS,MAAM,KAChC,CAAC,SAAS,eAAe,SAAS,CAAC,EAAE,SAAS,MAAM,GAEpD,QAAQ,OAAO,KAAK;EACxB;EACA,MAAM,cAAc,UAAsB;GACxC,IAAK,MAAM,OAAuB,QAAQ,qBAAmB,GAAG,QAAQ,KAAK;EAC/E;EACA,SAAS,iBAAiB,WAAW,GAAG;EACxC,SAAS,iBAAiB,eAAe,OAAO;EAChD,SAAS,iBAAiB,SAAS,UAAU;EAC7C,aAAa;GACX,SAAS,oBAAoB,WAAW,GAAG;GAC3C,SAAS,oBAAoB,eAAe,OAAO;GACnD,SAAS,oBAAoB,SAAS,UAAU;EAClD;CACF,GAAG;EAAC;EAAQ;EAAe;EAAqB;EAAW;EAAS;CAAc,CAAC;CACnF,OACE,oBAAC,aAAa,UAAd;EAAuB,OAAO;GAAE;GAAW,MAAM;GAAQ;GAAS;EAAkB;EACjF;CACoB,CAAA;AAE3B;AACA,IAAA,gBAAe,OAAO,OAAO,MAAM;CAAE;CAAS;AAAQ,CAAC"}
1
+ {"version":3,"file":"Popup.js","names":[],"sources":["../../../src/components/popup/Popup.tsx"],"sourcesContent":["import {\n cloneElement,\n createContext,\n forwardRef,\n isValidElement,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { composeNativeRefs } from '../../utils/native-ref.js';\nimport { useOverlayPosition } from '../../hooks/useOverlayPosition.js';\nimport type { ComponentPropsWithRef, Ref } from 'react';\nimport type { PopupContentProps, PopupProps, PopupTriggerProps } from './Popup.types.js';\n\ninterface PopupContextValue {\n contentId: string;\n open: boolean;\n setOpen: (open: boolean, restore?: boolean) => void;\n setTriggerElement: (element: HTMLButtonElement | null) => void;\n triggerElement: HTMLButtonElement | null;\n}\nconst PopupContext = createContext<PopupContextValue | null>(null);\nfunction usePopup(part: string) {\n const context = useContext(PopupContext);\n if (!context) throw new Error(`Popup.${part} must be rendered within Popup.`);\n return context;\n}\n\nconst Trigger = forwardRef<HTMLButtonElement, PopupTriggerProps>(function Trigger(\n { asChild = false, children, onClick, ...props },\n ref,\n) {\n const popup = usePopup('Trigger');\n const child =\n asChild && isValidElement<ComponentPropsWithRef<'button'>>(children) ? children : undefined;\n const descriptorRef = child\n ? (Object.getOwnPropertyDescriptor(child, 'ref')?.value as Ref<HTMLButtonElement> | undefined)\n : undefined;\n const childRef = child?.props.ref ?? descriptorRef;\n const setTriggerElement = popup.setTriggerElement;\n const setRef = useMemo(\n () => composeNativeRefs(childRef, setTriggerElement, ref),\n [childRef, setTriggerElement, ref],\n );\n const triggerProps = {\n ...props,\n 'aria-controls': popup.contentId,\n 'aria-expanded': popup.open,\n onClick: (event: React.MouseEvent<HTMLButtonElement>) => {\n child?.props.onClick?.(event);\n if (!event.defaultPrevented) onClick?.(event);\n if (!event.defaultPrevented) popup.setOpen(!popup.open);\n },\n ref: setRef,\n };\n\n if (asChild && isValidElement(children)) {\n // eslint-disable-next-line react-hooks/refs\n return cloneElement(children, triggerProps);\n }\n\n return (\n <button {...triggerProps} ref={setRef} type=\"button\">\n {children}\n </button>\n );\n});\nconst Content = forwardRef<HTMLDivElement, PopupContentProps>(function Content(\n { children, ...props },\n ref,\n) {\n const popup = usePopup('Content');\n const contentRef = useRef<HTMLDivElement>(null);\n\n useOverlayPosition(contentRef, popup.triggerElement, popup.open);\n\n const setRef = useMemo(() => composeNativeRefs(contentRef, ref), [ref]);\n\n if (!popup.open || typeof document === 'undefined') return null;\n return createPortal(\n <div\n {...props}\n className={['chayns-popup', props.className].filter(Boolean).join(' ')}\n id={popup.contentId}\n ref={setRef}\n >\n {children}\n </div>,\n document.body,\n );\n});\nconst Root = ({\n children,\n closeOnEscape = true,\n closeOnOutsidePress = true,\n defaultOpen = false,\n onOpenChange,\n open,\n}: PopupProps) => {\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const [triggerElement, setTriggerElement] = useState<HTMLButtonElement | null>(null);\n const contentId = useId();\n const isOpen = open ?? uncontrolledOpen;\n const setOpen = useCallback(\n (next: boolean, restore = true) => {\n if (open === undefined) setUncontrolledOpen(next);\n onOpenChange?.(next);\n if (!next && restore) queueMicrotask(() => triggerElement?.focus());\n },\n [onOpenChange, open, triggerElement],\n );\n useEffect(() => {\n if (!isOpen) return;\n const key = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && closeOnEscape && !event.defaultPrevented) {\n event.preventDefault();\n setOpen(false);\n }\n if (event.key === 'Tab') setOpen(false, false);\n };\n const outside = (event: PointerEvent) => {\n const target = event.target;\n if (\n closeOnOutsidePress &&\n target instanceof Node &&\n !triggerElement?.contains(target) &&\n !document.getElementById(contentId)?.contains(target)\n )\n setOpen(false, false);\n };\n const menuAction = (event: MouseEvent) => {\n if (event.defaultPrevented || !(event.target instanceof Element)) return;\n const item = event.target.closest('[role=\"menuitem\"]');\n if (item && document.getElementById(contentId)?.contains(item)) setOpen(false);\n };\n document.addEventListener('keydown', key);\n document.addEventListener('pointerdown', outside);\n document.addEventListener('click', menuAction);\n return () => {\n document.removeEventListener('keydown', key);\n document.removeEventListener('pointerdown', outside);\n document.removeEventListener('click', menuAction);\n };\n }, [isOpen, closeOnEscape, closeOnOutsidePress, contentId, setOpen, triggerElement]);\n return (\n <PopupContext.Provider\n value={{ contentId, open: isOpen, setOpen, setTriggerElement, triggerElement }}\n >\n {children}\n </PopupContext.Provider>\n );\n};\nTrigger.displayName = 'Popup.Trigger';\nContent.displayName = 'Popup.Content';\nRoot.displayName = 'Popup';\n\nexport default Object.assign(Root, { Trigger, Content });\n"],"mappings":"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"}
@@ -1,4 +1,7 @@
1
1
  import type { PopupListProps } from './Popup.types.js';
2
- declare const PopupList: ({ className, items, trigger }: PopupListProps) => import("react").JSX.Element;
2
+ declare const PopupList: {
3
+ ({ className, items, trigger }: PopupListProps): import("react").JSX.Element;
4
+ displayName: string;
5
+ };
3
6
  export default PopupList;
4
7
  //# sourceMappingURL=PopupList.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PopupList.d.ts","sourceRoot":"","sources":["../../../src/components/popup/PopupList.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,QAAA,MAAM,SAAS,GAAI,+BAA+B,cAAc,gCA2C/D,CAAC;AAEF,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"PopupList.d.ts","sourceRoot":"","sources":["../../../src/components/popup/PopupList.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,QAAA,MAAM,SAAS;oCAAmC,cAAc;;CAgD/D,CAAC;AAIF,eAAe,SAAS,CAAC"}
@@ -1,10 +1,13 @@
1
1
  import ButtonIcon from "../button/button-icon/ButtonIcon.js";
2
2
  import Popup_default from "./Popup.js";
3
- import { useRef } from "react";
3
+ import { useCallback, useRef } from "react";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  //#region src/components/popup/PopupList.tsx
6
6
  var PopupList = ({ className, items, trigger }) => {
7
7
  const itemRefs = useRef([]);
8
+ const handleMenuRef = useCallback((element) => {
9
+ element?.querySelector("[role=\"menuitem\"]")?.focus();
10
+ }, []);
8
11
  const handleKeyDown = (event) => {
9
12
  const index = itemRefs.current.indexOf(document.activeElement);
10
13
  if (index < 0 || items.length === 0) return;
@@ -25,6 +28,7 @@ var PopupList = ({ className, items, trigger }) => {
25
28
  className,
26
29
  children: /* @__PURE__ */ jsx("div", {
27
30
  onKeyDown: handleKeyDown,
31
+ ref: handleMenuRef,
28
32
  role: "menu",
29
33
  tabIndex: -1,
30
34
  children: items.map((item, index) => /* @__PURE__ */ jsxs("button", {
@@ -34,12 +38,14 @@ var PopupList = ({ className, items, trigger }) => {
34
38
  itemRefs.current[index] = element;
35
39
  },
36
40
  role: "menuitem",
41
+ tabIndex: -1,
37
42
  type: "button",
38
43
  children: [/* @__PURE__ */ jsx(ButtonIcon, { icon: item.icon }), /* @__PURE__ */ jsx("span", { children: item.text })]
39
44
  }, `${item.text}-${index}`))
40
45
  })
41
46
  })] });
42
47
  };
48
+ PopupList.displayName = "PopupList";
43
49
  //#endregion
44
50
  export { PopupList as default };
45
51
 
@@ -1 +1 @@
1
- {"version":3,"file":"PopupList.js","names":[],"sources":["../../../src/components/popup/PopupList.tsx"],"sourcesContent":["import { useRef, type KeyboardEvent } from 'react';\n\nimport ButtonIcon from '../button/button-icon/ButtonIcon.js';\nimport Popup from './Popup.js';\nimport type { PopupListProps } from './Popup.types.js';\n\nconst PopupList = ({ className, items, trigger }: PopupListProps) => {\n const itemRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const index = itemRefs.current.indexOf(document.activeElement as HTMLButtonElement);\n if (index < 0 || items.length === 0) return;\n\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n const direction = event.key === 'ArrowDown' ? 1 : -1;\n const nextIndex = (index + direction + items.length) % items.length;\n itemRefs.current[nextIndex]?.focus();\n }\n if (event.key === 'Home' || event.key === 'End') {\n event.preventDefault();\n itemRefs.current[event.key === 'Home' ? 0 : items.length - 1]?.focus();\n }\n };\n\n return (\n <Popup>\n <Popup.Trigger asChild>{trigger}</Popup.Trigger>\n <Popup.Content className={className}>\n <div onKeyDown={handleKeyDown} role=\"menu\" tabIndex={-1}>\n {items.map((item, index) => (\n <button\n className=\"chayns-popup-list__item\"\n key={`${item.text}-${index}`}\n onClick={item.onClick}\n ref={(element) => {\n itemRefs.current[index] = element;\n }}\n role=\"menuitem\"\n type=\"button\"\n >\n <ButtonIcon icon={item.icon} />\n <span>{item.text}</span>\n </button>\n ))}\n </div>\n </Popup.Content>\n </Popup>\n );\n};\n\nexport default PopupList;\n"],"mappings":";;;;;AAMA,IAAM,aAAa,EAAE,WAAW,OAAO,cAA8B;CACnE,MAAM,WAAW,OAAqC,CAAC,CAAC;CAExD,MAAM,iBAAiB,UAAyC;EAC9D,MAAM,QAAQ,SAAS,QAAQ,QAAQ,SAAS,aAAkC;EAClF,IAAI,QAAQ,KAAK,MAAM,WAAW,GAAG;EAErC,IAAI,MAAM,QAAQ,eAAe,MAAM,QAAQ,WAAW;GACxD,MAAM,eAAe;GAErB,MAAM,aAAa,SADD,MAAM,QAAQ,cAAc,IAAI,MACX,MAAM,UAAU,MAAM;GAC7D,SAAS,QAAQ,UAAU,EAAE,MAAM;EACrC;EACA,IAAI,MAAM,QAAQ,UAAU,MAAM,QAAQ,OAAO;GAC/C,MAAM,eAAe;GACrB,SAAS,QAAQ,MAAM,QAAQ,SAAS,IAAI,MAAM,SAAS,EAAE,EAAE,MAAM;EACvE;CACF;CAEA,OACE,qBAAC,eAAD,EAAA,UAAA,CACE,oBAAC,cAAM,SAAP;EAAe,SAAA;EAAS,UAAA;CAAuB,CAAA,GAC/C,oBAAC,cAAM,SAAP;EAA0B;EACxB,UAAA,oBAAC,OAAD;GAAK,WAAW;GAAe,MAAK;GAAO,UAAU;GAClD,UAAA,MAAM,KAAK,MAAM,UAChB,qBAAC,UAAD;IACE,WAAU;IAEV,SAAS,KAAK;IACd,MAAM,YAAY;KAChB,SAAS,QAAQ,SAAS;IAC5B;IACA,MAAK;IACL,MAAK;IARP,UAAA,CAUE,oBAAC,YAAD,EAAY,MAAM,KAAK,KAAO,CAAA,GAC9B,oBAAC,QAAD,EAAA,UAAO,KAAK,KAAW,CAAA,CACjB;GAVD,GAAA,GAAG,KAAK,KAAK,GAAG,OAUf,CACT;EACE,CAAA;CACQ,CAAA,CACV,EAAA,CAAA;AAEX"}
1
+ {"version":3,"file":"PopupList.js","names":[],"sources":["../../../src/components/popup/PopupList.tsx"],"sourcesContent":["import { useCallback, useRef, type KeyboardEvent } from 'react';\n\nimport ButtonIcon from '../button/button-icon/ButtonIcon.js';\nimport Popup from './Popup.js';\nimport type { PopupListProps } from './Popup.types.js';\n\nconst PopupList = ({ className, items, trigger }: PopupListProps) => {\n const itemRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\n const handleMenuRef = useCallback((element: HTMLDivElement | null) => {\n element?.querySelector<HTMLButtonElement>('[role=\"menuitem\"]')?.focus();\n }, []);\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const index = itemRefs.current.indexOf(document.activeElement as HTMLButtonElement);\n if (index < 0 || items.length === 0) return;\n\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n const direction = event.key === 'ArrowDown' ? 1 : -1;\n const nextIndex = (index + direction + items.length) % items.length;\n itemRefs.current[nextIndex]?.focus();\n }\n if (event.key === 'Home' || event.key === 'End') {\n event.preventDefault();\n itemRefs.current[event.key === 'Home' ? 0 : items.length - 1]?.focus();\n }\n };\n\n return (\n <Popup>\n <Popup.Trigger asChild>{trigger}</Popup.Trigger>\n <Popup.Content className={className}>\n <div onKeyDown={handleKeyDown} ref={handleMenuRef} role=\"menu\" tabIndex={-1}>\n {items.map((item, index) => (\n <button\n className=\"chayns-popup-list__item\"\n key={`${item.text}-${index}`}\n onClick={item.onClick}\n ref={(element) => {\n itemRefs.current[index] = element;\n }}\n role=\"menuitem\"\n tabIndex={-1}\n type=\"button\"\n >\n <ButtonIcon icon={item.icon} />\n <span>{item.text}</span>\n </button>\n ))}\n </div>\n </Popup.Content>\n </Popup>\n );\n};\n\nPopupList.displayName = 'PopupList';\n\nexport default PopupList;\n"],"mappings":";;;;;AAMA,IAAM,aAAa,EAAE,WAAW,OAAO,cAA8B;CACnE,MAAM,WAAW,OAAqC,CAAC,CAAC;CAExD,MAAM,gBAAgB,aAAa,YAAmC;EACpE,SAAS,cAAiC,qBAAmB,CAAC,EAAE,MAAM;CACxE,GAAG,CAAC,CAAC;CAEL,MAAM,iBAAiB,UAAyC;EAC9D,MAAM,QAAQ,SAAS,QAAQ,QAAQ,SAAS,aAAkC;EAClF,IAAI,QAAQ,KAAK,MAAM,WAAW,GAAG;EAErC,IAAI,MAAM,QAAQ,eAAe,MAAM,QAAQ,WAAW;GACxD,MAAM,eAAe;GAErB,MAAM,aAAa,SADD,MAAM,QAAQ,cAAc,IAAI,MACX,MAAM,UAAU,MAAM;GAC7D,SAAS,QAAQ,UAAU,EAAE,MAAM;EACrC;EACA,IAAI,MAAM,QAAQ,UAAU,MAAM,QAAQ,OAAO;GAC/C,MAAM,eAAe;GACrB,SAAS,QAAQ,MAAM,QAAQ,SAAS,IAAI,MAAM,SAAS,EAAE,EAAE,MAAM;EACvE;CACF;CAEA,OACE,qBAAC,eAAD,EAAA,UAAA,CACE,oBAAC,cAAM,SAAP;EAAe,SAAA;EAAS,UAAA;CAAuB,CAAA,GAC/C,oBAAC,cAAM,SAAP;EAA0B;EACxB,UAAA,oBAAC,OAAD;GAAK,WAAW;GAAe,KAAK;GAAe,MAAK;GAAO,UAAU;GACtE,UAAA,MAAM,KAAK,MAAM,UAChB,qBAAC,UAAD;IACE,WAAU;IAEV,SAAS,KAAK;IACd,MAAM,YAAY;KAChB,SAAS,QAAQ,SAAS;IAC5B;IACA,MAAK;IACL,UAAU;IACV,MAAK;IATP,UAAA,CAWE,oBAAC,YAAD,EAAY,MAAM,KAAK,KAAO,CAAA,GAC9B,oBAAC,QAAD,EAAA,UAAO,KAAK,KAAW,CAAA,CACjB;GAXD,GAAA,GAAG,KAAK,KAAK,GAAG,OAWf,CACT;EACE,CAAA;CACQ,CAAA,CACV,EAAA,CAAA;AAEX;AAEA,UAAU,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"Progress.d.ts","sourceRoot":"","sources":["../../../src/components/progress/Progress.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAkBzD,QAAA,MAAM,QAAQ,uHA+DZ,CAAC;AAEH,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"Progress.d.ts","sourceRoot":"","sources":["../../../src/components/progress/Progress.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAkBzD,QAAA,MAAM,QAAQ,uHA+DZ,CAAC;AAIH,eAAe,QAAQ,CAAC"}
@@ -44,6 +44,7 @@ var Progress = forwardRef(function Progress({ "aria-label": _ariaLabel, "aria-la
44
44
  })]
45
45
  });
46
46
  });
47
+ Progress.displayName = "Progress";
47
48
  //#endregion
48
49
  export { Progress as default };
49
50
 
@@ -1 +1 @@
1
- {"version":3,"file":"Progress.js","names":[],"sources":["../../../src/components/progress/Progress.tsx"],"sourcesContent":["import { forwardRef, useId } from 'react';\n\nimport type { ProgressProps } from './Progress.types.js';\n\nfunction normalizeValue(value: number) {\n if (Number.isNaN(value)) {\n return 0;\n }\n\n if (value === Infinity) {\n return 100;\n }\n\n if (value === -Infinity) {\n return 0;\n }\n\n return Math.min(100, Math.max(0, Math.round(value)));\n}\n\nconst Progress = forwardRef<HTMLDivElement, ProgressProps>(function Progress(\n {\n 'aria-label': _ariaLabel,\n 'aria-labelledby': _ariaLabelledBy,\n 'aria-valuemax': _ariaValueMax,\n 'aria-valuemin': _ariaValueMin,\n 'aria-valuenow': _ariaValueNow,\n 'aria-valuetext': _ariaValueText,\n children: _children,\n className,\n label,\n role: _role,\n rootProps,\n tabIndex: _tabIndex,\n value,\n ...progressbarProps\n },\n ref,\n) {\n void _ariaLabel;\n void _ariaLabelledBy;\n void _ariaValueMax;\n void _ariaValueMin;\n void _ariaValueNow;\n void _ariaValueText;\n void _children;\n void _role;\n void _tabIndex;\n\n const labelId = useId();\n const normalizedValue = normalizeValue(value);\n const valueText = `${normalizedValue} %`;\n const { className: rootClassName, ...remainingRootProps } = rootProps ?? {};\n const resolvedRootClassName = ['chayns-progress', rootClassName].filter(Boolean).join(' ');\n const resolvedProgressbarClassName = ['chayns-progress__bar', className]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div {...remainingRootProps} className={resolvedRootClassName}>\n <div className=\"chayns-progress__label-row\">\n <span id={labelId}>{label}</span>\n <span aria-hidden=\"true\">{valueText}</span>\n </div>\n <div\n {...progressbarProps}\n aria-labelledby={labelId}\n aria-valuemax={100}\n aria-valuemin={0}\n aria-valuenow={normalizedValue}\n aria-valuetext={valueText}\n className={resolvedProgressbarClassName}\n ref={ref}\n role=\"progressbar\"\n >\n <div\n aria-hidden=\"true\"\n className=\"chayns-progress__fill\"\n style={{ width: `${normalizedValue}%` }}\n />\n </div>\n </div>\n );\n});\n\nexport default Progress;\n"],"mappings":";;;AAIA,SAAS,eAAe,OAAe;CACrC,IAAI,OAAO,MAAM,KAAK,GACpB,OAAO;CAGT,IAAI,UAAU,UACZ,OAAO;CAGT,IAAI,UAAU,WACZ,OAAO;CAGT,OAAO,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC,CAAC;AACrD;AAEA,IAAM,WAAW,WAA0C,SAAS,SAClE,EACE,cAAc,YACd,mBAAmB,iBACnB,iBAAiB,eACjB,iBAAiB,eACjB,iBAAiB,eACjB,kBAAkB,gBAClB,UAAU,WACV,WACA,OACA,MAAM,OACN,WACA,UAAU,WACV,OACA,GAAG,oBAEL,KACA;CAWA,MAAM,UAAU,MAAM;CACtB,MAAM,kBAAkB,eAAe,KAAK;CAC5C,MAAM,YAAY,GAAG,gBAAgB;CACrC,MAAM,EAAE,WAAW,eAAe,GAAG,uBAAuB,aAAa,CAAC;CAC1E,MAAM,wBAAwB,CAAC,mBAAmB,aAAa,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;CACzF,MAAM,+BAA+B,CAAC,wBAAwB,SAAS,CAAC,CACrE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;CAEX,OACE,qBAAC,OAAD;EAAK,GAAI;EAAoB,WAAW;EAAxC,UAAA,CACE,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,oBAAC,QAAD;IAAM,IAAI;IAAU,UAAA;GAAY,CAAA,GAChC,oBAAC,QAAD;IAAM,eAAY;IAAQ,UAAA;GAAgB,CAAA,CACvC;EACL,CAAA,GAAA,oBAAC,OAAD;GACE,GAAI;GACJ,mBAAiB;GACjB,iBAAe;GACf,iBAAe;GACf,iBAAe;GACf,kBAAgB;GAChB,WAAW;GACN;GACL,MAAK;GAEL,UAAA,oBAAC,OAAD;IACE,eAAY;IACZ,WAAU;IACV,OAAO,EAAE,OAAO,GAAG,gBAAgB,GAAG;GACvC,CAAA;EACE,CAAA,CACF;;AAET,CAAC"}
1
+ {"version":3,"file":"Progress.js","names":[],"sources":["../../../src/components/progress/Progress.tsx"],"sourcesContent":["import { forwardRef, useId } from 'react';\n\nimport type { ProgressProps } from './Progress.types.js';\n\nfunction normalizeValue(value: number) {\n if (Number.isNaN(value)) {\n return 0;\n }\n\n if (value === Infinity) {\n return 100;\n }\n\n if (value === -Infinity) {\n return 0;\n }\n\n return Math.min(100, Math.max(0, Math.round(value)));\n}\n\nconst Progress = forwardRef<HTMLDivElement, ProgressProps>(function Progress(\n {\n 'aria-label': _ariaLabel,\n 'aria-labelledby': _ariaLabelledBy,\n 'aria-valuemax': _ariaValueMax,\n 'aria-valuemin': _ariaValueMin,\n 'aria-valuenow': _ariaValueNow,\n 'aria-valuetext': _ariaValueText,\n children: _children,\n className,\n label,\n role: _role,\n rootProps,\n tabIndex: _tabIndex,\n value,\n ...progressbarProps\n },\n ref,\n) {\n void _ariaLabel;\n void _ariaLabelledBy;\n void _ariaValueMax;\n void _ariaValueMin;\n void _ariaValueNow;\n void _ariaValueText;\n void _children;\n void _role;\n void _tabIndex;\n\n const labelId = useId();\n const normalizedValue = normalizeValue(value);\n const valueText = `${normalizedValue} %`;\n const { className: rootClassName, ...remainingRootProps } = rootProps ?? {};\n const resolvedRootClassName = ['chayns-progress', rootClassName].filter(Boolean).join(' ');\n const resolvedProgressbarClassName = ['chayns-progress__bar', className]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div {...remainingRootProps} className={resolvedRootClassName}>\n <div className=\"chayns-progress__label-row\">\n <span id={labelId}>{label}</span>\n <span aria-hidden=\"true\">{valueText}</span>\n </div>\n <div\n {...progressbarProps}\n aria-labelledby={labelId}\n aria-valuemax={100}\n aria-valuemin={0}\n aria-valuenow={normalizedValue}\n aria-valuetext={valueText}\n className={resolvedProgressbarClassName}\n ref={ref}\n role=\"progressbar\"\n >\n <div\n aria-hidden=\"true\"\n className=\"chayns-progress__fill\"\n style={{ width: `${normalizedValue}%` }}\n />\n </div>\n </div>\n );\n});\n\nProgress.displayName = 'Progress';\n\nexport default Progress;\n"],"mappings":";;;AAIA,SAAS,eAAe,OAAe;CACrC,IAAI,OAAO,MAAM,KAAK,GACpB,OAAO;CAGT,IAAI,UAAU,UACZ,OAAO;CAGT,IAAI,UAAU,WACZ,OAAO;CAGT,OAAO,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC,CAAC;AACrD;AAEA,IAAM,WAAW,WAA0C,SAAS,SAClE,EACE,cAAc,YACd,mBAAmB,iBACnB,iBAAiB,eACjB,iBAAiB,eACjB,iBAAiB,eACjB,kBAAkB,gBAClB,UAAU,WACV,WACA,OACA,MAAM,OACN,WACA,UAAU,WACV,OACA,GAAG,oBAEL,KACA;CAWA,MAAM,UAAU,MAAM;CACtB,MAAM,kBAAkB,eAAe,KAAK;CAC5C,MAAM,YAAY,GAAG,gBAAgB;CACrC,MAAM,EAAE,WAAW,eAAe,GAAG,uBAAuB,aAAa,CAAC;CAC1E,MAAM,wBAAwB,CAAC,mBAAmB,aAAa,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;CACzF,MAAM,+BAA+B,CAAC,wBAAwB,SAAS,CAAC,CACrE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;CAEX,OACE,qBAAC,OAAD;EAAK,GAAI;EAAoB,WAAW;EAAxC,UAAA,CACE,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,oBAAC,QAAD;IAAM,IAAI;IAAU,UAAA;GAAY,CAAA,GAChC,oBAAC,QAAD;IAAM,eAAY;IAAQ,UAAA;GAAgB,CAAA,CACvC;EACL,CAAA,GAAA,oBAAC,OAAD;GACE,GAAI;GACJ,mBAAiB;GACjB,iBAAe;GACf,iBAAe;GACf,iBAAe;GACf,kBAAgB;GAChB,WAAW;GACN;GACL,MAAK;GAEL,UAAA,oBAAC,OAAD;IACE,eAAY;IACZ,WAAU;IACV,OAAO,EAAE,OAAO,GAAG,gBAAgB,GAAG;GACvC,CAAA;EACE,CAAA,CACF;;AAET,CAAC;AAED,SAAS,cAAc"}
@@ -2,7 +2,7 @@ import type { ComponentPropsWithRef } from 'react';
2
2
  type ProgressbarAriaProps = 'aria-label' | 'aria-labelledby' | 'aria-valuemax' | 'aria-valuemin' | 'aria-valuenow' | 'aria-valuetext';
3
3
  export interface ProgressProps extends Omit<ComponentPropsWithRef<'div'>, ProgressbarAriaProps | 'children' | 'role' | 'tabIndex'> {
4
4
  label: string;
5
- rootProps?: Omit<ComponentPropsWithRef<'div'>, 'children'>;
5
+ rootProps?: Omit<ComponentPropsWithRef<'div'>, 'children'> & Record<`data-${string}`, unknown>;
6
6
  value: number;
7
7
  children?: never;
8
8
  role?: never;