@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
@@ -0,0 +1,60 @@
1
+ import ButtonIcon from "../button/button-icon/ButtonIcon.js";
2
+ import { stepperValues } from "./stepper-values.js";
3
+ import { forwardRef, useId } from "react";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ //#region src/components/stepper/Stepper.tsx
6
+ var Stepper = forwardRef(function Stepper({ className, decreaseLabel, formatValue, increaseLabel, label, max, min, onClick, onValueChange, precision = 0, step, value, ...rootProps }, ref) {
7
+ const labelId = useId();
8
+ const next = stepperValues(value, min, max, step, precision);
9
+ function handleClick(event) {
10
+ onClick?.(event);
11
+ if (event.defaultPrevented || !(event.target instanceof Element)) return;
12
+ const button = event.target.closest("button[data-stepper-direction]");
13
+ if (!button || !event.currentTarget.contains(button) || button.disabled) return;
14
+ onValueChange(button.dataset.stepperDirection === "decrease" ? next.decrease : next.increase);
15
+ }
16
+ return /* @__PURE__ */ jsxs("div", {
17
+ ...rootProps,
18
+ "aria-labelledby": labelId,
19
+ className: ["chayns-stepper", className].filter(Boolean).join(" "),
20
+ onClick: handleClick,
21
+ ref,
22
+ role: "group",
23
+ children: [/* @__PURE__ */ jsx("span", {
24
+ className: "chayns-stepper__label",
25
+ id: labelId,
26
+ children: label
27
+ }), /* @__PURE__ */ jsxs("div", {
28
+ className: "chayns-stepper__control",
29
+ children: [
30
+ /* @__PURE__ */ jsx("button", {
31
+ "aria-label": decreaseLabel,
32
+ className: "chayns-stepper__button",
33
+ "data-stepper-direction": "decrease",
34
+ disabled: value === min,
35
+ type: "button",
36
+ children: /* @__PURE__ */ jsx(ButtonIcon, { icon: "fa-minus" })
37
+ }),
38
+ /* @__PURE__ */ jsx("span", {
39
+ "aria-atomic": "true",
40
+ "aria-live": "polite",
41
+ className: "chayns-stepper__value",
42
+ children: formatValue(value)
43
+ }),
44
+ /* @__PURE__ */ jsx("button", {
45
+ "aria-label": increaseLabel,
46
+ className: "chayns-stepper__button chayns-stepper__button--increase",
47
+ "data-stepper-direction": "increase",
48
+ disabled: value === max,
49
+ type: "button",
50
+ children: /* @__PURE__ */ jsx(ButtonIcon, { icon: "fa-plus" })
51
+ })
52
+ ]
53
+ })]
54
+ });
55
+ });
56
+ Stepper.displayName = "Stepper";
57
+ //#endregion
58
+ export { Stepper as default };
59
+
60
+ //# sourceMappingURL=Stepper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Stepper.js","names":[],"sources":["../../../src/components/stepper/Stepper.tsx"],"sourcesContent":["import { forwardRef, useId, type MouseEvent } from 'react';\nimport ButtonIcon from '../button/button-icon/ButtonIcon.js';\nimport { stepperValues } from './stepper-values.js';\nimport type { StepperProps } from './Stepper.types.js';\n\nconst Stepper = forwardRef<HTMLDivElement, StepperProps>(function Stepper(\n {\n className,\n decreaseLabel,\n formatValue,\n increaseLabel,\n label,\n max,\n min,\n onClick,\n onValueChange,\n precision = 0,\n step,\n value,\n ...rootProps\n },\n ref,\n) {\n const labelId = useId();\n const next = stepperValues(value, min, max, step, precision);\n function handleClick(event: MouseEvent<HTMLDivElement>) {\n onClick?.(event);\n if (event.defaultPrevented || !(event.target instanceof Element)) return;\n const button = event.target.closest<HTMLButtonElement>('button[data-stepper-direction]');\n if (!button || !event.currentTarget.contains(button) || button.disabled) return;\n onValueChange(button.dataset.stepperDirection === 'decrease' ? next.decrease : next.increase);\n }\n return (\n // Native buttons provide keyboard activation; the group delegates their clicks.\n // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-noninteractive-element-interactions\n <div\n {...rootProps}\n aria-labelledby={labelId}\n className={['chayns-stepper', className].filter(Boolean).join(' ')}\n onClick={handleClick}\n ref={ref}\n role=\"group\"\n >\n <span className=\"chayns-stepper__label\" id={labelId}>\n {label}\n </span>\n <div className=\"chayns-stepper__control\">\n <button\n aria-label={decreaseLabel}\n className=\"chayns-stepper__button\"\n data-stepper-direction=\"decrease\"\n disabled={value === min}\n type=\"button\"\n >\n <ButtonIcon icon=\"fa-minus\" />\n </button>\n <span aria-atomic=\"true\" aria-live=\"polite\" className=\"chayns-stepper__value\">\n {formatValue(value)}\n </span>\n <button\n aria-label={increaseLabel}\n className=\"chayns-stepper__button chayns-stepper__button--increase\"\n data-stepper-direction=\"increase\"\n disabled={value === max}\n type=\"button\"\n >\n <ButtonIcon icon=\"fa-plus\" />\n </button>\n </div>\n </div>\n );\n});\nStepper.displayName = 'Stepper';\nexport default Stepper;\n"],"mappings":";;;;;AAKA,IAAM,UAAU,WAAyC,SAAS,QAChE,EACE,WACA,eACA,aACA,eACA,OACA,KACA,KACA,SACA,eACA,YAAY,GACZ,MACA,OACA,GAAG,aAEL,KACA;CACA,MAAM,UAAU,MAAM;CACtB,MAAM,OAAO,cAAc,OAAO,KAAK,KAAK,MAAM,SAAS;CAC3D,SAAS,YAAY,OAAmC;EACtD,UAAU,KAAK;EACf,IAAI,MAAM,oBAAoB,EAAE,MAAM,kBAAkB,UAAU;EAClE,MAAM,SAAS,MAAM,OAAO,QAA2B,gCAAgC;EACvF,IAAI,CAAC,UAAU,CAAC,MAAM,cAAc,SAAS,MAAM,KAAK,OAAO,UAAU;EACzE,cAAc,OAAO,QAAQ,qBAAqB,aAAa,KAAK,WAAW,KAAK,QAAQ;CAC9F;CACA,OAGE,qBAAC,OAAD;EACE,GAAI;EACJ,mBAAiB;EACjB,WAAW,CAAC,kBAAkB,SAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;EACjE,SAAS;EACJ;EACL,MAAK;EANP,UAAA,CAQE,oBAAC,QAAD;GAAM,WAAU;GAAwB,IAAI;GACzC,UAAA;EACG,CAAA,GACN,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACE,oBAAC,UAAD;KACE,cAAY;KACZ,WAAU;KACV,0BAAuB;KACvB,UAAU,UAAU;KACpB,MAAK;KAEL,UAAA,oBAAC,YAAD,EAAY,MAAK,WAAY,CAAA;IACvB,CAAA;IACR,oBAAC,QAAD;KAAM,eAAY;KAAO,aAAU;KAAS,WAAU;KACnD,UAAA,YAAY,KAAK;IACd,CAAA;IACN,oBAAC,UAAD;KACE,cAAY;KACZ,WAAU;KACV,0BAAuB;KACvB,UAAU,UAAU;KACpB,MAAK;KAEL,UAAA,oBAAC,YAAD,EAAY,MAAK,UAAW,CAAA;IACtB,CAAA;GACL;EACF,CAAA,CAAA;;AAET,CAAC;AACD,QAAQ,cAAc"}
@@ -0,0 +1,27 @@
1
+ import type { ComponentPropsWithRef } from 'react';
2
+ /** Number of decimal places; omitted precision uses integers. */
3
+ export declare enum StepperPrecisions {
4
+ Zero = 0,
5
+ One = 1,
6
+ Two = 2,
7
+ Three = 3,
8
+ Four = 4,
9
+ Five = 5,
10
+ Six = 6
11
+ }
12
+ export declare const STEPPER_PRECISIONS: readonly [0, 1, 2, 3, 4, 5, 6];
13
+ export type StepperPrecision = (typeof STEPPER_PRECISIONS)[number];
14
+ /** Controlled exact quantity; native div props/ref address the labelled group. */
15
+ export interface StepperProps extends Omit<ComponentPropsWithRef<'div'>, 'children' | 'role' | 'aria-label' | 'aria-labelledby'> {
16
+ value: number;
17
+ min: number;
18
+ max: number;
19
+ step: number;
20
+ precision?: StepperPrecision;
21
+ onValueChange: (value: number) => void;
22
+ label: string;
23
+ decreaseLabel: string;
24
+ increaseLabel: string;
25
+ formatValue: (value: number) => string;
26
+ }
27
+ //# sourceMappingURL=Stepper.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Stepper.types.d.ts","sourceRoot":"","sources":["../../../src/components/stepper/Stepper.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,OAAO,CAAC;AAEnD,iEAAiE;AACjE,oBAAY,iBAAiB;IAC3B,IAAI,IAAI;IACR,GAAG,IAAI;IACP,GAAG,IAAI;IACP,KAAK,IAAI;IACT,IAAI,IAAI;IACR,IAAI,IAAI;IACR,GAAG,IAAI;CACR;AACD,eAAO,MAAM,kBAAkB,gCAAiC,CAAC;AACjE,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnE,kFAAkF;AAClF,MAAM,WAAW,YAAa,SAAQ,IAAI,CACxC,qBAAqB,CAAC,KAAK,CAAC,EAC5B,UAAU,GAAG,MAAM,GAAG,YAAY,GAAG,iBAAiB,CACvD;IACC,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CACxC"}
@@ -0,0 +1,25 @@
1
+ //#region src/components/stepper/Stepper.types.ts
2
+ /** Number of decimal places; omitted precision uses integers. */
3
+ var StepperPrecisions = /* @__PURE__ */ function(StepperPrecisions) {
4
+ StepperPrecisions[StepperPrecisions["Zero"] = 0] = "Zero";
5
+ StepperPrecisions[StepperPrecisions["One"] = 1] = "One";
6
+ StepperPrecisions[StepperPrecisions["Two"] = 2] = "Two";
7
+ StepperPrecisions[StepperPrecisions["Three"] = 3] = "Three";
8
+ StepperPrecisions[StepperPrecisions["Four"] = 4] = "Four";
9
+ StepperPrecisions[StepperPrecisions["Five"] = 5] = "Five";
10
+ StepperPrecisions[StepperPrecisions["Six"] = 6] = "Six";
11
+ return StepperPrecisions;
12
+ }({});
13
+ var STEPPER_PRECISIONS = [
14
+ 0,
15
+ 1,
16
+ 2,
17
+ 3,
18
+ 4,
19
+ 5,
20
+ 6
21
+ ];
22
+ //#endregion
23
+ export { STEPPER_PRECISIONS, StepperPrecisions };
24
+
25
+ //# sourceMappingURL=Stepper.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Stepper.types.js","names":[],"sources":["../../../src/components/stepper/Stepper.types.ts"],"sourcesContent":["import type { ComponentPropsWithRef } from 'react';\n\n/** Number of decimal places; omitted precision uses integers. */\nexport enum StepperPrecisions {\n Zero = 0,\n One = 1,\n Two = 2,\n Three = 3,\n Four = 4,\n Five = 5,\n Six = 6,\n}\nexport const STEPPER_PRECISIONS = [0, 1, 2, 3, 4, 5, 6] as const;\nexport type StepperPrecision = (typeof STEPPER_PRECISIONS)[number];\n\n/** Controlled exact quantity; native div props/ref address the labelled group. */\nexport interface StepperProps extends Omit<\n ComponentPropsWithRef<'div'>,\n 'children' | 'role' | 'aria-label' | 'aria-labelledby'\n> {\n value: number;\n min: number;\n max: number;\n step: number;\n precision?: StepperPrecision;\n onValueChange: (value: number) => void;\n label: string;\n decreaseLabel: string;\n increaseLabel: string;\n formatValue: (value: number) => string;\n}\n"],"mappings":";;AAGA,IAAY,oBAAL,yBAAA,mBAAA;CACL,kBAAA,kBAAA,UAAA,KAAA;CACA,kBAAA,kBAAA,SAAA,KAAA;CACA,kBAAA,kBAAA,SAAA,KAAA;CACA,kBAAA,kBAAA,WAAA,KAAA;CACA,kBAAA,kBAAA,UAAA,KAAA;CACA,kBAAA,kBAAA,UAAA,KAAA;CACA,kBAAA,kBAAA,SAAA,KAAA;;AACF,EAAA,CAAA,CAAA;AACA,IAAa,qBAAqB;CAAC;CAAG;CAAG;CAAG;CAAG;CAAG;CAAG;AAAC"}
@@ -0,0 +1,6 @@
1
+ /** Validate exact decimal values before doing bounded integer arithmetic. */
2
+ export declare function stepperValues(value: number, min: number, max: number, step: number, precision: number): {
3
+ decrease: number;
4
+ increase: number;
5
+ };
6
+ //# sourceMappingURL=stepper-values.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stepper-values.d.ts","sourceRoot":"","sources":["../../../src/components/stepper/stepper-values.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM;;;EA6BlB"}
@@ -0,0 +1,26 @@
1
+ //#region src/components/stepper/stepper-values.ts
2
+ /** Validate exact decimal values before doing bounded integer arithmetic. */
3
+ function stepperValues(value, min, max, step, precision) {
4
+ if (!Number.isInteger(precision) || precision < 0 || precision > 6) throw new Error("Stepper precision must be an integer within 0..6.");
5
+ const scale = 10 ** precision;
6
+ const [current, lower, upper, increment] = [
7
+ value,
8
+ min,
9
+ max,
10
+ step
11
+ ].map((number) => {
12
+ const integer = Math.round(number * scale);
13
+ if (!Number.isSafeInteger(integer) || integer / scale !== number) throw new Error("Stepper values must be exact safe integers at the specified precision.");
14
+ return integer;
15
+ });
16
+ const range = upper - lower;
17
+ if (increment <= 0 || range < 0 || !Number.isSafeInteger(range) || current < lower || current > upper || range % increment !== 0 || (current - lower) % increment !== 0) throw new Error("Stepper requires ordered bounds and value/max aligned to a positive min-based step.");
18
+ return {
19
+ decrease: current === lower ? value : (current - increment) / scale,
20
+ increase: current === upper ? value : (current + increment) / scale
21
+ };
22
+ }
23
+ //#endregion
24
+ export { stepperValues };
25
+
26
+ //# sourceMappingURL=stepper-values.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stepper-values.js","names":[],"sources":["../../../src/components/stepper/stepper-values.ts"],"sourcesContent":["/** Validate exact decimal values before doing bounded integer arithmetic. */\nexport function stepperValues(\n value: number,\n min: number,\n max: number,\n step: number,\n precision: number,\n) {\n if (!Number.isInteger(precision) || precision < 0 || precision > 6)\n throw new Error('Stepper precision must be an integer within 0..6.');\n const scale = 10 ** precision;\n const integers = [value, min, max, step].map((number) => {\n const integer = Math.round(number * scale);\n if (!Number.isSafeInteger(integer) || integer / scale !== number)\n throw new Error('Stepper values must be exact safe integers at the specified precision.');\n return integer;\n });\n const [current, lower, upper, increment] = integers as [number, number, number, number];\n const range = upper - lower;\n if (\n increment <= 0 ||\n range < 0 ||\n !Number.isSafeInteger(range) ||\n current < lower ||\n current > upper ||\n range % increment !== 0 ||\n (current - lower) % increment !== 0\n )\n throw new Error(\n 'Stepper requires ordered bounds and value/max aligned to a positive min-based step.',\n );\n return {\n decrease: current === lower ? value : (current - increment) / scale,\n increase: current === upper ? value : (current + increment) / scale,\n };\n}\n"],"mappings":";;AACA,SAAgB,cACd,OACA,KACA,KACA,MACA,WACA;CACA,IAAI,CAAC,OAAO,UAAU,SAAS,KAAK,YAAY,KAAK,YAAY,GAC/D,MAAM,IAAI,MAAM,mDAAmD;CACrE,MAAM,QAAQ,MAAM;CAOpB,MAAM,CAAC,SAAS,OAAO,OAAO,aANb;EAAC;EAAO;EAAK;EAAK;CAAI,CAAC,CAAC,KAAK,WAAW;EACvD,MAAM,UAAU,KAAK,MAAM,SAAS,KAAK;EACzC,IAAI,CAAC,OAAO,cAAc,OAAO,KAAK,UAAU,UAAU,QACxD,MAAM,IAAI,MAAM,wEAAwE;EAC1F,OAAO;CACT,CAC2C;CAC3C,MAAM,QAAQ,QAAQ;CACtB,IACE,aAAa,KACb,QAAQ,KACR,CAAC,OAAO,cAAc,KAAK,KAC3B,UAAU,SACV,UAAU,SACV,QAAQ,cAAc,MACrB,UAAU,SAAS,cAAc,GAElC,MAAM,IAAI,MACR,qFACF;CACF,OAAO;EACL,UAAU,YAAY,QAAQ,SAAS,UAAU,aAAa;EAC9D,UAAU,YAAY,QAAQ,SAAS,UAAU,aAAa;CAChE;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"Switch.d.ts","sourceRoot":"","sources":["../../../src/components/switch/Switch.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,QAAA,MAAM,MAAM,uHAoBV,CAAC;AAEH,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"Switch.d.ts","sourceRoot":"","sources":["../../../src/components/switch/Switch.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,QAAA,MAAM,MAAM,uHAoBV,CAAC;AAIH,eAAe,MAAM,CAAC"}
@@ -30,6 +30,7 @@ var Switch = forwardRef(function Switch({ children, className, description, ...i
30
30
  ]
31
31
  });
