@uxf/ui 1.0.0-beta.125 → 1.0.0-beta.127

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/button-list/button-list.d.ts +2 -2
  2. package/button-list/button-list.stories.d.ts +1 -1
  3. package/button-list/index.d.ts +1 -1
  4. package/css/image-gallery.css +59 -0
  5. package/css/multi-combobox.css +8 -3
  6. package/css/multi-select.css +27 -0
  7. package/image-gallery/components/arrow-button.d.ts +7 -0
  8. package/image-gallery/components/{next-button.js → arrow-button.js} +4 -4
  9. package/image-gallery/components/close-button.d.ts +1 -0
  10. package/image-gallery/components/close-button.js +4 -2
  11. package/image-gallery/components/dot.js +1 -1
  12. package/image-gallery/components/gallery.d.ts +1 -0
  13. package/image-gallery/components/gallery.js +13 -12
  14. package/image-gallery/image-gallery.d.ts +3 -2
  15. package/image-gallery/image-gallery.js +1 -1
  16. package/image-gallery/image-gallery.stories.js +18 -6
  17. package/image-gallery/types.d.ts +4 -2
  18. package/image-gallery/use-image.js +3 -2
  19. package/{mutli-combobox → multi-combobox}/multi-combobox-base.js +3 -3
  20. package/multi-select/index.d.ts +2 -0
  21. package/multi-select/index.js +18 -0
  22. package/multi-select/multi-select-base.d.ts +8 -0
  23. package/multi-select/multi-select-base.js +68 -0
  24. package/multi-select/multi-select.d.ts +3 -0
  25. package/multi-select/multi-select.js +55 -0
  26. package/multi-select/multi-select.stories.d.ts +9 -0
  27. package/multi-select/multi-select.stories.js +64 -0
  28. package/multi-select/types.d.ts +30 -0
  29. package/multi-select/types.js +2 -0
  30. package/package.json +1 -1
  31. package/image-gallery/components/next-button.d.ts +0 -6
  32. package/image-gallery/components/previous-button.d.ts +0 -6
  33. package/image-gallery/components/previous-button.js +0 -12
  34. /package/{mutli-combobox → multi-combobox}/index.d.ts +0 -0
  35. /package/{mutli-combobox → multi-combobox}/index.js +0 -0
  36. /package/{mutli-combobox → multi-combobox}/multi-combobox-base.d.ts +0 -0
  37. /package/{mutli-combobox → multi-combobox}/multi-combobox.d.ts +0 -0
  38. /package/{mutli-combobox → multi-combobox}/multi-combobox.js +0 -0
  39. /package/{mutli-combobox → multi-combobox}/multi-combobox.stories.d.ts +0 -0
  40. /package/{mutli-combobox → multi-combobox}/multi-combobox.stories.js +0 -0
  41. /package/{mutli-combobox → multi-combobox}/types.d.ts +0 -0
  42. /package/{mutli-combobox → multi-combobox}/types.js +0 -0
@@ -6,7 +6,7 @@ declare type SingleButtonProps = Omit<ButtonProps, "children"> & {
6
6
  icon?: IconName | null;
7
7
  label?: ReactNode;
8
8
  };
