@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.
- package/dist/cjs/DropDownMenu/DropDownMenu.cjs +1 -1
- package/dist/cjs/Select/Option.cjs +53 -0
- package/dist/cjs/Select/Option.cjs.map +1 -0
- package/dist/cjs/Select/OptionGroup.cjs +34 -0
- package/dist/cjs/Select/OptionGroup.cjs.map +1 -0
- package/dist/cjs/Select/Select.cjs +214 -0
- package/dist/cjs/Select/Select.cjs.map +1 -0
- package/dist/cjs/Select/Select.styles.cjs +44 -0
- package/dist/cjs/Select/Select.styles.cjs.map +1 -0
- package/dist/cjs/Select/SelectButton.cjs +92 -0
- package/dist/cjs/Select/SelectButton.cjs.map +1 -0
- package/dist/cjs/index.cjs +10 -0
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/esm/DropDownMenu/DropDownMenu.js +1 -1
- package/dist/esm/Select/Option.js +53 -0
- package/dist/esm/Select/Option.js.map +1 -0
- package/dist/esm/Select/OptionGroup.js +34 -0
- package/dist/esm/Select/OptionGroup.js.map +1 -0
- package/dist/esm/Select/Select.js +213 -0
- package/dist/esm/Select/Select.js.map +1 -0
- package/dist/esm/Select/Select.styles.js +44 -0
- package/dist/esm/Select/Select.styles.js.map +1 -0
- package/dist/esm/Select/SelectButton.js +92 -0
- package/dist/esm/Select/SelectButton.js.map +1 -0
- package/dist/esm/index.js +224 -214
- package/dist/esm/index.js.map +1 -1
- package/dist/types/index.d.ts +563 -450
- package/package.json +6 -6
|
@@ -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;"}
|