@accounter/client 0.0.8-alpha-20251021150615-800574fc6d416cd319de216c97b431643d8958a2 → 0.0.8-alpha-20251021225827-178e480c997a9811913e16f85cb94329041b096e
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.
- package/CHANGELOG.md +67 -1
- package/dist/assets/Checkbox-CxedbJAl.js +6 -0
- package/dist/assets/Progress-D5SuJtCd.js +1 -0
- package/dist/assets/Typography-BQFz-z7L.js +1 -0
- package/dist/assets/accordion-COWOBKuq.js +1 -0
- package/dist/assets/accountant-approvals-Bd2y8us_.js +1 -0
- package/dist/assets/all-charges-SWBnaZu7.js +1 -0
- package/dist/assets/arrow-up-down-dZmrBLse.js +6 -0
- package/dist/assets/business--GVVfDEa.js +37 -0
- package/dist/assets/business-transactions-single-BsbkUf_H.js +1 -0
- package/dist/assets/business-trip-ByXPVXdG.js +1 -0
- package/dist/assets/charges-filters-D43UbXob.js +1 -0
- package/dist/assets/charges-ledger-validation-D0uMH_JE.js +1 -0
- package/dist/assets/chart-ClU1KbWe.js +74 -0
- package/dist/assets/data-table-pagination-D9Y0_Tn8.js +11 -0
- package/dist/assets/editable-business-trip-DhqOQBPa.js +16 -0
- package/dist/assets/graphql-document-dedupe-fragments-ByT8-wlV.js +1 -0
- package/dist/assets/index-1U6rQgQe.js +6 -0
- package/dist/assets/index-3-AKn8tg.js +1 -0
- package/dist/assets/index-91A2PLZ6.js +137 -0
- package/dist/assets/index-BBHuCWRn.js +1 -0
- package/dist/assets/index-BPNuFFtx.js +1 -0
- package/dist/assets/index-BXqHnRVY.js +1 -0
- package/dist/assets/index-BciOH8FS.js +1 -0
- package/dist/assets/index-BjHuUHDO.js +1 -0
- package/dist/assets/index-BxKmoNQd.js +1 -0
- package/dist/assets/index-C3bqiFIv.js +2 -0
- package/dist/assets/index-C5MeepK_.js +11 -0
- package/dist/assets/index-CAwm68Mg.js +1 -0
- package/dist/assets/index-CJ8OGXxv.js +1 -0
- package/dist/assets/index-CJyY-qF6.js +1 -0
- package/dist/assets/index-CMYnx46_.js +6 -0
- package/dist/assets/index-CNrwxUZ7.js +1 -0
- package/dist/assets/index-CvV5z5r9.js +876 -0
- package/dist/assets/index-D08H2GXq.js +17 -0
- package/dist/assets/index-GFsPY1p4.js +2 -0
- package/dist/assets/index-KwNwThNu.js +1 -0
- package/dist/assets/index-YA8IBFyB.js +1 -0
- package/dist/assets/index-ZpyI3qxW.js +24 -0
- package/dist/assets/index-gdTXrWXt.css +1 -0
- package/dist/assets/index-ytnIEraq.js +9 -0
- package/dist/assets/{index.es-DHwHzag1.js → index.es-CYeQ4a5s.js} +5 -5
- package/dist/assets/issue-document-CdikNnO2.js +1 -0
- package/dist/assets/login-page-effgZS3V.js +1 -0
- package/dist/assets/missing-info-charges-CnPFTzoZ.js +1 -0
- package/dist/assets/page-not-found-D8YlgDOm.js +1 -0
- package/dist/assets/pencil-mxW0-tGM.js +6 -0
- package/dist/assets/report-commentary-row-DCozKgVE.js +1 -0
- package/dist/assets/save-CHlytUqu.js +11 -0
- package/dist/assets/sequential-CAnleQny.js +1 -0
- package/dist/assets/similar-charges-by-business-modal-Dzbspk_r.js +1 -0
- package/dist/assets/sub-Cp_PhKiD.js +1 -0
- package/dist/assets/subMonths-DCj_iXAn.js +1 -0
- package/dist/index.html +2 -2
- package/package.json +6 -5
- package/src/app.tsx +35 -25
- package/src/components/business/business-header.tsx +68 -0
- package/src/components/business/charges-section.tsx +82 -0
- package/src/components/business/charts-section.tsx +115 -0
- package/src/components/business/configurations-section.tsx +885 -0
- package/src/components/business/contact-info-section.tsx +536 -0
- package/src/components/business/contracts-section.tsx +196 -0
- package/src/components/business/documents-section.tsx +26 -0
- package/src/components/business/index.tsx +171 -0
- package/src/components/business/integrations-section.tsx +477 -0
- package/src/components/business/transactions-section.tsx +26 -0
- package/src/components/business-transactions/business-extended-info.tsx +22 -28
- package/src/components/business-transactions/business-transactions-single.tsx +3 -3
- package/src/components/business-transactions/index.tsx +13 -2
- package/src/components/business-trips/business-trip.tsx +3 -3
- package/src/components/charges/cells/business-trip.tsx +6 -8
- package/src/components/charges/cells/counterparty.tsx +7 -5
- package/src/components/charges/charge-extended-info-menu.tsx +27 -21
- package/src/components/charges/charges-row.tsx +12 -10
- package/src/components/charges/charges-table.tsx +15 -9
- package/src/components/clients/contracts/modify-contract-dialog.tsx +464 -0
- package/src/components/clients/modify-client-dialog.tsx +276 -0
- package/src/components/common/accounter-table.tsx +6 -5
- package/src/components/common/business-trip-report/parts/core-expense-row.tsx +11 -9
- package/src/components/common/business-trip-report/parts/uncategorized-transactions.tsx +11 -13
- package/src/components/common/buttons/index.ts +0 -2
- package/src/components/common/buttons/logout-button.tsx +7 -6
- package/src/components/common/documents/issue-document/index.tsx +3 -3
- package/src/components/common/documents/issue-document/{recent-client-docs.tsx → recent-business-docs.tsx} +19 -13
- package/src/components/common/documents-to-charge-matcher/selection-handler/index.tsx +4 -2
- package/src/components/common/documents-to-charge-matcher/selection-handler/wide-filtered-selection.tsx +5 -7
- package/src/components/common/forms/business-card.tsx +1 -0
- package/src/components/common/forms/edit-document.tsx +23 -10
- package/src/components/common/forms/modify-business-fields.tsx +2 -19
- package/src/components/common/inputs/combo-box.tsx +1 -1
- package/src/components/common/new-documents-list.tsx +10 -8
- package/src/components/documents-table/cells/creditor.tsx +11 -4
- package/src/components/documents-table/cells/debtor.tsx +11 -4
- package/src/components/error-boundary.tsx +189 -0
- package/src/components/layout/breadcrumbs.tsx +77 -0
- package/src/components/layout/dashboard-layout.tsx +4 -0
- package/src/components/layout/document-title.tsx +31 -0
- package/src/components/layout/navigation-progress.tsx +52 -0
- package/src/components/layout/page-skeleton.tsx +49 -0
- package/src/components/layout/sidelinks.tsx +28 -27
- package/src/components/ledger-table/counterparty-cell.tsx +19 -13
- package/src/components/login-page.tsx +2 -1
- package/src/components/reports/corporate-tax-ruling-compliance-report/index.tsx +3 -3
- package/src/components/reports/profit-and-loss-report/index.tsx +3 -3
- package/src/components/reports/tax-report/index.tsx +3 -3
- package/src/components/reports/trial-balance-report/trial-balance-report-group.tsx +4 -6
- package/src/components/reports/trial-balance-report/trial-balance-report-sort-code.tsx +8 -11
- package/src/components/screens/businesses/business.tsx +56 -0
- package/src/components/screens/charges/charge.tsx +22 -9
- package/src/components/screens/documents/issue-documents/edit-issue-document-modal.tsx +4 -4
- package/src/components/transactions-table/cells/counterparty.tsx +9 -2
- package/src/components/transactions-table/cells-legacy/counterparty.tsx +9 -2
- package/src/components/ui/progress.tsx +25 -0
- package/src/components/ui/skeleton.tsx +12 -0
- package/src/gql/gql.ts +93 -9
- package/src/gql/graphql.ts +289 -9
- package/src/helpers/contracts.ts +22 -0
- package/src/helpers/currency.ts +5 -0
- package/src/helpers/index.ts +2 -0
- package/src/helpers/pcn874.ts +17 -0
- package/src/hooks/use-add-sort-code.ts +1 -1
- package/src/hooks/use-add-tag.ts +1 -1
- package/src/hooks/use-create-contract.ts +62 -0
- package/src/hooks/use-delete-contract.ts +64 -0
- package/src/hooks/use-delete-tag.ts +1 -1
- package/src/hooks/use-get-all-contracts.ts +0 -1
- package/src/hooks/use-insert-client.ts +80 -0
- package/src/hooks/use-merge-businesses.ts +1 -1
- package/src/hooks/use-merge-charges.ts +1 -1
- package/src/hooks/use-update-client.ts +75 -0
- package/src/hooks/use-update-contract.ts +69 -0
- package/src/index.tsx +4 -22
- package/src/providers/auth-guard.tsx +14 -23
- package/src/providers/index.tsx +7 -2
- package/src/providers/urql-client.ts +86 -0
- package/src/providers/urql.tsx +7 -12
- package/src/providers/user-provider.tsx +3 -2
- package/src/router/config.tsx +534 -0
- package/src/router/layouts/dashboard-layout.tsx +20 -0
- package/src/router/layouts/root-layout.tsx +69 -0
- package/src/router/loaders/auth-loader.ts +32 -0
- package/src/router/loaders/business-loader.ts +25 -0
- package/src/router/loaders/charge-loader.ts +25 -0
- package/src/router/loaders/index.ts +17 -0
- package/src/router/routes.ts +88 -0
- package/src/router/types.ts +62 -0
- package/dist/assets/index-0eCf1BcD.css +0 -1
- package/dist/assets/index-DHTbHvtz.js +0 -1188
- package/src/components/common/buttons/button-with-label.tsx +0 -41
- package/src/components/common/buttons/button.tsx +0 -44
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{j as e,c as t,dD as s}from"./index-CvV5z5r9.js";const o=()=>e.jsx(t,{title:"New Document",description:"Issue a document for a client",children:e.jsx(s,{})});export{o as IssueDocumentScreen};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as n,g4 as j,g5 as f,k as p,ab as b,j as e,l as v,ak as o,al as l,am as c,aq as i,Q as d,ao as m,B as w,ac as N,g6 as y,t as x,ax as u}from"./index-CvV5z5r9.js";const S=N({username:u().min(2).max(50),password:u().min(2).max(50)});function E(){const{authService:a}=n.useContext(j);n.useEffect(()=>{a.logout()},[a]);const h=f(),s=p({resolver:b(S),defaultValues:{username:"",password:""}});function g(r){try{a.login(r.username,r.password).then(t=>{h(y.HOME)}),x.success("Success",{description:"You have successfully logged in."})}catch(t){console.error(t),x.error("Error",{description:"Invalid credentials. Please try again."})}}return e.jsxs("div",{className:"w-full flex flex-col justify-center items-center h-screen lg:grid lg:min-h-[200px] lg:grid-cols-2 xl:min-h-screen",children:[e.jsx("div",{className:"flex items-center justify-center",children:e.jsx(v,{...s,children:e.jsxs("form",{onSubmit:s.handleSubmit(g),className:"space-y-8 w-[300px]",children:[e.jsxs("div",{className:"grid gap-2 text-center",children:[e.jsx("h1",{className:"text-3xl font-bold",children:"Accounter"}),e.jsx("h1",{className:"text-3xl font-bold",children:"Login"}),e.jsx("p",{className:"text-balance text-muted-foreground",children:"Enter your credentials to login."})]}),e.jsx(o,{control:s.control,name:"username",render:({field:r})=>e.jsxs(l,{children:[e.jsx(c,{children:"Username"}),e.jsx(i,{children:e.jsx(d,{placeholder:"Username",...r})}),e.jsx(m,{})]})}),e.jsx(o,{control:s.control,name:"password",render:({field:r})=>e.jsxs(l,{children:[e.jsx(c,{children:"Password"}),e.jsx(i,{children:e.jsx(d,{placeholder:"Password",type:"password",...r})}),e.jsx(m,{})]})}),e.jsx(w,{disabled:s.formState.isSubmitting||!s.formState.isValid,className:"w-full font-semibold",type:"submit",children:"Login"})]})})}),e.jsx("div",{className:"hidden bg-muted lg:block bg-black rounded-tl-3xl rounded-bl-3xl",children:e.jsx("div",{className:"flex flex-row justify-center items-center h-screen",children:e.jsx("img",{src:"../../icons/guild-logo.svg",alt:"nature",className:"w-[100px] h-[100px] object-cover"})})})]})}export{E as LoginPage};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as s,F as S,u as D,a as w,j as e,T as E,B as b,P as N,b as P,c as R,L as T,C as q,E as y,I as z,M as A,d as B}from"./index-CvV5z5r9.js";import{M as F}from"./index-C5MeepK_.js";import"./Checkbox-CxedbJAl.js";const Q=()=>{const{setFiltersContext:g}=s.useContext(S),[n,u]=s.useState(void 0),[i,h]=s.useState(void 0),[o,m]=s.useState(void 0),[r,C]=s.useState(!1),[t,c]=s.useState([]),{get:x}=D(),[p,f]=s.useState(x("page")?Number(x("page")):1),j=s.useCallback((a,v)=>{t.map(d=>d.id).includes(a)?c(t.filter(d=>d.id!==a)):c([...t,{id:a,onChange:v}])},[t]),[{data:l,fetching:M}]=w({query:B,variables:{page:p,limit:100}});function I(){c([])}return s.useEffect(()=>{g(e.jsxs("div",{className:"flex flex-row gap-x-5",children:[e.jsx(E,{label:"Expand all accounts",children:e.jsx(b,{variant:"outline",size:"icon",className:"size-7.5",onClick:()=>C(a=>!a),children:r?e.jsx(N,{className:"size-5"}):e.jsx(P,{className:"size-5"})})}),e.jsx(F,{selected:t,resetMerge:I})]}))},[l,M,p,r,g,f,C,t]),e.jsxs(R,{title:"Missing Info Charges",description:"Review charges with missing required details",children:[!l?.chargesWithMissingRequiredInfo.nodes||M?e.jsx(T,{className:"h-10 w-10 animate-spin mr-2 self-center"}):e.jsx(q,{setEditChargeId:u,setInsertDocument:h,setMatchDocuments:m,toggleMergeCharge:j,mergeSelectedCharges:new Set(t.map(a=>a.id)),data:l?.chargesWithMissingRequiredInfo?.nodes,isAllOpened:r}),n&&e.jsx(y,{chargeId:n?.id,close:()=>u(void 0),onChange:n.onChange}),i&&e.jsx(z,{chargeId:i.id,onChange:i.onChange,close:()=>h(void 0)}),o&&e.jsx(A,{chargeId:o.id,ownerId:o.ownerId,setMatchDocuments:()=>m(void 0)})]})};export{Q as MissingInfoCharges};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{j as a,a0 as s,a1 as e,a2 as r,a4 as d}from"./index-CvV5z5r9.js";const o=()=>a.jsxs(s,{className:"m-5",children:[a.jsx(e,{children:a.jsx(r,{children:"404"})}),a.jsx(d,{children:a.jsx("p",{children:"Page not found"})})]});export{o as PageNotFound};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{V as a}from"./index-CvV5z5r9.js";/**
|
|
2
|
+
* @license lucide-react v0.546.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const e=[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]],c=a("pencil",e);export{c as P};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as i,D as c,eM as m,j as t,R as h,cm as x,eN as j}from"./index-CvV5z5r9.js";const p=({subCommentaryData:a,dataRow:o})=>{const[s,l]=i.useState(!1),r=a.map(e=>c(m,e)),d=t.jsx(x,{toggleExpansion:l,isExpanded:s});return t.jsxs(t.Fragment,{children:[o(d),s&&t.jsx("tr",{children:t.jsx("td",{colSpan:99,children:t.jsxs(h,{striped:!0,highlightOnHover:!0,className:"ml-8 w-full h-full",children:[t.jsx("thead",{children:t.jsxs("tr",{children:[t.jsx("th",{children:"Entity"}),t.jsx("th",{children:"Amount"})]})}),t.jsxs("tbody",{children:[r?.sort((e,n)=>e.financialEntity.name.localeCompare(n.financialEntity.name)).map(e=>t.jsxs("tr",{children:[t.jsx("td",{children:e.financialEntity.name}),t.jsx("td",{children:e.amount.formatted})]},e.financialEntity.id)),t.jsx("tr",{children:t.jsx("td",{colSpan:8})})]})]})})})]})},g=({commentaryData:a,dataRow:o})=>{const[s,l]=i.useState(!1),{records:r}=c(j,a),d=r.length?t.jsx(x,{toggleExpansion:l,isExpanded:s}):null;return t.jsxs(t.Fragment,{children:[o(d),s&&t.jsx("tr",{children:t.jsx("td",{colSpan:99,children:t.jsxs(h,{striped:!0,highlightOnHover:!0,className:"ml-8 w-full h-full",children:[t.jsx("thead",{children:t.jsxs("tr",{children:[t.jsx("th",{children:"Sort Code"}),t.jsx("th",{children:"Amount"}),t.jsx("th",{})]})}),t.jsxs("tbody",{children:[r?.sort((e,n)=>e.sortCode.key-n.sortCode.key).map(e=>t.jsx(p,{dataRow:n=>t.jsxs("tr",{children:[t.jsxs("td",{children:[e.sortCode.key," - ",e.sortCode.name]}),t.jsx("td",{children:e.amount.formatted}),t.jsx("td",{children:n})]},e.sortCode.key),subCommentaryData:e.records},e.sortCode.key)),t.jsx("tr",{children:t.jsx("td",{colSpan:8})})]})]})})})]})};export{g as R};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import{V as a}from"./index-CvV5z5r9.js";/**
|
|
2
|
+
* @license lucide-react v0.546.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const e=[["path",{d:"M10 12h4",key:"a56b0p"}],["path",{d:"M10 8h4",key:"1sr2af"}],["path",{d:"M14 21v-3a2 2 0 0 0-4 0v3",key:"1rgiei"}],["path",{d:"M6 10H4a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-2",key:"secmi2"}],["path",{d:"M6 21V5a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v16",key:"16ra0t"}]],h=a("building-2",e);/**
|
|
7
|
+
* @license lucide-react v0.546.0 - ISC
|
|
8
|
+
*
|
|
9
|
+
* This source code is licensed under the ISC license.
|
|
10
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
11
|
+
*/const t=[["path",{d:"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z",key:"1c8476"}],["path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7",key:"1ydtos"}],["path",{d:"M7 3v4a1 1 0 0 0 1 1h7",key:"t51u73"}]],o=a("save",t);export{h as B,o as S};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function Un(n){return function(){return n}}const ma=Math.cos,da=Math.sin,ya=Math.sqrt,It=Math.PI,pa=2*It;function Rt(n){return typeof n=="object"&&"length"in n?n:Array.from(n)}function yn(n,e){if((o=n.length)>1)for(var t=1,r,u,a=n[e[0]],o,i=a.length;t<o;++t)for(u=a,a=n[e[t]],r=0;r<i;++r)a[r][1]+=a[r][0]=isNaN(u[r][1])?u[r][0]:u[r][1]}function ve(n){for(var e=n.length,t=new Array(e);--e>=0;)t[e]=e;return t}function qt(n,e){return n[e]}function Pt(n){const e=[];return e.key=n,e}function xa(){var n=Un([]),e=ve,t=yn,r=qt;function u(a){var o=Array.from(n.apply(this,arguments),Pt),i,c=o.length,f=-1,g;for(const l of a)for(i=0,++f;i<c;++i)(o[i][f]=[0,+r(l,o[i].key,f,a)]).data=l;for(i=0,g=Rt(e(o));i<c;++i)o[g[i]].index=i;return t(o,g),o}return u.keys=function(a){return arguments.length?(n=typeof a=="function"?a:Un(Array.from(a)),u):n},u.value=function(a){return arguments.length?(r=typeof a=="function"?a:Un(+a),u):r},u.order=function(a){return arguments.length?(e=a==null?ve:typeof a=="function"?a:Un(Array.from(a)),u):e},u.offset=function(a){return arguments.length?(t=a??yn,u):t},u}function Ma(n,e){if((r=n.length)>0){for(var t,r,u=0,a=n[0].length,o;u<a;++u){for(o=t=0;t<r;++t)o+=n[t][u][1]||0;if(o)for(t=0;t<r;++t)n[t][u][1]/=o}yn(n,e)}}function wa(n,e){if((u=n.length)>0){for(var t=0,r=n[e[0]],u,a=r.length;t<a;++t){for(var o=0,i=0;o<u;++o)i+=n[o][t][1]||0;r[t][1]+=r[t][0]=-i/2}yn(n,e)}}function ba(n,e){if(!(!((o=n.length)>0)||!((a=(u=n[e[0]]).length)>0))){for(var t=0,r=1,u,a,o;r<a;++r){for(var i=0,c=0,f=0;i<o;++i){for(var g=n[e[i]],l=g[r][1]||0,h=g[r-1][1]||0,p=(l-h)/2,d=0;d<i;++d){var v=n[e[d]],k=v[r][1]||0,C=v[r-1][1]||0;p+=k-C}c+=l,f+=p*l}u[r-1][1]+=u[r-1][0]=t,c&&(t-=f/c)}u[r-1][1]+=u[r-1][0]=t,yn(n,e)}}function $n(n,e){return n==null||e==null?NaN:n<e?-1:n>e?1:n>=e?0:NaN}function Et(n,e){return n==null||e==null?NaN:e<n?-1:e>n?1:e>=n?0:NaN}function fe(n){let e,t,r;n.length!==2?(e=$n,t=(i,c)=>$n(n(i),c),r=(i,c)=>n(i)-c):(e=n===$n||n===Et?n:zt,t=n,r=n);function u(i,c,f=0,g=i.length){if(f<g){if(e(c,c)!==0)return g;do{const l=f+g>>>1;t(i[l],c)<0?f=l+1:g=l}while(f<g)}return f}function a(i,c,f=0,g=i.length){if(f<g){if(e(c,c)!==0)return g;do{const l=f+g>>>1;t(i[l],c)<=0?f=l+1:g=l}while(f<g)}return f}function o(i,c,f=0,g=i.length){const l=u(i,c,f,g-1);return l>f&&r(i[l-1],c)>-r(i[l],c)?l-1:l}return{left:u,center:o,right:a}}function zt(){return 0}function Zt(n){return n===null?NaN:+n}function*va(n,e){for(let t of n)t!=null&&(t=+t)>=t&&(yield t)}const Vt=fe($n),ut=Vt.right;fe(Zt).center;class Te extends Map{constructor(e,t=Bt){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:t}}),e!=null)for(const[r,u]of e)this.set(r,u)}get(e){return super.get(ke(this,e))}has(e){return super.has(ke(this,e))}set(e,t){return super.set(Qt(this,e),t)}delete(e){return super.delete(Xt(this,e))}}function ke({_intern:n,_key:e},t){const r=e(t);return n.has(r)?n.get(r):t}function Qt({_intern:n,_key:e},t){const r=e(t);return n.has(r)?n.get(r):(n.set(r,t),t)}function Xt({_intern:n,_key:e},t){const r=e(t);return n.has(r)&&(t=n.get(r),n.delete(r)),t}function Bt(n){return n!==null&&typeof n=="object"?n.valueOf():n}const _t=Math.sqrt(50),Gt=Math.sqrt(10),Jt=Math.sqrt(2);function Fn(n,e,t){const r=(e-n)/Math.max(0,t),u=Math.floor(Math.log10(r)),a=r/Math.pow(10,u),o=a>=_t?10:a>=Gt?5:a>=Jt?2:1;let i,c,f;return u<0?(f=Math.pow(10,-u)/o,i=Math.round(n*f),c=Math.round(e*f),i/f<n&&++i,c/f>e&&--c,f=-f):(f=Math.pow(10,u)*o,i=Math.round(n/f),c=Math.round(e/f),i*f<n&&++i,c*f>e&&--c),c<i&&.5<=t&&t<2?Fn(n,e,t*2):[i,c,f]}function te(n,e,t){if(e=+e,n=+n,t=+t,!(t>0))return[];if(n===e)return[n];const r=e<n,[u,a,o]=r?Fn(e,n,t):Fn(n,e,t);if(!(a>=u))return[];const i=a-u+1,c=new Array(i);if(r)if(o<0)for(let f=0;f<i;++f)c[f]=(a-f)/-o;else for(let f=0;f<i;++f)c[f]=(a-f)*o;else if(o<0)for(let f=0;f<i;++f)c[f]=(u+f)/-o;else for(let f=0;f<i;++f)c[f]=(u+f)*o;return c}function re(n,e,t){return e=+e,n=+n,t=+t,Fn(n,e,t)[2]}function ue(n,e,t){e=+e,n=+n,t=+t;const r=e<n,u=r?re(e,n,t):re(n,e,t);return(r?-1:1)*(u<0?1/-u:u)}function Kt(n,e,t){n=+n,e=+e,t=(u=arguments.length)<2?(e=n,n=0,1):u<3?1:+t;for(var r=-1,u=Math.max(0,Math.ceil((e-n)/t))|0,a=new Array(u);++r<u;)a[r]=n+r*t;return a}function B(n,e){switch(arguments.length){case 0:break;case 1:this.range(n);break;default:this.range(e).domain(n);break}return this}function Rn(n,e){switch(arguments.length){case 0:break;case 1:{typeof n=="function"?this.interpolator(n):this.range(n);break}default:{this.domain(n),typeof e=="function"?this.interpolator(e):this.range(e);break}}return this}const Ce=Symbol("implicit");function at(){var n=new Te,e=[],t=[],r=Ce;function u(a){let o=n.get(a);if(o===void 0){if(r!==Ce)return r;n.set(a,o=e.push(a)-1)}return t[o%t.length]}return u.domain=function(a){if(!arguments.length)return e.slice();e=[],n=new Te;for(const o of a)n.has(o)||n.set(o,e.push(o)-1);return u},u.range=function(a){return arguments.length?(t=Array.from(a),u):t.slice()},u.unknown=function(a){return arguments.length?(r=a,u):r},u.copy=function(){return at(e,t).unknown(r)},B.apply(u,arguments),u}function ot(){var n=at().unknown(void 0),e=n.domain,t=n.range,r=0,u=1,a,o,i=!1,c=0,f=0,g=.5;delete n.unknown;function l(){var h=e().length,p=u<r,d=p?u:r,v=p?r:u;a=(v-d)/Math.max(1,h-c+f*2),i&&(a=Math.floor(a)),d+=(v-d-a*(h-c))*g,o=a*(1-c),i&&(d=Math.round(d),o=Math.round(o));var k=Kt(h).map(function(C){return d+a*C});return t(p?k.reverse():k)}return n.domain=function(h){return arguments.length?(e(h),l()):e()},n.range=function(h){return arguments.length?([r,u]=h,r=+r,u=+u,l()):[r,u]},n.rangeRound=function(h){return[r,u]=h,r=+r,u=+u,i=!0,l()},n.bandwidth=function(){return o},n.step=function(){return a},n.round=function(h){return arguments.length?(i=!!h,l()):i},n.padding=function(h){return arguments.length?(c=Math.min(1,f=+h),l()):c},n.paddingInner=function(h){return arguments.length?(c=Math.min(1,h),l()):c},n.paddingOuter=function(h){return arguments.length?(f=+h,l()):f},n.align=function(h){return arguments.length?(g=Math.max(0,Math.min(1,h)),l()):g},n.copy=function(){return ot(e(),[r,u]).round(i).paddingInner(c).paddingOuter(f).align(g)},B.apply(l(),arguments)}function it(n){var e=n.copy;return n.padding=n.paddingOuter,delete n.paddingInner,delete n.paddingOuter,n.copy=function(){return it(e())},n}function Ta(){return it(ot.apply(null,arguments).paddingInner(1))}function ce(n,e,t){n.prototype=e.prototype=t,t.constructor=n}function ft(n,e){var t=Object.create(n.prototype);for(var r in e)t[r]=e[r];return t}function bn(){}var pn=.7,Hn=1/pn,cn="\\s*([+-]?\\d+)\\s*",xn="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*",P="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*",jt=/^#([0-9a-f]{3,8})$/,nr=new RegExp(`^rgb\\(${cn},${cn},${cn}\\)$`),er=new RegExp(`^rgb\\(${P},${P},${P}\\)$`),tr=new RegExp(`^rgba\\(${cn},${cn},${cn},${xn}\\)$`),rr=new RegExp(`^rgba\\(${P},${P},${P},${xn}\\)$`),ur=new RegExp(`^hsl\\(${xn},${P},${P}\\)$`),ar=new RegExp(`^hsla\\(${xn},${P},${P},${xn}\\)$`),Ue={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};ce(bn,Mn,{copy(n){return Object.assign(new this.constructor,this,n)},displayable(){return this.rgb().displayable()},hex:Se,formatHex:Se,formatHex8:or,formatHsl:ir,formatRgb:De,toString:De});function Se(){return this.rgb().formatHex()}function or(){return this.rgb().formatHex8()}function ir(){return ct(this).formatHsl()}function De(){return this.rgb().formatRgb()}function Mn(n){var e,t;return n=(n+"").trim().toLowerCase(),(e=jt.exec(n))?(t=e[1].length,e=parseInt(e[1],16),t===6?Ne(e):t===3?new Y(e>>8&15|e>>4&240,e>>4&15|e&240,(e&15)<<4|e&15,1):t===8?Sn(e>>24&255,e>>16&255,e>>8&255,(e&255)/255):t===4?Sn(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|e&240,((e&15)<<4|e&15)/255):null):(e=nr.exec(n))?new Y(e[1],e[2],e[3],1):(e=er.exec(n))?new Y(e[1]*255/100,e[2]*255/100,e[3]*255/100,1):(e=tr.exec(n))?Sn(e[1],e[2],e[3],e[4]):(e=rr.exec(n))?Sn(e[1]*255/100,e[2]*255/100,e[3]*255/100,e[4]):(e=ur.exec(n))?He(e[1],e[2]/100,e[3]/100,1):(e=ar.exec(n))?He(e[1],e[2]/100,e[3]/100,e[4]):Ue.hasOwnProperty(n)?Ne(Ue[n]):n==="transparent"?new Y(NaN,NaN,NaN,0):null}function Ne(n){return new Y(n>>16&255,n>>8&255,n&255,1)}function Sn(n,e,t,r){return r<=0&&(n=e=t=NaN),new Y(n,e,t,r)}function fr(n){return n instanceof bn||(n=Mn(n)),n?(n=n.rgb(),new Y(n.r,n.g,n.b,n.opacity)):new Y}function ae(n,e,t,r){return arguments.length===1?fr(n):new Y(n,e,t,r??1)}function Y(n,e,t,r){this.r=+n,this.g=+e,this.b=+t,this.opacity=+r}ce(Y,ae,ft(bn,{brighter(n){return n=n==null?Hn:Math.pow(Hn,n),new Y(this.r*n,this.g*n,this.b*n,this.opacity)},darker(n){return n=n==null?pn:Math.pow(pn,n),new Y(this.r*n,this.g*n,this.b*n,this.opacity)},rgb(){return this},clamp(){return new Y(en(this.r),en(this.g),en(this.b),Yn(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:$e,formatHex:$e,formatHex8:cr,formatRgb:Fe,toString:Fe}));function $e(){return`#${j(this.r)}${j(this.g)}${j(this.b)}`}function cr(){return`#${j(this.r)}${j(this.g)}${j(this.b)}${j((isNaN(this.opacity)?1:this.opacity)*255)}`}function Fe(){const n=Yn(this.opacity);return`${n===1?"rgb(":"rgba("}${en(this.r)}, ${en(this.g)}, ${en(this.b)}${n===1?")":`, ${n})`}`}function Yn(n){return isNaN(n)?1:Math.max(0,Math.min(1,n))}function en(n){return Math.max(0,Math.min(255,Math.round(n)||0))}function j(n){return n=en(n),(n<16?"0":"")+n.toString(16)}function He(n,e,t,r){return r<=0?n=e=t=NaN:t<=0||t>=1?n=e=NaN:e<=0&&(n=NaN),new q(n,e,t,r)}function ct(n){if(n instanceof q)return new q(n.h,n.s,n.l,n.opacity);if(n instanceof bn||(n=Mn(n)),!n)return new q;if(n instanceof q)return n;n=n.rgb();var e=n.r/255,t=n.g/255,r=n.b/255,u=Math.min(e,t,r),a=Math.max(e,t,r),o=NaN,i=a-u,c=(a+u)/2;return i?(e===a?o=(t-r)/i+(t<r)*6:t===a?o=(r-e)/i+2:o=(e-t)/i+4,i/=c<.5?a+u:2-a-u,o*=60):i=c>0&&c<1?0:o,new q(o,i,c,n.opacity)}function lr(n,e,t,r){return arguments.length===1?ct(n):new q(n,e,t,r??1)}function q(n,e,t,r){this.h=+n,this.s=+e,this.l=+t,this.opacity=+r}ce(q,lr,ft(bn,{brighter(n){return n=n==null?Hn:Math.pow(Hn,n),new q(this.h,this.s,this.l*n,this.opacity)},darker(n){return n=n==null?pn:Math.pow(pn,n),new q(this.h,this.s,this.l*n,this.opacity)},rgb(){var n=this.h%360+(this.h<0)*360,e=isNaN(n)||isNaN(this.s)?0:this.s,t=this.l,r=t+(t<.5?t:1-t)*e,u=2*t-r;return new Y(_n(n>=240?n-240:n+120,u,r),_n(n,u,r),_n(n<120?n+240:n-120,u,r),this.opacity)},clamp(){return new q(Ye(this.h),Dn(this.s),Dn(this.l),Yn(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const n=Yn(this.opacity);return`${n===1?"hsl(":"hsla("}${Ye(this.h)}, ${Dn(this.s)*100}%, ${Dn(this.l)*100}%${n===1?")":`, ${n})`}`}}));function Ye(n){return n=(n||0)%360,n<0?n+360:n}function Dn(n){return Math.max(0,Math.min(1,n||0))}function _n(n,e,t){return(n<60?e+(t-e)*n/60:n<180?t:n<240?e+(t-e)*(240-n)/60:e)*255}const le=n=>()=>n;function sr(n,e){return function(t){return n+t*e}}function gr(n,e,t){return n=Math.pow(n,t),e=Math.pow(e,t)-n,t=1/t,function(r){return Math.pow(n+r*e,t)}}function hr(n){return(n=+n)==1?lt:function(e,t){return t-e?gr(e,t,n):le(isNaN(e)?t:e)}}function lt(n,e){var t=e-n;return t?sr(n,t):le(isNaN(n)?e:n)}const Ae=(function n(e){var t=hr(e);function r(u,a){var o=t((u=ae(u)).r,(a=ae(a)).r),i=t(u.g,a.g),c=t(u.b,a.b),f=lt(u.opacity,a.opacity);return function(g){return u.r=o(g),u.g=i(g),u.b=c(g),u.opacity=f(g),u+""}}return r.gamma=n,r})(1);function mr(n,e){e||(e=[]);var t=n?Math.min(e.length,n.length):0,r=e.slice(),u;return function(a){for(u=0;u<t;++u)r[u]=n[u]*(1-a)+e[u]*a;return r}}function dr(n){return ArrayBuffer.isView(n)&&!(n instanceof DataView)}function yr(n,e){var t=e?e.length:0,r=n?Math.min(t,n.length):0,u=new Array(r),a=new Array(t),o;for(o=0;o<r;++o)u[o]=qn(n[o],e[o]);for(;o<t;++o)a[o]=e[o];return function(i){for(o=0;o<r;++o)a[o]=u[o](i);return a}}function pr(n,e){var t=new Date;return n=+n,e=+e,function(r){return t.setTime(n*(1-r)+e*r),t}}function An(n,e){return n=+n,e=+e,function(t){return n*(1-t)+e*t}}function xr(n,e){var t={},r={},u;(n===null||typeof n!="object")&&(n={}),(e===null||typeof e!="object")&&(e={});for(u in e)u in n?t[u]=qn(n[u],e[u]):r[u]=e[u];return function(a){for(u in t)r[u]=t[u](a);return r}}var oe=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,Gn=new RegExp(oe.source,"g");function Mr(n){return function(){return n}}function wr(n){return function(e){return n(e)+""}}function br(n,e){var t=oe.lastIndex=Gn.lastIndex=0,r,u,a,o=-1,i=[],c=[];for(n=n+"",e=e+"";(r=oe.exec(n))&&(u=Gn.exec(e));)(a=u.index)>t&&(a=e.slice(t,a),i[o]?i[o]+=a:i[++o]=a),(r=r[0])===(u=u[0])?i[o]?i[o]+=u:i[++o]=u:(i[++o]=null,c.push({i:o,x:An(r,u)})),t=Gn.lastIndex;return t<e.length&&(a=e.slice(t),i[o]?i[o]+=a:i[++o]=a),i.length<2?c[0]?wr(c[0].x):Mr(e):(e=c.length,function(f){for(var g=0,l;g<e;++g)i[(l=c[g]).i]=l.x(f);return i.join("")})}function qn(n,e){var t=typeof e,r;return e==null||t==="boolean"?le(e):(t==="number"?An:t==="string"?(r=Mn(e))?(e=r,Ae):br:e instanceof Mn?Ae:e instanceof Date?pr:dr(e)?mr:Array.isArray(e)?yr:typeof e.valueOf!="function"&&typeof e.toString!="function"||isNaN(e)?xr:An)(n,e)}function st(n,e){return n=+n,e=+e,function(t){return Math.round(n*(1-t)+e*t)}}function vr(n){return function(){return n}}function Tr(n){return+n}var We=[0,1];function O(n){return n}function ie(n,e){return(e-=n=+n)?function(t){return(t-n)/e}:vr(isNaN(e)?NaN:.5)}function kr(n,e){var t;return n>e&&(t=n,n=e,e=t),function(r){return Math.max(n,Math.min(e,r))}}function Cr(n,e,t){var r=n[0],u=n[1],a=e[0],o=e[1];return u<r?(r=ie(u,r),a=t(o,a)):(r=ie(r,u),a=t(a,o)),function(i){return a(r(i))}}function Ur(n,e,t){var r=Math.min(n.length,e.length)-1,u=new Array(r),a=new Array(r),o=-1;for(n[r]<n[0]&&(n=n.slice().reverse(),e=e.slice().reverse());++o<r;)u[o]=ie(n[o],n[o+1]),a[o]=t(e[o],e[o+1]);return function(i){var c=ut(n,i,1,r)-1;return a[c](u[c](i))}}function vn(n,e){return e.domain(n.domain()).range(n.range()).interpolate(n.interpolate()).clamp(n.clamp()).unknown(n.unknown())}function Pn(){var n=We,e=We,t=qn,r,u,a,o=O,i,c,f;function g(){var h=Math.min(n.length,e.length);return o!==O&&(o=kr(n[0],n[h-1])),i=h>2?Ur:Cr,c=f=null,l}function l(h){return h==null||isNaN(h=+h)?a:(c||(c=i(n.map(r),e,t)))(r(o(h)))}return l.invert=function(h){return o(u((f||(f=i(e,n.map(r),An)))(h)))},l.domain=function(h){return arguments.length?(n=Array.from(h,Tr),g()):n.slice()},l.range=function(h){return arguments.length?(e=Array.from(h),g()):e.slice()},l.rangeRound=function(h){return e=Array.from(h),t=st,g()},l.clamp=function(h){return arguments.length?(o=h?!0:O,g()):o!==O},l.interpolate=function(h){return arguments.length?(t=h,g()):t},l.unknown=function(h){return arguments.length?(a=h,l):a},function(h,p){return r=h,u=p,g()}}function gt(){return Pn()(O,O)}function Sr(n){return Math.abs(n=Math.round(n))>=1e21?n.toLocaleString("en").replace(/,/g,""):n.toString(10)}function Wn(n,e){if((t=(n=e?n.toExponential(e-1):n.toExponential()).indexOf("e"))<0)return null;var t,r=n.slice(0,t);return[r.length>1?r[0]+r.slice(2):r,+n.slice(t+1)]}function ln(n){return n=Wn(Math.abs(n)),n?n[1]:NaN}function Dr(n,e){return function(t,r){for(var u=t.length,a=[],o=0,i=n[0],c=0;u>0&&i>0&&(c+i+1>r&&(i=Math.max(1,r-c)),a.push(t.substring(u-=i,u+i)),!((c+=i+1)>r));)i=n[o=(o+1)%n.length];return a.reverse().join(e)}}function Nr(n){return function(e){return e.replace(/[0-9]/g,function(t){return n[+t]})}}var $r=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function wn(n){if(!(e=$r.exec(n)))throw new Error("invalid format: "+n);var e;return new se({fill:e[1],align:e[2],sign:e[3],symbol:e[4],zero:e[5],width:e[6],comma:e[7],precision:e[8]&&e[8].slice(1),trim:e[9],type:e[10]})}wn.prototype=se.prototype;function se(n){this.fill=n.fill===void 0?" ":n.fill+"",this.align=n.align===void 0?">":n.align+"",this.sign=n.sign===void 0?"-":n.sign+"",this.symbol=n.symbol===void 0?"":n.symbol+"",this.zero=!!n.zero,this.width=n.width===void 0?void 0:+n.width,this.comma=!!n.comma,this.precision=n.precision===void 0?void 0:+n.precision,this.trim=!!n.trim,this.type=n.type===void 0?"":n.type+""}se.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(this.width===void 0?"":Math.max(1,this.width|0))+(this.comma?",":"")+(this.precision===void 0?"":"."+Math.max(0,this.precision|0))+(this.trim?"~":"")+this.type};function Fr(n){n:for(var e=n.length,t=1,r=-1,u;t<e;++t)switch(n[t]){case".":r=u=t;break;case"0":r===0&&(r=t),u=t;break;default:if(!+n[t])break n;r>0&&(r=0);break}return r>0?n.slice(0,r)+n.slice(u+1):n}var ht;function Hr(n,e){var t=Wn(n,e);if(!t)return n+"";var r=t[0],u=t[1],a=u-(ht=Math.max(-8,Math.min(8,Math.floor(u/3)))*3)+1,o=r.length;return a===o?r:a>o?r+new Array(a-o+1).join("0"):a>0?r.slice(0,a)+"."+r.slice(a):"0."+new Array(1-a).join("0")+Wn(n,Math.max(0,e+a-1))[0]}function Le(n,e){var t=Wn(n,e);if(!t)return n+"";var r=t[0],u=t[1];return u<0?"0."+new Array(-u).join("0")+r:r.length>u+1?r.slice(0,u+1)+"."+r.slice(u+1):r+new Array(u-r.length+2).join("0")}const Oe={"%":(n,e)=>(n*100).toFixed(e),b:n=>Math.round(n).toString(2),c:n=>n+"",d:Sr,e:(n,e)=>n.toExponential(e),f:(n,e)=>n.toFixed(e),g:(n,e)=>n.toPrecision(e),o:n=>Math.round(n).toString(8),p:(n,e)=>Le(n*100,e),r:Le,s:Hr,X:n=>Math.round(n).toString(16).toUpperCase(),x:n=>Math.round(n).toString(16)};function Ie(n){return n}var Re=Array.prototype.map,qe=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function Yr(n){var e=n.grouping===void 0||n.thousands===void 0?Ie:Dr(Re.call(n.grouping,Number),n.thousands+""),t=n.currency===void 0?"":n.currency[0]+"",r=n.currency===void 0?"":n.currency[1]+"",u=n.decimal===void 0?".":n.decimal+"",a=n.numerals===void 0?Ie:Nr(Re.call(n.numerals,String)),o=n.percent===void 0?"%":n.percent+"",i=n.minus===void 0?"−":n.minus+"",c=n.nan===void 0?"NaN":n.nan+"";function f(l){l=wn(l);var h=l.fill,p=l.align,d=l.sign,v=l.symbol,k=l.zero,C=l.width,G=l.comma,D=l.precision,L=l.trim,N=l.type;N==="n"?(G=!0,N="g"):Oe[N]||(D===void 0&&(D=12),L=!0,N="g"),(k||h==="0"&&p==="=")&&(k=!0,h="0",p="=");var y=v==="$"?t:v==="#"&&/[boxX]/.test(N)?"0"+N.toLowerCase():"",$=v==="$"?r:/[%p]/.test(N)?o:"",J=Oe[N],Bn=/[defgprs%]/.test(N);D=D===void 0?6:/[gprs]/.test(N)?Math.max(1,Math.min(21,D)):Math.max(0,Math.min(20,D));function kn(M){var E=y,F=$,_,Cn,un;if(N==="c")F=J(M)+F,M="";else{M=+M;var an=M<0||1/M<0;if(M=isNaN(M)?c:J(Math.abs(M),D),L&&(M=Fr(M)),an&&+M==0&&d!=="+"&&(an=!1),E=(an?d==="("?d:i:d==="-"||d==="("?"":d)+E,F=(N==="s"?qe[8+ht/3]:"")+F+(an&&d==="("?")":""),Bn){for(_=-1,Cn=M.length;++_<Cn;)if(un=M.charCodeAt(_),48>un||un>57){F=(un===46?u+M.slice(_+1):M.slice(_))+F,M=M.slice(0,_);break}}}G&&!k&&(M=e(M,1/0));var on=E.length+M.length+F.length,R=on<C?new Array(C-on+1).join(h):"";switch(G&&k&&(M=e(R+M,R.length?C-F.length:1/0),R=""),p){case"<":M=E+M+F+R;break;case"=":M=E+R+M+F;break;case"^":M=R.slice(0,on=R.length>>1)+E+M+F+R.slice(on);break;default:M=R+E+M+F;break}return a(M)}return kn.toString=function(){return l+""},kn}function g(l,h){var p=f((l=wn(l),l.type="f",l)),d=Math.max(-8,Math.min(8,Math.floor(ln(h)/3)))*3,v=Math.pow(10,-d),k=qe[8+d/3];return function(C){return p(v*C)+k}}return{format:f,formatPrefix:g}}var Nn,ge,mt;Ar({thousands:",",grouping:[3],currency:["$",""]});function Ar(n){return Nn=Yr(n),ge=Nn.format,mt=Nn.formatPrefix,Nn}function Wr(n){return Math.max(0,-ln(Math.abs(n)))}function Lr(n,e){return Math.max(0,Math.max(-8,Math.min(8,Math.floor(ln(e)/3)))*3-ln(Math.abs(n)))}function Or(n,e){return n=Math.abs(n),e=Math.abs(e)-n,Math.max(0,ln(e)-ln(n))+1}function Ir(n,e,t,r){var u=ue(n,e,t),a;switch(r=wn(r??",f"),r.type){case"s":{var o=Math.max(Math.abs(n),Math.abs(e));return r.precision==null&&!isNaN(a=Lr(u,o))&&(r.precision=a),mt(r,o)}case"":case"e":case"g":case"p":case"r":{r.precision==null&&!isNaN(a=Or(u,Math.max(Math.abs(n),Math.abs(e))))&&(r.precision=a-(r.type==="e"));break}case"f":case"%":{r.precision==null&&!isNaN(a=Wr(u))&&(r.precision=a-(r.type==="%")*2);break}}return ge(r)}function En(n){var e=n.domain;return n.ticks=function(t){var r=e();return te(r[0],r[r.length-1],t??10)},n.tickFormat=function(t,r){var u=e();return Ir(u[0],u[u.length-1],t??10,r)},n.nice=function(t){t==null&&(t=10);var r=e(),u=0,a=r.length-1,o=r[u],i=r[a],c,f,g=10;for(i<o&&(f=o,o=i,i=f,f=u,u=a,a=f);g-- >0;){if(f=re(o,i,t),f===c)return r[u]=o,r[a]=i,e(r);if(f>0)o=Math.floor(o/f)*f,i=Math.ceil(i/f)*f;else if(f<0)o=Math.ceil(o*f)/f,i=Math.floor(i*f)/f;else break;c=f}return n},n}function Rr(){var n=gt();return n.copy=function(){return vn(n,Rr())},B.apply(n,arguments),En(n)}function dt(n,e){n=n.slice();var t=0,r=n.length-1,u=n[t],a=n[r],o;return a<u&&(o=t,t=r,r=o,o=u,u=a,a=o),n[t]=e.floor(u),n[r]=e.ceil(a),n}function Pe(n){return Math.log(n)}function Ee(n){return Math.exp(n)}function qr(n){return-Math.log(-n)}function Pr(n){return-Math.exp(-n)}function Er(n){return isFinite(n)?+("1e"+n):n<0?0:n}function zr(n){return n===10?Er:n===Math.E?Math.exp:e=>Math.pow(n,e)}function Zr(n){return n===Math.E?Math.log:n===10&&Math.log10||n===2&&Math.log2||(n=Math.log(n),e=>Math.log(e)/n)}function ze(n){return(e,t)=>-n(-e,t)}function yt(n){const e=n(Pe,Ee),t=e.domain;let r=10,u,a;function o(){return u=Zr(r),a=zr(r),t()[0]<0?(u=ze(u),a=ze(a),n(qr,Pr)):n(Pe,Ee),e}return e.base=function(i){return arguments.length?(r=+i,o()):r},e.domain=function(i){return arguments.length?(t(i),o()):t()},e.ticks=i=>{const c=t();let f=c[0],g=c[c.length-1];const l=g<f;l&&([f,g]=[g,f]);let h=u(f),p=u(g),d,v;const k=i==null?10:+i;let C=[];if(!(r%1)&&p-h<k){if(h=Math.floor(h),p=Math.ceil(p),f>0){for(;h<=p;++h)for(d=1;d<r;++d)if(v=h<0?d/a(-h):d*a(h),!(v<f)){if(v>g)break;C.push(v)}}else for(;h<=p;++h)for(d=r-1;d>=1;--d)if(v=h>0?d/a(-h):d*a(h),!(v<f)){if(v>g)break;C.push(v)}C.length*2<k&&(C=te(f,g,k))}else C=te(h,p,Math.min(p-h,k)).map(a);return l?C.reverse():C},e.tickFormat=(i,c)=>{if(i==null&&(i=10),c==null&&(c=r===10?"s":","),typeof c!="function"&&(!(r%1)&&(c=wn(c)).precision==null&&(c.trim=!0),c=ge(c)),i===1/0)return c;const f=Math.max(1,r*i/e.ticks().length);return g=>{let l=g/a(Math.round(u(g)));return l*r<r-.5&&(l*=r),l<=f?c(g):""}},e.nice=()=>t(dt(t(),{floor:i=>a(Math.floor(u(i))),ceil:i=>a(Math.ceil(u(i)))})),e}function Vr(){const n=yt(Pn()).domain([1,10]);return n.copy=()=>vn(n,Vr()).base(n.base()),B.apply(n,arguments),n}function Ze(n){return function(e){return Math.sign(e)*Math.log1p(Math.abs(e/n))}}function Ve(n){return function(e){return Math.sign(e)*Math.expm1(Math.abs(e))*n}}function pt(n){var e=1,t=n(Ze(e),Ve(e));return t.constant=function(r){return arguments.length?n(Ze(e=+r),Ve(e)):e},En(t)}function Qr(){var n=pt(Pn());return n.copy=function(){return vn(n,Qr()).constant(n.constant())},B.apply(n,arguments)}function Qe(n){return function(e){return e<0?-Math.pow(-e,n):Math.pow(e,n)}}function Xr(n){return n<0?-Math.sqrt(-n):Math.sqrt(n)}function Br(n){return n<0?-n*n:n*n}function xt(n){var e=n(O,O),t=1;function r(){return t===1?n(O,O):t===.5?n(Xr,Br):n(Qe(t),Qe(1/t))}return e.exponent=function(u){return arguments.length?(t=+u,r()):t},En(e)}function Mt(){var n=xt(Pn());return n.copy=function(){return vn(n,Mt()).exponent(n.exponent())},B.apply(n,arguments),n}function ka(){return Mt.apply(null,arguments).exponent(.5)}function _r(){var n=[.5],e=[0,1],t,r=1;function u(a){return a!=null&&a<=a?e[ut(n,a,0,r)]:t}return u.domain=function(a){return arguments.length?(n=Array.from(a),r=Math.min(n.length,e.length-1),u):n.slice()},u.range=function(a){return arguments.length?(e=Array.from(a),r=Math.min(n.length,e.length-1),u):e.slice()},u.invertExtent=function(a){var o=e.indexOf(a);return[n[o-1],n[o]]},u.unknown=function(a){return arguments.length?(t=a,u):t},u.copy=function(){return _r().domain(n).range(e).unknown(t)},B.apply(u,arguments)}const Jn=new Date,Kn=new Date;function U(n,e,t,r){function u(a){return n(a=arguments.length===0?new Date:new Date(+a)),a}return u.floor=a=>(n(a=new Date(+a)),a),u.ceil=a=>(n(a=new Date(a-1)),e(a,1),n(a),a),u.round=a=>{const o=u(a),i=u.ceil(a);return a-o<i-a?o:i},u.offset=(a,o)=>(e(a=new Date(+a),o==null?1:Math.floor(o)),a),u.range=(a,o,i)=>{const c=[];if(a=u.ceil(a),i=i==null?1:Math.floor(i),!(a<o)||!(i>0))return c;let f;do c.push(f=new Date(+a)),e(a,i),n(a);while(f<a&&a<o);return c},u.filter=a=>U(o=>{if(o>=o)for(;n(o),!a(o);)o.setTime(o-1)},(o,i)=>{if(o>=o)if(i<0)for(;++i<=0;)for(;e(o,-1),!a(o););else for(;--i>=0;)for(;e(o,1),!a(o););}),t&&(u.count=(a,o)=>(Jn.setTime(+a),Kn.setTime(+o),n(Jn),n(Kn),Math.floor(t(Jn,Kn))),u.every=a=>(a=Math.floor(a),!isFinite(a)||!(a>0)?null:a>1?u.filter(r?o=>r(o)%a===0:o=>u.count(0,o)%a===0):u)),u}const Ln=U(()=>{},(n,e)=>{n.setTime(+n+e)},(n,e)=>e-n);Ln.every=n=>(n=Math.floor(n),!isFinite(n)||!(n>0)?null:n>1?U(e=>{e.setTime(Math.floor(e/n)*n)},(e,t)=>{e.setTime(+e+t*n)},(e,t)=>(t-e)/n):Ln);Ln.range;const z=1e3,I=z*60,Z=I*60,V=Z*24,he=V*7,Xe=V*30,jn=V*365,nn=U(n=>{n.setTime(n-n.getMilliseconds())},(n,e)=>{n.setTime(+n+e*z)},(n,e)=>(e-n)/z,n=>n.getUTCSeconds());nn.range;const me=U(n=>{n.setTime(n-n.getMilliseconds()-n.getSeconds()*z)},(n,e)=>{n.setTime(+n+e*I)},(n,e)=>(e-n)/I,n=>n.getMinutes());me.range;const de=U(n=>{n.setUTCSeconds(0,0)},(n,e)=>{n.setTime(+n+e*I)},(n,e)=>(e-n)/I,n=>n.getUTCMinutes());de.range;const ye=U(n=>{n.setTime(n-n.getMilliseconds()-n.getSeconds()*z-n.getMinutes()*I)},(n,e)=>{n.setTime(+n+e*Z)},(n,e)=>(e-n)/Z,n=>n.getHours());ye.range;const pe=U(n=>{n.setUTCMinutes(0,0,0)},(n,e)=>{n.setTime(+n+e*Z)},(n,e)=>(e-n)/Z,n=>n.getUTCHours());pe.range;const Tn=U(n=>n.setHours(0,0,0,0),(n,e)=>n.setDate(n.getDate()+e),(n,e)=>(e-n-(e.getTimezoneOffset()-n.getTimezoneOffset())*I)/V,n=>n.getDate()-1);Tn.range;const zn=U(n=>{n.setUTCHours(0,0,0,0)},(n,e)=>{n.setUTCDate(n.getUTCDate()+e)},(n,e)=>(e-n)/V,n=>n.getUTCDate()-1);zn.range;const wt=U(n=>{n.setUTCHours(0,0,0,0)},(n,e)=>{n.setUTCDate(n.getUTCDate()+e)},(n,e)=>(e-n)/V,n=>Math.floor(n/V));wt.range;function tn(n){return U(e=>{e.setDate(e.getDate()-(e.getDay()+7-n)%7),e.setHours(0,0,0,0)},(e,t)=>{e.setDate(e.getDate()+t*7)},(e,t)=>(t-e-(t.getTimezoneOffset()-e.getTimezoneOffset())*I)/he)}const Zn=tn(0),On=tn(1),Gr=tn(2),Jr=tn(3),sn=tn(4),Kr=tn(5),jr=tn(6);Zn.range;On.range;Gr.range;Jr.range;sn.range;Kr.range;jr.range;function rn(n){return U(e=>{e.setUTCDate(e.getUTCDate()-(e.getUTCDay()+7-n)%7),e.setUTCHours(0,0,0,0)},(e,t)=>{e.setUTCDate(e.getUTCDate()+t*7)},(e,t)=>(t-e)/he)}const Vn=rn(0),In=rn(1),nu=rn(2),eu=rn(3),gn=rn(4),tu=rn(5),ru=rn(6);Vn.range;In.range;nu.range;eu.range;gn.range;tu.range;ru.range;const xe=U(n=>{n.setDate(1),n.setHours(0,0,0,0)},(n,e)=>{n.setMonth(n.getMonth()+e)},(n,e)=>e.getMonth()-n.getMonth()+(e.getFullYear()-n.getFullYear())*12,n=>n.getMonth());xe.range;const Me=U(n=>{n.setUTCDate(1),n.setUTCHours(0,0,0,0)},(n,e)=>{n.setUTCMonth(n.getUTCMonth()+e)},(n,e)=>e.getUTCMonth()-n.getUTCMonth()+(e.getUTCFullYear()-n.getUTCFullYear())*12,n=>n.getUTCMonth());Me.range;const Q=U(n=>{n.setMonth(0,1),n.setHours(0,0,0,0)},(n,e)=>{n.setFullYear(n.getFullYear()+e)},(n,e)=>e.getFullYear()-n.getFullYear(),n=>n.getFullYear());Q.every=n=>!isFinite(n=Math.floor(n))||!(n>0)?null:U(e=>{e.setFullYear(Math.floor(e.getFullYear()/n)*n),e.setMonth(0,1),e.setHours(0,0,0,0)},(e,t)=>{e.setFullYear(e.getFullYear()+t*n)});Q.range;const X=U(n=>{n.setUTCMonth(0,1),n.setUTCHours(0,0,0,0)},(n,e)=>{n.setUTCFullYear(n.getUTCFullYear()+e)},(n,e)=>e.getUTCFullYear()-n.getUTCFullYear(),n=>n.getUTCFullYear());X.every=n=>!isFinite(n=Math.floor(n))||!(n>0)?null:U(e=>{e.setUTCFullYear(Math.floor(e.getUTCFullYear()/n)*n),e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)},(e,t)=>{e.setUTCFullYear(e.getUTCFullYear()+t*n)});X.range;function bt(n,e,t,r,u,a){const o=[[nn,1,z],[nn,5,5*z],[nn,15,15*z],[nn,30,30*z],[a,1,I],[a,5,5*I],[a,15,15*I],[a,30,30*I],[u,1,Z],[u,3,3*Z],[u,6,6*Z],[u,12,12*Z],[r,1,V],[r,2,2*V],[t,1,he],[e,1,Xe],[e,3,3*Xe],[n,1,jn]];function i(f,g,l){const h=g<f;h&&([f,g]=[g,f]);const p=l&&typeof l.range=="function"?l:c(f,g,l),d=p?p.range(f,+g+1):[];return h?d.reverse():d}function c(f,g,l){const h=Math.abs(g-f)/l,p=fe(([,,k])=>k).right(o,h);if(p===o.length)return n.every(ue(f/jn,g/jn,l));if(p===0)return Ln.every(Math.max(ue(f,g,l),1));const[d,v]=o[h/o[p-1][2]<o[p][2]/h?p-1:p];return d.every(v)}return[i,c]}const[uu,au]=bt(X,Me,Vn,wt,pe,de),[ou,iu]=bt(Q,xe,Zn,Tn,ye,me);function ne(n){if(0<=n.y&&n.y<100){var e=new Date(-1,n.m,n.d,n.H,n.M,n.S,n.L);return e.setFullYear(n.y),e}return new Date(n.y,n.m,n.d,n.H,n.M,n.S,n.L)}function ee(n){if(0<=n.y&&n.y<100){var e=new Date(Date.UTC(-1,n.m,n.d,n.H,n.M,n.S,n.L));return e.setUTCFullYear(n.y),e}return new Date(Date.UTC(n.y,n.m,n.d,n.H,n.M,n.S,n.L))}function hn(n,e,t){return{y:n,m:e,d:t,H:0,M:0,S:0,L:0}}function fu(n){var e=n.dateTime,t=n.date,r=n.time,u=n.periods,a=n.days,o=n.shortDays,i=n.months,c=n.shortMonths,f=mn(u),g=dn(u),l=mn(a),h=dn(a),p=mn(o),d=dn(o),v=mn(i),k=dn(i),C=mn(c),G=dn(c),D={a:an,A:on,b:R,B:Nt,c:null,d:je,e:je,f:Fu,g:Pu,G:zu,H:Du,I:Nu,j:$u,L:vt,m:Hu,M:Yu,p:$t,q:Ft,Q:tt,s:rt,S:Au,u:Wu,U:Lu,V:Ou,w:Iu,W:Ru,x:null,X:null,y:qu,Y:Eu,Z:Zu,"%":et},L={a:Ht,A:Yt,b:At,B:Wt,c:null,d:nt,e:nt,f:Bu,g:ua,G:oa,H:Vu,I:Qu,j:Xu,L:kt,m:_u,M:Gu,p:Lt,q:Ot,Q:tt,s:rt,S:Ju,u:Ku,U:ju,V:na,w:ea,W:ta,x:null,X:null,y:ra,Y:aa,Z:ia,"%":et},N={a:kn,A:M,b:E,B:F,c:_,d:Je,e:Je,f:ku,g:Ge,G:_e,H:Ke,I:Ke,j:wu,L:Tu,m:Mu,M:bu,p:Bn,q:xu,Q:Uu,s:Su,S:vu,u:hu,U:mu,V:du,w:gu,W:yu,x:Cn,X:un,y:Ge,Y:_e,Z:pu,"%":Cu};D.x=y(t,D),D.X=y(r,D),D.c=y(e,D),L.x=y(t,L),L.X=y(r,L),L.c=y(e,L);function y(m,x){return function(w){var s=[],H=-1,T=0,A=m.length,W,K,be;for(w instanceof Date||(w=new Date(+w));++H<A;)m.charCodeAt(H)===37&&(s.push(m.slice(T,H)),(K=Be[W=m.charAt(++H)])!=null?W=m.charAt(++H):K=W==="e"?" ":"0",(be=x[W])&&(W=be(w,K)),s.push(W),T=H+1);return s.push(m.slice(T,H)),s.join("")}}function $(m,x){return function(w){var s=hn(1900,void 0,1),H=J(s,m,w+="",0),T,A;if(H!=w.length)return null;if("Q"in s)return new Date(s.Q);if("s"in s)return new Date(s.s*1e3+("L"in s?s.L:0));if(x&&!("Z"in s)&&(s.Z=0),"p"in s&&(s.H=s.H%12+s.p*12),s.m===void 0&&(s.m="q"in s?s.q:0),"V"in s){if(s.V<1||s.V>53)return null;"w"in s||(s.w=1),"Z"in s?(T=ee(hn(s.y,0,1)),A=T.getUTCDay(),T=A>4||A===0?In.ceil(T):In(T),T=zn.offset(T,(s.V-1)*7),s.y=T.getUTCFullYear(),s.m=T.getUTCMonth(),s.d=T.getUTCDate()+(s.w+6)%7):(T=ne(hn(s.y,0,1)),A=T.getDay(),T=A>4||A===0?On.ceil(T):On(T),T=Tn.offset(T,(s.V-1)*7),s.y=T.getFullYear(),s.m=T.getMonth(),s.d=T.getDate()+(s.w+6)%7)}else("W"in s||"U"in s)&&("w"in s||(s.w="u"in s?s.u%7:"W"in s?1:0),A="Z"in s?ee(hn(s.y,0,1)).getUTCDay():ne(hn(s.y,0,1)).getDay(),s.m=0,s.d="W"in s?(s.w+6)%7+s.W*7-(A+5)%7:s.w+s.U*7-(A+6)%7);return"Z"in s?(s.H+=s.Z/100|0,s.M+=s.Z%100,ee(s)):ne(s)}}function J(m,x,w,s){for(var H=0,T=x.length,A=w.length,W,K;H<T;){if(s>=A)return-1;if(W=x.charCodeAt(H++),W===37){if(W=x.charAt(H++),K=N[W in Be?x.charAt(H++):W],!K||(s=K(m,w,s))<0)return-1}else if(W!=w.charCodeAt(s++))return-1}return s}function Bn(m,x,w){var s=f.exec(x.slice(w));return s?(m.p=g.get(s[0].toLowerCase()),w+s[0].length):-1}function kn(m,x,w){var s=p.exec(x.slice(w));return s?(m.w=d.get(s[0].toLowerCase()),w+s[0].length):-1}function M(m,x,w){var s=l.exec(x.slice(w));return s?(m.w=h.get(s[0].toLowerCase()),w+s[0].length):-1}function E(m,x,w){var s=C.exec(x.slice(w));return s?(m.m=G.get(s[0].toLowerCase()),w+s[0].length):-1}function F(m,x,w){var s=v.exec(x.slice(w));return s?(m.m=k.get(s[0].toLowerCase()),w+s[0].length):-1}function _(m,x,w){return J(m,e,x,w)}function Cn(m,x,w){return J(m,t,x,w)}function un(m,x,w){return J(m,r,x,w)}function an(m){return o[m.getDay()]}function on(m){return a[m.getDay()]}function R(m){return c[m.getMonth()]}function Nt(m){return i[m.getMonth()]}function $t(m){return u[+(m.getHours()>=12)]}function Ft(m){return 1+~~(m.getMonth()/3)}function Ht(m){return o[m.getUTCDay()]}function Yt(m){return a[m.getUTCDay()]}function At(m){return c[m.getUTCMonth()]}function Wt(m){return i[m.getUTCMonth()]}function Lt(m){return u[+(m.getUTCHours()>=12)]}function Ot(m){return 1+~~(m.getUTCMonth()/3)}return{format:function(m){var x=y(m+="",D);return x.toString=function(){return m},x},parse:function(m){var x=$(m+="",!1);return x.toString=function(){return m},x},utcFormat:function(m){var x=y(m+="",L);return x.toString=function(){return m},x},utcParse:function(m){var x=$(m+="",!0);return x.toString=function(){return m},x}}}var Be={"-":"",_:" ",0:"0"},S=/^\s*\d+/,cu=/^%/,lu=/[\\^$*+?|[\]().{}]/g;function b(n,e,t){var r=n<0?"-":"",u=(r?-n:n)+"",a=u.length;return r+(a<t?new Array(t-a+1).join(e)+u:u)}function su(n){return n.replace(lu,"\\$&")}function mn(n){return new RegExp("^(?:"+n.map(su).join("|")+")","i")}function dn(n){return new Map(n.map((e,t)=>[e.toLowerCase(),t]))}function gu(n,e,t){var r=S.exec(e.slice(t,t+1));return r?(n.w=+r[0],t+r[0].length):-1}function hu(n,e,t){var r=S.exec(e.slice(t,t+1));return r?(n.u=+r[0],t+r[0].length):-1}function mu(n,e,t){var r=S.exec(e.slice(t,t+2));return r?(n.U=+r[0],t+r[0].length):-1}function du(n,e,t){var r=S.exec(e.slice(t,t+2));return r?(n.V=+r[0],t+r[0].length):-1}function yu(n,e,t){var r=S.exec(e.slice(t,t+2));return r?(n.W=+r[0],t+r[0].length):-1}function _e(n,e,t){var r=S.exec(e.slice(t,t+4));return r?(n.y=+r[0],t+r[0].length):-1}function Ge(n,e,t){var r=S.exec(e.slice(t,t+2));return r?(n.y=+r[0]+(+r[0]>68?1900:2e3),t+r[0].length):-1}function pu(n,e,t){var r=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(e.slice(t,t+6));return r?(n.Z=r[1]?0:-(r[2]+(r[3]||"00")),t+r[0].length):-1}function xu(n,e,t){var r=S.exec(e.slice(t,t+1));return r?(n.q=r[0]*3-3,t+r[0].length):-1}function Mu(n,e,t){var r=S.exec(e.slice(t,t+2));return r?(n.m=r[0]-1,t+r[0].length):-1}function Je(n,e,t){var r=S.exec(e.slice(t,t+2));return r?(n.d=+r[0],t+r[0].length):-1}function wu(n,e,t){var r=S.exec(e.slice(t,t+3));return r?(n.m=0,n.d=+r[0],t+r[0].length):-1}function Ke(n,e,t){var r=S.exec(e.slice(t,t+2));return r?(n.H=+r[0],t+r[0].length):-1}function bu(n,e,t){var r=S.exec(e.slice(t,t+2));return r?(n.M=+r[0],t+r[0].length):-1}function vu(n,e,t){var r=S.exec(e.slice(t,t+2));return r?(n.S=+r[0],t+r[0].length):-1}function Tu(n,e,t){var r=S.exec(e.slice(t,t+3));return r?(n.L=+r[0],t+r[0].length):-1}function ku(n,e,t){var r=S.exec(e.slice(t,t+6));return r?(n.L=Math.floor(r[0]/1e3),t+r[0].length):-1}function Cu(n,e,t){var r=cu.exec(e.slice(t,t+1));return r?t+r[0].length:-1}function Uu(n,e,t){var r=S.exec(e.slice(t));return r?(n.Q=+r[0],t+r[0].length):-1}function Su(n,e,t){var r=S.exec(e.slice(t));return r?(n.s=+r[0],t+r[0].length):-1}function je(n,e){return b(n.getDate(),e,2)}function Du(n,e){return b(n.getHours(),e,2)}function Nu(n,e){return b(n.getHours()%12||12,e,2)}function $u(n,e){return b(1+Tn.count(Q(n),n),e,3)}function vt(n,e){return b(n.getMilliseconds(),e,3)}function Fu(n,e){return vt(n,e)+"000"}function Hu(n,e){return b(n.getMonth()+1,e,2)}function Yu(n,e){return b(n.getMinutes(),e,2)}function Au(n,e){return b(n.getSeconds(),e,2)}function Wu(n){var e=n.getDay();return e===0?7:e}function Lu(n,e){return b(Zn.count(Q(n)-1,n),e,2)}function Tt(n){var e=n.getDay();return e>=4||e===0?sn(n):sn.ceil(n)}function Ou(n,e){return n=Tt(n),b(sn.count(Q(n),n)+(Q(n).getDay()===4),e,2)}function Iu(n){return n.getDay()}function Ru(n,e){return b(On.count(Q(n)-1,n),e,2)}function qu(n,e){return b(n.getFullYear()%100,e,2)}function Pu(n,e){return n=Tt(n),b(n.getFullYear()%100,e,2)}function Eu(n,e){return b(n.getFullYear()%1e4,e,4)}function zu(n,e){var t=n.getDay();return n=t>=4||t===0?sn(n):sn.ceil(n),b(n.getFullYear()%1e4,e,4)}function Zu(n){var e=n.getTimezoneOffset();return(e>0?"-":(e*=-1,"+"))+b(e/60|0,"0",2)+b(e%60,"0",2)}function nt(n,e){return b(n.getUTCDate(),e,2)}function Vu(n,e){return b(n.getUTCHours(),e,2)}function Qu(n,e){return b(n.getUTCHours()%12||12,e,2)}function Xu(n,e){return b(1+zn.count(X(n),n),e,3)}function kt(n,e){return b(n.getUTCMilliseconds(),e,3)}function Bu(n,e){return kt(n,e)+"000"}function _u(n,e){return b(n.getUTCMonth()+1,e,2)}function Gu(n,e){return b(n.getUTCMinutes(),e,2)}function Ju(n,e){return b(n.getUTCSeconds(),e,2)}function Ku(n){var e=n.getUTCDay();return e===0?7:e}function ju(n,e){return b(Vn.count(X(n)-1,n),e,2)}function Ct(n){var e=n.getUTCDay();return e>=4||e===0?gn(n):gn.ceil(n)}function na(n,e){return n=Ct(n),b(gn.count(X(n),n)+(X(n).getUTCDay()===4),e,2)}function ea(n){return n.getUTCDay()}function ta(n,e){return b(In.count(X(n)-1,n),e,2)}function ra(n,e){return b(n.getUTCFullYear()%100,e,2)}function ua(n,e){return n=Ct(n),b(n.getUTCFullYear()%100,e,2)}function aa(n,e){return b(n.getUTCFullYear()%1e4,e,4)}function oa(n,e){var t=n.getUTCDay();return n=t>=4||t===0?gn(n):gn.ceil(n),b(n.getUTCFullYear()%1e4,e,4)}function ia(){return"+0000"}function et(){return"%"}function tt(n){return+n}function rt(n){return Math.floor(+n/1e3)}var fn,Ut,St;fa({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});function fa(n){return fn=fu(n),Ut=fn.format,fn.parse,St=fn.utcFormat,fn.utcParse,fn}function ca(n){return new Date(n)}function la(n){return n instanceof Date?+n:+new Date(+n)}function we(n,e,t,r,u,a,o,i,c,f){var g=gt(),l=g.invert,h=g.domain,p=f(".%L"),d=f(":%S"),v=f("%I:%M"),k=f("%I %p"),C=f("%a %d"),G=f("%b %d"),D=f("%B"),L=f("%Y");function N(y){return(c(y)<y?p:i(y)<y?d:o(y)<y?v:a(y)<y?k:r(y)<y?u(y)<y?C:G:t(y)<y?D:L)(y)}return g.invert=function(y){return new Date(l(y))},g.domain=function(y){return arguments.length?h(Array.from(y,la)):h().map(ca)},g.ticks=function(y){var $=h();return n($[0],$[$.length-1],y??10)},g.tickFormat=function(y,$){return $==null?N:f($)},g.nice=function(y){var $=h();return(!y||typeof y.range!="function")&&(y=e($[0],$[$.length-1],y??10)),y?h(dt($,y)):g},g.copy=function(){return vn(g,we(n,e,t,r,u,a,o,i,c,f))},g}function Ca(){return B.apply(we(ou,iu,Q,xe,Zn,Tn,ye,me,nn,Ut).domain([new Date(2e3,0,1),new Date(2e3,0,2)]),arguments)}function Ua(){return B.apply(we(uu,au,X,Me,Vn,zn,pe,de,nn,St).domain([Date.UTC(2e3,0,1),Date.UTC(2e3,0,2)]),arguments)}function Qn(){var n=0,e=1,t,r,u,a,o=O,i=!1,c;function f(l){return l==null||isNaN(l=+l)?c:o(u===0?.5:(l=(a(l)-t)*u,i?Math.max(0,Math.min(1,l)):l))}f.domain=function(l){return arguments.length?([n,e]=l,t=a(n=+n),r=a(e=+e),u=t===r?0:1/(r-t),f):[n,e]},f.clamp=function(l){return arguments.length?(i=!!l,f):i},f.interpolator=function(l){return arguments.length?(o=l,f):o};function g(l){return function(h){var p,d;return arguments.length?([p,d]=h,o=l(p,d),f):[o(0),o(1)]}}return f.range=g(qn),f.rangeRound=g(st),f.unknown=function(l){return arguments.length?(c=l,f):c},function(l){return a=l,t=l(n),r=l(e),u=t===r?0:1/(r-t),f}}function Xn(n,e){return e.domain(n.domain()).interpolator(n.interpolator()).clamp(n.clamp()).unknown(n.unknown())}function sa(){var n=En(Qn()(O));return n.copy=function(){return Xn(n,sa())},Rn.apply(n,arguments)}function ga(){var n=yt(Qn()).domain([1,10]);return n.copy=function(){return Xn(n,ga()).base(n.base())},Rn.apply(n,arguments)}function ha(){var n=pt(Qn());return n.copy=function(){return Xn(n,ha()).constant(n.constant())},Rn.apply(n,arguments)}function Dt(){var n=xt(Qn());return n.copy=function(){return Xn(n,Dt()).exponent(n.exponent())},Rn.apply(n,arguments)}function Sa(){return Dt.apply(null,arguments).exponent(.5)}export{ma as A,$n as B,va as C,Zt as D,qn as E,Tr as F,En as G,gt as H,B as I,ut as J,O as K,Rn as L,Xn as M,yt as N,xt as O,pt as P,st as Q,Ce as R,ga as S,Dt as T,Sa as U,ha as V,Qr as W,Ir as X,Rt as a,yn as b,Un as c,ve as d,ba as e,wa as f,Ma as g,xa as h,_r as i,Ca as j,ka as k,Rr as l,Vr as m,ot as n,at as o,Mt as p,Ta as q,An as r,sa as s,pa as t,Ua as u,pr as v,Mn as w,ya as x,It as y,da as z};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{p as g,r as c,t as d,s as B,bq as x,a as p,br as C,j as u,ad as b,ag as y,bs as D,w as j,bt as w}from"./index-CvV5z5r9.js";const E="updateBusiness",T=()=>{const[{fetching:l},s]=g(x),r=c.useCallback(async e=>{const i=`Error updating business ID [${e.businessId}]`,n=`${E}-${e.businessId}`;d.loading("Updating business",{id:n});try{const a=await s(e),o=B(a,i,n,"updateBusiness");if(o)return d.success("Success",{id:n,description:"Business updated"}),o.updateBusiness}catch(a){console.error(`${i}: ${a}`),d.error("Error",{id:n,description:i,duration:1e5,closeButton:!0})}},[s]);return{fetching:l,updateBusiness:r}};function $({businessId:l,tagIds:s,description:r,open:e,onOpenChange:i,onClose:n}){const[{data:a,fetching:o},h]=p({pause:!0,query:C,variables:{businessId:l,tagsDifferentThan:s?s.map(t=>t.id):void 0,descriptionDifferentThan:r}});c.useEffect(()=>{e&&(s||r)&&!a&&h()},[e,s,r,h,a]);const m=c.useCallback(t=>{i(t),e&&!t&&n?.()},[i,n,e]),f=c.useMemo(()=>e&&(!!s||!!r)&&a&&a?.similarChargesByBusiness.length>0,[e,s,r,a]);return u.jsx(b,{open:f,onOpenChange:m,children:u.jsx(y,{className:"overflow-scroll max-h-screen w-full sm:max-w-[640px] md:max-w-[768px] lg:max-w-[900px]",onClick:t=>t.stopPropagation(),children:u.jsx(D,{fallback:u.jsx("div",{children:"Error fetching similar charges"}),children:o?u.jsx(j,{}):s||r?u.jsx(w,{data:a?.similarChargesByBusiness??[],tagIds:s,description:r,onOpenChange:m,title:"Similar Charges by Business"}):null})})})}export{$ as S,T as u};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{fs as d,ft as y}from"./index-CvV5z5r9.js";import{s as S}from"./subMonths-DCj_iXAn.js";function T(s,t,o){return d(s,-t,o)}function M(s,t,o){const{years:n=0,months:u=0,weeks:c=0,days:r=0,hours:e=0,minutes:a=0,seconds:m=0}=t,b=S(s,u+n*12,o),i=T(b,r+c*7,o),f=a+e*60,h=(m+f*60)*1e3;return y(s,+i-h)}export{M as s};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{fu as n}from"./index-CvV5z5r9.js";function u(o,s,t){return n(o,-s,t)}export{u as s};
|
package/dist/index.html
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
<link rel="icon" href="/icons/accounter-logo.svg" />
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
7
|
<title>Accounter</title>
|
|
8
|
-
<script type="module" crossorigin src="/assets/index-
|
|
9
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-CvV5z5r9.js"></script>
|
|
9
|
+
<link rel="stylesheet" crossorigin href="/assets/index-gdTXrWXt.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
|
12
12
|
<div id="root"></div>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@accounter/client",
|
|
3
|
-
"version": "0.0.8-alpha-
|
|
3
|
+
"version": "0.0.8-alpha-20251021225827-178e480c997a9811913e16f85cb94329041b096e",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"scripts": {
|
|
@@ -32,6 +32,7 @@
|
|
|
32
32
|
"@radix-ui/react-icons": "1.3.2",
|
|
33
33
|
"@radix-ui/react-label": "2.1.7",
|
|
34
34
|
"@radix-ui/react-popover": "1.1.15",
|
|
35
|
+
"@radix-ui/react-progress": "^1.1.7",
|
|
35
36
|
"@radix-ui/react-scroll-area": "1.2.10",
|
|
36
37
|
"@radix-ui/react-select": "2.2.6",
|
|
37
38
|
"@radix-ui/react-separator": "1.1.7",
|
|
@@ -40,7 +41,7 @@
|
|
|
40
41
|
"@radix-ui/react-tabs": "1.1.13",
|
|
41
42
|
"@radix-ui/react-toggle": "1.1.10",
|
|
42
43
|
"@radix-ui/react-tooltip": "1.2.8",
|
|
43
|
-
"@tanstack/react-query": "5.90.
|
|
44
|
+
"@tanstack/react-query": "5.90.5",
|
|
44
45
|
"@tanstack/react-table": "8.21.3",
|
|
45
46
|
"@urql/exchange-auth": "3.0.0",
|
|
46
47
|
"chart.js": "4.5.1",
|
|
@@ -79,17 +80,17 @@
|
|
|
79
80
|
"zustand": "5.0.8"
|
|
80
81
|
},
|
|
81
82
|
"devDependencies": {
|
|
82
|
-
"@tailwindcss/vite": "4.1.
|
|
83
|
+
"@tailwindcss/vite": "4.1.15",
|
|
83
84
|
"@types/chart.js": "4.0.1",
|
|
84
85
|
"@types/deep-equal": "1.0.4",
|
|
85
86
|
"@types/react": "19.2.2",
|
|
86
87
|
"@types/react-dom": "19.2.2",
|
|
87
88
|
"@vitejs/plugin-react": "5.0.4",
|
|
88
89
|
"autoprefixer": "10.4.21",
|
|
89
|
-
"tailwindcss": "4.1.
|
|
90
|
+
"tailwindcss": "4.1.15",
|
|
90
91
|
"tailwindcss-animate": "1.0.7",
|
|
91
92
|
"typescript": "5.9.3",
|
|
92
|
-
"vite": "7.1.
|
|
93
|
+
"vite": "7.1.11",
|
|
93
94
|
"vite-plugin-node-polyfills": "0.24.0"
|
|
94
95
|
},
|
|
95
96
|
"overrides": {
|
package/src/app.tsx
CHANGED
|
@@ -19,6 +19,7 @@ import { ValidateReportsScreen } from './components/reports/validations/index.js
|
|
|
19
19
|
import { VatMonthlyReport } from './components/reports/vat-monthly-report/index.js';
|
|
20
20
|
import { YearlyLedgerReport } from './components/reports/yearly-ledger/index.js';
|
|
21
21
|
import { Salaries } from './components/salaries/index.js';
|
|
22
|
+
import { BusinessScreen } from './components/screens/businesses/business.js';
|
|
22
23
|
import { AllCharges } from './components/screens/charges/all-charges.js';
|
|
23
24
|
import { Charge } from './components/screens/charges/charge.js';
|
|
24
25
|
import { MissingInfoCharges } from './components/screens/charges/missing-info-charges.js';
|
|
@@ -42,47 +43,56 @@ export function App(): ReactElement {
|
|
|
42
43
|
<DashboardLayout filtersContext={filtersContext}>
|
|
43
44
|
<Routes>
|
|
44
45
|
<Route path="/" element={<AllCharges />} />
|
|
45
|
-
|
|
46
|
-
<Route path="
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
<Route
|
|
54
|
-
path="
|
|
55
|
-
element={<
|
|
56
|
-
|
|
46
|
+
|
|
47
|
+
<Route path="charges">
|
|
48
|
+
<Route path="" element={<AllCharges />} />
|
|
49
|
+
<Route path="missing-info" element={<MissingInfoCharges />} />
|
|
50
|
+
<Route path="ledger-validation" element={<ChargesLedgerValidation />} />
|
|
51
|
+
<Route path=":chargeId" element={<Charge />} />
|
|
52
|
+
</Route>
|
|
53
|
+
|
|
54
|
+
<Route path="businesses">
|
|
55
|
+
<Route path="" element={<Businesses />} />
|
|
56
|
+
<Route path="transactions" element={<BusinessTransactionsSummery />} />
|
|
57
|
+
<Route path=":businessId" element={<BusinessScreen />} />
|
|
58
|
+
<Route path=":businessId/transactions" element={<BusinessTransactionsSingle />} />
|
|
59
|
+
</Route>
|
|
60
|
+
|
|
61
|
+
<Route path="business-trips">
|
|
62
|
+
<Route path="" element={<BusinessTrips />} />
|
|
63
|
+
<Route path=":businessTripId" element={<BusinessTrip />} />
|
|
64
|
+
</Route>
|
|
65
|
+
|
|
57
66
|
<Route path="charts">
|
|
58
67
|
<Route path="" element={<ChartPage />} />
|
|
59
68
|
<Route path="monthly-income-expense" element={<MonthlyIncomeExpenseChart />} />
|
|
60
69
|
</Route>
|
|
70
|
+
|
|
61
71
|
<Route path="documents">
|
|
62
72
|
<Route path="" element={<DocumentsReport />} />
|
|
63
|
-
<Route path="issue-documents" element={<IssueDocuments />} />
|
|
64
73
|
<Route path="issue-document" element={<IssueDocumentScreen />} />
|
|
74
|
+
<Route path="issue-documents" element={<IssueDocuments />} />
|
|
65
75
|
</Route>
|
|
66
76
|
<Route path="accountant-approvals" element={<AccountantApprovals />} />
|
|
67
77
|
<Route path="reports">
|
|
68
78
|
<Route path="trial-balance" element={<TrialBalanceReport />} />
|
|
69
79
|
<Route path="conto" element={<ContoReport />} />
|
|
70
80
|
<Route path="vat-monthly" element={<VatMonthlyReport />} />
|
|
71
|
-
<Route path="profit-and-loss"
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
81
|
+
<Route path="profit-and-loss">
|
|
82
|
+
<Route path="" element={<ProfitAndLossReport />} />
|
|
83
|
+
<Route path=":year" element={<ProfitAndLossReport />} />
|
|
84
|
+
</Route>
|
|
85
|
+
<Route path="tax">
|
|
86
|
+
<Route path="" element={<TaxReport />} />
|
|
87
|
+
<Route path=":year" element={<TaxReport />} />
|
|
88
|
+
</Route>
|
|
75
89
|
<Route path="depreciation" element={<DepreciationReport />} />
|
|
76
90
|
<Route path="shaam6111" element={<Shaam6111Report />} />
|
|
77
91
|
<Route path="yearly-ledger" element={<YearlyLedgerReport />} />
|
|
78
|
-
<Route
|
|
79
|
-
path="
|
|
80
|
-
element={<CorporateTaxRulingComplianceReport />}
|
|
81
|
-
|
|
82
|
-
<Route
|
|
83
|
-
path="corporate-tax-ruling-compliance/:year"
|
|
84
|
-
element={<CorporateTaxRulingComplianceReport />}
|
|
85
|
-
/>
|
|
92
|
+
<Route path="corporate-tax-ruling-compliance">
|
|
93
|
+
<Route path="" element={<CorporateTaxRulingComplianceReport />} />
|
|
94
|
+
<Route path=":year" element={<CorporateTaxRulingComplianceReport />} />
|
|
95
|
+
</Route>
|
|
86
96
|
<Route path="balance" element={<BalanceReport />} />
|
|
87
97
|
<Route path="validate-reports" element={<ValidateReportsScreen />} />
|
|
88
98
|
</Route>
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { format } from 'date-fns';
|
|
2
|
+
import { Building2 } from 'lucide-react';
|
|
3
|
+
import { Badge } from '@/components/ui/badge.js';
|
|
4
|
+
import { BusinessHeaderFragmentDoc } from '@/gql/graphql.js';
|
|
5
|
+
import { getFragmentData, type FragmentType } from '@/gql/index.js';
|
|
6
|
+
|
|
7
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions -- used by codegen
|
|
8
|
+
/* GraphQL */ `
|
|
9
|
+
fragment BusinessHeader on Business {
|
|
10
|
+
__typename
|
|
11
|
+
id
|
|
12
|
+
name
|
|
13
|
+
createdAt
|
|
14
|
+
... on LtdFinancialEntity {
|
|
15
|
+
governmentId
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
`;
|
|
19
|
+
|
|
20
|
+
interface Props {
|
|
21
|
+
data?: FragmentType<typeof BusinessHeaderFragmentDoc>;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function BusinessHeader({ data }: Props) {
|
|
25
|
+
const business = getFragmentData(BusinessHeaderFragmentDoc, data);
|
|
26
|
+
|
|
27
|
+
if (!business || business.__typename !== 'LtdFinancialEntity') {
|
|
28
|
+
// TODO: handle other business types
|
|
29
|
+
return <div />;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return (
|
|
33
|
+
<header className="sticky top-0 z-50 w-full border-b border-border bg-card/95 backdrop-blur supports-[backdrop-filter]:bg-card/60">
|
|
34
|
+
<div className="container mx-auto px-4 md:px-6 lg:px-8 max-w-7xl">
|
|
35
|
+
<div className="flex h-16 items-center justify-between gap-4">
|
|
36
|
+
<div className="flex items-center gap-3 min-w-0 flex-1">
|
|
37
|
+
<div className="flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-accent">
|
|
38
|
+
<Building2 className="h-5 w-5 text-accent-foreground" />
|
|
39
|
+
</div>
|
|
40
|
+
<div className="min-w-0 flex-1">
|
|
41
|
+
<div className="flex items-center gap-2 flex-wrap">
|
|
42
|
+
<h1 className="text-lg font-semibold text-foreground">{business.name}</h1>
|
|
43
|
+
{/* TODO: make dynamic, add client badge */}
|
|
44
|
+
<Badge variant="secondary">Active</Badge>
|
|
45
|
+
</div>
|
|
46
|
+
<p className="text-sm text-muted-foreground truncate">Business ID: {business.id}</p>
|
|
47
|
+
</div>
|
|
48
|
+
</div>
|
|
49
|
+
|
|
50
|
+
<div className="hidden md:flex items-center gap-6 text-sm">
|
|
51
|
+
{business.governmentId && (
|
|
52
|
+
<div className="text-right">
|
|
53
|
+
<p className="text-muted-foreground">Tax ID</p>
|
|
54
|
+
<p className="font-medium text-foreground">{business.governmentId}</p>
|
|
55
|
+
</div>
|
|
56
|
+
)}
|
|
57
|
+
<div className="text-right">
|
|
58
|
+
<p className="text-muted-foreground">Since</p>
|
|
59
|
+
<p className="font-medium text-foreground">
|
|
60
|
+
{format(business.createdAt, 'MMM yyyy')}
|
|
61
|
+
</p>
|
|
62
|
+
</div>
|
|
63
|
+
</div>
|
|
64
|
+
</div>
|
|
65
|
+
</div>
|
|
66
|
+
</header>
|
|
67
|
+
);
|
|
68
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { useContext, useState } from 'react';
|
|
2
|
+
import { useQuery } from 'urql';
|
|
3
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card.js';
|
|
4
|
+
import { BusinessChargesSectionDocument, ChargeSortByField } from '@/gql/graphql.js';
|
|
5
|
+
import { UserContext } from '@/providers/user-provider.js';
|
|
6
|
+
import { Pagination } from '@mantine/core';
|
|
7
|
+
import { ChargesTable } from '../charges/charges-table';
|
|
8
|
+
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions -- used by codegen
|
|
10
|
+
/* GraphQL */ `
|
|
11
|
+
query BusinessChargesSection($page: Int, $limit: Int, $filters: ChargeFilter) {
|
|
12
|
+
allCharges(page: $page, limit: $limit, filters: $filters) {
|
|
13
|
+
nodes {
|
|
14
|
+
id
|
|
15
|
+
...ChargesTableFields
|
|
16
|
+
}
|
|
17
|
+
pageInfo {
|
|
18
|
+
totalPages
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
`;
|
|
23
|
+
|
|
24
|
+
interface Props {
|
|
25
|
+
businessId: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function ChargesSection({ businessId }: Props) {
|
|
29
|
+
const { userContext } = useContext(UserContext);
|
|
30
|
+
const [activePage, setActivePage] = useState(1);
|
|
31
|
+
|
|
32
|
+
const [{ data, fetching }] = useQuery({
|
|
33
|
+
query: BusinessChargesSectionDocument,
|
|
34
|
+
variables: {
|
|
35
|
+
filters: {
|
|
36
|
+
byOwners: userContext?.context.adminBusinessId
|
|
37
|
+
? [userContext.context.adminBusinessId]
|
|
38
|
+
: undefined,
|
|
39
|
+
sortBy: {
|
|
40
|
+
field: ChargeSortByField.Date,
|
|
41
|
+
asc: false,
|
|
42
|
+
},
|
|
43
|
+
byBusinesses: [businessId],
|
|
44
|
+
},
|
|
45
|
+
page: activePage,
|
|
46
|
+
limit: 100,
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
const totalPages = data?.allCharges?.pageInfo.totalPages ?? 1;
|
|
51
|
+
const charges = data?.allCharges?.nodes ?? [];
|
|
52
|
+
|
|
53
|
+
if (fetching) {
|
|
54
|
+
return <div>Loading charges...</div>;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return (
|
|
58
|
+
<Card>
|
|
59
|
+
<CardHeader className="flex w-full justify-between items-center">
|
|
60
|
+
<div className="flex items-center justify-between">
|
|
61
|
+
<div>
|
|
62
|
+
<CardTitle>Charges</CardTitle>
|
|
63
|
+
<CardDescription>Recurring and one-time charges for this business</CardDescription>
|
|
64
|
+
</div>
|
|
65
|
+
</div>
|
|
66
|
+
{totalPages > 1 && (
|
|
67
|
+
<Pagination
|
|
68
|
+
className="flex-fit"
|
|
69
|
+
value={activePage}
|
|
70
|
+
onChange={setActivePage}
|
|
71
|
+
total={totalPages}
|
|
72
|
+
/>
|
|
73
|
+
)}
|
|
74
|
+
</CardHeader>
|
|
75
|
+
<CardContent>
|
|
76
|
+
<div className="rounded-md border">
|
|
77
|
+
<ChargesTable data={charges} isAllOpened={false} />
|
|
78
|
+
</div>
|
|
79
|
+
</CardContent>
|
|
80
|
+
</Card>
|
|
81
|
+
);
|
|
82
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { DollarSign, TrendingUp } from 'lucide-react';
|
|
2
|
+
import { CartesianGrid, Line, LineChart, ResponsiveContainer, XAxis, YAxis } from 'recharts';
|
|
3
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card.js';
|
|
4
|
+
import { ChartContainer, ChartTooltip, ChartTooltipContent } from '@/components/ui/chart.js';
|
|
5
|
+
|
|
6
|
+
const revenueData = [
|
|
7
|
+
{ month: 'Jan', revenue: 12_500, expenses: 8200 },
|
|
8
|
+
{ month: 'Feb', revenue: 15_800, expenses: 9100 },
|
|
9
|
+
{ month: 'Mar', revenue: 18_200, expenses: 10_500 },
|
|
10
|
+
{ month: 'Apr', revenue: 16_900, expenses: 9800 },
|
|
11
|
+
{ month: 'May', revenue: 21_300, expenses: 11_200 },
|
|
12
|
+
{ month: 'Jun', revenue: 24_500, expenses: 12_800 },
|
|
13
|
+
{ month: 'Jul', revenue: 22_800, expenses: 11_900 },
|
|
14
|
+
{ month: 'Aug', revenue: 26_100, expenses: 13_500 },
|
|
15
|
+
{ month: 'Sep', revenue: 28_900, expenses: 14_200 },
|
|
16
|
+
{ month: 'Oct', revenue: 31_200, expenses: 15_100 },
|
|
17
|
+
];
|
|
18
|
+
|
|
19
|
+
export function ChartsSection() {
|
|
20
|
+
const totalRevenue = revenueData.reduce((sum, item) => sum + item.revenue, 0);
|
|
21
|
+
const avgRevenue = totalRevenue / revenueData.length;
|
|
22
|
+
|
|
23
|
+
return (
|
|
24
|
+
<Card>
|
|
25
|
+
<CardHeader>
|
|
26
|
+
<CardTitle>Revenue Analytics</CardTitle>
|
|
27
|
+
<CardDescription>Revenue and expenses over time</CardDescription>
|
|
28
|
+
</CardHeader>
|
|
29
|
+
<CardContent>
|
|
30
|
+
<div className="grid gap-4 md:grid-cols-3 mb-6">
|
|
31
|
+
<div className="rounded-lg border p-4 space-y-2">
|
|
32
|
+
<div className="flex items-center gap-2 text-sm text-muted-foreground">
|
|
33
|
+
<DollarSign className="h-4 w-4" />
|
|
34
|
+
Total Revenue
|
|
35
|
+
</div>
|
|
36
|
+
<p className="text-2xl font-bold">${totalRevenue.toLocaleString()}</p>
|
|
37
|
+
<div className="flex items-center gap-1 text-sm text-green-600">
|
|
38
|
+
<TrendingUp className="h-3 w-3" />
|
|
39
|
+
<span>+24.5% from last period</span>
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
|
|
43
|
+
<div className="rounded-lg border p-4 space-y-2">
|
|
44
|
+
<div className="flex items-center gap-2 text-sm text-muted-foreground">
|
|
45
|
+
<DollarSign className="h-4 w-4" />
|
|
46
|
+
Average Monthly
|
|
47
|
+
</div>
|
|
48
|
+
<p className="text-2xl font-bold">
|
|
49
|
+
${avgRevenue.toLocaleString(undefined, { maximumFractionDigits: 0 })}
|
|
50
|
+
</p>
|
|
51
|
+
<div className="flex items-center gap-1 text-sm text-green-600">
|
|
52
|
+
<TrendingUp className="h-3 w-3" />
|
|
53
|
+
<span>+18.2% growth rate</span>
|
|
54
|
+
</div>
|
|
55
|
+
</div>
|
|
56
|
+
|
|
57
|
+
<div className="rounded-lg border p-4 space-y-2">
|
|
58
|
+
<div className="flex items-center gap-2 text-sm text-muted-foreground">
|
|
59
|
+
<DollarSign className="h-4 w-4" />
|
|
60
|
+
Current Month
|
|
61
|
+
</div>
|
|
62
|
+
<p className="text-2xl font-bold">
|
|
63
|
+
${revenueData[revenueData.length - 1].revenue.toLocaleString()}
|
|
64
|
+
</p>
|
|
65
|
+
<div className="flex items-center gap-1 text-sm text-green-600">
|
|
66
|
+
<TrendingUp className="h-3 w-3" />
|
|
67
|
+
<span>+8.0% from last month</span>
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
70
|
+
</div>
|
|
71
|
+
|
|
72
|
+
<ChartContainer
|
|
73
|
+
config={{
|
|
74
|
+
revenue: {
|
|
75
|
+
label: 'Revenue',
|
|
76
|
+
color: 'hsl(var(--chart-1))',
|
|
77
|
+
},
|
|
78
|
+
expenses: {
|
|
79
|
+
label: 'Expenses',
|
|
80
|
+
color: 'hsl(var(--chart-2))',
|
|
81
|
+
},
|
|
82
|
+
}}
|
|
83
|
+
className="h-[400px]"
|
|
84
|
+
>
|
|
85
|
+
<ResponsiveContainer width="100%" height="100%">
|
|
86
|
+
<LineChart data={revenueData} margin={{ top: 5, right: 10, left: 10, bottom: 5 }}>
|
|
87
|
+
<CartesianGrid strokeDasharray="3 3" className="stroke-muted" />
|
|
88
|
+
<XAxis
|
|
89
|
+
dataKey="month"
|
|
90
|
+
className="text-xs"
|
|
91
|
+
tick={{ fill: 'hsl(var(--muted-foreground))' }}
|
|
92
|
+
/>
|
|
93
|
+
<YAxis className="text-xs" tick={{ fill: 'hsl(var(--muted-foreground))' }} />
|
|
94
|
+
<ChartTooltip content={<ChartTooltipContent />} />
|
|
95
|
+
<Line
|
|
96
|
+
type="monotone"
|
|
97
|
+
dataKey="revenue"
|
|
98
|
+
stroke="var(--color-revenue)"
|
|
99
|
+
strokeWidth={2}
|
|
100
|
+
dot={{ fill: 'var(--color-revenue)', r: 4 }}
|
|
101
|
+
/>
|
|
102
|
+
<Line
|
|
103
|
+
type="monotone"
|
|
104
|
+
dataKey="expenses"
|
|
105
|
+
stroke="var(--color-expenses)"
|
|
106
|
+
strokeWidth={2}
|
|
107
|
+
dot={{ fill: 'var(--color-expenses)', r: 4 }}
|
|
108
|
+
/>
|
|
109
|
+
</LineChart>
|
|
110
|
+
</ResponsiveContainer>
|
|
111
|
+
</ChartContainer>
|
|
112
|
+
</CardContent>
|
|
113
|
+
</Card>
|
|
114
|
+
);
|
|
115
|
+
}
|