@sqrzro/admin 2.1.0-bz.16 → 2.1.0-bz.18

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 (89) hide show
  1. package/dist/index.cjs +205 -0
  2. package/dist/index.cjs.map +1 -0
  3. package/dist/index.d.cts +169 -0
  4. package/dist/index.d.ts +169 -3
  5. package/dist/index.js +16 -3
  6. package/dist/index.js.map +1 -0
  7. package/package.json +28 -14
  8. package/dist/components/AppLayout/index.d.ts +0 -9
  9. package/dist/components/AppLayout/index.js +0 -14
  10. package/dist/components/AppNavigation/index.d.ts +0 -6
  11. package/dist/components/AppNavigation/index.js +0 -16
  12. package/dist/components/Auth/index.d.ts +0 -5
  13. package/dist/components/Auth/index.js +0 -15
  14. package/dist/components/Badge/index.d.ts +0 -8
  15. package/dist/components/Badge/index.js +0 -11
  16. package/dist/components/BooleanFilter/index.d.ts +0 -5
  17. package/dist/components/BooleanFilter/index.js +0 -19
  18. package/dist/components/Config/index.d.ts +0 -6
  19. package/dist/components/Config/index.js +0 -9
  20. package/dist/components/Dashboard/index.d.ts +0 -7
  21. package/dist/components/Dashboard/index.js +0 -5
  22. package/dist/components/DateFilter/index.d.ts +0 -6
  23. package/dist/components/DateFilter/index.js +0 -31
  24. package/dist/components/DropdownFilter/index.d.ts +0 -6
  25. package/dist/components/DropdownFilter/index.js +0 -9
  26. package/dist/components/FilterBar/index.d.ts +0 -9
  27. package/dist/components/FilterBar/index.js +0 -21
  28. package/dist/components/FilterBarItem/index.d.ts +0 -15
  29. package/dist/components/FilterBarItem/index.js +0 -31
  30. package/dist/components/GridList/index.d.ts +0 -5
  31. package/dist/components/GridList/index.js +0 -7
  32. package/dist/components/GridListItem/index.d.ts +0 -4
  33. package/dist/components/GridListItem/index.js +0 -8
  34. package/dist/components/Icon/index.d.ts +0 -8
  35. package/dist/components/Icon/index.js +0 -23
  36. package/dist/components/InfoPanel/index.d.ts +0 -8
  37. package/dist/components/InfoPanel/index.js +0 -22
  38. package/dist/components/List/index.d.ts +0 -25
  39. package/dist/components/List/index.js +0 -39
  40. package/dist/components/ListAction/index.d.ts +0 -7
  41. package/dist/components/ListAction/index.js +0 -9
  42. package/dist/components/ListActions/index.d.ts +0 -8
  43. package/dist/components/ListActions/index.js +0 -12
  44. package/dist/components/ListItem/index.d.ts +0 -18
  45. package/dist/components/ListItem/index.js +0 -16
  46. package/dist/components/MeActions/index.d.ts +0 -3
  47. package/dist/components/MeActions/index.js +0 -6
  48. package/dist/components/MePanel/index.d.ts +0 -8
  49. package/dist/components/MePanel/index.js +0 -6
  50. package/dist/components/Page/index.d.ts +0 -12
  51. package/dist/components/Page/index.js +0 -12
  52. package/dist/components/PageActions/index.d.ts +0 -6
  53. package/dist/components/PageActions/index.js +0 -13
  54. package/dist/components/Panel/index.d.ts +0 -7
  55. package/dist/components/Panel/index.js +0 -5
  56. package/dist/components/RootLayout/index.d.ts +0 -9
  57. package/dist/components/RootLayout/index.js +0 -21
  58. package/dist/components/SettingsForm/index.d.ts +0 -9
  59. package/dist/components/SettingsForm/index.js +0 -14
  60. package/dist/components/SettingsPage/index.d.ts +0 -3
  61. package/dist/components/SettingsPage/index.js +0 -9
  62. package/dist/components/Table/index.d.ts +0 -9
  63. package/dist/components/Table/index.js +0 -17
  64. package/dist/components/TableClientComponent/index.d.ts +0 -16
  65. package/dist/components/TableClientComponent/index.js +0 -57
  66. package/dist/components/Tabs/index.d.ts +0 -8
  67. package/dist/components/Tabs/index.js +0 -11
  68. package/dist/components/index.d.ts +0 -33
  69. package/dist/components/index.js +0 -17
  70. package/dist/icons/ErrorIcon/index.d.ts +0 -3
  71. package/dist/icons/ErrorIcon/index.js +0 -5
  72. package/dist/icons/InfoIcon/index.d.ts +0 -3
  73. package/dist/icons/InfoIcon/index.js +0 -5
  74. package/dist/icons/SuccessIcon/index.d.ts +0 -3
  75. package/dist/icons/SuccessIcon/index.js +0 -5
  76. package/dist/icons/WarningIcon/index.d.ts +0 -3
  77. package/dist/icons/WarningIcon/index.js +0 -5
  78. package/dist/interfaces.d.ts +0 -4
  79. package/dist/interfaces.js +0 -1
  80. package/dist/services/ConfigService.d.ts +0 -11
  81. package/dist/services/ConfigService.js +0 -14
  82. package/dist/services/LayoutService.d.ts +0 -7
  83. package/dist/services/LayoutService.js +0 -9
  84. package/dist/styles/config.d.ts +0 -3
  85. package/dist/styles/config.js +0 -145
  86. package/dist/styles/postcss.d.ts +0 -6
  87. package/dist/styles/postcss.js +0 -4
  88. package/dist/styles/tailwind.d.ts +0 -10
  89. package/dist/styles/tailwind.js +0 -72
