@pixum/combobox 5.10.4-alpha.9 → 5.10.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/lib/ComboBox.d.ts +6 -32
  2. package/lib/ComboBox.js +77 -217
  3. package/lib/ComboBox.js.map +1 -1
  4. package/lib/ComboboxOptions/Options.d.ts +1 -0
  5. package/lib/ComboboxOptions/Options.js +22 -17
  6. package/lib/ComboboxOptions/Options.js.map +1 -1
  7. package/lib/ComboboxOptions/OptionsGroup.d.ts +1 -0
  8. package/lib/ComboboxOptions/OptionsGroup.js +48 -7
  9. package/lib/ComboboxOptions/OptionsGroup.js.map +1 -1
  10. package/lib/ComboboxOptions/index.js +61 -16
  11. package/lib/ComboboxOptions/index.js.map +1 -1
  12. package/lib/helper/calculateListMaxHeight.js +9 -5
  13. package/lib/helper/calculateListMaxHeight.js.map +1 -1
  14. package/lib/helper/index.d.ts +2 -0
  15. package/lib/helper/index.js +3 -0
  16. package/lib/helper/index.js.map +1 -0
  17. package/lib/helper/scrollOptionToViewport.js +12 -9
  18. package/lib/helper/scrollOptionToViewport.js.map +1 -1
  19. package/lib/helper/useIsDesktopScreenWidth.js +11 -9
  20. package/lib/helper/useIsDesktopScreenWidth.js.map +1 -1
  21. package/lib/hooks/index.d.ts +0 -2
  22. package/lib/hooks/index.js +0 -2
  23. package/lib/hooks/index.js.map +1 -1
  24. package/lib/hooks/useIsDesktopScreenWidth.d.ts +0 -5
  25. package/lib/hooks/useIsDesktopScreenWidth.js +24 -34
  26. package/lib/hooks/useIsDesktopScreenWidth.js.map +1 -1
  27. package/lib/index.d.ts +4 -4
  28. package/lib/index.js +3 -2
  29. package/lib/index.js.map +1 -1
  30. package/lib/partials/ComboBoxGroupedOptions.d.ts +13 -0
  31. package/lib/partials/ComboBoxGroupedOptions.js +10 -0
  32. package/lib/partials/ComboBoxGroupedOptions.js.map +1 -0
  33. package/lib/partials/ComboBoxMenu.d.ts +3 -0
  34. package/lib/partials/ComboBoxMenu.js +22 -0
  35. package/lib/partials/ComboBoxMenu.js.map +1 -0
  36. package/lib/partials/ComboBoxOptions.d.ts +5 -16
  37. package/lib/partials/ComboBoxOptions.js +21 -25
  38. package/lib/partials/ComboBoxOptions.js.map +1 -1
  39. package/lib/partials/ComboBoxOptionsItems.d.ts +17 -32
  40. package/lib/partials/ComboBoxOptionsItems.js +14 -46
  41. package/lib/partials/ComboBoxOptionsItems.js.map +1 -1
  42. package/lib/partials/ComboBoxOptionsSlot.d.ts +16 -17
  43. package/lib/partials/ComboBoxOptionsSlot.js +11 -26
  44. package/lib/partials/ComboBoxOptionsSlot.js.map +1 -1
  45. package/lib/partials/index.d.ts +1 -2
  46. package/lib/partials/index.js +1 -2
  47. package/lib/partials/index.js.map +1 -1
  48. package/lib/types.d.ts +45 -183
  49. package/lib/utils/index.d.ts +2 -1
  50. package/lib/utils/index.js +2 -1
  51. package/lib/utils/index.js.map +1 -1
  52. package/package.json +8 -8
  53. package/lib/ComboBox.module.css +0 -1
  54. package/lib/hooks/useComboBox.d.ts +0 -60
  55. package/lib/hooks/useComboBox.js +0 -226
  56. package/lib/hooks/useComboBox.js.map +0 -1
  57. package/lib/hooks/useComboBoxFocus.d.ts +0 -35
  58. package/lib/hooks/useComboBoxFocus.js +0 -49
  59. package/lib/hooks/useComboBoxFocus.js.map +0 -1
  60. package/lib/partials/ComboBoxNoResults.d.ts +0 -14
  61. package/lib/partials/ComboBoxNoResults.js +0 -18
  62. package/lib/partials/ComboBoxNoResults.js.map +0 -1
  63. package/lib/partials/ComboBoxOptionsGroup.d.ts +0 -15
  64. package/lib/partials/ComboBoxOptionsGroup.js +0 -31
  65. package/lib/partials/ComboBoxOptionsGroup.js.map +0 -1
  66. package/lib/utils/options.d.ts +0 -77
  67. package/lib/utils/options.js +0 -145
  68. package/lib/utils/options.js.map +0 -1
