@techzyapp/ui-library 1.0.12 → 1.0.14

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 (65) hide show
  1. package/dist/AdminRoot-DBKF9d3i.cjs +2 -0
  2. package/dist/AdminRoot-DBKF9d3i.cjs.map +1 -0
  3. package/dist/AdminRoot-DlP5Yq4L.js +50 -0
  4. package/dist/AdminRoot-DlP5Yq4L.js.map +1 -0
  5. package/dist/AuthGuard-CVklwDbj.js +7 -0
  6. package/dist/AuthGuard-CVklwDbj.js.map +1 -0
  7. package/dist/AuthGuard-kfOZviar.cjs +2 -0
  8. package/dist/AuthGuard-kfOZviar.cjs.map +1 -0
  9. package/dist/{Breadcrumbs-DvgctFLS.js → Breadcrumbs-6S4gCiJI.js} +2 -2
  10. package/dist/{Breadcrumbs-DvgctFLS.js.map → Breadcrumbs-6S4gCiJI.js.map} +1 -1
  11. package/dist/{Breadcrumbs-BnxhmyK5.cjs → Breadcrumbs-DMg5ER2H.cjs} +2 -2
  12. package/dist/{Breadcrumbs-BnxhmyK5.cjs.map → Breadcrumbs-DMg5ER2H.cjs.map} +1 -1
  13. package/dist/{PageNotFound-CmT-Wr9m.js → PageNotFound-HcL5rrHL.js} +2 -2
  14. package/dist/{PageNotFound-CmT-Wr9m.js.map → PageNotFound-HcL5rrHL.js.map} +1 -1
  15. package/dist/{PageNotFound-CxLUFoJa.cjs → PageNotFound-Lpw0M3TR.cjs} +2 -2
  16. package/dist/{PageNotFound-CxLUFoJa.cjs.map → PageNotFound-Lpw0M3TR.cjs.map} +1 -1
  17. package/dist/{RootLayout-CxMadTU1.cjs → RootLayout-1zRZNGGP.cjs} +2 -2
  18. package/dist/{RootLayout-CxMadTU1.cjs.map → RootLayout-1zRZNGGP.cjs.map} +1 -1
  19. package/dist/{RootLayout-CqQZ6h5c.js → RootLayout-CRZEk1E_.js} +3 -3
  20. package/dist/{RootLayout-CqQZ6h5c.js.map → RootLayout-CRZEk1E_.js.map} +1 -1
  21. package/dist/Sidebar-Bhx7mWAj.cjs +2 -0
  22. package/dist/Sidebar-Bhx7mWAj.cjs.map +1 -0
  23. package/dist/Sidebar-DPJIyW3Z.js +429 -0
  24. package/dist/Sidebar-DPJIyW3Z.js.map +1 -0
  25. package/dist/app/AdminRoot.d.cts +41 -0
  26. package/dist/app/AdminRoot.d.ts +41 -0
  27. package/dist/authLayoutRoute-B10sXioW.js +11 -0
  28. package/dist/authLayoutRoute-B10sXioW.js.map +1 -0
  29. package/dist/authLayoutRoute-BVQ4LhuU.cjs +2 -0
  30. package/dist/authLayoutRoute-BVQ4LhuU.cjs.map +1 -0
  31. package/dist/components/Breadcrumbs/index.cjs +1 -1
  32. package/dist/components/Breadcrumbs/index.js +1 -1
  33. package/dist/components/PageNotFound/index.cjs +1 -1
  34. package/dist/components/PageNotFound/index.js +1 -1
  35. package/dist/components/RootLayout/index.cjs +1 -1
  36. package/dist/components/RootLayout/index.js +1 -1
  37. package/dist/components/Sidebar/Sidebar.d.cts +7 -0
  38. package/dist/components/Sidebar/Sidebar.d.ts +7 -0
  39. package/dist/components/Sidebar/index.cjs +1 -1
  40. package/dist/components/Sidebar/index.js +1 -1
  41. package/dist/entries/app.cjs +2 -0
  42. package/dist/entries/app.cjs.map +1 -0
  43. package/dist/entries/app.d.cts +2 -0
  44. package/dist/entries/app.d.ts +2 -0
  45. package/dist/entries/app.js +5 -0
  46. package/dist/entries/app.js.map +1 -0
  47. package/dist/entries/auth.cjs +1 -1
  48. package/dist/entries/auth.js +4 -3
  49. package/dist/entries/auth.js.map +1 -1
  50. package/dist/entries/components.cjs +1 -1
  51. package/dist/entries/components.js +4 -4
  52. package/dist/index.cjs +1 -1
  53. package/dist/index.d.cts +1 -0
  54. package/dist/index.d.ts +1 -0
  55. package/dist/index.js +165 -162
  56. package/dist/index.js.map +1 -1
  57. package/package.json +11 -1
  58. package/dist/Sidebar-CT_NUo_7.cjs +0 -2
  59. package/dist/Sidebar-CT_NUo_7.cjs.map +0 -1
  60. package/dist/Sidebar-Csd3iKbS.js +0 -424
  61. package/dist/Sidebar-Csd3iKbS.js.map +0 -1
  62. package/dist/authLayoutRoute-CkR9IANN.cjs +0 -2
  63. package/dist/authLayoutRoute-CkR9IANN.cjs.map +0 -1
  64. package/dist/authLayoutRoute-DEYvuYxM.js +0 -13
  65. package/dist/authLayoutRoute-DEYvuYxM.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@techzyapp/ui-library",
3
- "version": "1.0.12",
3
+ "version": "1.0.14",
4
4
  "description": "Techzy UI — reusable React component library for admin panels.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -107,6 +107,16 @@
107
107
  "default": "./dist/entries/auth.cjs"
108
108
  }
109
109
  },
110
+ "./app": {
111
+ "import": {
112
+ "types": "./dist/entries/app.d.ts",
113
+ "default": "./dist/entries/app.js"
114
+ },
115
+ "require": {
116
+ "types": "./dist/entries/app.d.cts",
117
+ "default": "./dist/entries/app.cjs"
118
+ }
119
+ },
110
120
  "./css/reset.css": "./dist/reset.css",
111
121
  "./css/styles.css": "./dist/index.css",
112
122
  "./package.json": "./package.json"
@@ -1,2 +0,0 @@
1
- "use strict";const i=require("react/jsx-runtime"),v=require("react"),g=require("@tanstack/react-router"),R=require("clsx"),S=require("./Icon-CXTl_QAP.cjs"),D=require("./List-ChXO0Hz-.cjs"),k=require("./ListItem-DWQorRxG.cjs"),E=require("./TextField-fmt7aacg.cjs"),T=require("./access-DPUHbE-S.cjs"),$=require("./ConfigProvider-BHNx-NHV.cjs"),B="_nav_a1zzi_4",F="_module_a1zzi_17",q="_search_a1zzi_25",M="_searchPanel_a1zzi_31",A="_moduleLabel_a1zzi_46",O="_leaves_a1zzi_61",K="_navBadge_a1zzi_66",V="_navDot_a1zzi_78",Y="_leafDot_a1zzi_86",U="_collapsible_a1zzi_95",H="_collapsibleClosed_a1zzi_100",G="_collapsibleInner_a1zzi_103",Q="_chevron_a1zzi_109",W="_chevronButton_a1zzi_119",m={nav:B,module:F,search:q,searchPanel:M,moduleLabel:A,leaves:O,navBadge:K,navDot:V,leafDot:Y,collapsible:U,collapsibleClosed:H,collapsibleInner:G,chevron:Q,chevronButton:W},L=k.ListItem,X=e=>e.split("-").map(s=>s.charAt(0).toUpperCase()+s.slice(1)).join(" "),w=e=>e.replace(/^\/+|\/+$/g,""),z=(e,s)=>e.order-s.order||e.label.localeCompare(s.label);function y(e){const s=[];for(const o of e){const c=o.staticData,n=w(o.fullPath);!(c!=null&&c.name)||!n||s.push({path:n,name:c.name,sd:c})}const a=new Map(s.map(o=>[o.path,o])),t=s.map(o=>o.path),l=o=>t.some(c=>c!==o&&c.startsWith(`${o}/`)),f=new Set(e.map(o=>o.fullPath)),h=o=>f.has(`/${o}/`),b=(o,c)=>{const n=a.get(o);return{label:(n==null?void 0:n.name)??X(c),icon:n==null?void 0:n.sd.icon,badge:n==null?void 0:n.sd.badge,dot:n==null?void 0:n.sd.dot,order:(n==null?void 0:n.sd.order)??Number.POSITIVE_INFINITY}},p=new Map,d=o=>{let c=p.get(o);if(!c){const n=b(o,o);c={label:n.label,icon:n.icon,order:n.order,groups:new Map},p.set(o,c)}return c},x=[];for(const{path:o,name:c,sd:n}of s){const N=o.split("/");if(N.length<=2&&l(o)||n.hidden)continue;if(N.length===1){x.push({label:c,to:`/${o}`,icon:n.icon,badge:n.badge,dot:n.dot,order:n.order??Number.POSITIVE_INFINITY});continue}const r=d(N[0]);if(N.length===2)r.groups.set(o,{label:c,icon:n.icon,to:`/${o}`,badge:n.badge,dot:n.dot,order:n.order??Number.POSITIVE_INFINITY,leaves:[],isContainer:!1});else{const u=N.slice(0,2).join("/");let _=r.groups.get(u);if(!_){const I=b(u,N[1]);_={label:I.label,icon:I.icon,badge:I.badge,dot:I.dot,order:I.order,to:h(u)?`/${u}`:void 0,leaves:[],isContainer:!0},r.groups.set(u,_)}_.leaves.push({label:c,to:`/${o}`,icon:n.icon,badge:n.badge,dot:n.dot,order:n.order??Number.POSITIVE_INFINITY})}}return{links:x.sort(z).map(o=>({label:o.label,to:o.to,icon:o.icon,badge:o.badge,dot:o.dot})),modules:[...p.values()].sort(z).map(o=>({module:o.label,icon:o.icon,groups:[...o.groups.values()].sort(z).map(c=>({label:c.label,icon:c.icon,to:c.to,badge:c.badge,dot:c.dot,children:c.isContainer?c.leaves.sort(z).map(n=>({label:n.label,to:n.to,icon:n.icon,badge:n.badge,dot:n.dot})):void 0}))}))}}function C(){const e=g.useRouter(),s=T.useAccessKeys();return v.useMemo(()=>y(Object.values(e.looseRoutesById).map(a=>{var t;return{fullPath:a.fullPath,staticData:(t=a.options)==null?void 0:t.staticData}}).filter(a=>{var t;return T.hasAccess((t=a.staticData)==null?void 0:t.roles)})),[e,s])}function P(e){var s;if(e.links[0])return e.links[0].to;for(const a of e.modules)for(const t of a.groups){if(t.to)return t.to;const l=(s=t.children)==null?void 0:s[0];if(l)return l.to}}function J(){return P(C())}function Z(){var a,t;const e=g.useRouter(),s=g.useRouterState({select:l=>l.matches});for(let l=s.length-1;l>=0;l--){const f=e.looseRoutesById[s[l].routeId],h=(t=(a=f==null?void 0:f.options)==null?void 0:a.staticData)==null?void 0:t.name;if(h)return h}}function ee(e){const s=new Set;for(const a of e.links)s.add(a.to);for(const a of e.modules)for(const t of a.groups){t.to&&s.add(t.to);for(const l of t.children??[])s.add(l.to)}return s}function te(){var f;const e=C(),s=g.useRouterState({select:h=>h.matches}),a=P(e),t=ee(e),l=[];for(const h of s){const b=(f=h.staticData)==null?void 0:f.name;if(!b)continue;const p=`/${w(h.pathname)}`;l.push({label:b,to:t.has(p)?p:void 0})}return l.length>0&&(l[l.length-1]={label:l[l.length-1].label}),{homeTo:a,items:l}}function oe(){const e=J();return e?i.jsx(g.Navigate,{to:e}):null}function ne(){const{links:e,modules:s}=C(),a=g.useRouterState({select:t=>t.location.pathname});return i.jsxs("nav",{className:m.nav,children:[e.length>0?i.jsx(D.List,{children:e.map(t=>i.jsx(L,{as:g.Link,to:t.to,icon:t.icon,selected:a===t.to,clickable:!0,trailing:j(t.badge,t.dot),children:t.label},t.to))}):null,s.map(t=>i.jsxs("div",{className:m.module,children:[i.jsx("div",{className:m.moduleLabel,children:t.module}),i.jsx(D.List,{children:t.groups.map(l=>i.jsx(ue,{group:l,pathname:a},l.label))})]},t.module))]})}function se(e){const s=[];for(const a of e.links)s.push({label:a.label,to:a.to});for(const a of e.modules)for(const t of a.groups){t.to&&s.push({label:t.label,to:t.to,context:a.module});for(const l of t.children??[])s.push({label:l.label,to:l.to,context:`${a.module} · ${t.label}`})}return s}const ae=8;function le(){const e=$.useT(),s=C(),a=g.useNavigate(),t=v.useMemo(()=>se(s),[s]),[l,f]=v.useState(""),[h,b]=v.useState(!1),[p,d]=v.useState(0),x=v.useRef(null),o=v.useMemo(()=>{const r=l.trim().toLowerCase();return r?t.filter(u=>{var _;return u.label.toLowerCase().includes(r)||(((_=u.context)==null?void 0:_.toLowerCase().includes(r))??!1)}).slice(0,ae):[]},[t,l]),c=h&&o.length>0;v.useEffect(()=>d(0),[l]),v.useEffect(()=>{d(r=>r>o.length-1?Math.max(0,o.length-1):r)},[o.length]),v.useEffect(()=>{if(!h)return;const r=u=>{x.current&&!x.current.contains(u.target)&&b(!1)};return document.addEventListener("pointerdown",r),()=>document.removeEventListener("pointerdown",r)},[h]);const n=r=>{a({to:r}),f(""),b(!1)},N=r=>{if(c)if(r.key==="ArrowDown")r.preventDefault(),d(u=>(u+1)%o.length);else if(r.key==="ArrowUp")r.preventDefault(),d(u=>(u-1+o.length)%o.length);else if(r.key==="Enter"){r.preventDefault();const u=o[p];u&&n(u.to)}else r.key==="Escape"&&b(!1)};return i.jsxs("div",{ref:x,className:m.search,role:"combobox","aria-expanded":c,"aria-haspopup":"listbox",children:[i.jsx(E.TextField,{value:l,onChange:r=>{f(r.target.value),b(!0)},onFocus:()=>b(!0),onKeyDown:N,adornment:i.jsx(S.Icon,{name:"SearchNormal"}),placeholder:e("sidebar.searchPages"),"aria-label":e("sidebar.searchPages"),autoComplete:"off"}),c?i.jsx("div",{className:m.searchPanel,children:i.jsx(D.List,{role:"listbox",children:o.map((r,u)=>i.jsx(k.ListItem,{description:r.context,clickable:!0,selected:u===p,onMouseDown:_=>_.preventDefault(),onMouseEnter:()=>d(u),onClick:()=>n(r.to),children:r.label},r.to))})}):null]})}function ce(e,s){var a;return e.to&&s===e.to?!0:((a=e.children)==null?void 0:a.some(t=>t.to===s))??!1}function re(e){return e?i.jsx("span",{className:m.navBadge,children:e}):null}function ie(e){return e?i.jsx("span",{className:m.navDot,style:{background:`var(--tz-color-${e})`}}):null}function j(e,s,a){if(!(e==null&&s==null&&a==null))return i.jsxs(i.Fragment,{children:[re(e),ie(s),a]})}function ue({group:e,pathname:s}){var b,p;const a=ce(e,s),t=!!((b=e.children)!=null&&b.length),[l,f]=v.useState(a);if(v.useEffect(()=>{a&&f(!0)},[a]),!t&&e.to)return i.jsx(L,{as:g.Link,to:e.to,icon:e.icon,selected:a,clickable:!0,trailing:j(e.badge,e.dot),children:e.label});const h=i.jsx(S.Icon,{name:"ArrowDown4",size:"sm",className:m.chevron,"data-open":l?"true":"false"});return i.jsxs(i.Fragment,{children:[t&&e.to?i.jsx(L,{as:g.Link,to:e.to,icon:e.icon,selected:a,clickable:!0,onClick:()=>f(!0),trailing:j(e.badge,e.dot,i.jsx("button",{type:"button",className:m.chevronButton,"aria-label":`${l?"Collapse":"Expand"} ${e.label}`,"aria-expanded":l,onClick:d=>{d.preventDefault(),d.stopPropagation(),f(x=>!x)},children:h})),children:e.label}):i.jsx(k.ListItem,{icon:e.icon,selected:a,clickable:!0,"aria-expanded":l,onClick:()=>f(d=>!d),trailing:j(e.badge,e.dot,h),children:e.label}),t?i.jsx("div",{className:R.clsx(m.collapsible,!l&&m.collapsibleClosed),children:i.jsx("div",{className:m.collapsibleInner,children:i.jsx(D.List,{className:m.leaves,children:(p=e.children)==null?void 0:p.map(d=>i.jsx(L,{as:g.Link,to:d.to,icon:i.jsx("span",{className:m.leafDot}),selected:s===d.to,size:"md",clickable:!0,trailing:j(d.badge,d.dot),children:d.label},d.to))})})}):null]})}exports.FirstRouteRedirect=oe;exports.NavSearch=le;exports.Sidebar=ne;exports.buildNavTree=y;exports.firstNavTo=P;exports.useBreadcrumbs=te;exports.usePageTitle=Z;
2
- //# sourceMappingURL=Sidebar-CT_NUo_7.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Sidebar-CT_NUo_7.cjs","sources":["../src/components/Sidebar/Sidebar.tsx"],"sourcesContent":["import {\n useEffect,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n} from 'react'\nimport {\n Link,\n Navigate,\n useNavigate,\n useRouter,\n useRouterState,\n type LinkProps,\n type StaticDataRouteOption,\n} from '@tanstack/react-router'\nimport { clsx } from 'clsx'\nimport { Icon } from '../Icon'\nimport { List, ListItem, type ListItemProps } from '../List'\nimport { TextField } from '../TextField'\nimport { useT, type ThemeColor } from '../../theme'\nimport type { IconName } from '../../icons/names'\nimport { hasAccess, useAccessKeys } from '../../helpers/access'\nimport styles from './Sidebar.module.css'\n\n// `ListItem` rendered as a TanStack `Link` — it forwards unrecognized props (like `to`) to the\n// element, so this typed alias lets us pass `to` while keeping `ListItem`'s look + behavior.\nconst NavLink = ListItem as unknown as (props: ListItemProps & { to: string }) => ReactNode\n\nexport type { IconName }\n\n// Typed `staticData` for consumers — every route describes its own menu entry.\ndeclare module '@tanstack/react-router' {\n interface StaticDataRouteOption {\n /** Menu label. A route with no `name` never appears in the menu. */\n name?: string\n /** Optional menu icon (the library's `IconName` union). */\n icon?: IconName\n /** Sort order within the parent (ascending); falls back to alphabetical. */\n order?: number\n /** Routed but hidden from the menu. */\n hidden?: boolean\n /** Allowed accessKeys (OR — user needs any one). Omitted/empty = public. */\n roles?: string[]\n /** Small text label (e.g. `\"New\"`) shown as a pill on the menu row. */\n badge?: string\n /** Theme color of a small dot indicator on the menu row (e.g. `\"error\"`). */\n dot?: ThemeColor\n }\n}\n\nexport interface NavLeaf {\n label: string\n to: string\n icon?: IconName\n badge?: string\n dot?: ThemeColor\n}\nexport interface NavGroup {\n label: string\n icon?: IconName\n to?: string\n badge?: string\n dot?: ThemeColor\n children?: NavLeaf[]\n}\nexport interface NavModule {\n module: string\n icon?: IconName\n groups: NavGroup[]\n}\n\nconst prettify = (seg: string) =>\n seg\n .split('-')\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(' ')\nconst trimSlashes = (p: string) => p.replace(/^\\/+|\\/+$/g, '')\nconst byOrderThenLabel = (\n a: { order: number; label: string },\n b: { order: number; label: string },\n) => a.order - b.order || a.label.localeCompare(b.label)\n\ninterface LeafAcc {\n label: string\n to: string\n icon?: IconName\n badge?: string\n dot?: ThemeColor\n order: number\n}\ninterface GroupAcc {\n label: string\n icon?: IconName\n to?: string\n badge?: string\n dot?: ThemeColor\n order: number\n leaves: LeafAcc[]\n isContainer: boolean\n}\ninterface ModuleAcc {\n label: string\n icon?: IconName\n order: number\n groups: Map<string, GroupAcc>\n}\n\n/** A single route, reduced to what the menu needs. */\nexport interface NavRoute {\n fullPath: string\n staticData?: StaticDataRouteOption\n}\n\n/**\n * Pure menu builder — derives the 3-level nav tree (module → group → page) from a flat route list.\n * Kept router-free so it's unit-testable; `useNavTree` feeds it the live routes.\n */\nexport function buildNavTree(routes: NavRoute[]): { links: NavLeaf[]; modules: NavModule[] } {\n const entries: Array<{ path: string; name: string; sd: StaticDataRouteOption }> = []\n for (const route of routes) {\n const sd = route.staticData\n const path = trimSlashes(route.fullPath)\n if (!sd?.name || !path) continue\n entries.push({ path, name: sd.name, sd })\n }\n\n const metaByPath = new Map(entries.map((e) => [e.path, e]))\n const paths = entries.map((e) => e.path)\n const isContainer = (p: string) => paths.some((o) => o !== p && o.startsWith(`${p}/`))\n const rawFullPaths = new Set(routes.map((r) => r.fullPath))\n const groupHasOwnPage = (groupKey: string) => rawFullPaths.has(`/${groupKey}/`)\n\n const chrome = (key: string, seg: string) => {\n const e = metaByPath.get(key)\n return {\n label: e?.name ?? prettify(seg),\n icon: e?.sd.icon,\n badge: e?.sd.badge,\n dot: e?.sd.dot,\n order: e?.sd.order ?? Number.POSITIVE_INFINITY,\n }\n }\n\n const modules = new Map<string, ModuleAcc>()\n const getModule = (seg: string) => {\n let mod = modules.get(seg)\n if (!mod) {\n const c = chrome(seg, seg)\n mod = { label: c.label, icon: c.icon, order: c.order, groups: new Map() }\n modules.set(seg, mod)\n }\n return mod\n }\n\n const topLinks: LeafAcc[] = []\n for (const { path, name, sd } of entries) {\n const segs = path.split('/')\n // The menu is 3 levels deep by design (module → group → page). A path only counts as a\n // \"container\" (holds children instead of being its own row) at the module/group levels; a\n // depth-3+ route is always a leaf, so a named page with even-deeper children isn't dropped.\n // Routes deeper than 3 segments still appear — flattened as leaves under their depth-2 group\n // (their `to` stays correct) — the nav just can't nest beyond level 3.\n if ((segs.length <= 2 && isContainer(path)) || sd.hidden) continue\n if (segs.length === 1) {\n topLinks.push({\n label: name,\n to: `/${path}`,\n icon: sd.icon,\n badge: sd.badge,\n dot: sd.dot,\n order: sd.order ?? Number.POSITIVE_INFINITY,\n })\n continue\n }\n const mod = getModule(segs[0])\n if (segs.length === 2) {\n mod.groups.set(path, {\n label: name,\n icon: sd.icon,\n to: `/${path}`,\n badge: sd.badge,\n dot: sd.dot,\n order: sd.order ?? Number.POSITIVE_INFINITY,\n leaves: [],\n isContainer: false,\n })\n } else {\n const groupKey = segs.slice(0, 2).join('/')\n let group = mod.groups.get(groupKey)\n if (!group) {\n const c = chrome(groupKey, segs[1])\n group = {\n label: c.label,\n icon: c.icon,\n badge: c.badge,\n dot: c.dot,\n order: c.order,\n to: groupHasOwnPage(groupKey) ? `/${groupKey}` : undefined,\n leaves: [],\n isContainer: true,\n }\n mod.groups.set(groupKey, group)\n }\n group.leaves.push({\n label: name,\n to: `/${path}`,\n icon: sd.icon,\n badge: sd.badge,\n dot: sd.dot,\n order: sd.order ?? Number.POSITIVE_INFINITY,\n })\n }\n }\n\n return {\n links: topLinks\n .sort(byOrderThenLabel)\n .map((l) => ({ label: l.label, to: l.to, icon: l.icon, badge: l.badge, dot: l.dot })),\n modules: [...modules.values()].sort(byOrderThenLabel).map(\n (mod): NavModule => ({\n module: mod.label,\n icon: mod.icon,\n groups: [...mod.groups.values()].sort(byOrderThenLabel).map(\n (g): NavGroup => ({\n label: g.label,\n icon: g.icon,\n to: g.to,\n badge: g.badge,\n dot: g.dot,\n children: g.isContainer\n ? g.leaves.sort(byOrderThenLabel).map((l) => ({\n label: l.label,\n to: l.to,\n icon: l.icon,\n badge: l.badge,\n dot: l.dot,\n }))\n : undefined,\n }),\n ),\n }),\n ),\n }\n}\n\nfunction useNavTree(): { links: NavLeaf[]; modules: NavModule[] } {\n const router = useRouter()\n const accessKeys = useAccessKeys() // re-render the menu when the user's roles change (login/logout)\n return useMemo(\n () =>\n buildNavTree(\n Object.values(router.looseRoutesById)\n .map((route) => ({\n fullPath: route.fullPath,\n staticData: route.options?.staticData,\n }))\n // Drop pages the current user can't access — empty groups/modules then vanish on their own.\n .filter((route) => hasAccess(route.staticData?.roles)),\n ),\n [router, accessKeys],\n )\n}\n\n/** The first menu destination (top link, else first group/leaf) — used by `FirstRouteRedirect`. */\nexport function firstNavTo(tree: { links: NavLeaf[]; modules: NavModule[] }): string | undefined {\n if (tree.links[0]) return tree.links[0].to\n for (const mod of tree.modules)\n for (const group of mod.groups) {\n if (group.to) return group.to\n const firstChild = group.children?.[0]\n if (firstChild) return firstChild.to\n }\n return undefined\n}\n\nfunction useFirstNavTo() {\n return firstNavTo(useNavTree())\n}\n\n/**\n * The current page's title — the `staticData.name` of the deepest matched route that declares one.\n * Used by `RootLayout` to label the header automatically (e.g. \"Dashboard\").\n */\nexport function usePageTitle(): string | undefined {\n const router = useRouter()\n const matches = useRouterState({ select: (s) => s.matches })\n for (let i = matches.length - 1; i >= 0; i--) {\n const route = router.looseRoutesById[matches[i].routeId]\n const name = route?.options?.staticData?.name\n if (name) return name\n }\n return undefined\n}\n\n/** One breadcrumb. `to` is set only when the crumb points at a real, navigable menu page. */\nexport interface Breadcrumb {\n label: string\n to?: string\n}\n\n/** Every `to` that the menu actually navigates to (top links, group pages, leaves). */\nfunction navigablePaths(tree: { links: NavLeaf[]; modules: NavModule[] }): Set<string> {\n const set = new Set<string>()\n for (const link of tree.links) set.add(link.to)\n for (const mod of tree.modules)\n for (const group of mod.groups) {\n if (group.to) set.add(group.to)\n for (const leaf of group.children ?? []) set.add(leaf.to)\n }\n return set\n}\n\n/**\n * Breadcrumb trail for the current route, derived from the active match chain: one crumb per matched\n * route that declares a `staticData.name` (module → group → page). `homeTo` is the first allowed menu\n * page (same target as `FirstRouteRedirect`). Intermediate crumbs link only when they map to a real\n * navigable page; the last crumb (the current page) is always plain text.\n */\nexport function useBreadcrumbs(): { homeTo?: string; items: Breadcrumb[] } {\n const tree = useNavTree()\n const matches = useRouterState({ select: (s) => s.matches })\n const homeTo = firstNavTo(tree)\n const navigable = navigablePaths(tree)\n\n const items: Breadcrumb[] = []\n for (const match of matches) {\n const name = match.staticData?.name\n if (!name) continue\n const full = `/${trimSlashes(match.pathname)}`\n items.push({ label: name, to: navigable.has(full) ? full : undefined })\n }\n // The current page is where you already are — never a link.\n if (items.length > 0) items[items.length - 1] = { label: items[items.length - 1].label }\n return { homeTo, items }\n}\n\n/** Drop-in component for the `/` route: forwards to whatever sits FIRST in the menu. */\nexport function FirstRouteRedirect() {\n const to = useFirstNavTo()\n return to ? <Navigate to={to as LinkProps['to']} /> : null\n}\n\n/** Auto-generated navigation, derived from the routes' `staticData`. Rendered inside `RootLayout`. */\nexport function Sidebar() {\n const { links, modules } = useNavTree()\n const pathname = useRouterState({ select: (s) => s.location.pathname })\n\n return (\n <nav className={styles.nav}>\n {links.length > 0 ? (\n <List>\n {links.map((link) => (\n <NavLink\n key={link.to}\n as={Link}\n to={link.to}\n icon={link.icon}\n selected={pathname === link.to}\n clickable\n trailing={navTrailing(link.badge, link.dot)}\n >\n {link.label}\n </NavLink>\n ))}\n </List>\n ) : null}\n {modules.map((mod) => (\n <div className={styles.module} key={mod.module}>\n <div className={styles.moduleLabel}>{mod.module}</div>\n <List>\n {mod.groups.map((group) => (\n <NavGroupItem key={group.label} group={group} pathname={pathname} />\n ))}\n </List>\n </div>\n ))}\n </nav>\n )\n}\n\n/** A single searchable destination — a nav page flattened out of the tree, with a breadcrumb context. */\ninterface NavPage {\n label: string\n to: string\n /** Where it lives — e.g. `\"Components · Forms\"` — shown as the muted second line. */\n context?: string\n}\n\n/** Flatten the nav tree into every navigable page (top links + group pages + leaves). */\nfunction flattenPages(tree: { links: NavLeaf[]; modules: NavModule[] }): NavPage[] {\n const pages: NavPage[] = []\n for (const link of tree.links) pages.push({ label: link.label, to: link.to })\n for (const mod of tree.modules)\n for (const group of mod.groups) {\n if (group.to) pages.push({ label: group.label, to: group.to, context: mod.module })\n for (const leaf of group.children ?? [])\n pages.push({\n label: leaf.label,\n to: leaf.to,\n context: `${mod.module} · ${group.label}`,\n })\n }\n return pages\n}\n\nconst MAX_SEARCH_RESULTS = 8\n\n/**\n * Header search over the sidebar's pages — type to filter the nav (by page name or its section) and\n * pick a suggestion to jump there. Data comes from the same `useNavTree` the sidebar uses (so it\n * respects RBAC). Keyboard: Up/Down move, Enter opens, Escape closes. Rendered by `RootLayout`'s header.\n */\nexport function NavSearch() {\n const t = useT()\n const tree = useNavTree()\n const navigate = useNavigate()\n const pages = useMemo(() => flattenPages(tree), [tree])\n\n const [query, setQuery] = useState('')\n const [open, setOpen] = useState(false)\n const [active, setActive] = useState(0)\n const rootRef = useRef<HTMLDivElement | null>(null)\n\n const results = useMemo(() => {\n const q = query.trim().toLowerCase()\n if (!q) return []\n return pages\n .filter(\n (p) => p.label.toLowerCase().includes(q) || (p.context?.toLowerCase().includes(q) ?? false),\n )\n .slice(0, MAX_SEARCH_RESULTS)\n }, [pages, query])\n\n const showList = open && results.length > 0\n\n // reset the highlighted row whenever the query changes\n useEffect(() => setActive(0), [query])\n\n // clamp the highlight if the result set shrinks without a query change (e.g. RBAC pages update)\n useEffect(() => {\n setActive((a) => (a > results.length - 1 ? Math.max(0, results.length - 1) : a))\n }, [results.length])\n\n // close the suggestions on an outside pointerdown\n useEffect(() => {\n if (!open) return\n const onDown = (event: PointerEvent) => {\n if (rootRef.current && !rootRef.current.contains(event.target as Node)) setOpen(false)\n }\n document.addEventListener('pointerdown', onDown)\n return () => document.removeEventListener('pointerdown', onDown)\n }, [open])\n\n const go = (to: string) => {\n navigate({ to: to as LinkProps['to'] })\n setQuery('')\n setOpen(false)\n }\n\n const onKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (!showList) return\n if (event.key === 'ArrowDown') {\n event.preventDefault()\n setActive((i) => (i + 1) % results.length)\n } else if (event.key === 'ArrowUp') {\n event.preventDefault()\n setActive((i) => (i - 1 + results.length) % results.length)\n } else if (event.key === 'Enter') {\n event.preventDefault()\n const hit = results[active]\n if (hit) go(hit.to)\n } else if (event.key === 'Escape') {\n setOpen(false)\n }\n }\n\n return (\n <div\n ref={rootRef}\n className={styles.search}\n role=\"combobox\"\n aria-expanded={showList}\n aria-haspopup=\"listbox\"\n >\n <TextField\n value={query}\n onChange={(event: ChangeEvent<HTMLInputElement>) => {\n setQuery(event.target.value)\n setOpen(true)\n }}\n onFocus={() => setOpen(true)}\n onKeyDown={onKeyDown}\n adornment={<Icon name=\"SearchNormal\" />}\n placeholder={t('sidebar.searchPages')}\n aria-label={t('sidebar.searchPages')}\n autoComplete=\"off\"\n />\n {showList ? (\n <div className={styles.searchPanel}>\n <List role=\"listbox\">\n {results.map((page, i) => (\n <ListItem\n key={page.to}\n description={page.context}\n clickable\n selected={i === active}\n // keep the input focused through the click so blur doesn't close the list first\n onMouseDown={(event: MouseEvent) => event.preventDefault()}\n onMouseEnter={() => setActive(i)}\n onClick={() => go(page.to)}\n >\n {page.label}\n </ListItem>\n ))}\n </List>\n </div>\n ) : null}\n </div>\n )\n}\n\nfunction groupIsActive(group: NavGroup, pathname: string): boolean {\n if (group.to && pathname === group.to) return true\n return group.children?.some((leaf) => leaf.to === pathname) ?? false\n}\n\n/** A small \"New\"-style pill rendered on a menu row from `staticData.badge`. */\nfunction navBadge(text?: string) {\n return text ? <span className={styles.navBadge}>{text}</span> : null\n}\n\n/** A small colored dot indicator on a menu row from `staticData.dot`. */\nfunction navDot(color?: ThemeColor) {\n return color ? (\n <span className={styles.navDot} style={{ background: `var(--tz-color-${color})` }} />\n ) : null\n}\n\n/** The menu row's trailing slot: dot + badge + an optional chevron (omitted entirely when empty). */\nfunction navTrailing(badge?: string, dot?: ThemeColor, chevron?: ReactNode): ReactNode {\n if (badge == null && dot == null && chevron == null) return undefined\n return (\n <>\n {navBadge(badge)}\n {navDot(dot)}\n {chevron}\n </>\n )\n}\n\nfunction NavGroupItem({ group, pathname }: { group: NavGroup; pathname: string }) {\n const active = groupIsActive(group, pathname)\n const hasChildren = !!group.children?.length\n const [open, setOpen] = useState(active)\n\n // re-open when navigation makes this group active via a path the mount-time seed missed\n // (NavSearch, Breadcrumbs, back/forward) — collapsing an active group hides the current page\n useEffect(() => {\n if (active) setOpen(true)\n }, [active])\n\n // a plain level-2 page (no children) — just a link row\n if (!hasChildren && group.to) {\n return (\n <NavLink\n as={Link}\n to={group.to}\n icon={group.icon}\n selected={active}\n clickable\n trailing={navTrailing(group.badge, group.dot)}\n >\n {group.label}\n </NavLink>\n )\n }\n\n const chevron = (\n <Icon\n name=\"ArrowDown4\"\n size=\"sm\"\n className={styles.chevron}\n data-open={open ? 'true' : 'false'}\n />\n )\n\n return (\n <>\n {hasChildren && group.to ? (\n // \"Case B\": the row navigates (and expands); a separate chevron only toggles.\n <NavLink\n as={Link}\n to={group.to}\n icon={group.icon}\n selected={active}\n clickable\n onClick={() => setOpen(true)}\n trailing={navTrailing(\n group.badge,\n group.dot,\n <button\n type=\"button\"\n className={styles.chevronButton}\n aria-label={`${open ? 'Collapse' : 'Expand'} ${group.label}`}\n aria-expanded={open}\n onClick={(event: MouseEvent) => {\n event.preventDefault()\n event.stopPropagation()\n setOpen((o) => !o)\n }}\n >\n {chevron}\n </button>,\n )}\n >\n {group.label}\n </NavLink>\n ) : (\n // a pure container — the whole row toggles its children\n <ListItem\n icon={group.icon}\n selected={active}\n clickable\n aria-expanded={open}\n onClick={() => setOpen((o) => !o)}\n trailing={navTrailing(group.badge, group.dot, chevron)}\n >\n {group.label}\n </ListItem>\n )}\n {hasChildren ? (\n // smooth collapse, same grid-template-rows technique as Card\n <div className={clsx(styles.collapsible, !open && styles.collapsibleClosed)}>\n <div className={styles.collapsibleInner}>\n <List className={styles.leaves}>\n {group.children?.map((leaf) => (\n <NavLink\n key={leaf.to}\n as={Link}\n to={leaf.to}\n icon={<span className={styles.leafDot} />}\n selected={pathname === leaf.to}\n size=\"md\"\n clickable\n trailing={navTrailing(leaf.badge, leaf.dot)}\n >\n {leaf.label}\n </NavLink>\n ))}\n </List>\n </div>\n </div>\n ) : null}\n </>\n )\n}\n"],"names":["NavLink","ListItem","prettify","seg","w","trimSlashes","p","byOrderThenLabel","a","b","buildNavTree","routes","entries","route","sd","path","metaByPath","e","paths","isContainer","o","rawFullPaths","r","groupHasOwnPage","groupKey","chrome","key","modules","getModule","mod","c","topLinks","name","segs","group","l","g","useNavTree","router","useRouter","accessKeys","useAccessKeys","useMemo","_a","hasAccess","firstNavTo","tree","firstChild","useFirstNavTo","usePageTitle","matches","useRouterState","s","i","_b","navigablePaths","set","link","leaf","useBreadcrumbs","homeTo","navigable","items","match","full","FirstRouteRedirect","to","jsx","Navigate","Sidebar","links","pathname","jsxs","styles","List","Link","navTrailing","NavGroupItem","flattenPages","pages","MAX_SEARCH_RESULTS","NavSearch","t","useT","navigate","useNavigate","query","setQuery","useState","open","setOpen","active","setActive","rootRef","useRef","results","q","showList","useEffect","onDown","event","go","onKeyDown","hit","TextField","Icon","page","groupIsActive","navBadge","text","navDot","color","badge","dot","chevron","Fragment","hasChildren","clsx"],"mappings":"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"}
@@ -1,424 +0,0 @@
1
- import { jsx as i, jsxs as z, Fragment as $ } from "react/jsx-runtime";
2
- import { useMemo as y, useState as C, useRef as R, useEffect as P } from "react";
3
- import { Navigate as M, useRouterState as x, Link as k, useRouter as B, useNavigate as O } from "@tanstack/react-router";
4
- import { clsx as j } from "clsx";
5
- import { I as E } from "./Icon-CophpkHo.js";
6
- import { L as T } from "./List-LqbfF6gU.js";
7
- import { L as S } from "./ListItem-B4Upc0Hy.js";
8
- import { T as K } from "./TextField-Bg4TwkVD.js";
9
- import { u as V, h as Y } from "./access-Db4knwyR.js";
10
- import { a as U } from "./ConfigProvider-BYruQYHC.js";
11
- const q = "_nav_a1zzi_4", H = "_module_a1zzi_17", G = "_search_a1zzi_25", Q = "_searchPanel_a1zzi_31", W = "_moduleLabel_a1zzi_46", X = "_leaves_a1zzi_61", J = "_navBadge_a1zzi_66", Z = "_navDot_a1zzi_78", ee = "_leafDot_a1zzi_86", te = "_collapsible_a1zzi_95", oe = "_collapsibleClosed_a1zzi_100", ne = "_collapsibleInner_a1zzi_103", ae = "_chevron_a1zzi_109", se = "_chevronButton_a1zzi_119", b = {
12
- nav: q,
13
- module: H,
14
- search: G,
15
- searchPanel: Q,
16
- moduleLabel: W,
17
- leaves: X,
18
- navBadge: J,
19
- navDot: Z,
20
- leafDot: ee,
21
- collapsible: te,
22
- collapsibleClosed: oe,
23
- collapsibleInner: ne,
24
- chevron: ae,
25
- chevronButton: se
26
- }, w = S, le = (e) => e.split("-").map((a) => a.charAt(0).toUpperCase() + a.slice(1)).join(" "), F = (e) => e.replace(/^\/+|\/+$/g, ""), D = (e, a) => e.order - a.order || e.label.localeCompare(a.label);
27
- function ce(e) {
28
- const a = [];
29
- for (const o of e) {
30
- const c = o.staticData, n = F(o.fullPath);
31
- !(c != null && c.name) || !n || a.push({ path: n, name: c.name, sd: c });
32
- }
33
- const s = new Map(a.map((o) => [o.path, o])), t = a.map((o) => o.path), l = (o) => t.some((c) => c !== o && c.startsWith(`${o}/`)), f = new Set(e.map((o) => o.fullPath)), m = (o) => f.has(`/${o}/`), h = (o, c) => {
34
- const n = s.get(o);
35
- return {
36
- label: (n == null ? void 0 : n.name) ?? le(c),
37
- icon: n == null ? void 0 : n.sd.icon,
38
- badge: n == null ? void 0 : n.sd.badge,
39
- dot: n == null ? void 0 : n.sd.dot,
40
- order: (n == null ? void 0 : n.sd.order) ?? Number.POSITIVE_INFINITY
41
- };
42
- }, p = /* @__PURE__ */ new Map(), u = (o) => {
43
- let c = p.get(o);
44
- if (!c) {
45
- const n = h(o, o);
46
- c = { label: n.label, icon: n.icon, order: n.order, groups: /* @__PURE__ */ new Map() }, p.set(o, c);
47
- }
48
- return c;
49
- }, g = [];
50
- for (const { path: o, name: c, sd: n } of a) {
51
- const _ = o.split("/");
52
- if (_.length <= 2 && l(o) || n.hidden) continue;
53
- if (_.length === 1) {
54
- g.push({
55
- label: c,
56
- to: `/${o}`,
57
- icon: n.icon,
58
- badge: n.badge,
59
- dot: n.dot,
60
- order: n.order ?? Number.POSITIVE_INFINITY
61
- });
62
- continue;
63
- }
64
- const r = u(_[0]);
65
- if (_.length === 2)
66
- r.groups.set(o, {
67
- label: c,
68
- icon: n.icon,
69
- to: `/${o}`,
70
- badge: n.badge,
71
- dot: n.dot,
72
- order: n.order ?? Number.POSITIVE_INFINITY,
73
- leaves: [],
74
- isContainer: !1
75
- });
76
- else {
77
- const d = _.slice(0, 2).join("/");
78
- let v = r.groups.get(d);
79
- if (!v) {
80
- const N = h(d, _[1]);
81
- v = {
82
- label: N.label,
83
- icon: N.icon,
84
- badge: N.badge,
85
- dot: N.dot,
86
- order: N.order,
87
- to: m(d) ? `/${d}` : void 0,
88
- leaves: [],
89
- isContainer: !0
90
- }, r.groups.set(d, v);
91
- }
92
- v.leaves.push({
93
- label: c,
94
- to: `/${o}`,
95
- icon: n.icon,
96
- badge: n.badge,
97
- dot: n.dot,
98
- order: n.order ?? Number.POSITIVE_INFINITY
99
- });
100
- }
101
- }
102
- return {
103
- links: g.sort(D).map((o) => ({ label: o.label, to: o.to, icon: o.icon, badge: o.badge, dot: o.dot })),
104
- modules: [...p.values()].sort(D).map(
105
- (o) => ({
106
- module: o.label,
107
- icon: o.icon,
108
- groups: [...o.groups.values()].sort(D).map(
109
- (c) => ({
110
- label: c.label,
111
- icon: c.icon,
112
- to: c.to,
113
- badge: c.badge,
114
- dot: c.dot,
115
- children: c.isContainer ? c.leaves.sort(D).map((n) => ({
116
- label: n.label,
117
- to: n.to,
118
- icon: n.icon,
119
- badge: n.badge,
120
- dot: n.dot
121
- })) : void 0
122
- })
123
- )
124
- })
125
- )
126
- };
127
- }
128
- function L() {
129
- const e = B(), a = V();
130
- return y(
131
- () => ce(
132
- Object.values(e.looseRoutesById).map((s) => {
133
- var t;
134
- return {
135
- fullPath: s.fullPath,
136
- staticData: (t = s.options) == null ? void 0 : t.staticData
137
- };
138
- }).filter((s) => {
139
- var t;
140
- return Y((t = s.staticData) == null ? void 0 : t.roles);
141
- })
142
- ),
143
- [e, a]
144
- );
145
- }
146
- function A(e) {
147
- var a;
148
- if (e.links[0]) return e.links[0].to;
149
- for (const s of e.modules)
150
- for (const t of s.groups) {
151
- if (t.to) return t.to;
152
- const l = (a = t.children) == null ? void 0 : a[0];
153
- if (l) return l.to;
154
- }
155
- }
156
- function re() {
157
- return A(L());
158
- }
159
- function ke() {
160
- var s, t;
161
- const e = B(), a = x({ select: (l) => l.matches });
162
- for (let l = a.length - 1; l >= 0; l--) {
163
- const f = e.looseRoutesById[a[l].routeId], m = (t = (s = f == null ? void 0 : f.options) == null ? void 0 : s.staticData) == null ? void 0 : t.name;
164
- if (m) return m;
165
- }
166
- }
167
- function ie(e) {
168
- const a = /* @__PURE__ */ new Set();
169
- for (const s of e.links) a.add(s.to);
170
- for (const s of e.modules)
171
- for (const t of s.groups) {
172
- t.to && a.add(t.to);
173
- for (const l of t.children ?? []) a.add(l.to);
174
- }
175
- return a;
176
- }
177
- function we() {
178
- var f;
179
- const e = L(), a = x({ select: (m) => m.matches }), s = A(e), t = ie(e), l = [];
180
- for (const m of a) {
181
- const h = (f = m.staticData) == null ? void 0 : f.name;
182
- if (!h) continue;
183
- const p = `/${F(m.pathname)}`;
184
- l.push({ label: h, to: t.has(p) ? p : void 0 });
185
- }
186
- return l.length > 0 && (l[l.length - 1] = { label: l[l.length - 1].label }), { homeTo: s, items: l };
187
- }
188
- function Te() {
189
- const e = re();
190
- return e ? /* @__PURE__ */ i(M, { to: e }) : null;
191
- }
192
- function Le() {
193
- const { links: e, modules: a } = L(), s = x({ select: (t) => t.location.pathname });
194
- return /* @__PURE__ */ z("nav", { className: b.nav, children: [
195
- e.length > 0 ? /* @__PURE__ */ i(T, { children: e.map((t) => /* @__PURE__ */ i(
196
- w,
197
- {
198
- as: k,
199
- to: t.to,
200
- icon: t.icon,
201
- selected: s === t.to,
202
- clickable: !0,
203
- trailing: I(t.badge, t.dot),
204
- children: t.label
205
- },
206
- t.to
207
- )) }) : null,
208
- a.map((t) => /* @__PURE__ */ z("div", { className: b.module, children: [
209
- /* @__PURE__ */ i("div", { className: b.moduleLabel, children: t.module }),
210
- /* @__PURE__ */ i(T, { children: t.groups.map((l) => /* @__PURE__ */ i(be, { group: l, pathname: s }, l.label)) })
211
- ] }, t.module))
212
- ] });
213
- }
214
- function de(e) {
215
- const a = [];
216
- for (const s of e.links) a.push({ label: s.label, to: s.to });
217
- for (const s of e.modules)
218
- for (const t of s.groups) {
219
- t.to && a.push({ label: t.label, to: t.to, context: s.module });
220
- for (const l of t.children ?? [])
221
- a.push({
222
- label: l.label,
223
- to: l.to,
224
- context: `${s.module} · ${t.label}`
225
- });
226
- }
227
- return a;
228
- }
229
- const ue = 8;
230
- function ye() {
231
- const e = U(), a = L(), s = O(), t = y(() => de(a), [a]), [l, f] = C(""), [m, h] = C(!1), [p, u] = C(0), g = R(null), o = y(() => {
232
- const r = l.trim().toLowerCase();
233
- return r ? t.filter(
234
- (d) => {
235
- var v;
236
- return d.label.toLowerCase().includes(r) || (((v = d.context) == null ? void 0 : v.toLowerCase().includes(r)) ?? !1);
237
- }
238
- ).slice(0, ue) : [];
239
- }, [t, l]), c = m && o.length > 0;
240
- P(() => u(0), [l]), P(() => {
241
- u((r) => r > o.length - 1 ? Math.max(0, o.length - 1) : r);
242
- }, [o.length]), P(() => {
243
- if (!m) return;
244
- const r = (d) => {
245
- g.current && !g.current.contains(d.target) && h(!1);
246
- };
247
- return document.addEventListener("pointerdown", r), () => document.removeEventListener("pointerdown", r);
248
- }, [m]);
249
- const n = (r) => {
250
- s({ to: r }), f(""), h(!1);
251
- }, _ = (r) => {
252
- if (c)
253
- if (r.key === "ArrowDown")
254
- r.preventDefault(), u((d) => (d + 1) % o.length);
255
- else if (r.key === "ArrowUp")
256
- r.preventDefault(), u((d) => (d - 1 + o.length) % o.length);
257
- else if (r.key === "Enter") {
258
- r.preventDefault();
259
- const d = o[p];
260
- d && n(d.to);
261
- } else r.key === "Escape" && h(!1);
262
- };
263
- return /* @__PURE__ */ z(
264
- "div",
265
- {
266
- ref: g,
267
- className: b.search,
268
- role: "combobox",
269
- "aria-expanded": c,
270
- "aria-haspopup": "listbox",
271
- children: [
272
- /* @__PURE__ */ i(
273
- K,
274
- {
275
- value: l,
276
- onChange: (r) => {
277
- f(r.target.value), h(!0);
278
- },
279
- onFocus: () => h(!0),
280
- onKeyDown: _,
281
- adornment: /* @__PURE__ */ i(E, { name: "SearchNormal" }),
282
- placeholder: e("sidebar.searchPages"),
283
- "aria-label": e("sidebar.searchPages"),
284
- autoComplete: "off"
285
- }
286
- ),
287
- c ? /* @__PURE__ */ i("div", { className: b.searchPanel, children: /* @__PURE__ */ i(T, { role: "listbox", children: o.map((r, d) => /* @__PURE__ */ i(
288
- S,
289
- {
290
- description: r.context,
291
- clickable: !0,
292
- selected: d === p,
293
- onMouseDown: (v) => v.preventDefault(),
294
- onMouseEnter: () => u(d),
295
- onClick: () => n(r.to),
296
- children: r.label
297
- },
298
- r.to
299
- )) }) }) : null
300
- ]
301
- }
302
- );
303
- }
304
- function fe(e, a) {
305
- var s;
306
- return e.to && a === e.to ? !0 : ((s = e.children) == null ? void 0 : s.some((t) => t.to === a)) ?? !1;
307
- }
308
- function me(e) {
309
- return e ? /* @__PURE__ */ i("span", { className: b.navBadge, children: e }) : null;
310
- }
311
- function he(e) {
312
- return e ? /* @__PURE__ */ i("span", { className: b.navDot, style: { background: `var(--tz-color-${e})` } }) : null;
313
- }
314
- function I(e, a, s) {
315
- if (!(e == null && a == null && s == null))
316
- return /* @__PURE__ */ z($, { children: [
317
- me(e),
318
- he(a),
319
- s
320
- ] });
321
- }
322
- function be({ group: e, pathname: a }) {
323
- var h, p;
324
- const s = fe(e, a), t = !!((h = e.children) != null && h.length), [l, f] = C(s);
325
- if (P(() => {
326
- s && f(!0);
327
- }, [s]), !t && e.to)
328
- return /* @__PURE__ */ i(
329
- w,
330
- {
331
- as: k,
332
- to: e.to,
333
- icon: e.icon,
334
- selected: s,
335
- clickable: !0,
336
- trailing: I(e.badge, e.dot),
337
- children: e.label
338
- }
339
- );
340
- const m = /* @__PURE__ */ i(
341
- E,
342
- {
343
- name: "ArrowDown4",
344
- size: "sm",
345
- className: b.chevron,
346
- "data-open": l ? "true" : "false"
347
- }
348
- );
349
- return /* @__PURE__ */ z($, { children: [
350
- t && e.to ? (
351
- // "Case B": the row navigates (and expands); a separate chevron only toggles.
352
- /* @__PURE__ */ i(
353
- w,
354
- {
355
- as: k,
356
- to: e.to,
357
- icon: e.icon,
358
- selected: s,
359
- clickable: !0,
360
- onClick: () => f(!0),
361
- trailing: I(
362
- e.badge,
363
- e.dot,
364
- /* @__PURE__ */ i(
365
- "button",
366
- {
367
- type: "button",
368
- className: b.chevronButton,
369
- "aria-label": `${l ? "Collapse" : "Expand"} ${e.label}`,
370
- "aria-expanded": l,
371
- onClick: (u) => {
372
- u.preventDefault(), u.stopPropagation(), f((g) => !g);
373
- },
374
- children: m
375
- }
376
- )
377
- ),
378
- children: e.label
379
- }
380
- )
381
- ) : (
382
- // a pure container — the whole row toggles its children
383
- /* @__PURE__ */ i(
384
- S,
385
- {
386
- icon: e.icon,
387
- selected: s,
388
- clickable: !0,
389
- "aria-expanded": l,
390
- onClick: () => f((u) => !u),
391
- trailing: I(e.badge, e.dot, m),
392
- children: e.label
393
- }
394
- )
395
- ),
396
- t ? (
397
- // smooth collapse, same grid-template-rows technique as Card
398
- /* @__PURE__ */ i("div", { className: j(b.collapsible, !l && b.collapsibleClosed), children: /* @__PURE__ */ i("div", { className: b.collapsibleInner, children: /* @__PURE__ */ i(T, { className: b.leaves, children: (p = e.children) == null ? void 0 : p.map((u) => /* @__PURE__ */ i(
399
- w,
400
- {
401
- as: k,
402
- to: u.to,
403
- icon: /* @__PURE__ */ i("span", { className: b.leafDot }),
404
- selected: a === u.to,
405
- size: "md",
406
- clickable: !0,
407
- trailing: I(u.badge, u.dot),
408
- children: u.label
409
- },
410
- u.to
411
- )) }) }) })
412
- ) : null
413
- ] });
414
- }
415
- export {
416
- Te as F,
417
- ye as N,
418
- Le as S,
419
- ke as a,
420
- ce as b,
421
- A as f,
422
- we as u
423
- };
424
- //# sourceMappingURL=Sidebar-Csd3iKbS.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Sidebar-Csd3iKbS.js","sources":["../src/components/Sidebar/Sidebar.tsx"],"sourcesContent":["import {\n useEffect,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n} from 'react'\nimport {\n Link,\n Navigate,\n useNavigate,\n useRouter,\n useRouterState,\n type LinkProps,\n type StaticDataRouteOption,\n} from '@tanstack/react-router'\nimport { clsx } from 'clsx'\nimport { Icon } from '../Icon'\nimport { List, ListItem, type ListItemProps } from '../List'\nimport { TextField } from '../TextField'\nimport { useT, type ThemeColor } from '../../theme'\nimport type { IconName } from '../../icons/names'\nimport { hasAccess, useAccessKeys } from '../../helpers/access'\nimport styles from './Sidebar.module.css'\n\n// `ListItem` rendered as a TanStack `Link` — it forwards unrecognized props (like `to`) to the\n// element, so this typed alias lets us pass `to` while keeping `ListItem`'s look + behavior.\nconst NavLink = ListItem as unknown as (props: ListItemProps & { to: string }) => ReactNode\n\nexport type { IconName }\n\n// Typed `staticData` for consumers — every route describes its own menu entry.\ndeclare module '@tanstack/react-router' {\n interface StaticDataRouteOption {\n /** Menu label. A route with no `name` never appears in the menu. */\n name?: string\n /** Optional menu icon (the library's `IconName` union). */\n icon?: IconName\n /** Sort order within the parent (ascending); falls back to alphabetical. */\n order?: number\n /** Routed but hidden from the menu. */\n hidden?: boolean\n /** Allowed accessKeys (OR — user needs any one). Omitted/empty = public. */\n roles?: string[]\n /** Small text label (e.g. `\"New\"`) shown as a pill on the menu row. */\n badge?: string\n /** Theme color of a small dot indicator on the menu row (e.g. `\"error\"`). */\n dot?: ThemeColor\n }\n}\n\nexport interface NavLeaf {\n label: string\n to: string\n icon?: IconName\n badge?: string\n dot?: ThemeColor\n}\nexport interface NavGroup {\n label: string\n icon?: IconName\n to?: string\n badge?: string\n dot?: ThemeColor\n children?: NavLeaf[]\n}\nexport interface NavModule {\n module: string\n icon?: IconName\n groups: NavGroup[]\n}\n\nconst prettify = (seg: string) =>\n seg\n .split('-')\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(' ')\nconst trimSlashes = (p: string) => p.replace(/^\\/+|\\/+$/g, '')\nconst byOrderThenLabel = (\n a: { order: number; label: string },\n b: { order: number; label: string },\n) => a.order - b.order || a.label.localeCompare(b.label)\n\ninterface LeafAcc {\n label: string\n to: string\n icon?: IconName\n badge?: string\n dot?: ThemeColor\n order: number\n}\ninterface GroupAcc {\n label: string\n icon?: IconName\n to?: string\n badge?: string\n dot?: ThemeColor\n order: number\n leaves: LeafAcc[]\n isContainer: boolean\n}\ninterface ModuleAcc {\n label: string\n icon?: IconName\n order: number\n groups: Map<string, GroupAcc>\n}\n\n/** A single route, reduced to what the menu needs. */\nexport interface NavRoute {\n fullPath: string\n staticData?: StaticDataRouteOption\n}\n\n/**\n * Pure menu builder — derives the 3-level nav tree (module → group → page) from a flat route list.\n * Kept router-free so it's unit-testable; `useNavTree` feeds it the live routes.\n */\nexport function buildNavTree(routes: NavRoute[]): { links: NavLeaf[]; modules: NavModule[] } {\n const entries: Array<{ path: string; name: string; sd: StaticDataRouteOption }> = []\n for (const route of routes) {\n const sd = route.staticData\n const path = trimSlashes(route.fullPath)\n if (!sd?.name || !path) continue\n entries.push({ path, name: sd.name, sd })\n }\n\n const metaByPath = new Map(entries.map((e) => [e.path, e]))\n const paths = entries.map((e) => e.path)\n const isContainer = (p: string) => paths.some((o) => o !== p && o.startsWith(`${p}/`))\n const rawFullPaths = new Set(routes.map((r) => r.fullPath))\n const groupHasOwnPage = (groupKey: string) => rawFullPaths.has(`/${groupKey}/`)\n\n const chrome = (key: string, seg: string) => {\n const e = metaByPath.get(key)\n return {\n label: e?.name ?? prettify(seg),\n icon: e?.sd.icon,\n badge: e?.sd.badge,\n dot: e?.sd.dot,\n order: e?.sd.order ?? Number.POSITIVE_INFINITY,\n }\n }\n\n const modules = new Map<string, ModuleAcc>()\n const getModule = (seg: string) => {\n let mod = modules.get(seg)\n if (!mod) {\n const c = chrome(seg, seg)\n mod = { label: c.label, icon: c.icon, order: c.order, groups: new Map() }\n modules.set(seg, mod)\n }\n return mod\n }\n\n const topLinks: LeafAcc[] = []\n for (const { path, name, sd } of entries) {\n const segs = path.split('/')\n // The menu is 3 levels deep by design (module → group → page). A path only counts as a\n // \"container\" (holds children instead of being its own row) at the module/group levels; a\n // depth-3+ route is always a leaf, so a named page with even-deeper children isn't dropped.\n // Routes deeper than 3 segments still appear — flattened as leaves under their depth-2 group\n // (their `to` stays correct) — the nav just can't nest beyond level 3.\n if ((segs.length <= 2 && isContainer(path)) || sd.hidden) continue\n if (segs.length === 1) {\n topLinks.push({\n label: name,\n to: `/${path}`,\n icon: sd.icon,\n badge: sd.badge,\n dot: sd.dot,\n order: sd.order ?? Number.POSITIVE_INFINITY,\n })\n continue\n }\n const mod = getModule(segs[0])\n if (segs.length === 2) {\n mod.groups.set(path, {\n label: name,\n icon: sd.icon,\n to: `/${path}`,\n badge: sd.badge,\n dot: sd.dot,\n order: sd.order ?? Number.POSITIVE_INFINITY,\n leaves: [],\n isContainer: false,\n })\n } else {\n const groupKey = segs.slice(0, 2).join('/')\n let group = mod.groups.get(groupKey)\n if (!group) {\n const c = chrome(groupKey, segs[1])\n group = {\n label: c.label,\n icon: c.icon,\n badge: c.badge,\n dot: c.dot,\n order: c.order,\n to: groupHasOwnPage(groupKey) ? `/${groupKey}` : undefined,\n leaves: [],\n isContainer: true,\n }\n mod.groups.set(groupKey, group)\n }\n group.leaves.push({\n label: name,\n to: `/${path}`,\n icon: sd.icon,\n badge: sd.badge,\n dot: sd.dot,\n order: sd.order ?? Number.POSITIVE_INFINITY,\n })\n }\n }\n\n return {\n links: topLinks\n .sort(byOrderThenLabel)\n .map((l) => ({ label: l.label, to: l.to, icon: l.icon, badge: l.badge, dot: l.dot })),\n modules: [...modules.values()].sort(byOrderThenLabel).map(\n (mod): NavModule => ({\n module: mod.label,\n icon: mod.icon,\n groups: [...mod.groups.values()].sort(byOrderThenLabel).map(\n (g): NavGroup => ({\n label: g.label,\n icon: g.icon,\n to: g.to,\n badge: g.badge,\n dot: g.dot,\n children: g.isContainer\n ? g.leaves.sort(byOrderThenLabel).map((l) => ({\n label: l.label,\n to: l.to,\n icon: l.icon,\n badge: l.badge,\n dot: l.dot,\n }))\n : undefined,\n }),\n ),\n }),\n ),\n }\n}\n\nfunction useNavTree(): { links: NavLeaf[]; modules: NavModule[] } {\n const router = useRouter()\n const accessKeys = useAccessKeys() // re-render the menu when the user's roles change (login/logout)\n return useMemo(\n () =>\n buildNavTree(\n Object.values(router.looseRoutesById)\n .map((route) => ({\n fullPath: route.fullPath,\n staticData: route.options?.staticData,\n }))\n // Drop pages the current user can't access — empty groups/modules then vanish on their own.\n .filter((route) => hasAccess(route.staticData?.roles)),\n ),\n [router, accessKeys],\n )\n}\n\n/** The first menu destination (top link, else first group/leaf) — used by `FirstRouteRedirect`. */\nexport function firstNavTo(tree: { links: NavLeaf[]; modules: NavModule[] }): string | undefined {\n if (tree.links[0]) return tree.links[0].to\n for (const mod of tree.modules)\n for (const group of mod.groups) {\n if (group.to) return group.to\n const firstChild = group.children?.[0]\n if (firstChild) return firstChild.to\n }\n return undefined\n}\n\nfunction useFirstNavTo() {\n return firstNavTo(useNavTree())\n}\n\n/**\n * The current page's title — the `staticData.name` of the deepest matched route that declares one.\n * Used by `RootLayout` to label the header automatically (e.g. \"Dashboard\").\n */\nexport function usePageTitle(): string | undefined {\n const router = useRouter()\n const matches = useRouterState({ select: (s) => s.matches })\n for (let i = matches.length - 1; i >= 0; i--) {\n const route = router.looseRoutesById[matches[i].routeId]\n const name = route?.options?.staticData?.name\n if (name) return name\n }\n return undefined\n}\n\n/** One breadcrumb. `to` is set only when the crumb points at a real, navigable menu page. */\nexport interface Breadcrumb {\n label: string\n to?: string\n}\n\n/** Every `to` that the menu actually navigates to (top links, group pages, leaves). */\nfunction navigablePaths(tree: { links: NavLeaf[]; modules: NavModule[] }): Set<string> {\n const set = new Set<string>()\n for (const link of tree.links) set.add(link.to)\n for (const mod of tree.modules)\n for (const group of mod.groups) {\n if (group.to) set.add(group.to)\n for (const leaf of group.children ?? []) set.add(leaf.to)\n }\n return set\n}\n\n/**\n * Breadcrumb trail for the current route, derived from the active match chain: one crumb per matched\n * route that declares a `staticData.name` (module → group → page). `homeTo` is the first allowed menu\n * page (same target as `FirstRouteRedirect`). Intermediate crumbs link only when they map to a real\n * navigable page; the last crumb (the current page) is always plain text.\n */\nexport function useBreadcrumbs(): { homeTo?: string; items: Breadcrumb[] } {\n const tree = useNavTree()\n const matches = useRouterState({ select: (s) => s.matches })\n const homeTo = firstNavTo(tree)\n const navigable = navigablePaths(tree)\n\n const items: Breadcrumb[] = []\n for (const match of matches) {\n const name = match.staticData?.name\n if (!name) continue\n const full = `/${trimSlashes(match.pathname)}`\n items.push({ label: name, to: navigable.has(full) ? full : undefined })\n }\n // The current page is where you already are — never a link.\n if (items.length > 0) items[items.length - 1] = { label: items[items.length - 1].label }\n return { homeTo, items }\n}\n\n/** Drop-in component for the `/` route: forwards to whatever sits FIRST in the menu. */\nexport function FirstRouteRedirect() {\n const to = useFirstNavTo()\n return to ? <Navigate to={to as LinkProps['to']} /> : null\n}\n\n/** Auto-generated navigation, derived from the routes' `staticData`. Rendered inside `RootLayout`. */\nexport function Sidebar() {\n const { links, modules } = useNavTree()\n const pathname = useRouterState({ select: (s) => s.location.pathname })\n\n return (\n <nav className={styles.nav}>\n {links.length > 0 ? (\n <List>\n {links.map((link) => (\n <NavLink\n key={link.to}\n as={Link}\n to={link.to}\n icon={link.icon}\n selected={pathname === link.to}\n clickable\n trailing={navTrailing(link.badge, link.dot)}\n >\n {link.label}\n </NavLink>\n ))}\n </List>\n ) : null}\n {modules.map((mod) => (\n <div className={styles.module} key={mod.module}>\n <div className={styles.moduleLabel}>{mod.module}</div>\n <List>\n {mod.groups.map((group) => (\n <NavGroupItem key={group.label} group={group} pathname={pathname} />\n ))}\n </List>\n </div>\n ))}\n </nav>\n )\n}\n\n/** A single searchable destination — a nav page flattened out of the tree, with a breadcrumb context. */\ninterface NavPage {\n label: string\n to: string\n /** Where it lives — e.g. `\"Components · Forms\"` — shown as the muted second line. */\n context?: string\n}\n\n/** Flatten the nav tree into every navigable page (top links + group pages + leaves). */\nfunction flattenPages(tree: { links: NavLeaf[]; modules: NavModule[] }): NavPage[] {\n const pages: NavPage[] = []\n for (const link of tree.links) pages.push({ label: link.label, to: link.to })\n for (const mod of tree.modules)\n for (const group of mod.groups) {\n if (group.to) pages.push({ label: group.label, to: group.to, context: mod.module })\n for (const leaf of group.children ?? [])\n pages.push({\n label: leaf.label,\n to: leaf.to,\n context: `${mod.module} · ${group.label}`,\n })\n }\n return pages\n}\n\nconst MAX_SEARCH_RESULTS = 8\n\n/**\n * Header search over the sidebar's pages — type to filter the nav (by page name or its section) and\n * pick a suggestion to jump there. Data comes from the same `useNavTree` the sidebar uses (so it\n * respects RBAC). Keyboard: Up/Down move, Enter opens, Escape closes. Rendered by `RootLayout`'s header.\n */\nexport function NavSearch() {\n const t = useT()\n const tree = useNavTree()\n const navigate = useNavigate()\n const pages = useMemo(() => flattenPages(tree), [tree])\n\n const [query, setQuery] = useState('')\n const [open, setOpen] = useState(false)\n const [active, setActive] = useState(0)\n const rootRef = useRef<HTMLDivElement | null>(null)\n\n const results = useMemo(() => {\n const q = query.trim().toLowerCase()\n if (!q) return []\n return pages\n .filter(\n (p) => p.label.toLowerCase().includes(q) || (p.context?.toLowerCase().includes(q) ?? false),\n )\n .slice(0, MAX_SEARCH_RESULTS)\n }, [pages, query])\n\n const showList = open && results.length > 0\n\n // reset the highlighted row whenever the query changes\n useEffect(() => setActive(0), [query])\n\n // clamp the highlight if the result set shrinks without a query change (e.g. RBAC pages update)\n useEffect(() => {\n setActive((a) => (a > results.length - 1 ? Math.max(0, results.length - 1) : a))\n }, [results.length])\n\n // close the suggestions on an outside pointerdown\n useEffect(() => {\n if (!open) return\n const onDown = (event: PointerEvent) => {\n if (rootRef.current && !rootRef.current.contains(event.target as Node)) setOpen(false)\n }\n document.addEventListener('pointerdown', onDown)\n return () => document.removeEventListener('pointerdown', onDown)\n }, [open])\n\n const go = (to: string) => {\n navigate({ to: to as LinkProps['to'] })\n setQuery('')\n setOpen(false)\n }\n\n const onKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (!showList) return\n if (event.key === 'ArrowDown') {\n event.preventDefault()\n setActive((i) => (i + 1) % results.length)\n } else if (event.key === 'ArrowUp') {\n event.preventDefault()\n setActive((i) => (i - 1 + results.length) % results.length)\n } else if (event.key === 'Enter') {\n event.preventDefault()\n const hit = results[active]\n if (hit) go(hit.to)\n } else if (event.key === 'Escape') {\n setOpen(false)\n }\n }\n\n return (\n <div\n ref={rootRef}\n className={styles.search}\n role=\"combobox\"\n aria-expanded={showList}\n aria-haspopup=\"listbox\"\n >\n <TextField\n value={query}\n onChange={(event: ChangeEvent<HTMLInputElement>) => {\n setQuery(event.target.value)\n setOpen(true)\n }}\n onFocus={() => setOpen(true)}\n onKeyDown={onKeyDown}\n adornment={<Icon name=\"SearchNormal\" />}\n placeholder={t('sidebar.searchPages')}\n aria-label={t('sidebar.searchPages')}\n autoComplete=\"off\"\n />\n {showList ? (\n <div className={styles.searchPanel}>\n <List role=\"listbox\">\n {results.map((page, i) => (\n <ListItem\n key={page.to}\n description={page.context}\n clickable\n selected={i === active}\n // keep the input focused through the click so blur doesn't close the list first\n onMouseDown={(event: MouseEvent) => event.preventDefault()}\n onMouseEnter={() => setActive(i)}\n onClick={() => go(page.to)}\n >\n {page.label}\n </ListItem>\n ))}\n </List>\n </div>\n ) : null}\n </div>\n )\n}\n\nfunction groupIsActive(group: NavGroup, pathname: string): boolean {\n if (group.to && pathname === group.to) return true\n return group.children?.some((leaf) => leaf.to === pathname) ?? false\n}\n\n/** A small \"New\"-style pill rendered on a menu row from `staticData.badge`. */\nfunction navBadge(text?: string) {\n return text ? <span className={styles.navBadge}>{text}</span> : null\n}\n\n/** A small colored dot indicator on a menu row from `staticData.dot`. */\nfunction navDot(color?: ThemeColor) {\n return color ? (\n <span className={styles.navDot} style={{ background: `var(--tz-color-${color})` }} />\n ) : null\n}\n\n/** The menu row's trailing slot: dot + badge + an optional chevron (omitted entirely when empty). */\nfunction navTrailing(badge?: string, dot?: ThemeColor, chevron?: ReactNode): ReactNode {\n if (badge == null && dot == null && chevron == null) return undefined\n return (\n <>\n {navBadge(badge)}\n {navDot(dot)}\n {chevron}\n </>\n )\n}\n\nfunction NavGroupItem({ group, pathname }: { group: NavGroup; pathname: string }) {\n const active = groupIsActive(group, pathname)\n const hasChildren = !!group.children?.length\n const [open, setOpen] = useState(active)\n\n // re-open when navigation makes this group active via a path the mount-time seed missed\n // (NavSearch, Breadcrumbs, back/forward) — collapsing an active group hides the current page\n useEffect(() => {\n if (active) setOpen(true)\n }, [active])\n\n // a plain level-2 page (no children) — just a link row\n if (!hasChildren && group.to) {\n return (\n <NavLink\n as={Link}\n to={group.to}\n icon={group.icon}\n selected={active}\n clickable\n trailing={navTrailing(group.badge, group.dot)}\n >\n {group.label}\n </NavLink>\n )\n }\n\n const chevron = (\n <Icon\n name=\"ArrowDown4\"\n size=\"sm\"\n className={styles.chevron}\n data-open={open ? 'true' : 'false'}\n />\n )\n\n return (\n <>\n {hasChildren && group.to ? (\n // \"Case B\": the row navigates (and expands); a separate chevron only toggles.\n <NavLink\n as={Link}\n to={group.to}\n icon={group.icon}\n selected={active}\n clickable\n onClick={() => setOpen(true)}\n trailing={navTrailing(\n group.badge,\n group.dot,\n <button\n type=\"button\"\n className={styles.chevronButton}\n aria-label={`${open ? 'Collapse' : 'Expand'} ${group.label}`}\n aria-expanded={open}\n onClick={(event: MouseEvent) => {\n event.preventDefault()\n event.stopPropagation()\n setOpen((o) => !o)\n }}\n >\n {chevron}\n </button>,\n )}\n >\n {group.label}\n </NavLink>\n ) : (\n // a pure container — the whole row toggles its children\n <ListItem\n icon={group.icon}\n selected={active}\n clickable\n aria-expanded={open}\n onClick={() => setOpen((o) => !o)}\n trailing={navTrailing(group.badge, group.dot, chevron)}\n >\n {group.label}\n </ListItem>\n )}\n {hasChildren ? (\n // smooth collapse, same grid-template-rows technique as Card\n <div className={clsx(styles.collapsible, !open && styles.collapsibleClosed)}>\n <div className={styles.collapsibleInner}>\n <List className={styles.leaves}>\n {group.children?.map((leaf) => (\n <NavLink\n key={leaf.to}\n as={Link}\n to={leaf.to}\n icon={<span className={styles.leafDot} />}\n selected={pathname === leaf.to}\n size=\"md\"\n clickable\n trailing={navTrailing(leaf.badge, leaf.dot)}\n >\n {leaf.label}\n </NavLink>\n ))}\n </List>\n </div>\n </div>\n ) : null}\n </>\n )\n}\n"],"names":["NavLink","ListItem","prettify","seg","w","trimSlashes","p","byOrderThenLabel","a","b","buildNavTree","routes","entries","route","sd","path","metaByPath","e","paths","isContainer","o","rawFullPaths","r","groupHasOwnPage","groupKey","chrome","key","modules","getModule","mod","c","topLinks","name","segs","group","l","g","useNavTree","router","useRouter","accessKeys","useAccessKeys","useMemo","_a","hasAccess","firstNavTo","tree","firstChild","useFirstNavTo","usePageTitle","matches","useRouterState","s","i","_b","navigablePaths","set","link","leaf","useBreadcrumbs","homeTo","navigable","items","match","full","FirstRouteRedirect","to","jsx","Navigate","Sidebar","links","pathname","jsxs","styles","List","Link","navTrailing","NavGroupItem","flattenPages","pages","MAX_SEARCH_RESULTS","NavSearch","t","useT","navigate","useNavigate","query","setQuery","useState","open","setOpen","active","setActive","rootRef","useRef","results","q","showList","useEffect","onDown","event","go","onKeyDown","hit","TextField","Icon","page","groupIsActive","navBadge","text","navDot","color","badge","dot","chevron","Fragment","hasChildren","clsx"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- "use strict";const e=require("react/jsx-runtime"),r=require("@tanstack/react-router"),n=({isAuthenticated:t,redirectTo:o="/login",children:u})=>(typeof t=="function"?t():t)?e.jsx(e.Fragment,{children:u}):e.jsx(r.Navigate,{to:o}),a=({isAuthenticated:t,redirectTo:o="/"})=>({beforeLoad:()=>{if(t())throw r.redirect({to:o})},component:r.Outlet});exports.AuthGuard=n;exports.authLayoutRoute=a;
2
- //# sourceMappingURL=authLayoutRoute-CkR9IANN.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"authLayoutRoute-CkR9IANN.cjs","sources":["../src/auth/AuthGuard.tsx","../src/auth/authLayoutRoute.ts"],"sourcesContent":["import { Navigate, type LinkProps } from '@tanstack/react-router'\nimport type { ReactNode } from 'react'\n\nexport interface AuthGuardProps {\n /** Session check — a boolean, or a function that returns one (evaluated on render). */\n isAuthenticated: boolean | (() => boolean)\n /** Where to send an unauthenticated visitor. Defaults to `'/login'`. */\n redirectTo?: string\n /** The protected content, rendered only when authenticated. */\n children: ReactNode\n}\n\n/**\n * Component-level auth guard: renders `children` only when authenticated, otherwise redirects to\n * `redirectTo` via `<Navigate>`. Wrap the authenticated area (a page or a subtree) with it.\n *\n * Requires a `@tanstack/react-router` context (it renders `<Navigate>`), so use it inside a routed\n * tree. `redirectTo` is a plain string — the library can't know the app's typed route tree, so it's\n * cast loosely to the router's `to` type.\n *\n * @example\n * <AuthGuard isAuthenticated={session.isAuthenticated} redirectTo=\"/login\">\n * <Dashboard />\n * </AuthGuard>\n */\nexport const AuthGuard = ({ isAuthenticated, redirectTo = '/login', children }: AuthGuardProps) => {\n const ok = typeof isAuthenticated === 'function' ? isAuthenticated() : isAuthenticated\n return ok ? <>{children}</> : <Navigate to={redirectTo as LinkProps['to']} />\n}\n","import { Outlet, redirect, type LinkProps } from '@tanstack/react-router'\n\nexport interface AuthLayoutRouteOptions {\n /** Session check — returns whether the visitor is already signed in. */\n isAuthenticated: () => boolean\n /** Where to send an **already signed-in** visitor. Defaults to `'/'`. */\n redirectTo?: string\n}\n\n/**\n * Route options for the pathless `_auth` layout that groups the public auth pages (login,\n * forgot-password, reset-password, otp, …). In `beforeLoad` it bounces an already signed-in visitor to\n * `redirectTo`; otherwise it renders its children standalone (`component: Outlet`).\n *\n * Returns only the route **options** (`beforeLoad` + `component`) — not a whole route — because the\n * router plugin needs the literal path in the file. Compose it with `createFileRoute('/_auth')`.\n * `redirectTo` is a plain string, cast loosely to the router's `to` type (the library can't know the\n * app's typed route tree).\n *\n * @example\n * // routes/_auth.tsx\n * export const Route = createFileRoute('/_auth')(\n * authLayoutRoute({ isAuthenticated: session.isAuthenticated }),\n * )\n */\nexport const authLayoutRoute = ({ isAuthenticated, redirectTo = '/' }: AuthLayoutRouteOptions) => ({\n beforeLoad: () => {\n if (isAuthenticated()) throw redirect({ to: redirectTo as LinkProps['to'] })\n },\n component: Outlet,\n})\n"],"names":["AuthGuard","isAuthenticated","redirectTo","children","jsx","Fragment","Navigate","authLayoutRoute","redirect","Outlet"],"mappings":"sFAyBaA,EAAY,CAAC,CAAE,gBAAAC,EAAiB,WAAAC,EAAa,SAAU,SAAAC,MACvD,OAAOF,GAAoB,WAAaA,IAAoBA,GAC3DG,EAAAA,IAAAC,EAAAA,SAAA,CAAG,SAAAF,CAAA,CAAS,EAAMC,EAAAA,IAACE,EAAAA,SAAA,CAAS,GAAIJ,CAAA,CAA+B,ECFhEK,EAAkB,CAAC,CAAE,gBAAAN,EAAiB,WAAAC,EAAa,QAAmC,CACjG,WAAY,IAAM,CAChB,GAAID,IAAmB,MAAMO,EAAAA,SAAS,CAAE,GAAIN,EAA+B,CAC7E,EACA,UAAWO,EAAAA,MACb"}