@veiag/payload-enhanced-sidebar 0.3.2-canary.1 → 0.3.2

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 (56) hide show
  1. package/README.md +4 -2
  2. package/dist/components/EnhancedSidebar/Badge/index.d.ts +1 -1
  3. package/dist/components/EnhancedSidebar/Badge/index.js.map +1 -1
  4. package/dist/components/EnhancedSidebar/Badge/index.scss +1 -1
  5. package/dist/components/EnhancedSidebar/BadgeProvider/index.d.ts +1 -1
  6. package/dist/components/EnhancedSidebar/BadgeProvider/index.js.map +1 -1
  7. package/dist/components/EnhancedSidebar/Icon.d.ts +1 -1
  8. package/dist/components/EnhancedSidebar/Icon.js.map +1 -1
  9. package/dist/components/EnhancedSidebar/InternalBadgeProvider/index.d.ts +1 -1
  10. package/dist/components/EnhancedSidebar/InternalBadgeProvider/index.js +1 -1
  11. package/dist/components/EnhancedSidebar/InternalBadgeProvider/index.js.map +1 -1
  12. package/dist/components/EnhancedSidebar/NavContent/index.d.ts +1 -1
  13. package/dist/components/EnhancedSidebar/NavContent/index.js +1 -1
  14. package/dist/components/EnhancedSidebar/NavContent/index.js.map +1 -1
  15. package/dist/components/EnhancedSidebar/NavItem/index.d.ts +1 -1
  16. package/dist/components/EnhancedSidebar/NavItem/index.js +3 -3
  17. package/dist/components/EnhancedSidebar/NavItem/index.js.map +1 -1
  18. package/dist/components/EnhancedSidebar/SettingsMenuButton/index.js +1 -1
  19. package/dist/components/EnhancedSidebar/SettingsMenuButton/index.js.map +1 -1
  20. package/dist/components/EnhancedSidebar/SettingsMenuButton/index.scss +1 -1
  21. package/dist/components/EnhancedSidebar/SidebarContent.d.ts +1 -1
  22. package/dist/components/EnhancedSidebar/SidebarContent.js +4 -4
  23. package/dist/components/EnhancedSidebar/SidebarContent.js.map +1 -1
  24. package/dist/components/EnhancedSidebar/SidebarWrapper/index.js +1 -1
  25. package/dist/components/EnhancedSidebar/SidebarWrapper/index.js.map +1 -1
  26. package/dist/components/EnhancedSidebar/SidebarWrapper/index.scss +1 -1
  27. package/dist/components/EnhancedSidebar/TabsBar/TabItem.d.ts +1 -1
  28. package/dist/components/EnhancedSidebar/TabsBar/TabItem.js +3 -3
  29. package/dist/components/EnhancedSidebar/TabsBar/TabItem.js.map +1 -1
  30. package/dist/components/EnhancedSidebar/TabsBar/index.d.ts +1 -1
  31. package/dist/components/EnhancedSidebar/TabsBar/index.js +4 -4
  32. package/dist/components/EnhancedSidebar/TabsBar/index.js.map +1 -1
  33. package/dist/components/EnhancedSidebar/TabsBar/index.scss +1 -3
  34. package/dist/components/EnhancedSidebar/hooks/useBadge.d.ts +1 -1
  35. package/dist/components/EnhancedSidebar/hooks/useBadge.js +1 -1
  36. package/dist/components/EnhancedSidebar/hooks/useBadge.js.map +1 -1
  37. package/dist/components/EnhancedSidebar/hooks/useNavItemState.js +1 -1
  38. package/dist/components/EnhancedSidebar/hooks/useNavItemState.js.map +1 -1
  39. package/dist/components/EnhancedSidebar/hooks/useTabState.js +1 -1
  40. package/dist/components/EnhancedSidebar/hooks/useTabState.js.map +1 -1
  41. package/dist/components/EnhancedSidebar/index.d.ts +1 -1
  42. package/dist/components/EnhancedSidebar/index.js +6 -6
  43. package/dist/components/EnhancedSidebar/index.js.map +1 -1
  44. package/dist/components/EnhancedSidebar/index.scss +1 -3
  45. package/dist/exports/client.d.ts +1 -1
  46. package/dist/exports/client.js +1 -1
  47. package/dist/exports/client.js.map +1 -1
  48. package/dist/exports/rsc.d.ts +1 -1
  49. package/dist/exports/rsc.js +1 -1
  50. package/dist/exports/rsc.js.map +1 -1
  51. package/dist/index.d.ts +6 -6
  52. package/dist/index.js +6 -6
  53. package/dist/index.js.map +1 -1
  54. package/dist/utils/index.d.ts +1 -1
  55. package/dist/utils/index.js.map +1 -1
  56. package/package.json +1 -1
package/README.md CHANGED
@@ -2,8 +2,6 @@
2
2
 