@@ -1,19 +1,64 @@
1
- import React, { useEffect } from 'react';
2
- import Menu from '@pixum/menu';
3
- import { scrollOptionToViewport } from '../helper/scrollOptionToViewport';
4
- import OptionsGroup from './OptionsGroup';
5
- import Options from './Options';
6
- import useIsDesktopScreenWidth from '../helper/useIsDesktopScreenWidth';
7
- const ComboBoxOptions = ({ options, onClick, selectedOption, leadingType, optionDetails, }) => {
8
- const isDesktop = useIsDesktopScreenWidth();
9
- const optionsWithoutGroup = Array.isArray(options);
10
- const optionsWithGroup = Object.entries(options);
11
- useEffect(() => {
12
- scrollOptionToViewport(isDesktop);
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 (React.createElement(Menu, { className: "combobox__options scrollable", "data-tappable": "true" },
15
- optionsWithoutGroup ? (React.createElement(Options, { items: options, selectedOption: selectedOption, onClick: onClick, leadingType: leadingType })) : (React.createElement(React.Fragment, null, optionsWithGroup.map(([group, items]) => (React.createElement(OptionsGroup, { group: group, items: items, selectedOption: selectedOption, onClick: onClick, leadingType: leadingType }))))),
16
- optionDetails && (React.createElement("div", { className: "combobox__option-details text--caption" }, optionDetails))));
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
- export default ComboBoxOptions;
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,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACxC,OAAO,IAAI,MAAM,aAAa,CAAA;AAC9B,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AAEzE,OAAO,YAAY,MAAM,gBAAgB,CAAA;AACzC,OAAO,OAAO,MAAM,WAAW,CAAA;AAC/B,OAAO,uBAAuB,MAAM,mCAAmC,CAAA;AAEvE,MAAM,eAAe,GAAmC,CAAC,EACvD,OAAO,EACP,OAAO,EACP,cAAc,EACd,WAAW,EACX,aAAa,GACd,EAAE,EAAE;IACH,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,sBAAsB,CAAC,SAAS,CAAC,CAAA;IACnC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;IAEf,OAAO,CACL,oBAAC,IAAI,IACH,SAAS,EAAC,8BAA8B,mBAC1B,MAAM;QAEnB,mBAAmB,CAAC,CAAC,CAAC,CACrB,oBAAC,OAAO,IACN,KAAK,EAAE,OAAO,EACd,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,WAAW,GACxB,CACH,CAAC,CAAC,CAAC,CACF,0CACG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CACxC,oBAAC,YAAY,IACX,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,KAAK,EACZ,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,OAAO,EAChB,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,CAAA;AAED,eAAe,eAAe,CAAA"}
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
- export const calculateListMaxHeight = () => {
2
- const windowHeight = window.innerHeight;
3
- const headerHeight = 50;
4
- const inputFieldHeight = 35;
5
- const maxListHeight = windowHeight - headerHeight - inputFieldHeight;
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":"AAAA,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,EAAE;IACvC,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;AAEvB,CAAC,CAAA"}
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,2 @@
1
+ export * from './calculateListMaxHeight';
2
+ export * from './scrollOptionToViewport';
@@ -0,0 +1,3 @@
1
+ export * from './calculateListMaxHeight';
2
+ export * from './scrollOptionToViewport';
3
+ //# sourceMappingURL=index.js.map
@@ -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
- export const scrollOptionToViewport = (isDesktop) => {
2
- const comboboxOptions = isDesktop
3
- ? document.querySelector('.menu')
4
- : document.querySelector('.combobox__options');
5
- const selectedItem = document.querySelector('.menu-item.selected');
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
- let comboboxOptionsGroup = selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.parentElement;
9
+ var comboboxOptionsGroup = selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.parentElement;
8
10
  if (comboboxOptionsGroup) {
9
- const stickyHeader = comboboxOptionsGroup === null || comboboxOptionsGroup === void 0 ? void 0 : comboboxOptionsGroup.querySelector('.sticky-header');
10
- const stickyHeaderOffset = stickyHeader === null || stickyHeader === void 0 ? void 0 : stickyHeader.offsetTop;
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
- const selectedItemOffset = selectedItem === null || selectedItem === void 0 ? void 0 : selectedItem.offsetTop;
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":"AAAA,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,SAAkB,EAAE,EAAE;IAC3D,MAAM,eAAe,GAAG,SAAS;QAC/B,CAAC,CAAE,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAiB;QAClD,CAAC,CAAE,QAAQ,CAAC,aAAa,CAAC,oBAAoB,CAAiB,CAAA;IACjE,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CACzC,qBAAqB,CACP,CAAA;IAEhB,IAAI,YAAY,IAAI,eAAe,EAAE,CAAC;QACpC,IAAI,oBAAoB,GAAG,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,aAAa,CAAA;QAEtD,IAAI,oBAAoB,EAAE,CAAC;YACzB,MAAM,YAAY,GAAG,oBAAoB,aAApB,oBAAoB,uBAApB,oBAAoB,CAAE,aAAa,CACtD,gBAAgB,CACF,CAAA;YAChB,MAAM,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;QACxD,CAAC;aAAM,CAAC;YACN,MAAM,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;QACxD,CAAC;IACH,CAAC;AACH,CAAC,CAAA"}
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
- import { useState, useEffect } from 'react';
2
- const useIsDesktopScreenWidth = () => {
3
- const hasWindowObject = typeof window !== 'undefined';
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
- const [screenWidth, setScreenWidth] = useState(window.innerWidth);
6
- useEffect(() => {
7
- const handleResize = () => {
8
- setScreenWidth(window.innerWidth);
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
- export default useIsDesktopScreenWidth;
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,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAE3C,MAAM,uBAAuB,GAAG,GAAG,EAAE;IACnC,MAAM,eAAe,GAAG,OAAO,MAAM,KAAK,WAAW,CAAA;IAErD,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;QAEjE,SAAS,CAAC,GAAG,EAAE;YACb,MAAM,YAAY,GAAG,GAAG,EAAE;gBACxB,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;YACnC,CAAC,CAAA;YAED,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;YAE/C,OAAO,GAAG,EAAE;gBACV,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,eAAe,uBAAuB,CAAA"}
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"}
@@ -1,3 +1 @@
1
1
  export * from './useIsDesktopScreenWidth';
2
- export * from './useComboBox';
3
- export * from './useComboBoxFocus';
@@ -1,4 +1,2 @@
1
1
  export * from './useIsDesktopScreenWidth';
2
- export * from './useComboBox';
3
- export * from './useComboBoxFocus';
4
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAA;AACzC,cAAc,eAAe,CAAA;AAC7B,cAAc,oBAAoB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAA"}
@@ -1,6 +1 @@
1
- /**
2
- * Custom hook that detects whether the viewport width is desktop size (>= 960px).
3
- *
4
- * @returns True if the viewport width is 960px or greater, false otherwise
5
- */
6
1
  export declare function useIsDesktopScreenWidth(): boolean;
@@ -1,46 +1,36 @@
1
- 'use client';
2
- import { useSyncExternalStore } from 'react';
3
- const DESKTOP_MEDIA_QUERY = '(min-width: 960px)';
1
+ import { useState, useEffect } from 'react';
4
2
  /**
5
- * Subscribes to the MediaQueryList. Using `change` instead of `resize` means
6
- * there is only one re-render when the breakpoint is actually crossed.
7
- *
8
- * @param onStoreChange - Callback invoked when the breakpoint match changes
9
- * @returns An unsubscribe function that removes the listener
10
- */
11
- function subscribe(onStoreChange) {
12
- if (typeof window === 'undefined' || !window.matchMedia) {
13
- return () => { };
14
- }
15
- const mediaQueryList = window.matchMedia(DESKTOP_MEDIA_QUERY);
16
- mediaQueryList.addEventListener('change', onStoreChange);
17
- return () => mediaQueryList.removeEventListener('change', onStoreChange);
18
- }
19
- /**
20
- * Client snapshot: the current match state of the desktop breakpoint.
3
+ * Custom hook that detects whether the viewport width is desktop size (>= 960px).
4
+ * Listens to window resize events to update the state dynamically.
21
5
  *
22
- * @returns True if the desktop breakpoint currently matches, false otherwise
6
+ * @returns True if the viewport width is 960px or greater, false otherwise
23
7
  */
24
- function getSnapshot() {
25
- if (typeof window === 'undefined' || !window.matchMedia)
26
- return false;
27
- return window.matchMedia(DESKTOP_MEDIA_QUERY).matches;
8
+ function isBrowser() {
9
+ return typeof window !== 'undefined';
28
10
  }
29
11
  /**
30
- * Server snapshot: deliberately `false` (mobile first), so that the server
31
- * render and the first client render match deterministically.
12
+ * Checks if the current viewport width is desktop size (>= 960px).
32
13
  *
33
- * @returns Always false
14
+ * @returns True if the viewport is desktop size, false otherwise or in non-browser environments
34
15
  */
35
- function getServerSnapshot() {
16
+ function isInitialScreenDesktop() {
17
+ if (isBrowser()) {
18
+ return window.innerWidth >= 960;
19
+ }
36
20
  return false;
37
21
  }
38
- /**
39
- * Custom hook that detects whether the viewport width is desktop size (>= 960px).
40
- *
41
- * @returns True if the viewport width is 960px or greater, false otherwise
42
- */
43
22
  export function useIsDesktopScreenWidth() {
44
- return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
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;
45
35
  }
46
36
  //# sourceMappingURL=useIsDesktopScreenWidth.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useIsDesktopScreenWidth.js","sourceRoot":"","sources":["../../src/hooks/useIsDesktopScreenWidth.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAA;AAE5C,MAAM,mBAAmB,GAAG,oBAAoB,CAAA;AAEhD;;;;;;GAMG;AACH,SAAS,SAAS,CAAC,aAAyB;IAC1C,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACxD,OAAO,GAAG,EAAE,GAAE,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAA;IAC7D,cAAc,CAAC,gBAAgB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAA;IAExD,OAAO,GAAG,EAAE,CAAC,cAAc,CAAC,mBAAmB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAA;AAC1E,CAAC;AAED;;;;GAIG;AACH,SAAS,WAAW;IAClB,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,CAAC,MAAM,CAAC,UAAU;QAAE,OAAO,KAAK,CAAA;IAErE,OAAO,MAAM,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAA;AACvD,CAAC;AAED;;;;;GAKG;AACH,SAAS,iBAAiB;IACxB,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO,oBAAoB,CAAC,SAAS,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAA;AACxE,CAAC"}
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
@@ -1,4 +1,4 @@
1
- export { ComboBox, default } from './ComboBox';
2
- export { ComboBoxOptionsSlot, type ComboBoxOptionsSlotProps } from './partials';
3
- export { useComboBox, useIsDesktopScreenWidth } from './hooks';
4
- export type { ComboBoxAriaProps, ComboBoxOption, ComboBoxOptionGroup, ComboBoxOptionItemProps, ComboBoxOptionsInput, ComboBoxOptionsProps, ComboBoxOptionsPanelProps, ComboBoxProps, ListboxAriaProps, } from './types';
1
+ import { ComboBox } from './ComboBox';
2
+ export default ComboBox;
3
+ export * from './types';
4
+ export { ComboBoxOptionsSlot } from './partials';
package/lib/index.js CHANGED
@@ -1,4 +1,5 @@
1
- export { ComboBox, default } from './ComboBox';
1
+ import { ComboBox } from './ComboBox';
2
+ export default ComboBox;
3
+ export * from './types';
2
4
  export { ComboBoxOptionsSlot } from './partials';
3
- export { useComboBox, useIsDesktopScreenWidth } from './hooks';
4
5
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,EAAE,mBAAmB,EAAiC,MAAM,YAAY,CAAA;AAC/E,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,SAAS,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;AACvB,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,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,3 @@
1
+ import React from 'react';
2
+ import { ComboBoxOptionsProps } from '../types';
3
+ export declare function ComboBoxMenu(props: ComboBoxOptionsProps): React.JSX.Element;
@@ -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"}
@@ -1,21 +1,10 @@
1
- import type { ComboBoxOptionsPanelProps } from '../types';
1
+ import type { ComboBoxOptionsProps } from '../types';
2
2
  /**
3
- * Renders the options panel of the ComboBox.
4
- *
5
- * The panel is split in two: the `Menu` provides the visible box, the element
6
- * inside it carries the `listbox` role and is the only part that scrolls. That
7
- * keeps `optionDetails` a real footer - it stays visible without
8
- * `position: sticky` and can no longer cover the active option - and it keeps
9
- * the listbox free of anything that is not an option or a group, as ARIA
10
- * requires.
11
- *
12
- * Flat and grouped options share one render path: the options arrive already
13
- * normalised, `groupOptions` only splits them into their visual groups again.
14
- * The listbox is not focusable - the focus stays in the input field, the active
15
- * option is announced through `aria-activedescendant`.
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.
16
5
  *
17
6
  * @param props - The props for the ComboBoxOptions component
18
- * @returns The options panel
7
+ * @returns A menu containing the combobox options
19
8
  */
20
- export declare function ComboBoxOptions({ options, listboxAriaProps, selectedValues, activeOptionId, leadingType, optionDetails, onOptionClick, }: ComboBoxOptionsPanelProps): import("react/jsx-runtime").JSX.Element;
9
+ export declare function ComboBoxOptions({ options, onClick, selectedOption, leadingType, optionDetails, }: ComboBoxOptionsProps): import("react/jsx-runtime").JSX.Element;
21
10
  export default ComboBoxOptions;
@@ -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 Text, { TEXT_VARIANT } from '@pixum/text';
4
- import clsx from 'clsx';
5
- import { groupOptions } from '../utils';
6
- import { ComboBoxOptionsGroup } from './ComboBoxOptionsGroup';
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
- * Renders the options panel of the ComboBox.
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 The options panel
13
+ * @returns A menu containing the combobox options
25
14
  */
26
- export function ComboBoxOptions({ options, listboxAriaProps, selectedValues, activeOptionId, leadingType, optionDetails, onOptionClick, }) {
27
- return (_jsxs(Menu, { className: styles.panel, "data-tappable": "true", children: [_jsx("div", Object.assign({ className: clsx(styles.options, 'scrollable'), tabIndex: -1 }, listboxAriaProps, { children: groupOptions(options).map(group => {
28
- var _a;
29
- return (_jsx(ComboBoxOptionsGroup, { group: group.group, options: group.options, selectedValues: selectedValues, activeOptionId: activeOptionId, leadingType: leadingType, onOptionClick: onOptionClick }, `combobox__options-group-${(_a = group.group) !== null && _a !== void 0 ? _a : 'default'}`));
30
- }) })), optionDetails && (_jsx(Text, { variant: TEXT_VARIANT.CAPTION, className: styles.optionDetails, children: optionDetails }))] }));
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,IAAI,MAAM,aAAa,CAAA;AAC9B,OAAO,IAAI,EAAE,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,MAAM,MAAM,wBAAwB,CAAA;AAG3C;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,eAAe,CAAC,EAC9B,OAAO,EACP,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,WAAW,EACX,aAAa,EACb,aAAa,GACa;IAC1B,OAAO,CACL,MAAC,IAAI,IAAC,SAAS,EAAE,MAAM,CAAC,KAAK,mBAAgB,MAAM,aACjD,4BACE,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,EAC7C,QAAQ,EAAE,CAAC,CAAC,IACR,gBAAgB,cAEnB,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;;oBAAC,OAAA,CAClC,KAAC,oBAAoB,IAEnB,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,OAAO,EAAE,KAAK,CAAC,OAAO,EACtB,cAAc,EAAE,cAAc,EAC9B,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,aAAa,IANvB,2BAA2B,MAAA,KAAK,CAAC,KAAK,mCAAI,SAAS,EAAE,CAO1D,CACH,CAAA;iBAAA,CAAC,IACE,EAEL,aAAa,IAAI,CAChB,KAAC,IAAI,IAAC,OAAO,EAAE,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,aAAa,YACjE,aAAa,GACT,CACR,IACI,CACR,CAAA;AACH,CAAC;AAED,eAAe,eAAe,CAAA"}
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 { ComboBoxOption } from '../types';
3
- export interface ComboBoxOptionsItemsProps {
4
- /** Normalised options to render. */
5
- options: ComboBoxOption[];
6
- /** Values that are currently selected. */
7
- selectedValues: string[];
8
- /** DOM id of the active option (`aria-activedescendant`). */
9
- activeOptionId?: string;
10
- /** Type of the leading element, e.g. a checkbox for multi select. */
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
- * Renders the individual options.
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 selectable options
21
+ * @returns A list of clickable menu items
38
22
  */
39
- export declare function ComboBoxOptionsItems({ options, selectedValues, activeOptionId, leadingType, onOptionClick, }: ComboBoxOptionsItemsProps): import("react/jsx-runtime").JSX.Element;
23
+ export declare function ComboBoxOptionsItems({ items, selectedOption, onClick, leadingType, }: ComboBoxOptionsItemsProps): import("react/jsx-runtime").JSX.Element;
24
+ export {};