32
32
  });
33
+ Switch.displayName = "Switch";
33
34
  //#endregion
34
35
  export { Switch as default };
35
36
 
@@ -1 +1 @@
1
- {"version":3,"file":"Switch.js","names":[],"sources":["../../../src/components/switch/Switch.tsx"],"sourcesContent":["import { forwardRef } from 'react';\n\nimport type { SwitchProps } from './Switch.types.js';\n\nconst Switch = forwardRef<HTMLInputElement, SwitchProps>(function Switch(\n { children, className, description, ...inputProps },\n ref,\n) {\n const inputClassName = ['chayns-switch__input', className].filter(Boolean).join(' ');\n\n return (\n <label className=\"chayns-switch\">\n <span className=\"chayns-switch__content\">\n <span className=\"chayns-switch__label\">{children}</span>\n {description !== undefined ? (\n <span className=\"chayns-switch__description\">{description}</span>\n ) : null}\n </span>\n <input {...inputProps} className={inputClassName} ref={ref} type=\"checkbox\" />\n <span aria-hidden=\"true\" className=\"chayns-switch__control\">\n <span className=\"chayns-switch__knob\" />\n </span>\n </label>\n );\n});\n\nexport default Switch;\n"],"mappings":";;;AAIA,IAAM,SAAS,WAA0C,SAAS,OAChE,EAAE,UAAU,WAAW,aAAa,GAAG,cACvC,KACA;CACA,MAAM,iBAAiB,CAAC,wBAAwB,SAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;CAEnF,OACE,qBAAC,SAAD;EAAO,WAAU;EAAjB,UAAA;GACE,qBAAC,QAAD;IAAM,WAAU;IAAhB,UAAA,CACE,oBAAC,QAAD;KAAM,WAAU;KAAwB;IAAe,CAAA,GACtD,gBAAgB,KAAA,IACf,oBAAC,QAAD;KAAM,WAAU;KAA8B,UAAA;IAAkB,CAAA,IAC9D,IACA;;GACN,oBAAC,SAAD;IAAO,GAAI;IAAY,WAAW;IAAqB;IAAK,MAAK;GAAY,CAAA;GAC7E,oBAAC,QAAD;IAAM,eAAY;IAAO,WAAU;IACjC,UAAA,oBAAC,QAAD,EAAM,WAAU,sBAAuB,CAAA;GACnC,CAAA;EACD;;AAEX,CAAC"}
1
+ {"version":3,"file":"Switch.js","names":[],"sources":["../../../src/components/switch/Switch.tsx"],"sourcesContent":["import { forwardRef } from 'react';\n\nimport type { SwitchProps } from './Switch.types.js';\n\nconst Switch = forwardRef<HTMLInputElement, SwitchProps>(function Switch(\n { children, className, description, ...inputProps },\n ref,\n) {\n const inputClassName = ['chayns-switch__input', className].filter(Boolean).join(' ');\n\n return (\n <label className=\"chayns-switch\">\n <span className=\"chayns-switch__content\">\n <span className=\"chayns-switch__label\">{children}</span>\n {description !== undefined ? (\n <span className=\"chayns-switch__description\">{description}</span>\n ) : null}\n </span>\n <input {...inputProps} className={inputClassName} ref={ref} type=\"checkbox\" />\n <span aria-hidden=\"true\" className=\"chayns-switch__control\">\n <span className=\"chayns-switch__knob\" />\n </span>\n </label>\n );\n});\n\nSwitch.displayName = 'Switch';\n\nexport default Switch;\n"],"mappings":";;;AAIA,IAAM,SAAS,WAA0C,SAAS,OAChE,EAAE,UAAU,WAAW,aAAa,GAAG,cACvC,KACA;CACA,MAAM,iBAAiB,CAAC,wBAAwB,SAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;CAEnF,OACE,qBAAC,SAAD;EAAO,WAAU;EAAjB,UAAA;GACE,qBAAC,QAAD;IAAM,WAAU;IAAhB,UAAA,CACE,oBAAC,QAAD;KAAM,WAAU;KAAwB;IAAe,CAAA,GACtD,gBAAgB,KAAA,IACf,oBAAC,QAAD;KAAM,WAAU;KAA8B,UAAA;IAAkB,CAAA,IAC9D,IACA;;GACN,oBAAC,SAAD;IAAO,GAAI;IAAY,WAAW;IAAqB;IAAK,MAAK;GAAY,CAAA;GAC7E,oBAAC,QAAD;IAAM,eAAY;IAAO,WAAU;IACjC,UAAA,oBAAC,QAAD,EAAM,WAAU,sBAAuB,CAAA;GACnC,CAAA;EACD;;AAEX,CAAC;AAED,OAAO,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"TextArea.d.ts","sourceRoot":"","sources":["../../../src/components/text-area/TextArea.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,QAAA,MAAM,QAAQ,4HA2CZ,CAAC;AAEH,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"TextArea.d.ts","sourceRoot":"","sources":["../../../src/components/text-area/TextArea.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,QAAA,MAAM,QAAQ,4HA2CZ,CAAC;AAIH,eAAe,QAAQ,CAAC"}
@@ -40,6 +40,7 @@ var TextArea = forwardRef(function TextArea({ className, counter, error, helpTex
40
40
  ]
41
41
  });
42
42
  });
