@pixum/combobox 5.10.4-alpha.9 → 5.10.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/ComboBox.d.ts +6 -32
- package/lib/ComboBox.js +77 -217
- package/lib/ComboBox.js.map +1 -1
- package/lib/hooks/index.d.ts +0 -2
- package/lib/hooks/index.js +0 -2
- package/lib/hooks/index.js.map +1 -1
- package/lib/hooks/useIsDesktopScreenWidth.d.ts +0 -5
- package/lib/hooks/useIsDesktopScreenWidth.js +24 -34
- package/lib/hooks/useIsDesktopScreenWidth.js.map +1 -1
- package/lib/index.d.ts +4 -4
- package/lib/index.js +3 -2
- package/lib/index.js.map +1 -1
- package/lib/partials/ComboBoxOptions.d.ts +5 -16
- package/lib/partials/ComboBoxOptions.js +21 -25
- package/lib/partials/ComboBoxOptions.js.map +1 -1
- package/lib/partials/ComboBoxOptionsItems.d.ts +17 -32
- package/lib/partials/ComboBoxOptionsItems.js +14 -46
- package/lib/partials/ComboBoxOptionsItems.js.map +1 -1
- package/lib/partials/ComboBoxOptionsSlot.d.ts +16 -17
- package/lib/partials/ComboBoxOptionsSlot.js +11 -26
- package/lib/partials/ComboBoxOptionsSlot.js.map +1 -1
- package/lib/partials/index.d.ts +1 -2
- package/lib/partials/index.js +1 -2
- package/lib/partials/index.js.map +1 -1
- package/lib/types.d.ts +45 -183
- package/lib/utils/index.d.ts +2 -1
- package/lib/utils/index.js +2 -1
- package/lib/utils/index.js.map +1 -1
- package/package.json +8 -8
- package/lib/ComboBox.module.css +0 -1
- package/lib/hooks/useComboBox.d.ts +0 -60
- package/lib/hooks/useComboBox.js +0 -226
- package/lib/hooks/useComboBox.js.map +0 -1
- package/lib/hooks/useComboBoxFocus.d.ts +0 -35
- package/lib/hooks/useComboBoxFocus.js +0 -49
- package/lib/hooks/useComboBoxFocus.js.map +0 -1
- package/lib/partials/ComboBoxNoResults.d.ts +0 -14
- package/lib/partials/ComboBoxNoResults.js +0 -18
- package/lib/partials/ComboBoxNoResults.js.map +0 -1
- package/lib/partials/ComboBoxOptionsGroup.d.ts +0 -15
- package/lib/partials/ComboBoxOptionsGroup.js +0 -31
- package/lib/partials/ComboBoxOptionsGroup.js.map +0 -1
- package/lib/utils/options.d.ts +0 -77
- package/lib/utils/options.js +0 -145
- package/lib/utils/options.js.map +0 -1
|
@@ -1,33 +1,29 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect } from 'react';
|
|
2
3
|
import Menu from '@pixum/menu';
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import styles from '../ComboBox.module.css';
|
|
4
|
+
import { useIsDesktopScreenWidth } from '../hooks';
|
|
5
|
+
import { scrollOptionToViewport } from '../utils';
|
|
6
|
+
import { ComboxBoxOptionsWithGrouping } from './ComboBoxOptionsWithGrouping';
|
|
7
|
+
import { ComboBoxOptionsItems } from './ComboBoxOptionsItems';
|
|
8
8
|
/**
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* The panel is split in two: the `Menu` provides the visible box, the element
|
|
12
|
-
* inside it carries the `listbox` role and is the only part that scrolls. That
|
|
13
|
-
* keeps `optionDetails` a real footer - it stays visible without
|
|
14
|
-
* `position: sticky` and can no longer cover the active option - and it keeps
|
|
15
|
-
* the listbox free of anything that is not an option or a group, as ARIA
|
|
16
|
-
* requires.
|
|
17
|
-
*
|
|
18
|
-
* Flat and grouped options share one render path: the options arrive already
|
|
19
|
-
* normalised, `groupOptions` only splits them into their visual groups again.
|
|
20
|
-
* The listbox is not focusable - the focus stays in the input field, the active
|
|
21
|
-
* option is announced through `aria-activedescendant`.
|
|
9
|
+
* ComboBoxOptions component that renders a list of options in a menu.
|
|
10
|
+
* Handles both grouped and ungrouped options and automatically scrolls to the selected option.
|
|
22
11
|
*
|
|
23
12
|
* @param props - The props for the ComboBoxOptions component
|
|
24
|
-
* @returns
|
|
13
|
+
* @returns A menu containing the combobox options
|
|
25
14
|
*/
|
|
26
|
-
export function ComboBoxOptions({ options,
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
15
|
+
export function ComboBoxOptions({ options, onClick, selectedOption, leadingType, optionDetails, }) {
|
|
16
|
+
const isDesktop = useIsDesktopScreenWidth();
|
|
17
|
+
const optionsWithoutGroup = Array.isArray(options);
|
|
18
|
+
const optionsWithGroup = Object.entries(options);
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
// Wait for next browser frame to ensure DOM is fully rendered
|
|
21
|
+
const frameId = requestAnimationFrame(() => {
|
|
22
|
+
scrollOptionToViewport(isDesktop);
|
|
23
|
+
});
|
|
24
|
+
return () => cancelAnimationFrame(frameId);
|
|
25
|
+
}, [isDesktop, selectedOption]);
|
|
26
|
+
return (_jsxs(Menu, { className: "combobox__options scrollable", "data-tappable": "true", children: [optionsWithoutGroup ? (_jsx(ComboBoxOptionsItems, { items: options, selectedOption: selectedOption, onClick: onClick, leadingType: leadingType })) : (_jsx(_Fragment, { children: optionsWithGroup.map(([group, items]) => (_jsx(ComboxBoxOptionsWithGrouping, { group: group, items: items, selectedOption: selectedOption, onClick: onClick, leadingType: leadingType }, `combobox__options-group-${group}`))) })), optionDetails && (_jsx("div", { className: "combobox__option-details text--caption", children: optionDetails }))] }));
|
|
31
27
|
}
|
|
32
28
|
export default ComboBoxOptions;
|
|
33
29
|
//# sourceMappingURL=ComboBoxOptions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComboBoxOptions.js","sourceRoot":"","sources":["../../src/partials/ComboBoxOptions.tsx"],"names":[],"mappings":";AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"ComboBoxOptions.js","sourceRoot":"","sources":["../../src/partials/ComboBoxOptions.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACjC,OAAO,IAAI,MAAM,aAAa,CAAA;AAC9B,OAAO,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAA;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAEjD,OAAO,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAA;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAE7D;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,EAC9B,OAAO,EACP,OAAO,EACP,cAAc,EACd,WAAW,EACX,aAAa,GACQ;IACrB,MAAM,SAAS,GAAG,uBAAuB,EAAE,CAAA;IAC3C,MAAM,mBAAmB,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAClD,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAEhD,SAAS,CAAC,GAAG,EAAE;QACb,8DAA8D;QAC9D,MAAM,OAAO,GAAG,qBAAqB,CAAC,GAAG,EAAE;YACzC,sBAAsB,CAAC,SAAS,CAAC,CAAA;QACnC,CAAC,CAAC,CAAA;QAEF,OAAO,GAAG,EAAE,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAA;IAC5C,CAAC,EAAE,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAA;IAE/B,OAAO,CACL,MAAC,IAAI,IAAC,SAAS,EAAC,8BAA8B,mBAAe,MAAM,aAChE,mBAAmB,CAAC,CAAC,CAAC,CACrB,KAAC,oBAAoB,IACnB,KAAK,EAAE,OAAO,EACd,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,WAAW,GACxB,CACH,CAAC,CAAC,CAAC,CACF,4BACG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CACxC,KAAC,4BAA4B,IAE3B,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,KAAK,EACZ,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,WAAW,IALnB,2BAA2B,KAAK,EAAE,CAMvC,CACH,CAAC,GACD,CACJ,EACA,aAAa,IAAI,CAChB,cAAK,SAAS,EAAC,wCAAwC,YACpD,aAAa,GACV,CACP,IACI,CACR,CAAA;AACH,CAAC;AAED,eAAe,eAAe,CAAA"}
|
|
@@ -1,39 +1,24 @@
|
|
|
1
1
|
import { LeadingType } from '@pixum/menu-item';
|
|
2
|
-
import type {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
2
|
+
import type { ComboBoxOptionItemProps } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Props for the ComboBoxOptionsItems component
|
|
5
|
+
*/
|
|
6
|
+
interface ComboBoxOptionsItemsProps {
|
|
7
|
+
/** Array of option items to display */
|
|
8
|
+
items: ComboBoxOptionItemProps[];
|
|
9
|
+
/** Currently selected option value */
|
|
10
|
+
selectedOption?: string;
|
|
11
|
+
/** Callback fired when an option is clicked */
|
|
12
|
+
onClick?: (value: string) => void;
|
|
13
|
+
/** Type of leading element to display (icon, avatar, etc.) */
|
|
11
14
|
leadingType?: LeadingType;
|
|
12
|
-
/** Called with the value of the clicked option. */
|
|
13
|
-
onOptionClick: (value: string) => void;
|
|
14
15
|
}
|
|
15
16
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* The options are deliberately not focusable: the focus stays in the input
|
|
19
|
-
* field and the highlight is driven by `aria-activedescendant`. Checkbox
|
|
20
|
-
* options are ordinary options with `aria-selected` - inside a listbox that is
|
|
21
|
-
* the state screen readers announce, and it keeps mouse and keyboard selection
|
|
22
|
-
* on exactly the same code path.
|
|
23
|
-
*
|
|
24
|
-
* An option is a `MenuItemProps` object, so everything except the ComboBox
|
|
25
|
-
* specific `key` and `disabled` is spread onto the `MenuItem` unchanged.
|
|
26
|
-
* Consumers that pass further MenuItem props keep working without the ComboBox
|
|
27
|
-
* having to know about them; only `selected`, `tabIndex` and the keyboard
|
|
28
|
-
* handling are owned by the ComboBox and therefore not overridable.
|
|
29
|
-
*
|
|
30
|
-
* Styling hooks: every option carries its state as a data attribute
|
|
31
|
-
* (`data-selected`, `data-active`, `data-disabled`), so consumers can style
|
|
32
|
-
* options without knowing the hashed module class names. The selection state is
|
|
33
|
-
* left to `MenuItem` itself - the component does not add a `selected` class of
|
|
34
|
-
* its own, which would be impossible to override from the outside.
|
|
17
|
+
* ComboBoxOptionsItems component that renders individual menu items.
|
|
18
|
+
* Handles click events and displays selected state for each option.
|
|
35
19
|
*
|
|
36
20
|
* @param props - The props for the ComboBoxOptionsItems component
|
|
37
|
-
* @returns A list of
|
|
21
|
+
* @returns A list of clickable menu items
|
|
38
22
|
*/
|
|
39
|
-
export declare function ComboBoxOptionsItems({
|
|
23
|
+
export declare function ComboBoxOptionsItems({ items, selectedOption, onClick, leadingType, }: ComboBoxOptionsItemsProps): import("react/jsx-runtime").JSX.Element;
|
|
24
|
+
export {};
|
|
@@ -1,56 +1,24 @@
|
|
|
1
1
|
import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import MenuItem
|
|
2
|
+
import MenuItem from '@pixum/menu-item';
|
|
3
3
|
import clsx from 'clsx';
|
|
4
|
-
import { toMenuItemProps } from '../utils';
|
|
5
|
-
import styles from '../ComboBox.module.css';
|
|
6
4
|
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* The options are deliberately not focusable: the focus stays in the input
|
|
10
|
-
* field and the highlight is driven by `aria-activedescendant`. Checkbox
|
|
11
|
-
* options are ordinary options with `aria-selected` - inside a listbox that is
|
|
12
|
-
* the state screen readers announce, and it keeps mouse and keyboard selection
|
|
13
|
-
* on exactly the same code path.
|
|
14
|
-
*
|
|
15
|
-
* An option is a `MenuItemProps` object, so everything except the ComboBox
|
|
16
|
-
* specific `key` and `disabled` is spread onto the `MenuItem` unchanged.
|
|
17
|
-
* Consumers that pass further MenuItem props keep working without the ComboBox
|
|
18
|
-
* having to know about them; only `selected`, `tabIndex` and the keyboard
|
|
19
|
-
* handling are owned by the ComboBox and therefore not overridable.
|
|
20
|
-
*
|
|
21
|
-
* Styling hooks: every option carries its state as a data attribute
|
|
22
|
-
* (`data-selected`, `data-active`, `data-disabled`), so consumers can style
|
|
23
|
-
* options without knowing the hashed module class names. The selection state is
|
|
24
|
-
* left to `MenuItem` itself - the component does not add a `selected` class of
|
|
25
|
-
* its own, which would be impossible to override from the outside.
|
|
5
|
+
* ComboBoxOptionsItems component that renders individual menu items.
|
|
6
|
+
* Handles click events and displays selected state for each option.
|
|
26
7
|
*
|
|
27
8
|
* @param props - The props for the ComboBoxOptionsItems component
|
|
28
|
-
* @returns A list of
|
|
9
|
+
* @returns A list of clickable menu items
|
|
29
10
|
*/
|
|
30
|
-
export function ComboBoxOptionsItems({
|
|
31
|
-
|
|
32
|
-
return (_jsx(_Fragment, { children: options.map(({ item, id, value, disabled }) => {
|
|
11
|
+
export function ComboBoxOptionsItems({ items, selectedOption, onClick, leadingType, }) {
|
|
12
|
+
return (_jsx(_Fragment, { children: items.map((item) => {
|
|
33
13
|
var _a;
|
|
34
|
-
const
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}, onPointerDown: event => event.stopPropagation(),
|
|
43
|
-
// No preventDefault on touchstart, scrolling in the sheet must work.
|
|
44
|
-
onTouchStart: event => event.stopPropagation(), onClickCapture: event => {
|
|
45
|
-
event.stopPropagation();
|
|
46
|
-
if (disabled)
|
|
47
|
-
return;
|
|
48
|
-
onOptionClick(value);
|
|
49
|
-
}, children: _jsx(MenuItem, Object.assign({}, menuItemProps, { tabIndex: -1, disableKeyboardNav: true,
|
|
50
|
-
// A leading type set on the ComboBox wins over the option's own
|
|
51
|
-
// one: it is what makes multi select look like a checkbox list.
|
|
52
|
-
leadingProps: leadingType
|
|
53
|
-
? Object.assign(Object.assign({}, menuItemProps.leadingProps), { name: value, type: leadingType }) : menuItemProps.leadingProps, selected: isSelected })) }, (_a = item.key) !== null && _a !== void 0 ? _a : `combobox-item-wrapper-${id}`));
|
|
14
|
+
const itemText = item.text;
|
|
15
|
+
const isSelected = selectedOption === itemText;
|
|
16
|
+
return (_jsx("div", { className: "combobox__option-wrapper", role: "button", tabIndex: 0, onPointerDown: e => e.stopPropagation(), onTouchStart: e => e.stopPropagation(), onMouseDown: e => e.stopPropagation(), onClickCapture: e => {
|
|
17
|
+
e.stopPropagation();
|
|
18
|
+
onClick === null || onClick === void 0 ? void 0 : onClick(itemText);
|
|
19
|
+
}, children: _jsx(MenuItem, { tabIndex: -1, className: clsx(isSelected && 'selected'), onMouseEnter: item.onMouseEnter, leadingProps: leadingType ? { name: itemText, type: leadingType } : undefined, selected: selectedOption === itemText, text: itemText, subtext: item.subtext, subItemProps: {
|
|
20
|
+
text: (_a = item.subItemProps) === null || _a === void 0 ? void 0 : _a.text,
|
|
21
|
+
} }) }, `combobox-item-wrapper-${itemText}`));
|
|
54
22
|
}) }));
|
|
55
23
|
}
|
|
56
24
|
//# sourceMappingURL=ComboBoxOptionsItems.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComboBoxOptionsItems.js","sourceRoot":"","sources":["../../src/partials/ComboBoxOptionsItems.tsx"],"names":[],"mappings":";AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"ComboBoxOptionsItems.js","sourceRoot":"","sources":["../../src/partials/ComboBoxOptionsItems.tsx"],"names":[],"mappings":";AAAA,OAAO,QAAyB,MAAM,kBAAkB,CAAA;AACxD,OAAO,IAAI,MAAM,MAAM,CAAA;AAiBvB;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,EACnC,KAAK,EACL,cAAc,EACd,OAAO,EACP,WAAW,GACe;IAC1B,OAAO,CACL,4BACG,KAAK,CAAC,GAAG,CAAC,CAAC,IAA6B,EAAE,EAAE;;YAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAA;YAC1B,MAAM,UAAU,GAAG,cAAc,KAAK,QAAQ,CAAA;YAE9C,OAAO,CACL,cAEE,SAAS,EAAC,0BAA0B,EACpC,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,CAAC,EACX,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,EACvC,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,EACtC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,EACrC,cAAc,EAAE,CAAC,CAAC,EAAE;oBAClB,CAAC,CAAC,eAAe,EAAE,CAAA;oBACnB,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAG,QAAQ,CAAC,CAAA;gBACrB,CAAC,YAED,KAAC,QAAQ,IACP,QAAQ,EAAE,CAAC,CAAC,EACZ,SAAS,EAAE,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,EACzC,YAAY,EAAE,IAAI,CAAC,YAAY,EAC/B,YAAY,EACV,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,EAEjE,QAAQ,EAAE,cAAc,KAAK,QAAQ,EACrC,IAAI,EAAE,QAAQ,EACd,OAAO,EAAE,IAAI,CAAC,OAAO,EACrB,YAAY,EAAE;wBACZ,IAAI,EAAE,MAAA,IAAI,CAAC,YAAY,0CAAE,IAAI;qBAC9B,GACD,IAzBG,yBAAyB,QAAQ,EAAE,CA0BpC,CACP,CAAA;QACH,CAAC,CAAC,GACD,CACJ,CAAA;AACH,CAAC"}
|
|
@@ -1,35 +1,34 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import '../styles.css';
|
|
3
|
+
export interface ComboBoxOptionsSlotProps {
|
|
4
|
+
/** The content to render inside the options slot */
|
|
4
5
|
children: ReactNode;
|
|
5
|
-
|
|
6
|
-
|
|
6
|
+
className?: string;
|
|
7
|
+
role?: string;
|
|
8
|
+
tag?: 'div' | 'ul' | 'ol' | 'dl';
|
|
7
9
|
}
|
|
8
10
|
/**
|
|
9
|
-
* Styled container for
|
|
11
|
+
* Styled container for optionsSlot content.
|
|
10
12
|
*
|
|
11
|
-
* Applies the standard ComboBox dropdown appearance
|
|
12
|
-
* border radius, box
|
|
13
|
-
* replicate it in every
|
|
14
|
-
* (`role`, `aria-*`, ...) is forwarded, because the slot content owns its own
|
|
15
|
-
* accessibility semantics.
|
|
13
|
+
* Applies the standard ComboBox dropdown appearance — white background,
|
|
14
|
+
* border, border-radius, box-shadow and top margin — so consumers don't
|
|
15
|
+
* have to replicate it in every optionsSlot implementation.
|
|
16
16
|
*
|
|
17
|
-
*
|
|
18
|
-
* navigation: content rendered here has to bring its own key handling.
|
|
17
|
+
* Use it as the outermost wrapper of your optionsSlot:
|
|
19
18
|
*
|
|
20
19
|
* ```tsx
|
|
21
20
|
* import ComboBox, { ComboBoxOptionsSlot } from '@pixum/combobox'
|
|
22
21
|
*
|
|
23
22
|
* <ComboBox
|
|
24
23
|
* optionsSlot={
|
|
25
|
-
* <ComboBoxOptionsSlot
|
|
24
|
+
* <ComboBoxOptionsSlot>
|
|
26
25
|
* <MyCustomOptionsList />
|
|
27
26
|
* </ComboBoxOptionsSlot>
|
|
28
27
|
* }
|
|
29
28
|
* />
|
|
30
29
|
* ```
|
|
31
30
|
*
|
|
32
|
-
* @param
|
|
33
|
-
* @returns A styled wrapper matching the ComboBox dropdown look
|
|
31
|
+
* @param children - The slot content to render inside the container
|
|
32
|
+
* @returns A styled wrapper div matching the ComboBox dropdown look
|
|
34
33
|
*/
|
|
35
|
-
export declare function ComboBoxOptionsSlot({ children, className, tag,
|
|
34
|
+
export declare function ComboBoxOptionsSlot({ children, className, role, tag, }: ComboBoxOptionsSlotProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,47 +1,32 @@
|
|
|
1
|
-
var __rest = (this && this.__rest) || function (s, e) {
|
|
2
|
-
var t = {};
|
|
3
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
4
|
-
t[p] = s[p];
|
|
5
|
-
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
6
|
-
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
7
|
-
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
8
|
-
t[p[i]] = s[p[i]];
|
|
9
|
-
}
|
|
10
|
-
return t;
|
|
11
|
-
};
|
|
12
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import '../styles.css';
|
|
13
3
|
import Menu from '@pixum/menu';
|
|
14
4
|
import clsx from 'clsx';
|
|
15
|
-
import styles from '../ComboBox.module.css';
|
|
16
5
|
/**
|
|
17
|
-
* Styled container for
|
|
6
|
+
* Styled container for optionsSlot content.
|
|
18
7
|
*
|
|
19
|
-
* Applies the standard ComboBox dropdown appearance
|
|
20
|
-
* border radius, box
|
|
21
|
-
* replicate it in every
|
|
22
|
-
* (`role`, `aria-*`, ...) is forwarded, because the slot content owns its own
|
|
23
|
-
* accessibility semantics.
|
|
8
|
+
* Applies the standard ComboBox dropdown appearance — white background,
|
|
9
|
+
* border, border-radius, box-shadow and top margin — so consumers don't
|
|
10
|
+
* have to replicate it in every optionsSlot implementation.
|
|
24
11
|
*
|
|
25
|
-
*
|
|
26
|
-
* navigation: content rendered here has to bring its own key handling.
|
|
12
|
+
* Use it as the outermost wrapper of your optionsSlot:
|
|
27
13
|
*
|
|
28
14
|
* ```tsx
|
|
29
15
|
* import ComboBox, { ComboBoxOptionsSlot } from '@pixum/combobox'
|
|
30
16
|
*
|
|
31
17
|
* <ComboBox
|
|
32
18
|
* optionsSlot={
|
|
33
|
-
* <ComboBoxOptionsSlot
|
|
19
|
+
* <ComboBoxOptionsSlot>
|
|
34
20
|
* <MyCustomOptionsList />
|
|
35
21
|
* </ComboBoxOptionsSlot>
|
|
36
22
|
* }
|
|
37
23
|
* />
|
|
38
24
|
* ```
|
|
39
25
|
*
|
|
40
|
-
* @param
|
|
41
|
-
* @returns A styled wrapper matching the ComboBox dropdown look
|
|
26
|
+
* @param children - The slot content to render inside the container
|
|
27
|
+
* @returns A styled wrapper div matching the ComboBox dropdown look
|
|
42
28
|
*/
|
|
43
|
-
export function ComboBoxOptionsSlot(
|
|
44
|
-
|
|
45
|
-
return (_jsx(Menu, Object.assign({ tag: tag, className: clsx(styles.optionsSlot, className) }, rest, { children: children })));
|
|
29
|
+
export function ComboBoxOptionsSlot({ children, className = '', role = '', tag = 'ul', }) {
|
|
30
|
+
return (_jsx(Menu, { tag: tag, className: clsx(className, 'combobox__options-slot'), role: role, children: children }));
|
|
46
31
|
}
|
|
47
32
|
//# sourceMappingURL=ComboBoxOptionsSlot.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComboBoxOptionsSlot.js","sourceRoot":"","sources":["../../src/partials/ComboBoxOptionsSlot.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ComboBoxOptionsSlot.js","sourceRoot":"","sources":["../../src/partials/ComboBoxOptionsSlot.tsx"],"names":[],"mappings":";AACA,OAAO,eAAe,CAAA;AACtB,OAAO,IAAI,MAAM,aAAa,CAAA;AAC9B,OAAO,IAAI,MAAM,MAAM,CAAA;AASvB;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAClC,QAAQ,EACR,SAAS,GAAG,EAAE,EACd,IAAI,GAAG,EAAE,EACT,GAAG,GAAG,IAAI,GACe;IACzB,OAAO,CACL,KAAC,IAAI,IACH,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,wBAAwB,CAAC,EACpD,IAAI,EAAE,IAAI,YAET,QAAQ,GACJ,CACR,CAAA;AACH,CAAC"}
|
package/lib/partials/index.d.ts
CHANGED
package/lib/partials/index.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
export * from './ComboBoxOptions';
|
|
2
|
-
export * from './
|
|
2
|
+
export * from './ComboBoxOptionsWithGrouping';
|
|
3
3
|
export * from './ComboBoxOptionsItems';
|
|
4
4
|
export * from './ComboBoxOptionsSlot';
|
|
5
|
-
export * from './ComboBoxNoResults';
|
|
6
5
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/partials/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA;AACjC,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/partials/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA;AACjC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,wBAAwB,CAAA;AACtC,cAAc,uBAAuB,CAAA"}
|
package/lib/types.d.ts
CHANGED
|
@@ -1,216 +1,78 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
1
|
+
import { LeadingType, MenuItemProps } from '@pixum/menu-item';
|
|
2
|
+
import { ThemeType } from '@pixum/theme-provider';
|
|
3
|
+
import { InputModesType } from '@pixum/web-input';
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* Everything a `MenuItem` understands is accepted and forwarded unchanged -
|
|
8
|
-
* the ComboBox only adds `key` and `disabled` on top. That keeps existing
|
|
9
|
-
* consumers working: they pass their MenuItem props as they always did, and
|
|
10
|
-
* props the ComboBox does not know about still reach the `MenuItem`.
|
|
11
|
-
*/
|
|
12
|
-
export interface ComboBoxOptionItemProps extends MenuItemProps {
|
|
13
|
-
/** Unique key for the option item */
|
|
14
|
-
key?: string;
|
|
15
|
-
/**
|
|
16
|
-
* Disabled options are rendered, but skipped by mouse and keyboard.
|
|
17
|
-
*
|
|
18
|
-
* Newly added. Consumer types that already carry a `disabled` field of a
|
|
19
|
-
* different type (e.g. `disabled: 'true' | 'false'`) are no longer
|
|
20
|
-
* assignable - widen it to `boolean` on the consumer side.
|
|
21
|
-
*/
|
|
22
|
-
disabled?: boolean;
|
|
23
|
-
}
|
|
24
|
-
/** Options are accepted either as a flat list or grouped by a group headline. */
|
|
25
|
-
export type ComboBoxOptionsInput = ComboBoxOptionItemProps[] | Record<string, ComboBoxOptionItemProps[]>;
|
|
26
|
-
/**
|
|
27
|
-
* An option after normalisation. Flat and grouped options are reduced to this
|
|
28
|
-
* shape once, so keyboard navigation, rendering and ARIA ids all work on the
|
|
29
|
-
* very same list in the very same order.
|
|
30
|
-
*/
|
|
31
|
-
export interface ComboBoxOption {
|
|
32
|
-
/** The original option as handed in by the consumer. */
|
|
33
|
-
item: ComboBoxOptionItemProps;
|
|
34
|
-
/**
|
|
35
|
-
* Stable value of the option, reported by `onOptionItemClick` and compared
|
|
36
|
-
* against `value`. Resolved by `resolveOptionValue`: the option's `text` when
|
|
37
|
-
* it is a string, otherwise `key`, otherwise the render index.
|
|
38
|
-
*/
|
|
39
|
-
value: string;
|
|
40
|
-
/** Position in render order. Drives the DOM id and the keyboard navigation. */
|
|
41
|
-
index: number;
|
|
42
|
-
/** DOM id, referenced by `aria-activedescendant`. */
|
|
43
|
-
id: string;
|
|
44
|
-
/** Group headline the option belongs to, `undefined` for flat lists. */
|
|
45
|
-
group?: string;
|
|
46
|
-
/** Whether the option can be activated. */
|
|
47
|
-
disabled: boolean;
|
|
48
|
-
}
|
|
49
|
-
/** Options of one render group, produced by `groupOptions`. */
|
|
50
|
-
export interface ComboBoxOptionGroup {
|
|
51
|
-
/** Group headline, `undefined` for flat lists. */
|
|
52
|
-
group?: string;
|
|
53
|
-
/** Options of this group, still carrying their global render index. */
|
|
54
|
-
options: ComboBoxOption[];
|
|
55
|
-
}
|
|
56
|
-
/** ARIA props for the element that owns the `combobox` role. */
|
|
57
|
-
export interface ComboBoxAriaProps {
|
|
58
|
-
role: 'combobox';
|
|
59
|
-
'aria-expanded': boolean;
|
|
60
|
-
'aria-haspopup': 'listbox';
|
|
61
|
-
'aria-controls': string | undefined;
|
|
62
|
-
'aria-activedescendant': string | undefined;
|
|
63
|
-
'aria-autocomplete': 'list' | 'none';
|
|
64
|
-
}
|
|
65
|
-
/** ARIA props for the element that owns the `listbox` role. */
|
|
66
|
-
export interface ListboxAriaProps {
|
|
67
|
-
role: 'listbox';
|
|
68
|
-
id: string;
|
|
69
|
-
/** Only set for multi select; single select listboxes omit it. */
|
|
70
|
-
'aria-multiselectable'?: boolean;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Public options contract, kept for backwards compatibility.
|
|
74
|
-
*
|
|
75
|
-
* In the previous version this interface was the base of `ComboBoxProps` and
|
|
76
|
-
* the prop type of
|
|
77
|
-
* the exported options component. It describes the options as the *consumer*
|
|
78
|
-
* hands them in - not the normalised list the internal panel renders. The
|
|
79
|
-
* internal shape now lives in `ComboBoxOptionsPanelProps`.
|
|
80
|
-
*
|
|
81
|
-
* @deprecated Use `ComboBoxProps` (or `Pick<ComboBoxProps, 'options'>`)
|
|
82
|
-
* directly. Kept so existing imports do not silently change meaning; will be
|
|
83
|
-
* removed in the next major.
|
|
5
|
+
* Props for the ComboBoxOptions component
|
|
84
6
|
*/
|
|
85
7
|
export interface ComboBoxOptionsProps {
|
|
86
|
-
/** Options to display,
|
|
87
|
-
options:
|
|
88
|
-
/**
|
|
89
|
-
* Currently selected option value.
|
|
90
|
-
*
|
|
91
|
-
* @deprecated Use `value`. When both are set, `value` wins.
|
|
92
|
-
*/
|
|
8
|
+
/** Options to display in the combobox, can be grouped or a flat array */
|
|
9
|
+
options: Record<string, ComboBoxOptionItemProps[]> | ComboBoxOptionItemProps[];
|
|
10
|
+
/** Currently selected option value */
|
|
93
11
|
selectedOption?: string;
|
|
94
|
-
/**
|
|
95
|
-
* Callback fired when an option is clicked.
|
|
96
|
-
*
|
|
97
|
-
* @deprecated Use `onOptionItemClick`. On `ComboBoxProps` this prop is
|
|
98
|
-
* narrowed to the trigger click handler `() => void`.
|
|
99
|
-
*/
|
|
12
|
+
/** Callback fired when an option is clicked */
|
|
100
13
|
onClick?: (value: string) => void;
|
|
101
|
-
/** Type of leading element to display (icon, avatar,
|
|
102
|
-
leadingType?: LeadingType;
|
|
103
|
-
/** Additional details rendered below the options. */
|
|
104
|
-
optionDetails?: React.ReactNode;
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* Props of the rendered options panel - the internal, normalised shape.
|
|
108
|
-
*
|
|
109
|
-
* This is what `ComboBoxOptions` consumes. It is exported so custom panels can
|
|
110
|
-
* be typed against it, but it is not part of the consumer-facing API and may
|
|
111
|
-
* change without a major bump.
|
|
112
|
-
*/
|
|
113
|
-
export interface ComboBoxOptionsPanelProps {
|
|
114
|
-
/** Normalised options in render order. */
|
|
115
|
-
options: ComboBoxOption[];
|
|
116
|
-
/** ARIA props of the listbox element. */
|
|
117
|
-
listboxAriaProps: ListboxAriaProps;
|
|
118
|
-
/** Values that are currently selected. */
|
|
119
|
-
selectedValues: string[];
|
|
120
|
-
/** DOM id of the active option (`aria-activedescendant`). */
|
|
121
|
-
activeOptionId?: string;
|
|
122
|
-
/** Type of the leading element, e.g. a checkbox for multi select. */
|
|
14
|
+
/** Type of leading element to display (icon, avatar, etc.) */
|
|
123
15
|
leadingType?: LeadingType;
|
|
124
|
-
/** Additional details
|
|
16
|
+
/** Additional details to display below the options */
|
|
125
17
|
optionDetails?: React.ReactNode;
|
|
126
|
-
/** Called with the value of the clicked option. */
|
|
127
|
-
onOptionClick: (value: string) => void;
|
|
128
18
|
}
|
|
129
19
|
/**
|
|
130
|
-
* Props
|
|
131
|
-
*
|
|
132
|
-
* Extends the deprecated `ComboBoxOptionsProps` so that consumers who built
|
|
133
|
-
* their own prop types on top of it keep compiling.
|
|
20
|
+
* Props for the ComboBox component
|
|
134
21
|
*/
|
|
135
22
|
export interface ComboBoxProps extends ComboBoxOptionsProps {
|
|
136
|
-
/** Additional CSS class name for the
|
|
23
|
+
/** Additional CSS class name for the component */
|
|
137
24
|
className?: string;
|
|
138
|
-
/** Name attribute for the input field
|
|
25
|
+
/** Name attribute for the input field */
|
|
139
26
|
name?: string;
|
|
140
|
-
/**
|
|
141
|
-
* ID attribute for the input field.
|
|
142
|
-
*
|
|
143
|
-
* @deprecated The trigger generates its own ids for the ARIA wiring; `id` is
|
|
144
|
-
* forwarded to the underlying input untouched and no longer used internally.
|
|
145
|
-
*/
|
|
146
|
-
id?: string;
|
|
147
|
-
/** Headline text displayed in the mobile bottom sheet. */
|
|
27
|
+
/** Headline text displayed in mobile bottom sheet */
|
|
148
28
|
headline?: string;
|
|
149
|
-
/** Helper text displayed below the input
|
|
29
|
+
/** Helper text displayed below the input */
|
|
150
30
|
helperText?: string;
|
|
151
|
-
/**
|
|
31
|
+
/** ID attribute for the input field */
|
|
32
|
+
id?: string;
|
|
33
|
+
/** Label text for the input field */
|
|
152
34
|
label?: string;
|
|
153
|
-
/**
|
|
154
|
-
options: ComboBoxOptionsInput;
|
|
155
|
-
/** Whether the popover / bottom sheet is currently open. */
|
|
35
|
+
/** Whether the dropdown/bottom sheet is currently open */
|
|
156
36
|
isOpen: boolean;
|
|
157
|
-
/** State setter
|
|
37
|
+
/** State setter function to control open/close state */
|
|
158
38
|
setIsOpen: React.Dispatch<React.SetStateAction<boolean>>;
|
|
159
|
-
/**
|
|
160
|
-
* Selected value: a string for single select, an array of strings when
|
|
161
|
-
* `multiple` is set.
|
|
162
|
-
*
|
|
163
|
-
* The array member is new in this version. Code that *reads* this prop back
|
|
164
|
-
* out of
|
|
165
|
-
* a props object has to narrow it (`Array.isArray(value)`).
|
|
166
|
-
*/
|
|
167
|
-
value?: string | string[];
|
|
168
|
-
/** Allows selecting several options; combine with a checkbox `leadingType`. */
|
|
169
|
-
multiple?: boolean;
|
|
170
|
-
/** Called with the value of the selected (in multi select: toggled) option. */
|
|
171
|
-
onOptionItemClick?: (value: string) => void;
|
|
172
|
-
/** Called when the search input value changes. */
|
|
39
|
+
/** Callback fired when the search input value changes */
|
|
173
40
|
onChange?: (value: string) => void;
|
|
174
|
-
/**
|
|
41
|
+
/** Callback fired when an option item is clicked */
|
|
42
|
+
onOptionItemClick?: (value: string) => void;
|
|
43
|
+
/** Callback fired when user clicks outside the component */
|
|
175
44
|
onOutsideClick?: () => void;
|
|
176
|
-
/**
|
|
45
|
+
/** Callback fired when the input field is clicked */
|
|
177
46
|
onClick?: () => void;
|
|
178
|
-
/**
|
|
47
|
+
/** Callback fired when the bottom sheet is closed */
|
|
179
48
|
onSheetClose?: () => void;
|
|
180
|
-
/** Placeholder text for the input field
|
|
49
|
+
/** Placeholder text for the input field */
|
|
181
50
|
placeholder?: string;
|
|
182
|
-
/** Search pattern for input validation
|
|
51
|
+
/** Search pattern/regex for input validation */
|
|
183
52
|
searchPattern?: string;
|
|
184
|
-
/**
|
|
53
|
+
/** Current value of the combobox */
|
|
54
|
+
value?: string;
|
|
55
|
+
/** Text to display when no results are found */
|
|
185
56
|
noResultsText?: string;
|
|
186
|
-
/** Input mode for mobile keyboards. */
|
|
57
|
+
/** Input mode for mobile keyboards (text, numeric, etc.) */
|
|
187
58
|
inputMode?: InputModesType;
|
|
188
|
-
/**
|
|
59
|
+
/** Whether to show the search input field */
|
|
189
60
|
withSearch?: boolean;
|
|
190
|
-
/**
|
|
191
|
-
openOnEnter?: boolean;
|
|
192
|
-
/** Whether the combobox is disabled. */
|
|
61
|
+
/** Whether the combobox is disabled */
|
|
193
62
|
disabled?: boolean;
|
|
194
|
-
/**
|
|
63
|
+
/** Show disabled style + horizontal shimmer animation while content is loading */
|
|
195
64
|
loading?: boolean;
|
|
196
|
-
/**
|
|
197
|
-
leadingType?: LeadingType;
|
|
198
|
-
/** Additional details rendered below the options. */
|
|
199
|
-
optionDetails?: React.ReactNode;
|
|
200
|
-
/** Theme configuration for the component. */
|
|
65
|
+
/** Theme configuration for the component */
|
|
201
66
|
theme?: ThemeType;
|
|
202
|
-
/** Custom slot that replaces the standard options
|
|
67
|
+
/** Custom slot that replaces the standard options/no-results block */
|
|
203
68
|
optionsSlot?: React.ReactNode;
|
|
204
|
-
/**
|
|
205
|
-
* Icon element displayed at the leading side of the trigger input.
|
|
206
|
-
*
|
|
207
|
-
* Deliberately `ReactNode`, not `ReactElement`: fragments, strings and
|
|
208
|
-
* conditional `false` have always been accepted here.
|
|
209
|
-
*/
|
|
69
|
+
/** Icon element displayed at the leading (left) side of the trigger input */
|
|
210
70
|
leadingIcon?: React.ReactNode;
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Props for individual ComboBox option items
|
|
74
|
+
*/
|
|
75
|
+
export interface ComboBoxOptionItemProps extends MenuItemProps {
|
|
76
|
+
/** Unique key for the option item */
|
|
77
|
+
key?: string;
|
|
216
78
|
}
|
package/lib/utils/index.d.ts
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export * from './
|
|
1
|
+
export * from './calculateListMaxHeight';
|
|
2
|
+
export * from './scrollOptionToViewport';
|
package/lib/utils/index.js
CHANGED