3
3
  An enhanced sidebar plugin for [Payload CMS](https://payloadcms.com) that adds a tabbed navigation system to organize collections and globals into logical groups.
4
4
 
5
- > **Note:** This plugin is in early development and has not been extensively tested. Use with caution in production environments.
6
-
7
5
  ## Features
8
6
 
9
7
  - **Tabbed Navigation** - Organize collections into separate tabs for cleaner navigation
@@ -27,6 +25,10 @@ yarn add @veiag/payload-enhanced-sidebar
27
25
  pnpm add @veiag/payload-enhanced-sidebar
28
26
  ```
29
27
 
28
+ ### Windows support
29
+
30
+ See this comment if you have issues with scss : https://github.com/VeiaG/payload-enhanced-sidebar/issues/12#issuecomment-4229207755
31
+
30
32
  ## Quick Start
31
33
 
32
34
  ```typescript
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import type { BadgeColor } from '../../../types';
2
+ import type { BadgeColor } from '../../../types.js';
3
3
  import './index.scss';
4
4
  export type BadgeProps = {
5
5
  /**
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/EnhancedSidebar/Badge/index.tsx"],"sourcesContent":["'use client'\n\nimport React from 'react'\n\nimport type { BadgeColor } from '../../../types'\n\nimport './index.scss'\n\nconst baseClass = 'sidebar-badge'\n\nexport type BadgeProps = {\n /**\n * Badge color variant\n * @default 'default'\n */\n color?: BadgeColor\n /**\n * Position modifier\n * - 'absolute': positioned at top-right corner (for icons)\n * - 'inline': inline with margin (for nav items)\n */\n position?: 'absolute' | 'inline'\n /**\n * Badge value - number or React node\n * Numbers > 99 will be displayed as \"99+\"\n */\n value: number | React.ReactNode\n}\n\n/**\n * Format badge value - show up to 2 digits, 99+ for larger numbers\n */\nconst formatValue = (value: number | React.ReactNode): React.ReactNode => {\n if (typeof value === 'number') {\n return value > 99 ? '99+' : value\n }\n return value\n}\n\nexport const Badge: React.FC<BadgeProps> = ({ color = 'default', position, value }) => {\n // Don't render if value is 0 or falsy (except for React nodes)\n if (value === 0 || value === null || (typeof value !== 'object' && !value)) {\n return null\n }\n\n const classes = [baseClass, `${baseClass}--${color}`, position && `${baseClass}--${position}`]\n .filter(Boolean)\n .join(' ')\n\n return <span className={classes}>{formatValue(value)}</span>\n}\n"],"names":["React","baseClass","formatValue","value","Badge","color","position","classes","filter","Boolean","join","span","className"],"mappings":"AAAA;;AAEA,OAAOA,WAAW,QAAO;AAIzB,OAAO,eAAc;AAErB,MAAMC,YAAY;AAqBlB;;CAEC,GACD,MAAMC,cAAc,CAACC;IACnB,IAAI,OAAOA,UAAU,UAAU;QAC7B,OAAOA,QAAQ,KAAK,QAAQA;IAC9B;IACA,OAAOA;AACT;AAEA,OAAO,MAAMC,QAA8B,CAAC,EAAEC,QAAQ,SAAS,EAAEC,QAAQ,EAAEH,KAAK,EAAE;IAChF,+DAA+D;IAC/D,IAAIA,UAAU,KAAKA,UAAU,QAAS,OAAOA,UAAU,YAAY,CAACA,OAAQ;QAC1E,OAAO;IACT;IAEA,MAAMI,UAAU;QAACN;QAAW,GAAGA,UAAU,EAAE,EAAEI,OAAO;QAAEC,YAAY,GAAGL,UAAU,EAAE,EAAEK,UAAU;KAAC,CAC3FE,MAAM,CAACC,SACPC,IAAI,CAAC;IAER,qBAAO,KAACC;QAAKC,WAAWL;kBAAUL,YAAYC;;AAChD,EAAC"}
1
+ {"version":3,"sources":["../../../../src/components/EnhancedSidebar/Badge/index.tsx"],"sourcesContent":["'use client'\n\nimport React from 'react'\n\nimport type { BadgeColor } from '../../../types.js'\n\nimport './index.scss'\n\nconst baseClass = 'sidebar-badge'\n\nexport type BadgeProps = {\n /**\n * Badge color variant\n * @default 'default'\n */\n color?: BadgeColor\n /**\n * Position modifier\n * - 'absolute': positioned at top-right corner (for icons)\n * - 'inline': inline with margin (for nav items)\n */\n position?: 'absolute' | 'inline'\n /**\n * Badge value - number or React node\n * Numbers > 99 will be displayed as \"99+\"\n */\n value: number | React.ReactNode\n}\n\n/**\n * Format badge value - show up to 2 digits, 99+ for larger numbers\n */\nconst formatValue = (value: number | React.ReactNode): React.ReactNode => {\n if (typeof value === 'number') {\n return value > 99 ? '99+' : value\n }\n return value\n}\n\nexport const Badge: React.FC<BadgeProps> = ({ color = 'default', position, value }) => {\n // Don't render if value is 0 or falsy (except for React nodes)\n if (value === 0 || value === null || (typeof value !== 'object' && !value)) {\n return null\n }\n\n const classes = [baseClass, `${baseClass}--${color}`, position && `${baseClass}--${position}`]\n .filter(Boolean)\n .join(' ')\n\n return <span className={classes}>{formatValue(value)}</span>\n}\n"],"names":["React","baseClass","formatValue","value","Badge","color","position","classes","filter","Boolean","join","span","className"],"mappings":"AAAA;;AAEA,OAAOA,WAAW,QAAO;AAIzB,OAAO,eAAc;AAErB,MAAMC,YAAY;AAqBlB;;CAEC,GACD,MAAMC,cAAc,CAACC;IACnB,IAAI,OAAOA,UAAU,UAAU;QAC7B,OAAOA,QAAQ,KAAK,QAAQA;IAC9B;IACA,OAAOA;AACT;AAEA,OAAO,MAAMC,QAA8B,CAAC,EAAEC,QAAQ,SAAS,EAAEC,QAAQ,EAAEH,KAAK,EAAE;IAChF,+DAA+D;IAC/D,IAAIA,UAAU,KAAKA,UAAU,QAAS,OAAOA,UAAU,YAAY,CAACA,OAAQ;QAC1E,OAAO;IACT;IAEA,MAAMI,UAAU;QAACN;QAAW,GAAGA,UAAU,EAAE,EAAEI,OAAO;QAAEC,YAAY,GAAGL,UAAU,EAAE,EAAEK,UAAU;KAAC,CAC3FE,MAAM,CAACC,SACPC,IAAI,CAAC;IAER,qBAAO,KAACC;QAAKC,WAAWL;kBAAUL,YAAYC;;AAChD,EAAC"}
@@ -1,4 +1,4 @@
1
- @import '../../../../node_modules/@payloadcms/ui/dist/scss/vars';
1
+ @import '~@payloadcms/ui/scss';
2
2
 
3
3
  @layer payload-default {
4
4
  .sidebar-badge {
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import type { BadgeValues } from '../../../types';
2
+ import type { BadgeValues } from '../../../types.js';
3
3
  type BadgeContextValue = {
4
4
  values: BadgeValues;
5
5
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/EnhancedSidebar/BadgeProvider/index.tsx"],"sourcesContent":["'use client'\n\nimport React, { createContext, useContext, useMemo } from 'react'\n\nimport type { BadgeValues } from '../../../types'\n\ntype BadgeContextValue = {\n values: BadgeValues\n}\n\nconst BadgeContext = createContext<BadgeContextValue>({ values: {} })\n\nexport type BadgeProviderProps = {\n children: React.ReactNode\n /**\n * Badge values object.\n * Keys are slugs (collection slug, global slug, or custom item slug).\n * Values can be numbers or React nodes.\n *\n * Values are merged with any parent BadgeProvider values.\n * This provider's values take priority over parent values.\n *\n * @example\n * ```tsx\n * <BadgeProvider values={{ orders: 5, notifications: <CustomBadge /> }}>\n * {children}\n * </BadgeProvider>\n * ```\n */\n values: BadgeValues\n}\n\n/**\n * Provider for badge values.\n * Wrap your app with this provider and pass badge values.\n * Values are reactive - changes will update badges automatically.\n *\n * Values are merged with any parent BadgeProvider (e.g., InternalBadgeProvider).\n * This provider's values take priority, allowing you to override internal values.\n *\n * @example\n * ```tsx\n * // In your admin.components.providers\n * import { BadgeProvider } from '@veiag/payload-enhanced-sidebar'\n *\n * export const MyProvider = ({ children }) => {\n * const [counts, setCounts] = useState({ orders: 0 })\n *\n * useEffect(() => {\n * // Fetch counts, subscribe to realtime updates, etc.\n * }, [])\n *\n * return (\n * <BadgeProvider values={counts}>\n * {children}\n * </BadgeProvider>\n * )\n * }\n * ```\n */\nexport const BadgeProvider: React.FC<BadgeProviderProps> = ({ children, values }) => {\n // Get parent context values (if any)\n const parentContext = useContext(BadgeContext)\n\n // Merge parent values with this provider's values (this provider wins)\n const mergedValues = useMemo(\n () => ({\n ...parentContext.values,\n ...values,\n }),\n [parentContext.values, values],\n )\n\n return <BadgeContext.Provider value={{ values: mergedValues }}>{children}</BadgeContext.Provider>\n}\n\n/**\n * Hook to access badge values from context.\n * Returns the full values object from BadgeProvider.\n */\nexport const useBadgeContext = (): BadgeContextValue => {\n return useContext(BadgeContext)\n}\n\n/**\n * Hook to get a specific badge value by slug.\n * Returns the value for the given slug, or undefined if not found.\n */\nexport const useBadgeValue = (slug: string): number | React.ReactNode | undefined => {\n const { values } = useBadgeContext()\n return values[slug]\n}\n"],"names":["React","createContext","useContext","useMemo","BadgeContext","values","BadgeProvider","children","parentContext","mergedValues","Provider","value","useBadgeContext","useBadgeValue","slug"],"mappings":"AAAA;;AAEA,OAAOA,SAASC,aAAa,EAAEC,UAAU,EAAEC,OAAO,QAAQ,QAAO;AAQjE,MAAMC,6BAAeH,cAAiC;IAAEI,QAAQ,CAAC;AAAE;AAsBnE;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BC,GACD,OAAO,MAAMC,gBAA8C,CAAC,EAAEC,QAAQ,EAAEF,MAAM,EAAE;IAC9E,qCAAqC;IACrC,MAAMG,gBAAgBN,WAAWE;IAEjC,uEAAuE;IACvE,MAAMK,eAAeN,QACnB,IAAO,CAAA;YACL,GAAGK,cAAcH,MAAM;YACvB,GAAGA,MAAM;QACX,CAAA,GACA;QAACG,cAAcH,MAAM;QAAEA;KAAO;IAGhC,qBAAO,KAACD,aAAaM,QAAQ;QAACC,OAAO;YAAEN,QAAQI;QAAa;kBAAIF;;AAClE,EAAC;AAED;;;CAGC,GACD,OAAO,MAAMK,kBAAkB;IAC7B,OAAOV,WAAWE;AACpB,EAAC;AAED;;;CAGC,GACD,OAAO,MAAMS,gBAAgB,CAACC;IAC5B,MAAM,EAAET,MAAM,EAAE,GAAGO;IACnB,OAAOP,MAAM,CAACS,KAAK;AACrB,EAAC"}
1
+ {"version":3,"sources":["../../../../src/components/EnhancedSidebar/BadgeProvider/index.tsx"],"sourcesContent":["'use client'\n\nimport React, { createContext, useContext, useMemo } from 'react'\n\nimport type { BadgeValues } from '../../../types.js'\n\ntype BadgeContextValue = {\n values: BadgeValues\n}\n\nconst BadgeContext = createContext<BadgeContextValue>({ values: {} })\n\nexport type BadgeProviderProps = {\n children: React.ReactNode\n /**\n * Badge values object.\n * Keys are slugs (collection slug, global slug, or custom item slug).\n * Values can be numbers or React nodes.\n *\n * Values are merged with any parent BadgeProvider values.\n * This provider's values take priority over parent values.\n *\n * @example\n * ```tsx\n * <BadgeProvider values={{ orders: 5, notifications: <CustomBadge /> }}>\n * {children}\n * </BadgeProvider>\n * ```\n */\n values: BadgeValues\n}\n\n/**\n * Provider for badge values.\n * Wrap your app with this provider and pass badge values.\n * Values are reactive - changes will update badges automatically.\n *\n * Values are merged with any parent BadgeProvider (e.g., InternalBadgeProvider).\n * This provider's values take priority, allowing you to override internal values.\n *\n * @example\n * ```tsx\n * // In your admin.components.providers\n * import { BadgeProvider } from '@veiag/payload-enhanced-sidebar'\n *\n * export const MyProvider = ({ children }) => {\n * const [counts, setCounts] = useState({ orders: 0 })\n *\n * useEffect(() => {\n * // Fetch counts, subscribe to realtime updates, etc.\n * }, [])\n *\n * return (\n * <BadgeProvider values={counts}>\n * {children}\n * </BadgeProvider>\n * )\n * }\n * ```\n */\nexport const BadgeProvider: React.FC<BadgeProviderProps> = ({ children, values }) => {\n // Get parent context values (if any)\n const parentContext = useContext(BadgeContext)\n\n // Merge parent values with this provider's values (this provider wins)\n const mergedValues = useMemo(\n () => ({\n ...parentContext.values,\n ...values,\n }),\n [parentContext.values, values],\n )\n\n return <BadgeContext.Provider value={{ values: mergedValues }}>{children}</BadgeContext.Provider>\n}\n\n/**\n * Hook to access badge values from context.\n * Returns the full values object from BadgeProvider.\n */\nexport const useBadgeContext = (): BadgeContextValue => {\n return useContext(BadgeContext)\n}\n\n/**\n * Hook to get a specific badge value by slug.\n * Returns the value for the given slug, or undefined if not found.\n */\nexport const useBadgeValue = (slug: string): number | React.ReactNode | undefined => {\n const { values } = useBadgeContext()\n return values[slug]\n}\n"],"names":["React","createContext","useContext","useMemo","BadgeContext","values","BadgeProvider","children","parentContext","mergedValues","Provider","value","useBadgeContext","useBadgeValue","slug"],"mappings":"AAAA;;AAEA,OAAOA,SAASC,aAAa,EAAEC,UAAU,EAAEC,OAAO,QAAQ,QAAO;AAQjE,MAAMC,6BAAeH,cAAiC;IAAEI,QAAQ,CAAC;AAAE;AAsBnE;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BC,GACD,OAAO,MAAMC,gBAA8C,CAAC,EAAEC,QAAQ,EAAEF,MAAM,EAAE;IAC9E,qCAAqC;IACrC,MAAMG,gBAAgBN,WAAWE;IAEjC,uEAAuE;IACvE,MAAMK,eAAeN,QACnB,IAAO,CAAA;YACL,GAAGK,cAAcH,MAAM;YACvB,GAAGA,MAAM;QACX,CAAA,GACA;QAACG,cAAcH,MAAM;QAAEA;KAAO;IAGhC,qBAAO,KAACD,aAAaM,QAAQ;QAACC,OAAO;YAAEN,QAAQI;QAAa;kBAAIF;;AAClE,EAAC;AAED;;;CAGC,GACD,OAAO,MAAMK,kBAAkB;IAC7B,OAAOV,WAAWE;AACpB,EAAC;AAED;;;CAGC,GACD,OAAO,MAAMS,gBAAgB,CAACC;IAC5B,MAAM,EAAET,MAAM,EAAE,GAAGO;IACnB,OAAOP,MAAM,CAACS,KAAK;AACrB,EAAC"}
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import type { IconName } from '../../types';
2
+ import type { IconName } from '../../types.js';
3
3
  export interface IconProps {
4
4
  className?: string;
5
5
  name: IconName;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/EnhancedSidebar/Icon.tsx"],"sourcesContent":["'use client'\n\nimport { icons } from 'lucide-react'\nimport React from 'react'\n\nimport type { IconName } from '../../types'\n\nexport interface IconProps {\n className?: string\n name: IconName\n size?: number\n}\n\nexport const Icon: React.FC<IconProps> = ({ name, className, size = 20 }) => {\n const LucideIcon = icons[name]\n\n if (!LucideIcon) {\n return null\n }\n\n return <LucideIcon className={className} size={size} />\n}\n"],"names":["icons","React","Icon","name","className","size","LucideIcon"],"mappings":"AAAA;;AAEA,SAASA,KAAK,QAAQ,eAAc;AACpC,OAAOC,WAAW,QAAO;AAUzB,OAAO,MAAMC,OAA4B,CAAC,EAAEC,IAAI,EAAEC,SAAS,EAAEC,OAAO,EAAE,EAAE;IACtE,MAAMC,aAAaN,KAAK,CAACG,KAAK;IAE9B,IAAI,CAACG,YAAY;QACf,OAAO;IACT;IAEA,qBAAO,KAACA;QAAWF,WAAWA;QAAWC,MAAMA;;AACjD,EAAC"}
1
+ {"version":3,"sources":["../../../src/components/EnhancedSidebar/Icon.tsx"],"sourcesContent":["'use client'\n\nimport { icons } from 'lucide-react'\nimport React from 'react'\n\nimport type { IconName } from '../../types.js'\n\nexport interface IconProps {\n className?: string\n name: IconName\n size?: number\n}\n\nexport const Icon: React.FC<IconProps> = ({ name, className, size = 20 }) => {\n const LucideIcon = icons[name]\n\n if (!LucideIcon) {\n return null\n }\n\n return <LucideIcon className={className} size={size} />\n}\n"],"names":["icons","React","Icon","name","className","size","LucideIcon"],"mappings":"AAAA;;AAEA,SAASA,KAAK,QAAQ,eAAc;AACpC,OAAOC,WAAW,QAAO;AAUzB,OAAO,MAAMC,OAA4B,CAAC,EAAEC,IAAI,EAAEC,SAAS,EAAEC,OAAO,EAAE,EAAE;IACtE,MAAMC,aAAaN,KAAK,CAACG,KAAK;IAE9B,IAAI,CAACG,YAAY;QACf,OAAO;IACT;IAEA,qBAAO,KAACA;QAAWF,WAAWA;QAAWC,MAAMA;;AACjD,EAAC"}
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import type { EnhancedSidebarConfig } from '../../../types';
2
+ import type { EnhancedSidebarConfig } from '../../../types.js';
3
3
  export type InternalBadgeProviderProps = {
4
4
  children: React.ReactNode;
5
5
  /**
@@ -3,7 +3,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import { useConfig } from '@payloadcms/ui';
4
4
  import { stringify } from 'qs-esm';
5
5
  import React, { useCallback, useEffect, useMemo, useState } from 'react';
6
- import { BadgeProvider } from '../BadgeProvider';
6
+ import { BadgeProvider } from '../BadgeProvider/index.js';
7
7
  /**
8
8
  * Internal provider that fetches all API-based badges once on mount.
9
9
  * This provider is automatically injected by the plugin.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/EnhancedSidebar/InternalBadgeProvider/index.tsx"],"sourcesContent":["'use client'\n\nimport { useConfig } from '@payloadcms/ui'\nimport { stringify } from 'qs-esm'\nimport React, { useCallback, useEffect, useMemo, useState } from 'react'\n\nimport type { BadgeConfig, BadgeValues, EnhancedSidebarConfig } from '../../../types'\n\nimport { BadgeProvider } from '../BadgeProvider'\n\ntype BadgeToFetch = {\n config: BadgeConfig\n slug: string\n}\n\nexport type InternalBadgeProviderProps = {\n children: React.ReactNode\n /**\n * Sidebar configuration containing badge configs\n */\n sidebarConfig: EnhancedSidebarConfig\n}\n\n/**\n * Internal provider that fetches all API-based badges once on mount.\n * This provider is automatically injected by the plugin.\n * Values are stored in context and don't refetch on navigation.\n */\nexport const InternalBadgeProvider: React.FC<InternalBadgeProviderProps> = ({\n children,\n sidebarConfig,\n}) => {\n const [values, setValues] = useState<BadgeValues>({})\n\n const {\n config: {\n routes: { api: apiRoute },\n serverURL,\n },\n } = useConfig()\n\n // Collect all badges that need to be fetched (api and collection-count types)\n const badgesToFetch = useMemo(() => {\n const badges: BadgeToFetch[] = []\n\n // From tabs\n if (sidebarConfig.tabs) {\n for (const tab of sidebarConfig.tabs) {\n if (tab.type !== 'custom' && tab.badge && tab.badge.type !== 'provider') {\n badges.push({ slug: tab.id, config: tab.badge })\n }\n }\n }\n\n // From badges config\n if (sidebarConfig.badges) {\n for (const [slug, config] of Object.entries(sidebarConfig.badges)) {\n if (config.type !== 'provider') {\n badges.push({ slug, config })\n }\n }\n }\n\n return badges\n }, [sidebarConfig])\n\n // Fetch a single badge value\n const fetchBadge = useCallback(\n async (badge: BadgeToFetch): Promise<{ slug: string; value: number | undefined }> => {\n const { slug, config } = badge\n\n try {\n let url: string\n let responseKey: string\n\n if (config.type === 'api') {\n url = config.endpoint\n responseKey = config.responseKey ?? 'count'\n\n // If endpoint is relative, prepend serverURL\n if (!url.startsWith('http')) {\n url = `${serverURL || ''}${url}`\n }\n } else if (config.type === 'collection-count') {\n const collectionSlug = config.collectionSlug ?? slug\n const baseUrl = `${serverURL || ''}${apiRoute}/${collectionSlug}`\n\n if (config.where) {\n const whereParams = stringify({\n where: config.where,\n })\n url = `${baseUrl}?${whereParams}`\n } else {\n url = `${baseUrl}`\n }\n\n responseKey = 'totalDocs'\n } else {\n return { slug, value: undefined }\n }\n\n const response = await fetch(url, {\n credentials: 'include',\n method: config.type === 'api' ? (config.method ?? 'GET') : 'GET',\n })\n\n if (response.ok) {\n const data = await response.json()\n // Extract value from nested key (e.g., \"data.count\")\n const keys = responseKey.split('.')\n let value = data\n for (const key of keys) {\n value = value?.[key]\n }\n return { slug, value: typeof value === 'number' ? value : undefined }\n }\n } catch (error) {\n //eslint-disable-next-line no-console\n console.error(`Failed to fetch badge data for ${slug}:`, error)\n }\n\n return { slug, value: undefined }\n },\n [apiRoute, serverURL],\n )\n\n // Fetch all badges on mount\n useEffect(() => {\n if (badgesToFetch.length === 0) {\n return\n }\n\n const fetchAll = async () => {\n const results = await Promise.all(badgesToFetch.map(fetchBadge))\n\n const newValues: BadgeValues = {}\n for (const result of results) {\n if (result.value !== undefined) {\n newValues[result.slug] = result.value\n }\n }\n\n setValues(newValues)\n }\n\n fetchAll().catch((err) => {\n //eslint-disable-next-line no-console\n console.error('Error fetching badge data:', err)\n })\n }, [badgesToFetch, fetchBadge])\n\n return <BadgeProvider values={values}>{children}</BadgeProvider>\n}\n"],"names":["useConfig","stringify","React","useCallback","useEffect","useMemo","useState","BadgeProvider","InternalBadgeProvider","children","sidebarConfig","values","setValues","config","routes","api","apiRoute","serverURL","badgesToFetch","badges","tabs","tab","type","badge","push","slug","id","Object","entries","fetchBadge","url","responseKey","endpoint","startsWith","collectionSlug","baseUrl","where","whereParams","value","undefined","response","fetch","credentials","method","ok","data","json","keys","split","key","error","console","length","fetchAll","results","Promise","all","map","newValues","result","catch","err"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/components/EnhancedSidebar/InternalBadgeProvider/index.tsx"],"sourcesContent":["'use client'\n\nimport { useConfig } from '@payloadcms/ui'\nimport { stringify } from 'qs-esm'\nimport React, { useCallback, useEffect, useMemo, useState } from 'react'\n\nimport type { BadgeConfig, BadgeValues, EnhancedSidebarConfig } from '../../../types.js'\n\nimport { BadgeProvider } from '../BadgeProvider/index.js'\n\ntype BadgeToFetch = {\n config: BadgeConfig\n slug: string\n}\n\nexport type InternalBadgeProviderProps = {\n children: React.ReactNode\n /**\n * Sidebar configuration containing badge configs\n */\n sidebarConfig: EnhancedSidebarConfig\n}\n\n/**\n * Internal provider that fetches all API-based badges once on mount.\n * This provider is automatically injected by the plugin.\n * Values are stored in context and don't refetch on navigation.\n */\nexport const InternalBadgeProvider: React.FC<InternalBadgeProviderProps> = ({\n children,\n sidebarConfig,\n}) => {\n const [values, setValues] = useState<BadgeValues>({})\n\n const {\n config: {\n routes: { api: apiRoute },\n serverURL,\n },\n } = useConfig()\n\n // Collect all badges that need to be fetched (api and collection-count types)\n const badgesToFetch = useMemo(() => {\n const badges: BadgeToFetch[] = []\n\n // From tabs\n if (sidebarConfig.tabs) {\n for (const tab of sidebarConfig.tabs) {\n if (tab.type !== 'custom' && tab.badge && tab.badge.type !== 'provider') {\n badges.push({ slug: tab.id, config: tab.badge })\n }\n }\n }\n\n // From badges config\n if (sidebarConfig.badges) {\n for (const [slug, config] of Object.entries(sidebarConfig.badges)) {\n if (config.type !== 'provider') {\n badges.push({ slug, config })\n }\n }\n }\n\n return badges\n }, [sidebarConfig])\n\n // Fetch a single badge value\n const fetchBadge = useCallback(\n async (badge: BadgeToFetch): Promise<{ slug: string; value: number | undefined }> => {\n const { slug, config } = badge\n\n try {\n let url: string\n let responseKey: string\n\n if (config.type === 'api') {\n url = config.endpoint\n responseKey = config.responseKey ?? 'count'\n\n // If endpoint is relative, prepend serverURL\n if (!url.startsWith('http')) {\n url = `${serverURL || ''}${url}`\n }\n } else if (config.type === 'collection-count') {\n const collectionSlug = config.collectionSlug ?? slug\n const baseUrl = `${serverURL || ''}${apiRoute}/${collectionSlug}`\n\n if (config.where) {\n const whereParams = stringify({\n where: config.where,\n })\n url = `${baseUrl}?${whereParams}`\n } else {\n url = `${baseUrl}`\n }\n\n responseKey = 'totalDocs'\n } else {\n return { slug, value: undefined }\n }\n\n const response = await fetch(url, {\n credentials: 'include',\n method: config.type === 'api' ? (config.method ?? 'GET') : 'GET',\n })\n\n if (response.ok) {\n const data = await response.json()\n // Extract value from nested key (e.g., \"data.count\")\n const keys = responseKey.split('.')\n let value = data\n for (const key of keys) {\n value = value?.[key]\n }\n return { slug, value: typeof value === 'number' ? value : undefined }\n }\n } catch (error) {\n //eslint-disable-next-line no-console\n console.error(`Failed to fetch badge data for ${slug}:`, error)\n }\n\n return { slug, value: undefined }\n },\n [apiRoute, serverURL],\n )\n\n // Fetch all badges on mount\n useEffect(() => {\n if (badgesToFetch.length === 0) {\n return\n }\n\n const fetchAll = async () => {\n const results = await Promise.all(badgesToFetch.map(fetchBadge))\n\n const newValues: BadgeValues = {}\n for (const result of results) {\n if (result.value !== undefined) {\n newValues[result.slug] = result.value\n }\n }\n\n setValues(newValues)\n }\n\n fetchAll().catch((err) => {\n //eslint-disable-next-line no-console\n console.error('Error fetching badge data:', err)\n })\n }, [badgesToFetch, fetchBadge])\n\n return <BadgeProvider values={values}>{children}</BadgeProvider>\n}\n"],"names":["useConfig","stringify","React","useCallback","useEffect","useMemo","useState","BadgeProvider","InternalBadgeProvider","children","sidebarConfig","values","setValues","config","routes","api","apiRoute","serverURL","badgesToFetch","badges","tabs","tab","type","badge","push","slug","id","Object","entries","fetchBadge","url","responseKey","endpoint","startsWith","collectionSlug","baseUrl","where","whereParams","value","undefined","response","fetch","credentials","method","ok","data","json","keys","split","key","error","console","length","fetchAll","results","Promise","all","map","newValues","result","catch","err"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  import React from 'react';
2
- import type { CustomNavContentProps } from '../../../types';
2
+ import type { CustomNavContentProps } from '../../../types.js';
3
3
  export declare const NavContent: React.FC<CustomNavContentProps>;
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import React from 'react';
4
- import { useTabState } from '../hooks/useTabState';
4
+ import { useTabState } from '../hooks/useTabState.js';
5
5
  const baseClass = 'enhanced-sidebar';
6
6
  const TabPanel = ({ id, children })=>{
7
7
  const { isActive } = useTabState(id);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/EnhancedSidebar/NavContent/index.tsx"],"sourcesContent":["'use client'\n\nimport React from 'react'\n\nimport type { CustomNavContentProps } from '../../../types'\n\nimport { useTabState } from '../hooks/useTabState'\n\nconst baseClass = 'enhanced-sidebar'\n\nconst TabPanel: React.FC<{ children: React.ReactNode; id: string }> = ({ id, children }) => {\n const { isActive } = useTabState(id)\n return (\n <div aria-hidden={!isActive} style={{ display: isActive ? undefined : 'none' }}>\n {children}\n </div>\n )\n}\n\nexport const NavContent: React.FC<CustomNavContentProps> = ({\n afterNav,\n afterNavLinks,\n allContent,\n beforeNav,\n beforeNavLinks,\n tabs,\n tabsContent,\n}) => {\n const hasTabs = tabs.length > 0\n\n return (\n <nav className={`${baseClass}__content`}>\n <div className={`${baseClass}__content-scroll`}>\n {beforeNav}\n {beforeNavLinks}\n {hasTabs\n ? tabs.map((tab) => (\n <TabPanel id={tab.id} key={tab.id}>\n {tabsContent[tab.id]}\n </TabPanel>\n ))\n : allContent}\n {afterNavLinks}\n {afterNav}\n </div>\n </nav>\n )\n}\n"],"names":["React","useTabState","baseClass","TabPanel","id","children","isActive","div","aria-hidden","style","display","undefined","NavContent","afterNav","afterNavLinks","allContent","beforeNav","beforeNavLinks","tabs","tabsContent","hasTabs","length","nav","className","map","tab"],"mappings":"AAAA;;AAEA,OAAOA,WAAW,QAAO;AAIzB,SAASC,WAAW,QAAQ,uBAAsB;AAElD,MAAMC,YAAY;AAElB,MAAMC,WAAgE,CAAC,EAAEC,EAAE,EAAEC,QAAQ,EAAE;IACrF,MAAM,EAAEC,QAAQ,EAAE,GAAGL,YAAYG;IACjC,qBACE,KAACG;QAAIC,eAAa,CAACF;QAAUG,OAAO;YAAEC,SAASJ,WAAWK,YAAY;QAAO;kBAC1EN;;AAGP;AAEA,OAAO,MAAMO,aAA8C,CAAC,EAC1DC,QAAQ,EACRC,aAAa,EACbC,UAAU,EACVC,SAAS,EACTC,cAAc,EACdC,IAAI,EACJC,WAAW,EACZ;IACC,MAAMC,UAAUF,KAAKG,MAAM,GAAG;IAE9B,qBACE,KAACC;QAAIC,WAAW,GAAGrB,UAAU,SAAS,CAAC;kBACrC,cAAA,MAACK;YAAIgB,WAAW,GAAGrB,UAAU,gBAAgB,CAAC;;gBAC3Cc;gBACAC;gBACAG,UACGF,KAAKM,GAAG,CAAC,CAACC,oBACR,KAACtB;wBAASC,IAAIqB,IAAIrB,EAAE;kCACjBe,WAAW,CAACM,IAAIrB,EAAE,CAAC;uBADKqB,IAAIrB,EAAE,KAInCW;gBACHD;gBACAD;;;;AAIT,EAAC"}
1
+ {"version":3,"sources":["../../../../src/components/EnhancedSidebar/NavContent/index.tsx"],"sourcesContent":["'use client'\n\nimport React from 'react'\n\nimport type { CustomNavContentProps } from '../../../types.js'\n\nimport { useTabState } from '../hooks/useTabState.js'\n\nconst baseClass = 'enhanced-sidebar'\n\nconst TabPanel: React.FC<{ children: React.ReactNode; id: string }> = ({ id, children }) => {\n const { isActive } = useTabState(id)\n return (\n <div aria-hidden={!isActive} style={{ display: isActive ? undefined : 'none' }}>\n {children}\n </div>\n )\n}\n\nexport const NavContent: React.FC<CustomNavContentProps> = ({\n afterNav,\n afterNavLinks,\n allContent,\n beforeNav,\n beforeNavLinks,\n tabs,\n tabsContent,\n}) => {\n const hasTabs = tabs.length > 0\n\n return (\n <nav className={`${baseClass}__content`}>\n <div className={`${baseClass}__content-scroll`}>\n {beforeNav}\n {beforeNavLinks}\n {hasTabs\n ? tabs.map((tab) => (\n <TabPanel id={tab.id} key={tab.id}>\n {tabsContent[tab.id]}\n </TabPanel>\n ))\n : allContent}\n {afterNavLinks}\n {afterNav}\n </div>\n </nav>\n )\n}\n"],"names":["React","useTabState","baseClass","TabPanel","id","children","isActive","div","aria-hidden","style","display","undefined","NavContent","afterNav","afterNavLinks","allContent","beforeNav","beforeNavLinks","tabs","tabsContent","hasTabs","length","nav","className","map","tab"],"mappings":"AAAA;;AAEA,OAAOA,WAAW,QAAO;AAIzB,SAASC,WAAW,QAAQ,0BAAyB;AAErD,MAAMC,YAAY;AAElB,MAAMC,WAAgE,CAAC,EAAEC,EAAE,EAAEC,QAAQ,EAAE;IACrF,MAAM,EAAEC,QAAQ,EAAE,GAAGL,YAAYG;IACjC,qBACE,KAACG;QAAIC,eAAa,CAACF;QAAUG,OAAO;YAAEC,SAASJ,WAAWK,YAAY;QAAO;kBAC1EN;;AAGP;AAEA,OAAO,MAAMO,aAA8C,CAAC,EAC1DC,QAAQ,EACRC,aAAa,EACbC,UAAU,EACVC,SAAS,EACTC,cAAc,EACdC,IAAI,EACJC,WAAW,EACZ;IACC,MAAMC,UAAUF,KAAKG,MAAM,GAAG;IAE9B,qBACE,KAACC;QAAIC,WAAW,GAAGrB,UAAU,SAAS,CAAC;kBACrC,cAAA,MAACK;YAAIgB,WAAW,GAAGrB,UAAU,gBAAgB,CAAC;;gBAC3Cc;gBACAC;gBACAG,UACGF,KAAKM,GAAG,CAAC,CAACC,oBACR,KAACtB;wBAASC,IAAIqB,IAAIrB,EAAE;kCACjBe,WAAW,CAACM,IAAIrB,EAAE,CAAC;uBADKqB,IAAIrB,EAAE,KAInCW;gBACHD;gBACAD;;;;AAIT,EAAC"}
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import type { BadgeConfig, ExtendedEntity } from '../../../types';
2
+ import type { BadgeConfig, ExtendedEntity } from '../../../types.js';
3
3
  export type NavItemProps = {
4
4
  badgeConfig?: BadgeConfig;
5
5
  entity: ExtendedEntity;
@@ -3,9 +3,9 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
3
3
  import { getTranslation } from '@payloadcms/translations';
4
4
  import { Link, useTranslation } from '@payloadcms/ui';
5
5
  import React from 'react';
6
- import { Badge } from '../Badge';
7
- import { useBadge } from '../hooks/useBadge';
8
- import { useNavItemState } from '../hooks/useNavItemState';
6
+ import { Badge } from '../Badge/index.js';
7
+ import { useBadge } from '../hooks/useBadge.js';
8
+ import { useNavItemState } from '../hooks/useNavItemState.js';
9
9
  const baseClass = 'enhanced-sidebar';
10
10
  export const NavItem = ({ id, badgeConfig, entity, href })=>{
11
11
  const { i18n } = useTranslation();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/EnhancedSidebar/NavItem/index.tsx"],"sourcesContent":["'use client'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { Link, useTranslation } from '@payloadcms/ui'\nimport React from 'react'\n\nimport type { BadgeConfig, ExtendedEntity } from '../../../types'\n\nimport { Badge } from '../Badge'\nimport { useBadge } from '../hooks/useBadge'\nimport { useNavItemState } from '../hooks/useNavItemState'\n\nconst baseClass = 'enhanced-sidebar'\n\nexport type NavItemProps = {\n badgeConfig?: BadgeConfig\n entity: ExtendedEntity\n href: string\n id: string\n}\n\nexport const NavItem: React.FC<NavItemProps> = ({ id, badgeConfig, entity, href }) => {\n const { i18n } = useTranslation()\n const { value: badgeValue } = useBadge(badgeConfig, entity.slug)\n const { isActive, isCurrentPage } = useNavItemState(href)\n\n const Label = (\n <>\n {isActive && <div className={`${baseClass}__link-indicator`} />}\n <span className={`${baseClass}__link-label`}>{getTranslation(entity.label, i18n)}</span>\n {badgeValue !== undefined && (\n <Badge color={badgeConfig?.color} position=\"inline\" value={badgeValue} />\n )}\n </>\n )\n\n if (isCurrentPage) {\n return (\n <div className={`${baseClass}__link`} id={id}>\n {Label}\n </div>\n )\n }\n\n return (\n <Link\n className={`${baseClass}__link`}\n href={href}\n id={id}\n prefetch={false}\n rel={entity.isExternal ? 'noopener noreferrer' : undefined}\n target={entity.isExternal ? '_blank' : undefined}\n >\n {Label}\n </Link>\n )\n}\n"],"names":["getTranslation","Link","useTranslation","React","Badge","useBadge","useNavItemState","baseClass","NavItem","id","badgeConfig","entity","href","i18n","value","badgeValue","slug","isActive","isCurrentPage","Label","div","className","span","label","undefined","color","position","prefetch","rel","isExternal","target"],"mappings":"AAAA;;AAEA,SAASA,cAAc,QAAQ,2BAA0B;AACzD,SAASC,IAAI,EAAEC,cAAc,QAAQ,iBAAgB;AACrD,OAAOC,WAAW,QAAO;AAIzB,SAASC,KAAK,QAAQ,WAAU;AAChC,SAASC,QAAQ,QAAQ,oBAAmB;AAC5C,SAASC,eAAe,QAAQ,2BAA0B;AAE1D,MAAMC,YAAY;AASlB,OAAO,MAAMC,UAAkC,CAAC,EAAEC,EAAE,EAAEC,WAAW,EAAEC,MAAM,EAAEC,IAAI,EAAE;IAC/E,MAAM,EAAEC,IAAI,EAAE,GAAGX;IACjB,MAAM,EAAEY,OAAOC,UAAU,EAAE,GAAGV,SAASK,aAAaC,OAAOK,IAAI;IAC/D,MAAM,EAAEC,QAAQ,EAAEC,aAAa,EAAE,GAAGZ,gBAAgBM;IAEpD,MAAMO,sBACJ;;YACGF,0BAAY,KAACG;gBAAIC,WAAW,GAAGd,UAAU,gBAAgB,CAAC;;0BAC3D,KAACe;gBAAKD,WAAW,GAAGd,UAAU,YAAY,CAAC;0BAAGP,eAAeW,OAAOY,KAAK,EAAEV;;YAC1EE,eAAeS,2BACd,KAACpB;gBAAMqB,OAAOf,aAAae;gBAAOC,UAAS;gBAASZ,OAAOC;;;;IAKjE,IAAIG,eAAe;QACjB,qBACE,KAACE;YAAIC,WAAW,GAAGd,UAAU,MAAM,CAAC;YAAEE,IAAIA;sBACvCU;;IAGP;IAEA,qBACE,KAAClB;QACCoB,WAAW,GAAGd,UAAU,MAAM,CAAC;QAC/BK,MAAMA;QACNH,IAAIA;QACJkB,UAAU;QACVC,KAAKjB,OAAOkB,UAAU,GAAG,wBAAwBL;QACjDM,QAAQnB,OAAOkB,UAAU,GAAG,WAAWL;kBAEtCL;;AAGP,EAAC"}
1
+ {"version":3,"sources":["../../../../src/components/EnhancedSidebar/NavItem/index.tsx"],"sourcesContent":["'use client'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { Link, useTranslation } from '@payloadcms/ui'\nimport React from 'react'\n\nimport type { BadgeConfig, ExtendedEntity } from '../../../types.js'\n\nimport { Badge } from '../Badge/index.js'\nimport { useBadge } from '../hooks/useBadge.js'\nimport { useNavItemState } from '../hooks/useNavItemState.js'\n\nconst baseClass = 'enhanced-sidebar'\n\nexport type NavItemProps = {\n badgeConfig?: BadgeConfig\n entity: ExtendedEntity\n href: string\n id: string\n}\n\nexport const NavItem: React.FC<NavItemProps> = ({ id, badgeConfig, entity, href }) => {\n const { i18n } = useTranslation()\n const { value: badgeValue } = useBadge(badgeConfig, entity.slug)\n const { isActive, isCurrentPage } = useNavItemState(href)\n\n const Label = (\n <>\n {isActive && <div className={`${baseClass}__link-indicator`} />}\n <span className={`${baseClass}__link-label`}>{getTranslation(entity.label, i18n)}</span>\n {badgeValue !== undefined && (\n <Badge color={badgeConfig?.color} position=\"inline\" value={badgeValue} />\n )}\n </>\n )\n\n if (isCurrentPage) {\n return (\n <div className={`${baseClass}__link`} id={id}>\n {Label}\n </div>\n )\n }\n\n return (\n <Link\n className={`${baseClass}__link`}\n href={href}\n id={id}\n prefetch={false}\n rel={entity.isExternal ? 'noopener noreferrer' : undefined}\n target={entity.isExternal ? '_blank' : undefined}\n >\n {Label}\n </Link>\n )\n}\n"],"names":["getTranslation","Link","useTranslation","React","Badge","useBadge","useNavItemState","baseClass","NavItem","id","badgeConfig","entity","href","i18n","value","badgeValue","slug","isActive","isCurrentPage","Label","div","className","span","label","undefined","color","position","prefetch","rel","isExternal","target"],"mappings":"AAAA;;AAEA,SAASA,cAAc,QAAQ,2BAA0B;AACzD,SAASC,IAAI,EAAEC,cAAc,QAAQ,iBAAgB;AACrD,OAAOC,WAAW,QAAO;AAIzB,SAASC,KAAK,QAAQ,oBAAmB;AACzC,SAASC,QAAQ,QAAQ,uBAAsB;AAC/C,SAASC,eAAe,QAAQ,8BAA6B;AAE7D,MAAMC,YAAY;AASlB,OAAO,MAAMC,UAAkC,CAAC,EAAEC,EAAE,EAAEC,WAAW,EAAEC,MAAM,EAAEC,IAAI,EAAE;IAC/E,MAAM,EAAEC,IAAI,EAAE,GAAGX;IACjB,MAAM,EAAEY,OAAOC,UAAU,EAAE,GAAGV,SAASK,aAAaC,OAAOK,IAAI;IAC/D,MAAM,EAAEC,QAAQ,EAAEC,aAAa,EAAE,GAAGZ,gBAAgBM;IAEpD,MAAMO,sBACJ;;YACGF,0BAAY,KAACG;gBAAIC,WAAW,GAAGd,UAAU,gBAAgB,CAAC;;0BAC3D,KAACe;gBAAKD,WAAW,GAAGd,UAAU,YAAY,CAAC;0BAAGP,eAAeW,OAAOY,KAAK,EAAEV;;YAC1EE,eAAeS,2BACd,KAACpB;gBAAMqB,OAAOf,aAAae;gBAAOC,UAAS;gBAASZ,OAAOC;;;;IAKjE,IAAIG,eAAe;QACjB,qBACE,KAACE;YAAIC,WAAW,GAAGd,UAAU,MAAM,CAAC;YAAEE,IAAIA;sBACvCU;;IAGP;IAEA,qBACE,KAAClB;QACCoB,WAAW,GAAGd,UAAU,MAAM,CAAC;QAC/BK,MAAMA;QACNH,IAAIA;QACJkB,UAAU;QACVC,KAAKjB,OAAOkB,UAAU,GAAG,wBAAwBL;QACjDM,QAAQnB,OAAOkB,UAAU,GAAG,WAAWL;kBAEtCL;;AAGP,EAAC"}
@@ -2,7 +2,7 @@
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import { Popup, useTranslation } from '@payloadcms/ui';
4
4
  import React, { Fragment } from 'react';
5
- import { Icon } from '../Icon';
5
+ import { Icon } from '../Icon.js';
6
6
  import './index.scss';
7
7
  const baseClass = 'settings-menu-button';
8
8
  export const SettingsMenuButton = ({ settingsMenu })=>{
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/EnhancedSidebar/SettingsMenuButton/index.tsx"],"sourcesContent":["'use client'\nimport { Popup, useTranslation } from '@payloadcms/ui'\nimport React, { Fragment } from 'react'\n\nimport { Icon } from '../Icon'\nimport './index.scss'\n\nconst baseClass = 'settings-menu-button'\n\nexport type SettingsMenuButtonProps = {\n settingsMenu?: React.ReactNode[]\n}\n\nexport const SettingsMenuButton: React.FC<SettingsMenuButtonProps> = ({ settingsMenu }) => {\n const { t } = useTranslation()\n\n if (!settingsMenu || settingsMenu.length === 0) {\n return null\n }\n\n return (\n <Popup\n button={\n <span aria-label={t('general:menu')} className={`${baseClass}__button`}>\n <Icon name=\"Settings\" size={20} />\n </span>\n }\n className={baseClass}\n horizontalAlign=\"right\"\n id=\"settings-menu\"\n size=\"small\"\n verticalAlign=\"top\"\n >\n {settingsMenu.map((item, i) => (\n <Fragment key={`settings-menu-item-${i}`}>{item}</Fragment>\n ))}\n </Popup>\n )\n}\n"],"names":["Popup","useTranslation","React","Fragment","Icon","baseClass","SettingsMenuButton","settingsMenu","t","length","button","span","aria-label","className","name","size","horizontalAlign","id","verticalAlign","map","item","i"],"mappings":"AAAA;;AACA,SAASA,KAAK,EAAEC,cAAc,QAAQ,iBAAgB;AACtD,OAAOC,SAASC,QAAQ,QAAQ,QAAO;AAEvC,SAASC,IAAI,QAAQ,UAAS;AAC9B,OAAO,eAAc;AAErB,MAAMC,YAAY;AAMlB,OAAO,MAAMC,qBAAwD,CAAC,EAAEC,YAAY,EAAE;IACpF,MAAM,EAAEC,CAAC,EAAE,GAAGP;IAEd,IAAI,CAACM,gBAAgBA,aAAaE,MAAM,KAAK,GAAG;QAC9C,OAAO;IACT;IAEA,qBACE,KAACT;QACCU,sBACE,KAACC;YAAKC,cAAYJ,EAAE;YAAiBK,WAAW,GAAGR,UAAU,QAAQ,CAAC;sBACpE,cAAA,KAACD;gBAAKU,MAAK;gBAAWC,MAAM;;;QAGhCF,WAAWR;QACXW,iBAAgB;QAChBC,IAAG;QACHF,MAAK;QACLG,eAAc;kBAEbX,aAAaY,GAAG,CAAC,CAACC,MAAMC,kBACvB,KAAClB;0BAA0CiB;eAA5B,CAAC,mBAAmB,EAAEC,GAAG;;AAIhD,EAAC"}
1
+ {"version":3,"sources":["../../../../src/components/EnhancedSidebar/SettingsMenuButton/index.tsx"],"sourcesContent":["'use client'\nimport { Popup, useTranslation } from '@payloadcms/ui'\nimport React, { Fragment } from 'react'\n\nimport { Icon } from '../Icon.js'\nimport './index.scss'\n\nconst baseClass = 'settings-menu-button'\n\nexport type SettingsMenuButtonProps = {\n settingsMenu?: React.ReactNode[]\n}\n\nexport const SettingsMenuButton: React.FC<SettingsMenuButtonProps> = ({ settingsMenu }) => {\n const { t } = useTranslation()\n\n if (!settingsMenu || settingsMenu.length === 0) {\n return null\n }\n\n return (\n <Popup\n button={\n <span aria-label={t('general:menu')} className={`${baseClass}__button`}>\n <Icon name=\"Settings\" size={20} />\n </span>\n }\n className={baseClass}\n horizontalAlign=\"right\"\n id=\"settings-menu\"\n size=\"small\"\n verticalAlign=\"top\"\n >\n {settingsMenu.map((item, i) => (\n <Fragment key={`settings-menu-item-${i}`}>{item}</Fragment>\n ))}\n </Popup>\n )\n}\n"],"names":["Popup","useTranslation","React","Fragment","Icon","baseClass","SettingsMenuButton","settingsMenu","t","length","button","span","aria-label","className","name","size","horizontalAlign","id","verticalAlign","map","item","i"],"mappings":"AAAA;;AACA,SAASA,KAAK,EAAEC,cAAc,QAAQ,iBAAgB;AACtD,OAAOC,SAASC,QAAQ,QAAQ,QAAO;AAEvC,SAASC,IAAI,QAAQ,aAAY;AACjC,OAAO,eAAc;AAErB,MAAMC,YAAY;AAMlB,OAAO,MAAMC,qBAAwD,CAAC,EAAEC,YAAY,EAAE;IACpF,MAAM,EAAEC,CAAC,EAAE,GAAGP;IAEd,IAAI,CAACM,gBAAgBA,aAAaE,MAAM,KAAK,GAAG;QAC9C,OAAO;IACT;IAEA,qBACE,KAACT;QACCU,sBACE,KAACC;YAAKC,cAAYJ,EAAE;YAAiBK,WAAW,GAAGR,UAAU,QAAQ,CAAC;sBACpE,cAAA,KAACD;gBAAKU,MAAK;gBAAWC,MAAM;;;QAGhCF,WAAWR;QACXW,iBAAgB;QAChBC,IAAG;QACHF,MAAK;QACLG,eAAc;kBAEbX,aAAaY,GAAG,CAAC,CAACC,MAAMC,kBACvB,KAAClB;0BAA0CiB;eAA5B,CAAC,mBAAmB,EAAEC,GAAG;;AAIhD,EAAC"}
@@ -1,4 +1,4 @@
1
- @import '../../../../node_modules/@payloadcms/ui/dist/scss/vars';
1
+ @import '~@payloadcms/ui/scss';
2
2
 
3
3
  @layer payload-default {
4
4
  .settings-menu-button {
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import type { EnhancedSidebarConfig } from '../../types';
2
+ import type { EnhancedSidebarConfig } from '../../types.js';
3
3
  export type SidebarContentProps = {
4
4
  afterNav?: React.ReactNode;
5
5
  afterNavLinks?: React.ReactNode;
@@ -1,10 +1,10 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import React, { useCallback, useMemo, useState } from 'react';
4
- import { EnhancedSidebarContext } from './context';
5
- import { NavContent } from './NavContent';
6
- import { SidebarWrapper } from './SidebarWrapper';
7
- import { TabsBar } from './TabsBar';
4
+ import { EnhancedSidebarContext } from './context.js';
5
+ import { NavContent } from './NavContent/index.js';
6
+ import { SidebarWrapper } from './SidebarWrapper/index.js';
7
+ import { TabsBar } from './TabsBar/index.js';
8
8
  const baseClass = 'enhanced-sidebar';
9
9
  const COOKIE_KEY = 'payload-enhanced-sidebar-active-tab';
10
10
  const setTabCookie = (tabId)=>{
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/EnhancedSidebar/SidebarContent.tsx"],"sourcesContent":["'use client'\n\nimport React, { useCallback, useMemo, useState } from 'react'\n\nimport type { EnhancedSidebarConfig } from '../../types'\n\nimport { EnhancedSidebarContext } from './context'\nimport { NavContent } from './NavContent'\nimport { SidebarWrapper } from './SidebarWrapper'\nimport { TabsBar } from './TabsBar'\n\nconst baseClass = 'enhanced-sidebar'\n\nexport type SidebarContentProps = {\n afterNav?: React.ReactNode\n afterNavLinks?: React.ReactNode\n allContent?: React.ReactNode\n beforeNav?: React.ReactNode\n beforeNavLinks?: React.ReactNode\n customNavContent?: React.ReactNode\n customTabComponents?: Record<string, React.ReactNode>\n initialActiveTabId: string\n renderedTabItems?: React.ReactNode[]\n settingsMenu?: React.ReactNode[]\n sidebarConfig: EnhancedSidebarConfig\n tabIcons?: Record<string, React.ReactNode>\n tabsContent: Record<string, React.ReactNode>\n}\n\nconst COOKIE_KEY = 'payload-enhanced-sidebar-active-tab'\n\nconst setTabCookie = (tabId: string) => {\n document.cookie = `${COOKIE_KEY}=${tabId}; path=/; max-age=31536000; SameSite=Lax`\n}\n\nexport const SidebarContent: React.FC<SidebarContentProps> = ({\n afterNav,\n afterNavLinks,\n allContent,\n beforeNav,\n beforeNavLinks,\n customNavContent,\n customTabComponents,\n initialActiveTabId,\n renderedTabItems,\n settingsMenu,\n sidebarConfig,\n tabIcons,\n tabsContent,\n}) => {\n const [activeTabId, setActiveTabId] = useState(initialActiveTabId)\n\n const handleTabChange = useCallback((tabId: string) => {\n setActiveTabId(tabId)\n setTabCookie(tabId)\n }, [])\n\n const contextValue = useMemo(\n () => ({ activeTabId, onTabChange: handleTabChange }),\n [activeTabId, handleTabChange],\n )\n\n const tabs = sidebarConfig.tabs?.filter((t) => t.type === 'tab') ?? []\n\n return (\n <EnhancedSidebarContext.Provider value={contextValue}>\n <SidebarWrapper baseClass={baseClass}>\n <TabsBar\n activeTabId={activeTabId}\n customTabComponents={customTabComponents}\n onTabChange={handleTabChange}\n renderedTabItems={renderedTabItems}\n settingsMenu={settingsMenu}\n sidebarConfig={sidebarConfig}\n tabIcons={tabIcons}\n />\n {customNavContent ?? (\n <NavContent\n afterNav={afterNav}\n afterNavLinks={afterNavLinks}\n allContent={allContent}\n beforeNav={beforeNav}\n beforeNavLinks={beforeNavLinks}\n tabs={tabs}\n tabsContent={tabsContent}\n />\n )}\n </SidebarWrapper>\n </EnhancedSidebarContext.Provider>\n )\n}\n"],"names":["React","useCallback","useMemo","useState","EnhancedSidebarContext","NavContent","SidebarWrapper","TabsBar","baseClass","COOKIE_KEY","setTabCookie","tabId","document","cookie","SidebarContent","afterNav","afterNavLinks","allContent","beforeNav","beforeNavLinks","customNavContent","customTabComponents","initialActiveTabId","renderedTabItems","settingsMenu","sidebarConfig","tabIcons","tabsContent","activeTabId","setActiveTabId","handleTabChange","contextValue","onTabChange","tabs","filter","t","type","Provider","value"],"mappings":"AAAA;;AAEA,OAAOA,SAASC,WAAW,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,QAAO;AAI7D,SAASC,sBAAsB,QAAQ,YAAW;AAClD,SAASC,UAAU,QAAQ,eAAc;AACzC,SAASC,cAAc,QAAQ,mBAAkB;AACjD,SAASC,OAAO,QAAQ,YAAW;AAEnC,MAAMC,YAAY;AAkBlB,MAAMC,aAAa;AAEnB,MAAMC,eAAe,CAACC;IACpBC,SAASC,MAAM,GAAG,GAAGJ,WAAW,CAAC,EAAEE,MAAM,wCAAwC,CAAC;AACpF;AAEA,OAAO,MAAMG,iBAAgD,CAAC,EAC5DC,QAAQ,EACRC,aAAa,EACbC,UAAU,EACVC,SAAS,EACTC,cAAc,EACdC,gBAAgB,EAChBC,mBAAmB,EACnBC,kBAAkB,EAClBC,gBAAgB,EAChBC,YAAY,EACZC,aAAa,EACbC,QAAQ,EACRC,WAAW,EACZ;IACC,MAAM,CAACC,aAAaC,eAAe,GAAG1B,SAASmB;IAE/C,MAAMQ,kBAAkB7B,YAAY,CAACU;QACnCkB,eAAelB;QACfD,aAAaC;IACf,GAAG,EAAE;IAEL,MAAMoB,eAAe7B,QACnB,IAAO,CAAA;YAAE0B;YAAaI,aAAaF;QAAgB,CAAA,GACnD;QAACF;QAAaE;KAAgB;IAGhC,MAAMG,OAAOR,cAAcQ,IAAI,EAAEC,OAAO,CAACC,IAAMA,EAAEC,IAAI,KAAK,UAAU,EAAE;IAEtE,qBACE,KAAChC,uBAAuBiC,QAAQ;QAACC,OAAOP;kBACtC,cAAA,MAACzB;YAAeE,WAAWA;;8BACzB,KAACD;oBACCqB,aAAaA;oBACbP,qBAAqBA;oBACrBW,aAAaF;oBACbP,kBAAkBA;oBAClBC,cAAcA;oBACdC,eAAeA;oBACfC,UAAUA;;gBAEXN,kCACC,KAACf;oBACCU,UAAUA;oBACVC,eAAeA;oBACfC,YAAYA;oBACZC,WAAWA;oBACXC,gBAAgBA;oBAChBc,MAAMA;oBACNN,aAAaA;;;;;AAMzB,EAAC"}
1
+ {"version":3,"sources":["../../../src/components/EnhancedSidebar/SidebarContent.tsx"],"sourcesContent":["'use client'\n\nimport React, { useCallback, useMemo, useState } from 'react'\n\nimport type { EnhancedSidebarConfig } from '../../types.js'\n\nimport { EnhancedSidebarContext } from './context.js'\nimport { NavContent } from './NavContent/index.js'\nimport { SidebarWrapper } from './SidebarWrapper/index.js'\nimport { TabsBar } from './TabsBar/index.js'\n\nconst baseClass = 'enhanced-sidebar'\n\nexport type SidebarContentProps = {\n afterNav?: React.ReactNode\n afterNavLinks?: React.ReactNode\n allContent?: React.ReactNode\n beforeNav?: React.ReactNode\n beforeNavLinks?: React.ReactNode\n customNavContent?: React.ReactNode\n customTabComponents?: Record<string, React.ReactNode>\n initialActiveTabId: string\n renderedTabItems?: React.ReactNode[]\n settingsMenu?: React.ReactNode[]\n sidebarConfig: EnhancedSidebarConfig\n tabIcons?: Record<string, React.ReactNode>\n tabsContent: Record<string, React.ReactNode>\n}\n\nconst COOKIE_KEY = 'payload-enhanced-sidebar-active-tab'\n\nconst setTabCookie = (tabId: string) => {\n document.cookie = `${COOKIE_KEY}=${tabId}; path=/; max-age=31536000; SameSite=Lax`\n}\n\nexport const SidebarContent: React.FC<SidebarContentProps> = ({\n afterNav,\n afterNavLinks,\n allContent,\n beforeNav,\n beforeNavLinks,\n customNavContent,\n customTabComponents,\n initialActiveTabId,\n renderedTabItems,\n settingsMenu,\n sidebarConfig,\n tabIcons,\n tabsContent,\n}) => {\n const [activeTabId, setActiveTabId] = useState(initialActiveTabId)\n\n const handleTabChange = useCallback((tabId: string) => {\n setActiveTabId(tabId)\n setTabCookie(tabId)\n }, [])\n\n const contextValue = useMemo(\n () => ({ activeTabId, onTabChange: handleTabChange }),\n [activeTabId, handleTabChange],\n )\n\n const tabs = sidebarConfig.tabs?.filter((t) => t.type === 'tab') ?? []\n\n return (\n <EnhancedSidebarContext.Provider value={contextValue}>\n <SidebarWrapper baseClass={baseClass}>\n <TabsBar\n activeTabId={activeTabId}\n customTabComponents={customTabComponents}\n onTabChange={handleTabChange}\n renderedTabItems={renderedTabItems}\n settingsMenu={settingsMenu}\n sidebarConfig={sidebarConfig}\n tabIcons={tabIcons}\n />\n {customNavContent ?? (\n <NavContent\n afterNav={afterNav}\n afterNavLinks={afterNavLinks}\n allContent={allContent}\n beforeNav={beforeNav}\n beforeNavLinks={beforeNavLinks}\n tabs={tabs}\n tabsContent={tabsContent}\n />\n )}\n </SidebarWrapper>\n </EnhancedSidebarContext.Provider>\n )\n}\n"],"names":["React","useCallback","useMemo","useState","EnhancedSidebarContext","NavContent","SidebarWrapper","TabsBar","baseClass","COOKIE_KEY","setTabCookie","tabId","document","cookie","SidebarContent","afterNav","afterNavLinks","allContent","beforeNav","beforeNavLinks","customNavContent","customTabComponents","initialActiveTabId","renderedTabItems","settingsMenu","sidebarConfig","tabIcons","tabsContent","activeTabId","setActiveTabId","handleTabChange","contextValue","onTabChange","tabs","filter","t","type","Provider","value"],"mappings":"AAAA;;AAEA,OAAOA,SAASC,WAAW,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,QAAO;AAI7D,SAASC,sBAAsB,QAAQ,eAAc;AACrD,SAASC,UAAU,QAAQ,wBAAuB;AAClD,SAASC,cAAc,QAAQ,4BAA2B;AAC1D,SAASC,OAAO,QAAQ,qBAAoB;AAE5C,MAAMC,YAAY;AAkBlB,MAAMC,aAAa;AAEnB,MAAMC,eAAe,CAACC;IACpBC,SAASC,MAAM,GAAG,GAAGJ,WAAW,CAAC,EAAEE,MAAM,wCAAwC,CAAC;AACpF;AAEA,OAAO,MAAMG,iBAAgD,CAAC,EAC5DC,QAAQ,EACRC,aAAa,EACbC,UAAU,EACVC,SAAS,EACTC,cAAc,EACdC,gBAAgB,EAChBC,mBAAmB,EACnBC,kBAAkB,EAClBC,gBAAgB,EAChBC,YAAY,EACZC,aAAa,EACbC,QAAQ,EACRC,WAAW,EACZ;IACC,MAAM,CAACC,aAAaC,eAAe,GAAG1B,SAASmB;IAE/C,MAAMQ,kBAAkB7B,YAAY,CAACU;QACnCkB,eAAelB;QACfD,aAAaC;IACf,GAAG,EAAE;IAEL,MAAMoB,eAAe7B,QACnB,IAAO,CAAA;YAAE0B;YAAaI,aAAaF;QAAgB,CAAA,GACnD;QAACF;QAAaE;KAAgB;IAGhC,MAAMG,OAAOR,cAAcQ,IAAI,EAAEC,OAAO,CAACC,IAAMA,EAAEC,IAAI,KAAK,UAAU,EAAE;IAEtE,qBACE,KAAChC,uBAAuBiC,QAAQ;QAACC,OAAOP;kBACtC,cAAA,MAACzB;YAAeE,WAAWA;;8BACzB,KAACD;oBACCqB,aAAaA;oBACbP,qBAAqBA;oBACrBW,aAAaF;oBACbP,kBAAkBA;oBAClBC,cAAcA;oBACdC,eAAeA;oBACfC,UAAUA;;gBAEXN,kCACC,KAACf;oBACCU,UAAUA;oBACVC,eAAeA;oBACfC,YAAYA;oBACZC,WAAWA;oBACXC,gBAAgBA;oBAChBc,MAAMA;oBACNN,aAAaA;;;;;AAMzB,EAAC"}
@@ -2,7 +2,7 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useNav } from '@payloadcms/ui';
4
4
  import React from 'react';
5
- import { NavHamburger } from '../NavHamburger';
5
+ import { NavHamburger } from '../NavHamburger/index.js';
6
6
  import './index.scss';
7
7
  export const SidebarWrapper = ({ baseClass, children })=>{
8
8
  const { hydrated, navOpen, navRef, shouldAnimate } = useNav();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/EnhancedSidebar/SidebarWrapper/index.tsx"],"sourcesContent":["'use client'\n\nimport { useNav } from '@payloadcms/ui'\nimport React from 'react'\n\nimport { NavHamburger } from '../NavHamburger'\nimport './index.scss'\n\nexport const SidebarWrapper: React.FC<{\n baseClass: string\n children: React.ReactNode\n}> = ({ baseClass, children }) => {\n const { hydrated, navOpen, navRef, shouldAnimate } = useNav()\n\n return (\n <aside\n className={[\n baseClass,\n navOpen && `${baseClass}--nav-open`,\n shouldAnimate && `${baseClass}--nav-animate`,\n hydrated && `${baseClass}--nav-hydrated`,\n ]\n .filter(Boolean)\n .join(' ')}\n inert={!navOpen ? true : undefined}\n >\n <div className={`${baseClass}__header`}>\n <NavHamburger baseClass={baseClass} />\n </div>\n <div className={`${baseClass}__scroll`} ref={navRef}>\n {children}\n </div>\n </aside>\n )\n}\n"],"names":["useNav","React","NavHamburger","SidebarWrapper","baseClass","children","hydrated","navOpen","navRef","shouldAnimate","aside","className","filter","Boolean","join","inert","undefined","div","ref"],"mappings":"AAAA;;AAEA,SAASA,MAAM,QAAQ,iBAAgB;AACvC,OAAOC,WAAW,QAAO;AAEzB,SAASC,YAAY,QAAQ,kBAAiB;AAC9C,OAAO,eAAc;AAErB,OAAO,MAAMC,iBAGR,CAAC,EAAEC,SAAS,EAAEC,QAAQ,EAAE;IAC3B,MAAM,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,MAAM,EAAEC,aAAa,EAAE,GAAGT;IAErD,qBACE,MAACU;QACCC,WAAW;YACTP;YACAG,WAAW,GAAGH,UAAU,UAAU,CAAC;YACnCK,iBAAiB,GAAGL,UAAU,aAAa,CAAC;YAC5CE,YAAY,GAAGF,UAAU,cAAc,CAAC;SACzC,CACEQ,MAAM,CAACC,SACPC,IAAI,CAAC;QACRC,OAAO,CAACR,UAAU,OAAOS;;0BAEzB,KAACC;gBAAIN,WAAW,GAAGP,UAAU,QAAQ,CAAC;0BACpC,cAAA,KAACF;oBAAaE,WAAWA;;;0BAE3B,KAACa;gBAAIN,WAAW,GAAGP,UAAU,QAAQ,CAAC;gBAAEc,KAAKV;0BAC1CH;;;;AAIT,EAAC"}
1
+ {"version":3,"sources":["../../../../src/components/EnhancedSidebar/SidebarWrapper/index.tsx"],"sourcesContent":["'use client'\n\nimport { useNav } from '@payloadcms/ui'\nimport React from 'react'\n\nimport { NavHamburger } from '../NavHamburger/index.js'\nimport './index.scss'\n\nexport const SidebarWrapper: React.FC<{\n baseClass: string\n children: React.ReactNode\n}> = ({ baseClass, children }) => {\n const { hydrated, navOpen, navRef, shouldAnimate } = useNav()\n\n return (\n <aside\n className={[\n baseClass,\n navOpen && `${baseClass}--nav-open`,\n shouldAnimate && `${baseClass}--nav-animate`,\n hydrated && `${baseClass}--nav-hydrated`,\n ]\n .filter(Boolean)\n .join(' ')}\n inert={!navOpen ? true : undefined}\n >\n <div className={`${baseClass}__header`}>\n <NavHamburger baseClass={baseClass} />\n </div>\n <div className={`${baseClass}__scroll`} ref={navRef}>\n {children}\n </div>\n </aside>\n )\n}\n"],"names":["useNav","React","NavHamburger","SidebarWrapper","baseClass","children","hydrated","navOpen","navRef","shouldAnimate","aside","className","filter","Boolean","join","inert","undefined","div","ref"],"mappings":"AAAA;;AAEA,SAASA,MAAM,QAAQ,iBAAgB;AACvC,OAAOC,WAAW,QAAO;AAEzB,SAASC,YAAY,QAAQ,2BAA0B;AACvD,OAAO,eAAc;AAErB,OAAO,MAAMC,iBAGR,CAAC,EAAEC,SAAS,EAAEC,QAAQ,EAAE;IAC3B,MAAM,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,MAAM,EAAEC,aAAa,EAAE,GAAGT;IAErD,qBACE,MAACU;QACCC,WAAW;YACTP;YACAG,WAAW,GAAGH,UAAU,UAAU,CAAC;YACnCK,iBAAiB,GAAGL,UAAU,aAAa,CAAC;YAC5CE,YAAY,GAAGF,UAAU,cAAc,CAAC;SACzC,CACEQ,MAAM,CAACC,SACPC,IAAI,CAAC;QACRC,OAAO,CAACR,UAAU,OAAOS;;0BAEzB,KAACC;gBAAIN,WAAW,GAAGP,UAAU,QAAQ,CAAC;0BACpC,cAAA,KAACF;oBAAaE,WAAWA;;;0BAE3B,KAACa;gBAAIN,WAAW,GAAGP,UAAU,QAAQ,CAAC;gBAAEc,KAAKV;0BAC1CH;;;;AAIT,EAAC"}
@@ -1,4 +1,4 @@
1
- @import '../../../../node_modules/@payloadcms/ui/dist/scss/vars';
1
+ @import '~@payloadcms/ui/scss';
2
2
 
3
3
  @layer payload-default {
4
4
  .enhanced-sidebar {
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import type { SidebarTabContent, SidebarTabLink } from '../../../types';
2
+ import type { SidebarTabContent, SidebarTabLink } from '../../../types.js';
3
3
  type TabButtonProps = {
4
4
  icon?: React.ReactNode;
5
5
  isActive: boolean;
@@ -3,9 +3,9 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
3
3
  import { getTranslation } from '@payloadcms/translations';
4
4
  import { Link, Tooltip, useTranslation } from '@payloadcms/ui';
5
5
  import React, { useState } from 'react';
6
- import { Badge } from '../Badge';
7
- import { useBadge } from '../hooks/useBadge';
8
- import { Icon } from '../Icon';
6
+ import { Badge } from '../Badge/index.js';
7
+ import { useBadge } from '../hooks/useBadge.js';
8
+ import { Icon } from '../Icon.js';
9
9
  const tabsBaseClass = 'tabs-bar';
10
10
  export const TabButton = ({ icon, isActive, onTabChange, tab })=>{
11
11
  const { i18n } = useTranslation();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/EnhancedSidebar/TabsBar/TabItem.tsx"],"sourcesContent":["'use client'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { Link, Tooltip, useTranslation } from '@payloadcms/ui'\nimport React, { useState } from 'react'\n\nimport type { SidebarTabContent, SidebarTabLink } from '../../../types'\n\nimport { Badge } from '../Badge'\nimport { useBadge } from '../hooks/useBadge'\nimport { Icon } from '../Icon'\n\nconst tabsBaseClass = 'tabs-bar'\n\ntype TabButtonProps = {\n icon?: React.ReactNode\n isActive: boolean\n onTabChange: (tabId: string) => void\n tab: SidebarTabContent\n}\n\nexport const TabButton: React.FC<TabButtonProps> = ({ icon, isActive, onTabChange, tab }) => {\n const { i18n } = useTranslation()\n const label = getTranslation(tab.label, i18n)\n const { value } = useBadge(tab.badge, tab.id)\n const [hovered, setHovered] = useState(false)\n\n return (\n <>\n <button\n aria-label={label}\n className={`${tabsBaseClass}__tab ${isActive ? `${tabsBaseClass}__tab--active` : ''}`}\n onBlur={() => setHovered(false)}\n onClick={() => onTabChange(tab.id)}\n onFocus={() => setHovered(true)}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n type=\"button\"\n >\n {icon ?? <Icon name={tab.icon!} size={20} />}\n {value !== undefined && (\n <Badge color={tab.badge?.color} position=\"absolute\" value={value} />\n )}\n <Tooltip alignCaret=\"left\" show={hovered}>\n {label}\n </Tooltip>\n </button>\n </>\n )\n}\n\ntype TabLinkProps = {\n href: string\n icon?: React.ReactNode\n isActive: boolean\n link: SidebarTabLink\n}\n\nexport const TabLink: React.FC<TabLinkProps> = ({ href, icon, isActive, link }) => {\n const { i18n } = useTranslation()\n const label = getTranslation(link.label, i18n)\n const { value } = useBadge(link.badge, link.id)\n const [hovered, setHovered] = useState(false)\n\n return (\n <Link\n aria-label={label}\n className={`${tabsBaseClass}__link ${isActive ? `${tabsBaseClass}__link--active` : ''}`}\n href={href}\n onBlur={() => setHovered(false)}\n onFocus={() => setHovered(true)}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n rel={link.isExternal ? 'noopener noreferrer' : undefined}\n target={link.isExternal ? '_blank' : undefined}\n >\n {icon ?? <Icon name={link.icon!} size={20} />}\n {value !== undefined && <Badge color={link.badge?.color} position=\"absolute\" value={value} />}\n <Tooltip alignCaret=\"left\" show={hovered}>\n {label}\n </Tooltip>\n </Link>\n )\n}\n"],"names":["getTranslation","Link","Tooltip","useTranslation","React","useState","Badge","useBadge","Icon","tabsBaseClass","TabButton","icon","isActive","onTabChange","tab","i18n","label","value","badge","id","hovered","setHovered","button","aria-label","className","onBlur","onClick","onFocus","onMouseEnter","onMouseLeave","type","name","size","undefined","color","position","alignCaret","show","TabLink","href","link","rel","isExternal","target"],"mappings":"AAAA;;AAEA,SAASA,cAAc,QAAQ,2BAA0B;AACzD,SAASC,IAAI,EAAEC,OAAO,EAAEC,cAAc,QAAQ,iBAAgB;AAC9D,OAAOC,SAASC,QAAQ,QAAQ,QAAO;AAIvC,SAASC,KAAK,QAAQ,WAAU;AAChC,SAASC,QAAQ,QAAQ,oBAAmB;AAC5C,SAASC,IAAI,QAAQ,UAAS;AAE9B,MAAMC,gBAAgB;AAStB,OAAO,MAAMC,YAAsC,CAAC,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,WAAW,EAAEC,GAAG,EAAE;IACtF,MAAM,EAAEC,IAAI,EAAE,GAAGZ;IACjB,MAAMa,QAAQhB,eAAec,IAAIE,KAAK,EAAED;IACxC,MAAM,EAAEE,KAAK,EAAE,GAAGV,SAASO,IAAII,KAAK,EAAEJ,IAAIK,EAAE;IAC5C,MAAM,CAACC,SAASC,WAAW,GAAGhB,SAAS;IAEvC,qBACE;kBACE,cAAA,MAACiB;YACCC,cAAYP;YACZQ,WAAW,GAAGf,cAAc,MAAM,EAAEG,WAAW,GAAGH,cAAc,aAAa,CAAC,GAAG,IAAI;YACrFgB,QAAQ,IAAMJ,WAAW;YACzBK,SAAS,IAAMb,YAAYC,IAAIK,EAAE;YACjCQ,SAAS,IAAMN,WAAW;YAC1BO,cAAc,IAAMP,WAAW;YAC/BQ,cAAc,IAAMR,WAAW;YAC/BS,MAAK;;gBAEJnB,sBAAQ,KAACH;oBAAKuB,MAAMjB,IAAIH,IAAI;oBAAGqB,MAAM;;gBACrCf,UAAUgB,2BACT,KAAC3B;oBAAM4B,OAAOpB,IAAII,KAAK,EAAEgB;oBAAOC,UAAS;oBAAWlB,OAAOA;;8BAE7D,KAACf;oBAAQkC,YAAW;oBAAOC,MAAMjB;8BAC9BJ;;;;;AAKX,EAAC;AASD,OAAO,MAAMsB,UAAkC,CAAC,EAAEC,IAAI,EAAE5B,IAAI,EAAEC,QAAQ,EAAE4B,IAAI,EAAE;IAC5E,MAAM,EAAEzB,IAAI,EAAE,GAAGZ;IACjB,MAAMa,QAAQhB,eAAewC,KAAKxB,KAAK,EAAED;IACzC,MAAM,EAAEE,KAAK,EAAE,GAAGV,SAASiC,KAAKtB,KAAK,EAAEsB,KAAKrB,EAAE;IAC9C,MAAM,CAACC,SAASC,WAAW,GAAGhB,SAAS;IAEvC,qBACE,MAACJ;QACCsB,cAAYP;QACZQ,WAAW,GAAGf,cAAc,OAAO,EAAEG,WAAW,GAAGH,cAAc,cAAc,CAAC,GAAG,IAAI;QACvF8B,MAAMA;QACNd,QAAQ,IAAMJ,WAAW;QACzBM,SAAS,IAAMN,WAAW;QAC1BO,cAAc,IAAMP,WAAW;QAC/BQ,cAAc,IAAMR,WAAW;QAC/BoB,KAAKD,KAAKE,UAAU,GAAG,wBAAwBT;QAC/CU,QAAQH,KAAKE,UAAU,GAAG,WAAWT;;YAEpCtB,sBAAQ,KAACH;gBAAKuB,MAAMS,KAAK7B,IAAI;gBAAGqB,MAAM;;YACtCf,UAAUgB,2BAAa,KAAC3B;gBAAM4B,OAAOM,KAAKtB,KAAK,EAAEgB;gBAAOC,UAAS;gBAAWlB,OAAOA;;0BACpF,KAACf;gBAAQkC,YAAW;gBAAOC,MAAMjB;0BAC9BJ;;;;AAIT,EAAC"}
1
+ {"version":3,"sources":["../../../../src/components/EnhancedSidebar/TabsBar/TabItem.tsx"],"sourcesContent":["'use client'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { Link, Tooltip, useTranslation } from '@payloadcms/ui'\nimport React, { useState } from 'react'\n\nimport type { SidebarTabContent, SidebarTabLink } from '../../../types.js'\n\nimport { Badge } from '../Badge/index.js'\nimport { useBadge } from '../hooks/useBadge.js'\nimport { Icon } from '../Icon.js'\n\nconst tabsBaseClass = 'tabs-bar'\n\ntype TabButtonProps = {\n icon?: React.ReactNode\n isActive: boolean\n onTabChange: (tabId: string) => void\n tab: SidebarTabContent\n}\n\nexport const TabButton: React.FC<TabButtonProps> = ({ icon, isActive, onTabChange, tab }) => {\n const { i18n } = useTranslation()\n const label = getTranslation(tab.label, i18n)\n const { value } = useBadge(tab.badge, tab.id)\n const [hovered, setHovered] = useState(false)\n\n return (\n <>\n <button\n aria-label={label}\n className={`${tabsBaseClass}__tab ${isActive ? `${tabsBaseClass}__tab--active` : ''}`}\n onBlur={() => setHovered(false)}\n onClick={() => onTabChange(tab.id)}\n onFocus={() => setHovered(true)}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n type=\"button\"\n >\n {icon ?? <Icon name={tab.icon!} size={20} />}\n {value !== undefined && (\n <Badge color={tab.badge?.color} position=\"absolute\" value={value} />\n )}\n <Tooltip alignCaret=\"left\" show={hovered}>\n {label}\n </Tooltip>\n </button>\n </>\n )\n}\n\ntype TabLinkProps = {\n href: string\n icon?: React.ReactNode\n isActive: boolean\n link: SidebarTabLink\n}\n\nexport const TabLink: React.FC<TabLinkProps> = ({ href, icon, isActive, link }) => {\n const { i18n } = useTranslation()\n const label = getTranslation(link.label, i18n)\n const { value } = useBadge(link.badge, link.id)\n const [hovered, setHovered] = useState(false)\n\n return (\n <Link\n aria-label={label}\n className={`${tabsBaseClass}__link ${isActive ? `${tabsBaseClass}__link--active` : ''}`}\n href={href}\n onBlur={() => setHovered(false)}\n onFocus={() => setHovered(true)}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n rel={link.isExternal ? 'noopener noreferrer' : undefined}\n target={link.isExternal ? '_blank' : undefined}\n >\n {icon ?? <Icon name={link.icon!} size={20} />}\n {value !== undefined && <Badge color={link.badge?.color} position=\"absolute\" value={value} />}\n <Tooltip alignCaret=\"left\" show={hovered}>\n {label}\n </Tooltip>\n </Link>\n )\n}\n"],"names":["getTranslation","Link","Tooltip","useTranslation","React","useState","Badge","useBadge","Icon","tabsBaseClass","TabButton","icon","isActive","onTabChange","tab","i18n","label","value","badge","id","hovered","setHovered","button","aria-label","className","onBlur","onClick","onFocus","onMouseEnter","onMouseLeave","type","name","size","undefined","color","position","alignCaret","show","TabLink","href","link","rel","isExternal","target"],"mappings":"AAAA;;AAEA,SAASA,cAAc,QAAQ,2BAA0B;AACzD,SAASC,IAAI,EAAEC,OAAO,EAAEC,cAAc,QAAQ,iBAAgB;AAC9D,OAAOC,SAASC,QAAQ,QAAQ,QAAO;AAIvC,SAASC,KAAK,QAAQ,oBAAmB;AACzC,SAASC,QAAQ,QAAQ,uBAAsB;AAC/C,SAASC,IAAI,QAAQ,aAAY;AAEjC,MAAMC,gBAAgB;AAStB,OAAO,MAAMC,YAAsC,CAAC,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,WAAW,EAAEC,GAAG,EAAE;IACtF,MAAM,EAAEC,IAAI,EAAE,GAAGZ;IACjB,MAAMa,QAAQhB,eAAec,IAAIE,KAAK,EAAED;IACxC,MAAM,EAAEE,KAAK,EAAE,GAAGV,SAASO,IAAII,KAAK,EAAEJ,IAAIK,EAAE;IAC5C,MAAM,CAACC,SAASC,WAAW,GAAGhB,SAAS;IAEvC,qBACE;kBACE,cAAA,MAACiB;YACCC,cAAYP;YACZQ,WAAW,GAAGf,cAAc,MAAM,EAAEG,WAAW,GAAGH,cAAc,aAAa,CAAC,GAAG,IAAI;YACrFgB,QAAQ,IAAMJ,WAAW;YACzBK,SAAS,IAAMb,YAAYC,IAAIK,EAAE;YACjCQ,SAAS,IAAMN,WAAW;YAC1BO,cAAc,IAAMP,WAAW;YAC/BQ,cAAc,IAAMR,WAAW;YAC/BS,MAAK;;gBAEJnB,sBAAQ,KAACH;oBAAKuB,MAAMjB,IAAIH,IAAI;oBAAGqB,MAAM;;gBACrCf,UAAUgB,2BACT,KAAC3B;oBAAM4B,OAAOpB,IAAII,KAAK,EAAEgB;oBAAOC,UAAS;oBAAWlB,OAAOA;;8BAE7D,KAACf;oBAAQkC,YAAW;oBAAOC,MAAMjB;8BAC9BJ;;;;;AAKX,EAAC;AASD,OAAO,MAAMsB,UAAkC,CAAC,EAAEC,IAAI,EAAE5B,IAAI,EAAEC,QAAQ,EAAE4B,IAAI,EAAE;IAC5E,MAAM,EAAEzB,IAAI,EAAE,GAAGZ;IACjB,MAAMa,QAAQhB,eAAewC,KAAKxB,KAAK,EAAED;IACzC,MAAM,EAAEE,KAAK,EAAE,GAAGV,SAASiC,KAAKtB,KAAK,EAAEsB,KAAKrB,EAAE;IAC9C,MAAM,CAACC,SAASC,WAAW,GAAGhB,SAAS;IAEvC,qBACE,MAACJ;QACCsB,cAAYP;QACZQ,WAAW,GAAGf,cAAc,OAAO,EAAEG,WAAW,GAAGH,cAAc,cAAc,CAAC,GAAG,IAAI;QACvF8B,MAAMA;QACNd,QAAQ,IAAMJ,WAAW;QACzBM,SAAS,IAAMN,WAAW;QAC1BO,cAAc,IAAMP,WAAW;QAC/BQ,cAAc,IAAMR,WAAW;QAC/BoB,KAAKD,KAAKE,UAAU,GAAG,wBAAwBT;QAC/CU,QAAQH,KAAKE,UAAU,GAAG,WAAWT;;YAEpCtB,sBAAQ,KAACH;gBAAKuB,MAAMS,KAAK7B,IAAI;gBAAGqB,MAAM;;YACtCf,UAAUgB,2BAAa,KAAC3B;gBAAM4B,OAAOM,KAAKtB,KAAK,EAAEgB;gBAAOC,UAAS;gBAAWlB,OAAOA;;0BACpF,KAACf;gBAAQkC,YAAW;gBAAOC,MAAMjB;0BAC9BJ;;;;AAIT,EAAC"}
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import type { EnhancedSidebarConfig } from '../../../types';
2
+ import type { EnhancedSidebarConfig } from '../../../types.js';
3
3
  import './index.scss';
4
4
  export type TabsBarProps = {
5
5
  activeTabId: string;
@@ -2,12 +2,12 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { getTranslation } from '@payloadcms/translations';
4
4
  import { Link, useConfig, useTranslation } from '@payloadcms/ui';
5
- import { usePathname } from 'next/navigation';
5
+ import { usePathname } from 'next/navigation.js';
6
6
  import { formatAdminURL } from 'payload/shared';
7
7
  import React from 'react';
8
- import { Icon } from '../Icon';
9
- import { SettingsMenuButton } from '../SettingsMenuButton';
10
- import { TabButton, TabLink } from './TabItem';
8
+ import { Icon } from '../Icon.js';
9
+ import { SettingsMenuButton } from '../SettingsMenuButton/index.js';
10
+ import { TabButton, TabLink } from './TabItem.js';
11
11
  import './index.scss';
12
12
  const tabsBaseClass = 'tabs-bar';
13
13
  export const TabsBar = ({ activeTabId, customTabComponents, onTabChange, renderedTabItems, settingsMenu, sidebarConfig, tabIcons })=>{
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/EnhancedSidebar/TabsBar/index.tsx"],"sourcesContent":["'use client'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { Link, useConfig, useTranslation } from '@payloadcms/ui'\nimport { usePathname } from 'next/navigation'\nimport { formatAdminURL } from 'payload/shared'\nimport React from 'react'\n\nimport type { EnhancedSidebarConfig, SidebarTab, SidebarTabContent, SidebarTabLink } from '../../../types'\n\nimport { Icon } from '../Icon'\nimport { SettingsMenuButton } from '../SettingsMenuButton'\nimport { TabButton, TabLink } from './TabItem'\nimport './index.scss'\n\nconst tabsBaseClass = 'tabs-bar'\n\nexport type TabsBarProps = {\n activeTabId: string\n customTabComponents?: Record<string, React.ReactNode>\n onTabChange: (tabId: string) => void\n renderedTabItems?: React.ReactNode[]\n settingsMenu?: React.ReactNode[]\n sidebarConfig: EnhancedSidebarConfig\n tabIcons?: Record<string, React.ReactNode>\n}\n\nexport const TabsBar: React.FC<TabsBarProps> = ({\n activeTabId,\n customTabComponents,\n onTabChange,\n renderedTabItems,\n settingsMenu,\n sidebarConfig,\n tabIcons,\n}) => {\n const { i18n } = useTranslation()\n const pathname = usePathname()\n\n const {\n config: {\n admin: {\n routes: { browseByFolder: foldersRoute, logout: logoutRoute },\n },\n folders,\n routes: { admin: adminRoute },\n },\n } = useConfig()\n\n const showLogout = sidebarConfig.showLogout !== false\n const showFolders = folders && folders.browseByFolder\n\n const folderURL = formatAdminURL({\n adminRoute,\n path: foldersRoute,\n })\n const isFoldersActive = pathname.startsWith(folderURL)\n\n const renderTabItem = (item: SidebarTab) => {\n if (item.type === 'custom') {\n return customTabComponents?.[item.id] ?? null\n }\n\n if (item.type === 'tab') {\n return (\n <TabButton\n icon={tabIcons?.[item.id]}\n isActive={activeTabId === item.id}\n key={item.id}\n onTabChange={onTabChange}\n tab={item}\n />\n )\n }\n\n // Check if link is active\n const href = item.isExternal\n ? item.href\n : formatAdminURL({ adminRoute, path: item.href })\n const isActive = pathname === href || (item.href === '/' && pathname === adminRoute)\n\n return <TabLink href={href} icon={tabIcons?.[item.id]} isActive={isActive} key={item.id} link={item} />\n }\n\n const tabItems = sidebarConfig.tabs ?? []\n\n return (\n <div className={tabsBaseClass}>\n <div className={`${tabsBaseClass}__tabs`}>\n {renderedTabItems ?? tabItems.map(renderTabItem)}\n </div>\n\n <div className={`${tabsBaseClass}__actions`}>\n {showFolders && (\n <Link\n className={`${tabsBaseClass}__action ${isFoldersActive ? `${tabsBaseClass}__link--active` : ''}`}\n href={folderURL}\n title={getTranslation({ en: 'Browse by Folder', uk: 'Переглянути по папках' }, i18n)}\n >\n <Icon name=\"Folder\" size={20} />\n </Link>\n )}\n <SettingsMenuButton settingsMenu={settingsMenu} />\n {showLogout && (\n <Link\n className={`${tabsBaseClass}__action`}\n href={formatAdminURL({\n adminRoute,\n path: logoutRoute,\n })}\n title={getTranslation({ en: 'Logout', uk: 'Вийти' }, i18n)}\n type=\"button\"\n >\n <Icon name=\"LogOut\" size={20} />\n </Link>\n )}\n </div>\n </div>\n )\n}\n"],"names":["getTranslation","Link","useConfig","useTranslation","usePathname","formatAdminURL","React","Icon","SettingsMenuButton","TabButton","TabLink","tabsBaseClass","TabsBar","activeTabId","customTabComponents","onTabChange","renderedTabItems","settingsMenu","sidebarConfig","tabIcons","i18n","pathname","config","admin","routes","browseByFolder","foldersRoute","logout","logoutRoute","folders","adminRoute","showLogout","showFolders","folderURL","path","isFoldersActive","startsWith","renderTabItem","item","type","id","icon","isActive","tab","href","isExternal","link","tabItems","tabs","div","className","map","title","en","uk","name","size"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/components/EnhancedSidebar/TabsBar/index.tsx"],"sourcesContent":["'use client'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { Link, useConfig, useTranslation } from '@payloadcms/ui'\nimport { usePathname } from 'next/navigation.js'\nimport { formatAdminURL } from 'payload/shared'\nimport React from 'react'\n\nimport type { EnhancedSidebarConfig, SidebarTab, SidebarTabContent, SidebarTabLink } from '../../../types.js'\n\nimport { Icon } from '../Icon.js'\nimport { SettingsMenuButton } from '../SettingsMenuButton/index.js'\nimport { TabButton, TabLink } from './TabItem.js'\nimport './index.scss'\n\nconst tabsBaseClass = 'tabs-bar'\n\nexport type TabsBarProps = {\n activeTabId: string\n customTabComponents?: Record<string, React.ReactNode>\n onTabChange: (tabId: string) => void\n renderedTabItems?: React.ReactNode[]\n settingsMenu?: React.ReactNode[]\n sidebarConfig: EnhancedSidebarConfig\n tabIcons?: Record<string, React.ReactNode>\n}\n\nexport const TabsBar: React.FC<TabsBarProps> = ({\n activeTabId,\n customTabComponents,\n onTabChange,\n renderedTabItems,\n settingsMenu,\n sidebarConfig,\n tabIcons,\n}) => {\n const { i18n } = useTranslation()\n const pathname = usePathname()\n\n const {\n config: {\n admin: {\n routes: { browseByFolder: foldersRoute, logout: logoutRoute },\n },\n folders,\n routes: { admin: adminRoute },\n },\n } = useConfig()\n\n const showLogout = sidebarConfig.showLogout !== false\n const showFolders = folders && folders.browseByFolder\n\n const folderURL = formatAdminURL({\n adminRoute,\n path: foldersRoute,\n })\n const isFoldersActive = pathname.startsWith(folderURL)\n\n const renderTabItem = (item: SidebarTab) => {\n if (item.type === 'custom') {\n return customTabComponents?.[item.id] ?? null\n }\n\n if (item.type === 'tab') {\n return (\n <TabButton\n icon={tabIcons?.[item.id]}\n isActive={activeTabId === item.id}\n key={item.id}\n onTabChange={onTabChange}\n tab={item}\n />\n )\n }\n\n // Check if link is active\n const href = item.isExternal\n ? item.href\n : formatAdminURL({ adminRoute, path: item.href })\n const isActive = pathname === href || (item.href === '/' && pathname === adminRoute)\n\n return <TabLink href={href} icon={tabIcons?.[item.id]} isActive={isActive} key={item.id} link={item} />\n }\n\n const tabItems = sidebarConfig.tabs ?? []\n\n return (\n <div className={tabsBaseClass}>\n <div className={`${tabsBaseClass}__tabs`}>\n {renderedTabItems ?? tabItems.map(renderTabItem)}\n </div>\n\n <div className={`${tabsBaseClass}__actions`}>\n {showFolders && (\n <Link\n className={`${tabsBaseClass}__action ${isFoldersActive ? `${tabsBaseClass}__link--active` : ''}`}\n href={folderURL}\n title={getTranslation({ en: 'Browse by Folder', uk: 'Переглянути по папках' }, i18n)}\n >\n <Icon name=\"Folder\" size={20} />\n </Link>\n )}\n <SettingsMenuButton settingsMenu={settingsMenu} />\n {showLogout && (\n <Link\n className={`${tabsBaseClass}__action`}\n href={formatAdminURL({\n adminRoute,\n path: logoutRoute,\n })}\n title={getTranslation({ en: 'Logout', uk: 'Вийти' }, i18n)}\n type=\"button\"\n >\n <Icon name=\"LogOut\" size={20} />\n </Link>\n )}\n </div>\n </div>\n )\n}\n"],"names":["getTranslation","Link","useConfig","useTranslation","usePathname","formatAdminURL","React","Icon","SettingsMenuButton","TabButton","TabLink","tabsBaseClass","TabsBar","activeTabId","customTabComponents","onTabChange","renderedTabItems","settingsMenu","sidebarConfig","tabIcons","i18n","pathname","config","admin","routes","browseByFolder","foldersRoute","logout","logoutRoute","folders","adminRoute","showLogout","showFolders","folderURL","path","isFoldersActive","startsWith","renderTabItem","item","type","id","icon","isActive","tab","href","isExternal","link","tabItems","tabs","div","className","map","title","en","uk","name","size"],"mappings":"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"}
@@ -1,6 +1,4 @@
1
- @import "../../../../node_modules/@payloadcms/ui/dist/scss/vars";
2
- @import "../../../../node_modules/@payloadcms/ui/dist/scss/queries.scss";
3
-
1
+ @import '~@payloadcms/ui/scss';
4
2
 
5
3
  @layer payload-default {
6
4
  .tabs-bar {
@@ -1,5 +1,5 @@
1
1
  import type { ReactNode } from 'react';
2
- import type { BadgeConfig } from '../../../types';
2
+ import type { BadgeConfig } from '../../../types.js';
3
3
  type UseBadgeResult = {
4
4
  value: number | ReactNode | undefined;
5
5
  };
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- import { useBadgeValue } from '../BadgeProvider';
2
+ import { useBadgeValue } from '../BadgeProvider/index.js';
3
3
  /**
4
4
  * Hook to get badge value based on config.
5
5
  * All badge values are read from context (populated by InternalBadgeProvider or BadgeProvider).
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/EnhancedSidebar/hooks/useBadge.ts"],"sourcesContent":["'use client'\n\nimport type { ReactNode } from 'react'\n\nimport type { BadgeConfig } from '../../../types'\n\nimport { useBadgeValue } from '../BadgeProvider'\n\ntype UseBadgeResult = {\n value: number | ReactNode | undefined\n}\n\n/**\n * Hook to get badge value based on config.\n * All badge values are read from context (populated by InternalBadgeProvider or BadgeProvider).\n */\nexport const useBadge = (\n config: BadgeConfig | undefined,\n /**\n * Default slug to use for context lookup if not specified in config\n */\n defaultSlug: string,\n): UseBadgeResult => {\n // Determine the slug to look up in context\n let slug = defaultSlug\n\n if (config?.type === 'provider' && config.slug) {\n slug = config.slug\n } else if (config?.type === 'collection-count' && config.collectionSlug) {\n // For collection-count, the InternalBadgeProvider uses the item slug as key\n // but if collectionSlug is different, we might need to handle this\n // For now, defaultSlug is used (which is the tab/item id)\n slug = defaultSlug\n }\n\n // Get value from context (populated by InternalBadgeProvider or user's BadgeProvider)\n const contextValue = useBadgeValue(slug)\n\n if (!config) {\n return { value: undefined }\n }\n\n return { value: contextValue }\n}\n"],"names":["useBadgeValue","useBadge","config","defaultSlug","slug","type","collectionSlug","contextValue","value","undefined"],"mappings":"AAAA;AAMA,SAASA,aAAa,QAAQ,mBAAkB;AAMhD;;;CAGC,GACD,OAAO,MAAMC,WAAW,CACtBC,QACA;;GAEC,GACDC;IAEA,2CAA2C;IAC3C,IAAIC,OAAOD;IAEX,IAAID,QAAQG,SAAS,cAAcH,OAAOE,IAAI,EAAE;QAC9CA,OAAOF,OAAOE,IAAI;IACpB,OAAO,IAAIF,QAAQG,SAAS,sBAAsBH,OAAOI,cAAc,EAAE;QACvE,4EAA4E;QAC5E,mEAAmE;QACnE,0DAA0D;QAC1DF,OAAOD;IACT;IAEA,sFAAsF;IACtF,MAAMI,eAAeP,cAAcI;IAEnC,IAAI,CAACF,QAAQ;QACX,OAAO;YAAEM,OAAOC;QAAU;IAC5B;IAEA,OAAO;QAAED,OAAOD;IAAa;AAC/B,EAAC"}
1
+ {"version":3,"sources":["../../../../src/components/EnhancedSidebar/hooks/useBadge.ts"],"sourcesContent":["'use client'\n\nimport type { ReactNode } from 'react'\n\nimport type { BadgeConfig } from '../../../types.js'\n\nimport { useBadgeValue } from '../BadgeProvider/index.js'\n\ntype UseBadgeResult = {\n value: number | ReactNode | undefined\n}\n\n/**\n * Hook to get badge value based on config.\n * All badge values are read from context (populated by InternalBadgeProvider or BadgeProvider).\n */\nexport const useBadge = (\n config: BadgeConfig | undefined,\n /**\n * Default slug to use for context lookup if not specified in config\n */\n defaultSlug: string,\n): UseBadgeResult => {\n // Determine the slug to look up in context\n let slug = defaultSlug\n\n if (config?.type === 'provider' && config.slug) {\n slug = config.slug\n } else if (config?.type === 'collection-count' && config.collectionSlug) {\n // For collection-count, the InternalBadgeProvider uses the item slug as key\n // but if collectionSlug is different, we might need to handle this\n // For now, defaultSlug is used (which is the tab/item id)\n slug = defaultSlug\n }\n\n // Get value from context (populated by InternalBadgeProvider or user's BadgeProvider)\n const contextValue = useBadgeValue(slug)\n\n if (!config) {\n return { value: undefined }\n }\n\n return { value: contextValue }\n}\n"],"names":["useBadgeValue","useBadge","config","defaultSlug","slug","type","collectionSlug","contextValue","value","undefined"],"mappings":"AAAA;AAMA,SAASA,aAAa,QAAQ,4BAA2B;AAMzD;;;CAGC,GACD,OAAO,MAAMC,WAAW,CACtBC,QACA;;GAEC,GACDC;IAEA,2CAA2C;IAC3C,IAAIC,OAAOD;IAEX,IAAID,QAAQG,SAAS,cAAcH,OAAOE,IAAI,EAAE;QAC9CA,OAAOF,OAAOE,IAAI;IACpB,OAAO,IAAIF,QAAQG,SAAS,sBAAsBH,OAAOI,cAAc,EAAE;QACvE,4EAA4E;QAC5E,mEAAmE;QACnE,0DAA0D;QAC1DF,OAAOD;IACT;IAEA,sFAAsF;IACtF,MAAMI,eAAeP,cAAcI;IAEnC,IAAI,CAACF,QAAQ;QACX,OAAO;YAAEM,OAAOC;QAAU;IAC5B;IAEA,OAAO;QAAED,OAAOD;IAAa;AAC/B,EAAC"}
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- import { usePathname } from 'next/navigation';
2
+ import { usePathname } from 'next/navigation.js';
3
3
  /**
4
4
  * Hook to get the active state of a nav item based on the current pathname.
5
5
  * Use this in your custom NavItem component registered via `customComponents.NavItem`.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/EnhancedSidebar/hooks/useNavItemState.ts"],"sourcesContent":["'use client'\n\nimport { usePathname } from 'next/navigation'\n\n/**\n * Hook to get the active state of a nav item based on the current pathname.\n * Use this in your custom NavItem component registered via `customComponents.NavItem`.\n *\n * @example\n * ```tsx\n * 'use client'\n * import { useNavItemState } from '@veiag/payload-enhanced-sidebar'\n *\n * export const MyNavItem = ({ href, label }) => {\n * const { isActive, isCurrentPage } = useNavItemState(href)\n * return (\n * <a href={href} style={{ fontWeight: isActive ? 'bold' : 'normal' }}>\n * {label}\n * </a>\n * )\n * }\n * ```\n */\nexport const useNavItemState = (href: string): { isActive: boolean; isCurrentPage: boolean } => {\n const pathname = usePathname()\n return {\n isActive: pathname.startsWith(href) && ['/', undefined].includes(pathname[href.length]),\n isCurrentPage: pathname === href,\n }\n}\n"],"names":["usePathname","useNavItemState","href","pathname","isActive","startsWith","undefined","includes","length","isCurrentPage"],"mappings":"AAAA;AAEA,SAASA,WAAW,QAAQ,kBAAiB;AAE7C;;;;;;;;;;;;;;;;;;CAkBC,GACD,OAAO,MAAMC,kBAAkB,CAACC;IAC9B,MAAMC,WAAWH;IACjB,OAAO;QACLI,UAAUD,SAASE,UAAU,CAACH,SAAS;YAAC;YAAKI;SAAU,CAACC,QAAQ,CAACJ,QAAQ,CAACD,KAAKM,MAAM,CAAC;QACtFC,eAAeN,aAAaD;IAC9B;AACF,EAAC"}
1
+ {"version":3,"sources":["../../../../src/components/EnhancedSidebar/hooks/useNavItemState.ts"],"sourcesContent":["'use client'\n\nimport { usePathname } from 'next/navigation.js'\n\n/**\n * Hook to get the active state of a nav item based on the current pathname.\n * Use this in your custom NavItem component registered via `customComponents.NavItem`.\n *\n * @example\n * ```tsx\n * 'use client'\n * import { useNavItemState } from '@veiag/payload-enhanced-sidebar'\n *\n * export const MyNavItem = ({ href, label }) => {\n * const { isActive, isCurrentPage } = useNavItemState(href)\n * return (\n * <a href={href} style={{ fontWeight: isActive ? 'bold' : 'normal' }}>\n * {label}\n * </a>\n * )\n * }\n * ```\n */\nexport const useNavItemState = (href: string): { isActive: boolean; isCurrentPage: boolean } => {\n const pathname = usePathname()\n return {\n isActive: pathname.startsWith(href) && ['/', undefined].includes(pathname[href.length]),\n isCurrentPage: pathname === href,\n }\n}\n"],"names":["usePathname","useNavItemState","href","pathname","isActive","startsWith","undefined","includes","length","isCurrentPage"],"mappings":"AAAA;AAEA,SAASA,WAAW,QAAQ,qBAAoB;AAEhD;;;;;;;;;;;;;;;;;;CAkBC,GACD,OAAO,MAAMC,kBAAkB,CAACC;IAC9B,MAAMC,WAAWH;IACjB,OAAO;QACLI,UAAUD,SAASE,UAAU,CAACH,SAAS;YAAC;YAAKI;SAAU,CAACC,QAAQ,CAACJ,QAAQ,CAACD,KAAKM,MAAM,CAAC;QACtFC,eAAeN,aAAaD;IAC9B;AACF,EAAC"}
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- import { useEnhancedSidebar } from '../context';
2
+ import { useEnhancedSidebar } from '../context.js';
3
3
  /**
4
4
  * Returns whether a sidebar tab is currently active.
5
5
  * Use this inside a custom `NavContent` component to show/hide tab content.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/EnhancedSidebar/hooks/useTabState.ts"],"sourcesContent":["'use client'\n\nimport { useEnhancedSidebar } from '../context'\n\n/**\n * Returns whether a sidebar tab is currently active.\n * Use this inside a custom `NavContent` component to show/hide tab content.\n *\n * @example\n * ```tsx\n * const { isActive } = useTabState('my-tab-id')\n * return <div style={{ display: isActive ? undefined : 'none' }}>{children}</div>\n * ```\n */\nexport const useTabState = (id: string): { isActive: boolean } => {\n const { activeTabId } = useEnhancedSidebar()\n return { isActive: activeTabId === id }\n}\n"],"names":["useEnhancedSidebar","useTabState","id","activeTabId","isActive"],"mappings":"AAAA;AAEA,SAASA,kBAAkB,QAAQ,aAAY;AAE/C;;;;;;;;;CASC,GACD,OAAO,MAAMC,cAAc,CAACC;IAC1B,MAAM,EAAEC,WAAW,EAAE,GAAGH;IACxB,OAAO;QAAEI,UAAUD,gBAAgBD;IAAG;AACxC,EAAC"}
1
+ {"version":3,"sources":["../../../../src/components/EnhancedSidebar/hooks/useTabState.ts"],"sourcesContent":["'use client'\n\nimport { useEnhancedSidebar } from '../context.js'\n\n/**\n * Returns whether a sidebar tab is currently active.\n * Use this inside a custom `NavContent` component to show/hide tab content.\n *\n * @example\n * ```tsx\n * const { isActive } = useTabState('my-tab-id')\n * return <div style={{ display: isActive ? undefined : 'none' }}>{children}</div>\n * ```\n */\nexport const useTabState = (id: string): { isActive: boolean } => {\n const { activeTabId } = useEnhancedSidebar()\n return { isActive: activeTabId === id }\n}\n"],"names":["useEnhancedSidebar","useTabState","id","activeTabId","isActive"],"mappings":"AAAA;AAEA,SAASA,kBAAkB,QAAQ,gBAAe;AAElD;;;;;;;;;CASC,GACD,OAAO,MAAMC,cAAc,CAACC;IAC1B,MAAM,EAAEC,WAAW,EAAE,GAAGH;IACxB,OAAO;QAAEI,UAAUD,gBAAgBD;IAAG;AACxC,EAAC"}
@@ -1,6 +1,6 @@
1
1
  import type { PayloadRequest, ServerProps } from 'payload';
2
2
  import React from 'react';
3
- import type { EnhancedSidebarConfig } from '../../types';
3
+ import type { EnhancedSidebarConfig } from '../../types.js';
4
4
  import './index.scss';
5
5
  export type EnhancedSidebarProps = {
6
6
  req?: PayloadRequest;
@@ -3,15 +3,15 @@ import { getTranslation } from '@payloadcms/translations';
3
3
  import { NavGroup } from '@payloadcms/ui';
4
4
  import { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent';
5
5
  import { EntityType, groupNavItems } from '@payloadcms/ui/shared';
6
- import { cookies } from 'next/headers';
6
+ import { cookies } from 'next/headers.js';
7
7
  import { formatAdminURL } from 'payload/shared';
8
8
  import React, { Fragment } from 'react';
9
9
  const COOKIE_KEY = 'payload-enhanced-sidebar-active-tab';
10
- import { extractLocalizedValue, resolveSidebarComponent, sanitizeSidebarConfig } from '../../utils';
11
- import { getNavPrefs } from './getNavPrefs';
12
- import { Icon } from './Icon';
13
- import { NavItem } from './NavItem';
14
- import { SidebarContent } from './SidebarContent';
10
+ import { extractLocalizedValue, resolveSidebarComponent, sanitizeSidebarConfig } from '../../utils/index.js';
11
+ import { getNavPrefs } from './getNavPrefs.js';
12
+ import { Icon } from './Icon.js';
13
+ import { NavItem } from './NavItem/index.js';
14
+ import { SidebarContent } from './SidebarContent.js';
15
15
  import './index.scss';
16
16
  /**
17
17
  * Computes filtered and merged groups for a specific tab (server-side).
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/EnhancedSidebar/index.tsx"],"sourcesContent":["import type { EntityToGroup } from '@payloadcms/ui/shared'\nimport type { PayloadRequest, ServerProps } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { NavGroup } from '@payloadcms/ui'\nimport { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent'\nimport { EntityType, groupNavItems } from '@payloadcms/ui/shared'\nimport { cookies } from 'next/headers'\nimport { formatAdminURL } from 'payload/shared'\nimport React, { Fragment } from 'react'\n\nconst COOKIE_KEY = 'payload-enhanced-sidebar-active-tab'\n\nimport type {\n EnhancedSidebarConfig,\n ExtendedEntity,\n ExtendedGroup,\n SidebarTab,\n SidebarTabContent as SidebarTabContentType,\n SidebarTabItem,\n} from '../../types'\n\nimport { extractLocalizedValue, resolveSidebarComponent, sanitizeSidebarConfig } from '../../utils'\nimport { getNavPrefs } from './getNavPrefs'\nimport { Icon } from './Icon'\nimport { NavItem } from './NavItem'\nimport { SidebarContent } from './SidebarContent'\nimport './index.scss'\n\nexport type EnhancedSidebarProps = {\n req?: PayloadRequest\n sidebarConfig?: EnhancedSidebarConfig\n} & ServerProps\n\n/**\n * Computes filtered and merged groups for a specific tab (server-side).\n */\nconst computeGroupsForTab = async (\n tab: SidebarTabContentType,\n groups: ExtendedGroup[],\n currentLang: string,\n req: PayloadRequest | undefined,\n): Promise<ExtendedGroup[]> => {\n const { collections: tabCollections, customItems, globals: tabGlobals } = tab\n\n const showAll = !tabCollections && !tabGlobals\n const allowedSlugs = new Set([...(tabCollections ?? []), ...(tabGlobals ?? [])])\n\n let result: ExtendedGroup[] = []\n\n if (showAll) {\n result = groups.map((g) => ({ ...g, entities: [...g.entities] }))\n } else if (allowedSlugs.size > 0) {\n result = groups\n .map((group) => ({\n ...group,\n entities: group.entities.filter((entity) => allowedSlugs.has(entity.slug)),\n }))\n .filter((group) => group.entities.length > 0)\n }\n\n if (customItems && customItems.length > 0) {\n const topAdditions: ExtendedGroup[] = []\n const topUngrouped: SidebarTabItem[] = []\n const bottomUngrouped: SidebarTabItem[] = []\n\n const toEntity = (item: SidebarTabItem): ExtendedEntity =>\n ({\n slug: item.slug,\n type: 'custom',\n href: item.href,\n isExternal: item.isExternal,\n label: item.label,\n }) as ExtendedEntity\n\n // Filter custom items by access — fail-closed: missing req or thrown error denies access\n const accessResults = await Promise.all(\n customItems.map((item) =>\n Promise.resolve()\n .then(() => (item.access ? (req ? item.access({ item, req }) : false) : true))\n .catch(() => false),\n ),\n )\n const visibleItems = customItems.filter((_, i) => accessResults[i])\n\n for (const item of visibleItems) {\n if (item.group) {\n const itemGroupLabel = extractLocalizedValue(item.group, currentLang)\n const existingGroup = result.find((g) => {\n const groupLabel = extractLocalizedValue(g.label, currentLang)\n return groupLabel === itemGroupLabel\n })\n\n if (existingGroup) {\n // Merged into existing collection group — position has no effect here\n existingGroup.entities.push(toEntity(item))\n } else {\n // New custom group — position controls top vs bottom\n const newGroup: ExtendedGroup = { entities: [toEntity(item)], label: item.group }\n if (item.position === 'top') {\n topAdditions.push(newGroup)\n } else {\n result.push(newGroup)\n }\n }\n } else {\n if (item.position === 'top') {\n topUngrouped.push(item)\n } else {\n bottomUngrouped.push(item)\n }\n }\n }\n\n if (topUngrouped.length > 0) {\n topAdditions.unshift({ entities: topUngrouped.map(toEntity), label: '' })\n }\n\n if (bottomUngrouped.length > 0) {\n result.push({ entities: bottomUngrouped.map(toEntity), label: '' })\n }\n\n result = [...topAdditions, ...result]\n }\n\n return result\n}\n\nexport const EnhancedSidebar: React.FC<EnhancedSidebarProps> = async (props) => {\n const {\n documentSubViewType,\n i18n,\n locale,\n params,\n payload,\n permissions,\n req,\n searchParams,\n sidebarConfig,\n user,\n viewType,\n visibleEntities,\n } = props\n\n if (!payload?.config) {\n return null\n }\n\n const {\n admin: {\n components: { afterNav, afterNavLinks, beforeNav, beforeNavLinks, settingsMenu },\n },\n collections,\n globals,\n } = payload.config\n\n const groups = groupNavItems(\n [\n ...collections\n .filter(({ slug }) => visibleEntities?.collections.includes(slug))\n .map(\n (collection) =>\n ({\n type: EntityType.collection,\n entity: collection,\n }) satisfies EntityToGroup,\n ),\n ...globals\n .filter(({ slug }) => visibleEntities?.globals.includes(slug))\n .map(\n (global) =>\n ({\n type: EntityType.global,\n entity: global,\n }) satisfies EntityToGroup,\n ),\n ],\n permissions || {},\n i18n,\n ) as unknown as ExtendedGroup[]\n\n const navPreferences = await getNavPrefs(req)\n\n const serverProps = {\n i18n,\n locale,\n params,\n payload,\n permissions,\n searchParams,\n user,\n }\n\n const clientProps = {\n documentSubViewType,\n viewType,\n }\n\n const beforeNavRendered = RenderServerComponent({\n clientProps,\n Component: beforeNav,\n importMap: payload.importMap,\n serverProps,\n })\n\n const beforeNavLinksRendered = RenderServerComponent({\n clientProps,\n Component: beforeNavLinks,\n importMap: payload.importMap,\n serverProps,\n })\n\n const afterNavLinksRendered = RenderServerComponent({\n clientProps,\n Component: afterNavLinks,\n importMap: payload.importMap,\n serverProps,\n })\n\n const afterNavRendered = RenderServerComponent({\n clientProps,\n Component: afterNav,\n importMap: payload.importMap,\n serverProps,\n })\n\n const renderedSettingsMenu =\n settingsMenu && Array.isArray(settingsMenu)\n ? settingsMenu.map((item, index) =>\n RenderServerComponent({\n clientProps,\n Component: item,\n importMap: payload.importMap,\n key: `settings-menu-item-${index}`,\n serverProps,\n }),\n )\n : []\n\n const config: EnhancedSidebarConfig = sidebarConfig ?? {\n tabs: [\n {\n id: 'default',\n type: 'tab',\n icon: 'LayoutGrid',\n label: 'Collections',\n },\n ],\n }\n\n // Filter all tab bar items by access — fail-closed: missing req denies access\n // Note: req can be undefined on 404 pages due to a Payload bug (NotFound view omits req from props)\n const allConfigTabs = config.tabs ?? []\n const tabAccessResults = await Promise.all(\n allConfigTabs.map((t) =>\n Promise.resolve()\n .then(() => (t.access ? (req ? t.access({ item: t, req }) : false) : true))\n .catch(() => false),\n ),\n )\n const visibleTabItems = allConfigTabs.filter((_, i) => tabAccessResults[i])\n\n // Read active tab from cookie\n const cookieStore = await cookies()\n const storedTabId = cookieStore.get(COOKIE_KEY)?.value\n const tabs = visibleTabItems.filter((t) => t.type === 'tab') as SidebarTabContentType[]\n const defaultTabId = tabs[0]?.id ?? ''\n const initialActiveTabId =\n storedTabId && tabs.some((t) => t.id === storedTabId) ? storedTabId : defaultTabId\n\n const adminRoute = payload.config.routes.admin\n const currentLang = i18n.language\n\n /**\n * Renders a single entity as a NavItem (default or custom).\n */\n const renderEntity = (entity: ExtendedEntity, key: string): React.ReactNode => {\n const { slug, type } = entity\n let href: string\n let id: string\n\n if (type === EntityType.collection) {\n href = formatAdminURL({ adminRoute, path: `/collections/${slug}` })\n id = `nav-${slug}`\n } else if (type === EntityType.global) {\n href = formatAdminURL({ adminRoute, path: `/globals/${slug}` })\n id = `nav-global-${slug}`\n } else if (type === 'custom' && entity.href) {\n id = `nav-custom-${slug}`\n href = entity.isExternal ? entity.href : formatAdminURL({ adminRoute, path: entity.href })\n } else {\n return null\n }\n\n const badgeConfig = config.badges?.[slug]\n\n if (config.customComponents?.NavItem) {\n const label = getTranslation(entity.label, i18n)\n const { clientProps: extraProps, path } = resolveSidebarComponent(\n config.customComponents.NavItem,\n )\n return RenderServerComponent({\n clientProps: { id, badgeConfig, entity, href, label, ...extraProps },\n Component: path,\n importMap: payload.importMap,\n key,\n serverProps,\n })\n }\n\n return <NavItem badgeConfig={badgeConfig} entity={entity} href={href} id={id} key={key} />\n }\n\n /**\n * Renders a group with its entities (default NavGroup or custom).\n */\n const renderGroup = (group: ExtendedGroup, key: string): React.ReactNode => {\n const { entities, label } = group\n const isUngrouped = !label || (typeof label === 'string' && label === '')\n const translatedLabel = getTranslation(label || '', i18n)\n\n const items = entities.map((entity, i) => renderEntity(entity, `${key}-${i}`))\n\n if (isUngrouped) {\n return <Fragment key={key}>{items}</Fragment>\n }\n\n if (config.customComponents?.NavGroup) {\n const { clientProps: extraProps, path } = resolveSidebarComponent(\n config.customComponents.NavGroup,\n )\n return RenderServerComponent({\n clientProps: {\n children: items,\n isOpen: navPreferences?.groups?.[translatedLabel]?.open,\n label: translatedLabel,\n ...extraProps,\n },\n Component: path,\n importMap: payload.importMap,\n key,\n serverProps,\n })\n }\n\n return (\n <NavGroup\n isOpen={navPreferences?.groups?.[translatedLabel]?.open}\n key={key}\n label={translatedLabel}\n >\n {items}\n </NavGroup>\n )\n }\n\n // Pre-render content for every tab on the server (computed in parallel)\n const tabGroupResults = await Promise.all(\n tabs.map((tab) => computeGroupsForTab(tab, groups, currentLang, req)),\n )\n const tabsContent: Record<string, React.ReactNode> = {}\n for (let i = 0; i < tabs.length; i++) {\n const tab = tabs[i]\n const tabGroups = tabGroupResults[i]\n tabsContent[tab.id] = (\n <Fragment>{tabGroups.map((group, j) => renderGroup(group, `${tab.id}-${j}`))}</Fragment>\n )\n }\n\n // For the no-tabs fallback — only show all content when the config has no tab-type items at all.\n // If tabs exist but are all hidden by access control, show nothing instead of the full nav.\n const configuredTabsCount = (config.tabs ?? []).filter((t) => t.type === 'tab').length\n const allContent =\n configuredTabsCount === 0 ? (\n <Fragment>{groups.map((group, i) => renderGroup(group, `all-${i}`))}</Fragment>\n ) : undefined\n\n // Build server-side icon and tab button rendering\n const allTabItems = visibleTabItems\n const hasCustomTabButton = !!config.customComponents?.TabButton\n const hasAnyIconComponent = allTabItems.some((t) => t.type !== 'custom' && t.iconComponent)\n\n // tabIcons: per-id icon node (only built when no custom TabButton, just iconComponent overrides)\n const tabIcons: Record<string, React.ReactNode> = {}\n // renderedTabItems: fully custom tab button nodes (built when customComponents.TabButton is set)\n const renderedTabItems: React.ReactNode[] = []\n // customTabComponents: server-rendered components for type:'custom' tab bar slots\n const customTabComponents: Record<string, React.ReactNode> = {}\n\n // Pre-render all type:'custom' items\n for (const item of allTabItems) {\n if (item.type === 'custom') {\n const { clientProps: extraProps, path } = resolveSidebarComponent(item.component)\n customTabComponents[item.id] = RenderServerComponent({\n clientProps: { id: item.id, ...extraProps },\n Component: path,\n importMap: payload.importMap,\n key: item.id,\n serverProps,\n })\n }\n }\n\n if (hasCustomTabButton || hasAnyIconComponent) {\n for (const item of allTabItems) {\n if (item.type === 'custom') {\n // Include pre-rendered custom slot in renderedTabItems when using custom TabButton\n if (hasCustomTabButton) {\n renderedTabItems.push(customTabComponents[item.id])\n }\n continue\n }\n\n const label = getTranslation(item.label, i18n)\n\n // Resolve icon: custom iconComponent > default Lucide\n let iconNode: React.ReactNode\n if (item.iconComponent) {\n const { clientProps: iconExtraProps, path: iconPath } = resolveSidebarComponent(\n item.iconComponent,\n )\n iconNode = RenderServerComponent({\n clientProps: { id: item.id, type: item.type, label, ...iconExtraProps },\n Component: iconPath,\n importMap: payload.importMap,\n serverProps,\n })\n } else {\n iconNode = item.icon ? <Icon name={item.icon} size={20} /> : null\n }\n\n if (hasCustomTabButton) {\n // Compute href for links\n let href: string | undefined\n if (item.type === 'link') {\n href = item.isExternal ? item.href : formatAdminURL({ adminRoute, path: item.href })\n }\n\n const { clientProps: tabBtnExtraProps, path: tabBtnPath } = resolveSidebarComponent(\n config.customComponents!.TabButton!,\n )\n renderedTabItems.push(\n RenderServerComponent({\n clientProps: {\n id: item.id,\n type: item.type,\n badge: item.badge,\n href,\n icon: iconNode,\n isExternal: item.type === 'link' ? item.isExternal : undefined,\n label,\n ...tabBtnExtraProps,\n },\n Component: tabBtnPath,\n importMap: payload.importMap,\n key: item.id,\n serverProps,\n }),\n )\n } else if (item.iconComponent) {\n tabIcons[item.id] = iconNode\n }\n }\n }\n\n const customNavContent = config.customComponents?.NavContent\n ? (() => {\n const { clientProps: extraProps, path } = resolveSidebarComponent(\n config.customComponents.NavContent,\n )\n return RenderServerComponent({\n clientProps: {\n afterNav: afterNavRendered,\n afterNavLinks: afterNavLinksRendered,\n allContent,\n beforeNav: beforeNavRendered,\n beforeNavLinks: beforeNavLinksRendered,\n tabs: tabs.map((t) => ({ id: t.id })),\n tabsContent,\n ...extraProps,\n },\n Component: path,\n importMap: payload.importMap,\n key: 'enhanced-sidebar-nav-content',\n serverProps,\n })\n })()\n : undefined\n\n // Strip access functions and use only visible tabs before passing to client component\n const clientSidebarConfig = sanitizeSidebarConfig({ ...config, tabs: visibleTabItems })\n\n return (\n <SidebarContent\n afterNav={afterNavRendered}\n afterNavLinks={afterNavLinksRendered}\n allContent={allContent}\n beforeNav={beforeNavRendered}\n beforeNavLinks={beforeNavLinksRendered}\n customNavContent={customNavContent}\n customTabComponents={Object.keys(customTabComponents).length > 0 ? customTabComponents : undefined}\n initialActiveTabId={initialActiveTabId}\n renderedTabItems={renderedTabItems.length > 0 ? renderedTabItems : undefined}\n settingsMenu={renderedSettingsMenu}\n sidebarConfig={clientSidebarConfig}\n tabIcons={Object.keys(tabIcons).length > 0 ? tabIcons : undefined}\n tabsContent={tabsContent}\n />\n )\n}\n\nexport default EnhancedSidebar\n"],"names":["getTranslation","NavGroup","RenderServerComponent","EntityType","groupNavItems","cookies","formatAdminURL","React","Fragment","COOKIE_KEY","extractLocalizedValue","resolveSidebarComponent","sanitizeSidebarConfig","getNavPrefs","Icon","NavItem","SidebarContent","computeGroupsForTab","tab","groups","currentLang","req","collections","tabCollections","customItems","globals","tabGlobals","showAll","allowedSlugs","Set","result","map","g","entities","size","group","filter","entity","has","slug","length","topAdditions","topUngrouped","bottomUngrouped","toEntity","item","type","href","isExternal","label","accessResults","Promise","all","resolve","then","access","catch","visibleItems","_","i","itemGroupLabel","existingGroup","find","groupLabel","push","newGroup","position","unshift","EnhancedSidebar","props","documentSubViewType","i18n","locale","params","payload","permissions","searchParams","sidebarConfig","user","viewType","visibleEntities","config","admin","components","afterNav","afterNavLinks","beforeNav","beforeNavLinks","settingsMenu","includes","collection","global","navPreferences","serverProps","clientProps","beforeNavRendered","Component","importMap","beforeNavLinksRendered","afterNavLinksRendered","afterNavRendered","renderedSettingsMenu","Array","isArray","index","key","tabs","id","icon","allConfigTabs","tabAccessResults","t","visibleTabItems","cookieStore","storedTabId","get","value","defaultTabId","initialActiveTabId","some","adminRoute","routes","language","renderEntity","path","badgeConfig","badges","customComponents","extraProps","renderGroup","isUngrouped","translatedLabel","items","children","isOpen","open","tabGroupResults","tabsContent","tabGroups","j","configuredTabsCount","allContent","undefined","allTabItems","hasCustomTabButton","TabButton","hasAnyIconComponent","iconComponent","tabIcons","renderedTabItems","customTabComponents","component","iconNode","iconExtraProps","iconPath","name","tabBtnExtraProps","tabBtnPath","badge","customNavContent","NavContent","clientSidebarConfig","Object","keys"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/components/EnhancedSidebar/index.tsx"],"sourcesContent":["import type { EntityToGroup } from '@payloadcms/ui/shared'\nimport type { PayloadRequest, ServerProps } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { NavGroup } from '@payloadcms/ui'\nimport { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent'\nimport { EntityType, groupNavItems } from '@payloadcms/ui/shared'\nimport { cookies } from 'next/headers.js'\nimport { formatAdminURL } from 'payload/shared'\nimport React, { Fragment } from 'react'\n\nconst COOKIE_KEY = 'payload-enhanced-sidebar-active-tab'\n\nimport type {\n EnhancedSidebarConfig,\n ExtendedEntity,\n ExtendedGroup,\n SidebarTab,\n SidebarTabContent as SidebarTabContentType,\n SidebarTabItem,\n} from '../../types.js'\n\nimport { extractLocalizedValue, resolveSidebarComponent, sanitizeSidebarConfig } from '../../utils/index.js'\nimport { getNavPrefs } from './getNavPrefs.js'\nimport { Icon } from './Icon.js'\nimport { NavItem } from './NavItem/index.js'\nimport { SidebarContent } from './SidebarContent.js'\nimport './index.scss'\n\nexport type EnhancedSidebarProps = {\n req?: PayloadRequest\n sidebarConfig?: EnhancedSidebarConfig\n} & ServerProps\n\n/**\n * Computes filtered and merged groups for a specific tab (server-side).\n */\nconst computeGroupsForTab = async (\n tab: SidebarTabContentType,\n groups: ExtendedGroup[],\n currentLang: string,\n req: PayloadRequest | undefined,\n): Promise<ExtendedGroup[]> => {\n const { collections: tabCollections, customItems, globals: tabGlobals } = tab\n\n const showAll = !tabCollections && !tabGlobals\n const allowedSlugs = new Set([...(tabCollections ?? []), ...(tabGlobals ?? [])])\n\n let result: ExtendedGroup[] = []\n\n if (showAll) {\n result = groups.map((g) => ({ ...g, entities: [...g.entities] }))\n } else if (allowedSlugs.size > 0) {\n result = groups\n .map((group) => ({\n ...group,\n entities: group.entities.filter((entity) => allowedSlugs.has(entity.slug)),\n }))\n .filter((group) => group.entities.length > 0)\n }\n\n if (customItems && customItems.length > 0) {\n const topAdditions: ExtendedGroup[] = []\n const topUngrouped: SidebarTabItem[] = []\n const bottomUngrouped: SidebarTabItem[] = []\n\n const toEntity = (item: SidebarTabItem): ExtendedEntity =>\n ({\n slug: item.slug,\n type: 'custom',\n href: item.href,\n isExternal: item.isExternal,\n label: item.label,\n }) as ExtendedEntity\n\n // Filter custom items by access — fail-closed: missing req or thrown error denies access\n const accessResults = await Promise.all(\n customItems.map((item) =>\n Promise.resolve()\n .then(() => (item.access ? (req ? item.access({ item, req }) : false) : true))\n .catch(() => false),\n ),\n )\n const visibleItems = customItems.filter((_, i) => accessResults[i])\n\n for (const item of visibleItems) {\n if (item.group) {\n const itemGroupLabel = extractLocalizedValue(item.group, currentLang)\n const existingGroup = result.find((g) => {\n const groupLabel = extractLocalizedValue(g.label, currentLang)\n return groupLabel === itemGroupLabel\n })\n\n if (existingGroup) {\n // Merged into existing collection group — position has no effect here\n existingGroup.entities.push(toEntity(item))\n } else {\n // New custom group — position controls top vs bottom\n const newGroup: ExtendedGroup = { entities: [toEntity(item)], label: item.group }\n if (item.position === 'top') {\n topAdditions.push(newGroup)\n } else {\n result.push(newGroup)\n }\n }\n } else {\n if (item.position === 'top') {\n topUngrouped.push(item)\n } else {\n bottomUngrouped.push(item)\n }\n }\n }\n\n if (topUngrouped.length > 0) {\n topAdditions.unshift({ entities: topUngrouped.map(toEntity), label: '' })\n }\n\n if (bottomUngrouped.length > 0) {\n result.push({ entities: bottomUngrouped.map(toEntity), label: '' })\n }\n\n result = [...topAdditions, ...result]\n }\n\n return result\n}\n\nexport const EnhancedSidebar: React.FC<EnhancedSidebarProps> = async (props) => {\n const {\n documentSubViewType,\n i18n,\n locale,\n params,\n payload,\n permissions,\n req,\n searchParams,\n sidebarConfig,\n user,\n viewType,\n visibleEntities,\n } = props\n\n if (!payload?.config) {\n return null\n }\n\n const {\n admin: {\n components: { afterNav, afterNavLinks, beforeNav, beforeNavLinks, settingsMenu },\n },\n collections,\n globals,\n } = payload.config\n\n const groups = groupNavItems(\n [\n ...collections\n .filter(({ slug }) => visibleEntities?.collections.includes(slug))\n .map(\n (collection) =>\n ({\n type: EntityType.collection,\n entity: collection,\n }) satisfies EntityToGroup,\n ),\n ...globals\n .filter(({ slug }) => visibleEntities?.globals.includes(slug))\n .map(\n (global) =>\n ({\n type: EntityType.global,\n entity: global,\n }) satisfies EntityToGroup,\n ),\n ],\n permissions || {},\n i18n,\n ) as unknown as ExtendedGroup[]\n\n const navPreferences = await getNavPrefs(req)\n\n const serverProps = {\n i18n,\n locale,\n params,\n payload,\n permissions,\n searchParams,\n user,\n }\n\n const clientProps = {\n documentSubViewType,\n viewType,\n }\n\n const beforeNavRendered = RenderServerComponent({\n clientProps,\n Component: beforeNav,\n importMap: payload.importMap,\n serverProps,\n })\n\n const beforeNavLinksRendered = RenderServerComponent({\n clientProps,\n Component: beforeNavLinks,\n importMap: payload.importMap,\n serverProps,\n })\n\n const afterNavLinksRendered = RenderServerComponent({\n clientProps,\n Component: afterNavLinks,\n importMap: payload.importMap,\n serverProps,\n })\n\n const afterNavRendered = RenderServerComponent({\n clientProps,\n Component: afterNav,\n importMap: payload.importMap,\n serverProps,\n })\n\n const renderedSettingsMenu =\n settingsMenu && Array.isArray(settingsMenu)\n ? settingsMenu.map((item, index) =>\n RenderServerComponent({\n clientProps,\n Component: item,\n importMap: payload.importMap,\n key: `settings-menu-item-${index}`,\n serverProps,\n }),\n )\n : []\n\n const config: EnhancedSidebarConfig = sidebarConfig ?? {\n tabs: [\n {\n id: 'default',\n type: 'tab',\n icon: 'LayoutGrid',\n label: 'Collections',\n },\n ],\n }\n\n // Filter all tab bar items by access — fail-closed: missing req denies access\n // Note: req can be undefined on 404 pages due to a Payload bug (NotFound view omits req from props)\n const allConfigTabs = config.tabs ?? []\n const tabAccessResults = await Promise.all(\n allConfigTabs.map((t) =>\n Promise.resolve()\n .then(() => (t.access ? (req ? t.access({ item: t, req }) : false) : true))\n .catch(() => false),\n ),\n )\n const visibleTabItems = allConfigTabs.filter((_, i) => tabAccessResults[i])\n\n // Read active tab from cookie\n const cookieStore = await cookies()\n const storedTabId = cookieStore.get(COOKIE_KEY)?.value\n const tabs = visibleTabItems.filter((t) => t.type === 'tab') as SidebarTabContentType[]\n const defaultTabId = tabs[0]?.id ?? ''\n const initialActiveTabId =\n storedTabId && tabs.some((t) => t.id === storedTabId) ? storedTabId : defaultTabId\n\n const adminRoute = payload.config.routes.admin\n const currentLang = i18n.language\n\n /**\n * Renders a single entity as a NavItem (default or custom).\n */\n const renderEntity = (entity: ExtendedEntity, key: string): React.ReactNode => {\n const { slug, type } = entity\n let href: string\n let id: string\n\n if (type === EntityType.collection) {\n href = formatAdminURL({ adminRoute, path: `/collections/${slug}` })\n id = `nav-${slug}`\n } else if (type === EntityType.global) {\n href = formatAdminURL({ adminRoute, path: `/globals/${slug}` })\n id = `nav-global-${slug}`\n } else if (type === 'custom' && entity.href) {\n id = `nav-custom-${slug}`\n href = entity.isExternal ? entity.href : formatAdminURL({ adminRoute, path: entity.href })\n } else {\n return null\n }\n\n const badgeConfig = config.badges?.[slug]\n\n if (config.customComponents?.NavItem) {\n const label = getTranslation(entity.label, i18n)\n const { clientProps: extraProps, path } = resolveSidebarComponent(\n config.customComponents.NavItem,\n )\n return RenderServerComponent({\n clientProps: { id, badgeConfig, entity, href, label, ...extraProps },\n Component: path,\n importMap: payload.importMap,\n key,\n serverProps,\n })\n }\n\n return <NavItem badgeConfig={badgeConfig} entity={entity} href={href} id={id} key={key} />\n }\n\n /**\n * Renders a group with its entities (default NavGroup or custom).\n */\n const renderGroup = (group: ExtendedGroup, key: string): React.ReactNode => {\n const { entities, label } = group\n const isUngrouped = !label || (typeof label === 'string' && label === '')\n const translatedLabel = getTranslation(label || '', i18n)\n\n const items = entities.map((entity, i) => renderEntity(entity, `${key}-${i}`))\n\n if (isUngrouped) {\n return <Fragment key={key}>{items}</Fragment>\n }\n\n if (config.customComponents?.NavGroup) {\n const { clientProps: extraProps, path } = resolveSidebarComponent(\n config.customComponents.NavGroup,\n )\n return RenderServerComponent({\n clientProps: {\n children: items,\n isOpen: navPreferences?.groups?.[translatedLabel]?.open,\n label: translatedLabel,\n ...extraProps,\n },\n Component: path,\n importMap: payload.importMap,\n key,\n serverProps,\n })\n }\n\n return (\n <NavGroup\n isOpen={navPreferences?.groups?.[translatedLabel]?.open}\n key={key}\n label={translatedLabel}\n >\n {items}\n </NavGroup>\n )\n }\n\n // Pre-render content for every tab on the server (computed in parallel)\n const tabGroupResults = await Promise.all(\n tabs.map((tab) => computeGroupsForTab(tab, groups, currentLang, req)),\n )\n const tabsContent: Record<string, React.ReactNode> = {}\n for (let i = 0; i < tabs.length; i++) {\n const tab = tabs[i]\n const tabGroups = tabGroupResults[i]\n tabsContent[tab.id] = (\n <Fragment>{tabGroups.map((group, j) => renderGroup(group, `${tab.id}-${j}`))}</Fragment>\n )\n }\n\n // For the no-tabs fallback — only show all content when the config has no tab-type items at all.\n // If tabs exist but are all hidden by access control, show nothing instead of the full nav.\n const configuredTabsCount = (config.tabs ?? []).filter((t) => t.type === 'tab').length\n const allContent =\n configuredTabsCount === 0 ? (\n <Fragment>{groups.map((group, i) => renderGroup(group, `all-${i}`))}</Fragment>\n ) : undefined\n\n // Build server-side icon and tab button rendering\n const allTabItems = visibleTabItems\n const hasCustomTabButton = !!config.customComponents?.TabButton\n const hasAnyIconComponent = allTabItems.some((t) => t.type !== 'custom' && t.iconComponent)\n\n // tabIcons: per-id icon node (only built when no custom TabButton, just iconComponent overrides)\n const tabIcons: Record<string, React.ReactNode> = {}\n // renderedTabItems: fully custom tab button nodes (built when customComponents.TabButton is set)\n const renderedTabItems: React.ReactNode[] = []\n // customTabComponents: server-rendered components for type:'custom' tab bar slots\n const customTabComponents: Record<string, React.ReactNode> = {}\n\n // Pre-render all type:'custom' items\n for (const item of allTabItems) {\n if (item.type === 'custom') {\n const { clientProps: extraProps, path } = resolveSidebarComponent(item.component)\n customTabComponents[item.id] = RenderServerComponent({\n clientProps: { id: item.id, ...extraProps },\n Component: path,\n importMap: payload.importMap,\n key: item.id,\n serverProps,\n })\n }\n }\n\n if (hasCustomTabButton || hasAnyIconComponent) {\n for (const item of allTabItems) {\n if (item.type === 'custom') {\n // Include pre-rendered custom slot in renderedTabItems when using custom TabButton\n if (hasCustomTabButton) {\n renderedTabItems.push(customTabComponents[item.id])\n }\n continue\n }\n\n const label = getTranslation(item.label, i18n)\n\n // Resolve icon: custom iconComponent > default Lucide\n let iconNode: React.ReactNode\n if (item.iconComponent) {\n const { clientProps: iconExtraProps, path: iconPath } = resolveSidebarComponent(\n item.iconComponent,\n )\n iconNode = RenderServerComponent({\n clientProps: { id: item.id, type: item.type, label, ...iconExtraProps },\n Component: iconPath,\n importMap: payload.importMap,\n serverProps,\n })\n } else {\n iconNode = item.icon ? <Icon name={item.icon} size={20} /> : null\n }\n\n if (hasCustomTabButton) {\n // Compute href for links\n let href: string | undefined\n if (item.type === 'link') {\n href = item.isExternal ? item.href : formatAdminURL({ adminRoute, path: item.href })\n }\n\n const { clientProps: tabBtnExtraProps, path: tabBtnPath } = resolveSidebarComponent(\n config.customComponents!.TabButton!,\n )\n renderedTabItems.push(\n RenderServerComponent({\n clientProps: {\n id: item.id,\n type: item.type,\n badge: item.badge,\n href,\n icon: iconNode,\n isExternal: item.type === 'link' ? item.isExternal : undefined,\n label,\n ...tabBtnExtraProps,\n },\n Component: tabBtnPath,\n importMap: payload.importMap,\n key: item.id,\n serverProps,\n }),\n )\n } else if (item.iconComponent) {\n tabIcons[item.id] = iconNode\n }\n }\n }\n\n const customNavContent = config.customComponents?.NavContent\n ? (() => {\n const { clientProps: extraProps, path } = resolveSidebarComponent(\n config.customComponents.NavContent,\n )\n return RenderServerComponent({\n clientProps: {\n afterNav: afterNavRendered,\n afterNavLinks: afterNavLinksRendered,\n allContent,\n beforeNav: beforeNavRendered,\n beforeNavLinks: beforeNavLinksRendered,\n tabs: tabs.map((t) => ({ id: t.id })),\n tabsContent,\n ...extraProps,\n },\n Component: path,\n importMap: payload.importMap,\n key: 'enhanced-sidebar-nav-content',\n serverProps,\n })\n })()\n : undefined\n\n // Strip access functions and use only visible tabs before passing to client component\n const clientSidebarConfig = sanitizeSidebarConfig({ ...config, tabs: visibleTabItems })\n\n return (\n <SidebarContent\n afterNav={afterNavRendered}\n afterNavLinks={afterNavLinksRendered}\n allContent={allContent}\n beforeNav={beforeNavRendered}\n beforeNavLinks={beforeNavLinksRendered}\n customNavContent={customNavContent}\n customTabComponents={Object.keys(customTabComponents).length > 0 ? customTabComponents : undefined}\n initialActiveTabId={initialActiveTabId}\n renderedTabItems={renderedTabItems.length > 0 ? renderedTabItems : undefined}\n settingsMenu={renderedSettingsMenu}\n sidebarConfig={clientSidebarConfig}\n tabIcons={Object.keys(tabIcons).length > 0 ? tabIcons : undefined}\n tabsContent={tabsContent}\n />\n )\n}\n\nexport default EnhancedSidebar\n"],"names":["getTranslation","NavGroup","RenderServerComponent","EntityType","groupNavItems","cookies","formatAdminURL","React","Fragment","COOKIE_KEY","extractLocalizedValue","resolveSidebarComponent","sanitizeSidebarConfig","getNavPrefs","Icon","NavItem","SidebarContent","computeGroupsForTab","tab","groups","currentLang","req","collections","tabCollections","customItems","globals","tabGlobals","showAll","allowedSlugs","Set","result","map","g","entities","size","group","filter","entity","has","slug","length","topAdditions","topUngrouped","bottomUngrouped","toEntity","item","type","href","isExternal","label","accessResults","Promise","all","resolve","then","access","catch","visibleItems","_","i","itemGroupLabel","existingGroup","find","groupLabel","push","newGroup","position","unshift","EnhancedSidebar","props","documentSubViewType","i18n","locale","params","payload","permissions","searchParams","sidebarConfig","user","viewType","visibleEntities","config","admin","components","afterNav","afterNavLinks","beforeNav","beforeNavLinks","settingsMenu","includes","collection","global","navPreferences","serverProps","clientProps","beforeNavRendered","Component","importMap","beforeNavLinksRendered","afterNavLinksRendered","afterNavRendered","renderedSettingsMenu","Array","isArray","index","key","tabs","id","icon","allConfigTabs","tabAccessResults","t","visibleTabItems","cookieStore","storedTabId","get","value","defaultTabId","initialActiveTabId","some","adminRoute","routes","language","renderEntity","path","badgeConfig","badges","customComponents","extraProps","renderGroup","isUngrouped","translatedLabel","items","children","isOpen","open","tabGroupResults","tabsContent","tabGroups","j","configuredTabsCount","allContent","undefined","allTabItems","hasCustomTabButton","TabButton","hasAnyIconComponent","iconComponent","tabIcons","renderedTabItems","customTabComponents","component","iconNode","iconExtraProps","iconPath","name","tabBtnExtraProps","tabBtnPath","badge","customNavContent","NavContent","clientSidebarConfig","Object","keys"],"mappings":"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"}
@@ -1,6 +1,4 @@
1
- @import "../../../node_modules/@payloadcms/ui/dist/scss/vars";
2
- @import "../../../node_modules/@payloadcms/ui/dist/scss/queries.scss";
3
-
1
+ @import '~@payloadcms/ui/scss';
4
2
 
5
3
  @layer payload-default {
6
4
  .enhanced-sidebar {
@@ -1 +1 @@
1
- export { InternalBadgeProvider } from '../components/EnhancedSidebar/InternalBadgeProvider';
1
+ export { InternalBadgeProvider } from '../components/EnhancedSidebar/InternalBadgeProvider/index.js';
@@ -1,4 +1,4 @@
1
1
  // Client components exported for Payload's component system
2
- export { InternalBadgeProvider } from '../components/EnhancedSidebar/InternalBadgeProvider';
2
+ export { InternalBadgeProvider } from '../components/EnhancedSidebar/InternalBadgeProvider/index.js';
3
3
 
4
4
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/exports/client.ts"],"sourcesContent":["// Client components exported for Payload's component system\nexport { InternalBadgeProvider } from '../components/EnhancedSidebar/InternalBadgeProvider'\n"],"names":["InternalBadgeProvider"],"mappings":"AAAA,4DAA4D;AAC5D,SAASA,qBAAqB,QAAQ,sDAAqD"}
1
+ {"version":3,"sources":["../../src/exports/client.ts"],"sourcesContent":["// Client components exported for Payload's component system\nexport { InternalBadgeProvider } from '../components/EnhancedSidebar/InternalBadgeProvider/index.js'\n"],"names":["InternalBadgeProvider"],"mappings":"AAAA,4DAA4D;AAC5D,SAASA,qBAAqB,QAAQ,+DAA8D"}
@@ -1 +1 @@
1
- export { default as EnhancedSidebar } from '../components/EnhancedSidebar';
1
+ export { default as EnhancedSidebar } from '../components/EnhancedSidebar/index.js';
@@ -1,3 +1,3 @@
1
- export { default as EnhancedSidebar } from '../components/EnhancedSidebar';
1
+ export { default as EnhancedSidebar } from '../components/EnhancedSidebar/index.js';
2
2
 
3
3
  //# sourceMappingURL=rsc.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/exports/rsc.ts"],"sourcesContent":["export { default as EnhancedSidebar } from '../components/EnhancedSidebar'\n"],"names":["default","EnhancedSidebar"],"mappings":"AAAA,SAASA,WAAWC,eAAe,QAAQ,gCAA+B"}
1
+ {"version":3,"sources":["../../src/exports/rsc.ts"],"sourcesContent":["export { default as EnhancedSidebar } from '../components/EnhancedSidebar/index.js'\n"],"names":["default","EnhancedSidebar"],"mappings":"AAAA,SAASA,WAAWC,eAAe,QAAQ,yCAAwC"}
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { type Config } from 'payload';
2
- import type { EnhancedSidebarConfig } from './types';
2
+ import type { EnhancedSidebarConfig } from './types.js';
3
3
  export declare const payloadEnhancedSidebar: (pluginOptions?: EnhancedSidebarConfig) => (config: Config) => Config;
4
- export { BadgeProvider, useBadgeContext, useBadgeValue, } from './components/EnhancedSidebar/BadgeProvider';
5
- export { useEnhancedSidebar } from './components/EnhancedSidebar/context';
6
- export { useNavItemState } from './components/EnhancedSidebar/hooks/useNavItemState';
7
- export { useTabState } from './components/EnhancedSidebar/hooks/useTabState';
8
- export type { BadgeColor, BadgeConfig, BadgeConfigApi, BadgeConfigCollectionCount, BadgeConfigProvider, BadgeValues, CustomNavContentProps, CustomNavGroupProps, CustomNavItemProps, CustomTabButtonProps, CustomTabIconProps, CustomTabsBarComponentProps, EnhancedSidebarConfig, ItemAccessFunction, SidebarComponent, SidebarTabCustom, TabAccessFunction, } from './types';
4
+ export { BadgeProvider, useBadgeContext, useBadgeValue, } from './components/EnhancedSidebar/BadgeProvider/index.js';
5
+ export { useEnhancedSidebar } from './components/EnhancedSidebar/context.js';
6
+ export { useNavItemState } from './components/EnhancedSidebar/hooks/useNavItemState.js';
7
+ export { useTabState } from './components/EnhancedSidebar/hooks/useTabState.js';
8
+ export type { BadgeColor, BadgeConfig, BadgeConfigApi, BadgeConfigCollectionCount, BadgeConfigProvider, BadgeValues, CustomNavContentProps, CustomNavGroupProps, CustomNavItemProps, CustomTabButtonProps, CustomTabIconProps, CustomTabsBarComponentProps, EnhancedSidebarConfig, ItemAccessFunction, SidebarComponent, SidebarTabCustom, TabAccessFunction, } from './types.js';
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { deepMerge } from 'payload';
2
- import { sidebarTranslations } from './translations';
3
- import { resolveSidebarComponent, sanitizeSidebarConfig } from './utils';
2
+ import { sidebarTranslations } from './translations/index.js';
3
+ import { resolveSidebarComponent, sanitizeSidebarConfig } from './utils/index.js';
4
4
  /**
5
5
  * Default configuration for the enhanced sidebar
6
6
  */ const defaultConfig = {
@@ -114,9 +114,9 @@ export const payloadEnhancedSidebar = (pluginOptions = {})=>(config)=>{
114
114
  config.i18n.translations = deepMerge(config.i18n.translations, sidebarTranslations);
115
115
  return config;
116
116
  };
117
- export { BadgeProvider, useBadgeContext, useBadgeValue } from './components/EnhancedSidebar/BadgeProvider';
118
- export { useEnhancedSidebar } from './components/EnhancedSidebar/context';
119
- export { useNavItemState } from './components/EnhancedSidebar/hooks/useNavItemState';
120
- export { useTabState } from './components/EnhancedSidebar/hooks/useTabState';
117
+ export { BadgeProvider, useBadgeContext, useBadgeValue } from './components/EnhancedSidebar/BadgeProvider/index.js';
118
+ export { useEnhancedSidebar } from './components/EnhancedSidebar/context.js';
119
+ export { useNavItemState } from './components/EnhancedSidebar/hooks/useNavItemState.js';
120
+ export { useTabState } from './components/EnhancedSidebar/hooks/useTabState.js';
121
121
 
122
122
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { type Config, deepMerge } from 'payload'\n\nimport type { EnhancedSidebarConfig } from './types'\n\nimport { sidebarTranslations } from './translations'\nimport { resolveSidebarComponent, sanitizeSidebarConfig } from './utils'\n\n/**\n * Default configuration for the enhanced sidebar\n */\nconst defaultConfig: EnhancedSidebarConfig = {\n showLogout: true,\n tabs: [\n {\n id: 'dashboard',\n type: 'link',\n href: '/',\n icon: 'House',\n label: { en: 'Dashboard', uk: 'Головна' },\n },\n {\n id: 'default',\n type: 'tab',\n icon: 'LayoutGrid',\n label: { en: 'Collections', uk: 'Колекції' },\n },\n ],\n}\n\nexport const payloadEnhancedSidebar =\n (pluginOptions: EnhancedSidebarConfig = {}) =>\n (config: Config): Config => {\n if (pluginOptions.disabled) {\n return config\n }\n\n const sidebarConfig: EnhancedSidebarConfig = {\n ...defaultConfig,\n ...pluginOptions,\n tabs: pluginOptions.tabs ?? defaultConfig.tabs,\n }\n\n if (!config.admin) {\n config.admin = {}\n }\n\n if (!config.admin.components) {\n config.admin.components = {}\n }\n\n // Always override Nav — user-defined Nav in config should use customComponents instead\n config.admin.components.Nav = {\n path: '@veiag/payload-enhanced-sidebar/rsc#EnhancedSidebar',\n serverProps: {\n sidebarConfig,\n },\n }\n\n // Register custom components and per-tab icons in the import map\n if (!config.admin.dependencies) {\n config.admin.dependencies = {}\n }\n\n const customComponentSlots = ['NavContent', 'NavGroup', 'NavItem', 'TabButton'] as const\n for (const slot of customComponentSlots) {\n const component = sidebarConfig.customComponents?.[slot]\n if (component) {\n const { path } = resolveSidebarComponent(component)\n config.admin.dependencies[`enhanced-sidebar-${slot.toLowerCase()}`] = {\n type: 'component',\n path,\n }\n }\n }\n\n const seenTabIds = new Set<string>()\n for (const tab of sidebarConfig.tabs ?? []) {\n if (seenTabIds.has(tab.id)) {\n throw new Error(\n `[payload-enhanced-sidebar] Duplicate tab id \"${tab.id}\". Each tab must have a unique id.`,\n )\n }\n seenTabIds.add(tab.id)\n\n if (tab.type === 'custom') {\n const { path } = resolveSidebarComponent(tab.component)\n config.admin.dependencies[`enhanced-sidebar-custom-tab-${tab.id}`] = {\n type: 'component',\n path,\n }\n } else if (tab.iconComponent) {\n const { path } = resolveSidebarComponent(tab.iconComponent)\n config.admin.dependencies[`enhanced-sidebar-icon-${tab.id}`] = {\n type: 'component',\n path,\n }\n }\n }\n\n // Check if we have any badges to fetch (api or collection-count)\n const hasBadgesToFetch =\n sidebarConfig.badges ||\n sidebarConfig.tabs?.some(\n (tab) => tab.type !== 'custom' && tab.badge && tab.badge.type !== 'provider',\n )\n\n // Add InternalBadgeProvider if we have badges to fetch\n if (hasBadgesToFetch) {\n if (!config.admin.components.providers) {\n config.admin.components.providers = []\n }\n\n // Add our internal provider at the beginning (so user providers can override)\n config.admin.components.providers.unshift({\n clientProps: {\n sidebarConfig: sanitizeSidebarConfig(sidebarConfig),\n },\n path: '@veiag/payload-enhanced-sidebar/client#InternalBadgeProvider',\n })\n }\n\n // Adding translations\n if (!config.i18n) {\n config.i18n = {}\n }\n if (!config.i18n.translations) {\n config.i18n.translations = {}\n }\n\n config.i18n.translations = deepMerge(config.i18n.translations, sidebarTranslations)\n\n return config\n }\n\nexport {\n BadgeProvider,\n useBadgeContext,\n useBadgeValue,\n} from './components/EnhancedSidebar/BadgeProvider'\n\nexport { useEnhancedSidebar } from './components/EnhancedSidebar/context'\nexport { useNavItemState } from './components/EnhancedSidebar/hooks/useNavItemState'\nexport { useTabState } from './components/EnhancedSidebar/hooks/useTabState'\n\nexport type {\n BadgeColor,\n BadgeConfig,\n BadgeConfigApi,\n BadgeConfigCollectionCount,\n BadgeConfigProvider,\n BadgeValues,\n CustomNavContentProps,\n CustomNavGroupProps,\n CustomNavItemProps,\n CustomTabButtonProps,\n CustomTabIconProps,\n CustomTabsBarComponentProps,\n EnhancedSidebarConfig,\n ItemAccessFunction,\n SidebarComponent,\n SidebarTabCustom,\n TabAccessFunction,\n} from './types'\n"],"names":["deepMerge","sidebarTranslations","resolveSidebarComponent","sanitizeSidebarConfig","defaultConfig","showLogout","tabs","id","type","href","icon","label","en","uk","payloadEnhancedSidebar","pluginOptions","config","disabled","sidebarConfig","admin","components","Nav","path","serverProps","dependencies","customComponentSlots","slot","component","customComponents","toLowerCase","seenTabIds","Set","tab","has","Error","add","iconComponent","hasBadgesToFetch","badges","some","badge","providers","unshift","clientProps","i18n","translations","BadgeProvider","useBadgeContext","useBadgeValue","useEnhancedSidebar","useNavItemState","useTabState"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { type Config, deepMerge } from 'payload'\n\nimport type { EnhancedSidebarConfig } from './types.js'\n\nimport { sidebarTranslations } from './translations/index.js'\nimport { resolveSidebarComponent, sanitizeSidebarConfig } from './utils/index.js'\n\n/**\n * Default configuration for the enhanced sidebar\n */\nconst defaultConfig: EnhancedSidebarConfig = {\n showLogout: true,\n tabs: [\n {\n id: 'dashboard',\n type: 'link',\n href: '/',\n icon: 'House',\n label: { en: 'Dashboard', uk: 'Головна' },\n },\n {\n id: 'default',\n type: 'tab',\n icon: 'LayoutGrid',\n label: { en: 'Collections', uk: 'Колекції' },\n },\n ],\n}\n\nexport const payloadEnhancedSidebar =\n (pluginOptions: EnhancedSidebarConfig = {}) =>\n (config: Config): Config => {\n if (pluginOptions.disabled) {\n return config\n }\n\n const sidebarConfig: EnhancedSidebarConfig = {\n ...defaultConfig,\n ...pluginOptions,\n tabs: pluginOptions.tabs ?? defaultConfig.tabs,\n }\n\n if (!config.admin) {\n config.admin = {}\n }\n\n if (!config.admin.components) {\n config.admin.components = {}\n }\n\n // Always override Nav — user-defined Nav in config should use customComponents instead\n config.admin.components.Nav = {\n path: '@veiag/payload-enhanced-sidebar/rsc#EnhancedSidebar',\n serverProps: {\n sidebarConfig,\n },\n }\n\n // Register custom components and per-tab icons in the import map\n if (!config.admin.dependencies) {\n config.admin.dependencies = {}\n }\n\n const customComponentSlots = ['NavContent', 'NavGroup', 'NavItem', 'TabButton'] as const\n for (const slot of customComponentSlots) {\n const component = sidebarConfig.customComponents?.[slot]\n if (component) {\n const { path } = resolveSidebarComponent(component)\n config.admin.dependencies[`enhanced-sidebar-${slot.toLowerCase()}`] = {\n type: 'component',\n path,\n }\n }\n }\n\n const seenTabIds = new Set<string>()\n for (const tab of sidebarConfig.tabs ?? []) {\n if (seenTabIds.has(tab.id)) {\n throw new Error(\n `[payload-enhanced-sidebar] Duplicate tab id \"${tab.id}\". Each tab must have a unique id.`,\n )\n }\n seenTabIds.add(tab.id)\n\n if (tab.type === 'custom') {\n const { path } = resolveSidebarComponent(tab.component)\n config.admin.dependencies[`enhanced-sidebar-custom-tab-${tab.id}`] = {\n type: 'component',\n path,\n }\n } else if (tab.iconComponent) {\n const { path } = resolveSidebarComponent(tab.iconComponent)\n config.admin.dependencies[`enhanced-sidebar-icon-${tab.id}`] = {\n type: 'component',\n path,\n }\n }\n }\n\n // Check if we have any badges to fetch (api or collection-count)\n const hasBadgesToFetch =\n sidebarConfig.badges ||\n sidebarConfig.tabs?.some(\n (tab) => tab.type !== 'custom' && tab.badge && tab.badge.type !== 'provider',\n )\n\n // Add InternalBadgeProvider if we have badges to fetch\n if (hasBadgesToFetch) {\n if (!config.admin.components.providers) {\n config.admin.components.providers = []\n }\n\n // Add our internal provider at the beginning (so user providers can override)\n config.admin.components.providers.unshift({\n clientProps: {\n sidebarConfig: sanitizeSidebarConfig(sidebarConfig),\n },\n path: '@veiag/payload-enhanced-sidebar/client#InternalBadgeProvider',\n })\n }\n\n // Adding translations\n if (!config.i18n) {\n config.i18n = {}\n }\n if (!config.i18n.translations) {\n config.i18n.translations = {}\n }\n\n config.i18n.translations = deepMerge(config.i18n.translations, sidebarTranslations)\n\n return config\n }\n\nexport {\n BadgeProvider,\n useBadgeContext,\n useBadgeValue,\n} from './components/EnhancedSidebar/BadgeProvider/index.js'\n\nexport { useEnhancedSidebar } from './components/EnhancedSidebar/context.js'\nexport { useNavItemState } from './components/EnhancedSidebar/hooks/useNavItemState.js'\nexport { useTabState } from './components/EnhancedSidebar/hooks/useTabState.js'\n\nexport type {\n BadgeColor,\n BadgeConfig,\n BadgeConfigApi,\n BadgeConfigCollectionCount,\n BadgeConfigProvider,\n BadgeValues,\n CustomNavContentProps,\n CustomNavGroupProps,\n CustomNavItemProps,\n CustomTabButtonProps,\n CustomTabIconProps,\n CustomTabsBarComponentProps,\n EnhancedSidebarConfig,\n ItemAccessFunction,\n SidebarComponent,\n SidebarTabCustom,\n TabAccessFunction,\n} from './types.js'\n"],"names":["deepMerge","sidebarTranslations","resolveSidebarComponent","sanitizeSidebarConfig","defaultConfig","showLogout","tabs","id","type","href","icon","label","en","uk","payloadEnhancedSidebar","pluginOptions","config","disabled","sidebarConfig","admin","components","Nav","path","serverProps","dependencies","customComponentSlots","slot","component","customComponents","toLowerCase","seenTabIds","Set","tab","has","Error","add","iconComponent","hasBadgesToFetch","badges","some","badge","providers","unshift","clientProps","i18n","translations","BadgeProvider","useBadgeContext","useBadgeValue","useEnhancedSidebar","useNavItemState","useTabState"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { EnhancedSidebarConfig, LocalizedString, SidebarComponent } from '../types';
1
+ import type { EnhancedSidebarConfig, LocalizedString, SidebarComponent } from '../types.js';
2
2
  export declare const convertSlugToTitle: (slug: string) => string;
3
3
  /**
4
4
  * Extracts path and clientProps from a SidebarComponent (string or object).
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/index.ts"],"sourcesContent":["import type { EnhancedSidebarConfig, LocalizedString, SidebarComponent } from '../types'\n\nexport const convertSlugToTitle = (slug: string): string => {\n return slug.replace(/-/g, ' ').replace(/\\b\\w/g, (char) => char.toUpperCase())\n}\n\n/**\n * Extracts path and clientProps from a SidebarComponent (string or object).\n */\nexport const resolveSidebarComponent = (\n component: SidebarComponent,\n): { clientProps: Record<string, unknown>; path: string } => {\n if (typeof component === 'string') {\n return { clientProps: {}, path: component }\n }\n return { clientProps: component.clientProps ?? {}, path: component.path }\n}\n\n/**\n * Strips all non-serializable values (functions) from the sidebar config\n * before passing it to client components.\n */\nexport const sanitizeSidebarConfig = (config: EnhancedSidebarConfig): EnhancedSidebarConfig => ({\n ...config,\n tabs: config.tabs?.map((tab) => {\n const { access: _, ...tabRest } = tab\n if (tabRest.type === 'tab' && tabRest.customItems) {\n return {\n ...tabRest,\n customItems: tabRest.customItems.map(({ access: __, ...item }) => item),\n }\n }\n return tabRest\n }),\n})\n\n\nexport const extractLocalizedValue = (\n value: LocalizedString | undefined,\n locale: string,\n fallbackSlug?: string,\n): string => {\n if (!value) {\n return fallbackSlug ? convertSlugToTitle(fallbackSlug) : ''\n }\n if (typeof value === 'string') {\n return value\n }\n return value[locale] || Object.values(value)[0] || (fallbackSlug ? convertSlugToTitle(fallbackSlug) : '')\n}\n"],"names":["convertSlugToTitle","slug","replace","char","toUpperCase","resolveSidebarComponent","component","clientProps","path","sanitizeSidebarConfig","config","tabs","map","tab","access","_","tabRest","type","customItems","__","item","extractLocalizedValue","value","locale","fallbackSlug","Object","values"],"mappings":"AAEA,OAAO,MAAMA,qBAAqB,CAACC;IACjC,OAAOA,KAAKC,OAAO,CAAC,MAAM,KAAKA,OAAO,CAAC,SAAS,CAACC,OAASA,KAAKC,WAAW;AAC5E,EAAC;AAED;;CAEC,GACD,OAAO,MAAMC,0BAA0B,CACrCC;IAEA,IAAI,OAAOA,cAAc,UAAU;QACjC,OAAO;YAAEC,aAAa,CAAC;YAAGC,MAAMF;QAAU;IAC5C;IACA,OAAO;QAAEC,aAAaD,UAAUC,WAAW,IAAI,CAAC;QAAGC,MAAMF,UAAUE,IAAI;IAAC;AAC1E,EAAC;AAED;;;CAGC,GACD,OAAO,MAAMC,wBAAwB,CAACC,SAA0D,CAAA;QAC9F,GAAGA,MAAM;QACTC,MAAMD,OAAOC,IAAI,EAAEC,IAAI,CAACC;YACtB,MAAM,EAAEC,QAAQC,CAAC,EAAE,GAAGC,SAAS,GAAGH;YAClC,IAAIG,QAAQC,IAAI,KAAK,SAASD,QAAQE,WAAW,EAAE;gBACjD,OAAO;oBACL,GAAGF,OAAO;oBACVE,aAAaF,QAAQE,WAAW,CAACN,GAAG,CAAC,CAAC,EAAEE,QAAQK,EAAE,EAAE,GAAGC,MAAM,GAAKA;gBACpE;YACF;YACA,OAAOJ;QACT;IACF,CAAA,EAAE;AAGF,OAAO,MAAMK,wBAAwB,CACnCC,OACAC,QACAC;IAEA,IAAI,CAACF,OAAO;QACV,OAAOE,eAAexB,mBAAmBwB,gBAAgB;IAC3D;IACA,IAAI,OAAOF,UAAU,UAAU;QAC7B,OAAOA;IACT;IACA,OAAOA,KAAK,CAACC,OAAO,IAAIE,OAAOC,MAAM,CAACJ,MAAM,CAAC,EAAE,IAAKE,CAAAA,eAAexB,mBAAmBwB,gBAAgB,EAAC;AACzG,EAAC"}
1
+ {"version":3,"sources":["../../src/utils/index.ts"],"sourcesContent":["import type { EnhancedSidebarConfig, LocalizedString, SidebarComponent } from '../types.js'\n\nexport const convertSlugToTitle = (slug: string): string => {\n return slug.replace(/-/g, ' ').replace(/\\b\\w/g, (char) => char.toUpperCase())\n}\n\n/**\n * Extracts path and clientProps from a SidebarComponent (string or object).\n */\nexport const resolveSidebarComponent = (\n component: SidebarComponent,\n): { clientProps: Record<string, unknown>; path: string } => {\n if (typeof component === 'string') {\n return { clientProps: {}, path: component }\n }\n return { clientProps: component.clientProps ?? {}, path: component.path }\n}\n\n/**\n * Strips all non-serializable values (functions) from the sidebar config\n * before passing it to client components.\n */\nexport const sanitizeSidebarConfig = (config: EnhancedSidebarConfig): EnhancedSidebarConfig => ({\n ...config,\n tabs: config.tabs?.map((tab) => {\n const { access: _, ...tabRest } = tab\n if (tabRest.type === 'tab' && tabRest.customItems) {\n return {\n ...tabRest,\n customItems: tabRest.customItems.map(({ access: __, ...item }) => item),\n }\n }\n return tabRest\n }),\n})\n\n\nexport const extractLocalizedValue = (\n value: LocalizedString | undefined,\n locale: string,\n fallbackSlug?: string,\n): string => {\n if (!value) {\n return fallbackSlug ? convertSlugToTitle(fallbackSlug) : ''\n }\n if (typeof value === 'string') {\n return value\n }\n return value[locale] || Object.values(value)[0] || (fallbackSlug ? convertSlugToTitle(fallbackSlug) : '')\n}\n"],"names":["convertSlugToTitle","slug","replace","char","toUpperCase","resolveSidebarComponent","component","clientProps","path","sanitizeSidebarConfig","config","tabs","map","tab","access","_","tabRest","type","customItems","__","item","extractLocalizedValue","value","locale","fallbackSlug","Object","values"],"mappings":"AAEA,OAAO,MAAMA,qBAAqB,CAACC;IACjC,OAAOA,KAAKC,OAAO,CAAC,MAAM,KAAKA,OAAO,CAAC,SAAS,CAACC,OAASA,KAAKC,WAAW;AAC5E,EAAC;AAED;;CAEC,GACD,OAAO,MAAMC,0BAA0B,CACrCC;IAEA,IAAI,OAAOA,cAAc,UAAU;QACjC,OAAO;YAAEC,aAAa,CAAC;YAAGC,MAAMF;QAAU;IAC5C;IACA,OAAO;QAAEC,aAAaD,UAAUC,WAAW,IAAI,CAAC;QAAGC,MAAMF,UAAUE,IAAI;IAAC;AAC1E,EAAC;AAED;;;CAGC,GACD,OAAO,MAAMC,wBAAwB,CAACC,SAA0D,CAAA;QAC9F,GAAGA,MAAM;QACTC,MAAMD,OAAOC,IAAI,EAAEC,IAAI,CAACC;YACtB,MAAM,EAAEC,QAAQC,CAAC,EAAE,GAAGC,SAAS,GAAGH;YAClC,IAAIG,QAAQC,IAAI,KAAK,SAASD,QAAQE,WAAW,EAAE;gBACjD,OAAO;oBACL,GAAGF,OAAO;oBACVE,aAAaF,QAAQE,WAAW,CAACN,GAAG,CAAC,CAAC,EAAEE,QAAQK,EAAE,EAAE,GAAGC,MAAM,GAAKA;gBACpE;YACF;YACA,OAAOJ;QACT;IACF,CAAA,EAAE;AAGF,OAAO,MAAMK,wBAAwB,CACnCC,OACAC,QACAC;IAEA,IAAI,CAACF,OAAO;QACV,OAAOE,eAAexB,mBAAmBwB,gBAAgB;IAC3D;IACA,IAAI,OAAOF,UAAU,UAAU;QAC7B,OAAOA;IACT;IACA,OAAOA,KAAK,CAACC,OAAO,IAAIE,OAAOC,MAAM,CAACJ,MAAM,CAAC,EAAE,IAAKE,CAAAA,eAAexB,mBAAmBwB,gBAAgB,EAAC;AACzG,EAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@veiag/payload-enhanced-sidebar",
3
- "version": "0.3.2-canary.1",
3
+ "version": "0.3.2",
4
4
  "description": "An enhanced sidebar plugin for Payload CMS with tabbed navigation to organize collections and globals.",
5
5
  "author": "VeiaG",
6
6
  "license": "MIT",