43
+ TextArea.displayName = "TextArea";
43
44
  //#endregion
44
45
  export { TextArea as default };
45
46
 
@@ -1 +1 @@
1
- {"version":3,"file":"TextArea.js","names":[],"sources":["../../../src/components/text-area/TextArea.tsx"],"sourcesContent":["import { forwardRef, useId } from 'react';\n\nimport type { TextAreaProps } from './TextArea.types.js';\n\nconst TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(function TextArea(\n { className, counter, error, helpText, id, placeholder, ...textareaProps },\n ref,\n) {\n const generatedId = useId();\n const textareaId = id ?? generatedId;\n const hasError = error !== undefined;\n const helpId = helpText !== undefined ? `${textareaId}-help` : undefined;\n const errorId = hasError ? `${textareaId}-error` : undefined;\n const describedBy = [helpId, errorId].filter(Boolean).join(' ') || undefined;\n const textareaClassName = ['chayns-text-area__input', className].filter(Boolean).join(' ');\n\n return (\n <div className={`chayns-text-area${hasError ? ' chayns-text-area--error' : ''}`}>\n <textarea\n {...textareaProps}\n aria-describedby={describedBy}\n aria-invalid={hasError || undefined}\n className={textareaClassName}\n id={textareaId}\n placeholder={placeholder === undefined ? undefined : ' '}\n ref={ref}\n />\n {placeholder !== undefined ? (\n <label className=\"chayns-text-area__label\" htmlFor={textareaId}>\n {placeholder}\n </label>\n ) : null}\n {helpText !== undefined || hasError || counter !== undefined ? (\n <div className=\"chayns-text-area__help\">\n <div>\n {helpText !== undefined ? <div id={helpId}>{helpText}</div> : null}\n {hasError ? (\n <div className=\"chayns-text-area__error\" id={errorId}>\n {error}\n </div>\n ) : null}\n </div>\n {counter !== undefined ? <div>{counter}</div> : null}\n </div>\n ) : null}\n </div>\n );\n});\n\nexport default TextArea;\n"],"mappings":";;;AAIA,IAAM,WAAW,WAA+C,SAAS,SACvE,EAAE,WAAW,SAAS,OAAO,UAAU,IAAI,aAAa,GAAG,iBAC3D,KACA;CACA,MAAM,cAAc,MAAM;CAC1B,MAAM,aAAa,MAAM;CACzB,MAAM,WAAW,UAAU,KAAA;CAC3B,MAAM,SAAS,aAAa,KAAA,IAAY,GAAG,WAAW,SAAS,KAAA;CAC/D,MAAM,UAAU,WAAW,GAAG,WAAW,UAAU,KAAA;CACnD,MAAM,cAAc,CAAC,QAAQ,OAAO,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,KAAK,KAAA;CACnE,MAAM,oBAAoB,CAAC,2BAA2B,SAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;CAEzF,OACE,qBAAC,OAAD;EAAK,WAAW,mBAAmB,WAAW,6BAA6B;EAA3E,UAAA;GACE,oBAAC,YAAD;IACE,GAAI;IACJ,oBAAkB;IAClB,gBAAc,YAAY,KAAA;IAC1B,WAAW;IACX,IAAI;IACJ,aAAa,gBAAgB,KAAA,IAAY,KAAA,IAAY;IAChD;GACN,CAAA;GACA,gBAAgB,KAAA,IACf,oBAAC,SAAD;IAAO,WAAU;IAA0B,SAAS;IACjD,UAAA;GACI,CAAA,IACL;GACH,aAAa,KAAA,KAAa,YAAY,YAAY,KAAA,IACjD,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,qBAAC,OAAD,EAAA,UAAA,CACG,aAAa,KAAA,IAAY,oBAAC,OAAD;KAAK,IAAI;KAAS,UAAA;IAAc,CAAA,IAAI,MAC7D,WACC,oBAAC,OAAD;KAAK,WAAU;KAA0B,IAAI;KAC1C,UAAA;IACE,CAAA,IACH,IACD,EAAA,CAAA,GACJ,YAAY,KAAA,IAAY,oBAAC,OAAD,EAAA,UAAM,QAAa,CAAA,IAAI,IAC7C;GACH,CAAA,IAAA;EACD;;AAET,CAAC"}
1
+ {"version":3,"file":"TextArea.js","names":[],"sources":["../../../src/components/text-area/TextArea.tsx"],"sourcesContent":["import { forwardRef, useId } from 'react';\n\nimport type { TextAreaProps } from './TextArea.types.js';\n\nconst TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(function TextArea(\n { className, counter, error, helpText, id, placeholder, ...textareaProps },\n ref,\n) {\n const generatedId = useId();\n const textareaId = id ?? generatedId;\n const hasError = error !== undefined;\n const helpId = helpText !== undefined ? `${textareaId}-help` : undefined;\n const errorId = hasError ? `${textareaId}-error` : undefined;\n const describedBy = [helpId, errorId].filter(Boolean).join(' ') || undefined;\n const textareaClassName = ['chayns-text-area__input', className].filter(Boolean).join(' ');\n\n return (\n <div className={`chayns-text-area${hasError ? ' chayns-text-area--error' : ''}`}>\n <textarea\n {...textareaProps}\n aria-describedby={describedBy}\n aria-invalid={hasError || undefined}\n className={textareaClassName}\n id={textareaId}\n placeholder={placeholder === undefined ? undefined : ' '}\n ref={ref}\n />\n {placeholder !== undefined ? (\n <label className=\"chayns-text-area__label\" htmlFor={textareaId}>\n {placeholder}\n </label>\n ) : null}\n {helpText !== undefined || hasError || counter !== undefined ? (\n <div className=\"chayns-text-area__help\">\n <div>\n {helpText !== undefined ? <div id={helpId}>{helpText}</div> : null}\n {hasError ? (\n <div className=\"chayns-text-area__error\" id={errorId}>\n {error}\n </div>\n ) : null}\n </div>\n {counter !== undefined ? <div>{counter}</div> : null}\n </div>\n ) : null}\n </div>\n );\n});\n\nTextArea.displayName = 'TextArea';\n\nexport default TextArea;\n"],"mappings":";;;AAIA,IAAM,WAAW,WAA+C,SAAS,SACvE,EAAE,WAAW,SAAS,OAAO,UAAU,IAAI,aAAa,GAAG,iBAC3D,KACA;CACA,MAAM,cAAc,MAAM;CAC1B,MAAM,aAAa,MAAM;CACzB,MAAM,WAAW,UAAU,KAAA;CAC3B,MAAM,SAAS,aAAa,KAAA,IAAY,GAAG,WAAW,SAAS,KAAA;CAC/D,MAAM,UAAU,WAAW,GAAG,WAAW,UAAU,KAAA;CACnD,MAAM,cAAc,CAAC,QAAQ,OAAO,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,KAAK,KAAA;CACnE,MAAM,oBAAoB,CAAC,2BAA2B,SAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;CAEzF,OACE,qBAAC,OAAD;EAAK,WAAW,mBAAmB,WAAW,6BAA6B;EAA3E,UAAA;GACE,oBAAC,YAAD;IACE,GAAI;IACJ,oBAAkB;IAClB,gBAAc,YAAY,KAAA;IAC1B,WAAW;IACX,IAAI;IACJ,aAAa,gBAAgB,KAAA,IAAY,KAAA,IAAY;IAChD;GACN,CAAA;GACA,gBAAgB,KAAA,IACf,oBAAC,SAAD;IAAO,WAAU;IAA0B,SAAS;IACjD,UAAA;GACI,CAAA,IACL;GACH,aAAa,KAAA,KAAa,YAAY,YAAY,KAAA,IACjD,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,qBAAC,OAAD,EAAA,UAAA,CACG,aAAa,KAAA,IAAY,oBAAC,OAAD;KAAK,IAAI;KAAS,UAAA;IAAc,CAAA,IAAI,MAC7D,WACC,oBAAC,OAAD;KAAK,WAAU;KAA0B,IAAI;KAC1C,UAAA;IACE,CAAA,IACH,IACD,EAAA,CAAA,GACJ,YAAY,KAAA,IAAY,oBAAC,OAAD,EAAA,UAAM,QAAa,CAAA,IAAI,IAC7C;GACH,CAAA,IAAA;EACD;;AAET,CAAC;AAED,SAAS,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"TextField.d.ts","sourceRoot":"","sources":["../../../src/components/text-field/TextField.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,QAAA,MAAM,SAAS,0HA2Cb,CAAC;AAEH,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"TextField.d.ts","sourceRoot":"","sources":["../../../src/components/text-field/TextField.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,QAAA,MAAM,SAAS,0HA2Cb,CAAC;AAIH,eAAe,SAAS,CAAC"}
@@ -40,6 +40,7 @@ var TextField = forwardRef(function TextField({ className, counter, error, helpT
40
40
  ]
41
41
  });
42
42
  });
