@simplybusiness/mobius 10.3.1 → 10.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cjs/components/AddressLookup/AddressLookup.js +888 -5314
  3. package/dist/cjs/components/AddressLookup/AddressLookup.js.map +4 -4
  4. package/dist/cjs/components/AddressLookup/index.js +952 -5381
  5. package/dist/cjs/components/AddressLookup/index.js.map +4 -4
  6. package/dist/cjs/components/Alert/Alert.js +1 -1
  7. package/dist/cjs/components/Alert/Alert.js.map +2 -2
  8. package/dist/cjs/components/Alert/index.js +1 -1
  9. package/dist/cjs/components/Alert/index.js.map +2 -2
  10. package/dist/cjs/components/Checkbox/Checkbox.js +245 -5625
  11. package/dist/cjs/components/Checkbox/Checkbox.js.map +4 -4
  12. package/dist/cjs/components/Checkbox/CheckboxGroup.js +371 -5614
  13. package/dist/cjs/components/Checkbox/CheckboxGroup.js.map +4 -4
  14. package/dist/cjs/components/Checkbox/index.js +377 -5619
  15. package/dist/cjs/components/Checkbox/index.js.map +4 -4
  16. package/dist/cjs/components/Combobox/Combobox.js +829 -5344
  17. package/dist/cjs/components/Combobox/Combobox.js.map +4 -4
  18. package/dist/cjs/components/Combobox/index.js +813 -5327
  19. package/dist/cjs/components/Combobox/index.js.map +4 -4
  20. package/dist/cjs/components/DateField/DateField.js +379 -5505
  21. package/dist/cjs/components/DateField/DateField.js.map +4 -4
  22. package/dist/cjs/components/DateField/index.js +383 -5508
  23. package/dist/cjs/components/DateField/index.js.map +4 -4
  24. package/dist/cjs/components/ErrorMessage/ErrorMessage.js +120 -5643
  25. package/dist/cjs/components/ErrorMessage/ErrorMessage.js.map +4 -4
  26. package/dist/cjs/components/ErrorMessage/index.js +121 -5642
  27. package/dist/cjs/components/ErrorMessage/index.js.map +4 -4
  28. package/dist/cjs/components/ExpandableText/ExpandableText.js +511 -5604
  29. package/dist/cjs/components/ExpandableText/ExpandableText.js.map +4 -4
  30. package/dist/cjs/components/ExpandableText/index.js +512 -5604
  31. package/dist/cjs/components/ExpandableText/index.js.map +4 -4
  32. package/dist/cjs/components/MaskedField/MaskedField.js +394 -5511
  33. package/dist/cjs/components/MaskedField/MaskedField.js.map +4 -4
  34. package/dist/cjs/components/MaskedField/index.js +294 -5119
  35. package/dist/cjs/components/MaskedField/index.js.map +4 -4
  36. package/dist/cjs/components/NumberField/NumberField.js +357 -5523
  37. package/dist/cjs/components/NumberField/NumberField.js.map +4 -4
  38. package/dist/cjs/components/NumberField/index.js +358 -5523
  39. package/dist/cjs/components/NumberField/index.js.map +4 -4
  40. package/dist/cjs/components/PasswordField/PasswordField.js +330 -5511
  41. package/dist/cjs/components/PasswordField/PasswordField.js.map +4 -4
  42. package/dist/cjs/components/PasswordField/ShowHideButton.js +32 -5655
  43. package/dist/cjs/components/PasswordField/ShowHideButton.js.map +4 -4
  44. package/dist/cjs/components/PasswordField/index.js +332 -5512
  45. package/dist/cjs/components/PasswordField/index.js.map +4 -4
  46. package/dist/cjs/components/Radio/Radio.js +242 -5632
  47. package/dist/cjs/components/Radio/Radio.js.map +4 -4
  48. package/dist/cjs/components/Radio/RadioGroup.js +274 -5619
  49. package/dist/cjs/components/Radio/RadioGroup.js.map +4 -4
  50. package/dist/cjs/components/Radio/index.js +404 -5628
  51. package/dist/cjs/components/Radio/index.js.map +4 -4
  52. package/dist/cjs/components/Select/Select.js +233 -5588
  53. package/dist/cjs/components/Select/Select.js.map +4 -4
  54. package/dist/cjs/components/Select/index.js +234 -5588
  55. package/dist/cjs/components/Select/index.js.map +4 -4
  56. package/dist/cjs/components/TextArea/TextArea.js +229 -5531
  57. package/dist/cjs/components/TextArea/TextArea.js.map +4 -4
  58. package/dist/cjs/components/TextArea/index.js +230 -5531
  59. package/dist/cjs/components/TextArea/index.js.map +4 -4
  60. package/dist/cjs/components/TextField/TextField.js +265 -5522
  61. package/dist/cjs/components/TextField/TextField.js.map +4 -4
  62. package/dist/cjs/components/TextField/index.js +266 -5522
  63. package/dist/cjs/components/TextField/index.js.map +4 -4
  64. package/dist/cjs/components/TextOrHTML/TextOrHTML.js +1 -1
  65. package/dist/cjs/components/TextOrHTML/TextOrHTML.js.map +2 -2
  66. package/dist/cjs/components/TextOrHTML/index.js +1 -1
  67. package/dist/cjs/components/TextOrHTML/index.js.map +2 -2
  68. package/dist/cjs/components/index.js +4273 -5291
  69. package/dist/cjs/components/index.js.map +4 -4
  70. package/dist/cjs/index.js +4304 -5334
  71. package/dist/cjs/index.js.map +4 -4
  72. package/dist/cjs/meta.json +5692 -51487
  73. package/dist/esm/chunk-3O5DIIGS.js +1 -0
  74. package/dist/esm/chunk-3O5DIIGS.js.map +7 -0
  75. package/dist/esm/chunk-3PRSHEVX.js +1 -0
  76. package/dist/esm/chunk-3PRSHEVX.js.map +7 -0
  77. package/dist/esm/chunk-4NBLO5WK.js +54 -0
  78. package/dist/esm/chunk-4NBLO5WK.js.map +7 -0
  79. package/dist/esm/chunk-4WVJNNBK.js +157 -0
  80. package/dist/esm/chunk-4WVJNNBK.js.map +7 -0
  81. package/dist/esm/chunk-5L4G4VLM.js +1 -0
  82. package/dist/esm/chunk-5L4G4VLM.js.map +7 -0
  83. package/dist/esm/chunk-5OFXPT4J.js +135 -0
  84. package/dist/esm/chunk-5OFXPT4J.js.map +7 -0
  85. package/dist/esm/chunk-6O77SOOB.js +1 -0
  86. package/dist/esm/chunk-6O77SOOB.js.map +7 -0
  87. package/dist/esm/chunk-AFU7BFCD.js +151 -0
  88. package/dist/esm/chunk-AFU7BFCD.js.map +7 -0
  89. package/dist/esm/chunk-BGR2OTTR.js +1 -0
  90. package/dist/esm/chunk-BGR2OTTR.js.map +7 -0
  91. package/dist/esm/chunk-BIGO5EVC.js +1 -0
  92. package/dist/esm/chunk-BIGO5EVC.js.map +7 -0
  93. package/dist/esm/chunk-CUOVI2HT.js +1 -0
  94. package/dist/esm/chunk-CUOVI2HT.js.map +7 -0
  95. package/dist/esm/{chunk-HPUPB75I.js → chunk-DYTHXKMX.js} +2 -2
  96. package/dist/esm/chunk-DYTHXKMX.js.map +7 -0
  97. package/dist/esm/chunk-F4RQKLF7.js +1 -0
  98. package/dist/esm/chunk-F4RQKLF7.js.map +7 -0
  99. package/dist/esm/chunk-FKTDL7KO.js +355 -0
  100. package/dist/esm/chunk-FKTDL7KO.js.map +7 -0
  101. package/dist/esm/{chunk-NRU3WNV7.js → chunk-JNAQ76CR.js} +2 -2
  102. package/dist/esm/chunk-KQZ3MNK5.js +100 -0
  103. package/dist/esm/chunk-KQZ3MNK5.js.map +7 -0
  104. package/dist/esm/chunk-M2NDSQR5.js +106 -0
  105. package/dist/esm/chunk-M2NDSQR5.js.map +7 -0
  106. package/dist/esm/chunk-N4WQ6522.js +125 -0
  107. package/dist/esm/chunk-N4WQ6522.js.map +7 -0
  108. package/dist/esm/{chunk-CNOF66SV.js → chunk-NGNVAFBJ.js} +4 -4
  109. package/dist/esm/chunk-NOQ27VLY.js +1 -0
  110. package/dist/esm/chunk-NOQ27VLY.js.map +7 -0
  111. package/dist/esm/chunk-ONDOONBM.js +101 -0
  112. package/dist/esm/chunk-ONDOONBM.js.map +7 -0
  113. package/dist/esm/chunk-P34DI6BE.js +1 -0
  114. package/dist/esm/chunk-P34DI6BE.js.map +7 -0
  115. package/dist/esm/chunk-P5VEI574.js +97 -0
  116. package/dist/esm/chunk-P5VEI574.js.map +7 -0
  117. package/dist/esm/chunk-QPIA6BGW.js +64 -0
  118. package/dist/esm/chunk-QPIA6BGW.js.map +7 -0
  119. package/dist/esm/chunk-SZEFLEDA.js +1 -0
  120. package/dist/esm/chunk-SZEFLEDA.js.map +7 -0
  121. package/dist/esm/chunk-TXB4BOHB.js +1 -0
  122. package/dist/esm/chunk-TXB4BOHB.js.map +7 -0
  123. package/dist/esm/chunk-UIIXVY6K.js +123 -0
  124. package/dist/esm/chunk-UIIXVY6K.js.map +7 -0
  125. package/dist/esm/chunk-UQVAEWY2.js +44 -0
  126. package/dist/esm/chunk-UQVAEWY2.js.map +7 -0
  127. package/dist/esm/chunk-WC3D5GNN.js +29 -0
  128. package/dist/esm/chunk-WC3D5GNN.js.map +7 -0
  129. package/dist/esm/chunk-WNRO77YH.js +1 -0
  130. package/dist/esm/chunk-WNRO77YH.js.map +7 -0
  131. package/dist/esm/chunk-X6EPYQKX.js +96 -0
  132. package/dist/esm/chunk-X6EPYQKX.js.map +7 -0
  133. package/dist/esm/chunk-ZN5TRIVZ.js +41 -0
  134. package/dist/esm/chunk-ZN5TRIVZ.js.map +7 -0
  135. package/dist/esm/components/AddressLookup/AddressLookup.js +10 -107
  136. package/dist/esm/components/AddressLookup/index.js +11 -104
  137. package/dist/esm/components/Alert/Alert.js +2 -2
  138. package/dist/esm/components/Alert/index.js +2 -2
  139. package/dist/esm/components/Checkbox/Checkbox.js +4 -117
  140. package/dist/esm/components/Checkbox/CheckboxGroup.js +5 -115
  141. package/dist/esm/components/Checkbox/index.js +8 -115
  142. package/dist/esm/components/Combobox/Combobox.js +7 -108
  143. package/dist/esm/components/Combobox/index.js +9 -108
  144. package/dist/esm/components/DateField/DateField.js +7 -114
  145. package/dist/esm/components/DateField/index.js +8 -114
  146. package/dist/esm/components/ErrorMessage/ErrorMessage.js +2 -147
  147. package/dist/esm/components/ErrorMessage/index.js +3 -147
  148. package/dist/esm/components/ExpandableText/ExpandableText.js +2 -109
  149. package/dist/esm/components/ExpandableText/index.js +3 -109
  150. package/dist/esm/components/MaskedField/MaskedField.js +6 -115
  151. package/dist/esm/components/MaskedField/MaskedField.js.map +1 -1
  152. package/dist/esm/components/MaskedField/index.js +7 -115
  153. package/dist/esm/components/NumberField/NumberField.js +7 -115
  154. package/dist/esm/components/NumberField/index.js +8 -115
  155. package/dist/esm/components/PasswordField/PasswordField.js +8 -115
  156. package/dist/esm/components/PasswordField/ShowHideButton.js +1 -149
  157. package/dist/esm/components/PasswordField/index.js +9 -115
  158. package/dist/esm/components/Radio/Radio.js +4 -145
  159. package/dist/esm/components/Radio/RadioGroup.js +4 -115
  160. package/dist/esm/components/Radio/index.js +8 -116
  161. package/dist/esm/components/Select/Select.js +4 -115
  162. package/dist/esm/components/Select/index.js +5 -115
  163. package/dist/esm/components/Slider/Slider.js +2 -2
  164. package/dist/esm/components/Slider/index.js +2 -2
  165. package/dist/esm/components/TextArea/TextArea.js +4 -113
  166. package/dist/esm/components/TextArea/index.js +5 -113
  167. package/dist/esm/components/TextField/TextField.js +5 -115
  168. package/dist/esm/components/TextField/index.js +6 -115
  169. package/dist/esm/components/TextOrHTML/TextOrHTML.js +1 -1
  170. package/dist/esm/components/TextOrHTML/index.js +1 -1
  171. package/dist/esm/components/index.js +83 -46
  172. package/dist/esm/index.js +83 -41
  173. package/dist/esm/meta.json +6905 -19124
  174. package/dist/tsconfig.build.tsbuildinfo +1 -1
  175. package/package.json +1 -1
  176. package/src/components/ErrorMessage/ErrorMessage.tsx +1 -1
  177. package/src/components/ExpandableText/ExpandableText.tsx +3 -1
  178. package/src/components/PasswordField/ShowHideButton.tsx +1 -1
  179. package/src/components/TextOrHTML/TextOrHTML.test.tsx +18 -0
  180. package/src/components/TextOrHTML/TextOrHTML.tsx +2 -1
  181. package/dist/esm/chunk-HPUPB75I.js.map +0 -7
  182. package/dist/esm/chunk-M7LTJZQU.js +0 -1606
  183. package/dist/esm/chunk-M7LTJZQU.js.map +0 -7
  184. /package/dist/esm/{chunk-NRU3WNV7.js.map → chunk-JNAQ76CR.js.map} +0 -0
  185. /package/dist/esm/{chunk-CNOF66SV.js.map → chunk-NGNVAFBJ.js.map} +0 -0
