@pixum/combobox 5.10.4-alpha.30 → 5.10.4-alpha.7
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/CHANGELOG.md +730 -0
- 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/styles.css +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/styles.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.combobox{position:relative;width:100%}.combobox .combobox--headline[class*=text--]+*{margin-top:var(--spacing)}.combobox .combobox--header,.combobox .combobox__options,.combobox .combobox__options-slot,.combobox__bottom-sheet .combobox__options,.combobox__bottom-sheet .combobox__options-slot{position:relative}.combobox__bottom-sheet .combobox--header{align-items:flex-start;height:auto;margin:var(--spacing-5) auto var(--spacing-2);padding:0 var(--spacing-2);width:100%}.combobox .combobox__options,.combobox .combobox__options-slot,.combobox__bottom-sheet .combobox__options,.combobox__bottom-sheet .combobox__options-slot{display:flex;flex-direction:column;max-height:none;overflow:scroll;width:100%}.combobox__bottom-sheet ul.combobox__options-slot{margin:0;padding:0}.combobox .combobox__option-wrapper,.combobox__bottom-sheet .combobox__option-wrapper{touch-action:manipulation;-webkit-tap-highlight-color:transparent;cursor:pointer;-webkit-user-select:none;user-select:none}.combobox .combobox__options .combobox__sticky-header,.combobox__bottom-sheet .combobox__options .combobox__sticky-header{background-color:var(--color-surface);border-bottom:1px solid var(--color-dim);padding:var(--spacing-1_25) var(--spacing-2);position:-webkit-sticky;position:sticky;top:0}.combobox__options .text--caption{color:var(--color-on-secondary)}.combobox .combobox__options .item-header,.combobox__bottom-sheet .combobox__options .item-header{display:flex;justify-content:space-between}.combobox .combobox__options .combobox__option-details,.combobox__bottom-sheet .combobox__options .combobox__option-details{background-color:var(--color-surface);bottom:0;padding-left:var(--spacing);padding-right:var(--spacing);position:-webkit-sticky;position:sticky}.combobox .combobox--no-results-text,.combobox__bottom-sheet .combobox--no-results-text{padding:var(--spacing-2) var(--spacing);text-align:center}@media screen and (min-width:960px){.combobox .combobox__options,.combobox .combobox__options-slot{border-radius:12px;margin-top:var(--spacing);
|
|
1
|
+
.combobox{position:relative;width:100%}.combobox .combobox--headline[class*=text--]+*{margin-top:var(--spacing)}.combobox .combobox--header,.combobox .combobox__options,.combobox .combobox__options-slot,.combobox__bottom-sheet .combobox__options,.combobox__bottom-sheet .combobox__options-slot{position:relative}.combobox__bottom-sheet .combobox--header{align-items:flex-start;height:auto;margin:var(--spacing-5) auto var(--spacing-2);padding:0 var(--spacing-2);width:100%}.combobox .combobox__options,.combobox .combobox__options-slot,.combobox__bottom-sheet .combobox__options,.combobox__bottom-sheet .combobox__options-slot{display:flex;flex-direction:column;max-height:none;overflow:scroll;width:100%}.combobox__bottom-sheet ul.combobox__options-slot{margin:0;padding:0}.combobox .combobox__option-wrapper,.combobox__bottom-sheet .combobox__option-wrapper{touch-action:manipulation;-webkit-tap-highlight-color:transparent;cursor:pointer;-webkit-user-select:none;user-select:none}.combobox .combobox__options .combobox__sticky-header,.combobox__bottom-sheet .combobox__options .combobox__sticky-header{background-color:var(--color-surface);border-bottom:1px solid var(--color-dim);padding:var(--spacing-1_25) var(--spacing-2);position:-webkit-sticky;position:sticky;top:0}.combobox__options .text--caption{color:var(--color-on-secondary)}.combobox .combobox__options .item-header,.combobox__bottom-sheet .combobox__options .item-header{display:flex;justify-content:space-between}.combobox .combobox__options .combobox__option-details,.combobox__bottom-sheet .combobox__options .combobox__option-details{background-color:var(--color-surface);bottom:0;padding-left:var(--spacing);padding-right:var(--spacing);position:-webkit-sticky;position:sticky}.combobox .combobox--no-results-text,.combobox__bottom-sheet .combobox--no-results-text{padding:var(--spacing-2) var(--spacing);text-align:center}@media screen and (min-width:960px){.combobox .combobox__options,.combobox .combobox__options-slot{border-radius:12px;margin-top:var(--spacing);overflow:auto;position:absolute}}.combobox ul.combobox__options-slot{list-style:none;padding:0}.combobox .combobox__options-slot{margin-top:var(--spacing)}
|