@firecms/core 3.0.0-canary.269 → 3.0.0-canary.270

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.
@@ -1,10 +1,11 @@
1
1
  import { PropsWithChildren } from "react";
2
- export declare function NavigationGroup({ children, group, minimised, isPreview, isPotentialCardDropTarget, onEditGroup, // New prop to handle editing
3
- dndDisabled }: PropsWithChildren<{
2
+ export declare function NavigationGroup({ children, group, minimised, isPreview, isPotentialCardDropTarget, onEditGroup, dndDisabled, collapsed, onToggleCollapsed }: PropsWithChildren<{
4
3
  group: string | undefined;
5
4
  minimised?: boolean;
6
5
  isPreview?: boolean;
7
6
  isPotentialCardDropTarget?: boolean;
8
7
  onEditGroup?: (groupName: string) => void;
9
8
  dndDisabled?: boolean;
9
+ collapsed?: boolean;
10
+ onToggleCollapsed?: () => void;
10
11
  }>): import("react/jsx-runtime").JSX.Element;
@@ -15,6 +15,7 @@ export * from "./useSnackbarController";
15
15
  export * from "./useModeController";
16
16
  export * from "./useClipboard";
17
17
  export * from "./useLargeLayout";
18
+ export * from "./useCollapsedGroups";
18
19
  export * from "./useReferenceDialog";
19
20
  export * from "./useBrowserTitleAndIcon";
20
21
  export * from "./useCustomizationController";
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Custom hook for managing collapsed/expanded state of navigation groups
3
+ * with localStorage persistence. Automatically cleans up stale group entries
4
+ * when groups are removed from the navigation.
5
+ */
6
+ export declare function useCollapsedGroups(groupNames: string[]): {
7
+ isGroupCollapsed: (name: string) => boolean;
8
+ toggleGroupCollapsed: (name: string) => void;
9
+ };
package/dist/index.es.js CHANGED
@@ -2,7 +2,7 @@ import { jsx, Fragment, jsxs } from "react/jsx-runtime";
2
2
  import { c } from "react-compiler-runtime";
3
3
  import * as React from "react";
4
4
  import React__default, { useRef, useEffect, useContext, useCallback, useMemo, useState, createElement, createRef, createContext, forwardRef, useLayoutEffect, useDeferredValue } from "react";
5
- import { getColorSchemeForSeed, CHIP_COLORS, FunctionsIcon, CircleIcon, iconKeys, coolIconKeys, Icon, Tooltip, ErrorIcon, Typography, IconButton, ContentCopyIcon, OpenInNewIcon, DescriptionIcon, cls, Skeleton, Chip, defaultBorderMixin, KeyboardTabIcon, Checkbox, Markdown, TextareaAutosize, focusedDisabled, MultiSelect, MultiSelectItem, Select, SelectItem, BooleanSwitch, DateTimeField, paperMixin, EditIcon, DoNotDisturbOnIcon, Menu, MenuItem, MoreVertIcon, CircularProgress, SearchBar, Badge, ArrowUpwardIcon, Popover, FilterListIcon, Button, CenteredView, AssignmentIcon, Label, CloseIcon, TextField, BooleanSwitchWithLabel, useOutsideAlerter, Dialog, DialogTitle, DialogContent, DialogActions, FileCopyIcon, DeleteIcon, AddIcon, StarIcon, Collapse, ArrowForwardIcon, Card, cardMixin, cardClickableMixin, Container, LoadingButton, Alert, CheckIcon, NotesIcon, InfoIcon, ExpandablePanel, fieldBackgroundMixin, RemoveIcon, fieldBackgroundDisabledMixin, fieldBackgroundHoverMixin, ArrowDropDownIcon, FilterListOffIcon, SearchIcon, Avatar, DarkModeIcon, LightModeIcon, BrightnessMediumIcon, LogoutIcon, HandleIcon, KeyboardArrowUpIcon, KeyboardArrowDownIcon, debounce, Sheet, Tab, Tabs, CodeIcon, OpenInFullIcon, ViewStreamIcon, RepeatIcon, BallotIcon, ScheduleIcon, AddLinkIcon, LinkIcon, DriveFolderUploadIcon, UploadFileIcon, FormatListNumberedIcon, NumbersIcon, ListAltIcon, ListIcon, FlagIcon, MailIcon, HttpIcon, FormatQuoteIcon, SubjectIcon, ShortTextIcon, MenuIcon, ChevronLeftIcon } from "@firecms/ui";
5
+ import { getColorSchemeForSeed, CHIP_COLORS, FunctionsIcon, CircleIcon, iconKeys, coolIconKeys, Icon, Tooltip, ErrorIcon, Typography, IconButton, ContentCopyIcon, OpenInNewIcon, DescriptionIcon, cls, Skeleton, Chip, defaultBorderMixin, KeyboardTabIcon, Checkbox, Markdown, TextareaAutosize, focusedDisabled, MultiSelect, MultiSelectItem, Select, SelectItem, BooleanSwitch, DateTimeField, paperMixin, EditIcon, DoNotDisturbOnIcon, Menu, MenuItem, MoreVertIcon, CircularProgress, SearchBar, Badge, ArrowUpwardIcon, Popover, FilterListIcon, Button, CenteredView, AssignmentIcon, Label, CloseIcon, TextField, BooleanSwitchWithLabel, useOutsideAlerter, Dialog, DialogTitle, DialogContent, DialogActions, FileCopyIcon, DeleteIcon, AddIcon, StarIcon, Collapse, ExpandablePanel, ArrowForwardIcon, Card, cardMixin, cardClickableMixin, Container, LoadingButton, Alert, CheckIcon, NotesIcon, InfoIcon, fieldBackgroundMixin, RemoveIcon, fieldBackgroundDisabledMixin, fieldBackgroundHoverMixin, ArrowDropDownIcon, FilterListOffIcon, SearchIcon, Avatar, DarkModeIcon, LightModeIcon, BrightnessMediumIcon, LogoutIcon, HandleIcon, KeyboardArrowUpIcon, KeyboardArrowDownIcon, debounce, Sheet, Tab, Tabs, CodeIcon, OpenInFullIcon, ViewStreamIcon, RepeatIcon, BallotIcon, ScheduleIcon, AddLinkIcon, LinkIcon, DriveFolderUploadIcon, UploadFileIcon, FormatListNumberedIcon, NumbersIcon, ListAltIcon, ListIcon, FlagIcon, MailIcon, HttpIcon, FormatQuoteIcon, SubjectIcon, ShortTextIcon, MenuIcon, ChevronLeftIcon } from "@firecms/ui";
6
6
  import { SnackbarProvider as SnackbarProvider$1, useSnackbar } from "notistack";
7
7
  import hash from "object-hash";
8
8
  import { getIn, useFormex, setIn, useCreateFormex, Formex, Field } from "@firecms/formex";
@@ -4762,6 +4762,48 @@ function checkLargeLayout(breakpoint = "lg") {
4762
4762
  if (typeof window === "undefined") return false;
4763
4763
  return window.matchMedia(`(min-width: ${breakpoints[breakpoint] + 1}px)`).matches;
4764
4764
  }
4765
+ function useCollapsedGroups(groupNames) {
4766
+ const [collapsedGroups, setCollapsedGroups] = useState(() => {
4767
+ try {
4768
+ const stored = localStorage.getItem("firecms-collapsed-groups");
4769
+ return stored ? JSON.parse(stored) : {};
4770
+ } catch {
4771
+ return {};
4772
+ }
4773
+ });
4774
+ useEffect(() => {
4775
+ try {
4776
+ localStorage.setItem("firecms-collapsed-groups", JSON.stringify(collapsedGroups));
4777
+ } catch {
4778
+ }
4779
+ }, [collapsedGroups]);
4780
+ useEffect(() => {
4781
+ if (groupNames.length === 0) return;
4782
+ const currentGroupNames = new Set(groupNames);
4783
+ setCollapsedGroups((prev) => {
4784
+ const cleaned = Object.fromEntries(Object.entries(prev).filter(([groupName]) => currentGroupNames.has(groupName)));
4785
+ const prevKeys = Object.keys(prev);
4786
+ const cleanedKeys = Object.keys(cleaned);
4787
+ if (prevKeys.length === cleanedKeys.length && prevKeys.every((key) => cleanedKeys.includes(key))) {
4788
+ return prev;
4789
+ }
4790
+ return cleaned;
4791
+ });
4792
+ }, [groupNames]);
4793
+ const isGroupCollapsed = useCallback((name) => {
4794
+ return !!collapsedGroups[name];
4795
+ }, [collapsedGroups]);
4796
+ const toggleGroupCollapsed = useCallback((name_0) => {
4797
+ setCollapsedGroups((prev_0) => ({
4798
+ ...prev_0,
4799
+ [name_0]: !prev_0[name_0]
4800
+ }));
4801
+ }, []);
4802
+ return {
4803
+ isGroupCollapsed,
4804
+ toggleGroupCollapsed
4805
+ };
4806
+ }
4765
4807
  function ErrorTooltip(props) {
4766
4808
  const $ = c(2);
4767
4809
  let t0;
@@ -4782,6 +4824,7 @@ function ErrorView(t0) {
4782
4824
  tooltip
4783
4825
  } = t0;
4784
4826
  const component = error instanceof Error ? error.message : error;
4827
+ console.warn("ErrorView", JSON.stringify(error));
4785
4828
  let t1;
4786
4829
  if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
4787
4830
  t1 = /* @__PURE__ */ jsx(ErrorIcon, { className: "mx-2", size: "small", color: "error" });
@@ -12924,7 +12967,7 @@ function useRestoreScroll() {
12924
12967
  };
12925
12968
  }
12926
12969
  function NavigationGroup(t0) {
12927
- const $ = c(26);
12970
+ const $ = c(42);
12928
12971
  const {
12929
12972
  children,
12930
12973
  group,
@@ -12932,97 +12975,144 @@ function NavigationGroup(t0) {
12932
12975
  isPreview,
12933
12976
  isPotentialCardDropTarget,
12934
12977
  onEditGroup,
12935
- dndDisabled
12978
+ dndDisabled,
12979
+ collapsed,
12980
+ onToggleCollapsed
12936
12981
  } = t0;
12937
12982
  const [isHovered, setIsHovered] = useState(false);
12938
12983
  const currentGroupName = group ?? "Views";
12939
- const t1 = !isPotentialCardDropTarget ? "my-10" : "my-6";
12984
+ const showCaret = !isPreview && !!onToggleCollapsed;
12985
+ const t1 = isPreview ? "px-1 py-0.5" : "";
12940
12986
  let t2;
12941
12987
  if ($[0] !== t1) {
12942
- t2 = cls(t1, "transition-all duration-200 ease-in-out");
12988
+ t2 = cls("flex items-center", t1);
12943
12989
  $[0] = t1;
12944
12990
  $[1] = t2;
12945
12991
  } else {
12946
12992
  t2 = $[1];
12947
12993
  }
12948
- const t3 = `flex items-center ${isPreview ? "px-1 py-0.5 m-0" : "ml-3.5 mt-6"} `;
12994
+ const t3 = isPreview ? "body2" : "caption";
12949
12995
  let t4;
12950
- let t5;
12951
12996
  if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
12952
- t4 = () => setIsHovered(true);
12953
- t5 = () => setIsHovered(false);
12997
+ t4 = cls("p-4 py-2 rounded", "font-medium uppercase text-sm text-surface-600 dark:text-surface-400");
12954
12998
  $[2] = t4;
12955
- $[3] = t5;
12956
12999
  } else {
12957
13000
  t4 = $[2];
12958
- t5 = $[3];
12959
13001
  }
12960
- const t6 = isPreview ? "body2" : "caption";
12961
- const t7 = `${isPreview ? "px-1 py-0.5" : "ml-3.5"} font-medium uppercase text-sm text-surface-600 dark:text-surface-400`;
12962
- let t8;
12963
- if ($[4] !== currentGroupName || $[5] !== t6 || $[6] !== t7) {
12964
- t8 = /* @__PURE__ */ jsx(Typography, { variant: t6, component: "h2", color: "secondary", className: t7, children: currentGroupName });
12965
- $[4] = currentGroupName;
12966
- $[5] = t6;
12967
- $[6] = t7;
12968
- $[7] = t8;
13002
+ let t5;
13003
+ if ($[3] !== currentGroupName || $[4] !== t3) {
13004
+ t5 = /* @__PURE__ */ jsx(Typography, { variant: t3, component: "h2", color: "secondary", className: t4, children: currentGroupName });
13005
+ $[3] = currentGroupName;
13006
+ $[4] = t3;
13007
+ $[5] = t5;
12969
13008
  } else {
12970
- t8 = $[7];
13009
+ t5 = $[5];
12971
13010
  }
12972
- let t9;
12973
- if ($[8] !== currentGroupName || $[9] !== dndDisabled || $[10] !== isHovered || $[11] !== isPreview || $[12] !== onEditGroup) {
12974
- t9 = !isPreview && onEditGroup && !dndDisabled && /* @__PURE__ */ jsx(IconButton, { size: "smallest", onClick: (e) => {
13011
+ let t6;
13012
+ if ($[6] !== currentGroupName || $[7] !== dndDisabled || $[8] !== isHovered || $[9] !== isPreview || $[10] !== onEditGroup) {
13013
+ t6 = !isPreview && onEditGroup && !dndDisabled && /* @__PURE__ */ jsx(IconButton, { size: "smallest", onClick: (e) => {
12975
13014
  e.stopPropagation();
12976
13015
  onEditGroup(currentGroupName);
12977
13016
  }, className: cls("ml-2 ", isHovered ? "opacity-100" : "opacity-0", "transition-opacity duration-100"), children: /* @__PURE__ */ jsx(EditIcon, { size: "smallest" }) });
12978
- $[8] = currentGroupName;
12979
- $[9] = dndDisabled;
12980
- $[10] = isHovered;
12981
- $[11] = isPreview;
12982
- $[12] = onEditGroup;
12983
- $[13] = t9;
13017
+ $[6] = currentGroupName;
13018
+ $[7] = dndDisabled;
13019
+ $[8] = isHovered;
13020
+ $[9] = isPreview;
13021
+ $[10] = onEditGroup;
13022
+ $[11] = t6;
13023
+ } else {
13024
+ t6 = $[11];
13025
+ }
13026
+ let t7;
13027
+ if ($[12] !== t2 || $[13] !== t5 || $[14] !== t6) {
13028
+ t7 = /* @__PURE__ */ jsxs("div", { className: t2, children: [
13029
+ t5,
13030
+ t6
13031
+ ] });
13032
+ $[12] = t2;
13033
+ $[13] = t5;
13034
+ $[14] = t6;
13035
+ $[15] = t7;
13036
+ } else {
13037
+ t7 = $[15];
13038
+ }
13039
+ const TitleContent = t7;
13040
+ const t8 = !isPotentialCardDropTarget ? "my-10" : "my-6";
13041
+ let t9;
13042
+ if ($[16] !== t8) {
13043
+ t9 = cls(t8, "transition-all duration-200 ease-in-out");
13044
+ $[16] = t8;
13045
+ $[17] = t9;
12984
13046
  } else {
12985
- t9 = $[13];
13047
+ t9 = $[17];
12986
13048
  }
12987
13049
  let t10;
12988
- if ($[14] !== t3 || $[15] !== t8 || $[16] !== t9) {
12989
- t10 = /* @__PURE__ */ jsxs("div", { className: t3, onMouseEnter: t4, onMouseLeave: t5, children: [
12990
- t8,
12991
- t9
13050
+ if ($[18] !== TitleContent || $[19] !== children || $[20] !== isPreview) {
13051
+ t10 = isPreview && /* @__PURE__ */ jsxs(Fragment, { children: [
13052
+ /* @__PURE__ */ jsx("div", { className: cls("flex items-center justify-between w-full", "p-4 py-2"), onMouseEnter: () => setIsHovered(true), onMouseLeave: () => setIsHovered(false), children: TitleContent }),
13053
+ children
12992
13054
  ] });
12993
- $[14] = t3;
12994
- $[15] = t8;
12995
- $[16] = t9;
12996
- $[17] = t10;
13055
+ $[18] = TitleContent;
13056
+ $[19] = children;
13057
+ $[20] = isPreview;
13058
+ $[21] = t10;
12997
13059
  } else {
12998
- t10 = $[17];
13060
+ t10 = $[21];
12999
13061
  }
13000
13062
  let t11;
13001
- if ($[18] !== children || $[19] !== isPreview || $[20] !== minimised) {
13002
- t11 = isPreview ? children : minimised ? /* @__PURE__ */ jsx("div", { className: cls("mt-4 p-8 bg-surface-accent-200 dark:bg-surface-accent-800 rounded-lg"), style: {
13063
+ if ($[22] !== TitleContent || $[23] !== children || $[24] !== collapsed || $[25] !== isPreview || $[26] !== minimised || $[27] !== onToggleCollapsed || $[28] !== showCaret) {
13064
+ t11 = !isPreview && showCaret && /* @__PURE__ */ jsx(ExpandablePanel, { invisible: true, expanded: !collapsed, onExpandedChange: (open) => {
13065
+ if (open !== !collapsed) {
13066
+ onToggleCollapsed?.();
13067
+ }
13068
+ }, className: cls("mt-6"), titleClassName: cls("min-h-0 p-0 border-none", "rounded-t flex items-center justify-between w-full", "hover:bg-transparent", "cursor-pointer select-none"), innerClassName: cls("mt-4", !minimised ? "pt-0" : ""), title: /* @__PURE__ */ jsx("div", { onMouseEnter: () => setIsHovered(true), onMouseLeave: () => setIsHovered(false), className: "flex items-center", children: TitleContent }), children: minimised ? /* @__PURE__ */ jsx("div", { className: cls("mt-4 p-8 bg-surface-accent-200 dark:bg-surface-accent-800 rounded-lg"), style: {
13003
13069
  minHeight: "50px"
13004
- } }) : /* @__PURE__ */ jsx("div", { className: cls("mt-4", !minimised ? "pt-0" : ""), children });
13005
- $[18] = children;
13006
- $[19] = isPreview;
13007
- $[20] = minimised;
13008
- $[21] = t11;
13070
+ } }) : /* @__PURE__ */ jsx("div", { className: cls("mt-4", !minimised ? "pt-0" : ""), children }) });
13071
+ $[22] = TitleContent;
13072
+ $[23] = children;
13073
+ $[24] = collapsed;
13074
+ $[25] = isPreview;
13075
+ $[26] = minimised;
13076
+ $[27] = onToggleCollapsed;
13077
+ $[28] = showCaret;
13078
+ $[29] = t11;
13009
13079
  } else {
13010
- t11 = $[21];
13080
+ t11 = $[29];
13011
13081
  }
13012
13082
  let t12;
13013
- if ($[22] !== t10 || $[23] !== t11 || $[24] !== t2) {
13014
- t12 = /* @__PURE__ */ jsxs("div", { className: t2, children: [
13083
+ if ($[30] !== TitleContent || $[31] !== children || $[32] !== collapsed || $[33] !== isPreview || $[34] !== minimised || $[35] !== showCaret) {
13084
+ t12 = !isPreview && !showCaret && /* @__PURE__ */ jsxs(Fragment, { children: [
13085
+ /* @__PURE__ */ jsx("div", { className: cls("flex items-center justify-between w-full", "mt-6"), onMouseEnter: () => setIsHovered(true), onMouseLeave: () => setIsHovered(false), children: TitleContent }),
13086
+ !collapsed && (minimised ? /* @__PURE__ */ jsx("div", { className: cls("mt-4 p-8 bg-surface-accent-200 dark:bg-surface-accent-800 rounded-lg"), style: {
13087
+ minHeight: "50px"
13088
+ } }) : /* @__PURE__ */ jsx("div", { className: cls("mt-4", !minimised ? "pt-0" : ""), children }))
13089
+ ] });
13090
+ $[30] = TitleContent;
13091
+ $[31] = children;
13092
+ $[32] = collapsed;
13093
+ $[33] = isPreview;
13094
+ $[34] = minimised;
13095
+ $[35] = showCaret;
13096
+ $[36] = t12;
13097
+ } else {
13098
+ t12 = $[36];
13099
+ }
13100
+ let t13;
13101
+ if ($[37] !== t10 || $[38] !== t11 || $[39] !== t12 || $[40] !== t9) {
13102
+ t13 = /* @__PURE__ */ jsxs("div", { className: t9, children: [
13015
13103
  t10,
13016
- t11
13104
+ t11,
13105
+ t12
13017
13106
  ] });
13018
- $[22] = t10;
13019
- $[23] = t11;
13020
- $[24] = t2;
13021
- $[25] = t12;
13107
+ $[37] = t10;
13108
+ $[38] = t11;
13109
+ $[39] = t12;
13110
+ $[40] = t9;
13111
+ $[41] = t13;
13022
13112
  } else {
13023
- t12 = $[25];
13113
+ t13 = $[41];
13024
13114
  }
13025
- return t12;
13115
+ return t13;
13026
13116
  }
13027
13117
  const NavigationCard = React__default.memo(function NavigationCard2(t0) {
13028
13118
  const $ = c(25);
@@ -14221,6 +14311,11 @@ function DefaultHomePage({
14221
14311
  }] : draggable;
14222
14312
  onNavigationEntriesUpdate(all);
14223
14313
  };
14314
+ const groupNames = useMemo(() => [...items.map((item) => item.name), ...adminGroupData ? [adminGroupData.name] : []], [items, adminGroupData]);
14315
+ const {
14316
+ isGroupCollapsed,
14317
+ toggleGroupCollapsed
14318
+ } = useCollapsedGroups(groupNames);
14224
14319
  const {
14225
14320
  sensors,
14226
14321
  collisionDetection,
@@ -14306,7 +14401,7 @@ function DefaultHomePage({
14306
14401
  return /* @__PURE__ */ jsx(SortableNavigationGroup, { groupName: groupKey, disabled: dndDisabled, children: /* @__PURE__ */ jsx(NavigationGroup, { group: groupKey === DEFAULT_GROUP_NAME ? void 0 : groupKey, minimised: draggingGroupId === groupKey && !isDraggingCardOnly, isPotentialCardDropTarget: isDraggingCardOnly, dndDisabled, onEditGroup: () => {
14307
14402
  if (dndDisabled) return;
14308
14403
  setDialogOpenForGroup(groupKey);
14309
- }, children: /* @__PURE__ */ jsx(NavigationGroupDroppable, { id: groupKey, itemIds: entriesInGroup.map((e_4) => e_4.url), isPotentialCardDropTarget: isDraggingCardOnly, children: /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 ", children: [
14404
+ }, collapsed: isGroupCollapsed(groupKey), onToggleCollapsed: () => toggleGroupCollapsed(groupKey), children: /* @__PURE__ */ jsx(NavigationGroupDroppable, { id: groupKey, itemIds: entriesInGroup.map((e_4) => e_4.url), isPotentialCardDropTarget: isDraggingCardOnly, children: /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 ", children: [
14310
14405
  entriesInGroup.map((entry) => /* @__PURE__ */ jsx(SortableNavigationCard, { entry, onClick: () => {
14311
14406
  let event = "unmapped_event";
14312
14407
  if (entry.type === "collection") event = "home_navigate_to_collection";
@@ -14325,7 +14420,7 @@ function DefaultHomePage({
14325
14420
  margin: 0
14326
14421
  }, children: /* @__PURE__ */ jsx(NavigationGroup, { group: activeGroupData.name === DEFAULT_GROUP_NAME ? void 0 : activeGroupData.name, isPreview: false, minimised: true }) }) : activeItemForOverlay ? /* @__PURE__ */ jsx(NavigationCardBinding, { ...activeItemForOverlay, shrink: isHoveringNewGroupDropZone }) : null })
14327
14422
  ] }),
14328
- !performingSearch && adminGroupData && /* @__PURE__ */ jsx(NavigationGroup, { group: adminGroupData.name, children: /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 ", children: adminGroupData.entries.map((entry_0) => /* @__PURE__ */ jsx(NavigationCardBinding, { ...entry_0, onClick: () => {
14423
+ !performingSearch && adminGroupData && /* @__PURE__ */ jsx(NavigationGroup, { group: adminGroupData.name, collapsed: isGroupCollapsed(adminGroupData.name), onToggleCollapsed: () => toggleGroupCollapsed(adminGroupData.name), children: /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 ", children: adminGroupData.entries.map((entry_0) => /* @__PURE__ */ jsx(NavigationCardBinding, { ...entry_0, onClick: () => {
14329
14424
  let event_0 = "unmapped_event";
14330
14425
  if (entry_0.type === "collection") event_0 = "home_navigate_to_collection";
14331
14426
  else if (entry_0.type === "view") event_0 = "home_navigate_to_view";
@@ -21369,7 +21464,7 @@ function useReferenceDialog(referenceDialogProps) {
21369
21464
  }
21370
21465
  return t2;
21371
21466
  }
21372
- const fireCMSLogo = "data:image/png;base64,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\n";
21467
+ const fireCMSLogo = "data:image/png;base64,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";
21373
21468
  function useBrowserTitleAndIcon(name, logo) {
21374
21469
  const $ = c(4);
21375
21470
  let t0;
@@ -25794,6 +25889,7 @@ export {
25794
25889
  useBuildNavigationController,
25795
25890
  useClearRestoreValue,
25796
25891
  useClipboard,
25892
+ useCollapsedGroups,
25797
25893
  useCollectionFetch,
25798
25894
  useColumnIds,
25799
25895
  useCustomizationController,