1(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,37463,4499,25640,13259,74859,52172,86738,37662,72692,64556,46154,42863,38712,25621,66061,23381,8433,e=>{"use strict";e.s([],37463),e.i(58034),e.i(60693),e.i(40106),e.i(97172);var t=e.i(68834),i=e.i(79473);let a=[{value:"USD",symbol:"$",label:"US Dollar"},{value:"INR",symbol:"â¹",label:"Indian Rupee"},{value:"EUR",symbol:"â¬",label:"Euro"},{value:"GBP",symbol:"£",label:"British Pound"},{value:"CAD",symbol:"$",label:"Canadian Dollar"},{value:"AUD",symbol:"$",label:"Australian Dollar"},{value:"JPY",symbol:"Â¥",label:"Japanese Yen"},{value:"CNY",symbol:"Â¥",label:"Chinese Yuan"},{value:"SGD",symbol:"$",label:"Singapore Dollar"},{value:"AED",symbol:"د.Ø¥",label:"UAE Dirham"},{value:"NGN",symbol:"â¦",label:"Nigerian Naira"}],o={USD:1,INR:94.4516,EUR:.92,GBP:.79,CAD:1.37,AUD:1.51,JPY:156,CNY:7.27,SGD:1.34,AED:3.67,NGN:1550},r={USD:"en-US",INR:"en-IN",EUR:"de-DE",GBP:"en-GB",CAD:"en-CA",AUD:"en-AU",JPY:"ja-JP",CNY:"zh-CN",SGD:"en-SG",AED:"ar-AE",NGN:"en-NG"};function n(e,t,i){if(t===i)return e;let a="USD"===t?e:e/o[t];return"USD"===i?a:a*o[i]}function s(e){return!!e&&a.some(t=>t.value===e)}function d(){return{primary:"USD",secondary:null}}let l=(0,t.create)()((0,i.devtools)((0,i.persist)((e,t)=>({...d(),primaryUserSet:!1,secondaryUserSet:!1,setPrimary:t=>e({primary:t,primaryUserSet:!0}),setSecondary:t=>e({secondary:t,secondaryUserSet:null!==t}),syncPrimaryFromOrg:i=>{t().primaryUserSet||!s(i)||t().primary!==i&&e({primary:i})},syncSecondaryFromOrg:i=>{t().secondaryUserSet||!s(i)||i!==t().primary&&e({secondary:i,secondaryUserSet:!0})}}),{name:"offbooks-currency",storage:(0,i.createJSONStorage)(()=>localStorage),version:4,migrate:()=>d()})));e.s(["CURRENCY_OPTIONS",0,a,"convert",0,n,"displayAmount",0,function(e,t,i,a,o){return o===i&&null!=a?a:n(e,t,i)},"isSupportedCurrency",0,s,"localeForCurrency",0,function(e){return r[e]??"en-US"},"useCurrencyStore",0,l],4499),e.i(47901);let c="group:saas:general",u="group:saas:departments",m="group:utility:general",p=[{id:c,name:"General",color:"#94a3b8",domain:"saas",isDefault:!0,kind:"group",description:"Offbooks' shipped buckets â applies to most subscription spend."},{id:"AI",name:"AI",color:"#a855f7",domain:"saas",isDefault:!0,kind:"label",groupId:c},{id:"Design",name:"Design",color:"#ec4899",domain:"saas",isDefault:!0,kind:"label",groupId:c},{id:"Engineering",name:"Engineering",color:"#3b82f6",domain:"saas",isDefault:!0,kind:"label",groupId:c},{id:"Productivity",name:"Productivity",color:"#10b981",domain:"saas",isDefault:!0,kind:"label",groupId:c},{id:"Communication",name:"Communication",color:"#f59e0b",domain:"saas",isDefault:!0,kind:"label",groupId:c},{id:"Cloud",name:"Cloud",color:"#06b6d4",domain:"saas",isDefault:!0,kind:"label",groupId:c},{id:"Analytics",name:"Analytics",color:"#8b5cf6",domain:"saas",isDefault:!0,kind:"label",groupId:c},{id:"Marketing",name:"Marketing",color:"#f43f5e",domain:"saas",isDefault:!0,kind:"label",groupId:c},{id:"Sales & CRM",name:"Sales & CRM",color:"#84cc16",domain:"saas",isDefault:!0,kind:"label",groupId:c},{id:"Finance",name:"Finance",color:"#22c55e",domain:"saas",isDefault:!0,kind:"label",groupId:c},{id:"Stock & Assets",name:"Stock & Assets",color:"#eab308",domain:"saas",isDefault:!0,kind:"label",groupId:c},{id:"Security",name:"Security",color:"#ef4444",domain:"saas",isDefault:!0,kind:"label",groupId:c},{id:"HR & People",name:"HR & People",color:"#0ea5e9",domain:"saas",isDefault:!0,kind:"label",groupId:c},{id:"Other:saas",name:"Other",color:"#94a3b8",domain:"saas",isDefault:!0,kind:"label",groupId:c},{id:u,name:"Departments",color:"#a855f7",domain:"saas",isDefault:!0,kind:"group",description:"Which team uses the tool. Offbooks reads this to roll spend up by department."},{id:"dept:design",name:"Design",color:"#ec4899",domain:"saas",isDefault:!0,kind:"label",groupId:u},{id:"dept:engineering",name:"Engineering",color:"#3b82f6",domain:"saas",isDefault:!0,kind:"label",groupId:u},{id:"dept:marketing",name:"Marketing",color:"#f43f5e",domain:"saas",isDefault:!0,kind:"label",groupId:u},{id:"dept:operations",name:"Operations",color:"#10b981",domain:"saas",isDefault:!0,kind:"label",groupId:u},{id:"dept:sales",name:"Sales",color:"#84cc16",domain:"saas",isDefault:!0,kind:"label",groupId:u},{id:"dept:finance",name:"Finance",color:"#22c55e",domain:"saas",isDefault:!0,kind:"label",groupId:u},{id:"dept:people",name:"People",color:"#0ea5e9",domain:"saas",isDefault:!0,kind:"label",groupId:u}
1,{id:m,name:"General",color:"#94a3b8",domain:"utility",isDefault:!0,kind:"group",description:"Offbooks' shipped buckets â applies to most utility bills."},{id:"Internet",name:"Internet",color:"#06b6d4",domain:"utility",isDefault:!0,kind:"label",groupId:m},{id:"Rent",name:"Rent",color:"#a855f7",domain:"utility",isDefault:!0,kind:"label",groupId:m},{id:"Phone",name:"Phone",color:"#22c55e",domain:"utility",isDefault:!0,kind:"label",groupId:m},{id:"Electricity",name:"Electricity",color:"#eab308",domain:"utility",isDefault:!0,kind:"label",groupId:m},{id:"Water",name:"Water",color:"#3b82f6",domain:"utility",isDefault:!0,kind:"label",groupId:m},{id:"Gas",name:"Gas",color:"#f97316",domain:"utility",isDefault:!0,kind:"label",groupId:m},{id:"Subscriptions",name:"Subscriptions",color:"#ec4899",domain:"utility",isDefault:!0,kind:"label",groupId:m},{id:"Other:utility",name:"Other",color:"#94a3b8",domain:"utility",isDefault:!0,kind:"label",groupId:m}],g=(0,t.create)()((0,i.devtools)((0,i.persist)((e,t)=>({categories:p,add:({name:i,color:a,domain:o,description:r,kind:n="label",groupId:s})=>{let d=i.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")||`cat-${Date.now()}`,l="group"===n?"group":"custom",c=`${l}:${o}:${d}`,u=2;for(;t().categories.some(e=>e.id===c);)c=`${l}:${o}:${d}-${u++}`;let m={id:c,name:i.trim(),color:a,description:r?.trim()||void 0,domain:o,isDefault:!1,kind:n,groupId:"label"===n?s:void 0};return e(e=>({categories:[...e.categories,m]})),m},update:(t,i)=>e(e=>({categories:e.categories.map(e=>e.id===t?{...e,...void 0!==i.name?{name:i.name.trim()}:{},...void 0!==i.color?{color:i.color}:{},...void 0!==i.description?{description:i.description.trim()||void 0}:{},...void 0!==i.groupId&&"label"===e.kind?{groupId:i.groupId||void 0}:{}}:e)})),remove:t=>e(e=>{let i=e.categories.find(e=>e.id===t);return!i||i.isDefault?e:{categories:("group"===i.kind?e.categories.map(e=>e.groupId===t?{...e,groupId:void 0}:e):e.categories).filter(e=>e.id!==t)}}),forDomain:e=>t().categories.filter(t=>t.domain===e),byId:e=>t().categories.find(t=>t.id===e)}),{name:"offbooks-categories",storage:(0,i.createJSONStorage)(()=>localStorage),merge:(e,t)=>{let i=(e?.categories??[]).map(e=>({...e,kind:e.kind??"label"})),a=i.filter(e=>!e.isDefault),o=new Map(i.filter(e=>e.isDefault).map(e=>[e.id,e])),r=p.map(e=>{let t=o.get(e.id);return t?{...e,name:t.name,color:t.color,description:t.description}:e});return{...t,categories:[...r,...a]}}})));e.s(["CATEGORY_COLOR_PALETTE",0,[{name:"Red",value:"#ef4444"},{name:"Orange",value:"#f97316"},{name:"Amber",value:"#f59e0b"},{name:"Yellow",value:"#eab308"},{name:"Lime",value:"#84cc16"},{name:"Green",value:"#22c55e"},{name:"Teal",value:"#14b8a6"},{name:"Cyan",value:"#06b6d4"},{name:"Sky",value:"#0ea5e9"},{name:"Blue",value:"#3b82f6"},{name:"Indigo",value:"#6366f1"},{name:"Violet",value:"#8b5cf6"},{name:"Purple",value:"#a855f7"},{name:"Pink",value:"#ec4899"},{name:"Rose",value:"#f43f5e"},{name:"Slate",value:"#94a3b8"}],"useCategoryStore",0,g],25640);let y=[{id:"rev-auto-google",status:"resolved",confidence:.97,detectedAt:new Date(Date.now()-36e5).toISOString(),detectedBy:{kind:"ai",agentName:"Penny"},resolutionLog:[{at:new Date(Date.now()-36e5+1e3).toISOString(),by:{kind:"ai",agentName:"Penny"},summary:"filed Google misc under vendor Google Workspace â 97% confident on this one"}],situation:{kind:"vendor-identity",data:{suggestedVendorName:"Google Workspace",currency:"USD",candidates:[{merchantName:"Google misc",totalUSD:52,transactionIds:["txn-google-misc-apr","txn-google-misc-may"],logoKey:"google"}]}}},{id:"rev-vendor-anthropic",status:"pending",confidence:.86,detectedAt:new Date(Date.now()-3e5).toISOString(),detectedBy:{kind:"ai",agentName:"Penny"},resolutionLog:[],situation:{kind:"vendor-identity",data:{suggestedVendorName:"Anthropic",currency:"USD",candidates:[{merchantName:"Anthropic API",totalUSD:131,transactionIds:["txn-anthropic-api-apr","txn-anthropic-api-may"],logoKey:"anthropic"},{merchantName:"Claude.ai",totalUSD:160,transactionIds:["txn-claude-apr","txn-claude-may"],logoKey:"anthropic"}]}}},{id:"rev-dup-google-may",status:"pending",confidence:.91,detectedAt:new Date(Date.now()-48e4).toISOString(),detectedBy:{kind:"ai",agentName:"Penny"},resolutionLog:[],situation:{kind:"duplicate-transaction",data:{description:"Google Worksp
1ace â May seats",appearances:[{merchantName:"Google Inc",source:"Card statement (USD)",amount:169,currency:"USD",transactionId:"txn-google-inc-may"},{merchantName:"Google India Pvt Ltd",source:"GST invoice (INR)",amount:14180,currency:"INR",transactionId:"txn-google-india-may"}]}}},{id:"rev-category-linear",status:"pending",confidence:.55,detectedAt:new Date(Date.now()-12e4).toISOString(),detectedBy:{kind:"ai",agentName:"Penny"},resolutionLog:[],situation:{kind:"low-confidence-category",data:{merchantName:"Linear",amountUSD:48,transactionId:"txn-linear-may",suggestedDepartmentId:"dept:engineering",suggestedCategoryId:"Engineering"}}}],f=(0,t.create)()((0,i.devtools)((0,i.persist)(e=>({items:y,open:!1,setOpen:t=>e({open:t}),add:t=>e(e=>({items:[t,...e.items]})),resolve:(t,i)=>e(e=>({items:e.items.map(e=>e.id===t?{...e,status:"resolved",resolutionLog:[...e.resolutionLog,i]}:e)})),dismiss:(t,i)=>e(e=>({items:e.items.map(e=>e.id===t?{...e,status:"dismissed",resolutionLog:[...e.resolutionLog,i]}:e)})),reseed:()=>e({items:y})}),{name:"offbooks-review-queue",storage:(0,i.createJSONStorage)(()=>localStorage)})));e.s(["nowIso",0,function(){return new Date().toISOString()},"relativeTime",0,function(e,t=Date.now()){let i=Math.floor((t-new Date(e).getTime())/1e3);return i<30?"just now":i<90?"1 min ago":i<3600?`${Math.floor(i/60)} min ago`:i<7200?"1 hr ago":i<86400?`${Math.floor(i/3600)} hr ago`:`${Math.floor(i/86400)} d ago`},"selectPendingCount",0,function(e){return e.items.filter(e=>"pending"===e.status).length},"selectResolvedItems",0,function(e){return e.items.filter(e=>"pending"!==e.status)},"useReviewQueueStore",0,f],13259);let v=(0,t.create)()((0,i.devtools)((0,i.persist)(e=>({rules:[],add:t=>e(e=>({rules:[t,...e.rules]})),remove:t=>e(e=>({rules:e.rules.filter(e=>e.id!==t)}))}),{name:"offbooks-category-rules",storage:(0,i.createJSONStorage)(()=>localStorage)})));e.s(["useCategoryRulesStore",0,v],74859);let h=(0,t.create)(e=>({target:null,setTarget:t=>e({target:t}),clear:()=>e({target:null})}));e.s(["useInspectStore",0,h],52172),e.i(72759),e.i(4373),e.i(47167);var b=e.i(32200);function S(e){let t=e.ui?{...e.ui}:{id:e.id,name:e.name,section:e.group||"Custom",filters:[],createdAt:new Date().toISOString()};return{...t,id:t.id??e.id,serverId:e.id}}function w(e){let t=e.sort?.field==="amount"?"amount":"date",i=e.sort?.order==="asc"?"asc":"desc";return{name:e.name,group:e.section||"Custom",sort:`${t} ${i}`,filter:function(e){let t={},i=(e,i)=>{(t[e]??=[]).push(i)};for(let a of e||[])"direction"===a.kind&&a.values?.[0]?t.dir="cash-in"===a.values[0]?"in":"out":"custom-property"===a.kind&&a.customPropertyId?"does_not_exist"===a.operator?i("notTags",a.customPropertyId):"or"===a.join?i("anyTags",a.customPropertyId):i("allTags",a.customPropertyId):"transaction-value"===a.kind&&"number"==typeof a.value&&("less_than_or_equal"===a.operator||"less_than"===a.operator?t.amountMax=a.value:"between"===a.operator?(t.amountMin=a.value,"number"==typeof a.valueUpper&&(t.amountMax=a.valueUpper)):t.amountMin=a.value);return t}(e.filters),ui:e}}let k=(e,t)=>b.apiClient.patch(`/views/${e}`,w(t)).then(e=>e.data),I="Custom",D=[{id:"view-cash-in",name:"Cash In",icon:"ArrowDown",section:"Cash Flow",filters:[{kind:"direction",operator:"is",values:["cash-in"]}],sort:{field:"transactionDate",order:"desc"},createdAt:"2026-01-01T00:00:00Z"},{id:"view-cash-out",name:"Cash Out",icon:"ArrowUp",section:"Cash Flow",filters:[{kind:"direction",operator:"is",values:["cash-out"]}],sort:{field:"transactionDate",order:"desc"},createdAt:"2026-01-01T00:00:00Z"},{id:"view-recurring",name:"Recurring",icon:"Repeat",section:"Cash Flow",filters:[{kind:"custom-property",operator:"exists",customPropertyId:"cp-client-recurring",values:[]},{kind:"custom-property",operator:"exists",customPropertyId:"cp-vendor-recurring",values:[],join:"or"}],sort:{field:"transactionDate",order:"desc"},createdAt:"2026-01-01T00:00:00Z"},{id:"view-large",name:"Large transactions",icon:"Coins",section:"Cash Flow",filters:[{kind:"transaction-value",operator:"greater_than",value:5e3}],sort:{field:"amount",order:"desc"},createdAt:"2026-01-01T00:00:00Z"},{id:"view-clients",name:"Client payments",icon:"CowboyHat",section:"Clients",filters:[{kind:"entity",entityType:"client",operator:"exists",values:[]}],sort:{field:"transactionDate",order:"desc"},createdAt:"2026-01-01T00:00:00Z"},{id:"view-clients-strategic",name:"Strategic accounts",icon:"Star",section:"Clients",filters:[{kind:"custom-property",o
1perator:"exists",customPropertyId:"cp-client-strategic",values:[]}],sort:{field:"amount",order:"desc"},createdAt:"2026-01-01T00:00:00Z"},{id:"view-clients-oneoff",name:"One-off projects",icon:"Sparkle",section:"Clients",filters:[{kind:"custom-property",operator:"exists",customPropertyId:"cp-client-one-time",values:[]}],sort:{field:"transactionDate",order:"desc"},createdAt:"2026-01-01T00:00:00Z"},{id:"view-payroll",name:"Payroll",icon:"UsersThree",section:"Spend",filters:[{kind:"entity",entityType:"team_member",operator:"exists",values:[]}],sort:{field:"transactionDate",order:"desc"},createdAt:"2026-01-01T00:00:00Z"},{id:"view-contractors",name:"Contractors",icon:"Briefcase",section:"Spend",filters:[{kind:"custom-property",operator:"exists",customPropertyId:"cp-vendor-contractor",values:[]}],sort:{field:"transactionDate",order:"desc"},createdAt:"2026-01-01T00:00:00Z"},{id:"view-saas",name:"SaaS & Tools",icon:"Cloud",section:"Spend",filters:[{kind:"custom-property",operator:"exists",customPropertyId:"cp-vendor-saas",values:[]}],sort:{field:"transactionDate",order:"desc"},createdAt:"2026-01-01T00:00:00Z"},{id:"view-ads",name:"Ads",icon:"Megaphone",section:"Spend",filters:[{kind:"entity",entityType:"vendor",operator:"is_one_of",values:["ads-google","ads-meta"]}],sort:{field:"transactionDate",order:"desc"},createdAt:"2026-01-01T00:00:00Z"},{id:"view-premises",name:"Rent & Utilities",icon:"Warehouse",section:"Spend",filters:[{kind:"custom-property",operator:"exists",customPropertyId:"cp-vendor-utility",values:[]}],sort:{field:"transactionDate",order:"desc"},createdAt:"2026-01-01T00:00:00Z"},{id:"view-big-ticket",name:"Big-ticket",icon:"Stack",section:"Spend",filters:[{kind:"direction",operator:"is",values:["cash-out"]},{kind:"transaction-value",operator:"greater_than",value:2e3,join:"and"}],sort:{field:"transactionDate",order:"desc"},createdAt:"2026-01-01T00:00:00Z"}],C=["view-cash-in","view-cash-out","view-recurring","view-large","view-payroll","view-saas","view-big-ticket"].map(e=>D.find(t=>t.id===e)).filter(Boolean),T=(0,t.create)()((0,i.devtools)((0,i.persist)((e,t)=>{let i=e=>{let i=t().views.find(t=>t.id===e);i?.serverId&&k(i.serverId,i).catch(()=>{})},a=()=>{let e,i=t().views.map((e,t)=>e.serverId?{id:e.serverId,group:e.section||I,order:t}:null).filter(e=>!!e);i.length&&(e=i,b.apiClient.post("/views/reorder",{order:e}).then(e=>e.data)).catch(()=>{})};return{views:C,collapsedSections:[],highlightId:null,hydrated:!1,hydrate:async()=>{try{let{views:t}=await b.apiClient.get("/views").then(e=>e.data);Array.isArray(t)&&t.length?e({views:t.map(S),hydrated:!0}):e({hydrated:!0})}catch{e({hydrated:!0})}},setHighlight:i=>{e({highlightId:i}),i&&setTimeout(()=>{t().highlightId===i&&e({highlightId:null})},4e3)},add:({name:i,icon:a,section:o,filters:r,dashboard:n})=>{let s=`view-${Math.random().toString(36).slice(2,9)}`;e(e=>({views:[...e.views,{id:s,name:i,icon:a,section:o.trim()||I,filters:r,dashboard:n,createdAt:new Date().toISOString()}]})),t().setHighlight(s);{let i,a=t().views.find(e=>e.id===s);a&&(i=a,b.apiClient.post("/views",w(i)).then(e=>e.data)).then(t=>{let i=t?.view?.id;i&&e(e=>({views:e.views.map(e=>e.id===s?{...e,serverId:i}:e)}))}).catch(()=>{})}return s},rename:(t,a)=>{e(e=>({views:e.views.map(e=>e.id===t?{...e,name:a}:e)})),i(t)},updateFilters:(t,a)=>{e(e=>({views:e.views.map(e=>e.id===t?{...e,filters:a}:e)})),i(t)},setDashboard:(t,a)=>{e(e=>({views:e.views.map(e=>e.id===t?{...e,dashboard:a}:e)})),i(t)},setSection:(t,a)=>{e(e=>({views:e.views.map(e=>e.id===t?{...e,section:a?.trim()||I}:e)})),i(t)},remove:i=>{let a,o=t().views.find(e=>e.id===i)?.serverId;e(e=>({views:e.views.filter(e=>e.id!==i)})),o&&(a=o,b.apiClient.delete(`/views/${a}`).then(e=>e.data)).catch(()=>{})},toggleSectionCollapsed:t=>e(e=>({collapsedSections:e.collapsedSections.includes(t)?e.collapsedSections.filter(e=>e!==t):[...e.collapsedSections,t]})),reorderView:(t,i,o)=>{e(e=>{let a=e.views.find(e=>e.id===t);if(!a)return e;let r=i.trim()||I,n=e.views.filter(e=>e.id!==t),s=n.length,d=0;for(let e=0;e<n.length;e++){if(n[e].section===r){if(d===o){s=e;break}d++}if(d>0&&n[e].section!==r){s=e;break}}let l=[...n];return l.splice(s,0,{...a,section:r}),{views:l}}),a()},applyLayout:i=>{let o=new Map(t().views.map(e=>[e.id,e])),r=i.map(e=>({...e,section:e.section?.trim()||I}));for(let t of(e(()=>({views:r})),r)){if(!t.serverId)continue;let e=o.get(t.id);e&&e.name===t.name&&(e.section||I)===t.section&&JSON.stringify(e.filters)===JSON.stringify(t.filters)&&JSON.stringify(e.sort)===JSON.stringify(t.sort)&&JSON.stringify(e.dashboard)===JSON.stringify(t.dashboard)||k(t.serverId,t).catch(()=>{})}a()},reseed:()=>e({views:C,collapsedSections:[]})}},{name:"offbooks-saved-views",storage:(0,i.createJSONStorage)(()=>localStorage),partialize:e=>({collapsedSections:e.collapsedSections}),version:11,migrate:e=>({collapsedSections:Array.isArray(e?.collapsedSections)?e.collapsedSections:[]})})));e.s(["allSectionNames",0,function(e){let t=new Set;for(let i of e)i.section&&t.add(i.section);return Array.from(t).sort()},"groupViewsBySection",0,function(e){let t=[],i=new Map;for(let a of e){let e=a.section??I;i.has(e)||(i.set(e,[]),t.push(e)),i.get(e).push(a)}return t.map(e=>({section:e,views:i.get(e)}))},"useSavedViewsStore",0,T],86738),e.s(["snapshotDashboard",()=>E,"useInsightsDashboardStore",()=>L],46154);let A=[{id:"overview",label:"Margin & net profit",description:"Headline KPIs across all transactions â cash in, cash out, net, count.",icon:"Gauge",kind:"kpi",vizType:"kpi-strip",defaults:{title:"Overview",span:2}},{id:"cash-flow-trend",label:"Cash flow over time",description:"Cash In vs Cash Out as a stacked area trend.",icon:"ChartLineUp",kind:"timeseries",vizType:"area",dimension:"time",defaults:{title:"Cash flow over time",metric:"amount",timeBucket:"month",seriesBy:"direction",span:2}},{id:"income-by-client-trend",label:"Income by client â over time",description:"A line per client of cash-in across the year.",icon:"ChartLineUp",kind:"timeseries",vizType:"line",dimension:"time",defaults:{title:"Income by client",metric:"amount",timeBucket:"month",seriesBy:"counterparty",direction:"cash-in",counterpartyType:"client",span:1}},{id:"income-by-client",label:"Income by client â share",description:"Cash-in split across clients (donut).",icon:"Handshake",kind:"categorical",vizType:"pie",dimension:"counterparty",defaults:{title:"Income by client",metric:"amount",direction:"cash-in",counterpartyType:"client",span:1}},{id:"team-trend",label:"Team â over time",description:"A line per team member of spend across the year.",icon:"ChartLineUp",kind:"timeseries",vizType:"line",dimension:"time",defaults:{title:"Team",metric:"amount",timeBucket:"month",seriesBy:"counterparty",direction:"cash-out",counterpartyType:"team_member",span:1}},{id:"team-spend",label:"Team â share",description:"Spend split across team members (donut).",icon:"UsersThree",kind:"categorical",vizType:"pie",dimension:"counterparty",defaults:{title:"Team",metric:"amount",direction:"cash-out",counterpartyType:"team_member",span:1}},{id:"contractors-trend",label:"Contractors â over time",description:"A line per contractor of spend across the year.",icon:"ChartLineUp",kind:"timeseries",vizType:"line",dimension:"time",defaults:{title:"Contractors",metric:"amount",timeBucket:"month",seriesBy:"counterparty",direction:"cash-out",customProperty:"cp-vendor-contractor",span:1}},{id:"contractors",label:"Contractors â share",description:"Spend split across contractors (donut).",icon:"Briefcase",kind:"categorical",vizType:"pie",dimension:"counterparty",defaults:{title:"Contractors",metric:"amount",direction:"cash-out",customProperty:"cp-vendor-contractor",span:1}}
1,{id:"saas",label:"SaaS",description:"Spend split across SaaS vendors (donut).",icon:"Cloud",kind:"categorical",vizType:"pie",dimension:"counterparty",defaults:{title:"SaaS",metric:"amount",direction:"cash-out",customProperty:"cp-vendor-saas",span:1}},{id:"utilities",label:"Utilities",description:"Spend split across utility vendors (donut).",icon:"Warehouse",kind:"categorical",vizType:"pie",dimension:"counterparty",defaults:{title:"Utilities",metric:"amount",direction:"cash-out",customProperty:"cp-vendor-utility",span:1}}],P=new Map(A.map(e=>[e.id,e])),O=0;function N(e,t={}){let i=P.get(e);if(!i)return null;let a=i.defaults;return{id:(O+=1,`w-${e}-${O}`),catalogId:i.id,title:a.title,vizType:i.vizType,dimension:i.dimension??"time",metric:a.metric??"amount",timeBucket:a.timeBucket,splitByDirection:a.splitByDirection,seriesBy:a.seriesBy??null,seriesCp:null,groupByCp:a.groupByCp??null,direction:a.direction??null,counterpartyType:a.counterpartyType??null,customProperty:a.customProperty??null,span:a.span??1,...t}}function U(e,t){return N(t,{id:e})}e.s(["WIDGET_CATALOG",0,A,"instantiate",0,N],37662);let R={widgets:[U("w-overview","overview"),U("w-cash-flow","cash-flow-trend"),U("w-income-client-trend","income-by-client-trend"),U("w-income-client","income-by-client"),U("w-team-trend","team-trend"),U("w-team","team-spend"),U("w-contractors-trend","contractors-trend"),U("w-contractors","contractors"),U("w-saas","saas"),U("w-utilities","utilities")]};function B(){return{widgets:R.widgets.map(e=>({...e}))}}e.s(["cloneDefaultDashboard",0,B],72692),e.s(["AnalyticsApi",()=>$],64556),e.i(51383),e.i(78021);let G=new Map;function M(e,t){let i=G.get(e);if(i)return i;let a=t().finally(()=>{G.delete(e)});return G.set(e,a),a}let $={aggregate:e=>M(`aggregate:${JSON.stringify(e)}`,()=>b.apiClient.post("/analytics/aggregate",e).then(e=>e.data)),kpis:(e,t)=>M(`kpis:${e??""}:${JSON.stringify(t??{})}`,()=>b.apiClient.get("/analytics/kpis",{params:{fy:e,from:t?.from??void 0,to:t?.to??void 0,direction:t?.direction??void 0,counterpartyType:t?.counterpartyType??void 0,customProperty:t?.customProperty??void 0,bookedRevenue:t?.bookedRevenue===!1?"false":void 0,committedSpend:t?.committedSpend===!1?"false":void 0}}).then(e=>e.data)),generateWidget:async({prompt:e,fy:t})=>{let{data:i}=await b.apiClient.post("/analytics/generate-widget",{prompt:e,fy:t}),a=i.widget;return{id:`w-gen-${Math.random().toString(36).slice(2,8)}`,catalogId:a.catalogId??"custom",title:a.title,vizType:a.vizType??"area",dimension:a.dimension??"time",metric:a.metric??"amount",timeBucket:a.timeBucket,seriesBy:a.seriesBy??null,seriesCp:a.seriesCp??null,groupByCp:a.groupByCp??null,direction:a.direction??null,counterpartyType:a.counterpartyType??null,customProperty:a.customProperty??null,span:a.span??2}}},x=new Set,L=(0,t.create)()((0,i.devtools)((0,i.persist)(e=>({dashboard:B(),editing:!1,setEditing:t=>e(()=>({editing:t})),addWidget:t=>{let i=N(t);return i?(e(e=>({dashboard:{widgets:[...e.dashboard.widgets,i]}})),i.id):null},upsertWidget:t=>e(e=>({dashboard:{widgets:e.dashboard.widgets.some(e=>e.id===t.id)?e.dashboard.widgets.map(e=>e.id===t.id?t:e):[...e.dashboard.widgets,t]}})),removeWidget:t=>e(e=>({dashboard:{widgets:e.dashboard.widgets.filter(e=>e.id!==t)}})),updateWidget:(t,i)=>e(e=>({dashboard:{widgets:e.dashboard.widgets.map(e=>e.id===t?{...e,...i}:e)}})),reorderWidget:(t,i)=>e(e=>{let a=[...e.dashboard.widgets],o=a.findIndex(e=>e.id===t);if(o<0)return e;let[r]=a.splice(o,1),n=Math.max(0,Math.min(i,a.length));return a.splice(n,0,r),{dashboard:{widgets:a}}}),loadLayout:t=>e(()=>({dashboard:{widgets:t.widgets.map(e=>({...e}))}})),reset:()=>e(()=>({dashboard:B()})),generateFromPrompt:async(t,i)=>{let a=`w-gen-${Math.random().toString(36).slice(2,9)}`;e(e=>({dashboard:{widgets:[{id:a,catalogId:"custom",title:"",vizType:"area",dimension:"time",metric:"amount",timeBucket:"month",span:2,status:"generating",prompt:t},...e.dashboard.widgets]}}));try{let o=await $.generateWidget({prompt:t,fy:i});if(x.has(a))return x.delete(a),null;return e(e=>({dashboard:{widgets:e.dashboard.widgets.map(e=>e.id===a?{...o,id:a,status:"suggested",prompt:t}:e)}})),a}catch{return x.delete(a),e(e=>({dashboard:{widgets:e.dashboard.widgets.filter(e=>e.id!==a)}})),null}},cancelGeneration:t=>{x.add(t),e(e=>({dashboard:{widgets:e.dashboard.widgets.filter(e=>e.id!==t)}}))},acceptSuggestion:t=>e(e=>({dashboard:{widgets:e.dashboard.widgets.map(e=>e.id===t?{...e,status:"committed",prompt:void 0}:e)}})),rejectSuggestion:t=>e(e=>({dashboard:{widgets:e.dashboard.widgets.filter(e=>e.id!==t)}}))}),{name:"offbooks-insights-dashboard",storage:(0,i.createJSONStorage)(()=>localStorage),partialize:e=>({dashboard:{widgets:e.dashboard.widgets.filter(e=>!e.status||"committed"===e.status)}}),version:3,migrate:()=>({dashboard:B()})})));function E(){let{dashboard:e}
1=L.getState();return{widgets:e.widgets.map(e=>({...e}))}}e.i(31730);let J=(0,t.create)()((0,i.devtools)((0,i.persist)(e=>({mode:"off",toggle:()=>e(e=>({mode:"on"===e.mode?"off":"on"})),setMode:t=>e({mode:t})}),{name:"offbooks-view-mode",storage:(0,i.createJSONStorage)(()=>localStorage)}),{name:"ViewModeStore"}));e.s(["useViewModeStore",0,J],42863);let z=(0,t.create)()((0,i.devtools)((0,i.persist)(e=>({bookedRevenue:!0,committedSpend:!0,toggleBookedRevenue:()=>e(e=>({bookedRevenue:!e.bookedRevenue})),toggleCommittedSpend:()=>e(e=>({committedSpend:!e.committedSpend})),setBookedRevenue:t=>e({bookedRevenue:t}),setCommittedSpend:t=>e({committedSpend:t})}),{name:"offbooks-accrual-overlay",version:1,storage:(0,i.createJSONStorage)(()=>localStorage)}),{name:"AccrualOverlayStore"}));e.s(["useAccrualOverlayStore",0,z],38712);let _=(0,t.create)()((0,i.devtools)(e=>({scope:null,setScope:t=>e({scope:t}),clearScope:()=>e({scope:null})}),{name:"SidebarVitalsStore"}));e.s(["useSidebarVitalsStore",0,_],25621);let W=(0,t.create)()((0,i.devtools)(e=>({active:!1,sidebarHidden:!1,goalValue:0,currency:"USD",sourceRect:null,data:null,start:t=>e({active:!0,sidebarHidden:!0,...t}),setData:t=>e({data:t}),endOverlay:()=>e({active:!1,sourceRect:null,data:null}),revealSidebar:()=>e({sidebarHidden:!1})}),{name:"GoalLaunchStore"}));e.s(["useGoalLaunchStore",0,W],66061);let F=(0,t.create)()((0,i.devtools)(e=>({refreshSeq:0,bumpRefresh:()=>e(e=>({refreshSeq:e.refreshSeq+1}))}),{name:"OffbooksRefreshStore"}));e.s(["useOffbooksRefreshStore",0,F],23381);let Z={async state(){let{data:e}=await b.apiClient.get("/onboarding/tours/state");return e.toursSeen??[]},async markSeen(e){let{data:t}=await b.apiClient.post(`/onboarding/tours/${encodeURIComponent(e)}/seen`);return t.toursSeen??[]}},V={"offbooks-switch":{id:"offbooks-switch",steps:[{anchor:'[data-tour-anchor="view-switch"]',title:"This is your switch",body:"Flip it to get into the books. Flip it back anytime to stay off the books and on your business.",side:"right",align:"start",dismissOn:"view-mode-change",cta:"Got it"}]}},Y=(0,t.create)()((0,i.devtools)((e,t)=>({activeTour:null,stepIndex:0,seenTours:[],hydrated:!1,async hydrate(){if(!t().hydrated)try{let t=await Z.state();e({seenTours:t,hydrated:!0})}catch{e({hydrated:!0})}},start(i){let a=t();if(a.activeTour||a.seenTours.includes(i))return;let o=V[i]??null;o&&0!==o.steps.length&&e({activeTour:o,stepIndex:0})},next(){let{activeTour:i,stepIndex:a}=t();i&&(a+1<i.steps.length?e({stepIndex:a+1}):t().dismiss())},dismiss(){let{activeTour:i,seenTours:a}=t();if(!i)return;let o=i.id;e({activeTour:null,stepIndex:0,seenTours:a.includes(o)?a:[...a,o]}),Z.markSeen(o).catch(()=>{})}}),{name:"TourStore"}));e.s(["useTourStore",0,Y],8433),e.i(31274)}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.