@simplybusiness/mobius 10.3.2 → 10.3.4
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.
- package/CHANGELOG.md +16 -0
- package/dist/cjs/components/AddressLookup/AddressLookup.js +888 -5314
- package/dist/cjs/components/AddressLookup/AddressLookup.js.map +4 -4
- package/dist/cjs/components/AddressLookup/index.js +952 -5381
- package/dist/cjs/components/AddressLookup/index.js.map +4 -4
- package/dist/cjs/components/Checkbox/Checkbox.js +245 -5625
- package/dist/cjs/components/Checkbox/Checkbox.js.map +4 -4
- package/dist/cjs/components/Checkbox/CheckboxGroup.js +371 -5614
- package/dist/cjs/components/Checkbox/CheckboxGroup.js.map +4 -4
- package/dist/cjs/components/Checkbox/index.js +377 -5619
- package/dist/cjs/components/Checkbox/index.js.map +4 -4
- package/dist/cjs/components/Combobox/Combobox.js +829 -5344
- package/dist/cjs/components/Combobox/Combobox.js.map +4 -4
- package/dist/cjs/components/Combobox/index.js +813 -5327
- package/dist/cjs/components/Combobox/index.js.map +4 -4
- package/dist/cjs/components/DateField/DateField.js +379 -5505
- package/dist/cjs/components/DateField/DateField.js.map +4 -4
- package/dist/cjs/components/DateField/index.js +383 -5508
- package/dist/cjs/components/DateField/index.js.map +4 -4
- package/dist/cjs/components/ErrorMessage/ErrorMessage.js +120 -5643
- package/dist/cjs/components/ErrorMessage/ErrorMessage.js.map +4 -4
- package/dist/cjs/components/ErrorMessage/index.js +121 -5642
- package/dist/cjs/components/ErrorMessage/index.js.map +4 -4
- package/dist/cjs/components/ExpandableText/ExpandableText.js +511 -5604
- package/dist/cjs/components/ExpandableText/ExpandableText.js.map +4 -4
- package/dist/cjs/components/ExpandableText/index.js +512 -5604
- package/dist/cjs/components/ExpandableText/index.js.map +4 -4
- package/dist/cjs/components/MaskedField/MaskedField.js +394 -5511
- package/dist/cjs/components/MaskedField/MaskedField.js.map +4 -4
- package/dist/cjs/components/MaskedField/index.js +293 -5118
- package/dist/cjs/components/MaskedField/index.js.map +4 -4
- package/dist/cjs/components/NumberField/NumberField.js +357 -5523
- package/dist/cjs/components/NumberField/NumberField.js.map +4 -4
- package/dist/cjs/components/NumberField/index.js +358 -5523
- package/dist/cjs/components/NumberField/index.js.map +4 -4
- package/dist/cjs/components/PasswordField/PasswordField.js +330 -5511
- package/dist/cjs/components/PasswordField/PasswordField.js.map +4 -4
- package/dist/cjs/components/PasswordField/ShowHideButton.js +32 -5655
- package/dist/cjs/components/PasswordField/ShowHideButton.js.map +4 -4
- package/dist/cjs/components/PasswordField/index.js +332 -5512
- package/dist/cjs/components/PasswordField/index.js.map +4 -4
- package/dist/cjs/components/Radio/Radio.js +242 -5632
- package/dist/cjs/components/Radio/Radio.js.map +4 -4
- package/dist/cjs/components/Radio/RadioGroup.js +274 -5619
- package/dist/cjs/components/Radio/RadioGroup.js.map +4 -4
- package/dist/cjs/components/Radio/index.js +404 -5628
- package/dist/cjs/components/Radio/index.js.map +4 -4
- package/dist/cjs/components/Select/Select.js +233 -5588
- package/dist/cjs/components/Select/Select.js.map +4 -4
- package/dist/cjs/components/Select/index.js +234 -5588
- package/dist/cjs/components/Select/index.js.map +4 -4
- package/dist/cjs/components/TextArea/TextArea.js +229 -5531
- package/dist/cjs/components/TextArea/TextArea.js.map +4 -4
- package/dist/cjs/components/TextArea/index.js +230 -5531
- package/dist/cjs/components/TextArea/index.js.map +4 -4
- package/dist/cjs/components/TextField/TextField.js +265 -5522
- package/dist/cjs/components/TextField/TextField.js.map +4 -4
- package/dist/cjs/components/TextField/index.js +266 -5522
- package/dist/cjs/components/TextField/index.js.map +4 -4
- package/dist/cjs/components/index.js +4273 -5291
- package/dist/cjs/components/index.js.map +4 -4
- package/dist/cjs/index.js +4304 -5334
- package/dist/cjs/index.js.map +4 -4
- package/dist/cjs/meta.json +5734 -51529
- package/dist/esm/chunk-3O5DIIGS.js +1 -0
- package/dist/esm/chunk-3O5DIIGS.js.map +7 -0
- package/dist/esm/chunk-3PRSHEVX.js +1 -0
- package/dist/esm/chunk-3PRSHEVX.js.map +7 -0
- package/dist/esm/chunk-4NBLO5WK.js +54 -0
- package/dist/esm/chunk-4NBLO5WK.js.map +7 -0
- package/dist/esm/chunk-4WVJNNBK.js +157 -0
- package/dist/esm/chunk-4WVJNNBK.js.map +7 -0
- package/dist/esm/chunk-5L4G4VLM.js +1 -0
- package/dist/esm/chunk-5L4G4VLM.js.map +7 -0
- package/dist/esm/chunk-5OFXPT4J.js +135 -0
- package/dist/esm/chunk-5OFXPT4J.js.map +7 -0
- package/dist/esm/chunk-6O77SOOB.js +1 -0
- package/dist/esm/chunk-6O77SOOB.js.map +7 -0
- package/dist/esm/chunk-AFU7BFCD.js +151 -0
- package/dist/esm/chunk-AFU7BFCD.js.map +7 -0
- package/dist/esm/chunk-BGR2OTTR.js +1 -0
- package/dist/esm/chunk-BGR2OTTR.js.map +7 -0
- package/dist/esm/chunk-BIGO5EVC.js +1 -0
- package/dist/esm/chunk-BIGO5EVC.js.map +7 -0
- package/dist/esm/chunk-CUOVI2HT.js +1 -0
- package/dist/esm/chunk-CUOVI2HT.js.map +7 -0
- package/dist/esm/chunk-F4RQKLF7.js +1 -0
- package/dist/esm/chunk-F4RQKLF7.js.map +7 -0
- package/dist/esm/chunk-FKTDL7KO.js +355 -0
- package/dist/esm/chunk-FKTDL7KO.js.map +7 -0
- package/dist/esm/chunk-KQZ3MNK5.js +100 -0
- package/dist/esm/chunk-KQZ3MNK5.js.map +7 -0
- package/dist/esm/chunk-M2NDSQR5.js +106 -0
- package/dist/esm/chunk-M2NDSQR5.js.map +7 -0
- package/dist/esm/chunk-N4WQ6522.js +125 -0
- package/dist/esm/chunk-N4WQ6522.js.map +7 -0
- package/dist/esm/{chunk-CNOF66SV.js → chunk-NGNVAFBJ.js} +4 -4
- package/dist/esm/chunk-NOQ27VLY.js +1 -0
- package/dist/esm/chunk-NOQ27VLY.js.map +7 -0
- package/dist/esm/chunk-ONDOONBM.js +101 -0
- package/dist/esm/chunk-ONDOONBM.js.map +7 -0
- package/dist/esm/chunk-P34DI6BE.js +1 -0
- package/dist/esm/chunk-P34DI6BE.js.map +7 -0
- package/dist/esm/chunk-P5VEI574.js +97 -0
- package/dist/esm/chunk-P5VEI574.js.map +7 -0
- package/dist/esm/chunk-QPIA6BGW.js +64 -0
- package/dist/esm/chunk-QPIA6BGW.js.map +7 -0
- package/dist/esm/chunk-SZEFLEDA.js +1 -0
- package/dist/esm/chunk-SZEFLEDA.js.map +7 -0
- package/dist/esm/chunk-TXB4BOHB.js +1 -0
- package/dist/esm/chunk-TXB4BOHB.js.map +7 -0
- package/dist/esm/chunk-UIIXVY6K.js +123 -0
- package/dist/esm/chunk-UIIXVY6K.js.map +7 -0
- package/dist/esm/chunk-UQVAEWY2.js +44 -0
- package/dist/esm/chunk-UQVAEWY2.js.map +7 -0
- package/dist/esm/chunk-WC3D5GNN.js +29 -0
- package/dist/esm/chunk-WC3D5GNN.js.map +7 -0
- package/dist/esm/chunk-WNRO77YH.js +1 -0
- package/dist/esm/chunk-WNRO77YH.js.map +7 -0
- package/dist/esm/chunk-X6EPYQKX.js +96 -0
- package/dist/esm/chunk-X6EPYQKX.js.map +7 -0
- package/dist/esm/chunk-ZN5TRIVZ.js +41 -0
- package/dist/esm/chunk-ZN5TRIVZ.js.map +7 -0
- package/dist/esm/components/AddressLookup/AddressLookup.js +9 -106
- package/dist/esm/components/AddressLookup/index.js +10 -103
- package/dist/esm/components/Checkbox/Checkbox.js +3 -116
- package/dist/esm/components/Checkbox/CheckboxGroup.js +4 -114
- package/dist/esm/components/Checkbox/index.js +7 -114
- package/dist/esm/components/Combobox/Combobox.js +6 -107
- package/dist/esm/components/Combobox/index.js +8 -107
- package/dist/esm/components/DateField/DateField.js +6 -113
- package/dist/esm/components/DateField/index.js +7 -113
- package/dist/esm/components/ErrorMessage/ErrorMessage.js +1 -146
- package/dist/esm/components/ErrorMessage/index.js +2 -146
- package/dist/esm/components/ExpandableText/ExpandableText.js +1 -108
- package/dist/esm/components/ExpandableText/index.js +2 -108
- package/dist/esm/components/MaskedField/MaskedField.js +5 -114
- package/dist/esm/components/MaskedField/MaskedField.js.map +1 -1
- package/dist/esm/components/MaskedField/index.js +6 -114
- package/dist/esm/components/NumberField/NumberField.js +6 -114
- package/dist/esm/components/NumberField/index.js +7 -114
- package/dist/esm/components/PasswordField/PasswordField.js +7 -114
- package/dist/esm/components/PasswordField/ShowHideButton.js +1 -149
- package/dist/esm/components/PasswordField/index.js +8 -114
- package/dist/esm/components/Radio/Radio.js +3 -144
- package/dist/esm/components/Radio/RadioGroup.js +3 -114
- package/dist/esm/components/Radio/index.js +7 -115
- package/dist/esm/components/Select/Select.js +3 -114
- package/dist/esm/components/Select/index.js +4 -114
- package/dist/esm/components/Slider/Slider.js +2 -2
- package/dist/esm/components/Slider/index.js +2 -2
- package/dist/esm/components/TextArea/TextArea.js +3 -112
- package/dist/esm/components/TextArea/index.js +4 -112
- package/dist/esm/components/TextField/TextField.js +4 -114
- package/dist/esm/components/TextField/index.js +5 -114
- package/dist/esm/components/index.js +81 -44
- package/dist/esm/index.js +81 -39
- package/dist/esm/meta.json +6950 -19169
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/components/ErrorMessage/ErrorMessage.tsx +1 -1
- package/src/components/ExpandableText/ExpandableText.tsx +3 -1
- package/src/components/PasswordField/ShowHideButton.tsx +1 -1
- package/dist/esm/chunk-W2RQH4WS.js +0 -1606
- package/dist/esm/chunk-W2RQH4WS.js.map +0 -7
- /package/dist/esm/{chunk-CNOF66SV.js.map → chunk-NGNVAFBJ.js.map} +0 -0
|
@@ -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-
|
|
104
|
+
//# sourceMappingURL=chunk-NGNVAFBJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=chunk-NOQ27VLY.js.map
|
|
@@ -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,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 @@
|
|
|
1
|
+
//# sourceMappingURL=chunk-TXB4BOHB.js.map
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import {
|
|
2
|
+
adornmentWithClassName
|
|
3
|
+
} from "./chunk-IM3I5CZL.js";
|
|
4
|
+
import {
|
|
5
|
+
ErrorMessage
|
|
6
|
+
} from "./chunk-UQVAEWY2.js";
|
|
7
|
+
import {
|
|
8
|
+
Stack
|
|
9
|
+
} from "./chunk-XH3OJQMW.js";
|
|
10
|
+
import {
|
|
11
|
+
Label
|
|
12
|
+
} from "./chunk-ZN7OWLZY.js";
|
|
13
|
+
import {
|
|
14
|
+
useTextField
|
|
15
|
+
} from "./chunk-UYVF3QSW.js";
|
|
16
|
+
import {
|
|
17
|
+
useValidationClasses
|
|
18
|
+
} from "./chunk-DYOFXXZD.js";
|
|
19
|
+
|
|
20
|
+
// src/components/TextField/TextField.tsx
|
|
21
|
+
import classNames from "classnames/dedupe";
|
|
22
|
+
import "@simplybusiness/mobius/src/components/TextField/TextField.css";
|
|
23
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
24
|
+
var TextField = ({ ref, ...props }) => {
|
|
25
|
+
const {
|
|
26
|
+
isDisabled,
|
|
27
|
+
type = "text",
|
|
28
|
+
isInvalid,
|
|
29
|
+
className,
|
|
30
|
+
label,
|
|
31
|
+
errorMessage,
|
|
32
|
+
children,
|
|
33
|
+
isRequired,
|
|
34
|
+
prefixInside,
|
|
35
|
+
prefixOutside,
|
|
36
|
+
suffixInside,
|
|
37
|
+
suffixOutside,
|
|
38
|
+
autoComplete,
|
|
39
|
+
isReadOnly,
|
|
40
|
+
...otherProps
|
|
41
|
+
} = props;
|
|
42
|
+
const resolvedAutoComplete = autoComplete ?? (type === "email" ? "email" : type === "tel" ? "tel" : void 0);
|
|
43
|
+
const { inputProps, labelProps, errorMessageProps } = useTextField({
|
|
44
|
+
...props,
|
|
45
|
+
autoComplete: resolvedAutoComplete,
|
|
46
|
+
"aria-errormessage": errorMessage
|
|
47
|
+
});
|
|
48
|
+
const hidden = type === "hidden";
|
|
49
|
+
const validationClasses = useValidationClasses({ isInvalid });
|
|
50
|
+
const textfieldClasses = {
|
|
51
|
+
"--is-disabled": isDisabled,
|
|
52
|
+
"--is-required": typeof isRequired === "boolean" && isRequired,
|
|
53
|
+
"--is-optional": typeof isRequired === "boolean" && !isRequired,
|
|
54
|
+
"--is-hidden": hidden,
|
|
55
|
+
[className || ""]: true
|
|
56
|
+
};
|
|
57
|
+
const sharedClasses = classNames(validationClasses, textfieldClasses);
|
|
58
|
+
const labelClasses = classNames(
|
|
59
|
+
{
|
|
60
|
+
"--is-disabled": isDisabled
|
|
61
|
+
},
|
|
62
|
+
validationClasses
|
|
63
|
+
);
|
|
64
|
+
const containerClasses = classNames(
|
|
65
|
+
"mobius",
|
|
66
|
+
"mobius-text-field",
|
|
67
|
+
sharedClasses
|
|
68
|
+
);
|
|
69
|
+
const inputClasses = classNames(
|
|
70
|
+
"mobius",
|
|
71
|
+
"mobius-text-field__input",
|
|
72
|
+
sharedClasses
|
|
73
|
+
);
|
|
74
|
+
const inputWrapperClasses = classNames(
|
|
75
|
+
"mobius-text-field__input-wrapper",
|
|
76
|
+
sharedClasses
|
|
77
|
+
);
|
|
78
|
+
return /* @__PURE__ */ jsxs(Stack, { gap: "xs", className: containerClasses, children: [
|
|
79
|
+
label && !hidden && /* @__PURE__ */ jsx(Label, { ...labelProps, className: labelClasses, children: label }),
|
|
80
|
+
/* @__PURE__ */ jsxs("div", { className: "mobius-text-field__inner-container", children: [
|
|
81
|
+
adornmentWithClassName(
|
|
82
|
+
prefixOutside,
|
|
83
|
+
labelClasses,
|
|
84
|
+
"mobius-text-field__prefix-outside"
|
|
85
|
+
),
|
|
86
|
+
/* @__PURE__ */ jsxs("div", { className: inputWrapperClasses, children: [
|
|
87
|
+
adornmentWithClassName(
|
|
88
|
+
prefixInside,
|
|
89
|
+
labelClasses,
|
|
90
|
+
"mobius-text-field__prefix-inside"
|
|
91
|
+
),
|
|
92
|
+
/* @__PURE__ */ jsx(
|
|
93
|
+
"input",
|
|
94
|
+
{
|
|
95
|
+
...otherProps,
|
|
96
|
+
...inputProps,
|
|
97
|
+
ref,
|
|
98
|
+
type,
|
|
99
|
+
className: inputClasses
|
|
100
|
+
}
|
|
101
|
+
),
|
|
102
|
+
adornmentWithClassName(
|
|
103
|
+
suffixInside,
|
|
104
|
+
labelClasses,
|
|
105
|
+
"mobius-text-field__suffix-inside"
|
|
106
|
+
)
|
|
107
|
+
] }),
|
|
108
|
+
adornmentWithClassName(
|
|
109
|
+
suffixOutside,
|
|
110
|
+
labelClasses,
|
|
111
|
+
"mobius-text-field__suffix-outside"
|
|
112
|
+
)
|
|
113
|
+
] }),
|
|
114
|
+
children && /* @__PURE__ */ jsx("div", { className: "mobius-text-field__children", children }),
|
|
115
|
+
/* @__PURE__ */ jsx(ErrorMessage, { ...errorMessageProps, errorMessage })
|
|
116
|
+
] });
|
|
117
|
+
};
|
|
118
|
+
TextField.displayName = "TextField";
|
|
119
|
+
|
|
120
|
+
export {
|
|
121
|
+
TextField
|
|
122
|
+
};
|
|
123
|
+
//# sourceMappingURL=chunk-UIIXVY6K.js.map
|