@@ -0,0 +1,106 @@
1
+ import {
2
+ ErrorMessage
3
+ } from "./chunk-UQVAEWY2.js";
4
+ import {
5
+ Stack
6
+ } from "./chunk-XH3OJQMW.js";
7
+ import {
8
+ Label
9
+ } from "./chunk-ZN7OWLZY.js";
10
+ import {
11
+ Icon
12
+ } from "./chunk-TKIP5Q5H.js";
13
+ import {
14
+ useLabel
15
+ } from "./chunk-YLEFK7S2.js";
16
+ import {
17
+ useValidationClasses
18
+ } from "./chunk-DYOFXXZD.js";
19
+ import {
20
+ spaceDelimitedList
21
+ } from "./chunk-DTWRSP5P.js";
22
+
23
+ // src/components/Select/Select.tsx
24
+ import { chevronDown } from "@simplybusiness/icons";
25
+ import classNames from "classnames/dedupe";
26
+ import { useId } from "react";
27
+ import "@simplybusiness/mobius/src/components/Select/Select.css";
28
+ import { jsx, jsxs } from "react/jsx-runtime";
29
+ var Select = ({ ref, ...props }) => {
30
+ const {
31
+ label,
32
+ onChange,
33
+ isInvalid,
34
+ errorMessage,
35
+ isDisabled = false,
36
+ isRequired,
37
+ ...otherProps
38
+ } = props;
39
+ const { labelProps, fieldProps } = useLabel({
40
+ label,
41
+ ...otherProps
42
+ });
43
+ const validationClasses = useValidationClasses({ isInvalid });
44
+ const stateClasses = {
45
+ "--is-disabled": isDisabled,
46
+ "--is-required": typeof isRequired === "boolean" && isRequired,
47
+ "--is-optional": typeof isRequired === "boolean" && !isRequired
48
+ };
49
+ const sharedClasses = classNames(validationClasses, stateClasses);
50
+ const wrapperClasses = classNames(
51
+ "mobius-select__wrapper",
52
+ sharedClasses,
53
+ otherProps.className
54
+ );
55
+ const selectClasses = classNames(
56
+ "mobius-select",
57
+ sharedClasses,
58
+ otherProps.className
59
+ );
60
+ const labelClasses = classNames(
61
+ "mobius-label",
62
+ sharedClasses,
63
+ otherProps.className
64
+ );
65
+ const iconClasses = classNames("mobius-select__icon", sharedClasses);
66
+ const errorMessageId = useId();
67
+ const shouldErrorMessageShow = errorMessage ? errorMessageId : void 0;
68
+ const describedBy = spaceDelimitedList([
69
+ shouldErrorMessageShow,
70
+ props["aria-describedby"]
71
+ ]);
72
+ const handleChange = (e) => {
73
+ if (onChange) {
74
+ onChange(e);
75
+ }
76
+ };
77
+ return /* @__PURE__ */ jsxs(Stack, { className: "mobius mobius-select__outer", gap: "xs", children: [
78
+ label && /* @__PURE__ */ jsx(Label, { ...labelProps, className: labelClasses, children: label }),
79
+ /* @__PURE__ */ jsxs("div", { className: wrapperClasses, children: [
80
+ /* @__PURE__ */ jsx(
81
+ "select",
82
+ {
83
+ ...otherProps,
84
+ ...fieldProps,
85
+ ref,
86
+ multiple: false,
87
+ className: selectClasses,
88
+ disabled: isDisabled,
89
+ "aria-invalid": !!errorMessage,
90
+ "aria-describedby": describedBy,
91
+ "aria-required": isRequired,
92
+ required: isRequired,
93
+ onChange: handleChange
94
+ }
95
+ ),
96
+ /* @__PURE__ */ jsx("span", { className: iconClasses, children: /* @__PURE__ */ jsx(Icon, { icon: chevronDown }) })
97
+ ] }),
98
+ errorMessage && /* @__PURE__ */ jsx(ErrorMessage, { id: errorMessageId, errorMessage })
99
+ ] });
100
+ };
101
+ Select.displayName = "Select";
102
+
103
+ export {
104
+ Select
105
+ };
106
+ //# sourceMappingURL=chunk-M2NDSQR5.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/components/Select/Select.tsx"],
4
+ "sourcesContent": ["\"use client\";\n\nimport { chevronDown } from \"@simplybusiness/icons\";\nimport classNames from \"classnames/dedupe\";\nimport type { ChangeEvent, ReactElement, RefAttributes } from \"react\";\nimport { useId } from \"react\";\nimport { useValidationClasses } from \"../../hooks\";\nimport type { UseLabelProps } from \"../../hooks/useLabel\";\nimport { useLabel } from \"../../hooks/useLabel\";\nimport type { DOMProps, Validation } from \"../../types\";\nimport { spaceDelimitedList } from \"../../utils/spaceDelimitedList\";\nimport { ErrorMessage } from \"../ErrorMessage\";\nimport { Icon } from \"../Icon\";\nimport { Label } from \"../Label\";\nimport type { OptionProps } from \"../Option\";\nimport { Stack } from \"../Stack\";\nimport \"./Select.css\";\n\nexport type SelectElementType = HTMLSelectElement;\nexport interface SelectProps\n extends\n UseLabelProps,\n Validation,\n DOMProps,\n RefAttributes<SelectElementType> {\n name?: string;\n onChange?: (e: ChangeEvent<HTMLSelectElement>) => void;\n value?: string;\n defaultValue?: string;\n className?: string;\n errorMessage?: string;\n children?: ReactElement<OptionProps>[] | ReactElement<OptionProps>;\n \"aria-describedby\"?: string;\n isDisabled?: boolean;\n}\n\nconst Select = ({ ref, ...props }: SelectProps) => {\n const {\n label,\n onChange,\n isInvalid,\n errorMessage,\n isDisabled = false,\n isRequired,\n ...otherProps\n } = props;\n\n const { labelProps, fieldProps } = useLabel({\n label,\n ...otherProps,\n });\n\n const validationClasses = useValidationClasses({ isInvalid });\n\n const stateClasses = {\n \"--is-disabled\": isDisabled,\n \"--is-required\": typeof isRequired === \"boolean\" && isRequired,\n \"--is-optional\": typeof isRequired === \"boolean\" && !isRequired,\n };\n\n const sharedClasses = classNames(validationClasses, stateClasses);\n\n const wrapperClasses = classNames(\n \"mobius-select__wrapper\",\n sharedClasses,\n otherProps.className,\n );\n const selectClasses = classNames(\n \"mobius-select\",\n sharedClasses,\n otherProps.className,\n );\n const labelClasses = classNames(\n \"mobius-label\",\n sharedClasses,\n otherProps.className,\n );\n const iconClasses = classNames(\"mobius-select__icon\", sharedClasses);\n const errorMessageId = useId();\n const shouldErrorMessageShow = errorMessage ? errorMessageId : undefined;\n const describedBy = spaceDelimitedList([\n shouldErrorMessageShow,\n props[\"aria-describedby\"],\n ]);\n\n const handleChange = (e: ChangeEvent<HTMLSelectElement>) => {\n if (onChange) {\n onChange(e);\n }\n };\n\n return (\n <Stack className=\"mobius mobius-select__outer\" gap=\"xs\">\n {label && (\n <Label {...labelProps} className={labelClasses}>\n {label}\n </Label>\n )}\n <div className={wrapperClasses}>\n <select\n {...otherProps}\n {...fieldProps}\n ref={ref}\n multiple={false}\n className={selectClasses}\n disabled={isDisabled}\n aria-invalid={!!errorMessage}\n aria-describedby={describedBy}\n aria-required={isRequired}\n required={isRequired}\n onChange={handleChange}\n />\n <span className={iconClasses}>\n <Icon icon={chevronDown} />\n </span>\n </div>\n {errorMessage && (\n <ErrorMessage id={errorMessageId} errorMessage={errorMessage} />\n )}\n </Stack>\n );\n};\n\nSelect.displayName = \"Select\";\nexport { Select };\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;AAEA,SAAS,mBAAmB;AAC5B,OAAO,gBAAgB;AAEvB,SAAS,aAAa;AAWtB,OAAO;AA8EC,cAIF,YAJE;AA1DR,IAAM,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,MAAmB;AACjD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AAEJ,QAAM,EAAE,YAAY,WAAW,IAAI,SAAS;AAAA,IAC1C;AAAA,IACA,GAAG;AAAA,EACL,CAAC;AAED,QAAM,oBAAoB,qBAAqB,EAAE,UAAU,CAAC;AAE5D,QAAM,eAAe;AAAA,IACnB,iBAAiB;AAAA,IACjB,iBAAiB,OAAO,eAAe,aAAa;AAAA,IACpD,iBAAiB,OAAO,eAAe,aAAa,CAAC;AAAA,EACvD;AAEA,QAAM,gBAAgB,WAAW,mBAAmB,YAAY;AAEhE,QAAM,iBAAiB;AAAA,IACrB;AAAA,IACA;AAAA,IACA,WAAW;AAAA,EACb;AACA,QAAM,gBAAgB;AAAA,IACpB;AAAA,IACA;AAAA,IACA,WAAW;AAAA,EACb;AACA,QAAM,eAAe;AAAA,IACnB;AAAA,IACA;AAAA,IACA,WAAW;AAAA,EACb;AACA,QAAM,cAAc,WAAW,uBAAuB,aAAa;AACnE,QAAM,iBAAiB,MAAM;AAC7B,QAAM,yBAAyB,eAAe,iBAAiB;AAC/D,QAAM,cAAc,mBAAmB;AAAA,IACrC;AAAA,IACA,MAAM,kBAAkB;AAAA,EAC1B,CAAC;AAED,QAAM,eAAe,CAAC,MAAsC;AAC1D,QAAI,UAAU;AACZ,eAAS,CAAC;AAAA,IACZ;AAAA,EACF;AAEA,SACE,qBAAC,SAAM,WAAU,+BAA8B,KAAI,MAChD;AAAA,aACC,oBAAC,SAAO,GAAG,YAAY,WAAW,cAC/B,iBACH;AAAA,IAEF,qBAAC,SAAI,WAAW,gBACd;AAAA;AAAA,QAAC;AAAA;AAAA,UACE,GAAG;AAAA,UACH,GAAG;AAAA,UACJ;AAAA,UACA,UAAU;AAAA,UACV,WAAW;AAAA,UACX,UAAU;AAAA,UACV,gBAAc,CAAC,CAAC;AAAA,UAChB,oBAAkB;AAAA,UAClB,iBAAe;AAAA,UACf,UAAU;AAAA,UACV,UAAU;AAAA;AAAA,MACZ;AAAA,MACA,oBAAC,UAAK,WAAW,aACf,8BAAC,QAAK,MAAM,aAAa,GAC3B;AAAA,OACF;AAAA,IACC,gBACC,oBAAC,gBAAa,IAAI,gBAAgB,cAA4B;AAAA,KAElE;AAEJ;AAEA,OAAO,cAAc;",
6
+ "names": []
7
+ }
@@ -0,0 +1,125 @@
1
+ import {
2
+ ErrorMessage
3
+ } from "./chunk-UQVAEWY2.js";
4
+ import {
5
+ Stack
6
+ } from "./chunk-XH3OJQMW.js";
7
+ import {
8
+ Icon
9
+ } from "./chunk-TKIP5Q5H.js";
10
+ import {
11
+ useValidationClasses
12
+ } from "./chunk-DYOFXXZD.js";
13
+ import {
14
+ spaceDelimitedList
15
+ } from "./chunk-DTWRSP5P.js";
16
+
17
+ // src/components/Checkbox/Checkbox.tsx
18
+ import { useRef, useId, useState, useEffect } from "react";
19
+ import classNames from "classnames/dedupe";
20
+ import { squareTick, square } from "@simplybusiness/icons";
21
+ import "@simplybusiness/mobius/src/components/Checkbox/Checkbox.css";
22
+ import { jsx, jsxs } from "react/jsx-runtime";
23
+ var Checkbox = ({ ref, ...props }) => {
24
+ const {
25
+ id,
26
+ label,
27
+ isDisabled,
28
+ isRequired,
29
+ isInvalid,
30
+ onChange,
31
+ className,
32
+ errorMessage,
33
+ selected,
34
+ defaultSelected = false,
35
+ isReadOnly,
36
+ isLastItem,
37
+ name,
38
+ value,
39
+ ["aria-describedby"]: ariaDescribedBy,
40
+ ...rest
41
+ } = props;
42
+ const [checked, setChecked] = useState(defaultSelected);
43
+ const fallbackRef = useRef(null);
44
+ const refObj = ref || fallbackRef;
45
+ const inputId = useId();
46
+ const isControlled = typeof selected === "boolean";
47
+ useEffect(() => {
48
+ if (isControlled) {
49
+ setChecked(selected);
50
+ }
51
+ }, [selected, isControlled]);
52
+ const validationClasses = useValidationClasses({ isInvalid });
53
+ const sharedClasses = classNames(
54
+ {
55
+ "--is-disabled": isDisabled,
56
+ "--is-selected": checked,
57
+ "--is-required": typeof isRequired === "boolean" && isRequired,
58
+ "--is-optional": typeof isRequired === "boolean" && !isRequired
59
+ },
60
+ validationClasses
61
+ );
62
+ const wrapperClasses = classNames(
63
+ "mobius",
64
+ "mobius-checkbox",
65
+ sharedClasses,
66
+ className
67
+ );
68
+ const labelClasses = classNames("mobius-checkbox__label", sharedClasses);
69
+ const inputClasses = classNames("mobius-checkbox__input", sharedClasses);
70
+ const iconClasses = classNames("mobius-checkbox__icon", sharedClasses);
71
+ const errorMessageId = useId();
72
+ const shouldErrorMessageShow = errorMessage ? errorMessageId : void 0;
73
+ const describedBy = spaceDelimitedList([
74
+ shouldErrorMessageShow,
75
+ ariaDescribedBy
76
+ ]);
77
+ const labelId = useId();
78
+ const handleChange = (event) => {
79
+ setChecked(!checked);
80
+ if (onChange) {
81
+ onChange(event, isLastItem);
82
+ }
83
+ };
84
+ return /* @__PURE__ */ jsxs(Stack, { gap: "xs", className: wrapperClasses, children: [
85
+ /* @__PURE__ */ jsxs("label", { className: labelClasses, children: [
86
+ /* @__PURE__ */ jsx(
87
+ "input",
88
+ {
89
+ "aria-describedby": describedBy,
90
+ "aria-errormessage": shouldErrorMessageShow,
91
+ "aria-invalid": isInvalid,
92
+ "aria-labelledby": labelId,
93
+ readOnly: isReadOnly,
94
+ disabled: isDisabled,
95
+ ref: refObj,
96
+ className: inputClasses,
97
+ onChange: handleChange,
98
+ type: "checkbox",
99
+ checked,
100
+ required: isRequired,
101
+ id: id || inputId,
102
+ name,
103
+ value,
104
+ ...rest
105
+ }
106
+ ),
107
+ /* @__PURE__ */ jsx(
108
+ Icon,
109
+ {
110
+ icon: checked ? squareTick : square,
111
+ size: "md",
112
+ className: iconClasses
113
+ }
114
+ ),
115
+ /* @__PURE__ */ jsx("span", { id: labelId, className: "mobius-checkbox__visible-label", children: label })
116
+ ] }),
117
+ /* @__PURE__ */ jsx(ErrorMessage, { id: errorMessageId, errorMessage })
118
+ ] });
119
+ };
120
+ Checkbox.displayName = "Checkbox";
121
+
122
+ export {
123
+ Checkbox
124
+ };
125
+ //# sourceMappingURL=chunk-N4WQ6522.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/components/Checkbox/Checkbox.tsx"],
4
+ "sourcesContent": ["\"use client\";\n\nimport type { ChangeEvent } from \"react\";\nimport { useRef, useId, useState, useEffect } from \"react\";\nimport classNames from \"classnames/dedupe\";\nimport { squareTick, square } from \"@simplybusiness/icons\";\nimport { ErrorMessage } from \"../ErrorMessage\";\nimport type { CheckboxElementType, CheckboxProps } from \"./types\";\nimport { spaceDelimitedList } from \"../../utils/spaceDelimitedList\";\nimport { useValidationClasses } from \"../../hooks\";\nimport { Icon } from \"../Icon\";\nimport { Stack } from \"../Stack\";\nimport \"./Checkbox.css\";\n\nexport const Checkbox = ({ ref, ...props }: CheckboxProps) => {\n const {\n id,\n label,\n isDisabled,\n isRequired,\n isInvalid,\n onChange,\n className,\n errorMessage,\n selected,\n defaultSelected = false,\n isReadOnly,\n isLastItem,\n name,\n value,\n [\"aria-describedby\"]: ariaDescribedBy,\n ...rest\n } = props;\n const [checked, setChecked] = useState<boolean>(defaultSelected);\n const fallbackRef = useRef<HTMLInputElement>(null);\n const refObj = ref || fallbackRef;\n const inputId = useId();\n\n const isControlled = typeof selected === \"boolean\";\n useEffect(() => {\n if (isControlled) {\n setChecked(selected);\n }\n }, [selected, isControlled]);\n\n const validationClasses = useValidationClasses({ isInvalid });\n const sharedClasses = classNames(\n {\n \"--is-disabled\": isDisabled,\n \"--is-selected\": checked,\n \"--is-required\": typeof isRequired === \"boolean\" && isRequired,\n \"--is-optional\": typeof isRequired === \"boolean\" && !isRequired,\n },\n validationClasses,\n );\n // Append an additional wrapper class name to differenitate from input\n const wrapperClasses = classNames(\n \"mobius\",\n \"mobius-checkbox\",\n sharedClasses,\n className,\n );\n const labelClasses = classNames(\"mobius-checkbox__label\", sharedClasses);\n const inputClasses = classNames(\"mobius-checkbox__input\", sharedClasses);\n const iconClasses = classNames(\"mobius-checkbox__icon\", sharedClasses);\n const errorMessageId = useId();\n const shouldErrorMessageShow = errorMessage ? errorMessageId : undefined;\n const describedBy = spaceDelimitedList([\n shouldErrorMessageShow,\n ariaDescribedBy,\n ]);\n const labelId = useId();\n\n const handleChange = (event: ChangeEvent<CheckboxElementType>) => {\n setChecked(!checked);\n if (onChange) {\n onChange(event, isLastItem);\n }\n };\n\n return (\n <Stack gap=\"xs\" className={wrapperClasses}>\n <label className={labelClasses}>\n <input\n aria-describedby={describedBy}\n aria-errormessage={shouldErrorMessageShow}\n aria-invalid={isInvalid}\n aria-labelledby={labelId}\n readOnly={isReadOnly}\n disabled={isDisabled}\n ref={refObj}\n className={inputClasses}\n onChange={handleChange}\n type=\"checkbox\"\n checked={checked}\n required={isRequired}\n id={id || inputId}\n name={name}\n value={value}\n {...rest}\n />\n <Icon\n icon={checked ? squareTick : square}\n size=\"md\"\n className={iconClasses}\n />\n <span id={labelId} className=\"mobius-checkbox__visible-label\">\n {label}\n </span>\n </label>\n <ErrorMessage id={errorMessageId} errorMessage={errorMessage} />\n </Stack>\n );\n};\n\nCheckbox.displayName = \"Checkbox\";\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;AAGA,SAAS,QAAQ,OAAO,UAAU,iBAAiB;AACnD,OAAO,gBAAgB;AACvB,SAAS,YAAY,cAAc;AAOnC,OAAO;AAsED,SACE,KADF;AApEC,IAAM,WAAW,CAAC,EAAE,KAAK,GAAG,MAAM,MAAqB;AAC5D,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,kBAAkB,GAAG;AAAA,IACtB,GAAG;AAAA,EACL,IAAI;AACJ,QAAM,CAAC,SAAS,UAAU,IAAI,SAAkB,eAAe;AAC/D,QAAM,cAAc,OAAyB,IAAI;AACjD,QAAM,SAAS,OAAO;AACtB,QAAM,UAAU,MAAM;AAEtB,QAAM,eAAe,OAAO,aAAa;AACzC,YAAU,MAAM;AACd,QAAI,cAAc;AAChB,iBAAW,QAAQ;AAAA,IACrB;AAAA,EACF,GAAG,CAAC,UAAU,YAAY,CAAC;AAE3B,QAAM,oBAAoB,qBAAqB,EAAE,UAAU,CAAC;AAC5D,QAAM,gBAAgB;AAAA,IACpB;AAAA,MACE,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,MACjB,iBAAiB,OAAO,eAAe,aAAa;AAAA,MACpD,iBAAiB,OAAO,eAAe,aAAa,CAAC;AAAA,IACvD;AAAA,IACA;AAAA,EACF;AAEA,QAAM,iBAAiB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,eAAe,WAAW,0BAA0B,aAAa;AACvE,QAAM,eAAe,WAAW,0BAA0B,aAAa;AACvE,QAAM,cAAc,WAAW,yBAAyB,aAAa;AACrE,QAAM,iBAAiB,MAAM;AAC7B,QAAM,yBAAyB,eAAe,iBAAiB;AAC/D,QAAM,cAAc,mBAAmB;AAAA,IACrC;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,UAAU,MAAM;AAEtB,QAAM,eAAe,CAAC,UAA4C;AAChE,eAAW,CAAC,OAAO;AACnB,QAAI,UAAU;AACZ,eAAS,OAAO,UAAU;AAAA,IAC5B;AAAA,EACF;AAEA,SACE,qBAAC,SAAM,KAAI,MAAK,WAAW,gBACzB;AAAA,yBAAC,WAAM,WAAW,cAChB;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,oBAAkB;AAAA,UAClB,qBAAmB;AAAA,UACnB,gBAAc;AAAA,UACd,mBAAiB;AAAA,UACjB,UAAU;AAAA,UACV,UAAU;AAAA,UACV,KAAK;AAAA,UACL,WAAW;AAAA,UACX,UAAU;AAAA,UACV,MAAK;AAAA,UACL;AAAA,UACA,UAAU;AAAA,UACV,IAAI,MAAM;AAAA,UACV;AAAA,UACA;AAAA,UACC,GAAG;AAAA;AAAA,MACN;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,MAAM,UAAU,aAAa;AAAA,UAC7B,MAAK;AAAA,UACL,WAAW;AAAA;AAAA,MACb;AAAA,MACA,oBAAC,UAAK,IAAI,SAAS,WAAU,kCAC1B,iBACH;AAAA,OACF;AAAA,IACA,oBAAC,gBAAa,IAAI,gBAAgB,cAA4B;AAAA,KAChE;AAEJ;AAEA,SAAS,cAAc;",
6
+ "names": []
7
+ }
@@ -1,9 +1,9 @@
1
- import {
2
- Label
3
- } from "./chunk-ZN7OWLZY.js";
4
1
  import {
5
2
  numberFormatter
6
3
  } from "./chunk-4SIR6D4L.js";