43
+ TextField.displayName = "TextField";
43
44
  //#endregion
44
45
  export { TextField as default };
45
46
 
@@ -1 +1 @@
1
- {"version":3,"file":"TextField.js","names":[],"sources":["../../../src/components/text-field/TextField.tsx"],"sourcesContent":["import { forwardRef, useId } from 'react';\n\nimport type { TextFieldProps } from './TextField.types.js';\n\nconst TextField = forwardRef<HTMLInputElement, TextFieldProps>(function TextField(\n { className, counter, error, helpText, id, placeholder, ...inputProps },\n ref,\n) {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n const hasError = error !== undefined;\n const helpId = helpText !== undefined ? `${inputId}-help` : undefined;\n const errorId = hasError ? `${inputId}-error` : undefined;\n const describedBy = [helpId, errorId].filter(Boolean).join(' ') || undefined;\n const inputClassName = ['chayns-text-field__input', className].filter(Boolean).join(' ');\n\n return (\n <div className={`chayns-text-field${hasError ? ' chayns-text-field--error' : ''}`}>\n <input\n {...inputProps}\n aria-describedby={describedBy}\n aria-invalid={hasError || undefined}\n className={inputClassName}\n id={inputId}\n placeholder={placeholder === undefined ? undefined : ' '}\n ref={ref}\n />\n {placeholder !== undefined ? (\n <label className=\"chayns-text-field__label\" htmlFor={inputId}>\n {placeholder}\n </label>\n ) : null}\n {helpText !== undefined || hasError || counter !== undefined ? (\n <div className=\"chayns-text-field__help\">\n <div>\n {helpText !== undefined ? <div id={helpId}>{helpText}</div> : null}\n {hasError ? (\n <div className=\"chayns-text-field__error\" id={errorId}>\n {error}\n </div>\n ) : null}\n </div>\n {counter !== undefined ? <div>{counter}</div> : null}\n </div>\n ) : null}\n </div>\n );\n});\n\nexport default TextField;\n"],"mappings":";;;AAIA,IAAM,YAAY,WAA6C,SAAS,UACtE,EAAE,WAAW,SAAS,OAAO,UAAU,IAAI,aAAa,GAAG,cAC3D,KACA;CACA,MAAM,cAAc,MAAM;CAC1B,MAAM,UAAU,MAAM;CACtB,MAAM,WAAW,UAAU,KAAA;CAC3B,MAAM,SAAS,aAAa,KAAA,IAAY,GAAG,QAAQ,SAAS,KAAA;CAC5D,MAAM,UAAU,WAAW,GAAG,QAAQ,UAAU,KAAA;CAChD,MAAM,cAAc,CAAC,QAAQ,OAAO,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,KAAK,KAAA;CACnE,MAAM,iBAAiB,CAAC,4BAA4B,SAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;CAEvF,OACE,qBAAC,OAAD;EAAK,WAAW,oBAAoB,WAAW,8BAA8B;EAA7E,UAAA;GACE,oBAAC,SAAD;IACE,GAAI;IACJ,oBAAkB;IAClB,gBAAc,YAAY,KAAA;IAC1B,WAAW;IACX,IAAI;IACJ,aAAa,gBAAgB,KAAA,IAAY,KAAA,IAAY;IAChD;GACN,CAAA;GACA,gBAAgB,KAAA,IACf,oBAAC,SAAD;IAAO,WAAU;IAA2B,SAAS;IAClD,UAAA;GACI,CAAA,IACL;GACH,aAAa,KAAA,KAAa,YAAY,YAAY,KAAA,IACjD,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,qBAAC,OAAD,EAAA,UAAA,CACG,aAAa,KAAA,IAAY,oBAAC,OAAD;KAAK,IAAI;KAAS,UAAA;IAAc,CAAA,IAAI,MAC7D,WACC,oBAAC,OAAD;KAAK,WAAU;KAA2B,IAAI;KAC3C,UAAA;IACE,CAAA,IACH,IACD,EAAA,CAAA,GACJ,YAAY,KAAA,IAAY,oBAAC,OAAD,EAAA,UAAM,QAAa,CAAA,IAAI,IAC7C;GACH,CAAA,IAAA;EACD;;AAET,CAAC"}
1
+ {"version":3,"file":"TextField.js","names":[],"sources":["../../../src/components/text-field/TextField.tsx"],"sourcesContent":["import { forwardRef, useId } from 'react';\n\nimport type { TextFieldProps } from './TextField.types.js';\n\nconst TextField = forwardRef<HTMLInputElement, TextFieldProps>(function TextField(\n { className, counter, error, helpText, id, placeholder, ...inputProps },\n ref,\n) {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n const hasError = error !== undefined;\n const helpId = helpText !== undefined ? `${inputId}-help` : undefined;\n const errorId = hasError ? `${inputId}-error` : undefined;\n const describedBy = [helpId, errorId].filter(Boolean).join(' ') || undefined;\n const inputClassName = ['chayns-text-field__input', className].filter(Boolean).join(' ');\n\n return (\n <div className={`chayns-text-field${hasError ? ' chayns-text-field--error' : ''}`}>\n <input\n {...inputProps}\n aria-describedby={describedBy}\n aria-invalid={hasError || undefined}\n className={inputClassName}\n id={inputId}\n placeholder={placeholder === undefined ? undefined : ' '}\n ref={ref}\n />\n {placeholder !== undefined ? (\n <label className=\"chayns-text-field__label\" htmlFor={inputId}>\n {placeholder}\n </label>\n ) : null}\n {helpText !== undefined || hasError || counter !== undefined ? (\n <div className=\"chayns-text-field__help\">\n <div>\n {helpText !== undefined ? <div id={helpId}>{helpText}</div> : null}\n {hasError ? (\n <div className=\"chayns-text-field__error\" id={errorId}>\n {error}\n </div>\n ) : null}\n </div>\n {counter !== undefined ? <div>{counter}</div> : null}\n </div>\n ) : null}\n </div>\n );\n});\n\nTextField.displayName = 'TextField';\n\nexport default TextField;\n"],"mappings":";;;AAIA,IAAM,YAAY,WAA6C,SAAS,UACtE,EAAE,WAAW,SAAS,OAAO,UAAU,IAAI,aAAa,GAAG,cAC3D,KACA;CACA,MAAM,cAAc,MAAM;CAC1B,MAAM,UAAU,MAAM;CACtB,MAAM,WAAW,UAAU,KAAA;CAC3B,MAAM,SAAS,aAAa,KAAA,IAAY,GAAG,QAAQ,SAAS,KAAA;CAC5D,MAAM,UAAU,WAAW,GAAG,QAAQ,UAAU,KAAA;CAChD,MAAM,cAAc,CAAC,QAAQ,OAAO,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,KAAK,KAAA;CACnE,MAAM,iBAAiB,CAAC,4BAA4B,SAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;CAEvF,OACE,qBAAC,OAAD;EAAK,WAAW,oBAAoB,WAAW,8BAA8B;EAA7E,UAAA;GACE,oBAAC,SAAD;IACE,GAAI;IACJ,oBAAkB;IAClB,gBAAc,YAAY,KAAA;IAC1B,WAAW;IACX,IAAI;IACJ,aAAa,gBAAgB,KAAA,IAAY,KAAA,IAAY;IAChD;GACN,CAAA;GACA,gBAAgB,KAAA,IACf,oBAAC,SAAD;IAAO,WAAU;IAA2B,SAAS;IAClD,UAAA;GACI,CAAA,IACL;GACH,aAAa,KAAA,KAAa,YAAY,YAAY,KAAA,IACjD,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,qBAAC,OAAD,EAAA,UAAA,CACG,aAAa,KAAA,IAAY,oBAAC,OAAD;KAAK,IAAI;KAAS,UAAA;IAAc,CAAA,IAAI,MAC7D,WACC,oBAAC,OAAD;KAAK,WAAU;KAA2B,IAAI;KAC3C,UAAA;IACE,CAAA,IACH,IACD,EAAA,CAAA,GACJ,YAAY,KAAA,IAAY,oBAAC,OAAD,EAAA,UAAM,QAAa,CAAA,IAAI,IAC7C;GACH,CAAA,IAAA;EACD;;AAET,CAAC;AAED,UAAU,cAAc"}
@@ -0,0 +1,4 @@
1
+ import type { TooltipProps } from './Tooltip.types.js';
2
+ declare const Tooltip: import("react").ForwardRefExoticComponent<TooltipProps & import("react").RefAttributes<HTMLElement>>;
3
+ export default Tooltip;
4
+ //# sourceMappingURL=Tooltip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tooltip.d.ts","sourceRoot":"","sources":["../../../src/components/tooltip/Tooltip.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,YAAY,EAAuB,MAAM,oBAAoB,CAAC;AAK5E,QAAA,MAAM,OAAO,sGAiFX,CAAC;AAEH,eAAe,OAAO,CAAC"}
@@ -0,0 +1,75 @@
1
+ import { composeNativeRefs } from "../../utils/native-ref.js";
2
+ import { useOverlayPosition } from "../../hooks/useOverlayPosition.js";
3
+ import { useTooltipInteraction } from "./hooks/useTooltipInteraction.js";
4
+ import { tooltipTriggerProps } from "./tooltip-trigger-props.js";
5
+ import { Fragment, cloneElement, forwardRef, isValidElement, useId, useMemo, useRef, useState } from "react";
6
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
7
+ import { createPortal } from "react-dom";
8
+ //#region src/components/tooltip/Tooltip.tsx
9
+ var ANCHOR_GAP = 9;
10
+ var Tooltip = forwardRef(function Tooltip({ children, content, ...nativeProps }, ref) {
11
+ const id = useId();
12
+ const [trigger, setTrigger] = useState(null);
13
+ const surface = useRef(null);
14
+ const interaction = useTooltipInteraction(trigger, surface);
15
+ useOverlayPosition(surface, trigger, interaction.open, "top", ANCHOR_GAP);
16
+ const child = isValidElement(children) ? children : void 0;
17
+ const descriptorRef = child ? Object.getOwnPropertyDescriptor(child, "ref")?.value : void 0;
18
+ const childRef = child?.props.ref ?? descriptorRef;
19
+ const mergedRef = useMemo(() => composeNativeRefs(childRef, setTrigger, ref), [childRef, ref]);
20
+ if (!child || child.type === Fragment || child.props.disabled) throw new Error("Tooltip requires one enabled ref-/native-prop-capable trigger element.");
21
+ const props = tooltipTriggerProps(child.props, nativeProps);
22
+ const description = [...new Set([
23
+ child.props["aria-describedby"],
24
+ nativeProps["aria-describedby"],
25
+ id
26
+ ].filter(Boolean).flatMap((value) => value?.split(/\s+/) ?? []))].join(" ");
27
+ const triggerProps = {
28
+ ...props,
29
+ ref: mergedRef,
30
+ "aria-describedby": description,
31
+ onPointerEnter: (event) => {
32
+ props.onPointerEnter?.(event);
33
+ if (!event.defaultPrevented) interaction.enter();
34
+ },
35
+ onPointerLeave: (event) => {
36
+ props.onPointerLeave?.(event);
37
+ if (!event.defaultPrevented) interaction.leave(event.relatedTarget);
38
+ },
39
+ onFocus: (event) => {
40
+ props.onFocus?.(event);
41
+ if (!event.defaultPrevented) interaction.focus();
42
+ },
43
+ onBlur: (event) => {
44
+ props.onBlur?.(event);
45
+ if (!event.defaultPrevented) interaction.blur();
46
+ },
47
+ onClick: (event) => {
48
+ props.onClick?.(event);
49
+ if (!event.defaultPrevented) interaction.enter();
50
+ },
51
+ onKeyDown: (event) => {
52
+ props.onKeyDown?.(event);
53
+ if (!event.defaultPrevented && interaction.open && event.key === "Escape") {
54
+ event.preventDefault();
55
+ event.stopPropagation();
56
+ interaction.dismiss();
57
+ }
58
+ }
59
+ };
60
+ const triggerElement = cloneElement(child, triggerProps);
61
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [triggerElement, trigger && typeof document !== "undefined" ? createPortal(/* @__PURE__ */ jsx("span", {
62
+ "aria-hidden": !interaction.open,
63
+ className: `chayns-tooltip${interaction.open ? " chayns-tooltip--open" : ""}`,
64
+ id,
65
+ onPointerLeave: (event) => interaction.leave(event.relatedTarget),
66
+ ref: surface,
67
+ role: "tooltip",
68
+ children: content
69
+ }), document.body) : null] });
70
+ });
71
+ Tooltip.displayName = "Tooltip";
72
+ //#endregion
73
+ export { Tooltip as default };
74
+
75
+ //# sourceMappingURL=Tooltip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tooltip.js","names":[],"sources":["../../../src/components/tooltip/Tooltip.tsx"],"sourcesContent":["import {\n cloneElement,\n forwardRef,\n Fragment,\n isValidElement,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { Ref } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useOverlayPosition } from '../../hooks/useOverlayPosition.js';\nimport { composeNativeRefs } from '../../utils/native-ref.js';\nimport { useTooltipInteraction } from './hooks/useTooltipInteraction.js';\nimport { tooltipTriggerProps } from './tooltip-trigger-props.js';\nimport type { TooltipProps, TooltipTriggerProps } from './Tooltip.types.js';\n\n// Fixed anchor gap in the verified Bodywork .tipbox reference.\nconst ANCHOR_GAP = 9;\n\nconst Tooltip = forwardRef<HTMLElement, TooltipProps>(function Tooltip(\n { children, content, ...nativeProps },\n ref,\n) {\n const id = useId();\n const [trigger, setTrigger] = useState<HTMLElement | null>(null);\n const surface = useRef<HTMLSpanElement>(null);\n const interaction = useTooltipInteraction(trigger, surface);\n useOverlayPosition(surface, trigger, interaction.open, 'top', ANCHOR_GAP);\n\n const child = isValidElement<TooltipTriggerProps>(children) ? children : undefined;\n const descriptorRef = child\n ? (Object.getOwnPropertyDescriptor(child, 'ref')?.value as Ref<HTMLElement> | undefined)\n : undefined;\n const childRef = child?.props.ref ?? descriptorRef;\n const mergedRef = useMemo(() => composeNativeRefs(childRef, setTrigger, ref), [childRef, ref]);\n if (!child || child.type === Fragment || child.props.disabled)\n throw new Error('Tooltip requires one enabled ref-/native-prop-capable trigger element.');\n\n const props = tooltipTriggerProps(child.props, nativeProps);\n const description = [\n ...new Set(\n [child.props['aria-describedby'], nativeProps['aria-describedby'], id]\n .filter(Boolean)\n .flatMap((value) => value?.split(/\\s+/) ?? []),\n ),\n ].join(' ');\n const triggerProps: TooltipTriggerProps = {\n ...props,\n ref: mergedRef,\n 'aria-describedby': description,\n onPointerEnter: (event) => {\n props.onPointerEnter?.(event);\n if (!event.defaultPrevented) interaction.enter();\n },\n onPointerLeave: (event) => {\n props.onPointerLeave?.(event);\n if (!event.defaultPrevented) interaction.leave(event.relatedTarget);\n },\n onFocus: (event) => {\n props.onFocus?.(event);\n if (!event.defaultPrevented) interaction.focus();\n },\n onBlur: (event) => {\n props.onBlur?.(event);\n if (!event.defaultPrevented) interaction.blur();\n },\n onClick: (event) => {\n props.onClick?.(event);\n if (!event.defaultPrevented) interaction.enter();\n },\n onKeyDown: (event) => {\n props.onKeyDown?.(event);\n if (!event.defaultPrevented && interaction.open && event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n interaction.dismiss();\n }\n },\n };\n const triggerElement = cloneElement(child, triggerProps);\n return (\n <>\n {triggerElement}\n {trigger && typeof document !== 'undefined'\n ? createPortal(\n <span\n aria-hidden={!interaction.open}\n className={`chayns-tooltip${interaction.open ? ' chayns-tooltip--open' : ''}`}\n id={id}\n onPointerLeave={(event) => interaction.leave(event.relatedTarget)}\n ref={surface}\n role=\"tooltip\"\n >\n {content}\n </span>,\n document.body,\n )\n : null}\n </>\n );\n});\nTooltip.displayName = 'Tooltip';\nexport default Tooltip;\n"],"mappings":";;;;;;;;AAmBA,IAAM,aAAa;AAEnB,IAAM,UAAU,WAAsC,SAAS,QAC7D,EAAE,UAAU,SAAS,GAAG,eACxB,KACA;CACA,MAAM,KAAK,MAAM;CACjB,MAAM,CAAC,SAAS,cAAc,SAA6B,IAAI;CAC/D,MAAM,UAAU,OAAwB,IAAI;CAC5C,MAAM,cAAc,sBAAsB,SAAS,OAAO;CAC1D,mBAAmB,SAAS,SAAS,YAAY,MAAM,OAAO,UAAU;CAExE,MAAM,QAAQ,eAAoC,QAAQ,IAAI,WAAW,KAAA;CACzE,MAAM,gBAAgB,QACjB,OAAO,yBAAyB,OAAO,KAAK,CAAC,EAAE,QAChD,KAAA;CACJ,MAAM,WAAW,OAAO,MAAM,OAAO;CACrC,MAAM,YAAY,cAAc,kBAAkB,UAAU,YAAY,GAAG,GAAG,CAAC,UAAU,GAAG,CAAC;CAC7F,IAAI,CAAC,SAAS,MAAM,SAAS,YAAY,MAAM,MAAM,UACnD,MAAM,IAAI,MAAM,wEAAwE;CAE1F,MAAM,QAAQ,oBAAoB,MAAM,OAAO,WAAW;CAC1D,MAAM,cAAc,CAClB,GAAG,IAAI,IACL;EAAC,MAAM,MAAM;EAAqB,YAAY;EAAqB;CAAE,CAAC,CACnE,OAAO,OAAO,CAAC,CACf,SAAS,UAAU,OAAO,MAAM,KAAK,KAAK,CAAC,CAAC,CACjD,CACF,CAAC,CAAC,KAAK,GAAG;CACV,MAAM,eAAoC;EACxC,GAAG;EACH,KAAK;EACL,oBAAoB;EACpB,iBAAiB,UAAU;GACzB,MAAM,iBAAiB,KAAK;GAC5B,IAAI,CAAC,MAAM,kBAAkB,YAAY,MAAM;EACjD;EACA,iBAAiB,UAAU;GACzB,MAAM,iBAAiB,KAAK;GAC5B,IAAI,CAAC,MAAM,kBAAkB,YAAY,MAAM,MAAM,aAAa;EACpE;EACA,UAAU,UAAU;GAClB,MAAM,UAAU,KAAK;GACrB,IAAI,CAAC,MAAM,kBAAkB,YAAY,MAAM;EACjD;EACA,SAAS,UAAU;GACjB,MAAM,SAAS,KAAK;GACpB,IAAI,CAAC,MAAM,kBAAkB,YAAY,KAAK;EAChD;EACA,UAAU,UAAU;GAClB,MAAM,UAAU,KAAK;GACrB,IAAI,CAAC,MAAM,kBAAkB,YAAY,MAAM;EACjD;EACA,YAAY,UAAU;GACpB,MAAM,YAAY,KAAK;GACvB,IAAI,CAAC,MAAM,oBAAoB,YAAY,QAAQ,MAAM,QAAQ,UAAU;IACzE,MAAM,eAAe;IACrB,MAAM,gBAAgB;IACtB,YAAY,QAAQ;GACtB;EACF;CACF;CACA,MAAM,iBAAiB,aAAa,OAAO,YAAY;CACvD,OACE,qBAAA,YAAA,EAAA,UAAA,CACG,gBACA,WAAW,OAAO,aAAa,cAC5B,aACE,oBAAC,QAAD;EACE,eAAa,CAAC,YAAY;EAC1B,WAAW,iBAAiB,YAAY,OAAO,0BAA0B;EACrE;EACJ,iBAAiB,UAAU,YAAY,MAAM,MAAM,aAAa;EAChE,KAAK;EACL,MAAK;EAEJ,UAAA;CACG,CAAA,GACN,SAAS,IACX,IACA,IACJ,EAAA,CAAA;AAEN,CAAC;AACD,QAAQ,cAAc"}
@@ -0,0 +1,12 @@
1
+ import type { HTMLAttributes, ReactElement, ReactNode, Ref } from 'react';
2
+ export interface TooltipTriggerProps extends HTMLAttributes<HTMLElement> {
3
+ ref?: Ref<HTMLElement>;
4
+ disabled?: boolean;
5
+ }
6
+ /** Explains one existing enabled trigger without changing its native action. */
7
+ export interface TooltipProps extends Omit<HTMLAttributes<HTMLElement>, 'children' | 'content'> {
8
+ children: ReactElement<TooltipTriggerProps>;
9
+ /** Already localized non-interactive explanation; never essential instructions or actions. */
10
+ content: ReactNode;
11
+ }
12
+ //# sourceMappingURL=Tooltip.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tooltip.types.d.ts","sourceRoot":"","sources":["../../../src/components/tooltip/Tooltip.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAE1E,MAAM,WAAW,mBAAoB,SAAQ,cAAc,CAAC,WAAW,CAAC;IACtE,GAAG,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,gFAAgF;AAChF,MAAM,WAAW,YAAa,SAAQ,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAC7F,QAAQ,EAAE,YAAY,CAAC,mBAAmB,CAAC,CAAC;IAC5C,8FAA8F;IAC9F,OAAO,EAAE,SAAS,CAAC;CACpB"}
@@ -0,0 +1,11 @@
1
+ import type { RefObject } from 'react';
2
+ /** Tracks focus/hover independently, including Escape suppression and outside dismissal. */
3
+ export declare function useTooltipInteraction(trigger: HTMLElement | null, surface: RefObject<HTMLSpanElement | null>): {
4
+ open: boolean;
5
+ enter: () => void;
6
+ leave: (relatedTarget: EventTarget | null) => void;
7
+ focus: () => void;
8
+ blur: () => void;
9
+ dismiss: () => void;
10
+ };
11
+ //# sourceMappingURL=useTooltipInteraction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTooltipInteraction.d.ts","sourceRoot":"","sources":["../../../../src/components/tooltip/hooks/useTooltipInteraction.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,4FAA4F;AAC5F,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,WAAW,GAAG,IAAI,EAC3B,OAAO,EAAE,SAAS,CAAC,eAAe,GAAG,IAAI,CAAC;;;2BAQZ,WAAW,GAAG,IAAI;;;;EAuCjD"}
@@ -0,0 +1,59 @@
1
+ import { useEffect, useRef, useState } from "react";
2
+ //#region src/components/tooltip/hooks/useTooltipInteraction.ts
3
+ /** Tracks focus/hover independently, including Escape suppression and outside dismissal. */
4
+ function useTooltipInteraction(trigger, surface) {
5
+ const [open, setOpen] = useState(false);
6
+ const focused = useRef(false);
7
+ function enter() {
8
+ setOpen(true);
9
+ }
10
+ function leave(relatedTarget) {
11
+ if (relatedTarget instanceof Node && (surface.current?.contains(relatedTarget) || trigger?.contains(relatedTarget))) return;
12
+ if (!focused.current) setOpen(false);
13
+ }
14
+ function dismiss() {
15
+ setOpen(false);
16
+ }
17
+ function focus() {
18
+ focused.current = true;
19
+ enter();
20
+ }
21
+ function blur() {
22
+ focused.current = false;
23
+ setOpen(false);
24
+ }
25
+ useEffect(() => {
26
+ if (!open) return void 0;
27
+ function keyDown(event) {
28
+ if (event.key !== "Escape" || event.defaultPrevented) return;
29
+ setOpen(false);
30
+ }
31
+ function pointerDown(event) {
32
+ if (event.defaultPrevented || !(event.target instanceof Node)) return;
33
+ if (trigger?.contains(event.target) || surface.current?.contains(event.target)) return;
34
+ setOpen(false);
35
+ }
36
+ document.addEventListener("keydown", keyDown);
37
+ document.addEventListener("pointerdown", pointerDown);
38
+ return () => {
39
+ document.removeEventListener("keydown", keyDown);
40
+ document.removeEventListener("pointerdown", pointerDown);
41
+ };
42
+ }, [
43
+ open,
44
+ surface,
45
+ trigger
46
+ ]);
47
+ return {
48
+ open,
49
+ enter,
50
+ leave,
51
+ focus,
52
+ blur,
53
+ dismiss
54
+ };
55
+ }
56
+ //#endregion
57
+ export { useTooltipInteraction };
58
+
59
+ //# sourceMappingURL=useTooltipInteraction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTooltipInteraction.js","names":[],"sources":["../../../../src/components/tooltip/hooks/useTooltipInteraction.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport type { RefObject } from 'react';\n\n/** Tracks focus/hover independently, including Escape suppression and outside dismissal. */\nexport function useTooltipInteraction(\n trigger: HTMLElement | null,\n surface: RefObject<HTMLSpanElement | null>,\n) {\n const [open, setOpen] = useState(false);\n const focused = useRef(false);\n\n function enter() {\n setOpen(true);\n }\n function leave(relatedTarget: EventTarget | null) {\n if (\n relatedTarget instanceof Node &&\n (surface.current?.contains(relatedTarget) || trigger?.contains(relatedTarget))\n )\n return;\n if (!focused.current) setOpen(false);\n }\n function dismiss() {\n setOpen(false);\n }\n function focus() {\n focused.current = true;\n enter();\n }\n function blur() {\n focused.current = false;\n setOpen(false);\n }\n\n useEffect(() => {\n if (!open) return undefined;\n function keyDown(event: KeyboardEvent) {\n if (event.key !== 'Escape' || event.defaultPrevented) return;\n setOpen(false);\n }\n function pointerDown(event: PointerEvent) {\n if (event.defaultPrevented || !(event.target instanceof Node)) return;\n if (trigger?.contains(event.target) || surface.current?.contains(event.target)) return;\n setOpen(false);\n }\n document.addEventListener('keydown', keyDown);\n document.addEventListener('pointerdown', pointerDown);\n return () => {\n document.removeEventListener('keydown', keyDown);\n document.removeEventListener('pointerdown', pointerDown);\n };\n }, [open, surface, trigger]);\n return { open, enter, leave, focus, blur, dismiss };\n}\n"],"mappings":";;;AAIA,SAAgB,sBACd,SACA,SACA;CACA,MAAM,CAAC,MAAM,WAAW,SAAS,KAAK;CACtC,MAAM,UAAU,OAAO,KAAK;CAE5B,SAAS,QAAQ;EACf,QAAQ,IAAI;CACd;CACA,SAAS,MAAM,eAAmC;EAChD,IACE,yBAAyB,SACxB,QAAQ,SAAS,SAAS,aAAa,KAAK,SAAS,SAAS,aAAa,IAE5E;EACF,IAAI,CAAC,QAAQ,SAAS,QAAQ,KAAK;CACrC;CACA,SAAS,UAAU;EACjB,QAAQ,KAAK;CACf;CACA,SAAS,QAAQ;EACf,QAAQ,UAAU;EAClB,MAAM;CACR;CACA,SAAS,OAAO;EACd,QAAQ,UAAU;EAClB,QAAQ,KAAK;CACf;CAEA,gBAAgB;EACd,IAAI,CAAC,MAAM,OAAO,KAAA;EAClB,SAAS,QAAQ,OAAsB;GACrC,IAAI,MAAM,QAAQ,YAAY,MAAM,kBAAkB;GACtD,QAAQ,KAAK;EACf;EACA,SAAS,YAAY,OAAqB;GACxC,IAAI,MAAM,oBAAoB,EAAE,MAAM,kBAAkB,OAAO;GAC/D,IAAI,SAAS,SAAS,MAAM,MAAM,KAAK,QAAQ,SAAS,SAAS,MAAM,MAAM,GAAG;GAChF,QAAQ,KAAK;EACf;EACA,SAAS,iBAAiB,WAAW,OAAO;EAC5C,SAAS,iBAAiB,eAAe,WAAW;EACpD,aAAa;GACX,SAAS,oBAAoB,WAAW,OAAO;GAC/C,SAAS,oBAAoB,eAAe,WAAW;EACzD;CACF,GAAG;EAAC;EAAM;EAAS;CAAO,CAAC;CAC3B,OAAO;EAAE;EAAM;EAAO;EAAO;EAAO;EAAM;CAAQ;AACpD"}
@@ -0,0 +1,4 @@
1
+ import type { HTMLAttributes } from 'react';
2
+ /** Preserve child listeners before outer listeners for every shared native event. */
3
+ export declare function tooltipTriggerProps(child: HTMLAttributes<HTMLElement>, outer: HTMLAttributes<HTMLElement>): HTMLAttributes<HTMLElement>;
4
+ //# sourceMappingURL=tooltip-trigger-props.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooltip-trigger-props.d.ts","sourceRoot":"","sources":["../../../src/components/tooltip/tooltip-trigger-props.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAkB,MAAM,OAAO,CAAC;AAI5D,qFAAqF;AACrF,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,cAAc,CAAC,WAAW,CAAC,EAClC,KAAK,EAAE,cAAc,CAAC,WAAW,CAAC,GAcjB,cAAc,CAAC,WAAW,CAAC,CAC7C"}
@@ -0,0 +1,25 @@
1
+ //#region src/components/tooltip/tooltip-trigger-props.ts
2
+ /** Preserve child listeners before outer listeners for every shared native event. */
3
+ function tooltipTriggerProps(child, outer) {
4
+ const merged = {
5
+ ...child,
6
+ ...outer
7
+ };
8
+ for (const [name, listener] of Object.entries(outer)) {
9
+ const previous = child[name];
10
+ if (/^on[A-Z]/.test(name) && typeof previous === "function" && typeof listener === "function") merged[name] = (event) => {
11
+ previous(event);
12
+ if (!event.defaultPrevented) listener(event);
13
+ };
14
+ }
15
+ merged.className = [child.className, outer.className].filter(Boolean).join(" ") || void 0;
16
+ merged.style = {
17
+ ...child.style,
18
+ ...outer.style
19
+ };
20
+ return merged;
21
+ }
22
+ //#endregion
23
+ export { tooltipTriggerProps };
24
+
25
+ //# sourceMappingURL=tooltip-trigger-props.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooltip-trigger-props.js","names":[],"sources":["../../../src/components/tooltip/tooltip-trigger-props.ts"],"sourcesContent":["import type { HTMLAttributes, SyntheticEvent } from 'react';\n\ntype Handler = (event: SyntheticEvent<HTMLElement>) => void;\n\n/** Preserve child listeners before outer listeners for every shared native event. */\nexport function tooltipTriggerProps(\n child: HTMLAttributes<HTMLElement>,\n outer: HTMLAttributes<HTMLElement>,\n) {\n const merged: Record<string, unknown> = { ...child, ...outer };\n for (const [name, listener] of Object.entries(outer)) {\n const previous = (child as Record<string, unknown>)[name];\n if (/^on[A-Z]/.test(name) && typeof previous === 'function' && typeof listener === 'function') {\n merged[name] = (event: SyntheticEvent<HTMLElement>) => {\n (previous as Handler)(event);\n if (!event.defaultPrevented) (listener as Handler)(event);\n };\n }\n }\n merged.className = [child.className, outer.className].filter(Boolean).join(' ') || undefined;\n merged.style = { ...child.style, ...outer.style };\n return merged as HTMLAttributes<HTMLElement>;\n}\n"],"mappings":";;AAKA,SAAgB,oBACd,OACA,OACA;CACA,MAAM,SAAkC;EAAE,GAAG;EAAO,GAAG;CAAM;CAC7D,KAAK,MAAM,CAAC,MAAM,aAAa,OAAO,QAAQ,KAAK,GAAG;EACpD,MAAM,WAAY,MAAkC;EACpD,IAAI,WAAW,KAAK,IAAI,KAAK,OAAO,aAAa,cAAc,OAAO,aAAa,YACjF,OAAO,SAAS,UAAuC;GACrD,SAAsB,KAAK;GAC3B,IAAI,CAAC,MAAM,kBAAkB,SAAsB,KAAK;EAC1D;CAEJ;CACA,OAAO,YAAY,CAAC,MAAM,WAAW,MAAM,SAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,KAAK,KAAA;CACnF,OAAO,QAAQ;EAAE,GAAG,MAAM;EAAO,GAAG,MAAM;CAAM;CAChD,OAAO;AACT"}
@@ -1,6 +1,6 @@
1
1
  @layer chayns.components {
2
2
  .chayns-date-time-picker {
3
- display: inline-block;
3
+ display: inline-grid;
4
4
  max-inline-size: 100%;
5
5
  position: relative;
6
6
  }
@@ -11,6 +11,8 @@
11
11
 
12
12
  .chayns-date-time-picker__trigger {
13
13
  box-sizing: border-box;
14
+ grid-area: 1 / 1;
15
+ inline-size: 100%;
14
16
  max-inline-size: 100%;
15
17
  min-block-size: calc(1.2em + 2 * var(--input-py) + 3px);
16
18
  padding: var(--input-py) var(--input-px);
@@ -25,6 +27,21 @@
25
27
  text-align: start;
26
28
  }
27
29
 
30
+ .chayns-date-time-picker__sizer {
31
+ display: grid;
32
+ grid-area: 1 / 1;
33
+ visibility: hidden;
34
+ white-space: nowrap;
35
+ }
36
+
37
+ .chayns-date-time-picker__sizer > span {
38
+ grid-area: 1 / 1;
39
+ padding: var(--input-py) var(--input-px);
40
+ border: 1.5px solid transparent;
41
+ font: inherit;
42
+ line-height: 1.2;
43
+ }
44
+
28
45
  .chayns-date-time-picker__trigger:focus-visible {
29
46
  border-color: var(--accent);
30
47
  box-shadow: 0 0 0 var(--focus-ring-size)
@@ -53,10 +70,13 @@
53
70
  }
54
71
 
55
72
  .chayns-date-time-picker__popup {
73
+ box-sizing: border-box;
56
74
  position: absolute;
57
75
  inset-block-start: calc(100% + var(--k4));
58
- inset-inline: 0;
76
+ inset-inline-start: 0;
59
77
  z-index: var(--z-popover);
78
+ inline-size: max-content;
79
+ min-inline-size: 100%;
60
80
  overflow: hidden;
61
81
  padding: var(--k8);
62
82
  border: 1px solid var(--border);
@@ -118,4 +138,15 @@
118
138
  transform-origin: center;
119
139
  transform-style: preserve-3d;
120
140
  }
141
+
142
+ .chayns-date-time-picker--date .chayns-date-time-picker__wheel {
143
+ flex: 0 0 auto;
144
+ min-inline-size: max-content;
145
+ }
146
+
147
+ .chayns-date-time-picker--date .chayns-date-time-picker__wheel-option {
148
+ inline-size: max-content;
149
+ min-inline-size: 100%;
150
+ padding-inline: var(--k8);
151
+ }
121
152
  }
@@ -0,0 +1,4 @@
1
+ import type { RefObject } from 'react';
2
+ /** Positions a non-modal surface at its trigger and keeps it inside the viewport. */
3
+ export declare function useOverlayPosition(surfaceRef: RefObject<HTMLElement | null>, trigger: HTMLElement | null, open: boolean, placement?: 'bottom' | 'top', gap?: number): void;
4
+ //# sourceMappingURL=useOverlayPosition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useOverlayPosition.d.ts","sourceRoot":"","sources":["../../src/hooks/useOverlayPosition.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,qFAAqF;AACrF,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EACzC,OAAO,EAAE,WAAW,GAAG,IAAI,EAC3B,IAAI,EAAE,OAAO,EACb,SAAS,GAAE,QAAQ,GAAG,KAAgB,EACtC,GAAG,SAAI,QAyDR"}