@chayns-ui/core 0.4.2 → 0.5.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.
Files changed (55) hide show
  1. package/dist/avatar.css +25 -8
  2. package/dist/badge.css +46 -0
  3. package/dist/combo-box.css +144 -0
  4. package/dist/components/accordion/Accordion.d.ts +1 -1
  5. package/dist/components/accordion/Accordion.d.ts.map +1 -1
  6. package/dist/components/accordion/Accordion.js +8 -5
  7. package/dist/components/accordion/Accordion.js.map +1 -1
  8. package/dist/components/accordion/Accordion.types.d.ts +3 -3
  9. package/dist/components/accordion/Accordion.types.d.ts.map +1 -1
  10. package/dist/components/accordion-group/AccordionGroup.d.ts +1 -1
  11. package/dist/components/accordion-group/AccordionGroup.d.ts.map +1 -1
  12. package/dist/components/accordion-group/AccordionGroup.js +3 -1
  13. package/dist/components/accordion-group/AccordionGroup.js.map +1 -1
  14. package/dist/components/avatar/Avatar.d.ts +1 -1
  15. package/dist/components/avatar/Avatar.d.ts.map +1 -1
  16. package/dist/components/avatar/Avatar.js +6 -5
  17. package/dist/components/avatar/Avatar.js.map +1 -1
  18. package/dist/components/avatar/Avatar.types.d.ts +3 -11
  19. package/dist/components/avatar/Avatar.types.d.ts.map +1 -1
  20. package/dist/components/avatar-group/AvatarGroup.d.ts +1 -1
  21. package/dist/components/avatar-group/AvatarGroup.d.ts.map +1 -1
  22. package/dist/components/avatar-group/AvatarGroup.js +6 -5
  23. package/dist/components/avatar-group/AvatarGroup.js.map +1 -1
  24. package/dist/components/avatar-group/AvatarGroup.types.d.ts +2 -10
  25. package/dist/components/avatar-group/AvatarGroup.types.d.ts.map +1 -1
  26. package/dist/components/badge/Badge.d.ts +4 -0
  27. package/dist/components/badge/Badge.d.ts.map +1 -0
  28. package/dist/components/badge/Badge.js +26 -0
  29. package/dist/components/badge/Badge.js.map +1 -0
  30. package/dist/components/badge/Badge.types.d.ts +13 -0
  31. package/dist/components/badge/Badge.types.d.ts.map +1 -0
  32. package/dist/components/badge/Badge.types.js +13 -0
  33. package/dist/components/badge/Badge.types.js.map +1 -0
  34. package/dist/components/button/Button.types.d.ts +5 -0
  35. package/dist/components/button/Button.types.d.ts.map +1 -1
  36. package/dist/components/button/Button.types.js +15 -0
  37. package/dist/components/button/Button.types.js.map +1 -0
  38. package/dist/components/combo-box/ComboBox.d.ts +6 -0
  39. package/dist/components/combo-box/ComboBox.d.ts.map +1 -0
  40. package/dist/components/combo-box/ComboBox.js +217 -0
  41. package/dist/components/combo-box/ComboBox.js.map +1 -0
  42. package/dist/components/combo-box/ComboBox.types.d.ts +32 -0
  43. package/dist/components/combo-box/ComboBox.types.d.ts.map +1 -0
  44. package/dist/components/combo-box/ComboBoxContext.d.ts +15 -0
  45. package/dist/components/combo-box/ComboBoxContext.d.ts.map +1 -0
  46. package/dist/components/combo-box/ComboBoxContext.js +16 -0
  47. package/dist/components/combo-box/ComboBoxContext.js.map +1 -0
  48. package/dist/components/split-button/SplitButton.types.d.ts +1 -0
  49. package/dist/components/split-button/SplitButton.types.d.ts.map +1 -1
  50. package/dist/index.d.ts +6 -0
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +5 -1
  53. package/dist/list.css +2 -2
  54. package/dist/styles.css +2 -0
  55. package/package.json +3 -1