4
+ import {
5
+ Label
6
+ } from "./chunk-ZN7OWLZY.js";
7
7
  import {
8
8
  useLabel
9
9
  } from "./chunk-YLEFK7S2.js";
@@ -101,4 +101,4 @@ var Slider = (props) => {
101
101
  export {
102
102
  Slider
103
103
  };
104
- //# sourceMappingURL=chunk-CNOF66SV.js.map
104
+ //# sourceMappingURL=chunk-NGNVAFBJ.js.map
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=chunk-NOQ27VLY.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,101 @@
1
+ import {
2
+ Accordion
3
+ } from "./chunk-7JT4DKQA.js";
4
+ import {
5
+ TextOrHTML
6
+ } from "./chunk-DYTHXKMX.js";
7
+ import {
8
+ useBreakpoint
9
+ } from "./chunk-7FQ7SXK4.js";
10
+
11
+ // src/components/ExpandableText/ExpandableText.tsx
12
+ import classNames from "classnames/dedupe";
13
+ import { useEffect, useId, useRef, useState } from "react";
14
+ import "@simplybusiness/mobius/src/components/ExpandableText/ExpandableText.css";
15
+ import { jsx, jsxs } from "react/jsx-runtime";
16
+ var ExpandableText = ({ ref, ...props }) => {
17
+ const {
18
+ text,
19
+ maxLines = 3,
20
+ breakpoint,
21
+ showText = "Read more",
22
+ hideText = "Read less",
23
+ className,
24
+ textProps = {},
25
+ accordionProps = {},
26
+ onToggle,
27
+ ...otherProps
28
+ } = props;
29
+ const [isExpanded, setIsExpanded] = useState(false);
30
+ const [isCollapsed, setIsCollapsed] = useState(false);
31
+ const textRef = useRef(null);
32
+ const { down } = useBreakpoint();
33
+ const baseId = useId();
34
+ const expandButtonId = `expandable-text-expand-${baseId}`;
35
+ const shouldCollapse = breakpoint ? down(breakpoint) : true;
36
+ useEffect(() => {
37
+ if (!shouldCollapse || !textRef.current) {
38
+ setIsCollapsed(false);
39
+ return;
40
+ }
41
+ const element = textRef.current;
42
+ const isOverflowing = element.scrollHeight > element.clientHeight;
43
+ setIsCollapsed(isOverflowing);
44
+ }, [text, shouldCollapse, maxLines]);
45
+ if (breakpoint && !shouldCollapse) {
46
+ return /* @__PURE__ */ jsx("div", { ref, className, ...otherProps, children: /* @__PURE__ */ jsx(TextOrHTML, { text, textWrapper: true, ...textProps }) });
47
+ }
48
+ const handleAccordionChange = (expanded) => {
49
+ setIsExpanded(expanded);
50
+ onToggle?.(expanded);
51
+ };
52
+ const classes = classNames("mobius-expandable-text", className);
53
+ const textContainerClasses = classNames("mobius-expandable-text__content", {
54
+ "mobius-expandable-text__content--collapsed": !isExpanded
55
+ });
56
+ const textContainerStyle = {
57
+ "--line-clamp": maxLines
58
+ };
59
+ return /* @__PURE__ */ jsxs(
60
+ "div",
61
+ {
62
+ ref,
63
+ className: classes,
64
+ "data-testid": "expandable-text",
65
+ ...otherProps,
66
+ children: [
67
+ /* @__PURE__ */ jsx(
68
+ "div",
69
+ {
70
+ ref: textRef,
71
+ className: textContainerClasses,
72
+ style: textContainerStyle,
73
+ "data-testid": "expandable-text-content",
74
+ "aria-describedby": isCollapsed ? expandButtonId : void 0,
75
+ children: /* @__PURE__ */ jsx(TextOrHTML, { elementType: "span", textWrapper: true, text, ...textProps })
76
+ }
77
+ ),
78
+ isCollapsed && /* @__PURE__ */ jsx(
79
+ Accordion,
80
+ {
81
+ showText,
82
+ hideText,
83
+ headerPosition: "bottom",
84
+ onChange: handleAccordionChange,
85
+ onClick: (e) => {
86
+ e?.stopPropagation();
87
+ },
88
+ id: expandButtonId,
89
+ ...accordionProps
90
+ }
91
+ )
92
+ ]
93
+ }
94
+ );
95
+ };
96
+ ExpandableText.displayName = "ExpandableText";
97
+
98
+ export {
99
+ ExpandableText
100
+ };
101
+ //# sourceMappingURL=chunk-ONDOONBM.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/components/ExpandableText/ExpandableText.tsx"],
4
+ "sourcesContent": ["\"use client\";\n\nimport classNames from \"classnames/dedupe\";\nimport type React from \"react\";\nimport type { RefAttributes } from \"react\";\nimport { useEffect, useId, useRef, useState } from \"react\";\nimport { useBreakpoint } from \"../../hooks\";\nimport type { DOMProps } from \"../../types\";\nimport { Accordion } from \"../Accordion\";\nimport { TextOrHTML } from \"../TextOrHTML\";\nimport type { AccordionProps } from \"../Accordion/Accordion\";\nimport type { TextProps } from \"../Text/Text\";\nimport \"./ExpandableText.css\";\n\nexport type ExpandableTextElementType = HTMLDivElement;\n\nexport interface ExpandableTextProps\n extends DOMProps, RefAttributes<ExpandableTextElementType> {\n /** The text content to display (can be plain text or HTML) */\n text: string;\n /** Maximum number of lines to show when collapsed */\n maxLines?: number;\n /** Breakpoint at which collapsing should be applied. If not provided, collapsing is always applied */\n breakpoint?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n /** Text for the expand trigger */\n showText?: string;\n /** Text for the collapse trigger */\n hideText?: string;\n /** Custom class name for the container */\n className?: string;\n /** Props to pass to the Text component */\n textProps?: Partial<TextProps>;\n /** Props to pass to the Accordion component */\n accordionProps?: Partial<AccordionProps>;\n /** Callback when expansion state changes */\n onToggle?: (expanded: boolean) => void;\n}\n\nexport const ExpandableText = ({ ref, ...props }: ExpandableTextProps) => {\n const {\n text,\n maxLines = 3,\n breakpoint,\n showText = \"Read more\",\n hideText = \"Read less\",\n className,\n textProps = {},\n accordionProps = {},\n onToggle,\n ...otherProps\n } = props;\n\n const [isExpanded, setIsExpanded] = useState(false);\n const [isCollapsed, setIsCollapsed] = useState(false);\n const textRef = useRef<HTMLDivElement>(null);\n const { down } = useBreakpoint();\n\n // Generate unique ID for accessibility\n const baseId = useId();\n const expandButtonId = `expandable-text-expand-${baseId}`;\n\n // Determine if content should be collapsible based on breakpoint\n const shouldCollapse = breakpoint ? down(breakpoint) : true;\n\n useEffect(() => {\n if (!shouldCollapse || !textRef.current) {\n setIsCollapsed(false);\n return;\n }\n\n // Check if text is actually collapsed by comparing scroll height with client height\n const element = textRef.current;\n const isOverflowing = element.scrollHeight > element.clientHeight;\n setIsCollapsed(isOverflowing);\n }, [text, shouldCollapse, maxLines]);\n\n // If breakpoint is specified and we're above it, show full text without collapsible UI\n if (breakpoint && !shouldCollapse) {\n return (\n <div ref={ref} className={className} {...otherProps}>\n <TextOrHTML text={text} textWrapper {...textProps} />\n </div>\n );\n }\n\n const handleAccordionChange = (expanded: boolean) => {\n setIsExpanded(expanded);\n onToggle?.(expanded);\n };\n\n const classes = classNames(\"mobius-expandable-text\", className);\n const textContainerClasses = classNames(\"mobius-expandable-text__content\", {\n \"mobius-expandable-text__content--collapsed\": !isExpanded,\n });\n\n // CSS custom property for dynamic line clamping\n const textContainerStyle = {\n \"--line-clamp\": maxLines,\n } as React.CSSProperties;\n\n return (\n <div\n ref={ref}\n className={classes}\n data-testid=\"expandable-text\"\n {...otherProps}\n >\n <div\n ref={textRef}\n className={textContainerClasses}\n style={textContainerStyle}\n data-testid=\"expandable-text-content\"\n aria-describedby={isCollapsed ? expandButtonId : undefined}\n >\n <TextOrHTML elementType=\"span\" textWrapper text={text} {...textProps} />\n </div>\n {isCollapsed && (\n <Accordion\n showText={showText}\n hideText={hideText}\n headerPosition=\"bottom\"\n onChange={handleAccordionChange}\n onClick={(e?: React.MouseEvent) => {\n e?.stopPropagation();\n }}\n id={expandButtonId}\n {...accordionProps}\n />\n )}\n </div>\n );\n};\n\nExpandableText.displayName = \"ExpandableText\";\n"],
5
+ "mappings": ";;;;;;;;;;;AAEA,OAAO,gBAAgB;AAGvB,SAAS,WAAW,OAAO,QAAQ,gBAAgB;AAOnD,OAAO;AAoEC,cAqBJ,YArBI;AA1CD,IAAM,iBAAiB,CAAC,EAAE,KAAK,GAAG,MAAM,MAA2B;AACxE,QAAM;AAAA,IACJ;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA,WAAW;AAAA,IACX,WAAW;AAAA,IACX;AAAA,IACA,YAAY,CAAC;AAAA,IACb,iBAAiB,CAAC;AAAA,IAClB;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AAEJ,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,KAAK;AAClD,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,KAAK;AACpD,QAAM,UAAU,OAAuB,IAAI;AAC3C,QAAM,EAAE,KAAK,IAAI,cAAc;AAG/B,QAAM,SAAS,MAAM;AACrB,QAAM,iBAAiB,0BAA0B,MAAM;AAGvD,QAAM,iBAAiB,aAAa,KAAK,UAAU,IAAI;AAEvD,YAAU,MAAM;AACd,QAAI,CAAC,kBAAkB,CAAC,QAAQ,SAAS;AACvC,qBAAe,KAAK;AACpB;AAAA,IACF;AAGA,UAAM,UAAU,QAAQ;AACxB,UAAM,gBAAgB,QAAQ,eAAe,QAAQ;AACrD,mBAAe,aAAa;AAAA,EAC9B,GAAG,CAAC,MAAM,gBAAgB,QAAQ,CAAC;AAGnC,MAAI,cAAc,CAAC,gBAAgB;AACjC,WACE,oBAAC,SAAI,KAAU,WAAuB,GAAG,YACvC,8BAAC,cAAW,MAAY,aAAW,MAAE,GAAG,WAAW,GACrD;AAAA,EAEJ;AAEA,QAAM,wBAAwB,CAAC,aAAsB;AACnD,kBAAc,QAAQ;AACtB,eAAW,QAAQ;AAAA,EACrB;AAEA,QAAM,UAAU,WAAW,0BAA0B,SAAS;AAC9D,QAAM,uBAAuB,WAAW,mCAAmC;AAAA,IACzE,8CAA8C,CAAC;AAAA,EACjD,CAAC;AAGD,QAAM,qBAAqB;AAAA,IACzB,gBAAgB;AAAA,EAClB;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW;AAAA,MACX,eAAY;AAAA,MACX,GAAG;AAAA,MAEJ;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,WAAW;AAAA,YACX,OAAO;AAAA,YACP,eAAY;AAAA,YACZ,oBAAkB,cAAc,iBAAiB;AAAA,YAEjD,8BAAC,cAAW,aAAY,QAAO,aAAW,MAAC,MAAa,GAAG,WAAW;AAAA;AAAA,QACxE;AAAA,QACC,eACC;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA,gBAAe;AAAA,YACf,UAAU;AAAA,YACV,SAAS,CAAC,MAAyB;AACjC,iBAAG,gBAAgB;AAAA,YACrB;AAAA,YACA,IAAI;AAAA,YACH,GAAG;AAAA;AAAA,QACN;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAEA,eAAe,cAAc;",
6
+ "names": []
7
+ }
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=chunk-P34DI6BE.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,97 @@
1
+ import {
2
+ TextField
3
+ } from "./chunk-UIIXVY6K.js";
4
+
5
+ // src/components/NumberField/NumberField.tsx
6
+ import classNames from "classnames/dedupe";
7
+ import { useCallback, useEffect, useRef } from "react";
8
+ import "@simplybusiness/mobius/src/components/NumberField/NumberField.css";
9
+ import { jsx } from "react/jsx-runtime";
10
+ var NumberField = ({ ref, ...props }) => {
11
+ const {
12
+ minValue,
13
+ maxValue,
14
+ step,
15
+ defaultValue,
16
+ hideSpinButtons,
17
+ className,
18
+ ...otherProps
19
+ } = props;
20
+ const {
21
+ onFocus: customOnFocus,
22
+ onBlur: customOnBlur,
23
+ ...rest
24
+ } = otherProps;
25
+ const focusedInputRef = useRef(null);
26
+ const wheelHandler = useCallback((ev) => ev.preventDefault(), []);
27
+ useEffect(() => {
28
+ return () => {
29
+ focusedInputRef.current?.removeEventListener("wheel", wheelHandler);
30
+ focusedInputRef.current = null;
31
+ };
32
+ }, [wheelHandler]);
33
+ const containerClasses = classNames("mobius-number-field", className, {
34
+ "--hide-spin-buttons": hideSpinButtons
35
+ });
36
+ const handleBeforeInput = (event) => {
37
+ const { data } = event.nativeEvent;
38
+ if (step && Number.isInteger(step) && data === ".") {
39
+ event.preventDefault();
40
+ }
41
+ if (minValue && minValue >= 0 && data === "-") {
42
+ event.preventDefault();
43
+ }
44
+ };
45
+ const handleBlur = (event) => {
46
+ const { value } = event.target;
47
+ const numValue = parseFloat(value);
48
+ if (step && step > 1 && !isNaN(numValue)) {
49
+ const baseValue = minValue ?? 0;
50
+ const steps = Math.round((numValue - baseValue) / step);
51
+ const snappedValue = baseValue + steps * step;
52
+ if (snappedValue !== numValue) {
53
+ event.target.value = snappedValue.toString();
54
+ const changeEvent = new Event("change", { bubbles: true });
55
+ event.target.dispatchEvent(changeEvent);
56
+ const syntheticChangeEvent = {
57
+ ...event,
58
+ target: event.target,
59
+ currentTarget: event.currentTarget
60
+ };
61
+ otherProps.onChange?.(syntheticChangeEvent);
62
+ }
63
+ }
64
+ customOnBlur?.(event);
65
+ };
66
+ const forwardedProps = {
67
+ ...rest,
68
+ onFocus: (e) => {
69
+ const el = e.currentTarget;
70
+ focusedInputRef.current?.removeEventListener("wheel", wheelHandler);
71
+ focusedInputRef.current = el;
72
+ el.addEventListener("wheel", wheelHandler, { passive: false });
73
+ customOnFocus?.(e);
74
+ },
75
+ onBlur: (e) => handleBlur(e)
76
+ };
77
+ return /* @__PURE__ */ jsx(
78
+ TextField,
79
+ {
80
+ ...forwardedProps,
81
+ className: containerClasses,
82
+ onBeforeInput: handleBeforeInput,
83
+ type: "number",
84
+ min: minValue ?? void 0,
85
+ max: maxValue ?? void 0,
86
+ step,
87
+ ref,
88
+ defaultValue: defaultValue != null ? defaultValue?.toString() : defaultValue
89
+ }
90
+ );
91
+ };
92
+ NumberField.displayName = "NumberField";
93
+
94
+ export {
95
+ NumberField
96
+ };
97
+ //# sourceMappingURL=chunk-P5VEI574.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/components/NumberField/NumberField.tsx"],
4
+ "sourcesContent": ["\"use client\";\n\nimport classNames from \"classnames/dedupe\";\nimport type React from \"react\";\nimport { type RefAttributes, useCallback, useEffect, useRef } from \"react\";\nimport {\n TextField,\n type TextFieldElementType,\n type TextFieldProps,\n} from \"../TextField\";\nimport \"./NumberField.css\";\n\nexport type NumberFieldElementType = TextFieldElementType;\n\nexport interface NumberFieldProps\n extends\n Omit<TextFieldProps, \"type\" | \"defaultValue\" | \"inputElementType\">,\n RefAttributes<NumberFieldElementType> {\n /** The smallest value allowed for the input. */\n minValue?: number;\n /** The largest value allowed for the input. */\n maxValue?: number;\n /** The amount that the input value changes with each increment or decrement \"tick\". */\n step?: number; // ??\n /** The default value for the input. */\n defaultValue?: number;\n /** Flag to hide the spin buttons. */\n hideSpinButtons?: boolean;\n}\n\nexport const NumberField = ({ ref, ...props }: NumberFieldProps) => {\n const {\n minValue,\n maxValue,\n step,\n defaultValue,\n hideSpinButtons,\n className,\n ...otherProps\n } = props;\n const {\n onFocus: customOnFocus,\n onBlur: customOnBlur,\n ...rest\n } = otherProps as Omit<TextFieldProps, \"onFocus\" | \"onBlur\"> & {\n onFocus?: React.FocusEventHandler<HTMLInputElement>;\n onBlur?: React.FocusEventHandler<HTMLInputElement>;\n };\n\n const focusedInputRef = useRef<HTMLInputElement | null>(null);\n const wheelHandler = useCallback((ev: Event) => ev.preventDefault(), []);\n\n useEffect(() => {\n return () => {\n focusedInputRef.current?.removeEventListener(\"wheel\", wheelHandler);\n focusedInputRef.current = null;\n };\n }, [wheelHandler]);\n\n const containerClasses = classNames(\"mobius-number-field\", className, {\n \"--hide-spin-buttons\": hideSpinButtons,\n });\n\n const handleBeforeInput = (\n event: React.FormEvent<NumberFieldElementType>,\n ) => {\n const { data } = event.nativeEvent as InputEvent;\n if (step && Number.isInteger(step) && data === \".\") {\n event.preventDefault();\n }\n if (minValue && minValue >= 0 && data === \"-\") {\n event.preventDefault();\n }\n };\n\n const handleBlur = (event: React.FocusEvent<HTMLInputElement>) => {\n const { value } = event.target;\n const numValue = parseFloat(value);\n\n // On blur, snap to nearest valid step value if step is defined\n if (step && step > 1 && !isNaN(numValue)) {\n const baseValue = minValue ?? 0;\n const steps = Math.round((numValue - baseValue) / step);\n const snappedValue = baseValue + steps * step;\n\n // Only update if the value changed\n if (snappedValue !== numValue) {\n event.target.value = snappedValue.toString();\n // Trigger change event for the corrected value\n const changeEvent = new Event(\"change\", { bubbles: true });\n event.target.dispatchEvent(changeEvent);\n // Also call the onChange handler if provided\n const syntheticChangeEvent = {\n ...event,\n target: event.target,\n currentTarget: event.currentTarget,\n } as React.ChangeEvent<HTMLInputElement>;\n otherProps.onChange?.(syntheticChangeEvent);\n }\n }\n\n customOnBlur?.(event);\n };\n\n const forwardedProps: TextFieldProps = {\n ...rest,\n onFocus: e => {\n const el = e.currentTarget as HTMLInputElement;\n focusedInputRef.current?.removeEventListener(\"wheel\", wheelHandler);\n focusedInputRef.current = el;\n el.addEventListener(\"wheel\", wheelHandler, { passive: false });\n customOnFocus?.(e as React.FocusEvent<HTMLInputElement>);\n },\n onBlur: e => handleBlur(e as React.FocusEvent<HTMLInputElement>),\n };\n\n return (\n <TextField\n {...forwardedProps}\n className={containerClasses}\n onBeforeInput={handleBeforeInput}\n type=\"number\"\n min={minValue ?? undefined}\n max={maxValue ?? undefined}\n step={step}\n ref={ref}\n defaultValue={\n defaultValue != null ? defaultValue?.toString() : defaultValue\n }\n />\n );\n};\n\nNumberField.displayName = \"NumberField\";\n"],
5
+ "mappings": ";;;;;AAEA,OAAO,gBAAgB;AAEvB,SAA6B,aAAa,WAAW,cAAc;AAMnE,OAAO;AA2GH;AAvFG,IAAM,cAAc,CAAC,EAAE,KAAK,GAAG,MAAM,MAAwB;AAClE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AACJ,QAAM;AAAA,IACJ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,GAAG;AAAA,EACL,IAAI;AAKJ,QAAM,kBAAkB,OAAgC,IAAI;AAC5D,QAAM,eAAe,YAAY,CAAC,OAAc,GAAG,eAAe,GAAG,CAAC,CAAC;AAEvE,YAAU,MAAM;AACd,WAAO,MAAM;AACX,sBAAgB,SAAS,oBAAoB,SAAS,YAAY;AAClE,sBAAgB,UAAU;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,mBAAmB,WAAW,uBAAuB,WAAW;AAAA,IACpE,uBAAuB;AAAA,EACzB,CAAC;AAED,QAAM,oBAAoB,CACxB,UACG;AACH,UAAM,EAAE,KAAK,IAAI,MAAM;AACvB,QAAI,QAAQ,OAAO,UAAU,IAAI,KAAK,SAAS,KAAK;AAClD,YAAM,eAAe;AAAA,IACvB;AACA,QAAI,YAAY,YAAY,KAAK,SAAS,KAAK;AAC7C,YAAM,eAAe;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,aAAa,CAAC,UAA8C;AAChE,UAAM,EAAE,MAAM,IAAI,MAAM;AACxB,UAAM,WAAW,WAAW,KAAK;AAGjC,QAAI,QAAQ,OAAO,KAAK,CAAC,MAAM,QAAQ,GAAG;AACxC,YAAM,YAAY,YAAY;AAC9B,YAAM,QAAQ,KAAK,OAAO,WAAW,aAAa,IAAI;AACtD,YAAM,eAAe,YAAY,QAAQ;AAGzC,UAAI,iBAAiB,UAAU;AAC7B,cAAM,OAAO,QAAQ,aAAa,SAAS;AAE3C,cAAM,cAAc,IAAI,MAAM,UAAU,EAAE,SAAS,KAAK,CAAC;AACzD,cAAM,OAAO,cAAc,WAAW;AAEtC,cAAM,uBAAuB;AAAA,UAC3B,GAAG;AAAA,UACH,QAAQ,MAAM;AAAA,UACd,eAAe,MAAM;AAAA,QACvB;AACA,mBAAW,WAAW,oBAAoB;AAAA,MAC5C;AAAA,IACF;AAEA,mBAAe,KAAK;AAAA,EACtB;AAEA,QAAM,iBAAiC;AAAA,IACrC,GAAG;AAAA,IACH,SAAS,OAAK;AACZ,YAAM,KAAK,EAAE;AACb,sBAAgB,SAAS,oBAAoB,SAAS,YAAY;AAClE,sBAAgB,UAAU;AAC1B,SAAG,iBAAiB,SAAS,cAAc,EAAE,SAAS,MAAM,CAAC;AAC7D,sBAAgB,CAAuC;AAAA,IACzD;AAAA,IACA,QAAQ,OAAK,WAAW,CAAuC;AAAA,EACjE;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,WAAW;AAAA,MACX,eAAe;AAAA,MACf,MAAK;AAAA,MACL,KAAK,YAAY;AAAA,MACjB,KAAK,YAAY;AAAA,MACjB;AAAA,MACA;AAAA,MACA,cACE,gBAAgB,OAAO,cAAc,SAAS,IAAI;AAAA;AAAA,EAEtD;AAEJ;AAEA,YAAY,cAAc;",
6
+ "names": []
7
+ }
@@ -0,0 +1,64 @@
1
+ import {
2
+ ErrorMessage
3
+ } from "./chunk-UQVAEWY2.js";
4
+ import {
5
+ Stack
6
+ } from "./chunk-XH3OJQMW.js";
7
+ import {
8
+ Label
9
+ } from "./chunk-ZN7OWLZY.js";
10
+ import {
11
+ TextAreaInput
12
+ } from "./chunk-BM4M36KU.js";
13
+ import {
14
+ useTextField
15
+ } from "./chunk-UYVF3QSW.js";
16
+ import {
17
+ useValidationClasses
18
+ } from "./chunk-DYOFXXZD.js";
19
+
20
+ // src/components/TextArea/TextArea.tsx
21
+ import classNames from "classnames/dedupe";
22
+ import "@simplybusiness/mobius/src/components/TextArea/TextArea.css";
23
+ import { jsx, jsxs } from "react/jsx-runtime";
24
+ var TextArea = ({ ref, ...props }) => {
25
+ const {
26
+ isDisabled,
27
+ className,
28
+ errorMessage,
29
+ label,
30
+ isInvalid,
31
+ ...otherProps
32
+ } = props;
33
+ const { inputProps, labelProps, errorMessageProps } = useTextField(props);
34
+ const classes = classNames("mobius", "mobius-text-area", className);
35
+ const validationClasses = useValidationClasses({ isInvalid });
36
+ const inputClasses = classNames("mobius-text-area__input", validationClasses);
37
+ const labelClasses = classNames(
38
+ {
39
+ "--is-disabled": isDisabled
40
+ },
41
+ validationClasses
42
+ );
43
+ return /* @__PURE__ */ jsxs(Stack, { className: classes, gap: "xs", children: [
44
+ label && /* @__PURE__ */ jsx(Label, { ...labelProps, className: labelClasses, children: props.label }),
45
+ /* @__PURE__ */ jsx(
46
+ TextAreaInput,
47
+ {
48
+ ...otherProps,
49
+ ...inputProps,
50
+ ref,
51
+ className: inputClasses,
52
+ isDisabled,
53
+ "aria-invalid": errorMessage != null
54
+ }
55
+ ),
56
+ /* @__PURE__ */ jsx(ErrorMessage, { ...errorMessageProps, errorMessage })
57
+ ] });
58
+ };
59
+ TextArea.displayName = "TextArea";
60
+
61
+ export {
62
+ TextArea
63
+ };
64
+ //# sourceMappingURL=chunk-QPIA6BGW.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/components/TextArea/TextArea.tsx"],
4
+ "sourcesContent": ["\"use client\";\n\nimport classNames from \"classnames/dedupe\";\nimport type { RefAttributes } from \"react\";\nimport type { UseTextFieldProps } from \"../../hooks\";\nimport { useTextField, useValidationClasses } from \"../../hooks\";\nimport type { DOMProps } from \"../../types/dom\";\nimport { ErrorMessage } from \"../ErrorMessage\";\nimport { Label } from \"../Label\";\nimport { Stack } from \"../Stack\";\nimport { TextAreaInput } from \"../TextAreaInput\";\nimport \"./TextArea.css\";\n\nexport type TextAreaElementType = HTMLTextAreaElement;\n\nexport interface TextAreaProps\n extends UseTextFieldProps, DOMProps, RefAttributes<TextAreaElementType> {\n className?: string;\n errorMessage?: string;\n}\n\nconst TextArea = ({ ref, ...props }: TextAreaProps) => {\n const {\n isDisabled,\n className,\n errorMessage,\n label,\n isInvalid,\n ...otherProps\n } = props;\n\n const { inputProps, labelProps, errorMessageProps } = useTextField(props);\n\n // Set class name for atom, including interaction state\n const classes = classNames(\"mobius\", \"mobius-text-area\", className);\n const validationClasses = useValidationClasses({ isInvalid });\n const inputClasses = classNames(\"mobius-text-area__input\", validationClasses);\n const labelClasses = classNames(\n {\n \"--is-disabled\": isDisabled,\n },\n validationClasses,\n );\n\n return (\n <Stack className={classes} gap=\"xs\">\n {label && (\n <Label {...labelProps} className={labelClasses}>\n {props.label}\n </Label>\n )}\n <TextAreaInput\n {...otherProps}\n {...inputProps}\n ref={ref}\n className={inputClasses}\n isDisabled={isDisabled}\n aria-invalid={errorMessage != null}\n />\n <ErrorMessage {...errorMessageProps} errorMessage={errorMessage} />\n </Stack>\n );\n};\n\nTextArea.displayName = \"TextArea\";\nexport { TextArea };\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;AAEA,OAAO,gBAAgB;AASvB,OAAO;AAkCH,SAEI,KAFJ;AAxBJ,IAAM,WAAW,CAAC,EAAE,KAAK,GAAG,MAAM,MAAqB;AACrD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AAEJ,QAAM,EAAE,YAAY,YAAY,kBAAkB,IAAI,aAAa,KAAK;AAGxE,QAAM,UAAU,WAAW,UAAU,oBAAoB,SAAS;AAClE,QAAM,oBAAoB,qBAAqB,EAAE,UAAU,CAAC;AAC5D,QAAM,eAAe,WAAW,2BAA2B,iBAAiB;AAC5E,QAAM,eAAe;AAAA,IACnB;AAAA,MACE,iBAAiB;AAAA,IACnB;AAAA,IACA;AAAA,EACF;AAEA,SACE,qBAAC,SAAM,WAAW,SAAS,KAAI,MAC5B;AAAA,aACC,oBAAC,SAAO,GAAG,YAAY,WAAW,cAC/B,gBAAM,OACT;AAAA,IAEF;AAAA,MAAC;AAAA;AAAA,QACE,GAAG;AAAA,QACH,GAAG;AAAA,QACJ;AAAA,QACA,WAAW;AAAA,QACX;AAAA,QACA,gBAAc,gBAAgB;AAAA;AAAA,IAChC;AAAA,IACA,oBAAC,gBAAc,GAAG,mBAAmB,cAA4B;AAAA,KACnE;AAEJ;AAEA,SAAS,cAAc;",
6
+ "names": []
7
+ }
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=chunk-SZEFLEDA.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=chunk-TXB4BOHB.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }