@withpotter/pages-admin 0.13.0-next.79 → 0.13.0-next.81

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.
@@ -9,6 +9,8 @@ function SidebarFooter({
9
9
  collapsed,
10
10
  settingsActive,
11
11
  showSettings,
12
+ actions = [],
13
+ pathname,
12
14
  onSearch
13
15
  }) {
14
16
  const { resolvedTheme, toggleTheme } = useTheme();
@@ -45,6 +47,24 @@ function SidebarFooter({
45
47
  ]
46
48
  }
47
49
  ) }),
50
+ actions.map(({ href, label, icon: Icon, badge: Badge }) => {
51
+ const active = pathname === href || pathname.startsWith(`${href}/`);
52
+ return /* @__PURE__ */ jsx(RailTip, { label, on: collapsed, children: /* @__PURE__ */ jsxs(
53
+ Link,
54
+ {
55
+ href,
56
+ className: styles.theme,
57
+ "data-active": active,
58
+ "aria-current": active ? "page" : void 0,
59
+ "aria-label": label,
60
+ title: collapsed ? void 0 : label,
61
+ children: [
62
+ /* @__PURE__ */ jsx(Icon, { size: 16, "aria-hidden": true }),
63
+ Badge && /* @__PURE__ */ jsx("span", { className: styles.badge, children: /* @__PURE__ */ jsx(Badge, {}) })
64
+ ]
65
+ }
66
+ ) }, href);
67
+ }),
48
68
  /* @__PURE__ */ jsx(RailTip, { label: themeLabel, on: collapsed, children: /* @__PURE__ */ jsx(
49
69
  "button",
50
70
  {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/admin/_shell/sidebar-footer.tsx"],"sourcesContent":["'use client';\n\nimport Link from 'next/link';\nimport { Moon, Search, Settings, Sun } from 'lucide-react';\nimport { useTheme } from '@withpotter/lib/theme-context';\nimport { RailTip } from './nav-row';\nimport styles from './sidebar-footer.module.css';\n\n/**\n * The pinned foot of the sidebar: jump anywhere (⌘K), and Settings with the\n * theme switch beside it. In the rail each is its own 40px target.\n */\nexport function SidebarFooter({\n collapsed,\n settingsActive,\n showSettings,\n onSearch,\n}: {\n collapsed: boolean;\n settingsActive: boolean;\n showSettings: boolean;\n onSearch: () => void;\n}) {\n const { resolvedTheme, toggleTheme } = useTheme();\n const dark = resolvedTheme === 'dark';\n const themeLabel = `Switch to ${dark ? 'light' : 'dark'} mode`;\n\n return (\n <div className={styles.foot} data-collapsed={collapsed}>\n <RailTip label=\"Search\" on={collapsed}>\n <button\n type=\"button\"\n className={styles.row}\n onClick={onSearch}\n aria-label={collapsed ? 'Search' : undefined}\n aria-keyshortcuts=\"Meta+K\"\n >\n <Search size={16} className={styles.icon} aria-hidden />\n <span className={styles.label}>Search</span>\n <kbd className={styles.kbd}>⌘K</kbd>\n </button>\n </RailTip>\n\n <div className={styles.split}>\n {showSettings && (\n <RailTip label=\"Settings\" on={collapsed}>\n <Link\n href=\"/admin/settings\"\n className={styles.row}\n data-active={settingsActive}\n aria-current={settingsActive ? 'page' : undefined}\n aria-label={collapsed ? 'Settings' : undefined}\n >\n <Settings size={16} className={styles.icon} aria-hidden />\n <span className={styles.label}>Settings</span>\n </Link>\n </RailTip>\n )}\n <RailTip label={themeLabel} on={collapsed}>\n <button\n type=\"button\"\n className={styles.theme}\n onClick={toggleTheme}\n aria-label={themeLabel}\n title={collapsed ? undefined : themeLabel}\n >\n {dark ? <Sun size={16} /> : <Moon size={16} />}\n </button>\n </RailTip>\n </div>\n </div>\n );\n}\n"],"mappings":";AA8BQ,SAOE,KAPF;AA5BR,OAAO,UAAU;AACjB,SAAS,MAAM,QAAQ,UAAU,WAAW;AAC5C,SAAS,gBAAgB;AACzB,SAAS,eAAe;AACxB,OAAO,YAAY;AAMZ,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,EAAE,eAAe,YAAY,IAAI,SAAS;AAChD,QAAM,OAAO,kBAAkB;AAC/B,QAAM,aAAa,aAAa,OAAO,UAAU,MAAM;AAEvD,SACE,qBAAC,SAAI,WAAW,OAAO,MAAM,kBAAgB,WAC3C;AAAA,wBAAC,WAAQ,OAAM,UAAS,IAAI,WAC1B;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAW,OAAO;AAAA,QAClB,SAAS;AAAA,QACT,cAAY,YAAY,WAAW;AAAA,QACnC,qBAAkB;AAAA,QAElB;AAAA,8BAAC,UAAO,MAAM,IAAI,WAAW,OAAO,MAAM,eAAW,MAAC;AAAA,UACtD,oBAAC,UAAK,WAAW,OAAO,OAAO,oBAAM;AAAA,UACrC,oBAAC,SAAI,WAAW,OAAO,KAAK,qBAAE;AAAA;AAAA;AAAA,IAChC,GACF;AAAA,IAEA,qBAAC,SAAI,WAAW,OAAO,OACpB;AAAA,sBACC,oBAAC,WAAQ,OAAM,YAAW,IAAI,WAC5B;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAW,OAAO;AAAA,UAClB,eAAa;AAAA,UACb,gBAAc,iBAAiB,SAAS;AAAA,UACxC,cAAY,YAAY,aAAa;AAAA,UAErC;AAAA,gCAAC,YAAS,MAAM,IAAI,WAAW,OAAO,MAAM,eAAW,MAAC;AAAA,YACxD,oBAAC,UAAK,WAAW,OAAO,OAAO,sBAAQ;AAAA;AAAA;AAAA,MACzC,GACF;AAAA,MAEF,oBAAC,WAAQ,OAAO,YAAY,IAAI,WAC9B;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAW,OAAO;AAAA,UAClB,SAAS;AAAA,UACT,cAAY;AAAA,UACZ,OAAO,YAAY,SAAY;AAAA,UAE9B,iBAAO,oBAAC,OAAI,MAAM,IAAI,IAAK,oBAAC,QAAK,MAAM,IAAI;AAAA;AAAA,MAC9C,GACF;AAAA,OACF;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/admin/_shell/sidebar-footer.tsx"],"sourcesContent":["'use client';\n\nimport Link from 'next/link';\nimport type { ComponentType } from 'react';\nimport { Moon, Search, Settings, Sun, type LucideIcon } from 'lucide-react';\nimport { useTheme } from '@withpotter/lib/theme-context';\nimport { RailTip } from './nav-row';\nimport styles from './sidebar-footer.module.css';\n\n/**\n * An icon a host adds to the foot, beside the theme switch: a link with a\n * name for screen readers and a tooltip, and an optional `badge` drawn on its\n * corner (a dot or a count; it draws nothing when there is nothing to show).\n */\nexport type FooterAction = {\n href: string;\n label: string;\n icon: LucideIcon;\n badge?: ComponentType;\n /** Shown to superadmins only, like a menu item marked `superadmin`. */\n superadmin?: boolean;\n};\n\n/**\n * The pinned foot of the sidebar: jump anywhere (⌘K), and Settings with the\n * host's icons and the theme switch beside it. In the rail each is its own\n * 40px target.\n */\nexport function SidebarFooter({\n collapsed,\n settingsActive,\n showSettings,\n actions = [],\n pathname,\n onSearch,\n}: {\n collapsed: boolean;\n settingsActive: boolean;\n showSettings: boolean;\n actions?: FooterAction[];\n pathname: string;\n onSearch: () => void;\n}) {\n const { resolvedTheme, toggleTheme } = useTheme();\n const dark = resolvedTheme === 'dark';\n const themeLabel = `Switch to ${dark ? 'light' : 'dark'} mode`;\n\n return (\n <div className={styles.foot} data-collapsed={collapsed}>\n <RailTip label=\"Search\" on={collapsed}>\n <button\n type=\"button\"\n className={styles.row}\n onClick={onSearch}\n aria-label={collapsed ? 'Search' : undefined}\n aria-keyshortcuts=\"Meta+K\"\n >\n <Search size={16} className={styles.icon} aria-hidden />\n <span className={styles.label}>Search</span>\n <kbd className={styles.kbd}>⌘K</kbd>\n </button>\n </RailTip>\n\n <div className={styles.split}>\n {showSettings && (\n <RailTip label=\"Settings\" on={collapsed}>\n <Link\n href=\"/admin/settings\"\n className={styles.row}\n data-active={settingsActive}\n aria-current={settingsActive ? 'page' : undefined}\n aria-label={collapsed ? 'Settings' : undefined}\n >\n <Settings size={16} className={styles.icon} aria-hidden />\n <span className={styles.label}>Settings</span>\n </Link>\n </RailTip>\n )}\n {actions.map(({ href, label, icon: Icon, badge: Badge }) => {\n const active = pathname === href || pathname.startsWith(`${href}/`);\n return (\n <RailTip key={href} label={label} on={collapsed}>\n <Link\n href={href}\n className={styles.theme}\n data-active={active}\n aria-current={active ? 'page' : undefined}\n aria-label={label}\n title={collapsed ? undefined : label}\n >\n <Icon size={16} aria-hidden />\n {Badge && (\n <span className={styles.badge}>\n <Badge />\n </span>\n )}\n </Link>\n </RailTip>\n );\n })}\n <RailTip label={themeLabel} on={collapsed}>\n <button\n type=\"button\"\n className={styles.theme}\n onClick={toggleTheme}\n aria-label={themeLabel}\n title={collapsed ? undefined : themeLabel}\n >\n {dark ? <Sun size={16} /> : <Moon size={16} />}\n </button>\n </RailTip>\n </div>\n </div>\n );\n}\n"],"mappings":";AAkDQ,SAOE,KAPF;AAhDR,OAAO,UAAU;AAEjB,SAAS,MAAM,QAAQ,UAAU,WAA4B;AAC7D,SAAS,gBAAgB;AACzB,SAAS,eAAe;AACxB,OAAO,YAAY;AAqBZ,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU,CAAC;AAAA,EACX;AAAA,EACA;AACF,GAOG;AACD,QAAM,EAAE,eAAe,YAAY,IAAI,SAAS;AAChD,QAAM,OAAO,kBAAkB;AAC/B,QAAM,aAAa,aAAa,OAAO,UAAU,MAAM;AAEvD,SACE,qBAAC,SAAI,WAAW,OAAO,MAAM,kBAAgB,WAC3C;AAAA,wBAAC,WAAQ,OAAM,UAAS,IAAI,WAC1B;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAW,OAAO;AAAA,QAClB,SAAS;AAAA,QACT,cAAY,YAAY,WAAW;AAAA,QACnC,qBAAkB;AAAA,QAElB;AAAA,8BAAC,UAAO,MAAM,IAAI,WAAW,OAAO,MAAM,eAAW,MAAC;AAAA,UACtD,oBAAC,UAAK,WAAW,OAAO,OAAO,oBAAM;AAAA,UACrC,oBAAC,SAAI,WAAW,OAAO,KAAK,qBAAE;AAAA;AAAA;AAAA,IAChC,GACF;AAAA,IAEA,qBAAC,SAAI,WAAW,OAAO,OACpB;AAAA,sBACC,oBAAC,WAAQ,OAAM,YAAW,IAAI,WAC5B;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAW,OAAO;AAAA,UAClB,eAAa;AAAA,UACb,gBAAc,iBAAiB,SAAS;AAAA,UACxC,cAAY,YAAY,aAAa;AAAA,UAErC;AAAA,gCAAC,YAAS,MAAM,IAAI,WAAW,OAAO,MAAM,eAAW,MAAC;AAAA,YACxD,oBAAC,UAAK,WAAW,OAAO,OAAO,sBAAQ;AAAA;AAAA;AAAA,MACzC,GACF;AAAA,MAED,QAAQ,IAAI,CAAC,EAAE,MAAM,OAAO,MAAM,MAAM,OAAO,MAAM,MAAM;AAC1D,cAAM,SAAS,aAAa,QAAQ,SAAS,WAAW,GAAG,IAAI,GAAG;AAClE,eACE,oBAAC,WAAmB,OAAc,IAAI,WACpC;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,WAAW,OAAO;AAAA,YAClB,eAAa;AAAA,YACb,gBAAc,SAAS,SAAS;AAAA,YAChC,cAAY;AAAA,YACZ,OAAO,YAAY,SAAY;AAAA,YAE/B;AAAA,kCAAC,QAAK,MAAM,IAAI,eAAW,MAAC;AAAA,cAC3B,SACC,oBAAC,UAAK,WAAW,OAAO,OACtB,8BAAC,SAAM,GACT;AAAA;AAAA;AAAA,QAEJ,KAfY,IAgBd;AAAA,MAEJ,CAAC;AAAA,MACD,oBAAC,WAAQ,OAAO,YAAY,IAAI,WAC9B;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAW,OAAO;AAAA,UAClB,SAAS;AAAA,UACT,cAAY;AAAA,UACZ,OAAO,YAAY,SAAY;AAAA,UAE9B,iBAAO,oBAAC,OAAI,MAAM,IAAI,IAAK,oBAAC,QAAK,MAAM,IAAI;AAAA;AAAA,MAC9C,GACF;AAAA,OACF;AAAA,KACF;AAEJ;","names":[]}
@@ -42,10 +42,27 @@
42
42
  }
43
43
 
44
44
  .theme {
45
+ position: relative;
45
46
  flex: none;
46
47
  justify-content: center;
47
48
  width: 32px;
48
49
  height: 32px;
50
+ text-decoration: none;
51
+ }
52
+
53
+ .theme[data-active='true'] {
54
+ border-color: var(--border-default);
55
+ background: var(--bg-base);
56
+ color: var(--text-primary);
57
+ }
58
+
59
+ /* A host's count or dot, on the icon's top right corner. */
60
+ .badge {
61
+ position: absolute;
62
+ top: 2px;
63
+ right: 2px;
64
+ display: flex;
65
+ pointer-events: none;
49
66
  }
50
67
 
51
68
  .row:hover,
@@ -16,7 +16,8 @@ function Sidebar({
16
16
  email,
17
17
  role,
18
18
  onSearch,
19
- badges
19
+ badges,
20
+ footerActions
20
21
  }) {
21
22
  const hover = useFluidHover();
22
23
  const settings = groups.flatMap((group) => group.items).find((item) => item.href === FOOT_HREF);
@@ -73,6 +74,8 @@ function Sidebar({
73
74
  collapsed,
74
75
  showSettings: Boolean(settings),
75
76
  settingsActive: settings ? isActive(settings, pathname) : false,
77
+ actions: footerActions,
78
+ pathname,
76
79
  onSearch
77
80
  }
78
81
  )
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/admin/_shell/sidebar.tsx"],"sourcesContent":["'use client';\n\nimport type { ComponentType } from 'react';\nimport type { NavGroup } from './nav-config';\nimport { isActive } from './nav-filter';\nimport { NavGroupView } from './nav-group';\nimport { useOpenGroups } from './use-open-groups';\nimport { SidebarFooter } from './sidebar-footer';\nimport { useFluidHover } from './use-fluid-hover';\nimport { UserMenu } from './user-menu';\nimport styles from './sidebar.module.css';\n\n/** Settings lives in the pinned foot, beside the theme switch. */\nconst FOOT_HREF = '/admin/settings';\n\nexport function Sidebar({\n groups,\n pathname,\n canSupport,\n collapsed,\n email,\n role,\n onSearch,\n badges,\n}: {\n groups: NavGroup[];\n pathname: string;\n canSupport: boolean;\n collapsed: boolean;\n email: string;\n role: string;\n onSearch: () => void;\n /** A host's own count per item, by href. */\n badges?: Record<string, ComponentType>;\n}) {\n const hover = useFluidHover();\n const settings = groups\n .flatMap((group) => group.items)\n .find((item) => item.href === FOOT_HREF);\n const navGroups = groups\n .map((group) => ({\n ...group,\n items: group.items.filter((item) => item.href !== FOOT_HREF),\n }))\n .filter((group) => group.items.length);\n const activeGroup =\n navGroups.find((group) =>\n group.items.some((item) => isActive(item, pathname)),\n )?.label ?? null;\n const { choices, setGroupOpen } = useOpenGroups(pathname, activeGroup);\n\n return (\n <aside className={styles.sidebar} data-collapsed={collapsed}>\n <UserMenu email={email} role={role} collapsed={collapsed} />\n\n <nav\n className={styles.nav}\n aria-label=\"Admin\"\n onPointerMove={hover.onPointerMove}\n onPointerLeave={hover.onPointerLeave}\n onClick={hover.onClick}\n >\n <span\n aria-hidden\n className={styles.glide}\n data-visible={Boolean(hover.rect)}\n style={\n hover.rect\n ? {\n transform: `translateY(${hover.rect.top}px)`,\n height: hover.rect.height,\n }\n : undefined\n }\n />\n {navGroups.map((group, index) => (\n <NavGroupView\n key={group.label ?? index}\n group={group}\n pathname={pathname}\n collapsed={collapsed}\n canSupport={canSupport}\n choices={choices}\n onToggle={setGroupOpen}\n badges={badges}\n />\n ))}\n </nav>\n\n <SidebarFooter\n collapsed={collapsed}\n showSettings={Boolean(settings)}\n settingsActive={settings ? isActive(settings, pathname) : false}\n onSearch={onSearch}\n />\n </aside>\n );\n}\n"],"mappings":";AAqDM,cAEA,YAFA;AAjDN,SAAS,gBAAgB;AACzB,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AACzB,OAAO,YAAY;AAGnB,MAAM,YAAY;AAEX,SAAS,QAAQ;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAUG;AACD,QAAM,QAAQ,cAAc;AAC5B,QAAM,WAAW,OACd,QAAQ,CAAC,UAAU,MAAM,KAAK,EAC9B,KAAK,CAAC,SAAS,KAAK,SAAS,SAAS;AACzC,QAAM,YAAY,OACf,IAAI,CAAC,WAAW;AAAA,IACf,GAAG;AAAA,IACH,OAAO,MAAM,MAAM,OAAO,CAAC,SAAS,KAAK,SAAS,SAAS;AAAA,EAC7D,EAAE,EACD,OAAO,CAAC,UAAU,MAAM,MAAM,MAAM;AACvC,QAAM,cACJ,UAAU;AAAA,IAAK,CAAC,UACd,MAAM,MAAM,KAAK,CAAC,SAAS,SAAS,MAAM,QAAQ,CAAC;AAAA,EACrD,GAAG,SAAS;AACd,QAAM,EAAE,SAAS,aAAa,IAAI,cAAc,UAAU,WAAW;AAErE,SACE,qBAAC,WAAM,WAAW,OAAO,SAAS,kBAAgB,WAChD;AAAA,wBAAC,YAAS,OAAc,MAAY,WAAsB;AAAA,IAE1D;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,OAAO;AAAA,QAClB,cAAW;AAAA,QACX,eAAe,MAAM;AAAA,QACrB,gBAAgB,MAAM;AAAA,QACtB,SAAS,MAAM;AAAA,QAEf;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,eAAW;AAAA,cACX,WAAW,OAAO;AAAA,cAClB,gBAAc,QAAQ,MAAM,IAAI;AAAA,cAChC,OACE,MAAM,OACF;AAAA,gBACE,WAAW,cAAc,MAAM,KAAK,GAAG;AAAA,gBACvC,QAAQ,MAAM,KAAK;AAAA,cACrB,IACA;AAAA;AAAA,UAER;AAAA,UACC,UAAU,IAAI,CAAC,OAAO,UACrB;AAAA,YAAC;AAAA;AAAA,cAEC;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,UAAU;AAAA,cACV;AAAA;AAAA,YAPK,MAAM,SAAS;AAAA,UAQtB,CACD;AAAA;AAAA;AAAA,IACH;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,cAAc,QAAQ,QAAQ;AAAA,QAC9B,gBAAgB,WAAW,SAAS,UAAU,QAAQ,IAAI;AAAA,QAC1D;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/admin/_shell/sidebar.tsx"],"sourcesContent":["'use client';\n\nimport type { ComponentType } from 'react';\nimport type { NavGroup } from './nav-config';\nimport { isActive } from './nav-filter';\nimport { NavGroupView } from './nav-group';\nimport { useOpenGroups } from './use-open-groups';\nimport { SidebarFooter, type FooterAction } from './sidebar-footer';\nimport { useFluidHover } from './use-fluid-hover';\nimport { UserMenu } from './user-menu';\nimport styles from './sidebar.module.css';\n\n/** Settings lives in the pinned foot, beside the theme switch. */\nconst FOOT_HREF = '/admin/settings';\n\nexport function Sidebar({\n groups,\n pathname,\n canSupport,\n collapsed,\n email,\n role,\n onSearch,\n badges,\n footerActions,\n}: {\n groups: NavGroup[];\n pathname: string;\n canSupport: boolean;\n collapsed: boolean;\n email: string;\n role: string;\n onSearch: () => void;\n /** A host's own count per item, by href. */\n badges?: Record<string, ComponentType>;\n /** Icons a host adds to the foot, beside the theme switch. */\n footerActions?: FooterAction[];\n}) {\n const hover = useFluidHover();\n const settings = groups\n .flatMap((group) => group.items)\n .find((item) => item.href === FOOT_HREF);\n const navGroups = groups\n .map((group) => ({\n ...group,\n items: group.items.filter((item) => item.href !== FOOT_HREF),\n }))\n .filter((group) => group.items.length);\n const activeGroup =\n navGroups.find((group) =>\n group.items.some((item) => isActive(item, pathname)),\n )?.label ?? null;\n const { choices, setGroupOpen } = useOpenGroups(pathname, activeGroup);\n\n return (\n <aside className={styles.sidebar} data-collapsed={collapsed}>\n <UserMenu email={email} role={role} collapsed={collapsed} />\n\n <nav\n className={styles.nav}\n aria-label=\"Admin\"\n onPointerMove={hover.onPointerMove}\n onPointerLeave={hover.onPointerLeave}\n onClick={hover.onClick}\n >\n <span\n aria-hidden\n className={styles.glide}\n data-visible={Boolean(hover.rect)}\n style={\n hover.rect\n ? {\n transform: `translateY(${hover.rect.top}px)`,\n height: hover.rect.height,\n }\n : undefined\n }\n />\n {navGroups.map((group, index) => (\n <NavGroupView\n key={group.label ?? index}\n group={group}\n pathname={pathname}\n collapsed={collapsed}\n canSupport={canSupport}\n choices={choices}\n onToggle={setGroupOpen}\n badges={badges}\n />\n ))}\n </nav>\n\n <SidebarFooter\n collapsed={collapsed}\n showSettings={Boolean(settings)}\n settingsActive={settings ? isActive(settings, pathname) : false}\n actions={footerActions}\n pathname={pathname}\n onSearch={onSearch}\n />\n </aside>\n );\n}\n"],"mappings":";AAwDM,cAEA,YAFA;AApDN,SAAS,gBAAgB;AACzB,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,SAAS,qBAAwC;AACjD,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AACzB,OAAO,YAAY;AAGnB,MAAM,YAAY;AAEX,SAAS,QAAQ;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAYG;AACD,QAAM,QAAQ,cAAc;AAC5B,QAAM,WAAW,OACd,QAAQ,CAAC,UAAU,MAAM,KAAK,EAC9B,KAAK,CAAC,SAAS,KAAK,SAAS,SAAS;AACzC,QAAM,YAAY,OACf,IAAI,CAAC,WAAW;AAAA,IACf,GAAG;AAAA,IACH,OAAO,MAAM,MAAM,OAAO,CAAC,SAAS,KAAK,SAAS,SAAS;AAAA,EAC7D,EAAE,EACD,OAAO,CAAC,UAAU,MAAM,MAAM,MAAM;AACvC,QAAM,cACJ,UAAU;AAAA,IAAK,CAAC,UACd,MAAM,MAAM,KAAK,CAAC,SAAS,SAAS,MAAM,QAAQ,CAAC;AAAA,EACrD,GAAG,SAAS;AACd,QAAM,EAAE,SAAS,aAAa,IAAI,cAAc,UAAU,WAAW;AAErE,SACE,qBAAC,WAAM,WAAW,OAAO,SAAS,kBAAgB,WAChD;AAAA,wBAAC,YAAS,OAAc,MAAY,WAAsB;AAAA,IAE1D;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,OAAO;AAAA,QAClB,cAAW;AAAA,QACX,eAAe,MAAM;AAAA,QACrB,gBAAgB,MAAM;AAAA,QACtB,SAAS,MAAM;AAAA,QAEf;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,eAAW;AAAA,cACX,WAAW,OAAO;AAAA,cAClB,gBAAc,QAAQ,MAAM,IAAI;AAAA,cAChC,OACE,MAAM,OACF;AAAA,gBACE,WAAW,cAAc,MAAM,KAAK,GAAG;AAAA,gBACvC,QAAQ,MAAM,KAAK;AAAA,cACrB,IACA;AAAA;AAAA,UAER;AAAA,UACC,UAAU,IAAI,CAAC,OAAO,UACrB;AAAA,YAAC;AAAA;AAAA,cAEC;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,UAAU;AAAA,cACV;AAAA;AAAA,YAPK,MAAM,SAAS;AAAA,UAQtB,CACD;AAAA;AAAA;AAAA,IACH;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,cAAc,QAAQ,QAAQ;AAAA,QAC9B,gBAAgB,WAAW,SAAS,UAAU,QAAQ,IAAI;AAAA,QAC1D,SAAS;AAAA,QACT;AAAA,QACA;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;","names":[]}
@@ -33,7 +33,8 @@ function AdminLayout({
33
33
  modules = NO_MODULES,
34
34
  additions = NO_ADDITIONS,
35
35
  brand,
36
- badges
36
+ badges,
37
+ footerActions
37
38
  }) {
38
39
  const pathname = usePathname();
39
40
  const router = useRouter();
@@ -89,6 +90,9 @@ function AdminLayout({
89
90
  collapsed: prefs.rail,
90
91
  email: session.email ?? "",
91
92
  role: session.role,
93
+ footerActions: footerActions?.filter(
94
+ (action) => !action.superadmin || session.role === "superadmin"
95
+ ),
92
96
  onSearch: prefs.openPalette,
93
97
  badges
94
98
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/admin/layout.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, type ComponentType } from 'react';\nimport { MotionConfig } from 'motion/react';\nimport { usePathname, useRouter } from 'next/navigation';\nimport { useAdminSession } from './hooks';\nimport { InboxAlerts } from './_inbox/nav-badge';\nimport { CommandPalette } from './_shell/command-palette';\nimport { PRODUCT_FEEDBACK_NAV, type NavAddition } from './_shell/nav-config';\nimport { canAccess, visibleGroups } from './_shell/nav-filter';\nimport { moduleOn, type AdminModules } from './_shell/nav-modules';\nimport { AdminModulesProvider } from './_shell/modules-context';\nimport { SeamToggle } from './_shell/seam-toggle';\nimport { SectionTabs } from './_shell/section-tabs';\nimport { Sidebar } from './_shell/sidebar';\nimport { Topbar } from './_shell/topbar';\nimport { AdminBrandProvider, type AdminBrand } from './_shell/admin-brand';\nimport { useShellPrefs } from './_shell/use-shell-prefs';\nimport { ShellSkeleton } from './_shell/shell-skeleton';\nimport { useAdminQueryDefaults } from './_shell/use-admin-query-defaults';\nimport { PageTransition } from './_fx';\nimport { LiveAnnouncer, useApplyPreferences, useStartPage } from './_settings';\nimport styles from './_shell/frame.module.css';\nimport './_ui/admin.css';\nimport './_ui/motion.css';\nimport './_ui/preferences.css';\nimport './_ui/tint.css';\n\nexport type { AdminModule, AdminModules } from './_shell/nav-modules';\nexport type { NavAddition, NavItem } from './_shell/nav-config';\nexport type { AdminBrand } from './_shell/admin-brand';\n\nconst AUTH_ROUTES = ['/admin/login', '/admin/change-password'];\n\nconst NO_MODULES: AdminModules = {};\nconst NO_ADDITIONS: NavAddition[] = [];\n\n/**\n * The Box admin shell. A host turns on the Box modules its engine serves\n * (`modules`), adds its own pages into the menu's groups (`additions`) and\n * shows its own logo and mark (`brand`). A module that is off is not listed anywhere.\n * `badges` puts a host's own count beside a menu item: a component per item href that renders one\n * `span`, shown in the same slot as the Support count.\n */\nexport default function AdminLayout({\n children,\n modules = NO_MODULES,\n additions = NO_ADDITIONS,\n brand,\n badges,\n}: {\n children: React.ReactNode;\n modules?: AdminModules;\n additions?: NavAddition[];\n brand?: AdminBrand;\n badges?: Record<string, ComponentType>;\n}) {\n const pathname = usePathname();\n const router = useRouter();\n const isAuthRoute = AUTH_ROUTES.includes(pathname);\n const { data: session, isLoading, isError } = useAdminSession(!isAuthRoute);\n const prefs = useShellPrefs();\n const { shellProps, reducedMotion } = useApplyPreferences();\n const ready = !isAuthRoute && !!session && !session.mustChangePassword;\n const allowed = useCallback(\n (href: string) =>\n !!session &&\n visibleGroups(session, modules, additions).some((g) =>\n g.items.some((item) => item.href === href),\n ),\n [session, modules, additions],\n );\n\n useAdminQueryDefaults();\n useStartPage(pathname, ready, allowed);\n\n useEffect(() => {\n if (isAuthRoute || isLoading) return;\n\n if (isError) {\n // Back to this page after signing in.\n const back = encodeURIComponent(pathname + window.location.search);\n router.replace(`/admin/login?redirect=${back}`);\n } else if (session?.mustChangePassword) {\n router.replace('/admin/change-password');\n }\n }, [isAuthRoute, isLoading, isError, session, router]);\n\n if (isAuthRoute) {\n return <AdminBrandProvider value={brand}>{children}</AdminBrandProvider>;\n }\n\n if (isLoading) return <ShellSkeleton />;\n\n if (isError || !session || session.mustChangePassword) return null;\n\n const groups = visibleGroups(session, modules, additions);\n const canSupport = groups.some((g) =>\n g.items.some(({ href }) => href === '/admin/support'),\n );\n // The bell and the inbox counts read Product feedback (and Support when\n // this admin has it), so they run only where feedback is served.\n const showInbox = moduleOn(modules, 'feedback');\n const feedbackTabs = PRODUCT_FEEDBACK_NAV.filter(canAccess(session)).filter(\n (tab) => moduleOn(modules, tab.module),\n );\n // One tab left is no choice, so the strip only shows with two or more.\n const showFeedbackTabs =\n showInbox &&\n feedbackTabs.length > 1 &&\n feedbackTabs.some(({ href }) => pathname.startsWith(href));\n\n return (\n <AdminBrandProvider value={brand}>\n <AdminModulesProvider value={modules}>\n <MotionConfig reducedMotion={reducedMotion}>\n <div\n className={`adm-shell ${styles.shell}`}\n data-collapsed={prefs.rail}\n {...shellProps}\n >\n <Sidebar\n groups={groups}\n pathname={pathname}\n canSupport={canSupport}\n collapsed={prefs.rail}\n email={session.email ?? ''}\n role={session.role}\n onSearch={prefs.openPalette}\n badges={badges}\n />\n {!prefs.narrow && (\n <SeamToggle\n collapsed={prefs.collapsed}\n onToggle={prefs.toggleCollapsed}\n />\n )}\n <div className={styles.column}>\n <Topbar\n groups={groups}\n pathname={pathname}\n canSupport={canSupport}\n showInbox={showInbox}\n />\n <main\n className={`adm-main ${styles.main}`}\n data-full={pathname.startsWith('/admin/support') || undefined}\n >\n {showFeedbackTabs && (\n <SectionTabs\n items={feedbackTabs}\n pathname={pathname}\n label=\"Product feedback\"\n />\n )}\n <PageTransition routeKey={pathname}>{children}</PageTransition>\n </main>\n </div>\n {showInbox && (\n <InboxAlerts canSupport={canSupport} pathname={pathname} />\n )}\n <CommandPalette\n groups={groups}\n open={prefs.paletteOpen}\n onClose={prefs.closePalette}\n />\n <LiveAnnouncer />\n </div>\n </MotionConfig>\n </AdminModulesProvider>\n </AdminBrandProvider>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/admin/layout.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, type ComponentType } from 'react';\nimport { MotionConfig } from 'motion/react';\nimport { usePathname, useRouter } from 'next/navigation';\nimport { useAdminSession } from './hooks';\nimport { InboxAlerts } from './_inbox/nav-badge';\nimport { CommandPalette } from './_shell/command-palette';\nimport { PRODUCT_FEEDBACK_NAV, type NavAddition } from './_shell/nav-config';\nimport { canAccess, visibleGroups } from './_shell/nav-filter';\nimport { moduleOn, type AdminModules } from './_shell/nav-modules';\nimport { AdminModulesProvider } from './_shell/modules-context';\nimport { SeamToggle } from './_shell/seam-toggle';\nimport { SectionTabs } from './_shell/section-tabs';\nimport { Sidebar } from './_shell/sidebar';\nimport type { FooterAction } from './_shell/sidebar-footer';\nimport { Topbar } from './_shell/topbar';\nimport { AdminBrandProvider, type AdminBrand } from './_shell/admin-brand';\nimport { useShellPrefs } from './_shell/use-shell-prefs';\nimport { ShellSkeleton } from './_shell/shell-skeleton';\nimport { useAdminQueryDefaults } from './_shell/use-admin-query-defaults';\nimport { PageTransition } from './_fx';\nimport { LiveAnnouncer, useApplyPreferences, useStartPage } from './_settings';\nimport styles from './_shell/frame.module.css';\nimport './_ui/admin.css';\nimport './_ui/motion.css';\nimport './_ui/preferences.css';\nimport './_ui/tint.css';\n\nexport type { AdminModule, AdminModules } from './_shell/nav-modules';\nexport type { NavAddition, NavItem } from './_shell/nav-config';\nexport type { AdminBrand } from './_shell/admin-brand';\nexport type { FooterAction } from './_shell/sidebar-footer';\n\nconst AUTH_ROUTES = ['/admin/login', '/admin/change-password'];\n\nconst NO_MODULES: AdminModules = {};\nconst NO_ADDITIONS: NavAddition[] = [];\n\n/**\n * The Box admin shell. A host turns on the Box modules its engine serves\n * (`modules`), adds its own pages into the menu's groups (`additions`) and\n * shows its own logo and mark (`brand`). A module that is off is not listed anywhere.\n * `badges` puts a host's own count beside a menu item: a component per item href that renders one\n * `span`, shown in the same slot as the Support count.\n */\nexport default function AdminLayout({\n children,\n modules = NO_MODULES,\n additions = NO_ADDITIONS,\n brand,\n badges,\n footerActions,\n}: {\n children: React.ReactNode;\n modules?: AdminModules;\n additions?: NavAddition[];\n brand?: AdminBrand;\n badges?: Record<string, ComponentType>;\n /** Icons a host adds to the sidebar's foot, beside the theme switch. */\n footerActions?: FooterAction[];\n}) {\n const pathname = usePathname();\n const router = useRouter();\n const isAuthRoute = AUTH_ROUTES.includes(pathname);\n const { data: session, isLoading, isError } = useAdminSession(!isAuthRoute);\n const prefs = useShellPrefs();\n const { shellProps, reducedMotion } = useApplyPreferences();\n const ready = !isAuthRoute && !!session && !session.mustChangePassword;\n const allowed = useCallback(\n (href: string) =>\n !!session &&\n visibleGroups(session, modules, additions).some((g) =>\n g.items.some((item) => item.href === href),\n ),\n [session, modules, additions],\n );\n\n useAdminQueryDefaults();\n useStartPage(pathname, ready, allowed);\n\n useEffect(() => {\n if (isAuthRoute || isLoading) return;\n\n if (isError) {\n // Back to this page after signing in.\n const back = encodeURIComponent(pathname + window.location.search);\n router.replace(`/admin/login?redirect=${back}`);\n } else if (session?.mustChangePassword) {\n router.replace('/admin/change-password');\n }\n }, [isAuthRoute, isLoading, isError, session, router]);\n\n if (isAuthRoute) {\n return <AdminBrandProvider value={brand}>{children}</AdminBrandProvider>;\n }\n\n if (isLoading) return <ShellSkeleton />;\n\n if (isError || !session || session.mustChangePassword) return null;\n\n const groups = visibleGroups(session, modules, additions);\n const canSupport = groups.some((g) =>\n g.items.some(({ href }) => href === '/admin/support'),\n );\n // The bell and the inbox counts read Product feedback (and Support when\n // this admin has it), so they run only where feedback is served.\n const showInbox = moduleOn(modules, 'feedback');\n const feedbackTabs = PRODUCT_FEEDBACK_NAV.filter(canAccess(session)).filter(\n (tab) => moduleOn(modules, tab.module),\n );\n // One tab left is no choice, so the strip only shows with two or more.\n const showFeedbackTabs =\n showInbox &&\n feedbackTabs.length > 1 &&\n feedbackTabs.some(({ href }) => pathname.startsWith(href));\n\n return (\n <AdminBrandProvider value={brand}>\n <AdminModulesProvider value={modules}>\n <MotionConfig reducedMotion={reducedMotion}>\n <div\n className={`adm-shell ${styles.shell}`}\n data-collapsed={prefs.rail}\n {...shellProps}\n >\n <Sidebar\n groups={groups}\n pathname={pathname}\n canSupport={canSupport}\n collapsed={prefs.rail}\n email={session.email ?? ''}\n role={session.role}\n footerActions={footerActions?.filter(\n (action) => !action.superadmin || session.role === 'superadmin',\n )}\n onSearch={prefs.openPalette}\n badges={badges}\n />\n {!prefs.narrow && (\n <SeamToggle\n collapsed={prefs.collapsed}\n onToggle={prefs.toggleCollapsed}\n />\n )}\n <div className={styles.column}>\n <Topbar\n groups={groups}\n pathname={pathname}\n canSupport={canSupport}\n showInbox={showInbox}\n />\n <main\n className={`adm-main ${styles.main}`}\n data-full={pathname.startsWith('/admin/support') || undefined}\n >\n {showFeedbackTabs && (\n <SectionTabs\n items={feedbackTabs}\n pathname={pathname}\n label=\"Product feedback\"\n />\n )}\n <PageTransition routeKey={pathname}>{children}</PageTransition>\n </main>\n </div>\n {showInbox && (\n <InboxAlerts canSupport={canSupport} pathname={pathname} />\n )}\n <CommandPalette\n groups={groups}\n open={prefs.paletteOpen}\n onClose={prefs.closePalette}\n />\n <LiveAnnouncer />\n </div>\n </MotionConfig>\n </AdminModulesProvider>\n </AdminBrandProvider>\n );\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@withpotter/pages-admin",
3
- "version": "0.13.0-next.79",
3
+ "version": "0.13.0-next.81",
4
4
  "description": "Box console platform-admin routes: overview, revenue, accounts, tenants, admins, roles, audit.",
5
5
  "license": "UNLICENSED",
6
6
  "sideEffects": false,
@@ -31,9 +31,9 @@
31
31
  "dependencies": {
32
32
  "@radix-ui/react-popover": "^1.1.23",
33
33
  "@tanstack/react-query": "^5.90.20",
34
- "@withpotter/lib": "^0.13.0-next.79",
35
- "@withpotter/platform-admin": "^0.13.0-next.79",
36
- "@withpotter/ui-kit": "^0.13.0-next.79",
34
+ "@withpotter/lib": "^0.13.0-next.81",
35
+ "@withpotter/platform-admin": "^0.13.0-next.81",
36
+ "@withpotter/ui-kit": "^0.13.0-next.81",
37
37
  "lucide-react": "^0.562.0",
38
38
  "motion": "^12.42.2"
39
39
  },