package/dist/index.cjs ADDED
@@ -0,0 +1,205 @@
1
+ 'use strict';
2
+
3
+ var components = require('@sqrzro/components');
4
+ var headers = require('next/headers');
5
+ var react = require('react');
6
+ var utility = require('@sqrzro/utility');
7
+ var navigation = require('next/navigation');
8
+ var jsxRuntime = require('react/jsx-runtime');
9
+ var hooks = require('@sqrzro/hooks');
10
+ var reactDom = require('react-dom');
11
+ var google = require('next/font/google');
12
+
13
+ var D={app:{name:"Square Zero",url:"http://localhost:8080"},navigation:[]};function L(e,t){return D={...e,logo:t},D}function E(){return D}async function x(){return Promise.resolve(headers.cookies().get("layout")?.value||"topbar")}async function te(e){return headers.cookies().set("layout",e.layout),Promise.resolve([!0,null])}async function h(e){if(process.env.APP_ENV!=="production"&&process.env.DANGEROUSLY_DISABLE_PERMISSIONS)return Promise.resolve(e);let t=headers.cookies().get("permissions")?.value;if(!t)return Promise.resolve([]);let r=[];try{r=JSON.parse(t);}catch{return Promise.resolve([])}return Promise.resolve(e.filter(({permission:o})=>o?(Array.isArray(o)?o:[o]).every(a=>r.includes(a)):!0))}function Ye(e,t){return t.filter(r=>r&&e.startsWith(`/${r.replace(/^\//u,"")}`)).sort((r,o)=>!r||!o?0:o.length-r.length)[0]||""}function Je(e,t){let[r,o]=react.useState(""),n=navigation.usePathname(),a=e.map(({href:i})=>utility.joinUrl(t?.basePath,i));return react.useEffect(()=>{o(Ye(n,a));},[n]),e.map(({href:i,label:s})=>({href:utility.joinUrl(t?.basePath,i),isActive:utility.joinUrl(t?.basePath,i)===r,label:s}))}var k=Je;function Ke({data:e,layout:t}){let r=k(e);return jsxRuntime.jsx("nav",{className:components.tw("h-full",t==="sidebar"?"w-full":"pl-6"),children:jsxRuntime.jsx("ul",{className:components.tw("flex h-full gap-2",t==="sidebar"?"flex-col items-start":"items-center"),children:r.map(({href:o,isActive:n,label:a})=>jsxRuntime.jsx("li",{className:components.tw(t==="sidebar"?null:"h-full"),children:jsxRuntime.jsx(components.Link,{className:components.tw("relative flex h-full items-center px-1 font-semibold",n?"before:bg-primary text-white before:absolute before:bottom-0 before:left-0 before:right-0 before:h-1":"text-white/80 hover:text-white"),href:o,children:a})},o))})})}var re=Ke;async function Ze({layout:e}){return jsxRuntime.jsx(re,{data:await h(E().navigation),layout:e})}var oe=Ze;function rt(){return jsxRuntime.jsxs("ul",{className:"flex gap-2 text-xs text-slate-300",children:[jsxRuntime.jsx("li",{children:jsxRuntime.jsx(components.Link,{href:"/settings",children:"Settings"})}),jsxRuntime.jsx("li",{children:jsxRuntime.jsx(components.LogoutButton,{})})]})}var ae=rt;function nt({layout:e,user:t}){return jsxRuntime.jsxs("div",{className:components.tw("ml-auto flex items-center gap-3",e==="sidebar"?"flex-row-reverse":null),children:[jsxRuntime.jsxs("div",{className:"flex flex-col items-end gap-0.5 text-white",children:[jsxRuntime.jsx("strong",{children:t?.name}),jsxRuntime.jsx(ae,{})]}),jsxRuntime.jsx("div",{className:"h-9 w-9 flex-none rounded-full border-4 border-slate-500"})]})}var ie=nt;async function st({children:e,user:t}){let r=E(),o=await x();return jsxRuntime.jsxs("div",{className:components.tw("",o==="sidebar"?"grid grid-cols-[12rem_1fr]":null),children:[jsxRuntime.jsx("header",{className:"bg-slate-800",children:jsxRuntime.jsx(components.Container,{isFullWidth:!0,children:jsxRuntime.jsxs("div",{className:components.tw("flex items-center",o==="sidebar"?"-mx-4 h-screen flex-col py-4":"h-16 border-b border-slate-700"),children:[jsxRuntime.jsxs(components.Link,{className:components.tw(o==="sidebar"?"h-12 w-12":"h-9 w-9"),href:"/",children:[r.logo?.(),jsxRuntime.jsx("span",{className:"sr-only",children:r.app.name})]}),jsxRuntime.jsx(oe,{layout:o}),jsxRuntime.jsx(ie,{layout:o,user:t})]})})}),jsxRuntime.jsx("main",{className:"mb-10 block",children:e})]})}var mt=st;var pt={root:"bg-slate-800 gap-8",logo:"mx-auto flex h-12 w-32 items-end",panel:"rounded bg-white p-8 shadow-lg pb-10",title:"text-lg font-semibold mb-6 leading-none",link:"font-semibold text-link",actions:"pt-2 w-full",footer:"-mb-2"};function ct(e){return jsxRuntime.jsx(components.Auth,{...e,classNames:pt})}var ft=ct;var bt={danger:"bg-red-100 text-red-700",error:"bg-red-100 text-red-700",info:"bg-sky-100 text-sky-700",warning:"bg-yellow-100 text-yellow-700",success:"bg-green-100 text-green-700"},gt={danger:"fill-red-400",error:"fill-red-400",info:"fill-sky-400",warning:"fill-yellow-400",success:"fill-green-400"};function xt({children:e,variant:t}){return jsxRuntime.jsxs("strong",{className:components.tw("inline-flex items-center gap-1.5 rounded-full bg-slate-100 px-2 py-1 text-xs font-medium text-slate-600",t?bt[t]:null),children:[jsxRuntime.jsx("svg",{"aria-hidden":"true",className:components.tw("h-1.5 w-1.5 fill-slate-400",t?gt[t]:null),viewBox:"0 0 6 6",children:jsxRuntime.jsx("circle",{cx:"3",cy:"3",r:"3"})}),e]})}var ht=xt;function Pt({children:e,title:t}){return jsxRuntime.jsxs("div",{className:"py-8",children:[jsxRuntime.jsx("h1",{className:"mx-auto text-center text-4xl font-semibold",children:t}),e]})}var vt=Pt;function Ft({onClick:e}){return jsxRuntime.jsxs("button",{className:"absolute right-0 top-0 flex h-full w-10 select-none items-center justify-center",onClick:e,type:"button",children:[jsxRuntime.jsx("span",{className:"sr-only",children:"Remove"}),jsxRuntime.jsx("span",{className:"flex h-4 w-4 items-center justify-center rounded-full bg-white leading-none text-slate-800",children:"\xD7"})]})}var T=Ft;var de=[{id:"0",name:"No"},{id:"1",name:"Yes"}];function Lt({name:e,onChange:t,value:r}){return jsxRuntime.jsx(components.Dropdown,{data:de,name:e,onChange:t,value:r,isPanelOnly:!0})}function pe(e){return de.find(t=>t.id===e)?.name||""}var ce=Lt;function St({name:e,onChange:t,value:r}){return jsxRuntime.jsx(components.CalendarInput,{name:e,onChange:t,value:r,isPanelOnly:!0,isRange:!0})}function ue(e){return e||""}var At=4;function fe(e,t){let r=new Date(e);if(Number.isNaN(r.getTime()))return "";let o=r.getDate().toString().padStart(2,"0"),n=(r.getMonth()+1).toString().padStart(2,"0"),a=r.getFullYear();return `${o}/${n}${t?"":`/${a}`}`}function be(e){if(e.includes(",")){let r=e.split(",").map(o=>parseInt(o.substring(0,At),10));return e.split(",").map(o=>fe(o,r[0]===r[1]&&r[0]===new Date().getFullYear())).join(" - ")}return fe(e)}var ge=St;function Ot({data:e,name:t,onChange:r,value:o}){return jsxRuntime.jsx(components.Dropdown,{data:e,name:t,onChange:r,value:o,isPanelOnly:!0})}function xe(e,t){return t?.find(r=>r.id===e)?.name||""}var he=Ot;var jt={boolean:{component:ce,renderValue:pe},date:{component:ge,renderValue:be,size:"w-96",transformValue:ue},dropdown:{component:he,renderValue:xe}},Mt="w-56";function _t({data:e,label:t,name:r,onChange:o,type:n,value:a}){let i=react.useRef(null);function s(v){o(r,v.target.value),i.current?.hidePopover();}function c(){o(r,"");}let{component:P,renderValue:p,size:l,transformValue:g}=jt[n];return jsxRuntime.jsxs("li",{className:components.tw("relative inline-flex h-8 items-center gap-2 rounded-full border px-5 text-xs text-white",a?"border-solid border-slate-400":"border-dashed border-slate-400",a?"bg-slate-700 pr-10":"text-slate-300"),children:[jsxRuntime.jsx("p",{className:"",children:t}),a?jsxRuntime.jsx("p",{className:"border-l border-l-slate-300 pl-2 font-semibold",children:p(a,e)}):null,jsxRuntime.jsx("button",{className:components.tw("absolute left-0 top-0 h-full select-none text-transparent",a?"right-10":"right-0"),id:`${r}-control`,popovertarget:`${r}-target`,type:"button",children:"Edit"}),a?jsxRuntime.jsx(T,{onClick:c}):null,jsxRuntime.jsx("div",{ref:i,anchor:`${r}-control`,className:components.tw("show left-[anchor(left)] top-[anchor(bottom)] -ml-px mt-2 origin-top-left origin-top-left rounded bg-white shadow-lg",l||Mt),id:`${r}-target`,popover:"auto",children:jsxRuntime.jsx("div",{className:"py-1",role:"none",children:jsxRuntime.jsx(P,{data:e,name:r,onChange:s,value:g?g(a):a})})})]})}var ye=_t;function Ht({hasSearch:e,map:t}){let r=navigation.useRouter(),[o,n]=hooks.useFilters(),[a,i]=react.useState(o.get("search")||"");function s(l,g){n(l,g),r.refresh();}function c(l){i(l.target.value||"");}function P(){i(""),n("search","");}function p(l){l.key==="Enter"&&n("search",l.currentTarget.value);}return jsxRuntime.jsxs("ul",{className:"relative flex gap-2 before:absolute before:left-[calc(50%-50vw)] before:top-full before:h-24 before:w-screen before:bg-slate-800",children:[e?jsxRuntime.jsxs("li",{className:"relative",children:[jsxRuntime.jsx(components.TextInput,{classNames:{root:{default:components.tw("h-8 w-56 rounded-full border border-slate-400 px-3 text-xs text-white placeholder:text-slate-300",o.get("search")?"bg-slate-700":"bg-transparent focus:bg-slate-700")}},name:"search",onChange:c,onKeyDown:p,placeholder:"Search...",value:a}),o.get("search")?jsxRuntime.jsx(T,{onClick:P}):null]}):null,(t||[]).map(l=>jsxRuntime.jsx(ye,{onChange:s,value:o.get(l.name)||"",...l},l.name))]})}var U=Ht;function G(e){return e?Array.isArray(e)?jsxRuntime.jsx("ul",{className:"flex items-center gap-4 text-xs text-slate-600",children:e.map(t=>jsxRuntime.jsx("li",{children:t},String(t)))}):jsxRuntime.jsx("table",{className:"w-full text-xs",children:jsxRuntime.jsx("tbody",{children:Object.entries(e).map(([t,r])=>jsxRuntime.jsxs("tr",{className:"odd:bg-slate-100",children:[jsxRuntime.jsx("th",{className:"p-2 font-semibold",children:t}),jsxRuntime.jsx("td",{className:"p-2 text-right",children:r||"-"})]},t))})}):null}function Yt({actions:e,description:t,href:r,id:o,meta:n,title:a}){return jsxRuntime.jsx("li",{children:jsxRuntime.jsxs("article",{className:"bg-panel overflow-hidden rounded p-4 shadow-[0px_0px_0px_1px_rgba(9,9,11,0.07),0px_2px_2px_0px_rgba(9,9,11,0.05)]",children:[a?jsxRuntime.jsx("h2",{className:"text-lg font-semibold",children:r?jsxRuntime.jsx(components.Link,{href:r,children:a}):a}):null,t?jsxRuntime.jsx("div",{children:t}):null,n||e?jsxRuntime.jsxs("div",{className:"mt-4 flex items-center justify-between border-t border-slate-200 pt-3",children:[n?G(n):null,e?jsxRuntime.jsx(e,{id:o}):null]}):null]})})}var ve=Yt;function Jt({href:e,image:t,imageHref:r,meta:o,subtitle:n,title:a}){return jsxRuntime.jsx("li",{children:jsxRuntime.jsxs("article",{className:"bg-panel overflow-hidden rounded p-4 shadow",children:[jsxRuntime.jsx("div",{className:"relative mb-4 h-64 rounded border border border-slate-300 bg-slate-50 p-4",children:t?jsxRuntime.jsxs(react.Fragment,{children:[jsxRuntime.jsx("img",{alt:"",className:"h-full w-full object-contain",src:t}),r?jsxRuntime.jsx(components.Link,{className:"absolute inset-0",href:r,scroll:!1,children:jsxRuntime.jsx("span",{className:"sr-only",children:"Edit Image"})}):null]}):r?jsxRuntime.jsxs(components.Link,{className:"absolute inset-0 flex flex-col items-center justify-center gap-3 font-semibold text-slate-500",href:r,scroll:!1,children:[jsxRuntime.jsx("i",{className:"block h-12 w-12 rounded-full border-2 border-slate-300"}),"Add Image"]}):null}),jsxRuntime.jsx("h2",{className:"text-base font-semibold",children:e?jsxRuntime.jsx(components.Link,{href:e,children:a}):a}),n?jsxRuntime.jsx("p",{className:"text-xs text-slate-500",children:n}):null,o?jsxRuntime.jsxs(react.Fragment,{children:[jsxRuntime.jsx("hr",{className:"my-4"}),jsxRuntime.jsx("div",{className:"flex items-center justify-between",children:o?G(o):null})]}):null,e?jsxRuntime.jsxs(react.Fragment,{children:[jsxRuntime.jsx("hr",{className:"my-4"}),jsxRuntime.jsx(components.Link,{href:e,scroll:!1,children:"Edit"})]}):null]})})}var Re=Jt;function Zt(){return {id:0,title:""}}var Qt=["action"];function er(e){return Array.from(e.entries()).some(([t,r])=>!Qt.includes(t)&&!!r)}async function tr({actions:e,columns:t,emptyMessageProps:r,filters:o,fn:n,hasSearch:a,isMinimal:i,params:s,renderItem:c=ve,transformer:P}){let p;try{let{headers:R}=await import('next/headers');p=new URLSearchParams(R().get("x-search-params")||"");}catch{p=new URLSearchParams;}let[l,g]=await n(s,p);if(!Array.isArray(l))throw new Error("Response is not an array. Did you forget to return an Errorable object in the function?");if(g)return jsxRuntime.jsx("div",{children:"Error"});let v=await h(l.map(P||Zt)),Q=er(p),Ue=Q?{children:"Try adjusting the filters above. If you think this is a mistake, please contact your site administrator.",title:"No results match the current filters"}:r;return jsxRuntime.jsxs(react.Fragment,{children:[(o||a)&&(v.length||Q)?jsxRuntime.jsx(U,{hasSearch:a,map:o}):null,v.length?jsxRuntime.jsx("ul",{className:components.tw("relative",t?"grid grid-cols-3 gap-6":"flex flex-col gap-4"),children:v.map(R=>jsxRuntime.jsx(react.Fragment,{children:c({actions:e,...R})},R.id))}):jsxRuntime.jsx(components.EmptyMessage,{...Ue,classNameProps:{isMinimal:i}})]})}var W=tr;function or(e){return jsxRuntime.jsx(W,{...e,columns:3,renderItem:Re})}var ar=or;var ir={danger:"bg-[url(/admin/images/danger.svg)]",info:"bg-[url(/admin/images/info.svg)]",success:"bg-[url(/admin/images/success.svg)]",warning:"bg-[url(/admin/images/warning.svg)]"},lr={danger:"bg-red-50 text-red-700",info:"bg-sky-50 text-sky-700",success:"bg-green-50 text-green-700",warning:"bg-yellow-50 text-yellow-700"};function sr({children:e,variant:t="info"}){return jsxRuntime.jsxs("aside",{className:components.tw("grid grid-cols-[1rem_auto] gap-4 rounded p-4",lr[t]),children:[jsxRuntime.jsx("i",{className:components.tw("aspect-square bg-contain bg-no-repeat",ir[t])}),jsxRuntime.jsx("div",{children:e})]})}var mr=sr;function cr({id:e,onClick:t,label:r,variant:o}){function n(){t(e);}return jsxRuntime.jsx(components.ConfirmableButton,{onClick:n,variant:o,isText:!0,children:r})}var Ce=cr;function br({actions:e,id:t}){let[r,o,n]=hooks.useClickOutside();function a(){o(!r);}return jsxRuntime.jsxs("div",{ref:n,className:"flex flex-row-reverse items-center gap-4",children:[jsxRuntime.jsxs("button",{className:"h-4 rotate-90 text-xs leading-[1em] tracking-tighter text-slate-500",onClick:a,type:"button",children:["\u2022\u2022\u2022",jsxRuntime.jsxs("span",{className:"sr-only",children:[r?"Close":"Open"," Actions"]})]}),r?jsxRuntime.jsx("ul",{className:"show relative flex origin-right gap-4 bg-white before:absolute before:-bottom-2 before:-top-2 before:left-[-999em] before:right-full before:bg-white/80",children:e.map(({label:i,onClick:s,variant:c})=>jsxRuntime.jsx("li",{children:jsxRuntime.jsx(Ce,{id:t,label:i,onClick:s,variant:c})},i))}):null]})}var gr=br;function yr({basePath:e="",data:t}){let r=k(t,{basePath:e});return jsxRuntime.jsx("nav",{children:jsxRuntime.jsx("ul",{className:"flex gap-4",children:r.map(({href:o,isActive:n,label:a})=>jsxRuntime.jsx("li",{children:jsxRuntime.jsx(components.Link,{className:components.tw("block border-b-4 border-transparent px-1 pb-2 font-semibold",n?"border-primary":"opacity-80 hover:opacity-100"),href:o,children:a})},o))})})}var Le=yr;async function vr({basePath:e,data:t}){return jsxRuntime.jsx(Le,{basePath:e,data:await h(utility.filterNull(t))})}var Ee=vr;async function Nr({basePath:e,children:t,isFullWidth:r,tabs:o,title:n}){let a=await x();return jsxRuntime.jsxs(react.Fragment,{children:[jsxRuntime.jsx("header",{className:components.tw("",a==="sidebar"?"bg-slate-200":"bg-slate-800 pb-16 text-white"),children:jsxRuntime.jsxs(components.Container,{isFullWidth:a==="sidebar"||r,children:[jsxRuntime.jsxs("div",{className:"flex items-center justify-between py-10",children:[jsxRuntime.jsx("h1",{className:"min-h-10 text-3xl font-semibold",children:n}),jsxRuntime.jsx("div",{className:"flex gap-2",id:"page-actions"})]}),o?jsxRuntime.jsx("div",{className:components.tw("-mt-4",a==="sidebar"?"":"mb-8 border-b border-slate-700"),children:jsxRuntime.jsx(Ee,{basePath:e,data:utility.filterNull(o)})}):null]})}),jsxRuntime.jsx(components.Container,{isFullWidth:a==="sidebar"||r,children:jsxRuntime.jsx("div",{className:components.tw("flex flex-col gap-8",a==="sidebar"?"mt-8":"-mt-16"),children:t})})]})}var Z=Nr;function Lr({action:e,children:t,title:r}){return jsxRuntime.jsxs("article",{className:"bg-panel relative overflow-hidden rounded p-6 shadow-[0px_0px_0px_1px_rgba(9,9,11,0.07),0px_2px_2px_0px_rgba(9,9,11,0.05)]",children:[r?jsxRuntime.jsxs("header",{children:[jsxRuntime.jsx("h3",{className:"mb-4 border-b border-slate-200 pb-3 text-lg font-semibold leading-none",children:r}),e?jsxRuntime.jsx(components.Button,{href:e.href,children:e.label}):null]}):null,t]})}var Er=Lr;function Tr({children:e}){let t=react.useRef(null),[r,o]=react.useState(!1);return react.useEffect(()=>{t.current=document.getElementById("page-actions"),o(!0);},[]),r&&t.current?reactDom.createPortal(e,t.current):null}var Or=Tr;var Dr=components.twx({actionList:()=>({root:"flex gap-2"}),button:e=>({root:{danger:"border-red-500 bg-red-500 text-white",default:components.tw("text-md h-10 rounded border border-slate-300 bg-white px-5 text-slate-600",e?.isFullWidth?"w-full":null),primary:"bg-button-bg text-button-text border-none font-semibold"}}),calendar:()=>({root:"p-4 pb-3 text-sm text-slate-600",head:"pb-2 text-center text-xs text-slate-400",month:"w-full table-fixed",day:{default:"h-10 border border-slate-200",highlighted:"bg-slate-100",selected:"bg-slate-200"}}),calendarNavigation:()=>({root:"mb-6 flex items-center justify-between",title:"text-base font-semibold",control:"h-6 w-6 rounded-full border border-slate-300",previous:"-order-1"}),checkboxInput:e=>({root:components.tw("flex",e?.isInline?"gap-6":"flex-col gap-2"),icon:{default:"h-6 w-6 rounded border border-slate-300",checked:"bg-green-500"},label:"pl-2 font-semibold"}),codeInput:()=>({input:{default:"focus:border-primary h-10 rounded border border-slate-300 text-center",error:"border-red-500"}}),definitionList:()=>({root:"flex flex-col gap-4",row:"border-b border-slate-200 pb-4",term:"pb-1 text-slate-500"}),dropdown:()=>({list:"overflow-hidden rounded",item:{default:"block p-3 text-sm text-slate-700",selected:"bg-slate-100"},title:"block leading-none",meta:"mt-1 block text-xs leading-none text-slate-500",icon:"mr-2 h-5 w-5 bg-[url(/admin/images/chevron.svg)] bg-contain bg-center bg-no-repeat",clear:"mr-2 h-4 w-4 bg-[url(/admin/images/close.svg)] bg-contain bg-center bg-no-repeat"}),editableFieldset:()=>({root:"bg-panel grid grid-cols-[30%_1fr] gap-8 rounded p-8 shadow",title:"mb-8 text-lg font-semibold leading-none text-slate-700",description:"text-slate-600",actions:"flex justify-end gap-2 border-t border-slate-200 pt-4"}),editableFormField:()=>({root:"grid grid-cols-[25%_1fr] border-t border-slate-200 py-4",label:"flex items-center font-semibold leading-none",field:"flex min-h-10 items-center"}),emptyMessage:e=>({root:components.tw("relative mx-auto mt-4 w-full max-w-2xl p-16 text-center text-slate-500",e?.isMinimal?null:"rounded bg-white shadow before:pointer-events-none before:absolute before:inset-2 before:border-2 before:border-dashed"),title:"mb-2 text-pretty text-xl font-semibold leading-tight",description:"text-pretty",action:"mt-6 flex justify-center"}),fieldset:()=>({root:"rounded bg-white p-8 shadow",title:"mb-8 text-lg font-semibold leading-none text-slate-700"}),form:()=>({root:"flex flex-col gap-6"}),formField:e=>({root:{default:e?.isEditable?"grid grid-cols-[25%_1fr] border-t border-slate-200 py-4":""},label:components.tw("flex font-semibold leading-none",e?.isEditable?"items-center":"mb-2 justify-between"),details:"mb-2 text-xs font-normal leading-none text-slate-500",optional:"pl-2 text-xs font-normal leading-none text-slate-500",error:components.tw("mt-2 flex items-center gap-1.5 text-red-600 before:h-4 before:w-4 before:rounded-full before:bg-[url(/admin/images/danger.svg)] before:bg-contain",e?.isEditable?"col-start-2":"")}),imageInput:()=>({root:"h-64 rounded border border-slate-300 bg-slate-50 p-8",icon:"mx-auto mb-2 block h-12 w-12 rounded-full border-2 border-slate-300",title:"mb-1 font-semibold",description:"text-xs italic text-slate-700"}),inputPanel:()=>({root:"show my-1 origin-top rounded border border-slate-300 bg-white shadow-md"}),loadingModal:()=>({root:"open:backdrop:fade py-16 backdrop:bg-slate-700/50 backdrop:backdrop-blur-sm",panel:"text-center text-lg font-semibold text-white"}),modal:()=>({root:"open:backdrop:fade py-16 backdrop:bg-slate-700/50 backdrop:backdrop-blur-sm",panel:"show bg-panel row-start-2 mx-auto w-full max-w-lg rounded p-6 text-left shadow-xl",title:"mb-6 text-lg font-semibold",actions:"flex justify-end"}),multiInput:()=>({root:"flex flex-col gap-2 pt-2",row:"grid grid-cols-[1fr_auto] has-[>_button]:gap-2"}),objectInput:()=>({root:"flex flex-col gap-2"}),passwordInput:()=>({action:{default:"mr-2 h-6 w-6 overflow-hidden bg-[url(/admin/images/eye.svg)] bg-no-repeat indent-12",selected:"bg-bottom"}}),staticTextInput:()=>({root:{default:"text-md flex min-h-10 flex-col justify-center rounded border border-slate-300 bg-white p-3",error:"border-red-500"},label:"block leading-none",meta:"mt-1 block text-xs leading-none text-slate-500",placeholder:"block leading-none text-slate-500"}),switch:()=>({root:"flex gap-4",input:{default:"h-6 w-10 flex-none cursor-pointer rounded-full bg-slate-300 p-1 transition-colors",checked:"bg-green-500"},control:{default:"h-4 w-4 translate-x-0 transform rounded-full bg-white shadow-md transition-transform",checked:"translate-x-full"},label:"font-semibold",details:"block text-xs text-slate-500"}),textArea:()=>({root:{default:"text-md focus:border-primary rounded border border-slate-300 px-3 py-2",error:"border-red-500"}}),textButton:()=>({root:{danger:"text-red-600"}}),textInput:()=>({root:{default:"text-md focus:border-primary h-10 rounded border border-slate-300 px-3",error:"border-red-500"},prefix:{default:"peer-focus:border-primary relative -mr-1 rounded-l border border-slate-300 bg-white px-3 text-sm text-slate-600"}}),toast:()=>({root:{default:"rounded border px-4 py-2",success:"border-green-300 bg-green-100 text-green-700",error:"border-red-300 bg-red-100 text-red-700"}})}),Ie=Dr;function jr({data:e}){return e&&L(e),null}var Te=jr;var qr=google.Inter({subsets:["latin"],variable:"--font-inter"});function Ur({children:e,config:t,logo:r}){return t&&L(t,r),jsxRuntime.jsxs("html",{lang:"en",children:[jsxRuntime.jsx("head",{}),jsxRuntime.jsxs("body",{className:components.tw(qr.variable,"overflow-x-hidden overflow-y-scroll bg-slate-50 font-sans text-sm text-slate-800 has-[[data-modal][open]]:overflow-hidden"),children:[jsxRuntime.jsx("script",{dangerouslySetInnerHTML:{__html:"(function(d){var v=d.createElement('div'),t=d.createElement('style'),s=v.style;s.overflowY='scroll';s.width='50';s.height='50';d.body.append(v);t.innerHTML='body:has([data-modal][open]){padding-right:'+(v.offsetWidth-v.clientWidth)+'px}';d.body.append(t);v.remove()}(document))"}}),jsxRuntime.jsx(Te,{data:t}),jsxRuntime.jsx(components.ClassNames,{data:Ie}),e,jsxRuntime.jsx(components.Toaster,{})]})]})}var $r=Ur;var Be={sidebar:"Side bar",topbar:"Top bar"};function Jr({defaults:e}){let{fieldProps:t,formProps:r}=hooks.useEditableForm({defaults:e,onSubmit:te});return jsxRuntime.jsxs(components.EditableForm,{title:"Appearance",...r,children:[jsxRuntime.jsx(components.EditableRadioFormField,{...t("layout"),options:Be,renderValue:o=>o&&Be[o]||"-"}),jsxRuntime.jsx(components.EditableSwitchFormField,{...t("isDark"),label:"Dark mode"})]})}var je=Jr;async function Kr({children:e}){let t=await x();return jsxRuntime.jsx(Z,{title:"Settings",children:jsxRuntime.jsxs("div",{className:"flex flex-col gap-6",children:[jsxRuntime.jsx(je,{defaults:{layout:t}}),e]})})}var Zr=Kr;function oo(e,t,r){let o=new URLSearchParams({...Object.fromEntries(t),...r});return `${e}?${o.toString()}`}function ao(e,t){return t&&e==="asc"?"desc":"asc"}function no(e,t,r){let o=ao(t.get("dir"),t.get("sort")===r);return oo(e,t,{sort:r,dir:o})}function io(e,t){return e.get("sort")===t?{dir:e.get("dir")}:{dir:null}}function lo(e){return e.every(t=>typeof t=="string")}function so(e){return e.length===0?[]:lo(e)?e.map(t=>({key:t})):e}function mo({columns:e,data:t}){let r=navigation.usePathname(),o=navigation.useSearchParams(),n=so(e),a=n.some(i=>i.title);return jsxRuntime.jsx("div",{className:"bg-white shadow-sm",children:jsxRuntime.jsxs("table",{className:"w-full",children:[a?jsxRuntime.jsx("thead",{children:jsxRuntime.jsx("tr",{children:n.map(i=>jsxRuntime.jsx("th",{className:components.tw("p-4",i.type==="number"?"text-right":"text-left"),children:i.title?jsxRuntime.jsxs(components.Link,{href:no(r,o,i.key),children:[i.title," "]}):null},i.key))})}):null,jsxRuntime.jsx("tbody",{children:t.map(i=>jsxRuntime.jsx("tr",{className:"odd:bg-slate-100",children:n.map(s=>jsxRuntime.jsx("td",{className:components.tw("border-x border-transparent p-4",io(o,s.key).dir?"border-sky-300 bg-sky-300/10":"",s.type==="number"?"text-right":"text-left"),children:i[s.key]},s.key))},i.id))})]})})}var ze=mo;function po(e){return {id:e.id,...e}}async function co({columns:e,fn:t,searchParams:r}){let[o,n]=await t(r);if(n)return jsxRuntime.jsx("div",{children:"Error"});let a=o.map(po);return jsxRuntime.jsx(ze,{columns:e,data:a})}var fo=co;
14
+
15
+ Object.defineProperty(exports, "Autocomplete", {
16
+ enumerable: true,
17
+ get: function () { return components.Autocomplete; }
18
+ });
19
+ Object.defineProperty(exports, "AutocompleteFormField", {
20
+ enumerable: true,
21
+ get: function () { return components.AutocompleteFormField; }
22
+ });
23
+ Object.defineProperty(exports, "Button", {
24
+ enumerable: true,
25
+ get: function () { return components.Button; }
26
+ });
27
+ Object.defineProperty(exports, "CalendarInput", {
28
+ enumerable: true,
29
+ get: function () { return components.CalendarInput; }
30
+ });
31
+ Object.defineProperty(exports, "CheckboxInput", {
32
+ enumerable: true,
33
+ get: function () { return components.CheckboxInput; }
34
+ });
35
+ Object.defineProperty(exports, "ConfirmableButton", {
36
+ enumerable: true,
37
+ get: function () { return components.ConfirmableButton; }
38
+ });
39
+ Object.defineProperty(exports, "ConnectedDropdown", {
40
+ enumerable: true,
41
+ get: function () { return components.ConnectedDropdown; }
42
+ });
43
+ Object.defineProperty(exports, "ContentFormField", {
44
+ enumerable: true,
45
+ get: function () { return components.ContentFormField; }
46
+ });
47
+ Object.defineProperty(exports, "DateFormField", {
48
+ enumerable: true,
49
+ get: function () { return components.DateFormField; }
50
+ });
51
+ Object.defineProperty(exports, "DateInput", {
52
+ enumerable: true,
53
+ get: function () { return components.DateInput; }
54
+ });
55
+ Object.defineProperty(exports, "DefinitionList", {
56
+ enumerable: true,
57
+ get: function () { return components.DefinitionList; }
58
+ });
59
+ Object.defineProperty(exports, "Dropdown", {
60
+ enumerable: true,
61
+ get: function () { return components.Dropdown; }
62
+ });
63
+ Object.defineProperty(exports, "DropdownFormField", {
64
+ enumerable: true,
65
+ get: function () { return components.DropdownFormField; }
66
+ });
67
+ Object.defineProperty(exports, "EditableDateFormField", {
68
+ enumerable: true,
69
+ get: function () { return components.EditableDateFormField; }
70
+ });
71
+ Object.defineProperty(exports, "EditableDropdownFormField", {
72
+ enumerable: true,
73
+ get: function () { return components.EditableDropdownFormField; }
74
+ });
75
+ Object.defineProperty(exports, "EditableForm", {
76
+ enumerable: true,
77
+ get: function () { return components.EditableForm; }
78
+ });
79
+ Object.defineProperty(exports, "EditableFormField", {
80
+ enumerable: true,
81
+ get: function () { return components.EditableFormField; }
82
+ });
83
+ Object.defineProperty(exports, "EditableMultiFormField", {
84
+ enumerable: true,
85
+ get: function () { return components.EditableMultiFormField; }
86
+ });
87
+ Object.defineProperty(exports, "EditableNumberFormField", {
88
+ enumerable: true,
89
+ get: function () { return components.EditableNumberFormField; }
90
+ });
91
+ Object.defineProperty(exports, "EditableSwitchFormField", {
92
+ enumerable: true,
93
+ get: function () { return components.EditableSwitchFormField; }
94
+ });
95
+ Object.defineProperty(exports, "EditableTextAreaFormField", {
96
+ enumerable: true,
97
+ get: function () { return components.EditableTextAreaFormField; }
98
+ });
99
+ Object.defineProperty(exports, "EditableTextFormField", {
100
+ enumerable: true,
101
+ get: function () { return components.EditableTextFormField; }
102
+ });
103
+ Object.defineProperty(exports, "EmptyMessage", {
104
+ enumerable: true,
105
+ get: function () { return components.EmptyMessage; }
106
+ });
107
+ Object.defineProperty(exports, "Fieldset", {
108
+ enumerable: true,
109
+ get: function () { return components.Fieldset; }
110
+ });
111
+ Object.defineProperty(exports, "Form", {
112
+ enumerable: true,
113
+ get: function () { return components.Form; }
114
+ });
115
+ Object.defineProperty(exports, "FormField", {
116
+ enumerable: true,
117
+ get: function () { return components.FormField; }
118
+ });
119
+ Object.defineProperty(exports, "FormSubmit", {
120
+ enumerable: true,
121
+ get: function () { return components.FormSubmit; }
122
+ });
123
+ Object.defineProperty(exports, "ImageFormField", {
124
+ enumerable: true,
125
+ get: function () { return components.ImageFormField; }
126
+ });
127
+ Object.defineProperty(exports, "ImageInput", {
128
+ enumerable: true,
129
+ get: function () { return components.ImageInput; }
130
+ });
131
+ Object.defineProperty(exports, "Link", {
132
+ enumerable: true,
133
+ get: function () { return components.Link; }
134
+ });
135
+ Object.defineProperty(exports, "LoadingModal", {
136
+ enumerable: true,
137
+ get: function () { return components.LoadingModal; }
138
+ });
139
+ Object.defineProperty(exports, "ModalForm", {
140
+ enumerable: true,
141
+ get: function () { return components.ModalForm; }
142
+ });
143
+ Object.defineProperty(exports, "MultiFormField", {
144
+ enumerable: true,
145
+ get: function () { return components.MultiFormField; }
146
+ });
147
+ Object.defineProperty(exports, "NumberFormField", {
148
+ enumerable: true,
149
+ get: function () { return components.NumberFormField; }
150
+ });
151
+ Object.defineProperty(exports, "NumberInput", {
152
+ enumerable: true,
153
+ get: function () { return components.NumberInput; }
154
+ });
155
+ Object.defineProperty(exports, "RadioInput", {
156
+ enumerable: true,
157
+ get: function () { return components.RadioInput; }
158
+ });
159
+ Object.defineProperty(exports, "Switch", {
160
+ enumerable: true,
161
+ get: function () { return components.Switch; }
162
+ });
163
+ Object.defineProperty(exports, "SwitchFormField", {
164
+ enumerable: true,
165
+ get: function () { return components.SwitchFormField; }
166
+ });
167
+ Object.defineProperty(exports, "TextArea", {
168
+ enumerable: true,
169
+ get: function () { return components.TextArea; }
170
+ });
171
+ Object.defineProperty(exports, "TextAreaFormField", {
172
+ enumerable: true,
173
+ get: function () { return components.TextAreaFormField; }
174
+ });
175
+ Object.defineProperty(exports, "TextFormField", {
176
+ enumerable: true,
177
+ get: function () { return components.TextFormField; }
178
+ });
179
+ Object.defineProperty(exports, "TextInput", {
180
+ enumerable: true,
181
+ get: function () { return components.TextInput; }
182
+ });
183
+ Object.defineProperty(exports, "Toaster", {
184
+ enumerable: true,
185
+ get: function () { return components.Toaster; }
186
+ });
187
+ exports.AppLayout = mt;
188
+ exports.Auth = ft;
189
+ exports.Badge = ht;
190
+ exports.Dashboard = vt;
191
+ exports.FilterBar = U;
192
+ exports.GridList = ar;
193
+ exports.InfoPanel = mr;
194
+ exports.List = W;
195
+ exports.ListActions = gr;
196
+ exports.Page = Z;
197
+ exports.PageActions = Or;
198
+ exports.Panel = Er;
199
+ exports.RootLayout = $r;
200
+ exports.SettingsPage = Zr;
201
+ exports.Table = fo;
202
+ exports.getConfig = E;
203
+ exports.setConfig = L;
204
+ //# sourceMappingURL=out.js.map
205
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/index.ts","../src/components/AppLayout/index.tsx","../src/services/ConfigService.ts","../src/services/SettingsService.ts","../src/services/PermissionService.ts","../src/components/AppNavigationComponent/index.tsx","../src/hooks/useNavigation.ts","../src/components/AppNavigation/index.tsx","../src/components/MePanel/index.tsx","../src/components/MeActions/index.tsx","../src/components/Auth/index.tsx","../src/components/Badge/index.tsx","../src/components/Dashboard/index.tsx","../src/components/FilterBar/index.tsx","../src/components/FilterBarClearButton/index.tsx","../src/components/FilterBarItem/index.tsx","../src/components/BooleanFilter/index.tsx","../src/components/DateFilter/index.tsx","../src/components/DropdownFilter/index.tsx","../src/components/GridListItem/index.tsx","../src/components/ListItem/index.tsx","../src/components/List/index.tsx","../src/components/GridList/index.tsx","../src/components/InfoPanel/index.tsx","../src/components/ListActions/index.tsx","../src/components/ListAction/index.tsx","../src/components/Page/index.tsx","../src/components/Tabs/index.tsx","../src/components/TabsComponent/index.tsx","../src/components/Panel/index.tsx","../src/components/PageActions/index.tsx","../src/components/RootLayout/index.tsx","../src/styles/config.ts","../src/components/Config/index.tsx","../src/components/SettingsForm/index.tsx","../src/components/SettingsPage/index.tsx","../src/components/TableClientComponent/index.tsx","../src/components/Table/index.tsx"],"names":["Autocomplete","AutocompleteFormField","Button","CalendarInput","CheckboxInput","ConnectedDropdown","ConfirmableButton","ContentFormField","DateFormField","DateInput","DefinitionList","Dropdown","DropdownFormField","EditableDateFormField","EditableDropdownFormField","EditableForm","EditableFormField","EditableMultiFormField","EditableNumberFormField","EditableSwitchFormField","EditableTextAreaFormField","EditableTextFormField","EmptyMessage","Fieldset","Form","FormField","FormSubmit","ImageInput","ImageFormField","Link","LoadingModal","ModalForm","MultiFormField","NumberFormField","NumberInput","RadioInput","Switch","SwitchFormField","TextArea","TextAreaFormField","TextFormField","TextInput","Toaster","Container","tw","config","setConfig","cfg","logo","getConfig","cookies","getLayout","submitSettingsForm","formData","filterList","list","cookie","value","permission","item","useEffect","useState","joinUrl","usePathname","getActiveHref","pathname","hrefs","href","first","second","useNavigation","data","options","activeHref","setActiveHref","label","useNavigation_default","jsx","AppNavigationComponent","layout","navigation","isActive","AppNavigationComponent_default","AppNavigation","AppNavigation_default","LogoutButton","jsxs","MeActions","MeActions_default","MePanel","user","MePanel_default","AppLayout","children","AppLayout_default","AuthComponent","classNames","Auth","props","Auth_default","classMap","dotMap","Badge","variant","Badge_default","Dashboard","title","Dashboard_default","useFilters","useRouter","FilterBarClearButton","onClick","FilterBarClearButton_default","useRef","BooleanFilter","name","onChange","renderBooleanValue","BooleanFilter_default","DateFilter","transformDateValue","LENGTH_OF_YEAR","renderDateString","noYear","date","day","month","year","renderDateValue","years","DateFilter_default","DropdownFilter","renderDropdownValue","DropdownFilter_default","map","DEFAULT_SIZE","FilterBarItem","type","panel","handleChange","event","handleClear","FilterComponent","renderValue","size","transformValue","FilterBarItem_default","FilterBar","hasSearch","router","filters","setFilter","search","setSearch","handleSearchChange","handleSearchClear","handleSearchKeyDown","filter","FilterBar_default","Fragment","renderMeta","meta","key","ListItem","Actions","description","id","ListItem_default","GridListItem","image","imageHref","subtitle","GridListItem_default","defaultTransformer","reservedSearchParams","checkHasFilters","searchParams","List","actions","columns","emptyMessageProps","fn","isMinimal","params","renderItem","transformer","headers","response","error","hasFilters","componentEmptyMessageProps","List_default","GridList","GridList_default","iconClassMap","InfoPanel","InfoPanel_default","useClickOutside","ListAction","handleClick","ListAction_default","ListActions","isOpen","setIsOpen","ref","toggleIsOpen","ListActions_default","filterNull","TabsComponent","basePath","TabsComponent_default","Tabs","Tabs_default","Page","isFullWidth","tabs","Page_default","Panel","action","Panel_default","createPortal","PageActions","mounted","setMounted","PageActions_default","getInter","ClassNames","twx","config_default","Config","Config_default","inter","RootLayout","RootLayout_default","EditableRadioFormField","useEditableForm","SettingsForm","defaults","fieldProps","formProps","SettingsForm_default","SettingsPage","SettingsPage_default","useSearchParams","createFilterLink","updatedSearchParams","getDir","currentDir","isSortActive","createSortLink","sort","dir","getSortIconProps","isStringArray","array","parseColumns","TableClientComponent","parsedColumns","hasTitles","column","TableClientComponent_default","Table","Table_default"],"mappings":"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","sourcesContent":["// Exported from @sqrzro/components\n\nexport {\n Autocomplete,\n AutocompleteFormField,\n Button,\n CalendarInput,\n CheckboxInput,\n ConnectedDropdown,\n ConfirmableButton,\n ContentFormField,\n DateFormField,\n DateInput,\n DefinitionList,\n Dropdown,\n DropdownFormField,\n EditableDateFormField,\n EditableDropdownFormField,\n EditableForm,\n EditableFormField,\n EditableMultiFormField,\n EditableNumberFormField,\n EditableSwitchFormField,\n EditableTextAreaFormField,\n EditableTextFormField,\n EmptyMessage,\n Fieldset,\n Form,\n FormField,\n FormSubmit,\n ImageInput,\n ImageFormField,\n Link,\n LoadingModal,\n ModalForm,\n MultiFormField,\n NumberFormField,\n NumberInput,\n RadioInput,\n Switch,\n SwitchFormField,\n TextArea,\n TextAreaFormField,\n TextFormField,\n TextInput,\n Toaster,\n} from '@sqrzro/components';\n\nexport type { DropdownItem } from '@sqrzro/components';\n\n// Exported from @sqrzro/admin\n\nexport type { AppLayoutProps } from './AppLayout';\nexport { default as AppLayout } from './AppLayout';\n\nexport type { AuthProps } from './Auth';\nexport { default as Auth } from './Auth';\n\nexport type { BadgeProps } from './Badge';\nexport { default as Badge } from './Badge';\n\nexport type { DashboardProps } from './Dashboard';\nexport { default as Dashboard } from './Dashboard';\n\nexport type { FilterBarProps, FilterObject } from './FilterBar';\nexport { default as FilterBar } from './FilterBar';\n\nexport type { GridListProps } from './GridList';\nexport { default as GridList } from './GridList';\n\nexport type { InfoPanelProps } from './InfoPanel';\nexport { default as InfoPanel } from './InfoPanel';\n\nexport type { ListComponentProps, ListProps } from './List';\nexport { default as List } from './List';\n\nexport type { ListObject } from './ListItem';\n\nexport type { ListActionsProps } from './ListActions';\nexport { default as ListActions } from './ListActions';\n\nexport type { PageProps } from './Page';\nexport { default as Page } from './Page';\n\nexport type { PanelProps } from './Panel';\nexport { default as Panel } from './Panel';\n\nexport type { PageActionsProps } from './PageActions';\nexport { default as PageActions } from './PageActions';\n\nexport type { RootLayoutProps } from './RootLayout';\nexport { default as RootLayout } from './RootLayout';\n\nexport { default as SettingsPage } from './SettingsPage';\n\nexport type { TableColumnObject } from './TableClientComponent';\n\nexport type { TableProps } from './Table';\nexport { default as Table } from './Table';\n","import { Container, Link, tw } from '@sqrzro/components';\n\nimport { getConfig } from '../../services/ConfigService';\nimport { getLayout } from '../../services/SettingsService';\n\nimport AppNavigation from '../AppNavigation';\nimport MePanel from '../MePanel';\n\nexport interface AppLayoutProps {\n children: React.ReactNode;\n user?: { name: string } | null;\n}\n\nasync function AppLayout({ children, user }: Readonly<AppLayoutProps>): Promise<JSX.Element> {\n const config = getConfig();\n const layout = await getLayout();\n\n return (\n <div className={tw('', layout === 'sidebar' ? 'grid grid-cols-[12rem_1fr]' : null)}>\n <header className=\"bg-slate-800\">\n <Container isFullWidth>\n <div\n className={tw(\n 'flex items-center',\n layout === 'sidebar'\n ? '-mx-4 h-screen flex-col py-4'\n : 'h-16 border-b border-slate-700'\n )}\n >\n <Link\n className={tw(layout === 'sidebar' ? 'h-12 w-12' : 'h-9 w-9')}\n href=\"/\"\n >\n {config.logo?.()}\n <span className=\"sr-only\">{config.app.name}</span>\n </Link>\n <AppNavigation layout={layout} />\n <MePanel layout={layout} user={user} />\n </div>\n </Container>\n </header>\n <main className=\"mb-10 block\">{children}</main>\n </div>\n );\n}\n\nexport default AppLayout;\n","interface ConfigNavigationObject {\n href: string;\n label: string;\n permission?: string;\n}\n\nexport interface Config {\n app: {\n name: string;\n url: string;\n };\n logo?: () => React.ReactElement;\n navigation: ConfigNavigationObject[];\n}\n\nlet config: Config = {\n app: {\n name: 'Square Zero',\n url: 'http://localhost:8080',\n },\n navigation: [],\n};\n\nexport function setConfig(cfg: Config, logo?: () => React.ReactElement): Config {\n config = { ...cfg, logo };\n return config;\n}\n\nexport function getConfig(): Config {\n return config;\n}\n","'use server';\n\nimport { cookies } from 'next/headers';\n\nimport type { Errorable } from '@sqrzro/interfaces';\n\nexport type Layout = 'sidebar' | 'topbar';\n\nexport interface SettingsFormFields {\n isDark: boolean;\n layout: Layout;\n}\n\nexport async function getLayout(): Promise<Layout> {\n return Promise.resolve((cookies().get('layout')?.value || 'topbar') as Layout);\n}\n\nexport async function submitSettingsForm(\n formData: SettingsFormFields\n): Promise<Errorable<boolean>> {\n cookies().set('layout', formData.layout);\n return Promise.resolve([true, null]);\n}\n","'use server';\n\nimport { cookies } from 'next/headers';\n\nexport async function filterList<T extends { permission?: string[] | string }>(\n list: T[]\n): Promise<T[]> {\n if (process.env.APP_ENV !== 'production' && process.env.DANGEROUSLY_DISABLE_PERMISSIONS) {\n return Promise.resolve(list);\n }\n\n const cookie = cookies().get('permissions')?.value;\n\n if (!cookie) {\n return Promise.resolve([]);\n }\n\n let value: string[] = [];\n\n try {\n value = JSON.parse(cookie) as string[];\n } catch (err) {\n return Promise.resolve([]);\n }\n\n return Promise.resolve(\n list.filter(({ permission }) => {\n if (!permission) {\n return true;\n }\n const permissions = Array.isArray(permission) ? permission : [permission];\n return permissions.every((item) => value.includes(item));\n })\n );\n}\n","'use client';\n\nimport { Link, tw } from '@sqrzro/components';\n\nimport useNavigation from '../../hooks/useNavigation';\n\ninterface ConfigNavigationObject {\n href: string;\n label: string;\n permission?: string;\n}\n\ninterface AppNavigationComponentProps {\n data: ConfigNavigationObject[];\n layout?: string;\n}\n\nfunction AppNavigationComponent({\n data,\n layout,\n}: Readonly<AppNavigationComponentProps>): React.ReactElement {\n const navigation = useNavigation(data);\n\n return (\n <nav className={tw('h-full', layout === 'sidebar' ? 'w-full' : 'pl-6')}>\n <ul\n className={tw(\n 'flex h-full gap-2',\n layout === 'sidebar' ? 'flex-col items-start' : 'items-center'\n )}\n >\n {navigation.map(({ href, isActive, label }) => (\n <li key={href} className={tw(layout === 'sidebar' ? null : 'h-full')}>\n <Link\n className={tw(\n 'relative flex h-full items-center px-1 font-semibold',\n isActive\n ? 'before:bg-primary text-white before:absolute before:bottom-0 before:left-0 before:right-0 before:h-1'\n : 'text-white/80 hover:text-white'\n )}\n href={href}\n >\n {label}\n </Link>\n </li>\n ))}\n </ul>\n </nav>\n );\n}\n\nexport default AppNavigationComponent;\n","import { useEffect, useState } from 'react';\n\nimport { joinUrl } from '@sqrzro/utility';\nimport { usePathname } from 'next/navigation';\n\nimport type { NavigationAction } from '../interfaces';\n\ninterface NavigationObject {\n href: string;\n isActive: boolean;\n label: string;\n}\n\ninterface UseNavigationOptions {\n basePath?: string;\n}\n\nfunction getActiveHref(pathname: string, hrefs: string[]): string {\n return (\n hrefs\n .filter((href) => href && pathname.startsWith(`/${href.replace(/^\\//u, '')}`))\n .sort((first, second) => {\n if (!first || !second) {\n return 0;\n }\n return second.length - first.length;\n })[0] || ''\n );\n}\n\nfunction useNavigation(\n data: NavigationAction[],\n options?: UseNavigationOptions\n): NavigationObject[] {\n const [activeHref, setActiveHref] = useState('');\n const pathname = usePathname();\n\n const hrefs = data.map(({ href }) => joinUrl(options?.basePath, href));\n\n useEffect(() => {\n setActiveHref(getActiveHref(pathname, hrefs));\n }, [pathname]);\n\n return data.map(({ href, label }) => ({\n href: joinUrl(options?.basePath, href),\n isActive: joinUrl(options?.basePath, href) === activeHref,\n label,\n }));\n}\n\nexport default useNavigation;\n","import { getConfig } from '../../services/ConfigService';\nimport { filterList } from '../../services/PermissionService';\n\nimport AppNavigationComponent from '../AppNavigationComponent';\n\ninterface AppNavigationProps {\n layout?: string;\n}\n\nasync function AppNavigation({\n layout,\n}: Readonly<AppNavigationProps>): Promise<React.ReactElement> {\n return (\n <AppNavigationComponent data={await filterList(getConfig().navigation)} layout={layout} />\n );\n}\n\nexport default AppNavigation;\n","import { tw } from '@sqrzro/components';\n\nimport MeActions from '../MeActions';\n\ninterface MePanelProps {\n layout?: string;\n user?: { name: string } | null;\n}\n\nfunction MePanel({ layout, user }: Readonly<MePanelProps>): React.ReactElement {\n return (\n <div\n className={tw(\n 'ml-auto flex items-center gap-3',\n layout === 'sidebar' ? 'flex-row-reverse' : null\n )}\n >\n <div className=\"flex flex-col items-end gap-0.5 text-white\">\n <strong>{user?.name}</strong>\n <MeActions />\n </div>\n <div className=\"h-9 w-9 flex-none rounded-full border-4 border-slate-500\" />\n </div>\n );\n}\n\nexport default MePanel;\n","import { Link, LogoutButton } from '@sqrzro/components';\n\nfunction MeActions(): React.ReactElement {\n return (\n <ul className=\"flex gap-2 text-xs text-slate-300\">\n <li>\n <Link href=\"/settings\">Settings</Link>\n </li>\n <li>\n <LogoutButton />\n </li>\n </ul>\n );\n}\n\nexport default MeActions;\n","import { Auth as AuthComponent } from '@sqrzro/components';\nimport type { AuthClassNames, AuthProps as AuthComponentProps } from '@sqrzro/components';\n\nconst classNames: Partial<AuthClassNames> = {\n root: 'bg-slate-800 gap-8',\n logo: 'mx-auto flex h-12 w-32 items-end',\n panel: 'rounded bg-white p-8 shadow-lg pb-10',\n title: 'text-lg font-semibold mb-6 leading-none',\n link: 'font-semibold text-link',\n actions: 'pt-2 w-full',\n footer: '-mb-2',\n};\n\nexport type AuthProps = AuthComponentProps;\n\nfunction Auth(props: AuthComponentProps): JSX.Element {\n return <AuthComponent {...props} classNames={classNames} />;\n}\n\nexport default Auth;\n","import { tw } from '@sqrzro/components';\nimport type { StyleVariant } from '@sqrzro/interfaces';\n\nexport interface BadgeProps {\n children: React.ReactNode;\n variant?: StyleVariant | null;\n}\n\nconst classMap: Partial<Record<StyleVariant, string>> = {\n danger: 'bg-red-100 text-red-700',\n error: 'bg-red-100 text-red-700',\n info: 'bg-sky-100 text-sky-700',\n warning: 'bg-yellow-100 text-yellow-700',\n success: 'bg-green-100 text-green-700',\n};\n\nconst dotMap: Partial<Record<StyleVariant, string>> = {\n danger: 'fill-red-400',\n error: 'fill-red-400',\n info: 'fill-sky-400',\n warning: 'fill-yellow-400',\n success: 'fill-green-400',\n};\n\nfunction Badge({ children, variant }: Readonly<BadgeProps>): React.ReactElement {\n return (\n <strong\n className={tw(\n 'inline-flex items-center gap-1.5 rounded-full bg-slate-100 px-2 py-1 text-xs font-medium text-slate-600',\n variant ? classMap[variant] : null\n )}\n >\n <svg\n aria-hidden=\"true\"\n className={tw('h-1.5 w-1.5 fill-slate-400', variant ? dotMap[variant] : null)}\n viewBox=\"0 0 6 6\"\n >\n <circle cx=\"3\" cy=\"3\" r=\"3\" />\n </svg>\n {children}\n </strong>\n );\n}\n\nexport default Badge;\n","export interface DashboardProps {\n children?: React.ReactNode;\n title: string;\n}\n\nfunction Dashboard({ children, title }: Readonly<DashboardProps>): React.ReactElement {\n return (\n <div className=\"py-8\">\n <h1 className=\"mx-auto text-center text-4xl font-semibold\">{title}</h1>\n {children}\n </div>\n );\n}\n\nexport default Dashboard;\n","'use client';\n\nimport { useState } from 'react';\n\nimport { TextInput, tw } from '@sqrzro/components';\nimport { useFilters } from '@sqrzro/hooks';\nimport type { InputEvent } from '@sqrzro/interfaces';\nimport { useRouter } from 'next/navigation';\n\nimport FilterBarClearButton from '../FilterBarClearButton';\nimport FilterBarItem from '../FilterBarItem';\nimport type { FilterObject } from '../FilterBarItem';\n\nexport type { FilterObject } from '../FilterBarItem';\n\nexport interface FilterBarProps {\n hasSearch?: boolean;\n map?: FilterObject[];\n}\n\nfunction FilterBar({ hasSearch, map }: Readonly<FilterBarProps>): React.ReactElement {\n const router = useRouter();\n\n const [filters, setFilter] = useFilters();\n const [search, setSearch] = useState(filters.get('search') || '');\n\n function handleChange(name: string, value: string): void {\n setFilter(name, value);\n router.refresh();\n }\n\n function handleSearchChange(event: InputEvent<string>): void {\n setSearch(event.target.value || '');\n }\n\n function handleSearchClear(): void {\n setSearch('');\n setFilter('search', '');\n }\n\n function handleSearchKeyDown(event: React.KeyboardEvent<HTMLInputElement>): void {\n if (event.key === 'Enter') {\n setFilter('search', event.currentTarget.value);\n }\n }\n\n return (\n <ul className=\"relative flex gap-2 before:absolute before:left-[calc(50%-50vw)] before:top-full before:h-24 before:w-screen before:bg-slate-800\">\n {hasSearch ? (\n <li className=\"relative\">\n <TextInput\n classNames={{\n root: {\n default: tw(\n 'h-8 w-56 rounded-full border border-slate-400 px-3 text-xs text-white placeholder:text-slate-300',\n filters.get('search')\n ? 'bg-slate-700'\n : 'bg-transparent focus:bg-slate-700'\n ),\n },\n }}\n name=\"search\"\n onChange={handleSearchChange}\n onKeyDown={handleSearchKeyDown}\n placeholder=\"Search...\"\n value={search}\n />\n {filters.get('search') ? (\n <FilterBarClearButton onClick={handleSearchClear} />\n ) : null}\n </li>\n ) : null}\n {(map || []).map((filter) => (\n <FilterBarItem\n key={filter.name}\n onChange={handleChange}\n value={filters.get(filter.name) || ''}\n {...filter}\n />\n ))}\n </ul>\n );\n}\n\nexport default FilterBar;\n","interface FilterBarClearButtonProps {\n onClick: () => void;\n}\n\nfunction FilterBarClearButton({\n onClick,\n}: Readonly<FilterBarClearButtonProps>): React.ReactElement {\n return (\n <button\n className=\"absolute right-0 top-0 flex h-full w-10 select-none items-center justify-center\"\n onClick={onClick}\n type=\"button\"\n >\n <span className=\"sr-only\">Remove</span>\n <span className=\"flex h-4 w-4 items-center justify-center rounded-full bg-white leading-none text-slate-800\">\n &times;\n </span>\n </button>\n );\n}\n\nexport default FilterBarClearButton;\n","'use client';\n\nimport { useRef } from 'react';\n\nimport { tw } from '@sqrzro/components';\nimport type { InputEvent, SimpleObject } from '@sqrzro/interfaces';\n\nimport type { FilterComponentProps } from '../../interfaces';\n\nimport BooleanFilter, { renderBooleanValue } from '../BooleanFilter';\nimport DateFilter, { renderDateValue, transformDateValue } from '../DateFilter';\nimport DropdownFilter, { renderDropdownValue } from '../DropdownFilter';\nimport FilterBarClearButton from '../FilterBarClearButton';\n\nexport type FilterType = 'boolean' | 'date' | 'dropdown';\n\nexport interface FilterObject {\n data?: SimpleObject[];\n label: string;\n name: string;\n type: FilterType;\n}\n\ninterface FilterBarItemProps extends FilterObject {\n onChange: (name: string, value?: string) => void;\n value?: string;\n}\n\ninterface FilterMapItem {\n component: React.FunctionComponent<FilterComponentProps>;\n renderValue: (value: string, data?: SimpleObject[]) => string;\n size?: string;\n transformValue?: (value?: string) => string;\n}\n\nconst map: Record<FilterObject['type'], FilterMapItem> = {\n boolean: { component: BooleanFilter, renderValue: renderBooleanValue },\n date: {\n component: DateFilter,\n renderValue: renderDateValue,\n size: 'w-96',\n transformValue: transformDateValue,\n },\n dropdown: { component: DropdownFilter, renderValue: renderDropdownValue },\n};\n\nconst DEFAULT_SIZE = 'w-56';\n\nfunction FilterBarItem({\n data,\n label,\n name,\n onChange,\n type,\n value,\n}: Readonly<FilterBarItemProps>): React.ReactElement {\n const panel = useRef<HTMLDivElement>(null);\n\n function handleChange(event: InputEvent<string>): void {\n onChange(name, event.target.value);\n panel.current?.hidePopover();\n }\n\n function handleClear(): void {\n onChange(name, '');\n }\n\n const { component: FilterComponent, renderValue, size, transformValue } = map[type];\n\n return (\n <li\n className={tw(\n 'relative inline-flex h-8 items-center gap-2 rounded-full border px-5 text-xs text-white',\n value ? 'border-solid border-slate-400' : 'border-dashed border-slate-400',\n value ? 'bg-slate-700 pr-10' : 'text-slate-300'\n )}\n >\n <p className=\"\">{label}</p>\n {value ? (\n <p className=\"border-l border-l-slate-300 pl-2 font-semibold\">\n {renderValue(value, data)}\n </p>\n ) : null}\n <button\n className={tw(\n 'absolute left-0 top-0 h-full select-none text-transparent',\n value ? 'right-10' : 'right-0'\n )}\n id={`${name}-control`}\n popovertarget={`${name}-target`}\n type=\"button\"\n >\n Edit\n </button>\n {value ? <FilterBarClearButton onClick={handleClear} /> : null}\n <div\n ref={panel}\n anchor={`${name}-control`}\n className={tw(\n 'show left-[anchor(left)] top-[anchor(bottom)] -ml-px mt-2 origin-top-left origin-top-left rounded bg-white shadow-lg',\n size || DEFAULT_SIZE\n )}\n id={`${name}-target`}\n popover=\"auto\"\n >\n <div className=\"py-1\" role=\"none\">\n <FilterComponent\n data={data}\n name={name}\n onChange={handleChange}\n value={transformValue ? transformValue(value) : value}\n />\n </div>\n </div>\n </li>\n );\n}\n\nexport default FilterBarItem;\n","import { Dropdown } from '@sqrzro/components';\n\nimport type { FilterComponentProps } from '../../interfaces';\n\nconst data = [\n {\n id: '0',\n name: 'No',\n },\n {\n id: '1',\n name: 'Yes',\n },\n];\n\nfunction BooleanFilter({\n name,\n onChange,\n value,\n}: Readonly<FilterComponentProps>): React.ReactElement {\n return <Dropdown data={data} name={name} onChange={onChange} value={value} isPanelOnly />;\n}\n\nexport function renderBooleanValue(value: string): string {\n return data.find((item) => item.id === value)?.name || '';\n}\n\nexport default BooleanFilter;\n","import { CalendarInput } from '@sqrzro/components';\n\nimport type { FilterComponentProps } from '../../interfaces';\n\nfunction DateFilter({ name, onChange, value }: Readonly<FilterComponentProps>): React.ReactElement {\n return <CalendarInput name={name} onChange={onChange} value={value} isPanelOnly isRange />;\n}\n\nexport function transformDateValue(value?: string | null): string {\n return value || '';\n}\n\nconst LENGTH_OF_YEAR = 4;\n\nfunction renderDateString(value: string, noYear?: boolean): string {\n const date = new Date(value);\n\n if (Number.isNaN(date.getTime())) {\n return '';\n }\n\n const day = date.getDate().toString().padStart(2, '0');\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\n const year = date.getFullYear();\n\n return `${day}/${month}${noYear ? '' : `/${year}`}`;\n}\n\nexport function renderDateValue(value: string): string {\n if (value.includes(',')) {\n const values = value.split(',');\n const years = values.map((item) => parseInt(item.substring(0, LENGTH_OF_YEAR), 10));\n\n return value\n .split(',')\n .map((item) =>\n renderDateString(\n item,\n years[0] === years[1] && years[0] === new Date().getFullYear()\n )\n )\n .join(' - ');\n }\n\n return renderDateString(value);\n}\n\nexport default DateFilter;\n","import { Dropdown } from '@sqrzro/components';\nimport type { SimpleObject } from '@sqrzro/interfaces';\n\nimport type { FilterComponentProps } from '../../interfaces';\n\nfunction DropdownFilter({\n data,\n name,\n onChange,\n value,\n}: Readonly<FilterComponentProps>): React.ReactElement {\n return <Dropdown data={data} name={name} onChange={onChange} value={value} isPanelOnly />;\n}\n\nexport function renderDropdownValue(value: string, data?: SimpleObject[]): string {\n return data?.find((item) => item.id === value)?.name || '';\n}\n\nexport default DropdownFilter;\n","import { Fragment } from 'react';\n\nimport { Link } from '@sqrzro/components';\n\nimport { renderMeta } from '../ListItem';\nimport type { ListObject } from '../ListItem';\n\nfunction GridListItem({\n href,\n image,\n imageHref,\n meta,\n subtitle,\n title,\n}: Readonly<ListObject>): React.ReactElement {\n return (\n <li>\n <article className=\"bg-panel overflow-hidden rounded p-4 shadow\">\n <div className=\"relative mb-4 h-64 rounded border border border-slate-300 bg-slate-50 p-4\">\n {/* eslint-disable no-nested-ternary */}\n {image ? (\n <Fragment>\n <img alt=\"\" className=\"h-full w-full object-contain\" src={image} />\n {imageHref ? (\n <Link className=\"absolute inset-0\" href={imageHref} scroll={false}>\n <span className=\"sr-only\">Edit Image</span>\n </Link>\n ) : null}\n </Fragment>\n ) : imageHref ? (\n <Link\n className=\"absolute inset-0 flex flex-col items-center justify-center gap-3 font-semibold text-slate-500\"\n href={imageHref}\n scroll={false}\n >\n <i className=\"block h-12 w-12 rounded-full border-2 border-slate-300\" />\n Add Image\n </Link>\n ) : null}\n {/* eslint-enable no-nested-ternary */}\n </div>\n <h2 className=\"text-base font-semibold\">\n {href ? <Link href={href}>{title}</Link> : title}\n </h2>\n {subtitle ? <p className=\"text-xs text-slate-500\">{subtitle}</p> : null}\n {meta ? (\n <Fragment>\n <hr className=\"my-4\" />\n <div className=\"flex items-center justify-between\">\n {meta ? renderMeta(meta) : null}\n </div>\n </Fragment>\n ) : null}\n {href ? (\n <Fragment>\n <hr className=\"my-4\" />\n <Link href={href} scroll={false}>\n Edit\n </Link>\n </Fragment>\n ) : null}\n </article>\n </li>\n );\n}\n\nexport default GridListItem;\n","import { Link } from '@sqrzro/components';\n\nexport interface ListObject {\n actions?: ({ id }: { id: number | string }) => React.ReactElement;\n description?: React.ReactNode | null;\n href?: string;\n id: number | string;\n image?: string | null;\n imageHref?: string | null;\n meta?: React.ReactNode[] | Record<string, React.ReactNode>;\n permission?: string;\n subtitle?: React.ReactNode | null;\n title?: string;\n}\n\nexport function renderMeta(meta: ListObject['meta']): React.ReactElement | null {\n if (!meta) {\n return null;\n }\n\n if (Array.isArray(meta)) {\n return (\n <ul className=\"flex items-center gap-4 text-xs text-slate-600\">\n {meta.map((item) => (\n <li key={String(item)}>{item}</li>\n ))}\n </ul>\n );\n }\n\n return (\n <table className=\"w-full text-xs\">\n <tbody>\n {Object.entries(meta).map(([key, value]) => (\n <tr key={key} className=\"odd:bg-slate-100\">\n <th className=\"p-2 font-semibold\">{key}</th>\n <td className=\"p-2 text-right\">{value || '-'}</td>\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n\nfunction ListItem({\n actions: Actions, // eslint-disable-line @typescript-eslint/naming-convention\n description,\n href,\n id,\n meta,\n title,\n}: Readonly<ListObject>): React.ReactElement {\n return (\n <li>\n <article className=\"bg-panel overflow-hidden rounded p-4 shadow-[0px_0px_0px_1px_rgba(9,9,11,0.07),0px_2px_2px_0px_rgba(9,9,11,0.05)]\">\n {title ? (\n <h2 className=\"text-lg font-semibold\">\n {href ? <Link href={href}>{title}</Link> : title}\n </h2>\n ) : null}\n {description ? <div>{description}</div> : null}\n {meta || Actions ? (\n <div className=\"mt-4 flex items-center justify-between border-t border-slate-200 pt-3\">\n {meta ? renderMeta(meta) : null}\n {Actions ? <Actions id={id} /> : null}\n </div>\n ) : null}\n </article>\n </li>\n );\n}\n\nexport default ListItem;\n","import { Fragment } from 'react';\nimport { EmptyMessage, tw } from '@sqrzro/components';\nimport type { EmptyMessageProps } from '@sqrzro/components';\nimport type { Errorable } from '@sqrzro/interfaces';\n\nimport { filterList } from '../../services/PermissionService';\n\nimport FilterBar from '../FilterBar';\nimport type { FilterObject } from '../FilterBar';\nimport ListItem from '../ListItem';\nimport type { ListObject } from '../ListItem';\n\nexport interface ListComponentProps {\n params?: Record<string, string>;\n searchParams?: Record<string, string>;\n}\n\nexport interface ListProps<Item, Params> {\n actions?: ({ id }: { readonly id: number }) => React.ReactElement;\n columns?: number;\n emptyMessageProps?: EmptyMessageProps;\n filters?: FilterObject[];\n fn: (params?: Params, searchParams?: URLSearchParams) => Promise<Errorable<Item[]>>;\n hasSearch?: boolean;\n isMinimal?: boolean;\n renderItem?: (props: ListObject) => JSX.Element;\n params?: Params;\n transformer?: (item: Item) => ListObject;\n}\n\nfunction defaultTransformer(): ListObject {\n return {\n id: 0,\n title: '',\n };\n}\n\nconst reservedSearchParams = ['action'];\n\nfunction checkHasFilters(searchParams: URLSearchParams): boolean {\n return Array.from(searchParams.entries()).some(\n ([key, value]) => !reservedSearchParams.includes(key) && Boolean(value)\n );\n}\n\nasync function List<Item extends object, Params>({\n actions,\n columns,\n emptyMessageProps,\n filters,\n fn,\n hasSearch,\n isMinimal,\n params,\n renderItem = ListItem,\n transformer,\n}: Readonly<ListProps<Item, Params>>): Promise<React.ReactElement> {\n let searchParams: URLSearchParams; // eslint-disable-line @typescript-eslint/init-declarations\n\n try {\n const { headers } = await import('next/headers');\n searchParams = new URLSearchParams(headers().get('x-search-params') || '');\n } catch (err) {\n searchParams = new URLSearchParams();\n }\n\n const [response, error] = await fn(params, searchParams);\n\n if (!Array.isArray(response)) {\n throw new Error(\n 'Response is not an array. Did you forget to return an Errorable object in the function?'\n );\n }\n\n if (error) {\n return <div>Error</div>;\n }\n\n const data = await filterList(response.map(transformer || defaultTransformer));\n const hasFilters = checkHasFilters(searchParams);\n\n const componentEmptyMessageProps = hasFilters\n ? {\n children:\n 'Try adjusting the filters above. If you think this is a mistake, please contact your site administrator.',\n title: 'No results match the current filters',\n }\n : emptyMessageProps;\n\n return (\n <Fragment>\n {(filters || hasSearch) && (data.length || hasFilters) ? (\n <FilterBar hasSearch={hasSearch} map={filters} />\n ) : null}\n {data.length ? (\n <ul\n className={tw(\n 'relative',\n columns ? 'grid grid-cols-3 gap-6' : 'flex flex-col gap-4'\n )}\n >\n {data.map((item) => (\n <Fragment key={item.id}>{renderItem({ actions, ...item })}</Fragment>\n ))}\n </ul>\n ) : (\n <EmptyMessage {...componentEmptyMessageProps} classNameProps={{ isMinimal }} />\n )}\n </Fragment>\n );\n}\n\nexport default List;\n","import GridListItem from '../GridListItem';\nimport List from '../List';\nimport type { ListProps } from '../List';\n\nexport type GridListProps<Item, Params> = Omit<ListProps<Item, Params>, 'renderItem'>;\n\nfunction GridList<Item extends object, Params>(\n props: GridListProps<Item, Params>\n): React.ReactElement {\n return <List {...props} columns={3} renderItem={GridListItem} />;\n}\n\nexport default GridList;\n","import { tw } from '@sqrzro/components';\nimport type { StyleVariant } from '@sqrzro/interfaces';\n\nexport interface InfoPanelProps {\n children: React.ReactNode;\n variant?: StyleVariant;\n}\n\nconst iconClassMap: Partial<Record<StyleVariant, string>> = {\n danger: 'bg-[url(/admin/images/danger.svg)]',\n info: 'bg-[url(/admin/images/info.svg)]',\n success: 'bg-[url(/admin/images/success.svg)]',\n warning: 'bg-[url(/admin/images/warning.svg)]',\n};\n\nconst classMap: Partial<Record<StyleVariant, string>> = {\n danger: 'bg-red-50 text-red-700',\n info: 'bg-sky-50 text-sky-700',\n success: 'bg-green-50 text-green-700',\n warning: 'bg-yellow-50 text-yellow-700',\n};\n\nfunction InfoPanel({ children, variant = 'info' }: Readonly<InfoPanelProps>): React.ReactElement {\n return (\n <aside className={tw('grid grid-cols-[1rem_auto] gap-4 rounded p-4', classMap[variant])}>\n <i className={tw('aspect-square bg-contain bg-no-repeat', iconClassMap[variant])} />\n <div>{children}</div>\n </aside>\n );\n}\n\nexport default InfoPanel;\n","'use client';\n\nimport { useClickOutside } from '@sqrzro/hooks';\nimport type { ConfirmableAction } from '@sqrzro/interfaces';\n\nimport ListAction from '../ListAction';\n\nexport interface ListActionsProps {\n actions: ConfirmableAction<number>[];\n id: number;\n}\n\nfunction ListActions({ actions, id }: Readonly<ListActionsProps>): React.ReactElement {\n const [isOpen, setIsOpen, ref] = useClickOutside();\n\n function toggleIsOpen(): void {\n setIsOpen(!isOpen);\n }\n\n return (\n <div ref={ref} className=\"flex flex-row-reverse items-center gap-4\">\n <button\n className=\"h-4 rotate-90 text-xs leading-[1em] tracking-tighter text-slate-500\"\n onClick={toggleIsOpen}\n type=\"button\"\n >\n &bull;&bull;&bull;\n <span className=\"sr-only\">{isOpen ? 'Close' : 'Open'} Actions</span>\n </button>\n {isOpen ? (\n <ul className=\"show relative flex origin-right gap-4 bg-white before:absolute before:-bottom-2 before:-top-2 before:left-[-999em] before:right-full before:bg-white/80\">\n {actions.map(({ label, onClick, variant }) => (\n <li key={label}>\n <ListAction id={id} label={label} onClick={onClick} variant={variant} />\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n );\n}\n\nexport default ListActions;\n","import { ConfirmableButton } from '@sqrzro/components';\nimport type { ConfirmableAction } from '@sqrzro/interfaces';\n\ninterface ListActionProps extends ConfirmableAction<number> {\n id: number;\n}\n\nfunction ListAction({\n id,\n onClick,\n label,\n variant,\n}: Readonly<ListActionProps>): React.ReactElement {\n function handleClick(): void {\n onClick(id);\n }\n\n return (\n <ConfirmableButton onClick={handleClick} variant={variant} isText>\n {label}\n </ConfirmableButton>\n );\n}\n\nexport default ListAction;\n","import { Fragment } from 'react';\nimport { Container, tw } from '@sqrzro/components';\nimport type { LinkableAction } from '@sqrzro/interfaces';\nimport { filterNull } from '@sqrzro/utility';\n\nimport { getLayout } from '../../services/SettingsService';\nimport type { NavigationAction } from '../../interfaces';\n\nimport Tabs from '../Tabs';\n\nexport interface PageProps {\n actions?: LinkableAction[];\n basePath?: string;\n children: React.ReactNode;\n isFullWidth?: boolean;\n tabs?: (NavigationAction | null)[];\n title: string;\n}\n\nasync function Page({\n basePath,\n children,\n isFullWidth,\n tabs,\n title,\n}: Readonly<PageProps>): Promise<React.ReactElement> {\n const layout = await getLayout();\n\n return (\n <Fragment>\n <header\n className={tw(\n '',\n layout === 'sidebar' ? 'bg-slate-200' : 'bg-slate-800 pb-16 text-white'\n )}\n >\n <Container isFullWidth={layout === 'sidebar' || isFullWidth}>\n <div className=\"flex items-center justify-between py-10\">\n <h1 className=\"min-h-10 text-3xl font-semibold\">{title}</h1>\n <div className=\"flex gap-2\" id=\"page-actions\" />\n </div>\n {tabs ? (\n <div\n className={tw(\n '-mt-4',\n layout === 'sidebar' ? '' : 'mb-8 border-b border-slate-700'\n )}\n >\n <Tabs basePath={basePath} data={filterNull(tabs)} />\n </div>\n ) : null}\n </Container>\n </header>\n <Container isFullWidth={layout === 'sidebar' || isFullWidth}>\n <div\n className={tw('flex flex-col gap-8', layout === 'sidebar' ? 'mt-8' : '-mt-16')}\n >\n {children}\n </div>\n </Container>\n </Fragment>\n );\n}\n\nexport default Page;\n","import { filterNull } from '@sqrzro/utility';\n\nimport { filterList } from '../../services/PermissionService';\n\nimport TabsComponent from '../TabsComponent';\nimport type { TabsComponentProps } from '../TabsComponent';\n\nasync function Tabs({ basePath, data }: Readonly<TabsComponentProps>): Promise<React.ReactElement> {\n return <TabsComponent basePath={basePath} data={await filterList(filterNull(data))} />;\n}\n\nexport default Tabs;\n","'use client';\n\nimport { Link, tw } from '@sqrzro/components';\n\nimport useNavigation from '../../hooks/useNavigation';\nimport type { NavigationAction } from '../../interfaces';\n\nexport interface TabsComponentProps {\n basePath?: string;\n data: NavigationAction[];\n}\n\nfunction TabsComponent({ basePath = '', data }: Readonly<TabsComponentProps>): React.ReactElement {\n const navigation = useNavigation(data, { basePath });\n\n return (\n <nav>\n <ul className=\"flex gap-4\">\n {navigation.map(({ href, isActive, label }) => (\n <li key={href}>\n <Link\n className={tw(\n 'block border-b-4 border-transparent px-1 pb-2 font-semibold',\n isActive ? 'border-primary' : 'opacity-80 hover:opacity-100'\n )}\n href={href}\n >\n {label}\n </Link>\n </li>\n ))}\n </ul>\n </nav>\n );\n}\n\nexport default TabsComponent;\n","import { Button } from '@sqrzro/components';\nimport type { LinkableAction } from '@sqrzro/interfaces';\n\nexport interface PanelProps {\n action?: LinkableAction;\n children: React.ReactNode;\n title?: string;\n}\n\nfunction Panel({ action, children, title }: Readonly<PanelProps>): React.ReactElement {\n return (\n <article className=\"bg-panel relative overflow-hidden rounded p-6 shadow-[0px_0px_0px_1px_rgba(9,9,11,0.07),0px_2px_2px_0px_rgba(9,9,11,0.05)]\">\n {title ? (\n <header>\n <h3 className=\"mb-4 border-b border-slate-200 pb-3 text-lg font-semibold leading-none\">\n {title}\n </h3>\n {action ? <Button href={action.href}>{action.label}</Button> : null}\n </header>\n ) : null}\n {children}\n </article>\n );\n}\n\nexport default Panel;\n","'use client';\n\nimport { useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nexport interface PageActionsProps {\n children: React.ReactNode;\n}\n\nfunction PageActions({ children }: Readonly<PageActionsProps>): React.ReactElement | null {\n const ref = useRef<HTMLElement | null>(null);\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n ref.current = document.getElementById('page-actions');\n setMounted(true);\n }, []);\n\n return mounted && ref.current ? createPortal(children, ref.current) : null;\n}\n\nexport default PageActions;\n","/* eslint-disable react/no-danger */\n\nimport { Inter as getInter } from 'next/font/google';\n\nimport { ClassNames, Toaster, tw } from '@sqrzro/components';\n\nimport { setConfig } from '../../services/ConfigService';\nimport type { Config as ConfigObject } from '../../services/ConfigService';\n\nimport classNames from '../../styles/config';\n\nimport Config from '../Config';\n\nconst inter = getInter({\n subsets: ['latin'],\n variable: '--font-inter',\n});\n\nexport interface RootLayoutProps {\n children: React.ReactNode;\n config?: ConfigObject;\n logo?: () => React.ReactElement;\n}\n\nfunction RootLayout({ children, config, logo }: Readonly<RootLayoutProps>): React.ReactElement {\n if (config) {\n setConfig(config, logo);\n }\n\n return (\n <html lang=\"en\">\n <head />\n <body\n className={tw(\n inter.variable,\n 'overflow-x-hidden overflow-y-scroll bg-slate-50 font-sans text-sm text-slate-800 has-[[data-modal][open]]:overflow-hidden'\n )}\n >\n <script\n dangerouslySetInnerHTML={{\n __html: \"(function(d){var v=d.createElement('div'),t=d.createElement('style'),s=v.style;s.overflowY='scroll';s.width='50';s.height='50';d.body.append(v);t.innerHTML='body:has([data-modal][open]){padding-right:'+(v.offsetWidth-v.clientWidth)+'px}';d.body.append(t);v.remove()}(document))\",\n }}\n />\n <Config data={config} />\n <ClassNames data={classNames} />\n {children}\n <Toaster />\n </body>\n </html>\n );\n}\n\nexport default RootLayout;\n","'use client';\n\nimport { tw, twx } from '@sqrzro/components';\nimport type { RegisteredClassNames } from '@sqrzro/components';\n\nconst classNames: RegisteredClassNames = twx({\n actionList: () => ({\n root: 'flex gap-2',\n }),\n button: (props) => ({\n root: {\n danger: 'border-red-500 bg-red-500 text-white',\n default: tw(\n 'text-md h-10 rounded border border-slate-300 bg-white px-5 text-slate-600',\n props?.isFullWidth ? 'w-full' : null\n ),\n primary: 'bg-button-bg text-button-text border-none font-semibold',\n },\n }),\n calendar: () => ({\n root: 'p-4 pb-3 text-sm text-slate-600',\n head: 'pb-2 text-center text-xs text-slate-400',\n month: 'w-full table-fixed',\n day: {\n default: 'h-10 border border-slate-200',\n highlighted: 'bg-slate-100',\n selected: 'bg-slate-200',\n },\n }),\n calendarNavigation: () => ({\n root: 'mb-6 flex items-center justify-between',\n title: 'text-base font-semibold',\n control: 'h-6 w-6 rounded-full border border-slate-300',\n previous: '-order-1',\n }),\n checkboxInput: (props) => ({\n root: tw('flex', props?.isInline ? 'gap-6' : 'flex-col gap-2'),\n icon: {\n default: 'h-6 w-6 rounded border border-slate-300',\n checked: 'bg-green-500',\n },\n label: 'pl-2 font-semibold',\n }),\n codeInput: () => ({\n input: {\n default: 'focus:border-primary h-10 rounded border border-slate-300 text-center',\n error: 'border-red-500',\n },\n }),\n definitionList: () => ({\n root: 'flex flex-col gap-4',\n row: 'border-b border-slate-200 pb-4',\n term: 'pb-1 text-slate-500',\n }),\n dropdown: () => ({\n list: 'overflow-hidden rounded',\n item: { default: 'block p-3 text-sm text-slate-700', selected: 'bg-slate-100' },\n title: 'block leading-none',\n meta: 'mt-1 block text-xs leading-none text-slate-500',\n icon: 'mr-2 h-5 w-5 bg-[url(/admin/images/chevron.svg)] bg-contain bg-center bg-no-repeat',\n clear: 'mr-2 h-4 w-4 bg-[url(/admin/images/close.svg)] bg-contain bg-center bg-no-repeat',\n }),\n editableFieldset: () => ({\n root: 'bg-panel grid grid-cols-[30%_1fr] gap-8 rounded p-8 shadow',\n title: 'mb-8 text-lg font-semibold leading-none text-slate-700',\n description: 'text-slate-600',\n actions: 'flex justify-end gap-2 border-t border-slate-200 pt-4',\n }),\n editableFormField: () => ({\n root: 'grid grid-cols-[25%_1fr] border-t border-slate-200 py-4',\n label: 'flex items-center font-semibold leading-none',\n field: 'flex min-h-10 items-center',\n }),\n emptyMessage: (props) => ({\n root: tw(\n 'relative mx-auto mt-4 w-full max-w-2xl p-16 text-center text-slate-500',\n props?.isMinimal\n ? null\n : 'rounded bg-white shadow before:pointer-events-none before:absolute before:inset-2 before:border-2 before:border-dashed'\n ),\n title: 'mb-2 text-pretty text-xl font-semibold leading-tight',\n description: 'text-pretty',\n action: 'mt-6 flex justify-center',\n }),\n fieldset: () => ({\n root: 'rounded bg-white p-8 shadow',\n title: 'mb-8 text-lg font-semibold leading-none text-slate-700',\n }),\n form: () => ({\n root: 'flex flex-col gap-6',\n }),\n formField: (props) => ({\n root: {\n default: props?.isEditable\n ? 'grid grid-cols-[25%_1fr] border-t border-slate-200 py-4'\n : '',\n },\n label: tw(\n 'flex font-semibold leading-none',\n props?.isEditable ? 'items-center' : 'mb-2 justify-between'\n ),\n details: 'mb-2 text-xs font-normal leading-none text-slate-500',\n optional: 'pl-2 text-xs font-normal leading-none text-slate-500',\n error: tw(\n 'mt-2 flex items-center gap-1.5 text-red-600 before:h-4 before:w-4 before:rounded-full before:bg-[url(/admin/images/danger.svg)] before:bg-contain',\n props?.isEditable ? 'col-start-2' : ''\n ),\n }),\n imageInput: () => ({\n root: 'h-64 rounded border border-slate-300 bg-slate-50 p-8',\n icon: 'mx-auto mb-2 block h-12 w-12 rounded-full border-2 border-slate-300',\n title: 'mb-1 font-semibold',\n description: 'text-xs italic text-slate-700',\n }),\n inputPanel: () => ({\n root: 'show my-1 origin-top rounded border border-slate-300 bg-white shadow-md',\n }),\n loadingModal: () => ({\n root: 'open:backdrop:fade py-16 backdrop:bg-slate-700/50 backdrop:backdrop-blur-sm',\n panel: 'text-center text-lg font-semibold text-white',\n }),\n modal: () => ({\n root: 'open:backdrop:fade py-16 backdrop:bg-slate-700/50 backdrop:backdrop-blur-sm',\n panel: 'show bg-panel row-start-2 mx-auto w-full max-w-lg rounded p-6 text-left shadow-xl',\n title: 'mb-6 text-lg font-semibold',\n actions: 'flex justify-end',\n }),\n multiInput: () => ({\n root: 'flex flex-col gap-2 pt-2',\n row: 'grid grid-cols-[1fr_auto] has-[>_button]:gap-2',\n }),\n objectInput: () => ({\n root: 'flex flex-col gap-2',\n }),\n passwordInput: () => ({\n action: {\n default:\n 'mr-2 h-6 w-6 overflow-hidden bg-[url(/admin/images/eye.svg)] bg-no-repeat indent-12',\n selected: 'bg-bottom',\n },\n }),\n staticTextInput: () => ({\n root: {\n default:\n 'text-md flex min-h-10 flex-col justify-center rounded border border-slate-300 bg-white p-3',\n error: 'border-red-500',\n },\n label: 'block leading-none',\n meta: 'mt-1 block text-xs leading-none text-slate-500',\n placeholder: 'block leading-none text-slate-500',\n }),\n switch: () => ({\n root: 'flex gap-4',\n input: {\n default:\n 'h-6 w-10 flex-none cursor-pointer rounded-full bg-slate-300 p-1 transition-colors',\n checked: 'bg-green-500',\n },\n control: {\n default:\n 'h-4 w-4 translate-x-0 transform rounded-full bg-white shadow-md transition-transform',\n checked: 'translate-x-full',\n },\n label: 'font-semibold',\n details: 'block text-xs text-slate-500',\n }),\n textArea: () => ({\n root: {\n default: 'text-md focus:border-primary rounded border border-slate-300 px-3 py-2',\n error: 'border-red-500',\n },\n }),\n textButton: () => ({\n root: { danger: 'text-red-600' },\n }),\n textInput: () => ({\n root: {\n default: 'text-md focus:border-primary h-10 rounded border border-slate-300 px-3',\n error: 'border-red-500',\n },\n prefix: {\n default:\n 'peer-focus:border-primary relative -mr-1 rounded-l border border-slate-300 bg-white px-3 text-sm text-slate-600',\n },\n }),\n toast: () => ({\n root: {\n default: 'rounded border px-4 py-2',\n success: 'border-green-300 bg-green-100 text-green-700',\n error: 'border-red-300 bg-red-100 text-red-700',\n },\n }),\n});\n\nexport default classNames;\n","'use client';\n\nimport { setConfig } from '../../services/ConfigService';\nimport type { Config as ConfigObject } from '../../services/ConfigService';\n\ninterface ConfigProps {\n data?: ConfigObject;\n}\n\nfunction Config({ data }: Readonly<ConfigProps>): null {\n if (data) {\n setConfig(data);\n }\n return null;\n}\n\nexport default Config;\n","'use client';\n\nimport { EditableForm, EditableRadioFormField, EditableSwitchFormField } from '@sqrzro/components';\nimport { useEditableForm } from '@sqrzro/hooks';\n\nimport { submitSettingsForm } from '../../services/SettingsService';\nimport type { SettingsFormFields } from '../../services/SettingsService';\n\ninterface SettingsFormProps {\n defaults: Partial<SettingsFormFields>;\n}\n\nconst options: Record<string, string> = { sidebar: 'Side bar', topbar: 'Top bar' };\n\nfunction SettingsForm({ defaults }: Readonly<SettingsFormProps>): JSX.Element {\n const { fieldProps, formProps } = useEditableForm({\n defaults,\n onSubmit: submitSettingsForm,\n });\n\n return (\n <EditableForm title=\"Appearance\" {...formProps}>\n <EditableRadioFormField\n {...fieldProps('layout')}\n options={options}\n renderValue={(value): string => (value ? options[value] || '-' : '-')}\n />\n <EditableSwitchFormField {...fieldProps('isDark')} label=\"Dark mode\" />\n </EditableForm>\n );\n}\n\nexport default SettingsForm;\n","import { getLayout } from '../../services/SettingsService';\n\nimport Page from '../Page';\nimport SettingsForm from '../SettingsForm';\n\ninterface SettingsPageProps {\n children: React.ReactNode;\n}\n\nasync function SettingsPage({\n children,\n}: Readonly<SettingsPageProps>): Promise<React.ReactElement> {\n const layout = await getLayout();\n\n return (\n <Page title=\"Settings\">\n <div className=\"flex flex-col gap-6\">\n <SettingsForm defaults={{ layout }} />\n {children}\n </div>\n </Page>\n );\n}\n\nexport default SettingsPage;\n","'use client';\n\nimport { Link, tw } from '@sqrzro/components';\nimport { usePathname, useSearchParams } from 'next/navigation';\n\nexport interface TableItemObject {\n [key: string]: string;\n id: string;\n}\n\nexport interface TableColumnObject {\n key: string;\n title?: string;\n type?: 'number' | 'string';\n}\n\nexport interface TableClientComponentProps {\n columns: string[] | TableColumnObject[];\n data: TableItemObject[];\n}\n\nfunction createFilterLink(\n pathname: string,\n searchParams: URLSearchParams,\n filters: Record<string, string>\n): string {\n const updatedSearchParams = new URLSearchParams({\n ...Object.fromEntries(searchParams),\n ...filters,\n });\n\n return `${pathname}?${updatedSearchParams.toString()}`;\n}\n\nfunction getDir(currentDir: string | null, isSortActive?: boolean): string {\n if (isSortActive) {\n return currentDir === 'asc' ? 'desc' : 'asc';\n }\n return 'asc';\n}\n\nfunction createSortLink(pathname: string, searchParams: URLSearchParams, sort: string): string {\n const dir = getDir(searchParams.get('dir'), searchParams.get('sort') === sort);\n return createFilterLink(pathname, searchParams, { sort, dir });\n}\n\nfunction getSortIconProps(searchParams: URLSearchParams, sort: string): { dir: string | null } {\n if (searchParams.get('sort') === sort) {\n return { dir: searchParams.get('dir') };\n }\n return { dir: null };\n}\n\nfunction isStringArray(array: unknown[]): array is string[] {\n return array.every((item) => typeof item === 'string');\n}\n\nfunction parseColumns(columns: string[] | TableColumnObject[]): TableColumnObject[] {\n if (columns.length === 0) {\n return [];\n }\n if (isStringArray(columns)) {\n return columns.map((key) => ({ key }));\n }\n return columns;\n}\n\nfunction TableClientComponent({\n columns,\n data,\n}: Readonly<TableClientComponentProps>): React.ReactElement {\n const pathname = usePathname();\n const searchParams = useSearchParams();\n\n const parsedColumns = parseColumns(columns);\n const hasTitles = parsedColumns.some((column) => column.title);\n\n return (\n <div className=\"bg-white shadow-sm\">\n <table className=\"w-full\">\n {hasTitles ? (\n <thead>\n <tr>\n {parsedColumns.map((column) => (\n <th\n key={column.key}\n className={tw(\n 'p-4',\n column.type === 'number' ? 'text-right' : 'text-left'\n )}\n >\n {column.title ? (\n <Link\n href={createSortLink(\n pathname,\n searchParams,\n column.key\n )}\n >\n {column.title}{' '}\n </Link>\n ) : null}\n </th>\n ))}\n </tr>\n </thead>\n ) : null}\n <tbody>\n {data.map((item) => (\n <tr key={item.id} className=\"odd:bg-slate-100\">\n {parsedColumns.map((column) => (\n <td\n key={column.key}\n className={tw(\n 'border-x border-transparent p-4',\n getSortIconProps(searchParams, column.key).dir\n ? 'border-sky-300 bg-sky-300/10'\n : '',\n column.type === 'number' ? 'text-right' : 'text-left'\n )}\n >\n {item[column.key]}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nexport default TableClientComponent;\n","import type { Errorable } from '@sqrzro/interfaces';\n\nimport TableClientComponent from '../TableClientComponent';\nimport type { TableClientComponentProps, TableItemObject } from '../TableClientComponent';\n\nfunction defaultTransformer<T>(item: T): TableItemObject {\n return {\n id: (item as unknown as TableItemObject).id,\n ...item,\n };\n}\n\nexport interface TableProps<T> extends Omit<TableClientComponentProps, 'data'> {\n fn: (filters?: Record<string, string>) => Promise<Errorable<T[]>>;\n searchParams?: Record<string, string>;\n}\n\nasync function Table<T>({\n columns,\n fn,\n searchParams,\n}: Readonly<TableProps<T>>): Promise<React.ReactElement> {\n const [response, error] = await fn(searchParams);\n\n if (error) {\n return <div>Error</div>;\n }\n\n const data = response.map(defaultTransformer);\n\n return <TableClientComponent columns={columns} data={data} />;\n}\n\nexport default Table;\n"]}