@mlw-packages/react-components 1.10.26 → 1.10.28

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/dist/index.js CHANGED
@@ -22487,10 +22487,15 @@ function useCommandPalette({
22487
22487
  const [query, setQuery] = React32__namespace.useState("");
22488
22488
  const [activeIndex, setActiveIndex] = React32__namespace.useState(0);
22489
22489
  const [page, setPage] = React32__namespace.useState(0);
22490
- const [selectedItemIds, setSelectedItemIds] = React32__namespace.useState(
22491
- /* @__PURE__ */ new Set()
22492
- );
22493
- const toggleSelection = React32__namespace.useCallback((id) => {
22490
+ const [selectedItemIds, setSelectedItemIds] = React32__namespace.useState(/* @__PURE__ */ new Set());
22491
+ const stateRef = React32.useRef({
22492
+ activeIndex,
22493
+ page,
22494
+ flatItems: [],
22495
+ query,
22496
+ selectedItems: []
22497
+ });
22498
+ const toggleSelection = React32.useCallback((id) => {
22494
22499
  setSelectedItemIds((prev) => {
22495
22500
  const next = new Set(prev);
22496
22501
  if (next.has(id)) next.delete(id);
@@ -22498,14 +22503,8 @@ function useCommandPalette({
22498
22503
  return next;
22499
22504
  });
22500
22505
  }, []);
22501
- const clearSelection = React32__namespace.useCallback(
22502
- () => setSelectedItemIds(/* @__PURE__ */ new Set()),
22503
- []
22504
- );
22505
- const baseGroups = React32__namespace.useMemo(
22506
- () => normaliseGroups(items, groups),
22507
- [items, groups]
22508
- );
22506
+ const clearSelection = React32.useCallback(() => setSelectedItemIds(/* @__PURE__ */ new Set()), []);
22507
+ const baseGroups = React32.useMemo(() => normaliseGroups(items, groups), [items, groups]);
22509
22508
  React32.useEffect(() => {
22510
22509
  if (open) {
22511
22510
  setQuery("");
@@ -22514,36 +22513,18 @@ function useCommandPalette({
22514
22513
  clearSelection();
22515
22514
  }
22516
22515
  }, [open, clearSelection]);
22517
- const searchTerms = React32__namespace.useMemo(() => {
22516
+ const searchTerms = React32.useMemo(() => {
22518
22517
  const parts = query.split(",");
22519
22518
  if (parts.length <= 1 && !multiSearch) return [];
22520
22519
  return parts.map((t) => t.trim().toLowerCase()).filter(Boolean);
22521
22520
  }, [query, multiSearch]);
22522
- const allMatchedGroups = React32__namespace.useMemo(() => {
22521
+ const allMatchedGroups = React32.useMemo(() => {
22523
22522
  if (!query.trim()) {
22524
- if (recentItems.length > 0) {
22525
- return [
22526
- {
22527
- id: "__recent__",
22528
- label: "Recent",
22529
- icon: React32__namespace.createElement(react.ClockCounterClockwiseIcon),
22530
- items: recentItems,
22531
- priority: 999
22532
- },
22533
- ...baseGroups
22534
- ];
22535
- }
22536
- return baseGroups;
22537
- }
22538
- if (searchTerms.length > 1 || multiSearch && searchTerms.length > 0) {
22539
- return unionGroups(baseGroups, searchTerms);
22523
+ return recentItems.length > 0 ? [{ id: "__recent__", label: "Recent", icon: React32__namespace.createElement(react.ClockCounterClockwiseIcon), items: recentItems, priority: 999 }, ...baseGroups] : baseGroups;
22540
22524
  }
22541
- return filterAndScore(baseGroups, query);
22525
+ return searchTerms.length > 1 || multiSearch && searchTerms.length > 0 ? unionGroups(baseGroups, searchTerms) : filterAndScore(baseGroups, query);
22542
22526
  }, [query, baseGroups, recentItems, multiSearch, searchTerms]);
22543
- const allFlatItems = React32.useMemo(
22544
- () => allMatchedGroups.flatMap((g) => g.items),
22545
- [allMatchedGroups]
22546
- );
22527
+ const allFlatItems = React32.useMemo(() => allMatchedGroups.flatMap((g) => g.items), [allMatchedGroups]);
22547
22528
  const totalItems = allFlatItems.length;
22548
22529
  const totalPages = Math.max(1, Math.ceil(totalItems / PAGE_SIZE));
22549
22530
  React32.useEffect(() => {
@@ -22565,42 +22546,32 @@ function useCommandPalette({
22565
22546
  count++;
22566
22547
  if (count >= end) break;
22567
22548
  }
22568
- if (slicedItems.length > 0) {
22569
- result.push({ ...group, items: slicedItems });
22570
- }
22549
+ if (slicedItems.length > 0) result.push({ ...group, items: slicedItems });
22571
22550
  if (count >= end) break;
22572
22551
  }
22573
22552
  return result;
22574
22553
  }, [allMatchedGroups, page]);
22575
- const flatItems = React32.useMemo(
22576
- () => displayedGroups.flatMap((g) => g.items),
22577
- [displayedGroups]
22578
- );
22579
- const selectedItems = React32.useMemo(
22580
- () => allFlatItems.filter((i) => selectedItemIds.has(i.id)),
22581
- [allFlatItems, selectedItemIds]
22582
- );
22583
- const pageItemCount = flatItems.length;
22554
+ const flatItems = React32.useMemo(() => displayedGroups.flatMap((g) => g.items), [displayedGroups]);
22555
+ const selectedItems = React32.useMemo(() => allFlatItems.filter((i) => selectedItemIds.has(i.id)), [allFlatItems, selectedItemIds]);
22584
22556
  React32.useEffect(() => {
22585
- setActiveIndex((i) => Math.min(i, Math.max(pageItemCount - 1, 0)));
22586
- }, [pageItemCount]);
22587
- function executeBulkAction() {
22557
+ stateRef.current = { activeIndex, page, flatItems, query, selectedItems };
22558
+ }, [activeIndex, page, flatItems, query, selectedItems]);
22559
+ const executeBulkAction = React32.useCallback(() => {
22588
22560
  if (!onSelectMultiple || selectedItems.length === 0) return;
22589
22561
  onSelectMultiple(selectedItems);
22590
22562
  onOpenChange?.(false);
22591
- }
22592
- function handleSelect(item, event) {
22563
+ }, [onSelectMultiple, selectedItems, onOpenChange]);
22564
+ const handleSelect = React32.useCallback((item, event) => {
22593
22565
  if (!item) return;
22594
22566
  if (multiSelect) {
22595
- if (event && ("ctrlKey" in event || "metaKey" in event || "shiftKey" in event) && (event.ctrlKey || event.metaKey || event.shiftKey)) {
22567
+ const isCmdKey = event && ("ctrlKey" in event || "metaKey" in event || "shiftKey" in event) && (event.ctrlKey || event.metaKey || event.shiftKey);
22568
+ if (isCmdKey) {
22596
22569
  toggleSelection(item.id);
22597
22570
  return;
22598
22571
  }
22599
22572
  if (selectedItems.length > 0) {
22600
- const itemsToSubmit = selectedItemIds.has(item.id) ? selectedItems : [...selectedItems, item];
22601
- if (onSelectMultiple) {
22602
- onSelectMultiple(itemsToSubmit);
22603
- }
22573
+ const finalItems = selectedItemIds.has(item.id) ? selectedItems : [...selectedItems, item];
22574
+ onSelectMultiple?.(finalItems);
22604
22575
  onOpenChange?.(false);
22605
22576
  return;
22606
22577
  }
@@ -22608,55 +22579,39 @@ function useCommandPalette({
22608
22579
  item.onSelect();
22609
22580
  onOpenChange?.(false);
22610
22581
  if (onRecentItemsChange) {
22611
- const next = [item, ...recentItems.filter((r) => r.id !== item.id)].slice(
22612
- 0,
22613
- maxRecentItems
22614
- );
22582
+ const next = [item, ...recentItems.filter((r) => r.id !== item.id)].slice(0, maxRecentItems);
22615
22583
  onRecentItemsChange(next);
22616
22584
  }
22617
- }
22585
+ }, [multiSelect, selectedItems, selectedItemIds, onSelectMultiple, onOpenChange, onRecentItemsChange, recentItems, maxRecentItems, toggleSelection]);
22618
22586
  React32.useEffect(() => {
22619
22587
  if (!open) return;
22620
22588
  const handler = (e) => {
22589
+ const { activeIndex: curIdx, flatItems: curItems, query: curQuery, selectedItems: curSelected } = stateRef.current;
22621
22590
  if (e.key === "ArrowDown") {
22622
22591
  e.preventDefault();
22623
- if (activeIndex === pageItemCount - 1 && page < totalPages - 1) {
22624
- setPage((p) => p + 1);
22625
- } else {
22626
- setActiveIndex((i) => (i + 1) % Math.max(pageItemCount, 1));
22627
- }
22592
+ if (curIdx === curItems.length - 1 && page < totalPages - 1) setPage((p) => p + 1);
22593
+ else setActiveIndex((i) => (i + 1) % Math.max(curItems.length, 1));
22628
22594
  } else if (e.key === "ArrowUp") {
22629
22595
  e.preventDefault();
22630
- if (activeIndex === 0 && page > 0) {
22596
+ if (curIdx === 0 && page > 0) {
22631
22597
  setPage((p) => p - 1);
22632
22598
  setActiveIndex(PAGE_SIZE - 1);
22633
- } else {
22634
- setActiveIndex(
22635
- (i) => (i - 1 + Math.max(pageItemCount, 1)) % Math.max(pageItemCount, 1)
22636
- );
22637
- }
22599
+ } else setActiveIndex((i) => (i - 1 + Math.max(curItems.length, 1)) % Math.max(curItems.length, 1));
22638
22600
  } else if (e.key === "Enter") {
22639
22601
  e.preventDefault();
22602
+ if (multiSearch && curQuery.includes(",") && curSelected.length === 0) {
22603
+ return;
22604
+ }
22640
22605
  if (multiSelect && (e.ctrlKey || e.metaKey)) {
22641
22606
  executeBulkAction();
22642
22607
  return;
22643
22608
  }
22644
- handleSelect(flatItems[activeIndex], e);
22609
+ handleSelect(curItems[curIdx], e);
22645
22610
  }
22646
22611
  };
22647
- document.addEventListener("keydown", handler);
22648
- return () => document.removeEventListener("keydown", handler);
22649
- }, [
22650
- open,
22651
- flatItems,
22652
- activeIndex,
22653
- pageItemCount,
22654
- page,
22655
- totalPages,
22656
- executeBulkAction,
22657
- handleSelect,
22658
- multiSelect
22659
- ]);
22612
+ window.addEventListener("keydown", handler);
22613
+ return () => window.removeEventListener("keydown", handler);
22614
+ }, [open, page, totalPages, multiSearch, multiSelect, handleSelect, executeBulkAction]);
22660
22615
  return {
22661
22616
  query,
22662
22617
  setQuery,
package/dist/index.mjs CHANGED
@@ -22445,10 +22445,15 @@ function useCommandPalette({
22445
22445
  const [query, setQuery] = React32.useState("");
22446
22446
  const [activeIndex, setActiveIndex] = React32.useState(0);
22447
22447
  const [page, setPage] = React32.useState(0);
22448
- const [selectedItemIds, setSelectedItemIds] = React32.useState(
22449
- /* @__PURE__ */ new Set()
22450
- );
22451
- const toggleSelection = React32.useCallback((id) => {
22448
+ const [selectedItemIds, setSelectedItemIds] = React32.useState(/* @__PURE__ */ new Set());
22449
+ const stateRef = useRef({
22450
+ activeIndex,
22451
+ page,
22452
+ flatItems: [],
22453
+ query,
22454
+ selectedItems: []
22455
+ });
22456
+ const toggleSelection = useCallback((id) => {
22452
22457
  setSelectedItemIds((prev) => {
22453
22458
  const next = new Set(prev);
22454
22459
  if (next.has(id)) next.delete(id);
@@ -22456,14 +22461,8 @@ function useCommandPalette({
22456
22461
  return next;
22457
22462
  });
22458
22463
  }, []);
22459
- const clearSelection = React32.useCallback(
22460
- () => setSelectedItemIds(/* @__PURE__ */ new Set()),
22461
- []
22462
- );
22463
- const baseGroups = React32.useMemo(
22464
- () => normaliseGroups(items, groups),
22465
- [items, groups]
22466
- );
22464
+ const clearSelection = useCallback(() => setSelectedItemIds(/* @__PURE__ */ new Set()), []);
22465
+ const baseGroups = useMemo(() => normaliseGroups(items, groups), [items, groups]);
22467
22466
  useEffect(() => {
22468
22467
  if (open) {
22469
22468
  setQuery("");
@@ -22472,36 +22471,18 @@ function useCommandPalette({
22472
22471
  clearSelection();
22473
22472
  }
22474
22473
  }, [open, clearSelection]);
22475
- const searchTerms = React32.useMemo(() => {
22474
+ const searchTerms = useMemo(() => {
22476
22475
  const parts = query.split(",");
22477
22476
  if (parts.length <= 1 && !multiSearch) return [];
22478
22477
  return parts.map((t) => t.trim().toLowerCase()).filter(Boolean);
22479
22478
  }, [query, multiSearch]);
22480
- const allMatchedGroups = React32.useMemo(() => {
22479
+ const allMatchedGroups = useMemo(() => {
22481
22480
  if (!query.trim()) {
22482
- if (recentItems.length > 0) {
22483
- return [
22484
- {
22485
- id: "__recent__",
22486
- label: "Recent",
22487
- icon: React32.createElement(ClockCounterClockwiseIcon),
22488
- items: recentItems,
22489
- priority: 999
22490
- },
22491
- ...baseGroups
22492
- ];
22493
- }
22494
- return baseGroups;
22495
- }
22496
- if (searchTerms.length > 1 || multiSearch && searchTerms.length > 0) {
22497
- return unionGroups(baseGroups, searchTerms);
22481
+ return recentItems.length > 0 ? [{ id: "__recent__", label: "Recent", icon: React32.createElement(ClockCounterClockwiseIcon), items: recentItems, priority: 999 }, ...baseGroups] : baseGroups;
22498
22482
  }
22499
- return filterAndScore(baseGroups, query);
22483
+ return searchTerms.length > 1 || multiSearch && searchTerms.length > 0 ? unionGroups(baseGroups, searchTerms) : filterAndScore(baseGroups, query);
22500
22484
  }, [query, baseGroups, recentItems, multiSearch, searchTerms]);
22501
- const allFlatItems = useMemo(
22502
- () => allMatchedGroups.flatMap((g) => g.items),
22503
- [allMatchedGroups]
22504
- );
22485
+ const allFlatItems = useMemo(() => allMatchedGroups.flatMap((g) => g.items), [allMatchedGroups]);
22505
22486
  const totalItems = allFlatItems.length;
22506
22487
  const totalPages = Math.max(1, Math.ceil(totalItems / PAGE_SIZE));
22507
22488
  useEffect(() => {
@@ -22523,42 +22504,32 @@ function useCommandPalette({
22523
22504
  count++;
22524
22505
  if (count >= end) break;
22525
22506
  }
22526
- if (slicedItems.length > 0) {
22527
- result.push({ ...group, items: slicedItems });
22528
- }
22507
+ if (slicedItems.length > 0) result.push({ ...group, items: slicedItems });
22529
22508
  if (count >= end) break;
22530
22509
  }
22531
22510
  return result;
22532
22511
  }, [allMatchedGroups, page]);
22533
- const flatItems = useMemo(
22534
- () => displayedGroups.flatMap((g) => g.items),
22535
- [displayedGroups]
22536
- );
22537
- const selectedItems = useMemo(
22538
- () => allFlatItems.filter((i) => selectedItemIds.has(i.id)),
22539
- [allFlatItems, selectedItemIds]
22540
- );
22541
- const pageItemCount = flatItems.length;
22512
+ const flatItems = useMemo(() => displayedGroups.flatMap((g) => g.items), [displayedGroups]);
22513
+ const selectedItems = useMemo(() => allFlatItems.filter((i) => selectedItemIds.has(i.id)), [allFlatItems, selectedItemIds]);
22542
22514
  useEffect(() => {
22543
- setActiveIndex((i) => Math.min(i, Math.max(pageItemCount - 1, 0)));
22544
- }, [pageItemCount]);
22545
- function executeBulkAction() {
22515
+ stateRef.current = { activeIndex, page, flatItems, query, selectedItems };
22516
+ }, [activeIndex, page, flatItems, query, selectedItems]);
22517
+ const executeBulkAction = useCallback(() => {
22546
22518
  if (!onSelectMultiple || selectedItems.length === 0) return;
22547
22519
  onSelectMultiple(selectedItems);
22548
22520
  onOpenChange?.(false);
22549
- }
22550
- function handleSelect(item, event) {
22521
+ }, [onSelectMultiple, selectedItems, onOpenChange]);
22522
+ const handleSelect = useCallback((item, event) => {
22551
22523
  if (!item) return;
22552
22524
  if (multiSelect) {
22553
- if (event && ("ctrlKey" in event || "metaKey" in event || "shiftKey" in event) && (event.ctrlKey || event.metaKey || event.shiftKey)) {
22525
+ const isCmdKey = event && ("ctrlKey" in event || "metaKey" in event || "shiftKey" in event) && (event.ctrlKey || event.metaKey || event.shiftKey);
22526
+ if (isCmdKey) {
22554
22527
  toggleSelection(item.id);
22555
22528
  return;
22556
22529
  }
22557
22530
  if (selectedItems.length > 0) {
22558
- const itemsToSubmit = selectedItemIds.has(item.id) ? selectedItems : [...selectedItems, item];
22559
- if (onSelectMultiple) {
22560
- onSelectMultiple(itemsToSubmit);
22561
- }
22531
+ const finalItems = selectedItemIds.has(item.id) ? selectedItems : [...selectedItems, item];
22532
+ onSelectMultiple?.(finalItems);
22562
22533
  onOpenChange?.(false);
22563
22534
  return;
22564
22535
  }
@@ -22566,55 +22537,39 @@ function useCommandPalette({
22566
22537
  item.onSelect();
22567
22538
  onOpenChange?.(false);
22568
22539
  if (onRecentItemsChange) {
22569
- const next = [item, ...recentItems.filter((r) => r.id !== item.id)].slice(
22570
- 0,
22571
- maxRecentItems
22572
- );
22540
+ const next = [item, ...recentItems.filter((r) => r.id !== item.id)].slice(0, maxRecentItems);
22573
22541
  onRecentItemsChange(next);
22574
22542
  }
22575
- }
22543
+ }, [multiSelect, selectedItems, selectedItemIds, onSelectMultiple, onOpenChange, onRecentItemsChange, recentItems, maxRecentItems, toggleSelection]);
22576
22544
  useEffect(() => {
22577
22545
  if (!open) return;
22578
22546
  const handler = (e) => {
22547
+ const { activeIndex: curIdx, flatItems: curItems, query: curQuery, selectedItems: curSelected } = stateRef.current;
22579
22548
  if (e.key === "ArrowDown") {
22580
22549
  e.preventDefault();
22581
- if (activeIndex === pageItemCount - 1 && page < totalPages - 1) {
22582
- setPage((p) => p + 1);
22583
- } else {
22584
- setActiveIndex((i) => (i + 1) % Math.max(pageItemCount, 1));
22585
- }
22550
+ if (curIdx === curItems.length - 1 && page < totalPages - 1) setPage((p) => p + 1);
22551
+ else setActiveIndex((i) => (i + 1) % Math.max(curItems.length, 1));
22586
22552
  } else if (e.key === "ArrowUp") {
22587
22553
  e.preventDefault();
22588
- if (activeIndex === 0 && page > 0) {
22554
+ if (curIdx === 0 && page > 0) {
22589
22555
  setPage((p) => p - 1);
22590
22556
  setActiveIndex(PAGE_SIZE - 1);
22591
- } else {
22592
- setActiveIndex(
22593
- (i) => (i - 1 + Math.max(pageItemCount, 1)) % Math.max(pageItemCount, 1)
22594
- );
22595
- }
22557
+ } else setActiveIndex((i) => (i - 1 + Math.max(curItems.length, 1)) % Math.max(curItems.length, 1));
22596
22558
  } else if (e.key === "Enter") {
22597
22559
  e.preventDefault();
22560
+ if (multiSearch && curQuery.includes(",") && curSelected.length === 0) {
22561
+ return;
22562
+ }
22598
22563
  if (multiSelect && (e.ctrlKey || e.metaKey)) {
22599
22564
  executeBulkAction();
22600
22565
  return;
22601
22566
  }
22602
- handleSelect(flatItems[activeIndex], e);
22567
+ handleSelect(curItems[curIdx], e);
22603
22568
  }
22604
22569
  };
22605
- document.addEventListener("keydown", handler);
22606
- return () => document.removeEventListener("keydown", handler);
22607
- }, [
22608
- open,
22609
- flatItems,
22610
- activeIndex,
22611
- pageItemCount,
22612
- page,
22613
- totalPages,
22614
- executeBulkAction,
22615
- handleSelect,
22616
- multiSelect
22617
- ]);
22570
+ window.addEventListener("keydown", handler);
22571
+ return () => window.removeEventListener("keydown", handler);
22572
+ }, [open, page, totalPages, multiSearch, multiSelect, handleSelect, executeBulkAction]);
22618
22573
  return {
22619
22574
  query,
22620
22575
  setQuery,
package/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "access": "public",
6
6
  "type": "module"
7
7
  },
8
- "version": "1.10.26",
8
+ "version": "1.10.28",
9
9
  "homepage": "https://main--68e80310a069c2f10b546ef3.chromatic.com/",
10
10
  "repository": {
11
11
  "type": "git",