UNPKG

@helpwave/hightide

Version:

helpwave's component and theming library

118 lines (116 loc) 4.76 kB
// src/components/user-input/Select.tsx import { Menu } from "@headlessui/react"; import { ChevronDown, ChevronUp } from "lucide-react"; import clsx from "clsx"; // src/components/user-input/Label.tsx import { jsx } from "react/jsx-runtime"; var styleMapping = { labelSmall: "textstyle-label-sm", labelMedium: "textstyle-label-md", labelBig: "textstyle-label-lg" }; var Label = ({ children, name, labelType = "labelSmall", ...props }) => { return /* @__PURE__ */ jsx("label", { ...props, children: children ? children : /* @__PURE__ */ jsx("span", { className: styleMapping[labelType], children: name }) }); }; // src/components/user-input/Select.tsx import { Fragment, jsx as jsx2, jsxs } from "react/jsx-runtime"; var Select = ({ value, label, options, onChange, isHidingCurrentValue = true, hintText = "", showDisabledOptions = true, isDisabled, className, textColor = "text-menu-text", hoverColor = "hover:brightness-90", additionalItems, selectedDisplayOverwrite }) => { let filteredOptions = isHidingCurrentValue ? options.filter((option) => option.value !== value) : options; if (!showDisabledOptions) { filteredOptions = filteredOptions.filter((value2) => !value2.disabled); } const selectedOption = options.find((option) => option.value === value); if (value !== void 0 && selectedOption === void 0 && selectedDisplayOverwrite === void 0) { console.warn("The selected value is not found in the options list. This might be an error on your part or default behavior if it is complex data type on which === does not work. In case of the latter use selectedDisplayOverwrite to set your selected text or component"); } const borderColor = "border-menu-border"; return /* @__PURE__ */ jsxs("div", { className: clsx(className), children: [ label && /* @__PURE__ */ jsx2(Label, { ...label, labelType: label.labelType ?? "labelBig", className: clsx("mb-1", label.className) }), /* @__PURE__ */ jsx2(Menu, { as: "div", className: "relative text-menu-text", children: ({ open }) => /* @__PURE__ */ jsxs(Fragment, { children: [ /* @__PURE__ */ jsxs( Menu.Button, { className: clsx( "inline-flex w-full justify-between items-center rounded-t-lg border-2 px-4 py-2 font-medium bg-menu-background text-menu-text", textColor, borderColor, { "rounded-b-lg": !open, [hoverColor]: !isDisabled, "bg-disabled-background cursor-not-allowed text-disabled": isDisabled } ), disabled: isDisabled, children: [ /* @__PURE__ */ jsx2("span", { children: selectedDisplayOverwrite ?? selectedOption?.label ?? hintText }), open ? /* @__PURE__ */ jsx2(ChevronUp, {}) : /* @__PURE__ */ jsx2(ChevronDown, {}) ] } ), /* @__PURE__ */ jsxs( Menu.Items, { className: "absolute w-full z-10 rounded-b-lg bg-menu-background text-menu-text shadow-lg max-h-[500px] overflow-y-auto", children: [ (additionalItems ?? []).map((item, index) => /* @__PURE__ */ jsx2( "div", { className: clsx(borderColor, "px-4 py-2 overflow-hidden whitespace-nowrap text-ellipsis border-2 border-t-0", { "border-b-0 rounded-b-lg": filteredOptions.length === 0 && index === (additionalItems?.length ?? 1) - 1 }), children: item }, `additionalItems${index}` )), filteredOptions.map((option, index) => /* @__PURE__ */ jsx2(Menu.Item, { children: /* @__PURE__ */ jsx2( "div", { className: clsx( "px-4 py-2 overflow-hidden whitespace-nowrap text-ellipsis border-2 border-t-0 cursor-pointer", option.className, borderColor, { "brightness-90": option.value === value, "brightness-95": index % 2 === 1, "text-disabled bg-disabled-background cursor-not-allowed": !!option.disabled, "bg-menu-background text-menu-text hover:brightness-90 cursor-pointer": !option.disabled, "rounded-b-lg": index === filteredOptions.length - 1 } ), onClick: () => { if (!option.disabled) { onChange(option.value); } }, children: option.label } ) }, `item${index}`)) ] } ) ] }) }) ] }); }; export { Select }; //# sourceMappingURL=Select.mjs.map