9
- export interface ButtonGroupProps {
9
+ export interface ButtonListProps {
10
10
  buttons: SingleButtonProps[];
11
11
  className?: string;
12
12
  openButton?: SingleButtonProps;
@@ -16,5 +16,5 @@ export interface ButtonGroupProps {
16
16
  variant?: ButtonProps["variant"];
17
17
  menuPlacement?: Placement;
18
18
  }
19
- export declare const ButtonList: FC<ButtonGroupProps>;
19
+ export declare const ButtonList: FC<ButtonListProps>;
20
20
  export {};
@@ -1,7 +1,7 @@
1
1
  import React from "react";
2
2
  declare const _default: {
3
3
  title: string;
4
- component: React.FC<import("./button-list").ButtonGroupProps>;
4
+ component: React.FC<import("./button-list").ButtonListProps>;
5
5
  };
6
6
  export default _default;
7
7
  export declare const Default: () => JSX.Element;
@@ -1 +1 @@
1
- export { ButtonList, ButtonGroupProps } from "./button-list";
1
+ export { ButtonList, ButtonListProps } from "./button-list";
@@ -0,0 +1,59 @@
1
+ .uxf-image-gallery {
2
+ @apply fixed inset-0 top-0 bottom-0 z-50 flex flex-col bg-black bg-opacity-75 transition-opacity;
3
+
4
+ &__content {
5
+ @apply container mx-auto flex h-full flex-1 flex-col;
6
+ }
7
+
8
+ &__inner {
9
+ @apply relative flex flex-1 items-center justify-center;
10
+ }
11
+
12
+ &__image {
13
+ @apply absolute left-0 right-0 top-0 h-full w-full object-contain;
14
+ }
15
+
16
+ &__buttons {
17
+ @apply pointer-events-none absolute inset-0 flex items-center justify-between p-2;
18
+ }
19
+
20
+ &__button {
21
+ @apply pointer-events-auto rounded-full bg-black bg-opacity-50 p-3;
22
+
23
+ &-icon {
24
+ @apply h-8 w-8 text-white;
25
+ }
26
+ }
27
+
28
+ &__dots {
29
+ @apply mx-auto flex space-x-2 p-4;
30
+ }
31
+
32
+ &__dot {
33
+ @apply h-2 w-2 rounded-full bg-white;
34
+
35
+ &--active {
36
+ @apply bg-gray-500;
37
+ }
38
+ }
39
+
40
+ &__close-button-wrapper {
41
+ @apply flex justify-end;
42
+ }
43
+
44
+ &__close-button {
45
+ @apply bg-black bg-opacity-50 p-5;
46
+
47
+ &-icon {
48
+ @apply h-6 w-6 text-white;
49
+ }
50
+
51
+ &-text {
52
+ @apply sr-only;
53
+ }
54
+ }
55
+
56
+ &__custom-content {
57
+ @apply absolute right-0 bottom-0 bg-gray-600 text-white;
58
+ }
59
+ }
@@ -4,11 +4,12 @@
4
4
  &__button {
5
5
  min-height: theme("inputSize.default");
6
6
 
7
- @apply relative flex flex-row w-full cursor-default flex-wrap items-center rounded-lg pl-4 pr-8 text-left
8
- outline-none before:absolute before:inset-0 before:pointer-events-none before:border before:rounded-lg;
7
+ @apply relative flex flex-row w-full cursor-default flex-wrap items-center rounded-lg pl-4 pr-8 pb-[7px]
8
+ text-left outline-none before:absolute before:inset-0 before:pointer-events-none before:border
9
+ before:rounded-lg;
9
10
 
10
11
  &--with-popover {
11
- @apply cursor-text;
12
+ @apply cursor-text pb-0;
12
13
  }
13
14
 
14
15
  .uxf-icon {
@@ -88,6 +89,10 @@
88
89
  }
89
90
  }
90
91
 
92
+ &__input-chip {
93
+ @apply mt-[7px] mr-2;
94
+ }
95
+
91
96
  &__popover-panel {
92
97
  @apply absolute top-0 left-0 z-10 w-full;
93
98
  }
@@ -0,0 +1,27 @@
1
+ .uxf-multi-select {
2
+ &__input {
3
+ @apply overflow-hidden;
4
+
5
+ &--is-empty {
6
+ @apply mt-[7px] truncate;
7
+
8
+ :root .light & {
9
+ @apply text-lightLow;
10
+ }
11
+
12
+ :root .dark & {
13
+ @apply text-darkLow;
14
+ }
15
+ }
16
+ }
17
+
18
+ &__dropdown-item {
19
+ :root .light & {
20
+ @apply hover:bg-primary-500 hover:text-white;
21
+ }
22
+
23
+ :root .dark & {
24
+ @apply hover:bg-primary-500;
25
+ }
26
+ }
27
+ }
@@ -0,0 +1,7 @@
1
+ /// <reference types="react" />
2
+ interface NextButtonProps {
3
+ onClick: () => void;
4
+ type: "prev" | "next";
5
+ }
6
+ declare function ArrowButton(props: NextButtonProps): JSX.Element;
7
+ export default ArrowButton;
@@ -5,8 +5,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const react_1 = __importDefault(require("react"));
7
7
  const icon_1 = require("../../icon");
8
- function NextButton(props) {
9
- return (react_1.default.createElement("button", { className: "pointer-events-auto rounded-full bg-black bg-opacity-50 p-3", onClick: props.onClick },
10
- react_1.default.createElement(icon_1.Icon, { className: "h-8 w-8 text-white", name: "chevronRight" })));
8
+ function ArrowButton(props) {
9
+ return (react_1.default.createElement("button", { className: `uxf-image-gallery__button ${props.type === "prev" ? "uxf-image-gallery__button--prev" : "uxf-image-gallery__button--next"}`, onClick: props.onClick },
10
+ react_1.default.createElement(icon_1.Icon, { className: "uxf-image-gallery__button-icon", name: props.type === "prev" ? "chevronLeft" : "chevronRight" })));
11
11
  }
12
- exports.default = NextButton;
12
+ exports.default = ArrowButton;
@@ -1,5 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  interface CloseButtonProps {
3
+ text?: string;
3
4
  onClick: () => void;
4
5
  }
5
6
  declare function CloseButton(props: CloseButtonProps): JSX.Element;
@@ -6,7 +6,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const react_1 = __importDefault(require("react"));
7
7
  const icon_1 = require("../../icon");
8
8
  function CloseButton(props) {
9
- return (react_1.default.createElement("button", { className: "bg-black bg-opacity-50 p-5", onClick: () => props.onClick() },
10
- react_1.default.createElement(icon_1.Icon, { className: "h-6 w-6 text-white", name: "xmarkLarge" })));
9
+ var _a;
10
+ return (react_1.default.createElement("button", { className: "uxf-image-gallery__close-button", onClick: () => props.onClick() },
11
+ react_1.default.createElement("span", { className: "uxf-image-gallery__close-button-text" }, (_a = props.text) !== null && _a !== void 0 ? _a : "Zavřít"),
12
+ react_1.default.createElement(icon_1.Icon, { className: "uxf-image-gallery__close-button-icon", name: "xmarkLarge" })));
11
13
  }
12
14
  exports.default = CloseButton;
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const cx_1 = require("@uxf/core/utils/cx");
7
7
  const react_1 = __importDefault(require("react"));
8
8
  function Dot(props) {
9
- const className = (0, cx_1.cx)("h-2 w-2 rounded-full", props.active ? "bg-gray-500" : "bg-white");
9
+ const className = (0, cx_1.cx)("uxf-image-gallery__dot", props.active ? "uxf-image-gallery__dot--active" : "");
10
10
  return react_1.default.createElement("div", { className: className });
11
11
  }
12
12
  exports.default = Dot;
@@ -1,6 +1,7 @@
1
1
  /// <reference types="react" />
2
2
  import { ImageGalleryImageProps } from "../types";
3
3
  interface GalleryProps {
4
+ closeButtonTitle?: string;
4
5
  onClose: () => void;
5
6
  onNext: () => void;
6
7
  onPrevious: () => void;
@@ -31,8 +31,7 @@ const resizer_1 = require("@uxf/core/utils/resizer");
31
31
  const react_1 = __importStar(require("react"));
32
32
  const close_button_1 = __importDefault(require("./close-button"));
33
33
  const dot_1 = __importDefault(require("./dot"));
34
- const next_button_1 = __importDefault(require("./next-button"));
35
- const previous_button_1 = __importDefault(require("./previous-button"));
34
+ const arrow_button_1 = __importDefault(require("./arrow-button"));
36
35
  function Gallery(props) {
37
36
  var _a;
38
37
  (0, react_1.useEffect)(() => {
@@ -58,15 +57,17 @@ function Gallery(props) {
58
57
  // eslint-disable-next-line react-hooks/exhaustive-deps
59
58
  }, []);
60
59
  const imageSrc = props.images[props.imageIndex].src;
61
- return (react_1.default.createElement("div", { className: "fixed inset-0 top-0 bottom-0 z-50 flex flex-col bg-black bg-opacity-75 transition-opacity" },
62
- react_1.default.createElement("div", { className: "flex justify-end" },
63
- react_1.default.createElement(close_button_1.default, { onClick: props.onClose })),
64
- react_1.default.createElement("div", { className: "container mx-auto flex h-full flex-1 flex-col" },
65
- react_1.default.createElement("div", { className: "relative flex flex-1 items-center justify-center" },
66
- react_1.default.createElement("img", { alt: "", className: "absolute left-0 right-0 top-0 h-full w-full object-contain", src: typeof imageSrc === "string" ? imageSrc : (_a = (0, resizer_1.resizerImageUrl)(imageSrc)) !== null && _a !== void 0 ? _a : "" }),
67
- react_1.default.createElement("div", { className: "pointer-events-none absolute inset-0 flex items-center justify-between p-2" },
68
- react_1.default.createElement(previous_button_1.default, { onClick: props.onPrevious }),
69
- react_1.default.createElement(next_button_1.default, { onClick: props.onNext })))),
70
- react_1.default.createElement("div", { className: "row mx-auto flex space-x-2 p-4" }, props.images.map((image, index) => (react_1.default.createElement(dot_1.default, { key: (0, image_1.getImgUniqueIdentifier)(image.src) || index, active: index === props.imageIndex }))))));
60
+ const customContent = props.images[props.imageIndex].customContent;
61
+ return (react_1.default.createElement("div", { className: "uxf-image-gallery" },
62
+ react_1.default.createElement("div", { className: "uxf-image-gallery__close-button-wrapper" },
63
+ react_1.default.createElement(close_button_1.default, { onClick: props.onClose, text: props.closeButtonTitle })),
64
+ react_1.default.createElement("div", { className: "uxf-image-gallery__content" },
65
+ react_1.default.createElement("div", { className: "uxf-image-gallery__inner" },
66
+ react_1.default.createElement("img", { alt: "", className: "uxf-image-gallery__image", src: typeof imageSrc === "string" ? imageSrc : (_a = (0, resizer_1.resizerImageUrl)(imageSrc)) !== null && _a !== void 0 ? _a : "" }),
67
+ props.images.length > 1 && (react_1.default.createElement("div", { className: "uxf-image-gallery__buttons" },
68
+ react_1.default.createElement(arrow_button_1.default, { onClick: props.onPrevious, type: "prev" }),
69
+ react_1.default.createElement(arrow_button_1.default, { onClick: props.onNext, type: "next" }))),
70
+ react_1.default.createElement("div", { className: "uxf-image-gallery__custom-content" }, customContent))),
71
+ props.images.length > 1 && (react_1.default.createElement("div", { className: "uxf-image-gallery__dots" }, props.images.map((image, index) => (react_1.default.createElement(dot_1.default, { key: (0, image_1.getImgUniqueIdentifier)(image.src) || index, active: index === props.imageIndex })))))));
71
72
  }
72
73
  exports.default = Gallery;
@@ -1,6 +1,7 @@
1
1
  import { ReactNode } from "react";
2
- interface ImageGalleryProviderProps {
2
+ interface ImageGalleryProps {
3
3
  children: ReactNode;
4
+ closeButtonTitle?: string;
4
5
  }
5
- declare function ImageGallery(props: ImageGalleryProviderProps): JSX.Element;
6
+ declare function ImageGallery(props: ImageGalleryProps): JSX.Element;
6
7
  export default ImageGallery;
@@ -50,6 +50,6 @@ function ImageGallery(props) {
50
50
  const contextValue = { registerImage, unregisterImage, openGallery };
51
51
  return (react_1.default.createElement(react_1.default.Fragment, null,
52
52
  react_1.default.createElement(context_1.ImageGalleryProvider, { value: contextValue }, props.children),
53
- typeof moduloImageIndex === "number" && (react_1.default.createElement(gallery_1.default, { onClose: () => setImageIndex(null), onNext: onNext, onPrevious: onPrevious, imageIndex: moduloImageIndex, images: images }))));
53
+ typeof moduloImageIndex === "number" && (react_1.default.createElement(gallery_1.default, { closeButtonTitle: props.closeButtonTitle, onClose: () => setImageIndex(null), onNext: onNext, onPrevious: onPrevious, imageIndex: moduloImageIndex, images: images }))));
54
54
  }
55
55
  exports.default = ImageGallery;
@@ -14,14 +14,26 @@ exports.default = {
14
14
  parameters: { actions: { argTypesRegex: "^on.*" } },
15
15
  };
16
16
  const images = [
17
- "https://opentopo.app/hero_image.jpeg",
18
- "https://opentopo.app/generated/area-18/d/9/d9033d93-ea48-4f66-b0c1-6045c091b326_1024_1024_c.jpg",
19
- "https://opentopo.app/generated/area-16/f/4/f4a4ca79-ea9e-44d1-a4ec-3c8ccfbcc218_1024_1024_c.jpg",
20
- "https://opentopo.app/generated/area-1/8/b/8b84e378-1f55-4ce7-b750-b504091cb833_1024_1024_c.jpg",
21
- "https://opentopo.app/generated/area-2/e/7/e7ec532b-20c2-407e-9305-fa7cfb71f01f_1024_1024_c.jpg",
17
+ { src: "https://opentopo.app/hero_image.jpeg", title: "Obr. 1" },
18
+ {
19
+ src: "https://opentopo.app/generated/area-18/d/9/d9033d93-ea48-4f66-b0c1-6045c091b326_1024_1024_c.jpg",
20
+ title: "Obr. 2",
21
+ },
22
+ {
23
+ src: "https://opentopo.app/generated/area-16/f/4/f4a4ca79-ea9e-44d1-a4ec-3c8ccfbcc218_1024_1024_c.jpg",
24
+ title: "Obr. 3",
25
+ },
26
+ {
27
+ src: "https://opentopo.app/generated/area-1/8/b/8b84e378-1f55-4ce7-b750-b504091cb833_1024_1024_c.jpg",
28
+ title: "Obr. 4",
29
+ },
30
+ {
31
+ src: "https://opentopo.app/generated/area-2/e/7/e7ec532b-20c2-407e-9305-fa7cfb71f01f_1024_1024_c.jpg",
32
+ title: "Obr. 5",
33
+ },
22
34
  ];
23
35
  function Default() {
24
36
  return (react_1.default.createElement(image_gallery_1.default, null,
25
- react_1.default.createElement("div", { className: "flex-direction flex gap-2" }, images.map((src, index) => (react_1.default.createElement(image_2.default, { key: (0, image_1.getImgUniqueIdentifier)(src) || index, src: src, className: "h-56 w-56 cursor-pointer object-cover transition-transform hover:scale-105" }))))));
37
+ react_1.default.createElement("div", { className: "flex-direction flex gap-2" }, images.map((image, index) => (react_1.default.createElement(image_2.default, { key: (0, image_1.getImgUniqueIdentifier)(image.src) || index, src: image.src, className: "h-56 w-56 cursor-pointer object-cover transition-transform hover:scale-105", customContent: image.title }))))));
26
38
  }
27
39
  exports.Default = Default;
@@ -1,7 +1,9 @@
1
1
  import { ImageSource } from "@uxf/core/utils/resizer";
2
+ import { ReactNode } from "react";
2
3
  export interface ImageGalleryImageProps {
3
- src: ImageSource;
4
- title?: string;
5
4
  alt?: string;
6
5
  className?: string;
6
+ customContent?: ReactNode;
7
+ src: ImageSource;
8
+ title?: string;
7
9
  }
@@ -3,14 +3,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useImage = void 0;
4
4
  const react_1 = require("react");
5
5
  const context_1 = require("./context");
6
+ const useOnMount_1 = require("@uxf/core/hooks/useOnMount");
6
7
  function useImage(props) {
7
8
  const { registerImage, unregisterImage, openGallery } = (0, context_1.useImageGalleryContext)();
8
- (0, react_1.useEffect)(() => {
9
+ (0, useOnMount_1.useOnMount)(() => {
9
10
  registerImage(props);
10
11
  return () => {
11
12
  unregisterImage(props);
12
13
  };
13
- }, [props, registerImage, unregisterImage]);
14
+ });
14
15
  return (0, react_1.useCallback)(() => openGallery(props), [props, openGallery]);
15
16
  }
16
17
  exports.useImage = useImage;
@@ -34,10 +34,10 @@ const slugify_1 = require("@uxf/core/utils/slugify");
34
34
  const checkbox_1 = require("@uxf/ui/checkbox");
35
35
  const chip_1 = require("@uxf/ui/chip");
36
36
  const use_async_loading_1 = require("@uxf/ui/hooks/use-async-loading");
37
+ const use_dropdown_1 = require("@uxf/ui/hooks/use-dropdown");
37
38
  const icon_1 = require("@uxf/ui/icon");
38
39
  const label_1 = require("@uxf/ui/label");
39
40
  const react_2 = __importStar(require("react"));
40
- const use_dropdown_1 = require("../hooks/use-dropdown");
41
41
  exports.MultiComboboxBase = (0, forwardRef_1.forwardRef)("MultiComboboxBase", (props, ref) => {
42
42
  var _a, _b, _c, _d, _e, _f, _g;
43
43
  const isAsync = !!props.loadOptions;
@@ -92,8 +92,8 @@ exports.MultiComboboxBase = (0, forwardRef_1.forwardRef)("MultiComboboxBase", (p
92
92
  : (_g = props.notFoundMessage) !== null && _g !== void 0 ? _g : "Nic nenalezeno";
93
93
  return (react_2.default.createElement(react_1.Combobox, { as: "div", by: "id", className: (0, cx_1.cx)("uxf-multi-combobox", props.isInvalid && classes_1.CLASSES.IS_INVALID, props.isRequired && classes_1.CLASSES.IS_REQUIRED, props.isReadOnly && classes_1.CLASSES.IS_READONLY, props.isDisabled && classes_1.CLASSES.IS_DISABLED, props.className), disabled: props.isDisabled || props.isReadOnly, multiple: true, onChange: handleComboboxValueChange, value: selectedOptions }, (renderProps) => (react_2.default.createElement(react_2.default.Fragment, null,
94
94
  !props.withPopover && (react_2.default.createElement(react_1.Combobox.Label, { as: label_1.Label, isHidden: props.hiddenLabel, onClick: props.isDisabled || props.isReadOnly ? undefined : input.focus }, props.label)),
95
- react_2.default.createElement(react_1.Combobox.Button, { as: "div", className: (0, cx_1.cx)("uxf-multi-combobox__button pb-[7px]", (renderProps.open || input.focused) && classes_1.CLASSES.IS_FOCUSED, renderProps.disabled && classes_1.CLASSES.IS_DISABLED, props.isReadOnly && classes_1.CLASSES.IS_READONLY, props.isInvalid && classes_1.CLASSES.IS_INVALID, dropdown.placement === "bottom" && "is-open--bottom", dropdown.placement === "top" && "is-open--top", renderProps.open && classes_1.CLASSES.IS_OPEN), onBlur: input.onBlur, onFocus: input.onFocus, ref: stableRef, tabIndex: props.isDisabled || props.isReadOnly ? undefined : 0, "aria-invalid": props.isInvalid, "aria-describedby": props.errorId },
96
- selectedOptions.map((item) => (react_2.default.createElement(chip_1.Chip, { className: "mt-[7px] mr-2", color: item.color, key: item.id, onClose: handleRemove(item.id), size: "large", suppressFocus: true }, item.label))),
95
+ react_2.default.createElement(react_1.Combobox.Button, { as: "div", className: (0, cx_1.cx)("uxf-multi-combobox__button", (renderProps.open || input.focused) && classes_1.CLASSES.IS_FOCUSED, renderProps.disabled && classes_1.CLASSES.IS_DISABLED, props.isReadOnly && classes_1.CLASSES.IS_READONLY, props.isInvalid && classes_1.CLASSES.IS_INVALID, dropdown.placement === "bottom" && "is-open--bottom", dropdown.placement === "top" && "is-open--top", renderProps.open && classes_1.CLASSES.IS_OPEN), onBlur: input.onBlur, onFocus: input.onFocus, ref: stableRef, tabIndex: props.isDisabled || props.isReadOnly ? undefined : 0, "aria-invalid": props.isInvalid, "aria-describedby": props.errorId },
96
+ selectedOptions.map((item) => (react_2.default.createElement(chip_1.Chip, { className: "uxf-multi-combobox__input-chip", color: item.color, key: item.id, onClose: handleRemove(item.id), size: "large", suppressFocus: true }, item.label))),
97
97
  react_2.default.createElement(react_1.Combobox.Input, { className: "uxf-multi-combobox__input mt-[7px]", onChange: handleInputChange, onKeyDown: handleInputKeyDown, placeholder: props.placeholder, type: "text", value: query }),
98
98
  react_2.default.createElement(icon_1.Icon, { className: (0, cx_1.cx)("uxf-select__button-icon", (props.withPopover ? props.isPopoverOpen : renderProps.open) && "is-open"), name: iconName })),
99
99
  react_2.default.createElement(react_1.Combobox.Options, { className: (0, cx_1.cx)("uxf-dropdown", dropdown.placement === "bottom" && "uxf-dropdown--bottom", dropdown.placement === "top" && "uxf-dropdown--top"), static: props.withPopover, ref: dropdown.floating }, filteredData.length > 0 ? (filteredData.map((option) => {
@@ -0,0 +1,2 @@
1
+ export * from "./multi-select";
2
+ export * from "./types";
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./multi-select"), exports);
18
+ __exportStar(require("./types"), exports);
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ import { MultiSelectProps } from "./types";
3
+ interface MultiSelectBaseProps extends MultiSelectProps {
4
+ errorId?: string;
5
+ isPopoverOpen?: boolean;
6
+ }
7
+ export declare const MultiSelectBase: React.ForwardRefExoticComponent<MultiSelectBaseProps & React.RefAttributes<HTMLDivElement>>;
8
+ export {};
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.MultiSelectBase = void 0;
27
+ const react_1 = require("@headlessui/react");
28
+ const classes_1 = require("@uxf/core/constants/classes");
29
+ const useInputFocus_1 = require("@uxf/core/hooks/useInputFocus");
30
+ const composeRefs_1 = require("@uxf/core/utils/composeRefs");
31
+ const cx_1 = require("@uxf/core/utils/cx");
32
+ const forwardRef_1 = require("@uxf/core/utils/forwardRef");
33
+ const icon_1 = require("@uxf/ui//icon");
34
+ const chip_1 = require("@uxf/ui/chip");
35
+ const use_dropdown_1 = require("@uxf/ui/hooks/use-dropdown");
36
+ const label_1 = require("@uxf/ui/label");
37
+ const react_2 = __importStar(require("react"));
38
+ exports.MultiSelectBase = (0, forwardRef_1.forwardRef)("MultiSelectBase", (props, ref) => {
39
+ var _a, _b, _c;
40
+ const innerRef = (0, react_2.useRef)(null);
41
+ const input = (0, useInputFocus_1.useInputFocus)(innerRef, props.onBlur, props.onFocus);
42
+ const dropdown = (0, use_dropdown_1.useDropdown)((_a = props.dropdownPlacement) !== null && _a !== void 0 ? _a : "bottom", true);
43
+ const stableRef = (0, react_2.useMemo)(() => (0, composeRefs_1.composeRefs)(innerRef, ref, dropdown.reference), [ref, dropdown.reference]);
44
+ const iconName = (_b = props.iconName) !== null && _b !== void 0 ? _b : "chevronDown";
45
+ const selectedOptions = (_c = props.value) !== null && _c !== void 0 ? _c : [];
46
+ const handleSelectValueChange = (v) => {
47
+ var _a;
48
+ (_a = props.onChange) === null || _a === void 0 ? void 0 : _a.call(props, v.map((option) => option));
49
+ };
50
+ const handleRemove = (valueId) => (e) => {
51
+ var _a, _b, _c;
52
+ e === null || e === void 0 ? void 0 : e.preventDefault();
53
+ e === null || e === void 0 ? void 0 : e.stopPropagation();
54
+ (_a = props.onChange) === null || _a === void 0 ? void 0 : _a.call(props, (_c = (_b = props.value) === null || _b === void 0 ? void 0 : _b.filter((v) => v.id !== valueId)) !== null && _c !== void 0 ? _c : []);
55
+ };
56
+ return (react_2.default.createElement(react_1.Listbox, { as: "div", className: (0, cx_1.cx)("uxf-multi-combobox", props.isInvalid && classes_1.CLASSES.IS_INVALID, props.isRequired && classes_1.CLASSES.IS_REQUIRED, props.isReadOnly && classes_1.CLASSES.IS_READONLY, props.isDisabled && classes_1.CLASSES.IS_DISABLED, props.className), disabled: props.isDisabled || props.isReadOnly, multiple: true, onChange: handleSelectValueChange, value: selectedOptions }, (renderProps) => (react_2.default.createElement(react_2.default.Fragment, null,
57
+ !props.withPopover && (react_2.default.createElement(react_1.Listbox.Label, { as: label_1.Label, isHidden: props.hiddenLabel, onClick: props.isDisabled || props.isReadOnly ? undefined : input.focus }, props.label)),
58
+ react_2.default.createElement(react_1.Listbox.Button, { as: "div", className: (0, cx_1.cx)("uxf-multi-combobox__button", (renderProps.open || input.focused) && classes_1.CLASSES.IS_FOCUSED, renderProps.disabled && classes_1.CLASSES.IS_DISABLED, props.isReadOnly && classes_1.CLASSES.IS_READONLY, props.isInvalid && classes_1.CLASSES.IS_INVALID, dropdown.placement === "bottom" && "is-open--bottom", dropdown.placement === "top" && "is-open--top", renderProps.open && "is-open"), onBlur: input.onBlur, onFocus: input.onFocus, tabIndex: props.isDisabled || props.isReadOnly ? undefined : 0, ref: stableRef, "aria-invalid": props.isInvalid, "aria-describedby": props.errorId },
59
+ react_2.default.createElement("div", { className: (0, cx_1.cx)("uxf-multi-select__input", selectedOptions.length === 0 && "uxf-multi-select__input--is-empty") }, selectedOptions.length === 0
60
+ ? props.placeholder
61
+ : selectedOptions.map((item) => (react_2.default.createElement(chip_1.Chip, { className: "uxf-multi-combobox__input-chip", color: item.color, key: item.id, onClose: handleRemove(item.id), size: "large", suppressFocus: true }, item.label)))),
62
+ react_2.default.createElement(icon_1.Icon, { className: (0, cx_1.cx)("uxf-select__button-icon", renderProps.open && "is-open"), name: iconName })),
63
+ react_2.default.createElement(react_1.Listbox.Options, { className: (0, cx_1.cx)("uxf-dropdown", dropdown.placement === "bottom" && "uxf-dropdown--bottom", dropdown.placement === "top" && "uxf-dropdown--top"), ref: dropdown.floating, static: props.withPopover }, props.options.map((option) => {
64
+ var _a, _b, _c, _d;
65
+ return (react_2.default.createElement(react_1.Listbox.Option, { className: (optionState) => (0, cx_1.cx)("uxf-dropdown__item uxf-multi-select__dropdown-item", optionState.active && classes_1.CLASSES.IS_ACTIVE, optionState.disabled && classes_1.CLASSES.IS_DISABLED, optionState.selected && classes_1.CLASSES.IS_SELECTED), key: (_b = (_a = props.keyExtractor) === null || _a === void 0 ? void 0 : _a.call(props, option)) !== null && _b !== void 0 ? _b : option.id, value: option }, (_d = (_c = props.renderOption) === null || _c === void 0 ? void 0 : _c.call(props, option)) !== null && _d !== void 0 ? _d : option.label));
66
+ })),
67
+ props.helperText && !props.withPopover && (react_2.default.createElement("div", { className: (0, cx_1.cx)("uxf-helper-text", props.isInvalid && classes_1.CLASSES.IS_INVALID), id: props.errorId }, props.helperText))))));
68
+ });
@@ -0,0 +1,3 @@
1
+ import React from "react";
2
+ import { MultiSelectProps } from "./types";
3
+ export declare const MultiSelect: React.ForwardRefExoticComponent<MultiSelectProps<import("./types").MultiSelectValueId, import("./types").MultiSelectOption<import("./types").MultiSelectValueId>> & React.RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.MultiSelect = void 0;
27
+ const react_1 = require("@headlessui/react");
28
+ const classes_1 = require("@uxf/core/constants/classes");
29
+ const cx_1 = require("@uxf/core/utils/cx");
30
+ const forwardRef_1 = require("@uxf/core/utils/forwardRef");
31
+ const form_control_1 = require("@uxf/ui/form-control");
32
+ const icon_1 = require("@uxf/ui/icon");
33
+ const react_2 = __importStar(require("react"));
34
+ const multi_select_base_1 = require("./multi-select-base");
35
+ exports.MultiSelect = (0, forwardRef_1.forwardRef)("MultiSelect", (props, ref) => {
36
+ var _a, _b, _c;
37
+ const generatedId = (0, react_2.useId)();
38
+ const id = (_a = props.id) !== null && _a !== void 0 ? _a : generatedId;
39
+ const errorId = props.isInvalid ? `${id}--error-message` : undefined;
40
+ const iconName = (_b = props.iconName) !== null && _b !== void 0 ? _b : "chevronDown";
41
+ const selectedOptions = (_c = props.value) !== null && _c !== void 0 ? _c : [];
42
+ if (!props.withPopover) {
43
+ return react_2.default.createElement(multi_select_base_1.MultiSelectBase, { ...props, errorId: errorId, id: id, ref: ref });
44
+ }
45
+ return (react_2.default.createElement(form_control_1.FormControl, { className: (0, cx_1.cx)(props.isDisabled && classes_1.CLASSES.IS_DISABLED, props.isInvalid && classes_1.CLASSES.IS_INVALID, props.isReadOnly && classes_1.CLASSES.IS_READONLY), errorId: errorId, form: props.form, helperText: props.helperText, inputId: id, isRequired: props.isRequired, label: props.label },
46
+ react_2.default.createElement(react_1.Popover, { className: (0, cx_1.cx)("uxf-multi-combobox", props.isInvalid && classes_1.CLASSES.IS_INVALID, props.isRequired && classes_1.CLASSES.IS_REQUIRED, props.isReadOnly && classes_1.CLASSES.IS_READONLY, props.isDisabled && classes_1.CLASSES.IS_DISABLED, props.className) }, (popoverRenderProps) => (react_2.default.createElement(react_2.default.Fragment, null,
47
+ react_2.default.createElement(react_1.Popover.Button, { className: (0, cx_1.cx)("uxf-multi-combobox__button uxf-multi-combobox__button--with-popover", popoverRenderProps.open && classes_1.CLASSES.IS_OPEN, props.isReadOnly && classes_1.CLASSES.IS_READONLY, props.isInvalid && classes_1.CLASSES.IS_INVALID) },
48
+ react_2.default.createElement("span", { className: (0, cx_1.cx)("uxf-multi-combobox__input uxf-multi-combobox__input--with-popover", selectedOptions.length === 0 &&
49
+ "uxf-multi-combobox__input-placeholder--with-popover") }, selectedOptions.length > 0
50
+ ? selectedOptions.map((e) => e.label).join(", ")
51
+ : props.placeholder),
52
+ react_2.default.createElement(icon_1.Icon, { className: "uxf-select__button-icon", name: iconName })),
53
+ react_2.default.createElement(react_1.Popover.Panel, { className: "uxf-multi-combobox__popover-panel", focus: popoverRenderProps.open, unmount: false },
54
+ react_2.default.createElement(multi_select_base_1.MultiSelectBase, { ...props, errorId: errorId, isPopoverOpen: popoverRenderProps.open, ref: ref, withPopover: true })))))));
55
+ });
@@ -0,0 +1,9 @@
1
+ import React from "react";
2
+ import { MultiSelectOption } from "./types";
3
+ declare const _default: {
4
+ title: string;
5
+ component: React.ForwardRefExoticComponent<import("./types").MultiSelectProps<import("./types").MultiSelectValueId, MultiSelectOption<import("./types").MultiSelectValueId>> & React.RefAttributes<HTMLDivElement>>;
6
+ };
7
+ export default _default;
8
+ export declare const Default: () => JSX.Element;
9
+ export declare function ComponentStructure(): JSX.Element;
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.ComponentStructure = exports.Default = void 0;
30
+ const component_structure_analyzer_1 = __importDefault(require("@uxf/ui/utils/component-structure-analyzer"));
31
+ const react_1 = __importStar(require("react"));
32
+ const index_1 = require("./index");
33
+ exports.default = {
34
+ title: "UI/MultiSelect",
35
+ component: index_1.MultiSelect,
36
+ };
37
+ const options = [
38
+ { id: "one", label: "Option red", color: "red" },
39
+ { id: "two", label: "Option blue", color: "blue" },
40
+ { id: "three", label: "Option green", color: "green" },
41
+ { id: "four", label: "Option four" },
42
+ { id: "five", label: "Option five" },
43
+ { id: "six", label: "Option with diacritics (ěščřžýáíé)" },
44
+ ];
45
+ const Default = () => {
46
+ const [values, setValues] = (0, react_1.useState)();
47
+ const handleChange = (v) => {
48
+ // eslint-disable-next-line no-console
49
+ console.log("Select values: ", v);
50
+ setValues(v);
51
+ };
52
+ const component = (react_1.default.createElement(react_1.default.Fragment, null,
53
+ react_1.default.createElement(index_1.MultiSelect, { id: "multi-select-1", label: "MultiSelect", name: "multi-select", onChange: handleChange, options: options, placeholder: "Vyberte pros\u00EDm jednu nebo v\u00EDce mo\u017Enost\u00ED", value: values }),
54
+ react_1.default.createElement(index_1.MultiSelect, { id: "multi-select-2", label: "MultiSelect with popover", name: "multi-select", onChange: handleChange, options: options, placeholder: "Vyberte ..", value: values, withPopover: true })));
55
+ return (react_1.default.createElement("div", { className: "flex flex-col lg:flex-row" },
56
+ react_1.default.createElement("div", { className: "light space-y-2 p-20 lg:w-1/2" }, component),
57
+ react_1.default.createElement("div", { className: "dark space-y-2 bg-gray-900 p-20 lg:w-1/2" }, component)));
58
+ };
59
+ exports.Default = Default;
60
+ function ComponentStructure() {
61
+ return (react_1.default.createElement(component_structure_analyzer_1.default, null,
62
+ react_1.default.createElement(index_1.MultiSelect, { options: [] })));
63
+ }
64
+ exports.ComponentStructure = ComponentStructure;
@@ -0,0 +1,30 @@
1
+ import { Placement } from "@floating-ui/react";
2
+ import { ReactNode } from "react";
3
+ import { ChipColor } from "../chip";
4
+ import { IconsSet } from "../icon/theme";
5
+ import { SelectSizes } from "../select/theme";
6
+ import { FormControlProps } from "../types";
7
+ export declare type MultiSelectValueId = number | string;
8
+ export declare type MultiSelectOption<T = MultiSelectValueId> = {
9
+ color?: ChipColor;
10
+ disabled?: boolean;
11
+ id: T;
12
+ label: ReactNode;
13
+ };
14
+ export interface MultiSelectProps<ValueId = MultiSelectValueId, Option = MultiSelectOption<ValueId>> extends FormControlProps<Option[] | null> {
15
+ className?: string;
16
+ dropdownPlacement?: Placement;
17
+ form?: string;
18
+ helperText?: ReactNode;
19
+ hiddenLabel?: boolean;
20
+ iconName?: keyof IconsSet;
21
+ id?: string;
22
+ keyExtractor?: (option: Option) => string | number;
23
+ label?: ReactNode;
24
+ options: Option[];
25
+ placeholder?: string;
26
+ renderOption?: (option: Option) => ReactNode;
27
+ size?: keyof SelectSizes;
28
+ withPopover?: boolean;
29
+ }
30
+ export declare type MultiSelectTypeRef = HTMLDivElement;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uxf/ui",
3
- "version": "1.0.0-beta.125",
3
+ "version": "1.0.0-beta.127",
4
4
  "description": "",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -1,6 +0,0 @@
1
- /// <reference types="react" />
2
- interface NextButtonProps {
3
- onClick: () => void;
4
- }
5
- declare function NextButton(props: NextButtonProps): JSX.Element;
6
- export default NextButton;
@@ -1,6 +0,0 @@
1
- /// <reference types="react" />
2
- interface PreviousButtonProps {
3
- onClick: () => void;
4
- }
5
- declare function PreviousButton(props: PreviousButtonProps): JSX.Element;
6
- export default PreviousButton;
@@ -1,12 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const react_1 = __importDefault(require("react"));
7
- const icon_1 = require("../../icon");
8
- function PreviousButton(props) {
9
- return (react_1.default.createElement("button", { className: "pointer-events-auto rounded-full bg-black bg-opacity-50 p-3", onClick: props.onClick },
10
- react_1.default.createElement(icon_1.Icon, { className: "h-8 w-8 text-white", name: "chevronLeft" })));
11
- }
12
- exports.default = PreviousButton;
File without changes
File without changes
File without changes
File without changes