@hitachivantara/uikit-react-core 5.50.1 → 5.51.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OptionGroup.js","sources":["../../../src/Select/OptionGroup.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport { OptionGroup, OptionGroupProps } from \"@mui/base/OptionGroup\";\nimport { theme } from \"@hitachivantara/uikit-styles\";\n\nimport { ExtractNames, createClasses } from \"../utils/classes\";\nimport { useDefaultProps } from \"../hooks/useDefaultProps\";\n\nconst { staticClasses, useClasses } = createClasses(\"HvOptionGroup\", {\n root: {\n listStyle: \"none\",\n ...theme.typography.label,\n },\n});\n\nexport { staticClasses as optionGroupClasses };\n\nexport type HvOptionGroupClasses = ExtractNames<typeof useClasses>;\n\nexport interface HvOptionGroupProps extends OptionGroupProps {\n classes?: HvOptionGroupClasses;\n}\n\nexport const HvOptionGroup = forwardRef<HTMLLIElement, HvOptionGroupProps>(\n (props, ref) => {\n const {\n className,\n classes: classesProp,\n ...others\n } = useDefaultProps(\"HvOptionGroup\", props);\n const { classes, cx } = useClasses(classesProp);\n\n return (\n <OptionGroup\n ref={ref}\n className={cx(classes.root, className)}\n {...others}\n />\n );\n }\n);\n"],"names":[],"mappings":";;;;;;AAOA,MAAM,EAAE,eAAe,eAAe,cAAc,iBAAiB;AAAA,EACnE,MAAM;AAAA,IACJ,WAAW;AAAA,IACX,GAAG,MAAM,WAAW;AAAA,EACtB;AACF,CAAC;AAUM,MAAM,gBAAgB;AAAA,EAC3B,CAAC,OAAO,QAAQ;AACR,UAAA;AAAA,MACJ;AAAA,MACA,SAAS;AAAA,MACT,GAAG;AAAA,IAAA,IACD,gBAAgB,iBAAiB,KAAK;AAC1C,UAAM,EAAE,SAAS,GAAG,IAAI,WAAW,WAAW;AAG5C,WAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,WAAW,GAAG,QAAQ,MAAM,SAAS;AAAA,QACpC,GAAG;AAAA,MAAA;AAAA,IAAA;AAAA,EAGV;AACF;"}
@@ -0,0 +1,213 @@
1
+ import { jsxs, jsx, Fragment } from "@emotion/react/jsx-runtime";
2
+ import { useState, useRef } from "react";
3
+ import clsx from "clsx";
4
+ import { useSelect, SelectProvider } from "@mui/base/useSelect";
5
+ import { useForkRef, useControlled } from "@mui/material/utils";
6
+ import { Popper } from "@mui/base/Popper";
7
+ import { fixedForwardRef } from "../types/generic.js";
8
+ import { useDefaultProps } from "../hooks/useDefaultProps.js";
9
+ import { useClasses } from "./Select.styles.js";
10
+ import { staticClasses } from "./Select.styles.js";
11
+ import { setId } from "../utils/setId.js";
12
+ import { useUniqueId } from "../hooks/useUniqueId.js";
13
+ import { HvSelectButton } from "./SelectButton.js";
14
+ import { HvPanel } from "../Panel/Panel.js";
15
+ import { HvFormElement } from "../Forms/FormElement/FormElement.js";
16
+ import { HvLabel } from "../Forms/Label/Label.js";
17
+ import { HvInfoMessage } from "../Forms/InfoMessage/InfoMessage.js";
18
+ import { HvListContainer } from "../ListContainer/ListContainer.js";
19
+ import { HvWarningText } from "../Forms/WarningText/WarningText.js";
20
+ function defaultRenderValue(options) {
21
+ if (Array.isArray(options)) {
22
+ if (options.length === 0)
23
+ return null;
24
+ return /* @__PURE__ */ jsx(Fragment, { children: options.map((o) => o.label).join(", ") });
25
+ }
26
+ return options?.label ?? null;
27
+ }
28
+ const mergeIds = (...ids) => clsx(ids) || void 0;
29
+ const HvSelect = fixedForwardRef(function HvSelect2(props, ref) {
30
+ const {
31
+ children,
32
+ classes: classesProp,
33
+ className,
34
+ id: idProp,
35
+ name,
36
+ required,
37
+ disabled: disabledProp,
38
+ readOnly,
39
+ label,
40
+ open: openProp,
41
+ defaultOpen,
42
+ multiple,
43
+ autoComplete,
44
+ options: optionsProp,
45
+ variableWidth,
46
+ value: valueProp,
47
+ defaultValue,
48
+ placeholder,
49
+ "aria-label": ariaLabel,
50
+ "aria-labelledby": ariaLabelledBy,
51
+ description,
52
+ "aria-describedby": ariaDescribedBy,
53
+ status,
54
+ statusMessage,
55
+ "aria-errormessage": ariaErrorMessage,
56
+ getSerializedValue,
57
+ onClick,
58
+ onChange,
59
+ onOpenChange,
60
+ ...others
61
+ } = useDefaultProps("HvSelect", props);
62
+ const { classes, cx } = useClasses(classesProp);
63
+ const [placement, setPlacement] = useState("bottom-start");
64
+ const buttonRef = useRef(null);
65
+ const handleButtonRef = useForkRef(ref, buttonRef);
66
+ const {
67
+ contextValue,
68
+ disabled,
69
+ getButtonProps,
70
+ getListboxProps,
71
+ getHiddenInputProps,
72
+ getOptionMetadata,
73
+ value,
74
+ open
75
+ } = useSelect({
76
+ componentName: "HvSelect",
77
+ name,
78
+ required,
79
+ disabled: disabledProp,
80
+ multiple,
81
+ open: openProp,
82
+ defaultOpen,
83
+ value: valueProp,
84
+ defaultValue,
85
+ options: optionsProp,
86
+ buttonRef: handleButtonRef,
87
+ getSerializedValue,
88
+ onChange,
89
+ onOpenChange: handleOpenChange
90
+ });
91
+ const id = useUniqueId(idProp);
92
+ const labelId = useUniqueId(setId(idProp, "label"));
93
+ const descriptionId = useUniqueId(setId(idProp, "description"));
94
+ const errorMessageId = useUniqueId(setId(idProp, "error"));
95
+ const [validationMessage] = useControlled({
96
+ name: "HvSelect.statusMessage",
97
+ controlled: statusMessage,
98
+ default: "Required"
99
+ });
100
+ const [validationState, setValidationState] = useControlled({
101
+ name: "HvSelect.status",
102
+ controlled: status,
103
+ default: "standBy"
104
+ });
105
+ function handleOpenChange(newOpen) {
106
+ if (!newOpen) {
107
+ const hasValue = multiple ? value.length > 0 : !!value;
108
+ setValidationState(required && !hasValue ? "invalid" : "valid");
109
+ }
110
+ onOpenChange?.(newOpen);
111
+ }
112
+ const canShowError = ariaErrorMessage == null && (status !== void 0 && statusMessage !== void 0 || status === void 0 && required);
113
+ const isInvalid = validationState === "invalid";
114
+ const actualValue = multiple ? value.map((v) => getOptionMetadata(v)).filter((v) => v !== void 0) : getOptionMetadata(value) ?? null;
115
+ const isOpen = open && !!children;
116
+ return /* @__PURE__ */ jsxs(
117
+ HvFormElement,
118
+ {
119
+ name,
120
+ required,
121
+ disabled,
122
+ readOnly,
123
+ status: validationState,
124
+ className: cx(classes.root, className, {
125
+ [classes.disabled]: disabled,
126
+ [classes.readOnly]: readOnly
127
+ }),
128
+ ...others,
129
+ children: [
130
+ (label || description) && /* @__PURE__ */ jsxs("div", { className: classes.labelContainer, children: [
131
+ label && /* @__PURE__ */ jsx(
132
+ HvLabel,
133
+ {
134
+ id: labelId,
135
+ htmlFor: id,
136
+ label,
137
+ className: classes.label
138
+ }
139
+ ),
140
+ description && /* @__PURE__ */ jsx(HvInfoMessage, { id: descriptionId, className: classes.description, children: description })
141
+ ] }),
142
+ /* @__PURE__ */ jsx(
143
+ HvSelectButton,
144
+ {
145
+ id,
146
+ open: isOpen,
147
+ disabled,
148
+ readOnly,
149
+ className: cx(classes.select, {
150
+ [classes.invalid]: validationState === "invalid"
151
+ }),
152
+ placement,
153
+ "aria-label": ariaLabel,
154
+ "aria-labelledby": mergeIds(label && labelId, ariaLabelledBy),
155
+ "aria-invalid": isInvalid ? true : void 0,
156
+ "aria-errormessage": errorMessageId,
157
+ "aria-describedby": mergeIds(
158
+ description && descriptionId,
159
+ ariaDescribedBy
160
+ ),
161
+ ...getButtonProps(),
162
+ children: defaultRenderValue(actualValue) ?? placeholder
163
+ }
164
+ ),
165
+ /* @__PURE__ */ jsx(
166
+ Popper,
167
+ {
168
+ open: isOpen,
169
+ keepMounted: true,
170
+ disablePortal: true,
171
+ anchorEl: buttonRef.current,
172
+ className: classes.popper,
173
+ placement,
174
+ modifiers: [
175
+ {
176
+ enabled: true,
177
+ phase: "main",
178
+ fn: ({ state }) => setPlacement(state.placement)
179
+ }
180
+ ],
181
+ children: /* @__PURE__ */ jsx(
182
+ HvPanel,
183
+ {
184
+ style: {
185
+ width: variableWidth ? "auto" : (buttonRef.current?.clientWidth || 0) + 2
186
+ },
187
+ className: cx(classes.panel, className, {
188
+ [classes.panelOpenedUp]: placement.includes("top"),
189
+ [classes.panelOpenedDown]: placement.includes("bottom")
190
+ }),
191
+ children: /* @__PURE__ */ jsx(SelectProvider, { value: contextValue, children: /* @__PURE__ */ jsx(HvListContainer, { condensed: true, selectable: true, ...getListboxProps(), children }) })
192
+ }
193
+ )
194
+ }
195
+ ),
196
+ /* @__PURE__ */ jsx("input", { ...getHiddenInputProps(), autoComplete }),
197
+ canShowError && /* @__PURE__ */ jsx(
198
+ HvWarningText,
199
+ {
200
+ id: errorMessageId,
201
+ disableBorder: true,
202
+ className: classes.error,
203
+ children: validationMessage
204
+ }
205
+ )
206
+ ]
207
+ }
208
+ );
209
+ });
210
+ export {
211
+ HvSelect,
212
+ staticClasses as selectClasses
213
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Select.js","sources":["../../../src/Select/Select.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-use-before-define */\nimport React, { useRef, useState } from \"react\";\nimport type { Placement } from \"@popperjs/core\";\nimport clsx from \"clsx\";\n\nimport {\n SelectProvider,\n UseSelectParameters,\n useSelect,\n} from \"@mui/base/useSelect\";\nimport { useControlled, useForkRef } from \"@mui/material/utils\";\nimport { Popper } from \"@mui/base/Popper\";\nimport { SelectOption } from \"@mui/base/useOption\";\n\nimport {\n HvFormElement,\n HvFormElementProps,\n HvFormStatus,\n HvInfoMessage,\n HvLabel,\n HvWarningText,\n} from \"../Forms\";\nimport { ExtractNames } from \"../utils/classes\";\nimport { fixedForwardRef } from \"../types/generic\";\nimport { useDefaultProps } from \"../hooks/useDefaultProps\";\nimport { staticClasses, useClasses } from \"./Select.styles\";\nimport { setId } from \"../utils/setId\";\nimport { useUniqueId } from \"../hooks/useUniqueId\";\nimport { HvPanel } from \"../Panel\";\nimport { HvListContainer } from \"../ListContainer\";\nimport { HvSelectButton } from \"./SelectButton\";\n\nfunction defaultRenderValue<Value>(\n options: SelectOption<Value> | SelectOption<Value>[] | null\n) {\n if (Array.isArray(options)) {\n if (options.length === 0) return null;\n return <>{options.map((o) => o.label).join(\", \")}</>;\n }\n\n return options?.label ?? null;\n}\n\nconst mergeIds = (...ids: clsx.ClassValue[]) => clsx(ids) || undefined;\n\nexport { staticClasses as selectClasses };\n\nexport type HvSelectClasses = ExtractNames<typeof useClasses>;\n\nexport interface HvSelectProps<\n OptionValue extends {},\n Multiple extends boolean = false\n> extends Omit<HvFormElementProps, \"value\" | \"defaultValue\" | \"onChange\">,\n Pick<\n UseSelectParameters<OptionValue, Multiple>,\n | \"name\"\n | \"required\"\n | \"disabled\"\n | \"multiple\"\n | \"open\"\n | \"defaultOpen\"\n | \"value\"\n | \"defaultValue\"\n | \"buttonRef\"\n | \"options\"\n | \"getSerializedValue\"\n | \"onChange\"\n | \"onOpenChange\"\n > {\n classes?: HvSelectClasses;\n placeholder?: React.ReactNode;\n autoComplete?: string;\n /** Whether the width of the select panel can vary independently. */\n variableWidth?: boolean;\n}\n\n/**\n * The `HvSelect` component is a form control element that allows selection from a list of options.\n *\n * It aims to be aligned with the native HTML `<select>` and `<option>` APIs and be easily integrated with forms.\n *\n * @example\n * <HvSelect name=\"pets\">\n * <HvOption value=\"dog\">Dog</HvOption>\n * <HvOption value=\"cat\">Cat</HvOption>\n * </HvSelect>\n * */\nexport const HvSelect = fixedForwardRef(function HvSelect<\n OptionValue extends {},\n Multiple extends boolean\n>(\n props: HvSelectProps<OptionValue, Multiple>,\n ref: React.Ref<HTMLButtonElement>\n) {\n const {\n children,\n classes: classesProp,\n className,\n id: idProp,\n name,\n required,\n disabled: disabledProp,\n readOnly,\n label,\n open: openProp,\n defaultOpen,\n multiple,\n autoComplete,\n options: optionsProp,\n variableWidth,\n value: valueProp,\n defaultValue,\n placeholder,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n description,\n \"aria-describedby\": ariaDescribedBy,\n status,\n statusMessage,\n \"aria-errormessage\": ariaErrorMessage,\n getSerializedValue,\n onClick,\n onChange,\n onOpenChange,\n ...others\n } = useDefaultProps(\"HvSelect\", props);\n const { classes, cx } = useClasses(classesProp);\n\n const [placement, setPlacement] = useState<Placement>(\"bottom-start\");\n\n const buttonRef = useRef<HTMLButtonElement>(null);\n const handleButtonRef = useForkRef(ref, buttonRef);\n\n const {\n contextValue,\n disabled,\n getButtonProps,\n getListboxProps,\n getHiddenInputProps,\n getOptionMetadata,\n value,\n open,\n } = useSelect<OptionValue, Multiple>({\n componentName: \"HvSelect\",\n name,\n required,\n disabled: disabledProp,\n multiple,\n open: openProp,\n defaultOpen,\n value: valueProp,\n defaultValue,\n options: optionsProp,\n buttonRef: handleButtonRef,\n getSerializedValue,\n onChange,\n onOpenChange: handleOpenChange,\n });\n\n const id = useUniqueId(idProp);\n const labelId = useUniqueId(setId(idProp, \"label\"));\n const descriptionId = useUniqueId(setId(idProp, \"description\"));\n const errorMessageId = useUniqueId(setId(idProp, \"error\"));\n\n const [validationMessage] = useControlled({\n name: \"HvSelect.statusMessage\",\n controlled: statusMessage,\n default: \"Required\",\n });\n const [validationState, setValidationState] = useControlled<HvFormStatus>({\n name: \"HvSelect.status\",\n controlled: status,\n default: \"standBy\",\n });\n\n function handleOpenChange(newOpen: boolean) {\n if (!newOpen) {\n const hasValue = multiple ? (value as OptionValue[]).length > 0 : !!value;\n setValidationState(required && !hasValue ? \"invalid\" : \"valid\");\n }\n onOpenChange?.(newOpen);\n }\n\n // the error message area will only be created if:\n // - an external element that provides an error message isn't identified via aria-errormessage AND\n // - both status and statusMessage properties are being controlled OR\n // - status is uncontrolled and required is true\n const canShowError =\n ariaErrorMessage == null &&\n ((status !== undefined && statusMessage !== undefined) ||\n (status === undefined && required));\n\n const isInvalid = validationState === \"invalid\";\n\n const actualValue = multiple\n ? (value as OptionValue[])\n .map((v) => getOptionMetadata(v))\n .filter((v): v is SelectOption<OptionValue> => v !== undefined)\n : getOptionMetadata(value as OptionValue) ?? null;\n\n const isOpen = open && !!children;\n\n return (\n <HvFormElement\n name={name}\n required={required}\n disabled={disabled}\n readOnly={readOnly}\n status={validationState}\n className={cx(classes.root, className, {\n [classes.disabled]: disabled,\n [classes.readOnly]: readOnly,\n })}\n {...others}\n >\n {(label || description) && (\n <div className={classes.labelContainer}>\n {label && (\n <HvLabel\n id={labelId}\n htmlFor={id}\n label={label}\n className={classes.label}\n />\n )}\n {description && (\n <HvInfoMessage id={descriptionId} className={classes.description}>\n {description}\n </HvInfoMessage>\n )}\n </div>\n )}\n\n <HvSelectButton\n id={id}\n open={isOpen}\n disabled={disabled}\n readOnly={readOnly}\n className={cx(classes.select, {\n [classes.invalid]: validationState === \"invalid\",\n })}\n placement={placement}\n aria-label={ariaLabel}\n aria-labelledby={mergeIds(label && labelId, ariaLabelledBy)}\n aria-invalid={isInvalid ? true : undefined}\n aria-errormessage={errorMessageId}\n aria-describedby={mergeIds(\n description && descriptionId,\n ariaDescribedBy\n )}\n {...getButtonProps()}\n >\n {defaultRenderValue(actualValue) ?? placeholder}\n </HvSelectButton>\n <Popper\n open={isOpen}\n keepMounted\n disablePortal\n anchorEl={buttonRef.current}\n className={classes.popper}\n placement={placement}\n modifiers={[\n {\n enabled: true,\n phase: \"main\",\n fn: ({ state }) => setPlacement(state.placement),\n },\n ]}\n >\n <HvPanel\n style={{\n width: variableWidth\n ? \"auto\"\n : (buttonRef.current?.clientWidth || 0) + 2,\n }}\n className={cx(classes.panel, className, {\n [classes.panelOpenedUp]: placement.includes(\"top\"),\n [classes.panelOpenedDown]: placement.includes(\"bottom\"),\n })}\n >\n <SelectProvider value={contextValue}>\n <HvListContainer condensed selectable {...getListboxProps()}>\n {children}\n </HvListContainer>\n </SelectProvider>\n </HvPanel>\n </Popper>\n\n <input {...getHiddenInputProps()} autoComplete={autoComplete} />\n\n {canShowError && (\n <HvWarningText\n id={errorMessageId}\n disableBorder\n className={classes.error}\n >\n {validationMessage}\n </HvWarningText>\n )}\n </HvFormElement>\n );\n});\n"],"names":["HvSelect"],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { theme } from "@hitachivantara/uikit-styles";
2
+ import { createClasses } from "../utils/classes.js";
3
+ const { staticClasses, useClasses } = createClasses("HvSelect", {
4
+ root: {
5
+ position: "relative",
6
+ "&$disabled,&$readOnly": {
7
+ pointerEvents: "none"
8
+ }
9
+ },
10
+ disabled: {},
11
+ readOnly: {},
12
+ invalid: {
13
+ border: `1px solid ${theme.colors.negative}`
14
+ },
15
+ labelContainer: {
16
+ display: "flex",
17
+ alignItems: "flex-start"
18
+ },
19
+ label: {
20
+ display: "block",
21
+ paddingBottom: 6
22
+ },
23
+ description: {},
24
+ select: {},
25
+ popper: {
26
+ zIndex: theme.zIndices.popover
27
+ },
28
+ panel: {
29
+ border: `1px solid ${theme.colors.secondary}`,
30
+ marginTop: -1,
31
+ marginBottom: -1
32
+ },
33
+ panelOpenedUp: {
34
+ borderRadius: `${theme.radii.base} ${theme.radii.base} 0 0`
35
+ },
36
+ panelOpenedDown: {
37
+ borderRadius: `0 0 ${theme.radii.base} ${theme.radii.base}`
38
+ },
39
+ error: {}
40
+ });
41
+ export {
42
+ staticClasses,
43
+ useClasses
44
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Select.styles.js","sources":["../../../src/Select/Select.styles.ts"],"sourcesContent":["import { theme } from \"@hitachivantara/uikit-styles\";\n\nimport { createClasses } from \"../utils/classes\";\n\nexport const { staticClasses, useClasses } = createClasses(\"HvSelect\", {\n root: {\n position: \"relative\",\n \"&$disabled,&$readOnly\": {\n pointerEvents: \"none\",\n },\n },\n disabled: {},\n readOnly: {},\n invalid: {\n border: `1px solid ${theme.colors.negative}`,\n },\n labelContainer: {\n display: \"flex\",\n alignItems: \"flex-start\",\n },\n label: {\n display: \"block\",\n paddingBottom: 6,\n },\n description: {},\n select: {},\n popper: {\n zIndex: theme.zIndices.popover,\n },\n panel: {\n border: `1px solid ${theme.colors.secondary}`,\n marginTop: -1,\n marginBottom: -1,\n },\n panelOpenedUp: {\n borderRadius: `${theme.radii.base} ${theme.radii.base} 0 0`,\n },\n panelOpenedDown: {\n borderRadius: `0 0 ${theme.radii.base} ${theme.radii.base}`,\n },\n error: {},\n});\n"],"names":[],"mappings":";;AAIO,MAAM,EAAE,eAAe,eAAe,cAAc,YAAY;AAAA,EACrE,MAAM;AAAA,IACJ,UAAU;AAAA,IACV,yBAAyB;AAAA,MACvB,eAAe;AAAA,IACjB;AAAA,EACF;AAAA,EACA,UAAU,CAAC;AAAA,EACX,UAAU,CAAC;AAAA,EACX,SAAS;AAAA,IACP,QAAQ,aAAa,MAAM,OAAO,QAAQ;AAAA,EAC5C;AAAA,EACA,gBAAgB;AAAA,IACd,SAAS;AAAA,IACT,YAAY;AAAA,EACd;AAAA,EACA,OAAO;AAAA,IACL,SAAS;AAAA,IACT,eAAe;AAAA,EACjB;AAAA,EACA,aAAa,CAAC;AAAA,EACd,QAAQ,CAAC;AAAA,EACT,QAAQ;AAAA,IACN,QAAQ,MAAM,SAAS;AAAA,EACzB;AAAA,EACA,OAAO;AAAA,IACL,QAAQ,aAAa,MAAM,OAAO,SAAS;AAAA,IAC3C,WAAW;AAAA,IACX,cAAc;AAAA,EAChB;AAAA,EACA,eAAe;AAAA,IACb,cAAc,GAAG,MAAM,MAAM,IAAI,IAAI,MAAM,MAAM,IAAI;AAAA,EACvD;AAAA,EACA,iBAAiB;AAAA,IACf,cAAc,OAAO,MAAM,MAAM,IAAI,IAAI,MAAM,MAAM,IAAI;AAAA,EAC3D;AAAA,EACA,OAAO,CAAC;AACV,CAAC;"}
@@ -0,0 +1,92 @@
1
+ import { jsx } from "@emotion/react/jsx-runtime";
2
+ import { forwardRef } from "react";
3
+ import { DropDownXS } from "@hitachivantara/uikit-react-icons";
4
+ import { theme } from "@hitachivantara/uikit-styles";
5
+ import { useDefaultProps } from "../hooks/useDefaultProps.js";
6
+ import { createClasses } from "../utils/classes.js";
7
+ import { HvButton } from "../Button/Button.js";
8
+ const { staticClasses, useClasses } = createClasses("HvSelectButton", {
9
+ root: {
10
+ width: "100%",
11
+ minWidth: "unset",
12
+ userSelect: "none",
13
+ position: "relative",
14
+ paddingLeft: theme.space.xs,
15
+ justifyContent: "flex-start"
16
+ },
17
+ disabled: {},
18
+ readOnly: {
19
+ userSelect: "text",
20
+ backgroundColor: theme.colors.atmo2
21
+ },
22
+ open: {
23
+ backgroundColor: theme.colors.atmo1
24
+ },
25
+ openUp: {
26
+ borderRadius: `0px 0px ${theme.radii.base} ${theme.radii.base}`
27
+ },
28
+ openDown: {
29
+ borderRadius: `${theme.radii.base} ${theme.radii.base} 0px 0px`
30
+ },
31
+ selection: {
32
+ color: "inherit",
33
+ flex: 1,
34
+ textAlign: "start",
35
+ overflow: "clip visible",
36
+ textOverflow: "ellipsis",
37
+ whiteSpace: "nowrap"
38
+ },
39
+ placeholder: {},
40
+ arrowContainer: {
41
+ marginRight: theme.spacing(-2)
42
+ },
43
+ arrow: {
44
+ transition: "rotate 0.2s ease"
45
+ }
46
+ });
47
+ const HvSelectButton = forwardRef((props, ref) => {
48
+ const {
49
+ classes: classesProp,
50
+ className,
51
+ open,
52
+ placement = "bottom",
53
+ disabled,
54
+ readOnly,
55
+ children,
56
+ adornment,
57
+ ...others
58
+ } = useDefaultProps("HvSelectButton", props);
59
+ const { classes, cx } = useClasses(classesProp);
60
+ const endIcon = adornment ?? /* @__PURE__ */ jsx(
61
+ DropDownXS,
62
+ {
63
+ iconSize: "XS",
64
+ style: { rotate: open ? "180deg" : void 0 },
65
+ className: classes.arrow
66
+ }
67
+ );
68
+ return /* @__PURE__ */ jsx(
69
+ HvButton,
70
+ {
71
+ ref,
72
+ variant: "secondarySubtle",
73
+ disabled: disabled || readOnly,
74
+ className: cx(classes.root, className, {
75
+ [classes.open]: open,
76
+ [classes.openUp]: open && placement.includes("top"),
77
+ [classes.openDown]: open && placement.includes("bottom"),
78
+ [classes.disabled]: disabled,
79
+ [classes.readOnly]: readOnly
80
+ }),
81
+ classes: { endIcon: classes.arrowContainer },
82
+ endIcon,
83
+ ...others,
84
+ children: /* @__PURE__ */ jsx("div", { className: classes.selection, children: children && typeof children === "string" ? /* @__PURE__ */ jsx("div", { className: classes.placeholder, children }) : children })
85
+ }
86
+ );
87
+ });
88
+ export {
89
+ HvSelectButton,
90
+ staticClasses,
91
+ useClasses
92
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectButton.js","sources":["../../../src/Select/SelectButton.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport type { Placement } from \"@popperjs/core\";\nimport { DropDownXS } from \"@hitachivantara/uikit-react-icons\";\nimport { theme } from \"@hitachivantara/uikit-styles\";\n\nimport { useDefaultProps } from \"../hooks/useDefaultProps\";\nimport { ExtractNames, createClasses } from \"../utils/classes\";\nimport { HvButton } from \"../Button\";\n\nexport const { staticClasses, useClasses } = createClasses(\"HvSelectButton\", {\n root: {\n width: \"100%\",\n minWidth: \"unset\",\n userSelect: \"none\",\n position: \"relative\",\n paddingLeft: theme.space.xs,\n justifyContent: \"flex-start\",\n },\n disabled: {},\n readOnly: {\n userSelect: \"text\",\n backgroundColor: theme.colors.atmo2,\n },\n open: {\n backgroundColor: theme.colors.atmo1,\n },\n openUp: {\n borderRadius: `0px 0px ${theme.radii.base} ${theme.radii.base}`,\n },\n openDown: {\n borderRadius: `${theme.radii.base} ${theme.radii.base} 0px 0px`,\n },\n\n selection: {\n color: \"inherit\",\n flex: 1,\n textAlign: \"start\",\n\n overflow: \"clip visible\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n },\n placeholder: {},\n arrowContainer: {\n marginRight: theme.spacing(-2),\n },\n arrow: {\n transition: \"rotate 0.2s ease\",\n },\n});\n\nexport type HvSelectButtonClasses = ExtractNames<typeof useClasses>;\n\nexport interface HvSelectButtonProps\n extends React.HTMLAttributes<HTMLButtonElement> {\n readOnly?: boolean;\n open?: boolean;\n disabled?: boolean;\n placement?: Placement;\n adornment?: React.ReactNode;\n classes?: HvSelectButtonClasses;\n}\n\n/**\n * HvSelect internal header button component\n */\nexport const HvSelectButton = forwardRef<\n HTMLButtonElement,\n HvSelectButtonProps\n>((props, ref) => {\n const {\n classes: classesProp,\n className,\n open,\n placement = \"bottom\",\n disabled,\n readOnly,\n children,\n adornment,\n ...others\n } = useDefaultProps(\"HvSelectButton\", props);\n const { classes, cx } = useClasses(classesProp);\n\n const endIcon = adornment ?? (\n <DropDownXS\n iconSize=\"XS\"\n style={{ rotate: open ? \"180deg\" : undefined }}\n className={classes.arrow}\n />\n );\n\n return (\n <HvButton\n ref={ref}\n variant=\"secondarySubtle\"\n disabled={disabled || readOnly}\n className={cx(classes.root, className, {\n [classes.open]: open,\n [classes.openUp]: open && placement.includes(\"top\"),\n [classes.openDown]: open && placement.includes(\"bottom\"),\n [classes.disabled]: disabled,\n [classes.readOnly]: readOnly,\n })}\n classes={{ endIcon: classes.arrowContainer }}\n endIcon={endIcon}\n {...others}\n >\n <div className={classes.selection}>\n {children && typeof children === \"string\" ? (\n <div className={classes.placeholder}>{children}</div>\n ) : (\n children\n )}\n </div>\n </HvButton>\n );\n});\n"],"names":[],"mappings":";;;;;;;AASO,MAAM,EAAE,eAAe,eAAe,cAAc,kBAAkB;AAAA,EAC3E,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,aAAa,MAAM,MAAM;AAAA,IACzB,gBAAgB;AAAA,EAClB;AAAA,EACA,UAAU,CAAC;AAAA,EACX,UAAU;AAAA,IACR,YAAY;AAAA,IACZ,iBAAiB,MAAM,OAAO;AAAA,EAChC;AAAA,EACA,MAAM;AAAA,IACJ,iBAAiB,MAAM,OAAO;AAAA,EAChC;AAAA,EACA,QAAQ;AAAA,IACN,cAAc,WAAW,MAAM,MAAM,IAAI,IAAI,MAAM,MAAM,IAAI;AAAA,EAC/D;AAAA,EACA,UAAU;AAAA,IACR,cAAc,GAAG,MAAM,MAAM,IAAI,IAAI,MAAM,MAAM,IAAI;AAAA,EACvD;AAAA,EAEA,WAAW;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,IACN,WAAW;AAAA,IAEX,UAAU;AAAA,IACV,cAAc;AAAA,IACd,YAAY;AAAA,EACd;AAAA,EACA,aAAa,CAAC;AAAA,EACd,gBAAgB;AAAA,IACd,aAAa,MAAM,QAAQ,EAAE;AAAA,EAC/B;AAAA,EACA,OAAO;AAAA,IACL,YAAY;AAAA,EACd;AACF,CAAC;AAiBM,MAAM,iBAAiB,WAG5B,CAAC,OAAO,QAAQ;AACV,QAAA;AAAA,IACJ,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EAAA,IACD,gBAAgB,kBAAkB,KAAK;AAC3C,QAAM,EAAE,SAAS,GAAG,IAAI,WAAW,WAAW;AAE9C,QAAM,UAAU,aACd;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,UAAS;AAAA,MACT,OAAO,EAAE,QAAQ,OAAO,WAAW,OAAU;AAAA,MAC7C,WAAW,QAAQ;AAAA,IAAA;AAAA,EAAA;AAKrB,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,SAAQ;AAAA,MACR,UAAU,YAAY;AAAA,MACtB,WAAW,GAAG,QAAQ,MAAM,WAAW;AAAA,QACrC,CAAC,QAAQ,IAAI,GAAG;AAAA,QAChB,CAAC,QAAQ,MAAM,GAAG,QAAQ,UAAU,SAAS,KAAK;AAAA,QAClD,CAAC,QAAQ,QAAQ,GAAG,QAAQ,UAAU,SAAS,QAAQ;AAAA,QACvD,CAAC,QAAQ,QAAQ,GAAG;AAAA,QACpB,CAAC,QAAQ,QAAQ,GAAG;AAAA,MAAA,CACrB;AAAA,MACD,SAAS,EAAE,SAAS,QAAQ,eAAe;AAAA,MAC3C;AAAA,MACC,GAAG;AAAA,MAEJ,8BAAC,OAAI,EAAA,WAAW,QAAQ,WACrB,sBAAY,OAAO,aAAa,WAC/B,oBAAC,SAAI,WAAW,QAAQ,aAAc,SAAA,CAAS,IAE/C,UAEJ;AAAA,IAAA;AAAA,EAAA;AAGN,CAAC;"}