@@ -0,0 +1,26 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { forwardRef } from "react";
3
+ //#region src/components/badge/Badge.tsx
4
+ var Badge = forwardRef(function Badge({ "aria-label": ariaLabel, children, className, size = "sm", tone = "neutral", ...spanProps }, ref) {
5
+ const resolvedClassName = [
6
+ "chayns-badge",
7
+ `chayns-badge--${tone}`,
8
+ `chayns-badge--${size}`,
9
+ className
10
+ ].filter(Boolean).join(" ");
11
+ return /* @__PURE__ */ jsx("span", {
12
+ ...spanProps,
13
+ "aria-label": ariaLabel,
14
+ className: resolvedClassName,
15
+ ref,
16
+ role: ariaLabel === void 0 ? void 0 : "status",
17
+ children: /* @__PURE__ */ jsx("span", {
18
+ className: "chayns-badge__content",
19
+ children
20
+ })
21
+ });
22
+ });
23
+ //#endregion
24
+ export { Badge as default };
25
+
26
+ //# sourceMappingURL=Badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Badge.js","names":[],"sources":["../../../src/components/badge/Badge.tsx"],"sourcesContent":["import { forwardRef } from 'react';\n\nimport type { BadgeProps } from './Badge.types.js';\n\nconst Badge = forwardRef<HTMLSpanElement, BadgeProps>(function Badge(\n { 'aria-label': ariaLabel, children, className, size = 'sm', tone = 'neutral', ...spanProps },\n ref,\n) {\n const resolvedClassName = [\n 'chayns-badge',\n `chayns-badge--${tone}`,\n `chayns-badge--${size}`,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <span\n {...spanProps}\n aria-label={ariaLabel}\n className={resolvedClassName}\n ref={ref}\n role={ariaLabel === undefined ? undefined : 'status'}\n >\n <span className=\"chayns-badge__content\">{children}</span>\n </span>\n );\n});\n\nexport default Badge;\n"],"mappings":";;;AAIA,IAAM,QAAQ,WAAwC,SAAS,MAC7D,EAAE,cAAc,WAAW,UAAU,WAAW,OAAO,MAAM,OAAO,WAAW,GAAG,aAClF,KACA;CACA,MAAM,oBAAoB;EACxB;EACA,iBAAiB;EACjB,iBAAiB;EACjB;CACF,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;CAEX,OACE,oBAAC,QAAD;EACE,GAAI;EACJ,cAAY;EACZ,WAAW;EACN;EACL,MAAM,cAAc,KAAA,IAAY,KAAA,IAAY;EAE5C,UAAA,oBAAC,QAAD;GAAM,WAAU;GAAyB;EAAe,CAAA;CACpD,CAAA;AAEV,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { ComponentPropsWithRef, ReactNode } from 'react';
2
+ export declare const BADGE_TONES: readonly ["neutral", "accent", "success", "warning", "danger"];
3
+ export type BadgeTone = (typeof BADGE_TONES)[number];
4
+ export declare const BADGE_SIZES: readonly ["sm", "md"];
5
+ export type BadgeSize = (typeof BADGE_SIZES)[number];
6
+ export interface BadgeProps extends Omit<ComponentPropsWithRef<'span'>, 'children' | 'role'> {
7
+ children: Exclude<ReactNode, boolean | null | undefined>;
8
+ tone?: BadgeTone;
9
+ size?: BadgeSize;
10
+ 'aria-label'?: string;
11
+ role?: never;
12
+ }
13
+ //# sourceMappingURL=Badge.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Badge.types.d.ts","sourceRoot":"","sources":["../../../src/components/badge/Badge.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE9D,eAAO,MAAM,WAAW,gEAAiE,CAAC;AAC1F,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAErD,eAAO,MAAM,WAAW,uBAAwB,CAAC;AACjD,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAErD,MAAM,WAAW,UAAW,SAAQ,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;IAC1F,QAAQ,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IACzD,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,KAAK,CAAC;CACd"}
@@ -0,0 +1,13 @@
1
+ //#region src/components/badge/Badge.types.ts
2
+ var BADGE_TONES = [
3
+ "neutral",
4
+ "accent",
5
+ "success",
6
+ "warning",
7
+ "danger"
8
+ ];
9
+ var BADGE_SIZES = ["sm", "md"];
10
+ //#endregion
11
+ export { BADGE_SIZES, BADGE_TONES };
12
+
13
+ //# sourceMappingURL=Badge.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Badge.types.js","names":[],"sources":["../../../src/components/badge/Badge.types.ts"],"sourcesContent":["import type { ComponentPropsWithRef, ReactNode } from 'react';\n\nexport const BADGE_TONES = ['neutral', 'accent', 'success', 'warning', 'danger'] as const;\nexport type BadgeTone = (typeof BADGE_TONES)[number];\n\nexport const BADGE_SIZES = ['sm', 'md'] as const;\nexport type BadgeSize = (typeof BADGE_SIZES)[number];\n\nexport interface BadgeProps extends Omit<ComponentPropsWithRef<'span'>, 'children' | 'role'> {\n children: Exclude<ReactNode, boolean | null | undefined>;\n tone?: BadgeTone;\n size?: BadgeSize;\n 'aria-label'?: string;\n role?: never;\n}\n"],"mappings":";AAEA,IAAa,cAAc;CAAC;CAAW;CAAU;CAAW;CAAW;AAAQ;AAG/E,IAAa,cAAc,CAAC,MAAM,IAAI"}
@@ -6,6 +6,11 @@ import type { ComponentPropsWithRef, ReactNode } from 'react';
6
6
  * @see {@link https://tappqa.tobit.com/Bodywork/DesignSystem/#buttons | DesignSystem — Buttons & Aktionen}
7
7
  */
8
8
  export type ButtonVariant = 'primary' | 'outline' | 'ghost' | 'danger';
9
+ /**
10
+ * Runtime representation of the finite Button variant contract.
11
+ * Keep this list as the single source for Storybook controls and iteration.
12
+ */
13
+ export declare const BUTTON_VARIANTS: readonly ["primary", "outline", "ghost", "danger"];
9
14
  /**
10
15
  * @description A FontAwesome Classic icon name in its Regular form (e.g.
11
16
  * `fa-plus`). Button and IconButton resolve the matching Solid weight
@@ -1 +1 @@
1
- {"version":3,"file":"Button.types.d.ts","sourceRoot":"","sources":["../../../src/components/button/Button.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE9D;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEvE;;;;;;GAMG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,MAAM,EAAE,CAAC;AAExC;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;AAE3E;;;;GAIG;AACH,MAAM,WAAW,WAAY,SAAQ,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC;IACpF;;;;;OAKG;IACH,OAAO,EAAE,aAAa,CAAC;IAEvB;;;;OAIG;IACH,IAAI,CAAC,EAAE,UAAU,CAAC;IAElB;;;;OAIG;IACH,QAAQ,EAAE,aAAa,CAAC;CACzB"}
1
+ {"version":3,"file":"Button.types.d.ts","sourceRoot":"","sources":["../../../src/components/button/Button.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE9D;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEvE;;;GAGG;AACH,eAAO,MAAM,eAAe,oDAKiB,CAAC;AAE9C;;;;;;GAMG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,MAAM,EAAE,CAAC;AAExC;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;AAE3E;;;;GAIG;AACH,MAAM,WAAW,WAAY,SAAQ,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC;IACpF;;;;;OAKG;IACH,OAAO,EAAE,aAAa,CAAC;IAEvB;;;;OAIG;IACH,IAAI,CAAC,EAAE,UAAU,CAAC;IAElB;;;;OAIG;IACH,QAAQ,EAAE,aAAa,CAAC;CACzB"}
@@ -0,0 +1,15 @@
1
+ //#region src/components/button/Button.types.ts
2
+ /**
3
+ * Runtime representation of the finite Button variant contract.
4
+ * Keep this list as the single source for Storybook controls and iteration.
5
+ */
6
+ var BUTTON_VARIANTS = [
7
+ "primary",
8
+ "outline",
9
+ "ghost",
10
+ "danger"
11
+ ];
12
+ //#endregion
13
+ export { BUTTON_VARIANTS };
14
+
15
+ //# sourceMappingURL=Button.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button.types.js","names":[],"sources":["../../../src/components/button/Button.types.ts"],"sourcesContent":["import type { ComponentPropsWithRef, ReactNode } from 'react';\n\n/**\n * @description Supported visual emphasis levels for {@link ButtonProps} and\n * `IconButtonProps`. Milestone 1 supports exactly these four values; there is\n * no default variant and no fifth value.\n * @see {@link https://tappqa.tobit.com/Bodywork/DesignSystem/#buttons | DesignSystem — Buttons & Aktionen}\n */\nexport type ButtonVariant = 'primary' | 'outline' | 'ghost' | 'danger';\n\n/**\n * Runtime representation of the finite Button variant contract.\n * Keep this list as the single source for Storybook controls and iteration.\n */\nexport const BUTTON_VARIANTS = [\n 'primary',\n 'outline',\n 'ghost',\n 'danger',\n] as const satisfies readonly ButtonVariant[];\n\n/**\n * @description A FontAwesome Classic icon name in its Regular form (e.g.\n * `fa-plus`). Button and IconButton resolve the matching Solid weight\n * internally and cross-fade between the two on hover/active; consumers must\n * not pass a pre-resolved weight and must supply a name that has both a\n * Regular and a Solid glyph available.\n */\nexport type ButtonIcon = `fa-${string}`;\n\n/**\n * @description Visible content that gives a `Button` its accessible name.\n * Excludes `boolean`, `null` and `undefined` so a `Button` can never be\n * rendered without real, visible label content.\n */\nexport type ButtonContent = Exclude<ReactNode, boolean | null | undefined>;\n\n/**\n * @description Props for a visible-label native action button. Renders a\n * native `<button>` and forwards all remaining native button props, events,\n * `className` and `ref`.\n */\nexport interface ButtonProps extends Omit<ComponentPropsWithRef<'button'>, 'children'> {\n /**\n * @description Visual emphasis that communicates the action's role within\n * its action scope. At most one `primary` action should exist per closed\n * action scope (page, card, dialog, drawer, form, wizard step, or closed\n * accordion content).\n */\n variant: ButtonVariant;\n\n /**\n * @description Optional leading FontAwesome Classic icon name. Always\n * rendered before `children`; there is no trailing-icon or icon-only mode\n * on `Button` itself — use `IconButton` for an icon-only action.\n */\n icon?: ButtonIcon;\n\n /**\n * @description Visible, non-empty content used as the button label. Loading\n * state, polymorphism (rendering as something other than a native button)\n * and navigation are explicitly not part of the Milestone 1 API.\n */\n children: ButtonContent;\n}\n"],"mappings":";;;;;AAcA,IAAa,kBAAkB;CAC7B;CACA;CACA;CACA;AACF"}
@@ -0,0 +1,6 @@
1
+ import type { ComboBoxOptionProps } from './ComboBox.types.js';
2
+ declare const ComboBox: import("react").ForwardRefExoticComponent<(Omit<import("./ComboBox.types.js").ComboBoxSingleProps, "ref"> | Omit<import("./ComboBox.types.js").ComboBoxMultipleProps, "ref">) & import("react").RefAttributes<HTMLInputElement>> & {
3
+ Option: import("react").ForwardRefExoticComponent<Omit<ComboBoxOptionProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
4
+ };
5
+ export default ComboBox;
6
+ //# sourceMappingURL=ComboBox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ComboBox.d.ts","sourceRoot":"","sources":["../../../src/components/combo-box/ComboBox.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,mBAAmB,EAAiB,MAAM,qBAAqB,CAAC;AA2T9E,QAAA,MAAM,QAAQ;;CAA0C,CAAC;AAEzD,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,217 @@
1
+ import { ComboBoxContext, getOptionLabel, useComboBoxContext } from "./ComboBoxContext.js";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { Children, Fragment, forwardRef, isValidElement, useEffect, useId, useMemo, useRef, useState } from "react";
4
+ //#region src/components/combo-box/ComboBox.tsx
5
+ function getOptionElements(children) {
6
+ const options = [];
7
+ Children.forEach(children, (child) => {
8
+ if (!isValidElement(child)) return;
9
+ const element = child;
10
+ if (element.type === Fragment) options.push(...getOptionElements(element.props.children));
11
+ else if (typeof element.props.value === "string") options.push(element);
12
+ });
13
+ return options;
14
+ }
15
+ var Option = forwardRef(function Option({ children, className, value, ...optionProps }, ref) {
16
+ const comboBox = useComboBoxContext();
17
+ const isVisible = comboBox.visibleValues.includes(value);
18
+ const isSelected = comboBox.isSelected(value);
19
+ const resolvedClassName = [
20
+ "chayns-combo-box__option",
21
+ isSelected ? "chayns-combo-box__option--selected" : "",
22
+ comboBox.activeValue === value ? "chayns-combo-box__option--active" : "",
23
+ className
24
+ ].filter(Boolean).join(" ");
25
+ if (!isVisible) return null;
26
+ return /* @__PURE__ */ jsxs("div", {
27
+ ...optionProps,
28
+ "aria-selected": isSelected,
29
+ className: resolvedClassName,
30
+ id: comboBox.optionId(value),
31
+ onMouseDown: (event) => event.preventDefault(),
32
+ onClick: () => comboBox.select(value),
33
+ ref,
34
+ role: "option",
35
+ children: [comboBox.multiple ? /* @__PURE__ */ jsx("span", {
36
+ "aria-hidden": "true",
37
+ className: "chayns-combo-box__checkbox",
38
+ "data-checked": isSelected || void 0
39
+ }) : null, children]
40
+ });
41
+ });
42
+ var ComboBoxRoot = forwardRef(function ComboBoxRoot(props, ref) {
43
+ const { "aria-label": ariaLabel, children, className, defaultValue, disabled, id, multiple = false, onValueChange, openOnFocus = true, placeholder, value, ...inputProps } = props;
44
+ const generatedId = useId();
45
+ const inputId = id ?? generatedId;
46
+ const listboxId = `${inputId}-listbox`;
47
+ const rootRef = useRef(null);
48
+ const inputRef = useRef(null);
49
+ const optionElements = useMemo(() => getOptionElements(children), [children]);
50
+ const optionMap = useMemo(() => new Map(optionElements.map((option) => [option.props.value, option])), [optionElements]);
51
+ const defaultValues = multiple ? defaultValue?.map((option) => option.props.value) ?? [] : [];
52
+ const controlledValues = multiple ? value?.map((option) => option.props.value) ?? [] : [];
53
+ const [uncontrolledValue, setUncontrolledValue] = useState(multiple ? "" : defaultValue ?? "");
54
+ const [uncontrolledValues, setUncontrolledValues] = useState(defaultValues);
55
+ const [inputText, setInputText] = useState(multiple ? "" : defaultValue ?? "");
56
+ const [open, setOpen] = useState(false);
57
+ const [activeValue, setActiveValue] = useState();
58
+ const isControlled = value !== void 0;
59
+ const selectedValue = multiple ? "" : isControlled ? value : uncontrolledValue;
60
+ const selectedValues = multiple ? isControlled ? controlledValues : uncontrolledValues : [];
61
+ const normalizedFilter = inputText.trim().toLocaleLowerCase();
62
+ const visibleValues = optionElements.filter((option) => {
63
+ const label = getOptionLabel(option.props.children).toLocaleLowerCase();
64
+ return normalizedFilter === "" || label.includes(normalizedFilter);
65
+ }).map((option) => option.props.value);
66
+ useEffect(() => {
67
+ if (open && activeValue === void 0) setActiveValue(visibleValues[0]);
68
+ }, [
69
+ activeValue,
70
+ open,
71
+ visibleValues
72
+ ]);
73
+ useEffect(() => {
74
+ if (!open) return;
75
+ function closeOnOutsidePress(event) {
76
+ if (event.target instanceof Node && !rootRef.current?.contains(event.target)) {
77
+ commitInput();
78
+ setOpen(false);
79
+ }
80
+ }
81
+ document.addEventListener("pointerdown", closeOnOutsidePress);
82
+ return () => document.removeEventListener("pointerdown", closeOnOutsidePress);
83
+ });
84
+ function setInputElement(element) {
85
+ inputRef.current = element;
86
+ if (typeof ref === "function") ref(element);
87
+ else if (ref !== null) ref.current = element;
88
+ }
89
+ function emitValue(nextValue) {
90
+ if (!isControlled) setUncontrolledValue(nextValue);
91
+ onValueChange?.(nextValue);
92
+ }
93
+ function emitValues(nextValues) {
94
+ if (!isControlled) setUncontrolledValues(nextValues);
95
+ const nextOptions = nextValues.map((nextValue) => optionMap.get(nextValue)).filter((option) => option !== void 0);
96
+ onValueChange?.(nextOptions);
97
+ }
98
+ function commitInput() {
99
+ if (!multiple && inputText !== selectedValue) emitValue(inputText);
100
+ }
101
+ function select(nextValue) {
102
+ if (multiple) {
103
+ emitValues(selectedValues.includes(nextValue) ? selectedValues.filter((selected) => selected !== nextValue) : [...selectedValues, nextValue]);
104
+ setInputText("");
105
+ setActiveValue(void 0);
106
+ setOpen(true);
107
+ return;
108
+ }
109
+ const option = optionMap.get(nextValue);
110
+ emitValue(nextValue);
111
+ setInputText(option === void 0 ? nextValue : getOptionLabel(option.props.children));
112
+ setActiveValue(void 0);
113
+ setOpen(false);
114
+ }
115
+ function handleChange(event) {
116
+ setInputText(event.target.value);
117
+ setActiveValue(void 0);
118
+ setOpen(true);
119
+ props.onChange?.(event);
120
+ }
121
+ function handleBlur(event) {
122
+ props.onBlur?.(event);
123
+ if (!rootRef.current?.contains(event.relatedTarget)) {
124
+ commitInput();
125
+ setOpen(false);
126
+ }
127
+ }
128
+ function handleKeyDown(event) {
129
+ const currentIndex = activeValue === void 0 ? -1 : visibleValues.indexOf(activeValue);
130
+ let nextIndex = currentIndex;
131
+ if (event.key === "ArrowDown") nextIndex = Math.min(currentIndex + 1, visibleValues.length - 1);
132
+ if (event.key === "ArrowUp") nextIndex = Math.max(currentIndex - 1, 0);
133
+ if (event.key === "Home") nextIndex = 0;
134
+ if (event.key === "End") nextIndex = visibleValues.length - 1;
135
+ if (nextIndex !== currentIndex && visibleValues[nextIndex] !== void 0) {
136
+ event.preventDefault();
137
+ setActiveValue(visibleValues[nextIndex]);
138
+ setOpen(true);
139
+ } else if (event.key === "Enter" && activeValue !== void 0) {
140
+ event.preventDefault();
141
+ select(activeValue);
142
+ } else if (event.key === "Escape") {
143
+ event.preventDefault();
144
+ setInputText(multiple ? "" : selectedValue);
145
+ setActiveValue(void 0);
146
+ setOpen(false);
147
+ }
148
+ props.onKeyDown?.(event);
149
+ }
150
+ const resolvedClassName = ["chayns-combo-box", open ? "chayns-combo-box--open" : ""].filter(Boolean).join(" ");
151
+ const describedLabel = placeholder === void 0 ? void 0 : `${inputId}-label`;
152
+ const selectedOptions = selectedValues.map((selected) => optionMap.get(selected)).filter((option) => option !== void 0);
153
+ const inputClassName = ["chayns-combo-box__input", className].filter(Boolean).join(" ");
154
+ return /* @__PURE__ */ jsx(ComboBoxContext.Provider, {
155
+ value: {
156
+ activeValue,
157
+ close: () => setOpen(false),
158
+ inputText,
159
+ isSelected: (optionValue) => multiple ? selectedValues.includes(optionValue) : selectedValue === optionValue,
160
+ multiple,
161
+ optionId: (optionValue) => `${listboxId}-${optionValue.replace(/[^a-zA-Z0-9_-]/g, "-")}`,
162
+ select,
163
+ visibleValues
164
+ },
165
+ children: /* @__PURE__ */ jsxs("div", {
166
+ className: resolvedClassName,
167
+ ref: rootRef,
168
+ children: [
169
+ multiple ? /* @__PURE__ */ jsx("div", {
170
+ className: "chayns-combo-box__chips",
171
+ "aria-hidden": "true",
172
+ children: selectedOptions.map((option) => /* @__PURE__ */ jsx("span", {
173
+ className: "chayns-combo-box__chip",
174
+ children: option.props.children
175
+ }, option.props.value))
176
+ }) : null,
177
+ /* @__PURE__ */ jsx("input", {
178
+ ...inputProps,
179
+ "aria-activedescendant": open && activeValue ? `${listboxId}-${activeValue.replace(/[^a-zA-Z0-9_-]/g, "-")}` : void 0,
180
+ "aria-autocomplete": "list",
181
+ "aria-controls": listboxId,
182
+ "aria-expanded": open,
183
+ "aria-label": ariaLabel,
184
+ className: inputClassName,
185
+ disabled,
186
+ id: inputId,
187
+ onBlur: handleBlur,
188
+ onChange: handleChange,
189
+ onFocus: () => openOnFocus && setOpen(true),
190
+ onKeyDown: handleKeyDown,
191
+ placeholder: placeholder === void 0 ? void 0 : " ",
192
+ ref: setInputElement,
193
+ role: "combobox",
194
+ value: inputText
195
+ }),
196
+ placeholder !== void 0 ? /* @__PURE__ */ jsx("label", {
197
+ className: "chayns-combo-box__label",
198
+ htmlFor: inputId,
199
+ id: describedLabel,
200
+ children: placeholder
201
+ }) : null,
202
+ open ? /* @__PURE__ */ jsx("div", {
203
+ "aria-multiselectable": multiple || void 0,
204
+ className: "chayns-combo-box__popup",
205
+ id: listboxId,
206
+ role: "listbox",
207
+ children
208
+ }) : null
209
+ ]
210
+ })
211
+ });
212
+ });
213
+ var ComboBox = Object.assign(ComboBoxRoot, { Option });
214
+ //#endregion
215
+ export { ComboBox as default };
216
+
217
+ //# sourceMappingURL=ComboBox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ComboBox.js","names":[],"sources":["../../../src/components/combo-box/ComboBox.tsx"],"sourcesContent":["import {\n Children,\n forwardRef,\n Fragment,\n isValidElement,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { ChangeEvent, FocusEvent, KeyboardEvent, ReactElement, ReactNode } from 'react';\n\nimport { ComboBoxContext, getOptionLabel, useComboBoxContext } from './ComboBoxContext.js';\nimport type { ComboBoxOptionProps, ComboBoxProps } from './ComboBox.types.js';\n\nfunction getOptionElements(children: ComboBoxProps['children']) {\n const options: ReactElement<ComboBoxOptionProps>[] = [];\n\n Children.forEach(children, (child) => {\n if (!isValidElement(child)) {\n return;\n }\n\n const element = child as ReactElement<{ children?: ReactNode; value?: string }>;\n\n if (element.type === Fragment) {\n options.push(...getOptionElements(element.props.children));\n } else if (typeof element.props.value === 'string') {\n options.push(element as ReactElement<ComboBoxOptionProps>);\n }\n });\n\n return options;\n}\n\nconst Option = forwardRef<HTMLDivElement, ComboBoxOptionProps>(function Option(\n { children, className, value, ...optionProps },\n ref,\n) {\n const comboBox = useComboBoxContext();\n const isVisible = comboBox.visibleValues.includes(value);\n const isSelected = comboBox.isSelected(value);\n const resolvedClassName = [\n 'chayns-combo-box__option',\n isSelected ? 'chayns-combo-box__option--selected' : '',\n comboBox.activeValue === value ? 'chayns-combo-box__option--active' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n if (!isVisible) {\n return null;\n }\n\n return (\n <div\n {...optionProps}\n aria-selected={isSelected}\n className={resolvedClassName}\n id={comboBox.optionId(value)}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => comboBox.select(value)}\n ref={ref}\n role=\"option\"\n >\n {comboBox.multiple ? (\n <span\n aria-hidden=\"true\"\n className=\"chayns-combo-box__checkbox\"\n data-checked={isSelected || undefined}\n />\n ) : null}\n {children}\n </div>\n );\n});\n\nconst ComboBoxRoot = forwardRef<HTMLInputElement, ComboBoxProps>(function ComboBoxRoot(props, ref) {\n const {\n 'aria-label': ariaLabel,\n children,\n className,\n defaultValue,\n disabled,\n id,\n multiple = false,\n onValueChange,\n openOnFocus = true,\n placeholder,\n value,\n ...inputProps\n } = props;\n const generatedId = useId();\n const inputId = id ?? generatedId;\n const listboxId = `${inputId}-listbox`;\n const rootRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const optionElements = useMemo(() => getOptionElements(children), [children]);\n const optionMap = useMemo(\n () => new Map(optionElements.map((option) => [option.props.value, option])),\n [optionElements],\n );\n const defaultValues = multiple\n ? ((defaultValue as ReactElement<ComboBoxOptionProps>[] | undefined)?.map(\n (option) => option.props.value,\n ) ?? [])\n : [];\n const controlledValues = multiple\n ? ((value as ReactElement<ComboBoxOptionProps>[] | undefined)?.map(\n (option) => option.props.value,\n ) ?? [])\n : [];\n const [uncontrolledValue, setUncontrolledValue] = useState(\n multiple ? '' : ((defaultValue as string | undefined) ?? ''),\n );\n const [uncontrolledValues, setUncontrolledValues] = useState(defaultValues);\n const [inputText, setInputText] = useState(\n multiple ? '' : ((defaultValue as string | undefined) ?? ''),\n );\n const [open, setOpen] = useState(false);\n const [activeValue, setActiveValue] = useState<string>();\n const isControlled = value !== undefined;\n const selectedValue = multiple ? '' : isControlled ? (value as string) : uncontrolledValue;\n const selectedValues = multiple ? (isControlled ? controlledValues : uncontrolledValues) : [];\n const normalizedFilter = inputText.trim().toLocaleLowerCase();\n const visibleValues = optionElements\n .filter((option) => {\n const label = getOptionLabel(option.props.children).toLocaleLowerCase();\n return normalizedFilter === '' || label.includes(normalizedFilter);\n })\n .map((option) => option.props.value);\n\n useEffect(() => {\n if (open && activeValue === undefined) {\n setActiveValue(visibleValues[0]);\n }\n }, [activeValue, open, visibleValues]);\n\n useEffect(() => {\n if (!open) {\n return undefined;\n }\n\n function closeOnOutsidePress(event: PointerEvent) {\n if (event.target instanceof Node && !rootRef.current?.contains(event.target)) {\n commitInput();\n setOpen(false);\n }\n }\n\n document.addEventListener('pointerdown', closeOnOutsidePress);\n return () => document.removeEventListener('pointerdown', closeOnOutsidePress);\n });\n\n function setInputElement(element: HTMLInputElement | null) {\n inputRef.current = element;\n\n if (typeof ref === 'function') {\n ref(element);\n } else if (ref !== null) {\n ref.current = element;\n }\n }\n\n function emitValue(nextValue: string) {\n if (!isControlled) {\n setUncontrolledValue(nextValue);\n }\n\n (onValueChange as ((next: string) => void) | undefined)?.(nextValue);\n }\n\n function emitValues(nextValues: string[]) {\n if (!isControlled) {\n setUncontrolledValues(nextValues);\n }\n\n const nextOptions = nextValues\n .map((nextValue) => optionMap.get(nextValue))\n .filter((option): option is ReactElement<ComboBoxOptionProps> => option !== undefined);\n (onValueChange as ((next: ReactElement<ComboBoxOptionProps>[]) => void) | undefined)?.(\n nextOptions,\n );\n }\n\n function commitInput() {\n if (!multiple && inputText !== selectedValue) {\n emitValue(inputText);\n }\n }\n\n function select(nextValue: string) {\n if (multiple) {\n const nextValues = selectedValues.includes(nextValue)\n ? selectedValues.filter((selected) => selected !== nextValue)\n : [...selectedValues, nextValue];\n emitValues(nextValues);\n setInputText('');\n setActiveValue(undefined);\n setOpen(true);\n return;\n }\n\n const option = optionMap.get(nextValue);\n emitValue(nextValue);\n setInputText(option === undefined ? nextValue : getOptionLabel(option.props.children));\n setActiveValue(undefined);\n setOpen(false);\n }\n\n function handleChange(event: ChangeEvent<HTMLInputElement>) {\n setInputText(event.target.value);\n setActiveValue(undefined);\n setOpen(true);\n props.onChange?.(event);\n }\n\n function handleBlur(event: FocusEvent<HTMLInputElement>) {\n props.onBlur?.(event);\n if (!rootRef.current?.contains(event.relatedTarget)) {\n commitInput();\n setOpen(false);\n }\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLInputElement>) {\n const currentIndex = activeValue === undefined ? -1 : visibleValues.indexOf(activeValue);\n let nextIndex = currentIndex;\n\n if (event.key === 'ArrowDown') nextIndex = Math.min(currentIndex + 1, visibleValues.length - 1);\n if (event.key === 'ArrowUp') nextIndex = Math.max(currentIndex - 1, 0);\n if (event.key === 'Home') nextIndex = 0;\n if (event.key === 'End') nextIndex = visibleValues.length - 1;\n\n if (nextIndex !== currentIndex && visibleValues[nextIndex] !== undefined) {\n event.preventDefault();\n setActiveValue(visibleValues[nextIndex]);\n setOpen(true);\n } else if (event.key === 'Enter' && activeValue !== undefined) {\n event.preventDefault();\n select(activeValue);\n } else if (event.key === 'Escape') {\n event.preventDefault();\n setInputText(multiple ? '' : selectedValue);\n setActiveValue(undefined);\n setOpen(false);\n }\n\n props.onKeyDown?.(event);\n }\n\n const resolvedClassName = ['chayns-combo-box', open ? 'chayns-combo-box--open' : '']\n .filter(Boolean)\n .join(' ');\n const describedLabel = placeholder === undefined ? undefined : `${inputId}-label`;\n const selectedOptions = selectedValues\n .map((selected) => optionMap.get(selected))\n .filter((option): option is ReactElement<ComboBoxOptionProps> => option !== undefined);\n const inputClassName = ['chayns-combo-box__input', className].filter(Boolean).join(' ');\n\n return (\n <ComboBoxContext.Provider\n value={{\n activeValue,\n close: () => setOpen(false),\n inputText,\n isSelected: (optionValue) =>\n multiple ? selectedValues.includes(optionValue) : selectedValue === optionValue,\n multiple,\n optionId: (optionValue) => `${listboxId}-${optionValue.replace(/[^a-zA-Z0-9_-]/g, '-')}`,\n select,\n visibleValues,\n }}\n >\n <div className={resolvedClassName} ref={rootRef}>\n {multiple ? (\n <div className=\"chayns-combo-box__chips\" aria-hidden=\"true\">\n {selectedOptions.map((option) => (\n <span className=\"chayns-combo-box__chip\" key={option.props.value}>\n {option.props.children}\n </span>\n ))}\n </div>\n ) : null}\n <input\n {...inputProps}\n aria-activedescendant={\n open && activeValue\n ? `${listboxId}-${activeValue.replace(/[^a-zA-Z0-9_-]/g, '-')}`\n : undefined\n }\n aria-autocomplete=\"list\"\n aria-controls={listboxId}\n aria-expanded={open}\n aria-label={ariaLabel}\n className={inputClassName}\n disabled={disabled}\n id={inputId}\n onBlur={handleBlur}\n onChange={handleChange}\n onFocus={() => openOnFocus && setOpen(true)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder === undefined ? undefined : ' '}\n ref={setInputElement}\n role=\"combobox\"\n value={inputText}\n />\n {placeholder !== undefined ? (\n <label className=\"chayns-combo-box__label\" htmlFor={inputId} id={describedLabel}>\n {placeholder}\n </label>\n ) : null}\n {open ? (\n <div\n aria-multiselectable={multiple || undefined}\n className=\"chayns-combo-box__popup\"\n id={listboxId}\n role=\"listbox\"\n >\n {children}\n </div>\n ) : null}\n </div>\n </ComboBoxContext.Provider>\n );\n});\n\nconst ComboBox = Object.assign(ComboBoxRoot, { Option });\n\nexport default ComboBox;\n"],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { ComponentPropsWithRef, ReactElement, ReactNode } from 'react';
2
+ export interface ComboBoxOptionProps extends Omit<ComponentPropsWithRef<'div'>, 'children' | 'role' | 'aria-selected'> {
3
+ value: string;
4
+ children: Exclude<ReactNode, boolean | null | undefined>;
5
+ role?: never;
6
+ 'aria-selected'?: never;
7
+ }
8
+ type ComboBoxBaseProps = Omit<ComponentPropsWithRef<'input'>, 'children' | 'defaultValue' | 'value' | 'multiple' | 'role' | 'aria-activedescendant' | 'aria-controls' | 'aria-expanded' | 'aria-autocomplete' | 'onBlur' | 'onChange' | 'onKeyDown'> & {
9
+ children: ReactNode;
10
+ /** Bodywork floating label. */
11
+ placeholder?: string;
12
+ /** Opens the popup when the input receives focus. */
13
+ openOnFocus?: boolean;
14
+ onBlur?: ComponentPropsWithRef<'input'>['onBlur'];
15
+ onChange?: ComponentPropsWithRef<'input'>['onChange'];
16
+ onKeyDown?: ComponentPropsWithRef<'input'>['onKeyDown'];
17
+ };
18
+ export interface ComboBoxSingleProps extends ComboBoxBaseProps {
19
+ multiple?: false;
20
+ value?: string;
21
+ defaultValue?: string;
22
+ onValueChange?: (value: string) => void;
23
+ }
24
+ export interface ComboBoxMultipleProps extends ComboBoxBaseProps {
25
+ multiple: true;
26
+ value?: ReactElement<ComboBoxOptionProps>[];
27
+ defaultValue?: ReactElement<ComboBoxOptionProps>[];
28
+ onValueChange?: (value: ReactElement<ComboBoxOptionProps>[]) => void;
29
+ }
30
+ export type ComboBoxProps = ComboBoxSingleProps | ComboBoxMultipleProps;
31
+ export {};
32
+ //# sourceMappingURL=ComboBox.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ComboBox.types.d.ts","sourceRoot":"","sources":["../../../src/components/combo-box/ComboBox.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE5E,MAAM,WAAW,mBAAoB,SAAQ,IAAI,CAC/C,qBAAqB,CAAC,KAAK,CAAC,EAC5B,UAAU,GAAG,MAAM,GAAG,eAAe,CACtC;IACC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IACzD,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,eAAe,CAAC,EAAE,KAAK,CAAC;CACzB;AAED,KAAK,iBAAiB,GAAG,IAAI,CAC3B,qBAAqB,CAAC,OAAO,CAAC,EAC5B,UAAU,GACV,cAAc,GACd,OAAO,GACP,UAAU,GACV,MAAM,GACN,uBAAuB,GACvB,eAAe,GACf,eAAe,GACf,mBAAmB,GACnB,QAAQ,GACR,UAAU,GACV,WAAW,CACd,GAAG;IACF,QAAQ,EAAE,SAAS,CAAC;IACpB,+BAA+B;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,qBAAqB,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC;IAClD,QAAQ,CAAC,EAAE,qBAAqB,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC;IACtD,SAAS,CAAC,EAAE,qBAAqB,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC;CACzD,CAAC;AAEF,MAAM,WAAW,mBAAoB,SAAQ,iBAAiB;IAC5D,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED,MAAM,WAAW,qBAAsB,SAAQ,iBAAiB;IAC9D,QAAQ,EAAE,IAAI,CAAC;IACf,KAAK,CAAC,EAAE,YAAY,CAAC,mBAAmB,CAAC,EAAE,CAAC;IAC5C,YAAY,CAAC,EAAE,YAAY,CAAC,mBAAmB,CAAC,EAAE,CAAC;IACnD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC,mBAAmB,CAAC,EAAE,KAAK,IAAI,CAAC;CACtE;AAED,MAAM,MAAM,aAAa,GAAG,mBAAmB,GAAG,qBAAqB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { ComboBoxOptionProps } from './ComboBox.types.js';
2
+ export interface ComboBoxContextValue {
3
+ activeValue?: string | undefined;
4
+ close: () => void;
5
+ inputText: string;
6
+ isSelected: (value: string) => boolean;
7
+ multiple: boolean;
8
+ optionId: (value: string) => string;
9
+ select: (value: string) => void;
10
+ visibleValues: string[];
11
+ }
12
+ export declare const ComboBoxContext: import("react").Context<ComboBoxContextValue | null>;
13
+ export declare function useComboBoxContext(): ComboBoxContextValue;
14
+ export declare function getOptionLabel(option: ComboBoxOptionProps['children']): string;
15
+ //# sourceMappingURL=ComboBoxContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ComboBoxContext.d.ts","sourceRoot":"","sources":["../../../src/components/combo-box/ComboBoxContext.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IACvC,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,eAAO,MAAM,eAAe,sDAAmD,CAAC;AAEhF,wBAAgB,kBAAkB,IAAI,oBAAoB,CAQzD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,mBAAmB,CAAC,UAAU,CAAC,GAAG,MAAM,CAM9E"}
@@ -0,0 +1,16 @@
1
+ import { createContext, useContext } from "react";
2
+ //#region src/components/combo-box/ComboBoxContext.ts
3
+ var ComboBoxContext = createContext(null);
4
+ function useComboBoxContext() {
5
+ const context = useContext(ComboBoxContext);
6
+ if (context === null) throw new Error("ComboBox.Option must be rendered within ComboBox.");
7
+ return context;
8
+ }
9
+ function getOptionLabel(option) {
10
+ if (typeof option === "string" || typeof option === "number") return String(option);
11
+ return "";
12
+ }
13
+ //#endregion
14
+ export { ComboBoxContext, getOptionLabel, useComboBoxContext };
15
+
16
+ //# sourceMappingURL=ComboBoxContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ComboBoxContext.js","names":[],"sources":["../../../src/components/combo-box/ComboBoxContext.ts"],"sourcesContent":["import { createContext, useContext } from 'react';\n\nimport type { ComboBoxOptionProps } from './ComboBox.types.js';\n\nexport interface ComboBoxContextValue {\n activeValue?: string | undefined;\n close: () => void;\n inputText: string;\n isSelected: (value: string) => boolean;\n multiple: boolean;\n optionId: (value: string) => string;\n select: (value: string) => void;\n visibleValues: string[];\n}\n\nexport const ComboBoxContext = createContext<ComboBoxContextValue | null>(null);\n\nexport function useComboBoxContext(): ComboBoxContextValue {\n const context = useContext(ComboBoxContext);\n\n if (context === null) {\n throw new Error('ComboBox.Option must be rendered within ComboBox.');\n }\n\n return context;\n}\n\nexport function getOptionLabel(option: ComboBoxOptionProps['children']): string {\n if (typeof option === 'string' || typeof option === 'number') {\n return String(option);\n }\n\n return '';\n}\n"],"mappings":";;AAeA,IAAa,kBAAkB,cAA2C,IAAI;AAE9E,SAAgB,qBAA2C;CACzD,MAAM,UAAU,WAAW,eAAe;CAE1C,IAAI,YAAY,MACd,MAAM,IAAI,MAAM,mDAAmD;CAGrE,OAAO;AACT;AAEA,SAAgB,eAAe,QAAiD;CAC9E,IAAI,OAAO,WAAW,YAAY,OAAO,WAAW,UAClD,OAAO,OAAO,MAAM;CAGtB,OAAO;AACT"}
@@ -1,5 +1,6 @@
1
1
  import type { ComponentPropsWithRef } from 'react';
2
2
  import type { ButtonContent, ButtonIcon, ButtonVariant } from '../button/Button.types.js';
3
+ export { BUTTON_VARIANTS } from '../button/Button.types.js';
3
4
  import type { PopupListItem } from '../popup/Popup.types.js';
4
5
  export interface SplitButtonProps extends Omit<ComponentPropsWithRef<'div'>, 'children' | 'onClick'> {
5
6
  variant: ButtonVariant;
@@ -1 +1 @@
1
- {"version":3,"file":"SplitButton.types.d.ts","sourceRoot":"","sources":["../../../src/components/split-button/SplitButton.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,OAAO,CAAC;AAEnD,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE7D,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAC5C,qBAAqB,CAAC,KAAK,CAAC,EAC5B,UAAU,GAAG,SAAS,CACvB;IACC,OAAO,EAAE,aAAa,CAAC;IACvB,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,OAAO,CAAC,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC;IACrD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB"}
1
+ {"version":3,"file":"SplitButton.types.d.ts","sourceRoot":"","sources":["../../../src/components/split-button/SplitButton.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,OAAO,CAAC;AAEnD,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE7D,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAC5C,qBAAqB,CAAC,KAAK,CAAC,EAC5B,UAAU,GAAG,SAAS,CACvB;IACC,OAAO,EAAE,aAAa,CAAC;IACvB,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,OAAO,CAAC,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC;IACrD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB"}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,13 @@
1
1
  export { default as Button } from './components/button/Button.js';
2
2
  export { default as IconButton } from './components/icon-button/IconButton.js';
3
3
  export type { ButtonContent, ButtonIcon, ButtonProps, ButtonVariant, } from './components/button/Button.types.js';
4
+ export { BUTTON_VARIANTS } from './components/button/Button.types.js';
4
5
  export type { IconButtonProps } from './components/icon-button/IconButton.types.js';
6
+ export { default as Badge } from './components/badge/Badge.js';
7
+ export { BADGE_SIZES, BADGE_TONES } from './components/badge/Badge.types.js';
8
+ export type { BadgeProps, BadgeSize, BadgeTone } from './components/badge/Badge.types.js';
9
+ export { default as ComboBox } from './components/combo-box/ComboBox.js';
10
+ export type { ComboBoxMultipleProps, ComboBoxOptionProps, ComboBoxProps, ComboBoxSingleProps, } from './components/combo-box/ComboBox.types.js';
5
11
  export { default as TextField } from './components/text-field/TextField.js';
6
12
  export type { TextFieldProps } from './components/text-field/TextField.types.js';
7
13
  export { default as TextArea } from './components/text-area/TextArea.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAC/E,YAAY,EACV,aAAa,EACb,UAAU,EACV,WAAW,EACX,aAAa,GACd,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EAAE,eAAe,EAAE,MAAM,8CAA8C,CAAC;AAEpF,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,sCAAsC,CAAC;AAC5E,YAAY,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAEjF,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AACzE,YAAY,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AAE9E,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AACxE,YAAY,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAE7E,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAClE,YAAY,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAEvE,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAC/E,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAC;AAEhG,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,oDAAoD,CAAC;AACjG,YAAY,EACV,qBAAqB,EACrB,YAAY,GACb,MAAM,0DAA0D,CAAC;AAElE,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAC/E,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,8CAA8C,CAAC;AAEpG,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,iCAAiC,CAAC;AACvE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAEnG,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,0CAA0C,CAAC;AAClF,YAAY,EAAE,gBAAgB,EAAE,MAAM,gDAAgD,CAAC;AAEvF,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,2BAA2B,CAAC;AAC5D,YAAY,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAEjE,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,0CAA0C,CAAC;AAClF,YAAY,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AACvE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gDAAgD,CAAC;AAEvF,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,2BAA2B,CAAC;AAC5D,YAAY,EACV,mBAAmB,EACnB,iBAAiB,EACjB,aAAa,EACb,mBAAmB,EACnB,SAAS,GACV,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,gDAAgD,CAAC;AAC3F,YAAY,EACV,cAAc,EACd,mBAAmB,GACpB,MAAM,2CAA2C,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,5 +1,9 @@
1
1
  import Button from "./components/button/Button.js";
2
2
  import IconButton from "./components/icon-button/IconButton.js";
3
+ import { BUTTON_VARIANTS } from "./components/button/Button.types.js";
4
+ import Badge from "./components/badge/Badge.js";
5
+ import { BADGE_SIZES, BADGE_TONES } from "./components/badge/Badge.types.js";
6
+ import ComboBox from "./components/combo-box/ComboBox.js";
3
7
  import TextField from "./components/text-field/TextField.js";
4
8
  import TextArea from "./components/text-area/TextArea.js";
5
9
  import Checkbox from "./components/checkbox/Checkbox.js";
@@ -16,4 +20,4 @@ import AvatarGroup from "./components/avatar-group/AvatarGroup.js";
16
20
  import List from "./components/list/List.js";
17
21
  import Accordion from "./components/accordion/Accordion.js";
18
22
  import AccordionGroup from "./components/accordion-group/AccordionGroup.js";
19
- export { Accordion, AccordionGroup, Avatar, AvatarGroup, Button, Card, Checkbox, IconButton, List, MessageBox, Popup_default as Popup, PopupList, RadioGroup, SegmentedControl, SplitButton, Switch, TextArea, TextField };
23
+ export { Accordion, AccordionGroup, Avatar, AvatarGroup, BADGE_SIZES, BADGE_TONES, BUTTON_VARIANTS, Badge, Button, Card, Checkbox, ComboBox, IconButton, List, MessageBox, Popup_default as Popup, PopupList, RadioGroup, SegmentedControl, SplitButton, Switch, TextArea, TextField };
package/dist/list.css CHANGED
@@ -58,16 +58,16 @@
58
58
  }
59
59
 
60
60
  .chayns-list-item__title {
61
- overflow: hidden;
62
61
  color: var(--text);
62
+ overflow: hidden;
63
63
  text-overflow: ellipsis;
64
64
  white-space: nowrap;
65
65
  }
66
66
 
67
67
  .chayns-list-item__description {
68
- overflow: hidden;
69
68
  color: var(--text-3);
70
69
  font-size: var(--fs-meta);
70
+ overflow: hidden;
71
71
  text-overflow: ellipsis;
72
72
  white-space: nowrap;
73
73
  }
package/dist/styles.css CHANGED
@@ -1,4 +1,6 @@
1
1
  @import url('./button.css');
2
+ @import url('./badge.css');
3
+ @import url('./combo-box.css');
2
4
  @import url('./card.css');
3
5
  @import url('./avatar.css');
4
6
  @import url('./list.css');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chayns-ui/core",
3
- "version": "0.4.2",
3
+ "version": "0.5.0",
4
4
  "description": "Accessible React core components for chayns UI",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -23,6 +23,8 @@
23
23
  "import": "./dist/index.js"
24
24
  },
25
25
  "./button.css": "./dist/button.css",
26
+ "./badge.css": "./dist/badge.css",
27
+ "./combo-box.css": "./dist/combo-box.css",
26
28
  "./card.css": "./dist/card.css",
27
29
  "./avatar.css": "./dist/avatar.css",
28
30
  "./list.css": "./dist/list.css",