@pixum/combobox 4.0.19 → 4.0.21-alpha.96
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 +10 -4
- package/lib/ComboBox.js +67 -28
- package/lib/ComboBox.js.map +1 -1
- package/lib/ComboboxOptions/Options.d.ts +1 -0
- package/lib/ComboboxOptions/Options.js +23 -15
- package/lib/ComboboxOptions/Options.js.map +1 -1
- package/lib/ComboboxOptions/OptionsGroup.d.ts +1 -0
- package/lib/ComboboxOptions/OptionsGroup.js +48 -7
- package/lib/ComboboxOptions/OptionsGroup.js.map +1 -1
- package/lib/ComboboxOptions/index.js +61 -16
- package/lib/ComboboxOptions/index.js.map +1 -1
- package/lib/helper/calculateListMaxHeight.js +9 -5
- package/lib/helper/calculateListMaxHeight.js.map +1 -1
- package/lib/helper/index.d.ts +2 -0
- package/lib/helper/index.js +3 -0
- package/lib/helper/index.js.map +1 -0
- package/lib/helper/scrollOptionToViewport.js +12 -9
- package/lib/helper/scrollOptionToViewport.js.map +1 -1
- package/lib/helper/useIsDesktopScreenWidth.js +11 -9
- package/lib/helper/useIsDesktopScreenWidth.js.map +1 -1
- package/lib/hooks/index.d.ts +1 -0
- package/lib/hooks/index.js +2 -0
- package/lib/hooks/index.js.map +1 -0
- package/lib/hooks/useIsDesktopScreenWidth.d.ts +1 -0
- package/lib/hooks/useIsDesktopScreenWidth.js +36 -0
- package/lib/hooks/useIsDesktopScreenWidth.js.map +1 -0
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/partials/ComboBoxGroupedOptions.d.ts +13 -0
- package/lib/partials/ComboBoxGroupedOptions.js +10 -0
- package/lib/partials/ComboBoxGroupedOptions.js.map +1 -0
- package/lib/partials/ComboBoxMenu.d.ts +3 -0
- package/lib/partials/ComboBoxMenu.js +22 -0
- package/lib/partials/ComboBoxMenu.js.map +1 -0
- package/lib/partials/ComboBoxOptions.d.ts +10 -0
- package/lib/partials/ComboBoxOptions.js +29 -0
- package/lib/partials/ComboBoxOptions.js.map +1 -0
- package/lib/partials/ComboBoxOptionsItems.d.ts +24 -0
- package/lib/partials/ComboBoxOptionsItems.js +24 -0
- package/lib/partials/ComboBoxOptionsItems.js.map +1 -0
- package/lib/partials/ComboBoxOptionsWithGrouping.d.ts +26 -0
- package/lib/partials/ComboBoxOptionsWithGrouping.js +14 -0
- package/lib/partials/ComboBoxOptionsWithGrouping.js.map +1 -0
- package/lib/partials/index.d.ts +3 -0
- package/lib/partials/index.js +4 -0
- package/lib/partials/index.js.map +1 -0
- package/lib/styles.css +1 -1
- package/lib/types.d.ts +39 -5
- package/lib/utils/calculateListMaxHeight.d.ts +7 -0
- package/lib/utils/calculateListMaxHeight.js +14 -0
- package/lib/utils/calculateListMaxHeight.js.map +1 -0
- package/lib/utils/index.d.ts +2 -0
- package/lib/utils/index.js +3 -0
- package/lib/utils/index.js.map +1 -0
- package/lib/utils/scrollOptionToViewport.d.ts +7 -0
- package/lib/utils/scrollOptionToViewport.js +38 -0
- package/lib/utils/scrollOptionToViewport.js.map +1 -0
- package/package.json +3 -6
package/lib/ComboBox.d.ts
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { ComboBoxProps } from './types';
|
|
1
|
+
import type { ComboBoxProps } from './types';
|
|
3
2
|
import './styles.css';
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
/**
|
|
4
|
+
* ComboBox component that provides a searchable dropdown with options.
|
|
5
|
+
* Adapts to mobile (bottom sheet) and desktop (dropdown) viewports.
|
|
6
|
+
* Supports both flat and grouped options, search functionality, and keyboard navigation.
|
|
7
|
+
*
|
|
8
|
+
* @param props - The props for the ComboBox component
|
|
9
|
+
* @returns A responsive combobox component with search and selection capabilities
|
|
10
|
+
*/
|
|
11
|
+
export declare function ComboBox({ className, name, headline, label, searchPattern, isOpen, options, placeholder, value, inputMode, noResultsText, leadingType, optionDetails, withSearch, theme, setIsOpen, onClick, onChange, onOutsideClick, onOptionItemClick, onSheetClose, }: ComboBoxProps): import("react/jsx-runtime").JSX.Element;
|
package/lib/ComboBox.js
CHANGED
|
@@ -1,15 +1,24 @@
|
|
|
1
|
-
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useRef, useState, } from 'react';
|
|
2
4
|
import BottomSheet from '@pixum/bottom-sheet';
|
|
3
5
|
import Text, { TextVariant } from '@pixum/text';
|
|
4
6
|
import { useEscapeKeyPress } from '@pixum/utils';
|
|
5
|
-
import ComboBoxOptions from './
|
|
6
|
-
import { SearchInput } from '@pixum/web-input';
|
|
7
|
-
import {
|
|
8
|
-
import useIsDesktopScreenWidth from './helper/useIsDesktopScreenWidth';
|
|
7
|
+
import { ComboBoxOptions } from './partials';
|
|
8
|
+
import { SelectInput, SearchInput } from '@pixum/web-input';
|
|
9
|
+
import { useIsDesktopScreenWidth } from './hooks';
|
|
9
10
|
import clsx from 'clsx';
|
|
10
11
|
import ThemeProvider, { DEFAULT_THEME } from '@pixum/theme-provider';
|
|
11
12
|
import './styles.css';
|
|
12
|
-
|
|
13
|
+
/**
|
|
14
|
+
* ComboBox component that provides a searchable dropdown with options.
|
|
15
|
+
* Adapts to mobile (bottom sheet) and desktop (dropdown) viewports.
|
|
16
|
+
* Supports both flat and grouped options, search functionality, and keyboard navigation.
|
|
17
|
+
*
|
|
18
|
+
* @param props - The props for the ComboBox component
|
|
19
|
+
* @returns A responsive combobox component with search and selection capabilities
|
|
20
|
+
*/
|
|
21
|
+
export function ComboBox({ className = '', name, headline, label, searchPattern = '', isOpen, options, placeholder, value, inputMode, noResultsText, leadingType, optionDetails, withSearch = true, theme = DEFAULT_THEME, setIsOpen, onClick, onChange, onOutsideClick, onOptionItemClick, onSheetClose, }) {
|
|
13
22
|
const comboBoxRef = useRef(null);
|
|
14
23
|
const bottomSheetRef = useRef(null);
|
|
15
24
|
const [searchQuery, setSearchQuery] = useState('');
|
|
@@ -20,50 +29,80 @@ const ComboBox = ({ className = '', name, headline, label, searchPattern = '', i
|
|
|
20
29
|
useEffect(() => {
|
|
21
30
|
!isOpen && (onSheetClose === null || onSheetClose === void 0 ? void 0 : onSheetClose());
|
|
22
31
|
}, [isOpen]);
|
|
32
|
+
/**
|
|
33
|
+
* Handles changes to the search input field
|
|
34
|
+
*
|
|
35
|
+
* @param e - The change event from the input
|
|
36
|
+
*/
|
|
23
37
|
const handleChange = (e) => {
|
|
24
38
|
const { value: searchValue } = e.target;
|
|
25
39
|
setSearchQuery(searchValue);
|
|
26
40
|
onChange === null || onChange === void 0 ? void 0 : onChange(searchValue);
|
|
27
41
|
};
|
|
42
|
+
/**
|
|
43
|
+
* Clears the search input field
|
|
44
|
+
*/
|
|
28
45
|
const handleClearInput = () => {
|
|
29
46
|
setSearchQuery('');
|
|
30
47
|
};
|
|
48
|
+
/**
|
|
49
|
+
* Clears the search input and closes the dropdown/bottom sheet
|
|
50
|
+
*/
|
|
31
51
|
const clearAndClose = () => {
|
|
32
52
|
setSearchQuery('');
|
|
33
53
|
setIsOpen(false);
|
|
34
54
|
};
|
|
35
55
|
useEscapeKeyPress(clearAndClose, isOpen);
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
56
|
+
// Handle outside clicks for desktop dropdown
|
|
57
|
+
useEffect(() => {
|
|
58
|
+
if (!isDesktop || !isOpen)
|
|
59
|
+
return;
|
|
60
|
+
const handleDocumentClick = (event) => {
|
|
61
|
+
var _a;
|
|
62
|
+
const node = event.target;
|
|
63
|
+
const isOutside = !((_a = comboBoxRef.current) === null || _a === void 0 ? void 0 : _a.contains(node));
|
|
64
|
+
if (isOutside) {
|
|
65
|
+
clearAndClose();
|
|
66
|
+
onOutsideClick === null || onOutsideClick === void 0 ? void 0 : onOutsideClick();
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
// Add listener after a small delay to avoid closing immediately on open
|
|
70
|
+
const timeoutId = setTimeout(() => {
|
|
71
|
+
document.addEventListener('mousedown', handleDocumentClick);
|
|
72
|
+
}, 100);
|
|
73
|
+
return () => {
|
|
74
|
+
clearTimeout(timeoutId);
|
|
75
|
+
document.removeEventListener('mousedown', handleDocumentClick);
|
|
76
|
+
};
|
|
77
|
+
}, [isDesktop, isOpen, onOutsideClick]);
|
|
78
|
+
/**
|
|
79
|
+
* Handles click on an option item
|
|
80
|
+
*
|
|
81
|
+
* @param optionValue - The value of the clicked option
|
|
82
|
+
*/
|
|
44
83
|
const handleOptionItemClick = (optionValue) => {
|
|
45
84
|
onOptionItemClick === null || onOptionItemClick === void 0 ? void 0 : onOptionItemClick(optionValue);
|
|
46
85
|
};
|
|
86
|
+
/**
|
|
87
|
+
* Handles click on the input field
|
|
88
|
+
*/
|
|
47
89
|
const handleOnClick = () => {
|
|
48
90
|
onClick === null || onClick === void 0 ? void 0 : onClick();
|
|
49
91
|
};
|
|
92
|
+
/**
|
|
93
|
+
* Renders the "no results" message when no options match the search
|
|
94
|
+
*
|
|
95
|
+
* @returns A text component displaying the no results message
|
|
96
|
+
*/
|
|
50
97
|
const NoResultsTextComponent = () => {
|
|
51
|
-
return (
|
|
98
|
+
return (_jsx(Text, { variant: TextVariant.SUBHEADLINE, className: "combobox--no-results-text", children: noResultsText }));
|
|
52
99
|
};
|
|
100
|
+
/**
|
|
101
|
+
* Removes the placeholder text from the input field
|
|
102
|
+
*/
|
|
53
103
|
const removePlaceholder = () => {
|
|
54
104
|
setPlaceholder('');
|
|
55
105
|
};
|
|
56
|
-
return (
|
|
57
|
-
|
|
58
|
-
isDesktop && isOpen && (React.createElement("div", { className: "combobox", ref: comboBoxRef },
|
|
59
|
-
withSearch && (React.createElement(SearchInput, { name: name, value: searchQuery, pattern: searchPattern, label: label, onChange: handleChange, onClear: handleClearInput, onOutsideClick: handleClickOutside, displayLeadingIcon: isOpen, isCompact: true, inputMode: inputMode, autoFocus: true })),
|
|
60
|
-
optionsExist ? (React.createElement(ComboBoxOptions, { options: options, onClick: handleOptionItemClick, selectedOption: value, leadingType: leadingType, optionDetails: optionDetails })) : (React.createElement(NoResultsTextComponent, null)),
|
|
61
|
-
React.createElement("div", null))),
|
|
62
|
-
!isDesktop && isOpen && (React.createElement(BottomSheet, { open: isOpen, onClose: clearAndClose, ref: bottomSheetRef },
|
|
63
|
-
React.createElement("div", { className: "combobox--header" },
|
|
64
|
-
React.createElement(Text, { variant: TextVariant.HEADLINE, className: "combobox--headline" }, headline),
|
|
65
|
-
withSearch && (React.createElement(SearchInput, { name: name, value: searchQuery, pattern: searchPattern, onChange: handleChange, onClear: handleClearInput, onFocus: removePlaceholder, placeholder: inputPlaceholder, isCompact: true, inputMode: inputMode, displayLeadingIcon: isOpen }))),
|
|
66
|
-
React.createElement("div", { className: "combobox__options scrollable" }, optionsExist ? (React.createElement(ComboBoxOptions, { options: options, onClick: handleOptionItemClick, selectedOption: value, leadingType: leadingType, optionDetails: optionDetails })) : (React.createElement(NoResultsTextComponent, null)))))));
|
|
67
|
-
};
|
|
68
|
-
export default ComboBox;
|
|
106
|
+
return (_jsxs(ThemeProvider, { theme: theme, children: [showSelectField && (_jsx(SelectInput, { className: clsx(isOpen && 'active', className), name: name, label: label, value: value, onClick: handleOnClick, disableTrailingIconButton: true, readOnly: true })), isDesktop && isOpen && (_jsxs("div", { className: "combobox", ref: comboBoxRef, children: [withSearch && (_jsx(SearchInput, { name: name, value: searchQuery, pattern: searchPattern, label: label, onChange: handleChange, onClear: handleClearInput, displayLeadingIcon: isOpen, isCompact: true, inputMode: inputMode, autoFocus: true })), optionsExist ? (_jsx(ComboBoxOptions, { options: options, onClick: handleOptionItemClick, selectedOption: value, leadingType: leadingType })) : (_jsx(NoResultsTextComponent, {})), _jsx("div", {})] })), !isDesktop && isOpen && (_jsxs(BottomSheet, { className: "combobox__bottom-sheet", open: isOpen, onClose: clearAndClose, ref: bottomSheetRef, children: [_jsxs("div", { className: "combobox--header", children: [_jsx(Text, { variant: TextVariant.HEADLINE, className: "combobox--headline", children: headline }), withSearch && (_jsx(SearchInput, { name: name, value: searchQuery, pattern: searchPattern, onChange: handleChange, onClear: handleClearInput, onFocus: removePlaceholder, placeholder: inputPlaceholder, isCompact: true, inputMode: inputMode, displayLeadingIcon: isOpen }))] }), _jsx("div", { className: "combobox__options", children: optionsExist ? (_jsx(ComboBoxOptions, { options: options, onClick: handleOptionItemClick, selectedOption: value, leadingType: leadingType, optionDetails: optionDetails })) : (_jsx(NoResultsTextComponent, {})) })] }))] }));
|
|
107
|
+
}
|
|
69
108
|
//# sourceMappingURL=ComboBox.js.map
|
package/lib/ComboBox.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComboBox.js","sourceRoot":"","sources":["../src/ComboBox.tsx"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"ComboBox.js","sourceRoot":"","sources":["../src/ComboBox.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,24 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
var menu_item_1 = __importDefault(require("@pixum/menu-item"));
|
|
7
|
+
var clsx_1 = __importDefault(require("clsx"));
|
|
8
|
+
var react_1 = __importDefault(require("react"));
|
|
9
|
+
var Options = function (_a) {
|
|
10
|
+
var items = _a.items, selectedOption = _a.selectedOption, onClick = _a.onClick, onKeyDown = _a.onKeyDown, leadingType = _a.leadingType;
|
|
11
|
+
return (react_1.default.createElement(react_1.default.Fragment, null, items.map(function (item, index) {
|
|
12
|
+
var _a;
|
|
13
|
+
return (react_1.default.createElement(menu_item_1.default, { key: "combobox-item-".concat(item.text), tabIndex: index, className: (0, clsx_1.default)(selectedOption === item.text && 'selected'), onClick: function () { return onClick === null || onClick === void 0 ? void 0 : onClick(item.text); }, onKeyDown: function (e) { return onKeyDown(e, item.text); }, onMouseEnter: item.onMouseEnter, leadingProps: leadingType
|
|
14
|
+
? {
|
|
15
|
+
name: item.text,
|
|
16
|
+
type: leadingType,
|
|
17
|
+
}
|
|
18
|
+
: undefined, selected: selectedOption === item.text, text: item.text, subtext: item.subtext, subItemProps: {
|
|
19
|
+
text: (_a = item.subItemProps) === null || _a === void 0 ? void 0 : _a.text,
|
|
20
|
+
} }));
|
|
21
|
+
})));
|
|
22
|
+
};
|
|
23
|
+
exports.default = Options;
|
|
16
24
|
//# sourceMappingURL=Options.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Options.js","sourceRoot":"","sources":["../../src/ComboboxOptions/Options.tsx"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"Options.js","sourceRoot":"","sources":["../../src/ComboboxOptions/Options.tsx"],"names":[],"mappings":";;;;;AAAA,+DAAuE;AACvE,8CAAuB;AACvB,gDAAyB;AAWzB,IAAM,OAAO,GAA2B,UAAC,EAMxC;QALC,KAAK,WAAA,EACL,cAAc,oBAAA,EACd,OAAO,aAAA,EACP,SAAS,eAAA,EACT,WAAW,iBAAA;IACP,OAAA,CACJ,8DACG,KAAK,CAAC,GAAG,CAAC,UAAC,IAAmB,EAAE,KAAa;;QAAK,OAAA,CACjD,8BAAC,mBAAQ,IACP,GAAG,EAAE,wBAAiB,IAAI,CAAC,IAAI,CAAE,EACjC,QAAQ,EAAE,KAAK,EACf,SAAS,EAAE,IAAA,cAAI,EAAC,cAAc,KAAK,IAAI,CAAC,IAAI,IAAI,UAAU,CAAC,EAC3D,OAAO,EAAE,cAAM,OAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAG,IAAI,CAAC,IAAI,CAAC,EAApB,CAAoB,EACnC,SAAS,EAAE,UAAA,CAAC,IAAI,OAAA,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAvB,CAAuB,EACvC,YAAY,EAAE,IAAI,CAAC,YAAY,EAC/B,YAAY,EACV,WAAW;gBACT,CAAC,CAAC;oBACE,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,IAAI,EAAE,WAAW;iBAClB;gBACH,CAAC,CAAC,SAAS,EAEf,QAAQ,EAAE,cAAc,KAAK,IAAI,CAAC,IAAI,EACtC,IAAI,EAAE,IAAI,CAAC,IAAI,EACf,OAAO,EAAE,IAAI,CAAC,OAAO,EACrB,YAAY,EAAE;gBACZ,IAAI,EAAE,MAAA,IAAI,CAAC,YAAY,0CAAE,IAAI;aAC9B,GACD,CACH,CAAA;KAAA,CAAC,CACD,CACJ;AA3BK,CA2BL,CAAA;AAED,kBAAe,OAAO,CAAA"}
|
|
@@ -6,6 +6,7 @@ interface OptionsGroupProps {
|
|
|
6
6
|
items: ComboBoxOptionProps[];
|
|
7
7
|
selectedOption?: string;
|
|
8
8
|
onClick?: (value: string) => void;
|
|
9
|
+
onKeyDown: (e: React.KeyboardEvent, value: string) => void;
|
|
9
10
|
leadingType?: LeadingType;
|
|
10
11
|
}
|
|
11
12
|
declare const OptionsGroup: React.FC<OptionsGroupProps>;
|
|
@@ -1,8 +1,49 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
var text_1 = __importStar(require("@pixum/text"));
|
|
40
|
+
var react_1 = __importDefault(require("react"));
|
|
41
|
+
var Options_1 = __importDefault(require("./Options"));
|
|
42
|
+
var OptionsGroup = function (_a) {
|
|
43
|
+
var group = _a.group, items = _a.items, selectedOption = _a.selectedOption, onClick = _a.onClick, onKeyDown = _a.onKeyDown, leadingType = _a.leadingType;
|
|
44
|
+
return (react_1.default.createElement("div", { className: "combobox__options-group", key: "combobox__options-group-".concat(group) },
|
|
45
|
+
react_1.default.createElement(text_1.default, { variant: text_1.TextVariant.HEADLINE, className: "combobox__sticky-header" }, group),
|
|
46
|
+
react_1.default.createElement(Options_1.default, { items: items, selectedOption: selectedOption, onClick: onClick, onKeyDown: onKeyDown, leadingType: leadingType })));
|
|
47
|
+
};
|
|
48
|
+
exports.default = OptionsGroup;
|
|
8
49
|
//# sourceMappingURL=OptionsGroup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OptionsGroup.js","sourceRoot":"","sources":["../../src/ComboboxOptions/OptionsGroup.tsx"],"names":[],"mappings":"AACA,
|
|
1
|
+
{"version":3,"file":"OptionsGroup.js","sourceRoot":"","sources":["../../src/ComboboxOptions/OptionsGroup.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,kDAA+C;AAC/C,gDAAyB;AACzB,sDAA+B;AAY/B,IAAM,YAAY,GAAgC,UAAC,EAOlD;QANC,KAAK,WAAA,EACL,KAAK,WAAA,EACL,cAAc,oBAAA,EACd,OAAO,aAAA,EACP,SAAS,eAAA,EACT,WAAW,iBAAA;IACP,OAAA,CACJ,uCACE,SAAS,EAAC,yBAAyB,EACnC,GAAG,EAAE,kCAA2B,KAAK,CAAE;QAEvC,8BAAC,cAAI,IAAC,OAAO,EAAE,kBAAW,CAAC,QAAQ,EAAE,SAAS,EAAC,yBAAyB,IACrE,KAAK,CACD;QACP,8BAAC,iBAAO,IACN,KAAK,EAAE,KAAK,EACZ,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,WAAW,GACxB,CACE,CACP;AAhBK,CAgBL,CAAA;AAED,kBAAe,YAAY,CAAA"}
|
|
@@ -1,19 +1,64 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
var react_1 = __importStar(require("react"));
|
|
40
|
+
var menu_1 = __importDefault(require("@pixum/menu"));
|
|
41
|
+
var scrollOptionToViewport_1 = require("../helper/scrollOptionToViewport");
|
|
42
|
+
var OptionsGroup_1 = __importDefault(require("./OptionsGroup"));
|
|
43
|
+
var Options_1 = __importDefault(require("./Options"));
|
|
44
|
+
var useIsDesktopScreenWidth_1 = __importDefault(require("../helper/useIsDesktopScreenWidth"));
|
|
45
|
+
var ComboBoxOptions = function (_a) {
|
|
46
|
+
var options = _a.options, onClick = _a.onClick, selectedOption = _a.selectedOption, leadingType = _a.leadingType, optionDetails = _a.optionDetails;
|
|
47
|
+
var isDesktop = (0, useIsDesktopScreenWidth_1.default)();
|
|
48
|
+
var handleOnKeyDown = function (e, value) {
|
|
49
|
+
if (e.key === 'Enter') {
|
|
50
|
+
onClick === null || onClick === void 0 ? void 0 : onClick(value);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
(0, react_1.useEffect)(function () {
|
|
54
|
+
(0, scrollOptionToViewport_1.scrollOptionToViewport)(isDesktop);
|
|
13
55
|
}, [isDesktop]);
|
|
14
|
-
return (
|
|
15
|
-
|
|
16
|
-
|
|
56
|
+
return (react_1.default.createElement(menu_1.default, { className: "combobox__options" },
|
|
57
|
+
Array.isArray(options) ? (react_1.default.createElement(Options_1.default, { items: options, selectedOption: selectedOption, onClick: onClick, onKeyDown: handleOnKeyDown, leadingType: leadingType })) : (react_1.default.createElement(react_1.default.Fragment, null, Object.entries(options).map(function (_a) {
|
|
58
|
+
var group = _a[0], items = _a[1];
|
|
59
|
+
return (react_1.default.createElement(OptionsGroup_1.default, { group: group, items: items, selectedOption: selectedOption, onClick: onClick, onKeyDown: handleOnKeyDown, leadingType: leadingType }));
|
|
60
|
+
}))),
|
|
61
|
+
optionDetails && (react_1.default.createElement("div", { className: "combobox__option-details text--caption" }, optionDetails))));
|
|
17
62
|
};
|
|
18
|
-
|
|
63
|
+
exports.default = ComboBoxOptions;
|
|
19
64
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ComboboxOptions/index.tsx"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ComboboxOptions/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6CAAiD;AACjD,qDAA8B;AAC9B,2EAAyE;AAEzE,gEAAyC;AACzC,sDAA+B;AAC/B,8FAAuE;AAEvE,IAAM,eAAe,GAAmC,UAAC,EAMxD;QALC,OAAO,aAAA,EACP,OAAO,aAAA,EACP,cAAc,oBAAA,EACd,WAAW,iBAAA,EACX,aAAa,mBAAA;IAEb,IAAM,SAAS,GAAG,IAAA,iCAAuB,GAAE,CAAA;IAE3C,IAAM,eAAe,GAAG,UAAC,CAAsB,EAAE,KAAa;QAC5D,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;YACtB,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAG,KAAK,CAAC,CAAA;QAClB,CAAC;IACH,CAAC,CAAA;IAED,IAAA,iBAAS,EAAC;QACR,IAAA,+CAAsB,EAAC,SAAS,CAAC,CAAA;IACnC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;IAEf,OAAO,CACL,8BAAC,cAAI,IAAC,SAAS,EAAC,mBAAmB;QAChC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CACxB,8BAAC,iBAAO,IACN,KAAK,EAAE,OAAO,EACd,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,eAAe,EAC1B,WAAW,EAAE,WAAW,GACxB,CACH,CAAC,CAAC,CAAC,CACF,8DACG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,UAAC,EAAc;gBAAb,KAAK,QAAA,EAAE,KAAK,QAAA;YAAM,OAAA,CAC/C,8BAAC,sBAAY,IACX,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,KAAK,EACZ,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,eAAe,EAC1B,WAAW,EAAE,WAAW,GACxB,CACH;QATgD,CAShD,CAAC,CACD,CACJ;QACA,aAAa,IAAI,CAChB,uCAAK,SAAS,EAAC,wCAAwC,IACpD,aAAa,CACV,CACP,CACI,CACR,CAAA;AACH,CAAC,CAAA;AAED,kBAAe,eAAe,CAAA"}
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.calculateListMaxHeight = void 0;
|
|
4
|
+
var calculateListMaxHeight = function () {
|
|
5
|
+
var windowHeight = window.innerHeight;
|
|
6
|
+
var headerHeight = 50;
|
|
7
|
+
var inputFieldHeight = 35;
|
|
8
|
+
var maxListHeight = windowHeight - headerHeight - inputFieldHeight;
|
|
6
9
|
return maxListHeight;
|
|
7
10
|
};
|
|
11
|
+
exports.calculateListMaxHeight = calculateListMaxHeight;
|
|
8
12
|
//# sourceMappingURL=calculateListMaxHeight.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calculateListMaxHeight.js","sourceRoot":"","sources":["../../src/helper/calculateListMaxHeight.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"calculateListMaxHeight.js","sourceRoot":"","sources":["../../src/helper/calculateListMaxHeight.ts"],"names":[],"mappings":";;;AAAO,IAAM,sBAAsB,GAAG;IAClC,IAAM,YAAY,GAAG,MAAM,CAAC,WAAW,CAAA;IACvC,IAAM,YAAY,GAAG,EAAE,CAAA;IACvB,IAAM,gBAAgB,GAAG,EAAE,CAAA;IAC3B,IAAM,aAAa,GAAG,YAAY,GAAG,YAAY,GAAG,gBAAgB,CAAA;IAErE,OAAO,aAAa,CAAA;AAEvB,CAAC,CAAA;AARY,QAAA,sBAAsB,0BAQlC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/helper/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAA;AACxC,cAAc,0BAA0B,CAAA"}
|
|
@@ -1,19 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.scrollOptionToViewport = void 0;
|
|
4
|
+
var scrollOptionToViewport = function (isDesktop) {
|
|
5
|
+
var comboboxOptions = isDesktop ? document.querySelector('.menu') :
|
|
6
|
+
document.querySelector('.combobox__options');
|
|
7
|
+
var selectedItem = document.querySelector(".menu-item.selected");
|
|
6
8
|
if (selectedItem && comboboxOptions) {
|
|
7
|
-
|
|
9
|
+
var comboboxOptionsGroup = selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.parentElement;
|
|
8
10
|
if (comboboxOptionsGroup) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
+
var stickyHeader = comboboxOptionsGroup === null || comboboxOptionsGroup === void 0 ? void 0 : comboboxOptionsGroup.querySelector('.sticky-header');
|
|
12
|
+
var stickyHeaderOffset = stickyHeader === null || stickyHeader === void 0 ? void 0 : stickyHeader.offsetTop;
|
|
11
13
|
comboboxOptions === null || comboboxOptions === void 0 ? void 0 : comboboxOptions.scrollTo({ top: stickyHeaderOffset });
|
|
12
14
|
}
|
|
13
15
|
else {
|
|
14
|
-
|
|
16
|
+
var selectedItemOffset = selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.offsetTop;
|
|
15
17
|
comboboxOptions === null || comboboxOptions === void 0 ? void 0 : comboboxOptions.scrollTo({ top: selectedItemOffset });
|
|
16
18
|
}
|
|
17
19
|
}
|
|
18
20
|
};
|
|
21
|
+
exports.scrollOptionToViewport = scrollOptionToViewport;
|
|
19
22
|
//# sourceMappingURL=scrollOptionToViewport.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scrollOptionToViewport.js","sourceRoot":"","sources":["../../src/helper/scrollOptionToViewport.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"scrollOptionToViewport.js","sourceRoot":"","sources":["../../src/helper/scrollOptionToViewport.ts"],"names":[],"mappings":";;;AAAO,IAAM,sBAAsB,GAAG,UAAC,SAAkB;IACrD,IAAM,eAAe,GAAG,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAgB,CAAC,CAAC;QAChF,QAAQ,CAAC,aAAa,CAAC,oBAAoB,CAAgB,CAAA;IAC/D,IAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,qBAAqB,CAAgB,CAAC;IAElF,IAAI,YAAY,IAAI,eAAe,EAAE,CAAC;QAClC,IAAI,oBAAoB,GAAG,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,aAAa,CAAA;QAEtD,IAAI,oBAAoB,EAAE,CAAC;YACvB,IAAM,YAAY,GAAG,oBAAoB,aAApB,oBAAoB,uBAApB,oBAAoB,CAAE,aAAa,CAAC,gBAAgB,CAAgB,CAAA;YACzF,IAAM,kBAAkB,GAAG,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,SAAS,CAAA;YAElD,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,QAAQ,CAAC,EAAE,GAAG,EAAE,kBAAkB,EAAG,CAAC,CAAA;QAC3D,CAAC;aAAM,CAAC;YACJ,IAAM,kBAAkB,GAAG,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,SAAS,CAAA;YAElD,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,QAAQ,CAAC,EAAE,GAAG,EAAE,kBAAkB,EAAE,CAAC,CAAA;QAC1D,CAAC;IACL,CAAC;AACL,CAAC,CAAA;AAnBY,QAAA,sBAAsB,0BAmBlC"}
|
|
@@ -1,14 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var react_1 = require("react");
|
|
4
|
+
var useIsDesktopScreenWidth = function () {
|
|
5
|
+
var hasWindowObject = typeof window !== 'undefined';
|
|
4
6
|
if (hasWindowObject) {
|
|
5
|
-
|
|
6
|
-
useEffect(()
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
var _a = (0, react_1.useState)(window.innerWidth), screenWidth = _a[0], setScreenWidth_1 = _a[1];
|
|
8
|
+
(0, react_1.useEffect)(function () {
|
|
9
|
+
var handleResize = function () {
|
|
10
|
+
setScreenWidth_1(window.innerWidth);
|
|
9
11
|
};
|
|
10
12
|
window.addEventListener('resize', handleResize);
|
|
11
|
-
return ()
|
|
13
|
+
return function () {
|
|
12
14
|
window.removeEventListener('resize', handleResize);
|
|
13
15
|
};
|
|
14
16
|
}, []);
|
|
@@ -16,5 +18,5 @@ const useIsDesktopScreenWidth = () => {
|
|
|
16
18
|
}
|
|
17
19
|
return false;
|
|
18
20
|
};
|
|
19
|
-
|
|
21
|
+
exports.default = useIsDesktopScreenWidth;
|
|
20
22
|
//# sourceMappingURL=useIsDesktopScreenWidth.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useIsDesktopScreenWidth.js","sourceRoot":"","sources":["../../src/helper/useIsDesktopScreenWidth.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"useIsDesktopScreenWidth.js","sourceRoot":"","sources":["../../src/helper/useIsDesktopScreenWidth.ts"],"names":[],"mappings":";;AAAA,+BAA2C;AAE3C,IAAM,uBAAuB,GAAG;IAC9B,IAAM,eAAe,GAAG,OAAO,MAAM,KAAK,WAAW,CAAA;IAErD,IAAI,eAAe,EAAE,CAAC;QACd,IAAA,KAAgC,IAAA,gBAAQ,EAAC,MAAM,CAAC,UAAU,CAAC,EAA1D,WAAW,QAAA,EAAE,gBAAc,QAA+B,CAAA;QAEjE,IAAA,iBAAS,EAAC;YACR,IAAM,YAAY,GAAG;gBACnB,gBAAc,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;YACnC,CAAC,CAAA;YAED,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;YAE/C,OAAO;gBACL,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;YACpD,CAAC,CAAA;QACH,CAAC,EAAE,EAAE,CAAC,CAAA;QAEN,OAAO,WAAW,GAAG,GAAG,CAAA;IAC1B,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED,kBAAe,uBAAuB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './useIsDesktopScreenWidth';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function useIsDesktopScreenWidth(): boolean;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { useState, useEffect } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Custom hook that detects whether the viewport width is desktop size (>= 960px).
|
|
4
|
+
* Listens to window resize events to update the state dynamically.
|
|
5
|
+
*
|
|
6
|
+
* @returns True if the viewport width is 960px or greater, false otherwise
|
|
7
|
+
*/
|
|
8
|
+
function isBrowser() {
|
|
9
|
+
return typeof window !== 'undefined';
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Checks if the current viewport width is desktop size (>= 960px).
|
|
13
|
+
*
|
|
14
|
+
* @returns True if the viewport is desktop size, false otherwise or in non-browser environments
|
|
15
|
+
*/
|
|
16
|
+
function isInitialScreenDesktop() {
|
|
17
|
+
if (isBrowser()) {
|
|
18
|
+
return window.innerWidth >= 960;
|
|
19
|
+
}
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
export function useIsDesktopScreenWidth() {
|
|
23
|
+
const [isDesktop, setIsDesktop] = useState(isInitialScreenDesktop);
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
const checkScreenSize = () => {
|
|
26
|
+
setIsDesktop(window.innerWidth >= 960);
|
|
27
|
+
};
|
|
28
|
+
checkScreenSize();
|
|
29
|
+
window.addEventListener('resize', checkScreenSize);
|
|
30
|
+
return () => {
|
|
31
|
+
window.removeEventListener('resize', checkScreenSize);
|
|
32
|
+
};
|
|
33
|
+
}, []);
|
|
34
|
+
return isDesktop;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=useIsDesktopScreenWidth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useIsDesktopScreenWidth.js","sourceRoot":"","sources":["../../src/hooks/useIsDesktopScreenWidth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAE3C;;;;;GAKG;AAEH,SAAS,SAAS;IAChB,OAAO,OAAO,MAAM,KAAK,WAAW,CAAA;AACtC,CAAC;AAED;;;;GAIG;AACH,SAAS,sBAAsB;IAC7B,IAAI,SAAS,EAAE,EAAE,CAAC;QAChB,OAAO,MAAM,CAAC,UAAU,IAAI,GAAG,CAAA;IACjC,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAU,sBAAsB,CAAC,CAAA;IAE3E,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,eAAe,GAAG,GAAG,EAAE;YAC3B,YAAY,CAAC,MAAM,CAAC,UAAU,IAAI,GAAG,CAAC,CAAA;QACxC,CAAC,CAAA;QAED,eAAe,EAAE,CAAA;QACjB,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAA;QAElD,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAA;QACvD,CAAC,CAAA;IACH,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO,SAAS,CAAA;AAClB,CAAC"}
|
package/lib/index.d.ts
CHANGED
package/lib/index.js
CHANGED
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,eAAe,QAAQ,CAAA;AACvB,cAAc,SAAS,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { LeadingType } from '@pixum/menu-item';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { ComboBoxOptionProps } from '../types';
|
|
4
|
+
interface ComboBoxGroupedOptionsProps {
|
|
5
|
+
group: string;
|
|
6
|
+
items: ComboBoxOptionProps[];
|
|
7
|
+
selectedOption?: string;
|
|
8
|
+
onClick?: (value: string) => void;
|
|
9
|
+
onKeyDown: (e: React.KeyboardEvent, value: string) => void;
|
|
10
|
+
leadingType?: LeadingType;
|
|
11
|
+
}
|
|
12
|
+
export declare function ComboBoxGroupedOptions(props: ComboBoxGroupedOptionsProps): React.JSX.Element;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import Text, { TextVariant } from '@pixum/text';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { ComboBoxOptions } from './ComboBoxOptions';
|
|
4
|
+
export function ComboBoxGroupedOptions(props) {
|
|
5
|
+
const { group, items, selectedOption, onClick, onKeyDown, leadingType } = props;
|
|
6
|
+
return (React.createElement("div", { className: "combobox__options-group", key: `combobox__options-group-${group}` },
|
|
7
|
+
React.createElement(Text, { variant: TextVariant.HEADLINE, className: "combobox__sticky-header" }, group),
|
|
8
|
+
React.createElement(ComboBoxOptions, { items: items, selectedOption: selectedOption, onClick: onClick, onKeyDown: onKeyDown, leadingType: leadingType })));
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=ComboBoxGroupedOptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ComboBoxGroupedOptions.js","sourceRoot":"","sources":["../../src/partials/ComboBoxGroupedOptions.tsx"],"names":[],"mappings":"AACA,OAAO,IAAI,EAAE,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAYnD,MAAM,UAAU,sBAAsB,CAAC,KAAkC;IACvE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,GACrE,KAAK,CAAA;IACP,OAAO,CACL,6BACE,SAAS,EAAC,yBAAyB,EACnC,GAAG,EAAE,2BAA2B,KAAK,EAAE;QAEvC,oBAAC,IAAI,IAAC,OAAO,EAAE,WAAW,CAAC,QAAQ,EAAE,SAAS,EAAC,yBAAyB,IACrE,KAAK,CACD;QACP,oBAAC,eAAe,IACd,KAAK,EAAE,KAAK,EACZ,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,WAAW,GACxB,CACE,CACP,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import React, { useEffect } from 'react';
|
|
2
|
+
import Menu from '@pixum/menu';
|
|
3
|
+
import { scrollOptionToViewport } from '../helper';
|
|
4
|
+
import { ComboBoxOptions } from './ComboBoxOptions';
|
|
5
|
+
import { ComboBoxGroupedOptions } from './ComboBoxGroupedOptions';
|
|
6
|
+
import { useIsDesktopScreenWidth } from '../hooks';
|
|
7
|
+
export function ComboBoxMenu(props) {
|
|
8
|
+
const { options, onClick, selectedOption, leadingType, optionDetails } = props;
|
|
9
|
+
const isDesktop = useIsDesktopScreenWidth();
|
|
10
|
+
const handleOnKeyDown = (e, value) => {
|
|
11
|
+
if (e.key === 'Enter') {
|
|
12
|
+
onClick === null || onClick === void 0 ? void 0 : onClick(value);
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
scrollOptionToViewport(isDesktop);
|
|
17
|
+
}, [isDesktop]);
|
|
18
|
+
return (React.createElement(Menu, { className: "combobox__options" },
|
|
19
|
+
Array.isArray(options) ? (React.createElement(ComboBoxOptions, { items: options, selectedOption: selectedOption, onClick: onClick, onKeyDown: handleOnKeyDown, leadingType: leadingType })) : (React.createElement(React.Fragment, null, Object.entries(options).map(([group, items]) => (React.createElement(ComboBoxGroupedOptions, { group: group, items: items, selectedOption: selectedOption, onClick: onClick, onKeyDown: handleOnKeyDown, leadingType: leadingType }))))),
|
|
20
|
+
optionDetails && (React.createElement("div", { className: "combobox__option-details text--caption" }, optionDetails))));
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=ComboBoxMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ComboBoxMenu.js","sourceRoot":"","sources":["../../src/partials/ComboBoxMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACxC,OAAO,IAAI,MAAM,aAAa,CAAA;AAC9B,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAA;AAElD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAA;AAElD,MAAM,UAAU,YAAY,CAAC,KAA2B;IACtD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,KAAK,CAAA;IAC9E,MAAM,SAAS,GAAG,uBAAuB,EAAE,CAAA;IAE3C,MAAM,eAAe,GAAG,CAAC,CAAsB,EAAE,KAAa,EAAE,EAAE;QAChE,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;YACtB,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAG,KAAK,CAAC,CAAA;QAClB,CAAC;IACH,CAAC,CAAA;IAED,SAAS,CAAC,GAAG,EAAE;QACb,sBAAsB,CAAC,SAAS,CAAC,CAAA;IACnC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;IAEf,OAAO,CACL,oBAAC,IAAI,IAAC,SAAS,EAAC,mBAAmB;QAChC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CACxB,oBAAC,eAAe,IACd,KAAK,EAAE,OAAO,EACd,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,eAAe,EAC1B,WAAW,EAAE,WAAW,GACxB,CACH,CAAC,CAAC,CAAC,CACF,0CACG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAC/C,oBAAC,sBAAsB,IACrB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,KAAK,EACZ,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,eAAe,EAC1B,WAAW,EAAE,WAAW,GACxB,CACH,CAAC,CACD,CACJ;QACA,aAAa,IAAI,CAChB,6BAAK,SAAS,EAAC,wCAAwC,IACpD,aAAa,CACV,CACP,CACI,CACR,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ComboBoxOptionsProps } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* ComboBoxOptions component that renders a list of options in a menu.
|
|
4
|
+
* Handles both grouped and ungrouped options and automatically scrolls to the selected option.
|
|
5
|
+
*
|
|
6
|
+
* @param props - The props for the ComboBoxOptions component
|
|
7
|
+
* @returns A menu containing the combobox options
|
|
8
|
+
*/
|
|
9
|
+
export declare function ComboBoxOptions({ options, onClick, selectedOption, leadingType, optionDetails, }: ComboBoxOptionsProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export default ComboBoxOptions;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect } from 'react';
|
|
3
|
+
import Menu from '@pixum/menu';
|
|
4
|
+
import { scrollOptionToViewport } from '../utils';
|
|
5
|
+
import { useIsDesktopScreenWidth } from '../hooks';
|
|
6
|
+
import { ComboxBoxOptionsWithGrouping } from './ComboBoxOptionsWithGrouping';
|
|
7
|
+
import { ComboBoxOptionsItems } from './ComboBoxOptionsItems';
|
|
8
|
+
/**
|
|
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.
|
|
11
|
+
*
|
|
12
|
+
* @param props - The props for the ComboBoxOptions component
|
|
13
|
+
* @returns A menu containing the combobox options
|
|
14
|
+
*/
|
|
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 }))] }));
|
|
27
|
+
}
|
|
28
|
+
export default ComboBoxOptions;
|
|
29
|
+
//# sourceMappingURL=ComboBoxOptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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,sBAAsB,EAAE,MAAM,UAAU,CAAA;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAA;AAElD,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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { LeadingType } from '@pixum/menu-item';
|
|
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.) */
|
|
14
|
+
leadingType?: LeadingType;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* ComboBoxOptionsItems component that renders individual menu items.
|
|
18
|
+
* Handles click events and displays selected state for each option.
|
|
19
|
+
*
|
|
20
|
+
* @param props - The props for the ComboBoxOptionsItems component
|
|
21
|
+
* @returns A list of clickable menu items
|
|
22
|
+
*/
|
|
23
|
+
export declare function ComboBoxOptionsItems({ items, selectedOption, onClick, leadingType, }: ComboBoxOptionsItemsProps): import("react/jsx-runtime").JSX.Element;
|
|
24
|
+
export {};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import MenuItem from '@pixum/menu-item';
|
|
3
|
+
import clsx from 'clsx';
|
|
4
|
+
/**
|
|
5
|
+
* ComboBoxOptionsItems component that renders individual menu items.
|
|
6
|
+
* Handles click events and displays selected state for each option.
|
|
7
|
+
*
|
|
8
|
+
* @param props - The props for the ComboBoxOptionsItems component
|
|
9
|
+
* @returns A list of clickable menu items
|
|
10
|
+
*/
|
|
11
|
+
export function ComboBoxOptionsItems({ items, selectedOption, onClick, leadingType, }) {
|
|
12
|
+
return (_jsx(_Fragment, { children: items.map((item) => {
|
|
13
|
+
var _a;
|
|
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}`));
|
|
22
|
+
}) }));
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=ComboBoxOptionsItems.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ComboBoxOptionsItems.js","sourceRoot":"","sources":["../../src/partials/ComboBoxOptionsItems.tsx"],"names":[],"mappings":";AAAA,OAAO,QAA6C,MAAM,kBAAkB,CAAA;AAC5E,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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { LeadingType } from '@pixum/menu-item';
|
|
2
|
+
import type { ComboBoxOptionItemProps } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Props for the ComboBoxOptionsWithGrouping component
|
|
5
|
+
*/
|
|
6
|
+
interface ComboBoxOptionsWithGroupingProps {
|
|
7
|
+
/** Group name/header text */
|
|
8
|
+
group: string;
|
|
9
|
+
/** Array of option items in this group */
|
|
10
|
+
items: ComboBoxOptionItemProps[];
|
|
11
|
+
/** Currently selected option value */
|
|
12
|
+
selectedOption?: string;
|
|
13
|
+
/** Callback fired when an option is clicked */
|
|
14
|
+
onClick?: (value: string) => void;
|
|
15
|
+
/** Type of leading element to display (icon, avatar, etc.) */
|
|
16
|
+
leadingType?: LeadingType;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* ComboBoxOptionsWithGrouping component that renders a group of options with a header.
|
|
20
|
+
* Used to display categorized/grouped options in the combobox.
|
|
21
|
+
*
|
|
22
|
+
* @param props - The props for the ComboBoxOptionsWithGrouping component
|
|
23
|
+
* @returns A group container with a sticky header and option items
|
|
24
|
+
*/
|
|
25
|
+
export declare function ComboxBoxOptionsWithGrouping({ group, items, selectedOption, onClick, leadingType, }: ComboBoxOptionsWithGroupingProps): import("react/jsx-runtime").JSX.Element;
|
|
26
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import Text, { TextVariant } from '@pixum/text';
|
|
3
|
+
import { ComboBoxOptionsItems } from './ComboBoxOptionsItems';
|
|
4
|
+
/**
|
|
5
|
+
* ComboBoxOptionsWithGrouping component that renders a group of options with a header.
|
|
6
|
+
* Used to display categorized/grouped options in the combobox.
|
|
7
|
+
*
|
|
8
|
+
* @param props - The props for the ComboBoxOptionsWithGrouping component
|
|
9
|
+
* @returns A group container with a sticky header and option items
|
|
10
|
+
*/
|
|
11
|
+
export function ComboxBoxOptionsWithGrouping({ group, items, selectedOption, onClick, leadingType, }) {
|
|
12
|
+
return (_jsxs("div", { className: "combobox__options-group", children: [_jsx(Text, { variant: TextVariant.HEADLINE, className: "combobox__sticky-header", children: group }), _jsx(ComboBoxOptionsItems, { items: items, selectedOption: selectedOption, onClick: onClick, leadingType: leadingType })] }, `combobox__options-group-${group}`));
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=ComboBoxOptionsWithGrouping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ComboBoxOptionsWithGrouping.js","sourceRoot":"","sources":["../../src/partials/ComboBoxOptionsWithGrouping.tsx"],"names":[],"mappings":";AACA,OAAO,IAAI,EAAE,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAkB7D;;;;;;GAMG;AACH,MAAM,UAAU,4BAA4B,CAAC,EAC3C,KAAK,EACL,KAAK,EACL,cAAc,EACd,OAAO,EACP,WAAW,GACsB;IACjC,OAAO,CACL,eACE,SAAS,EAAC,yBAAyB,aAGnC,KAAC,IAAI,IAAC,OAAO,EAAE,WAAW,CAAC,QAAQ,EAAE,SAAS,EAAC,yBAAyB,YACrE,KAAK,GACD,EACP,KAAC,oBAAoB,IACnB,KAAK,EAAE,KAAK,EACZ,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,WAAW,GACxB,KAVG,2BAA2B,KAAK,EAAE,CAWnC,CACP,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
package/lib/styles.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.combobox{width:100
|
|
1
|
+
.combobox{position:relative;width:100%}.combobox .combobox--headline[class*=text--]+*{margin-top:var(--spacing)}.combobox .combobox--header,.combobox .combobox__options,.combobox__bottom-sheet .combobox__options{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__bottom-sheet .combobox__options{display:flex;flex-direction:column;max-height:none;overflow:scroll;width:100%}.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{border-radius:12px;margin-top:var(--spacing);max-height:330px;overflow:auto;position:absolute}}
|
package/lib/types.d.ts
CHANGED
|
@@ -1,36 +1,70 @@
|
|
|
1
1
|
import { LeadingType, MenuItemProps } from '@pixum/menu-item';
|
|
2
2
|
import { ThemeType } from '@pixum/theme-provider';
|
|
3
3
|
import { InputModesType } from '@pixum/web-input';
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Props for the ComboBoxOptions component
|
|
6
|
+
*/
|
|
7
|
+
export interface ComboBoxOptionsProps {
|
|
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 */
|
|
6
11
|
selectedOption?: string;
|
|
12
|
+
/** Callback fired when an option is clicked */
|
|
7
13
|
onClick?: (value: string) => void;
|
|
14
|
+
/** Type of leading element to display (icon, avatar, etc.) */
|
|
8
15
|
leadingType?: LeadingType;
|
|
16
|
+
/** Additional details to display below the options */
|
|
9
17
|
optionDetails?: React.ReactNode;
|
|
10
18
|
}
|
|
11
|
-
|
|
19
|
+
/**
|
|
20
|
+
* Props for the ComboBox component
|
|
21
|
+
*/
|
|
22
|
+
export interface ComboBoxProps extends ComboBoxOptionsProps {
|
|
23
|
+
/** Additional CSS class name for the component */
|
|
12
24
|
className?: string;
|
|
25
|
+
/** Name attribute for the input field */
|
|
13
26
|
name?: string;
|
|
27
|
+
/** Headline text displayed in mobile bottom sheet */
|
|
14
28
|
headline?: string;
|
|
29
|
+
/** Helper text displayed below the input */
|
|
15
30
|
helperText?: string;
|
|
31
|
+
/** ID attribute for the input field */
|
|
16
32
|
id?: string;
|
|
33
|
+
/** Label text for the input field */
|
|
17
34
|
label?: string;
|
|
35
|
+
/** Whether the dropdown/bottom sheet is currently open */
|
|
18
36
|
isOpen: boolean;
|
|
37
|
+
/** State setter function to control open/close state */
|
|
19
38
|
setIsOpen: React.Dispatch<React.SetStateAction<boolean>>;
|
|
39
|
+
/** Callback fired when the search input value changes */
|
|
20
40
|
onChange?: (value: string) => void;
|
|
41
|
+
/** Callback fired when an option item is clicked */
|
|
21
42
|
onOptionItemClick?: (value: string) => void;
|
|
43
|
+
/** Callback fired when user clicks outside the component */
|
|
22
44
|
onOutsideClick?: () => void;
|
|
45
|
+
/** Callback fired when the input field is clicked */
|
|
23
46
|
onClick?: () => void;
|
|
47
|
+
/** Callback fired when the bottom sheet is closed */
|
|
24
48
|
onSheetClose?: () => void;
|
|
49
|
+
/** Placeholder text for the input field */
|
|
25
50
|
placeholder?: string;
|
|
51
|
+
/** Search pattern/regex for input validation */
|
|
26
52
|
searchPattern?: string;
|
|
53
|
+
/** Current value of the combobox */
|
|
27
54
|
value?: string;
|
|
55
|
+
/** Text to display when no results are found */
|
|
28
56
|
noResultsText?: string;
|
|
57
|
+
/** Input mode for mobile keyboards (text, numeric, etc.) */
|
|
29
58
|
inputMode?: InputModesType;
|
|
59
|
+
/** Whether to show the search input field */
|
|
30
60
|
withSearch?: boolean;
|
|
61
|
+
/** Theme configuration for the component */
|
|
31
62
|
theme?: ThemeType;
|
|
32
63
|
}
|
|
33
|
-
|
|
64
|
+
/**
|
|
65
|
+
* Props for individual ComboBox option items
|
|
66
|
+
*/
|
|
67
|
+
export interface ComboBoxOptionItemProps extends MenuItemProps {
|
|
68
|
+
/** Unique key for the option item */
|
|
34
69
|
key?: string;
|
|
35
70
|
}
|
|
36
|
-
export { ComboBoxProps, ComboBoxOptionProps, ComboBoxOptionsProps };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calculates the maximum height for the options list based on viewport height.
|
|
3
|
+
* Subtracts the header and input field heights from the window height.
|
|
4
|
+
*
|
|
5
|
+
* @returns The maximum height in pixels for the options list
|
|
6
|
+
*/
|
|
7
|
+
export declare function calculateListMaxHeight(): number;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calculates the maximum height for the options list based on viewport height.
|
|
3
|
+
* Subtracts the header and input field heights from the window height.
|
|
4
|
+
*
|
|
5
|
+
* @returns The maximum height in pixels for the options list
|
|
6
|
+
*/
|
|
7
|
+
export function calculateListMaxHeight() {
|
|
8
|
+
const windowHeight = window.innerHeight;
|
|
9
|
+
const headerHeight = 50;
|
|
10
|
+
const inputFieldHeight = 35;
|
|
11
|
+
const maxListHeight = windowHeight - headerHeight - inputFieldHeight;
|
|
12
|
+
return maxListHeight;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=calculateListMaxHeight.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calculateListMaxHeight.js","sourceRoot":"","sources":["../../src/utils/calculateListMaxHeight.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB;IAClC,MAAM,YAAY,GAAG,MAAM,CAAC,WAAW,CAAA;IACvC,MAAM,YAAY,GAAG,EAAE,CAAA;IACvB,MAAM,gBAAgB,GAAG,EAAE,CAAA;IAC3B,MAAM,aAAa,GAAG,YAAY,GAAG,YAAY,GAAG,gBAAgB,CAAA;IAErE,OAAO,aAAa,CAAA;AACvB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAA;AACxC,cAAc,0BAA0B,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scrolls the selected option into view within the options container.
|
|
3
|
+
* Handles both desktop dropdown and mobile bottom sheet layouts.
|
|
4
|
+
*
|
|
5
|
+
* @param isDesktop - Whether the viewport is desktop size
|
|
6
|
+
*/
|
|
7
|
+
export declare function scrollOptionToViewport(isDesktop: boolean): void;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scrolls the selected option into view within the options container.
|
|
3
|
+
* Handles both desktop dropdown and mobile bottom sheet layouts.
|
|
4
|
+
*
|
|
5
|
+
* @param isDesktop - Whether the viewport is desktop size
|
|
6
|
+
*/
|
|
7
|
+
export function scrollOptionToViewport(isDesktop) {
|
|
8
|
+
const comboboxOptions = isDesktop
|
|
9
|
+
? document.querySelector('.combobox .menu')
|
|
10
|
+
: document.querySelector('.combobox__options .menu');
|
|
11
|
+
const selectedItem = document.querySelector('.menu-item.selected');
|
|
12
|
+
if (!selectedItem || !comboboxOptions) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
// Find the options group that contains the selected item
|
|
16
|
+
const comboboxOptionsGroup = selectedItem.closest('.combobox__options-group');
|
|
17
|
+
if (comboboxOptionsGroup) {
|
|
18
|
+
// For grouped options, scroll to the group header
|
|
19
|
+
const stickyHeader = comboboxOptionsGroup.querySelector('.combobox__sticky-header');
|
|
20
|
+
if (stickyHeader) {
|
|
21
|
+
const headerTop = stickyHeader.offsetTop;
|
|
22
|
+
comboboxOptions.scrollTo({ top: headerTop, behavior: 'smooth' });
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
// For ungrouped options, scroll to the selected item
|
|
27
|
+
const selectedItemTop = selectedItem.offsetTop;
|
|
28
|
+
const selectedItemHeight = selectedItem.offsetHeight;
|
|
29
|
+
const containerHeight = comboboxOptions.clientHeight;
|
|
30
|
+
// Center the item in the viewport
|
|
31
|
+
const scrollTop = selectedItemTop - containerHeight / 2 + selectedItemHeight / 2;
|
|
32
|
+
comboboxOptions.scrollTo({
|
|
33
|
+
top: Math.max(0, scrollTop),
|
|
34
|
+
behavior: 'smooth',
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=scrollOptionToViewport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrollOptionToViewport.js","sourceRoot":"","sources":["../../src/utils/scrollOptionToViewport.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,SAAkB;IACvD,MAAM,eAAe,GAAG,SAAS;QAC/B,CAAC,CAAE,QAAQ,CAAC,aAAa,CAAC,iBAAiB,CAAiB;QAC5D,CAAC,CAAE,QAAQ,CAAC,aAAa,CAAC,0BAA0B,CAAiB,CAAA;IACvE,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CACzC,qBAAqB,CACP,CAAA;IAEhB,IAAI,CAAC,YAAY,IAAI,CAAC,eAAe,EAAE,CAAC;QACtC,OAAM;IACR,CAAC;IAED,yDAAyD;IACzD,MAAM,oBAAoB,GAAG,YAAY,CAAC,OAAO,CAC/C,0BAA0B,CACZ,CAAA;IAEhB,IAAI,oBAAoB,EAAE,CAAC;QACzB,kDAAkD;QAClD,MAAM,YAAY,GAAG,oBAAoB,CAAC,aAAa,CACrD,0BAA0B,CACZ,CAAA;QAEhB,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,YAAY,CAAC,SAAS,CAAA;YACxC,eAAe,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAA;QAClE,CAAC;IACH,CAAC;SAAM,CAAC;QACN,qDAAqD;QACrD,MAAM,eAAe,GAAG,YAAY,CAAC,SAAS,CAAA;QAC9C,MAAM,kBAAkB,GAAG,YAAY,CAAC,YAAY,CAAA;QACpD,MAAM,eAAe,GAAG,eAAe,CAAC,YAAY,CAAA;QAEpD,kCAAkC;QAClC,MAAM,SAAS,GACb,eAAe,GAAG,eAAe,GAAG,CAAC,GAAG,kBAAkB,GAAG,CAAC,CAAA;QAChE,eAAe,CAAC,QAAQ,CAAC;YACvB,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC;YAC3B,QAAQ,EAAE,QAAQ;SACnB,CAAC,CAAA;IACJ,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,19 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pixum/combobox",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.21-alpha.96+4413efbe6",
|
|
4
4
|
"main": "lib/index.js",
|
|
5
5
|
"module": "lib/index.js",
|
|
6
6
|
"license": "UNLICENSED",
|
|
7
7
|
"peerDependencies": {
|
|
8
8
|
"@pixum/bottom-sheet": "3.0.18",
|
|
9
|
-
"@pixum/button": "4.1.20",
|
|
10
9
|
"@pixum/menu": "3.0.14",
|
|
11
10
|
"@pixum/menu-item": "2.0.14",
|
|
12
|
-
"@pixum/svg-icon": "5.8.1",
|
|
13
11
|
"@pixum/text": "2.0.20",
|
|
14
12
|
"@pixum/theme-provider": "4.2.20",
|
|
15
|
-
"@pixum/
|
|
16
|
-
"@pixum/web-input": "1.0.19"
|
|
13
|
+
"@pixum/web-input": "2.0.0"
|
|
17
14
|
},
|
|
18
15
|
"files": [
|
|
19
16
|
"lib"
|
|
@@ -21,5 +18,5 @@
|
|
|
21
18
|
"sideEffects": [
|
|
22
19
|
"*.css"
|
|
23
20
|
],
|
|
24
|
-
"gitHead": "
|
|
21
|
+
"gitHead": "4413efbe6c53288349f68811108039eab060dcf2"
|
|
25
22
|
}
|