PageSourceSearch

https://www.deta.studio/_next/static/chunks/e3452bc071e5eb52.js

js deta.studio collected 2026-09-24 14:29:45 UTC 300,360 bytes, 20 lines download raw bytes

1(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,148135,e=>{"use strict";let t=(0,e.i(607655).default)("book-open",[["path",{d:"M12 7v14",key:"1akyts"}],["path",{d:"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z",key:"ruj8y"}]]);e.s(["BookOpen",()=>t],148135)},712834,e=>{"use strict";let t=(0,e.i(607655).default)("pen-line",[["path",{d:"M13 21h8",key:"1jsn5i"}],["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"}]]);e.s(["PenLine",()=>t],712834)},637163,630938,481456,e=>{"use strict";var t=e.i(391610),n=e.i(138415),r=e.i(735924),s=e.i(370654);e.i(206609);var l=e.i(835274),a=e.i(561467),o=e.i(903617);let i=e=>"object"==typeof e&&null!==e&&"code"in e&&"23505"===e.code;class d extends Error{problems;constructor(e){super(`Not a valid presets document — ${e.join("; ")}`),this.problems=e,this.name="InvalidBookDocError"}}function c(e){let t=l.BookDocSchema.safeParse(e);if(!t.success)throw new d(t.error.issues.map(e=>e.path.length>0?`${e.path.join(".")}: ${e.message}`:e.message));let n=(0,l.validateBook)(t.data);if(n.length>0)throw new d(n);return t.data}function u(e){if(e instanceof Error)return e.message;if("object"==typeof e&&null!==e&&"message"in e){let t=e.message;if("string"==typeof t&&""!==t)return t}return"That did not save — try again."}function m(e,t){if(!e||!(e.length>0))throw Error(`That template is no longer in this workspace — could not ${t} it. Refresh and try again.`)}let p=e=>({id:e.id,name:e.name,is_default:e.is_default,updated_at:e.updated_at,doc:(0,o.presetSetDoc)(e)});async function h(e,t){let{data:n,error:r}=await e.from("preset_sets").select(a.WORKSPACE_SET_SELECT).eq("account_id",t).is("drawing_set_version_id",null).order("name").limit(200);if(r)throw r;return n.map(p)}async function f(e,t,n,r){c(r);let s=n.trim().slice(0,116)||"Presets";for(let n=0;n<8;n+=1){let a=0===n?s:`${s} ${n+1}`,{data:d,error:c}=await e.from("preset_sets").insert({account_id:t,drawing_set_version_id:null,name:a}).select("id,name,is_default,updated_at").single();if(c){if(!i(c))throw c;continue}let u=await (0,o.applyBookMutation)(e,d.id,(0,l.emptyBook)(),r);if(!u.ok)throw Error(u.reason);return{...p(d),doc:r}}throw Error(`Could not find a free template name near "${s}"`)}async function x(e,t,n){let r=n.trim().slice(0,120),{data:s,error:l}=await e.from("preset_sets").update({name:r}).eq("id",t).is("drawing_set_version_id",null).select("id");if(l)throw i(l)?Error(`This workspace already has a template named "${r}".`):l;m(s,"rename")}async function g(e,t){let{data:n,error:r}=await e.from("preset_sets").delete().eq("id",t).is("drawing_set_version_id",null).select("id");if(r)throw r;m(n,"delete")}async function b(e,t,n){c(n);let{data:r,error:s}=await e.from("preset_sets").select(a.WORKSPACE_SET_SELECT).eq("id",t).is("drawing_set_version_id",null).limit(1);if(s)throw s;m(r,"save over");let l=await (0,o.applyBookMutation)(e,t,(0,o.presetSetDoc)(r[0]),n);if(!l.ok)throw Error(l.reason)}async function y(e,t,n){let r=await e.from("preset_sets").update({is_default:!1}).eq("account_id",t).is("drawing_set_version_id",null).eq("is_default",!0).neq("id",n);if(r.error)throw r.error;let s=await e.from("preset_sets").update({is_default:!0}).eq("account_id",t).is("drawing_set_version_id",null).eq("id",n).select("id");if(s.error)throw s.error;m(s.data,"make default")}e.s(["createWorkspaceBook",()=>f,"deleteWorkspaceBook",()=>g,"fetchWorkspaceBooks",()=>h,"renameWorkspaceBook",()=>x,"setDefaultWorkspaceBook",()=>y,"updateWorkspaceBookDoc",()=>b,"writeErrorMessage",()=>u],630938);var v=e.i(638437),w=e.i(805995),k=e.i(272875),j=e.i(525393),N=e.i(202369),S=e.i(689182),C=e.i(712834),T=e.i(745045),I=e.i(728387),F=e.i(372481),$=e.i(470795),M=e.i(739351),_=e.i(295618),P=e.i(502916),z=e.i(21837);e.i(986406);var L=e.i(41802),E=e.i(518216),D=e.i(887069),R=e.i(7205),O=e.i(963633),A=e.i(206822),B=e.i(703789),K=e.i(308370),V=e.i(424942),q=e.i(558278),U=e.i(383778),H=e.i(486596),W=e.i(687123);e.i(53759);
1var Q=e.i(541048),J=e.i(70052),G=e.i(385823),X=e.i(331570),Y=e.i(898236),Z=e.i(477590),ee=e.i(135772),et=e.i(961347);let en={flag:"a tag carries no value — wearing it is the data",bool:"checkbox tags configure nothing — marks answer true/false",number:`default then unit — ${Z.NUMERIC_INPUT_FORMS}, or "0.24 W/m\xb2K" — Enter applies`,text:"default text — Enter applies",select:'options, comma-separated — "wood, metal, glass" — Enter applies',derived:"what the geometry answers — width, height, area, length or volume — Enter applies"},er={flag:"tag",bool:"checkbox",number:"number",text:"text",select:"select",derived:"derived"};function es(e){return e.replace(/\s+/g," ").trim()}function el({onDefine:e,colSpan:r}){let[s,a]=(0,n.useState)({key:"",type:"flag",editingKey:!1}),o=(0,n.useRef)(null),i=()=>{let t=es(s.key);""!==t&&(e(t,s.type),a({key:"",type:"flag",editingKey:!0}))};return(0,t.jsxs)("tr",{"data-test":"book-add-tag-row",className:"group",children:[(0,t.jsxs)("td",{className:(0,Q.cn)(L.CELL_CLASS,"relative",s.editingKey&&"z-40 overflow-visible"),children:[(0,t.jsxs)("button",{type:"button",className:"text-muted-foreground hover:text-foreground -mx-0.5 flex min-w-0 items-center gap-1.5 rounded px-0.5 text-left font-mono text-[12px]",onClick:()=>a(e=>({...e,editingKey:!0})),title:"Add a tag — type its name, Tab sets the type, Enter defines it","data-test":"book-add-tag-label",children:[(0,t.jsx)(I.Plus,{className:"h-3 w-3 shrink-0"}),(0,t.jsx)("span",{className:"min-w-0 truncate",children:""===s.key?(0,t.jsx)(W.Trans,{i18nKey:"common:book.newTag",defaults:"New tag"}):s.key})]}),s.editingKey?(0,t.jsx)(L.CellEditorFrame,{chars:s.key.length,fontClass:"font-mono text-[12px]",hint:"derived"===s.type?"A derived field is named its dimension — pick one":"Enter defines the tag — Tab sets the type first",children:"derived"===s.type?(0,t.jsxs)("select",{autoFocus:!0,value:(0,Y.derivedSourceForKey)(s.key)??"",onChange:e=>a(t=>({...t,key:e.target.value})),onKeyDown:e=>{"Escape"===e.key?a(e=>({...e,editingKey:!1})):"Enter"===e.key&&(e.preventDefault(),i())},onBlur:()=>a(e=>e.editingKey?{...e,editingKey:!1}:e),className:(0,Q.cn)(L.BARE_INPUT_CLASS,"text-[12px] md:text-[12px]"),"data-test":"book-add-tag-key-dimension",children:[(0,t.jsx)("option",{value:"",disabled:!0,children:"dimension…"}),l.DERIVED_SOURCES.map(e=>(0,t.jsx)("option",{value:e,children:e},e))]}):(0,t.jsx)("input",{autoFocus:!0,value:s.key,onChange:e=>a(t=>({...t,key:e.target.value})),onKeyDown:e=>{if("Escape"===e.key)return void a(e=>({...e,editingKey:!1}));if("Tab"===e.key){e.preventDefault(),a(e=>({...e,editingKey:!1})),o.current?.focus();return}"Enter"===e.key&&(e.preventDefault(),i())},onBlur:()=>a(e=>e.editingKey?{...e,editingKey:!1}:e),className:(0,Q.cn)(L.BARE_INPUT_CLASS,"text-[12px] md:text-[12px]"),"data-test":"book-add-tag-key-input"})}):null]}),(0,t.jsx)("td",{className:L.CELL_CLASS,children:(0,t.jsx)("select",{ref:o,value:s.type,onChange:e=>{let t=e.target.value;(0,Y.isTagType)(t)&&a(e=>({...e,type:t,key:"derived"===t?(0,Y.derivedSourceForKey)(e.key)??"":e.key}))},onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),i())},className:"hover:bg-accent -mx-0.5 w-full cursor-pointer rounded border-0 bg-transparent px-0.5 font-mono text-[12px] outline-none",title:"The new tag's type — Enter defines it","data-test":"book-add-tag-type-select",children:l.TAG_TYPES.map(e=>(0,t.jsx)("option",{value:e,children:er[e]},e))})}),(0,t.jsx)("td",{className:L.CELL_CLASS,colSpan:r-2})]})}function ea({path:e,doc:r,raw:s,writer:a,scope:o="version"}){var i;
1let d,[c,u]=(0,n.useState)("sheet"),[m,p]=(0,n.useState)("presets"),[h,f]=(0,n.useState)({pending:0,error:null,mergeNotice:null,selectedPresetId:null,presetNameDraft:null,deleteArmed:null,confirm:null}),x=h.pending>0,[g,b]=(0,n.useState)(!1),[y,w]=(0,n.useState)(null),k=(0,v.useParams)(),j="string"==typeof k?.account?k.account:null,N=r.doc,C=(e,t,n)=>{f(e=>({...e,pending:e.pending+1,error:null,mergeNotice:null,confirm:null})),a(e,n).then(r=>{if(!r.ok&&r.refusal?.code==="option_drop_strands_marks"){let{tagId:s="",key:l="",oldValue:a=""}=r.refusal,o=r.reason;f(r=>({...r,pending:r.pending-1,confirm:{message:o,retry:()=>C(e,t,{...n,optionDrops:[...n?.optionDrops??[],{tagId:s,key:l,oldValue:a}]})}}));return}f(e=>({...e,pending:e.pending-1,error:r.ok?e.error:r.reason})),r.ok&&t?.()})},T=(0,n.useMemo)(()=>{let e=new Map;for(let t of r.usage.tags){let n=(0,z.normalizeTag)(t.key);""===n||e.has(n)||e.set(n,t)}return e},[r.usage.tags]),$=(0,n.useMemo)(()=>[...N.tags].sort((e,t)=>e.key.localeCompare(t.key)).map(e=>({tag:e,usage:T.get((0,z.normalizeTag)(e.key))??null})),[N.tags,T]),M=(0,n.useMemo)(()=>r.usage.tags.filter(e=>(e.strays??[]).length>0),[r.usage.tags]),_=N.presets.find(e=>e.id===h.selectedPresetId)??N.presets[0]??null,P=[{id:"key",header:(0,t.jsx)(W.Trans,{i18nKey:"common:book.keyHeader",defaults:"Key"}),width:220,fontClass:"font-mono text-[12px]",title:e=>"derived"===e.tag.type?`${e.tag.key} — a derived field is named its dimension; re-point it in the config cell`:`${e.tag.key} — click to rename (marks and table columns follow)`,render:e=>(0,t.jsx)("span",{className:"min-w-0 truncate","data-test":"book-tag-key",children:e.tag.key}),editable:!0,enabledFor:e=>"derived"!==e.tag.type,editDataTest:"book-tag-rename-input",editSeed:e=>e.tag.key,validate:(e,t)=>(0,Y.renameCollision)(N,e.tag.id,t),hint:()=>"Enter renames — marks and table columns follow",commit:(e,t)=>{let n=es(t);""!==n&&n!==e.tag.key&&null===(0,Y.renameCollision)(N,e.tag.id,n)&&C(t=>(0,Y.renameTagInBook)(t,e.tag.id,n))}},{id:"type",header:(0,t.jsx)(W.Trans,{i18nKey:"common:book.typeHeader",defaults:"Type"}),width:90,render:e=>
1(0,t.jsx)("select",{value:e.tag.type,onChange:t=>{let n=t.target.value;(0,Y.isTagType)(n)&&n!==e.tag.type&&C(t=>(0,Y.retypeTagInBook)(t,e.tag.id,n))},className:"hover:bg-accent -mx-0.5 w-full cursor-pointer rounded border-0 bg-transparent px-0.5 font-mono text-[12px] outline-none",title:"tag = presence itself · checkbox = a yes/no answer · number/text = a valued property · select = known options · derived = named by the dimension it reads","data-test":"book-tag-type-select",children:l.TAG_TYPES.map(n=>(0,t.jsx)("option",{value:n,disabled:"derived"===n&&"derived"!==e.tag.type&&null===(0,Y.derivedSourceForKey)(e.tag.key),children:er[n]},n))})},{id:"config",header:(0,t.jsx)(W.Trans,{i18nKey:"common:book.configHeader",defaults:"Default"}),width:200,fontClass:"font-mono text-[12px]",title:e=>eu(e.tag)||void 0,render:e=>{let n=eu(e.tag);return"flag"!==e.tag.type&&"bool"!==e.tag.type?(0,t.jsx)("span",{className:"block min-w-0 truncate text-left","data-test":"book-tag-config",children:""===n?(0,t.jsx)("span",{className:"text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100",children:"+"}):n}):(0,t.jsx)("span",{className:"text-muted-foreground",children:""===n?et.EM_DASH:n})},editable:!0,editDataTest:"book-tag-config-input",enabledFor:e=>"flag"!==e.tag.type&&"bool"!==e.tag.type,editSeed:e=>eu(e.tag),validate:(e,t)=>{if(t===eu(e.tag))return null;let n=(0,Y.parseConfigEdit)(e.tag.type,t);return n.ok?null:n.error},hint:e=>en[e.tag.type],commit:(e,t)=>{let n=(0,Y.parseConfigEdit)(e.tag.type,t.trim());if(!n.ok)return;if("derived"===e.tag.type){let t=n.config.derive;void 0!==t&&C(n=>(0,Y.setTagDeriveInBook)(n,e.tag.id,t));return}let r="select"===e.tag.type?(0,Y.inferOptionRenames)(e.tag.config?.options??[],n.c
1onfig.options??[]):[];C(t=>(0,Y.setTagConfigInBook)(t,e.tag.id,n.config),void 0,r.length>0?{optionRenames:r.map(t=>({tagId:e.tag.id,key:e.tag.key,...t}))}:void 0)}},{id:"marks",header:(0,t.jsx)(W.Trans,{i18nKey:"common:book.marksHeader",defaults:"Marks"}),width:90,...L.NUM_COLUMN,render:e=>{let n=e.usage?.strays??[];return(0,t.jsxs)("span",{className:e.usage?.count?void 0:"text-muted-foreground",title:n.length>0?`${n.map(e=>`${e.count} of these marks spell it "${e.key}"`).join("; ")} — a formula naming "${e.tag.key}" cannot reach them. Rename the field to move them onto one spelling.`:void 0,children:[e.usage?.count??0,n.length>0?(0,t.jsxs)("span",{className:"text-amber-600 dark:text-amber-500","data-test":"book-tag-split",children:[" ","⚠"]}):null]})}},{id:"usedBy",header:(0,t.jsx)(W.Trans,{i18nKey:"common:book.usedByHeader",defaults:"Used by"}),width:280,title:e=>(e.usage?.usedBy??[]).join("\n")||void 0,render:e=>{let n=e.usage?.usedBy??[];return 0===n.length?(0,t.jsx)("span",{className:"text-muted-foreground",children:et.EM_DASH}):(0,t.jsx)("span",{className:"flex min-w-0 items-center gap-1 overflow-hidden","data-test":"book-tag-used-by",children:n.map(e=>(0,t.jsx)("span",{className:"border-border max-w-40 shrink-0 truncate rounded border px-1 font-mono text-[9px]",children:e},e))})}}].filter(e=>"version"===o||!["marks","usedBy"].includes(e.id)),O=(0,D.useSheetEditing)({columns:P,rowKey:e=>e.tag.id}),A=e=>{b(!1),setTimeout(()=>w(e),0)},B=(0,t.jsxs)(U.Popover,{open:g,onOpenChange:b,children:[(0,t.jsx)(U.PopoverTrigger,{asChild:!0,children:(0,t.jsx)(R.Button,{type:"button",variant:"ghost",size:"sm",className:"h-6 w-6 p-0",title:"Book actions","data-test":"book-sheet-menu",children:(0,t.jsx)(S.MoreVertical,{className:"h-3.5 w-3.5"})})}),(0,t.jsxs)(U.PopoverContent,{align:"end",className:"w-64 p-1",children:[j&&"version"===o?(0,t.jsx)("button",{type:"button",className:L.POPOVER_ITEM_CLASS,title:"Keep these presets as a workspace template new drawings can start from",onClick:()=>A("save-template"),"data-test":"book-save-template",children:(0,t.jsx)(W.Trans,{i18nKey:"common:book.templates.saveAs",defaults:"Save as workspace preset template…"})}):null,j&&"version"===o?(0,t.jsx)("button",{type:"button",className:L.POPOVER_ITEM_CLASS,title:"Add a workspace template's presets and fields to this version — nothing here is removed",onClick:()=>A("apply-template"),"data-test":"book-apply-template",children:(0,t.jsx)(W.Trans,{i18nKey:"common:book.templates.applyTo",defaults:"Apply template to this version…"})}):null,(0,t.jsx)("button",{type:"button",className:L.POPOVER_ITEM_CLASS,onClick:()=>{u("sheet"===c?"raw":"sheet"),b(!1)},"data-test":"book-view-toggle",children:"sheet"===c?(0,t.jsx)(W.Trans,{i18nKey:"common:book.viewRaw",defaults:"View raw JSON"}):(0,t.jsx)(W.Trans,{i18nKey:"common:book.viewManager",defaults:"View book"})})]})]}),K=(0,t.jsxs)("div",{className:"absolute top-1.5 right-2 z-30 flex items-center gap-1",children:[x?(0,t.jsx)("span",{className:"text-muted-foreground font-mono text-[9px]","data-test":"book-saving",children:(0,t.jsx)(W.Trans,{i18nKey:"common:book.saving",defaults:"saving…"})}):null,"version"===o||s?B:null,"save-template"===y&&j?(0,t.jsx)(eo,{accountId:j,doc:N,defaultName:(i=e,void 0===(d=(0,ee.drawingFolderOf)(i)?.trim())||""===d?"Presets":d),onClose:()=>w(null)}):null,"apply-template"===y&&j?(0,t.jsx)(ed,{accountId:j,busy:x,onApply:e=>{let t=null;C(n=>{let r=(0,l.mergeBooks)(n,e.doc);return t=function(e,t){let n=[];t.added_presets.length>0&&n.push(ei(t.added_presets.length,"preset")),t.added_tags.length>0&&n.push(ei(t.added_tags.length,"field"));let r=0===n.length?`“${e}” added nothing — this version already has every preset and field it carries.`:`Applied “${e}”: added ${n.join(" and ")}.`,s=Object.entries(t.key_map).filter(([e,t])=>e!==t);if(0===s.length)return r;let l=s.map(([e,t])=>`${e} → ${t}`).join(", ");return`${r} Renamed ${l} — this version already had ${1===s.length?"that field":"those fields"} under a different type, so both are kept.`}(e.name,r),r.book},()=>f(e=>({...e,mergeNotice:t})))},onClose:()=>w(null)}):null]}),V=(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(L.InlineWriteError,{error:h.error}),h.confirm?(0,t.jsxs)("div",{className:"border-border/70 flex shrink-0 items-start gap-2 border-b px-3 py-1.5","data-test":"book-write-confirm",children:[(0,t.jsx)("p",{className:"min-w-0 flex-1 text-[11px] whitespace-pre-wrap",children:h.confirm.message}),(0,t.jsx)("button",{type:"button",className:"text-destructive shrink-0 text-[11px] underline decoration-dotted",onClick:()=>h.confirm?.retry(),"data-test":"book-write-confirm-accept",children:(0,t.jsx)(W.Trans,{i18nKey:"common:book.removeAnyway",defaults:"Remove anyway"})}),(0,t.jsx)("button",{type:"button",className:"text-muted-foreground hover:text-foreground shrink-0 text-[11px] underline decoration-dotted",onClick:()=>f(e=>({...e,confirm:null})),"data-test":"book-write-confirm-cancel",children:(0,t.jsx)(W.Trans,{i18nKey:"common:cancel",defaults:"Cancel"})})]}):null,h.mergeNotice?(0,t.jsxs)("div",{className:"border-border/70 flex shrink-0 items-start gap-2 border-b px-3 py-1.5","data-test":"book-template-receipt",children:[(0,t.jsx)("p",{className:"min-w-0 flex-1 text-[11px] whitespace-pre-wrap",children:h.mergeNotice}),(0,t.jsx)("button",{type:"button",className:"text-muted-foreground hover:text-foreground shrink-0 text-[11px] underline decoration-dotted",onClick:()=>f(e=>({...e,mergeNotice:null})),"data-test":"book-template-receipt-dismiss",children:(0,t.jsx)(W.Trans,{i18nKey:"common:book.templates.dismissReceipt",defaults:"Dismiss"})})]}):null]});return"raw"===c?(0,t.jsxs)("div",{className:"relative flex h-full flex-col",children:[K,(0,t.jsx)("div",{className:"shrink-0 pr-16",children:V}),(0,t.jsx)("div",{className:"min-h-0 flex-1 overflow-auto",children:s})]}):(0,t.jsxs)("div",{className:"relative flex h-full flex-col","data-test":"book-sheet",children:[K,(0,t.jsxs)("div",{className:"border-border flex shrink-0 items-center gap-0.5 border-b px-2 pr-16",role:"tablist",children:[(0,t.jsx)(ec,{active:"presets"===m,count:N.presets.length,onSelect:()=>p("presets"),testId:"book-tab-presets",children:(0,t.jsx)(W.Trans,{i18nKey:"common:book.tabPresets",defaults:"Presets"})}),(0,t.jsx)(ec,{active:"fields"===m,count:N.tags.length,onSelect:()=>p("fields"),testId:"book-tab-fields",children:(0,t.jsx)(W.Trans,{i18nKey:"common:book.tabFields",defaults:"Fields"})})]}),V,"fields"===m?(0,t.jsxs)("div",{className:"min-h-0 flex-1 overflow-auto","data-test":"book-fields",children:[(0,t.jsx)(E.SheetGrid,{columns:P,storageId:`book:${e}`,editing:O,fontClass:"text-[13px]",children:({renderCells:e,colSpan:n})=>(0,t.jsxs)("tbody",{children:[0===$.length?(0,t.jsx)("tr",{children:(0,t.jsx)("td",{colSpan:n,className:"border-border/70 text-muted-foreground border-b px-3 py-3 text-xs whitespace-normal",children:(0,t.jsx)(W.Trans,{i18nKey:"common:book.noTags",defaults:"No fields yet — tag marks in the drawing, or add typed fields here."})})}):null,$.map(n=>(0,t.jsx)(em,{row:n,live:!0,editing:O,renderCells:e,onRemoveDefinition:()=>C(e=>(0,Y.removeTagFromBook)(e,n.tag.id))},n.tag.id)),(0,t.jsx)(el,{colSpan:n,onDefine:(e,t)=>{"derived"===t&&null===(0,Y.derivedSourceForKey)(e)?f(t=>({...t,error:`A derived field is named the dimension it reads — width, height, area, length or volume. "${e}" isn't one of them.`})):null!==(0,Y.defineCollision)(N,e)?f(t=>({...t,error:(0,Y.defineCollision)(N,e)})):C(n=>null===(0,Y.defineCollision)(n,e)?(0,Y.addTagToBook)(n,e,t):null)}})]})}),r.usage.orphans.length>0?(0,t.jsxs)("div",{className:"text-muted-foreground mt-2 px-3 font-mono text-[10px]","data-test":"book-orphans",children:[(0,t.jsx)("span",{className:"font-medium",children:(0,t.jsx)(W.Trans,{i18nKey:"common:book.orphans",defaults:"Orphans"})})," ",(0,t.jsx)(W.Trans,{i18nKey:"common:book.orphansHint",defaults:"— marks carry these, but the presets file does not define them:"})," ",r.usage.orphans.map(e=>`${e.key} (${e.count}
1)`).join(", ")]}):null,M.length>0?(0,t.jsxs)("div",{className:"mt-2 px-3 font-mono text-[10px] text-amber-600 dark:text-amber-500","data-test":"book-split-fields",children:[(0,t.jsx)("span",{className:"font-medium",children:(0,t.jsx)(W.Trans,{i18nKey:"common:book.splitFields",defaults:"Split"})})," ",(0,t.jsx)(W.Trans,{i18nKey:"common:book.splitFieldsHint",defaults:"— marks spell these fields two ways, and a formula reaches only one spelling. Rename the field to move them all onto its key:"})," ",M.map(e=>`${e.key} ← ${e.strays.map(e=>`${e.key} (${e.count})`).join(", ")}`).join("; ")]}):null]}):(0,t.jsxs)("div",{className:"flex min-h-0 flex-1","data-test":"book-presets",children:[(0,t.jsxs)("div",{className:"border-border flex w-56 shrink-0 flex-col border-r",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between px-3 py-2",children:[(0,t.jsx)("span",{className:"text-xs font-medium",children:(0,t.jsx)(W.Trans,{i18nKey:"common:book.presetsTitle",defaults:"Presets"})}),(0,t.jsx)(R.Button,{variant:"ghost",size:"icon",className:"h-6 w-6",title:"New preset","data-test":"book-preset-new",onClick:()=>{let e=null;C(t=>{let n=new Set(t.presets.map(e=>(0,z.normalizeTag)(e.name))),r="New preset",s=2;for(;n.has((0,z.normalizeTag)(r));)r=`New preset ${s++}`;let l=(0,Y.addPresetToBook)(t,r);return e=l.presetId,l.doc},()=>f(t=>({...t,selectedPresetId:e,presetNameDraft:null})))},children:(0,t.jsx)(I.Plus,{className:"h-3.5 w-3.5"})})]}),(0,t.jsx)("div",{className:"min-h-0 flex-1 overflow-y-auto",children:0===N.presets.length?(0,t.jsx)("p",{className:"text-muted-foreground px-3 py-2 text-xs",children:(0,t.jsx)(W.Trans,{i18nKey:"common:book.noPresets",defaults:"No presets yet. Create one — marks pick a preset to carry its tags and wear its style."})}):N.presets.map(e=>(0,t.jsxs)("button",{type:"button","data-test":"book-preset-row",onClick:()=>f(t=>({...t,selectedPresetId:e.id,presetNameDraft:null,deleteArmed:null})),className:(0,Q.cn)("hover:bg-accent flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs transition-colors",_?.id===e.id&&"bg-accent"),children:[(0,t.jsx)("span",{className:"h-2.5 w-2.5 shrink-0 rounded-full border",style:e.style?.stroke?{backgroundColor:e.style.stroke}:void 0}),(0,t.jsx)("span",{className:"min-w-0 flex-1 truncate",children:e.name}),N.default_preset===e.id?(0,t.jsx)(F.Star,{className:"text-muted-foreground h-3 w-3 shrink-0"}):null,(0,t.jsx)("span",{className:"text-muted-foreground shrink-0",children:e.tags.length})]},e.id))})]}),_?(0,t.jsx)(ef,{book:N,preset:_,live:!0,deleteArmed:h.deleteArmed===_.id,nameDraft:h.presetNameDraft,onNameDraft:e=>f(t=>({...t,presetNameDraft:e})),onRename:e=>{let t=es(e),n=""===t||t===_.name,r=n?null:(0,Y.presetNameCollision)(N,_.id,t);f(e=>({...e,presetNameDraft:null,...null===r?{}:{error:r}})),n||null!==r||C(e=>(0,Y.renamePresetInBook)(e,_.id,t))},onStyle:e=>C(t=>(0,Y.setPresetStyleInBook)(t,_.id,e)),run:C,onLocalError:e=>f(t=>({...t,error:e})),onToggleDefaultPreset:()=>C(e=>(0,Y.setDefaultPresetInBook)(e,N.default_preset===_.id?null:_.id)),isDefaultPreset:N.default_preset===_.id,onDelete:()=>{h.deleteArmed!==_.id?f(e=>({...e,deleteArmed:_.id})):(f(e=>({...e,deleteArmed:null,selectedPresetId:null})),C(e=>(0,Y.removePresetFromBook)(e,_.id)))}},_.id):(0,t.jsx)("div",{className:"text-muted-foreground flex flex-1 items-center justify-center p-6 text-xs",children:(0,t.jsx)(W.Trans,{i18nKey:"common:book.selectPreset",defaults:"Select a preset, or create one."})})]})]})}function eo({accountId:e,doc:s,defaultName:l,onClose:a}){let o=(0,P.useSupabase)(),i=(0,r.useQueryClient)(),[d,c]=(0,n.useState)({name:l,makeDefault:!1,error:null}),m=(0,k.useQuery)({queryKey:["workspace-books",e],queryFn:()=>h(o,e),staleTime:3e4}),p=d.name.trim(),x=(m.data??[]).find(e=>(0,z.normalizeTag)(e.name)===(0,z.normalizeTag)(p))??null,g=(0,w.useMutation)({mutationFn:async()=>{if(x){await b(o,x.id,s),d.makeDefault&&!x.is_default&&await y(o,e,x.id);return}let t=await f(o,e,p,s);d.makeDefault&&await y(o,e,t.id)},onSuccess:async()=>{await i.invalidateQueries({queryKey:["workspace-books"]}),a()},onError:e=>{i.invalidateQueries({queryKey:["workspace-books"]}),c(t=>({...t,error:u(e)}))}}),v=""===p||g.isPending||void 0===m.data,j=()=>{v||g.mutate()};return(0,t.jsx)(K.Dialog,{open:!0,onOpenChange:e=>{e||a()},children:(0,t.jsxs)(K.DialogContent,{className:"sm:max-w-md","data-test":"book-save-template-dialog",children:[(0,t.jsxs)(K.DialogHeader,{children:[(0,t.jsx)(K.DialogTitle,{children:(0,t.jsx)(W.Trans,{i18nKey:"common:book.templates.saveTitle",defaults:"Save as workspace preset template"})}),(0,t.jsx)(K.DialogDescription,{children:(0,t.jsx)(W.Trans,{i18nKey:"common:book.templates.saveDescription",defaults:"Keep these presets and fields as a reusable template. New drawings in this workspace start from the default template."})})]}),(0,t.jsxs)("div",{className:"flex flex-col gap-3",children:[(0,t.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,t.jsx)(q.Label,{htmlFor:"book-template-name",children:(0,t.jsx)(W.Trans,{i18nKey:"common:book.templates.nameLabel",defaults:"Template name"})}),(0,t.jsx)(V.Input,{id:"book-template-name",autoFocus:!0,value:d.name,onChange:e=>c(t=>({...t,name:e.target.value,error:null})),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),j())},"data-test":"book-save-template-name"}),m.isError?(0,t.jsxs)("div",{className:"flex flex-col items-start gap-1","data-test":"book-save-template-list-error",children:[(0,t.jsx)("p",{className:"text-destructive text-xs",children:(0,t.jsx)(W.Trans,{i18nKey:"common:book.templates.listFailed",defaults:"Could not read this workspace's templates, so saving is off — it cannot tell a new template from one it should replace."})}),(0,t.jsx)(R.Button,{variant:"ghost",size:"sm",className:"h-6 px-2 text-xs",disabled:m.isFetching,onClick:()=>void m.refetch(),children:(0,t.jsx)(W.Trans,{i18nKey:"common:tryAgain",defaults:"Try again"})})]}):x?(0,t.jsx)("p",{className:"text-muted-foreground text-xs","data-test":"book-save-template-overwrite",children:(0,t.jsx)(W.Trans,{i18nKey:"common:book.templates.overwrite",defaults:"This workspace already has a template with that name — saving replaces its presets."})}):null]}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(O.Checkbox,{id:"book-template-default",checked:d.makeDefault,onCheckedChange:e=>c(t=>({...t,makeDefault:!0===e})),"data-test":"book-save-template-default"}),(0,t.jsx)(q.Label,{htmlFor:"book-template-default",className:"font-normal",children:(0,t.jsx)(W.Trans,{i18nKey:"common:book.templates.makeDefault",defaults:"Make this the workspace default"})})]}),(0,t.jsx)(L.InlineWriteError,{error:d.error})]}),(0,t.jsxs)(K.DialogFooter,{children:[(0,t.jsx)(R.Button,{variant:"ghost",disabled:g.isPending,onClick:a,children:(0,t.jsx)(W.Trans,{i18nKey:"common:cancel",defaults:"Cancel"})}),(0,t.jsx)(R.Button,{disabled:v,onClick:j,"data-test":"book-save-template-submit",children:g.isPending?(0,t.jsx)(W.Trans,{i18nKey:"common:book.saving",defaults:"saving…"}):x?(0,t.jsx)(W.Trans,{i18nKey:"common:book.templates.update",defaults:"Update template"}):(0,t.jsx)(W.Trans,{i18nKey:"common:book.templates.create",defaults:"Save template"})})]})]})})}let ei=(e,t)=>`${e} ${t}${1===e?"":"s"}`;function ed({accountId:e,busy:r,onApply:s,onClose:l}
1){let a=(0,P.useSupabase)(),[o,i]=(0,n.useState)(null),d=(0,k.useQuery)({queryKey:["workspace-books",e],queryFn:()=>h(a,e),staleTime:3e4}),c=(d.data??[]).find(e=>e.id===o)??null;return(0,t.jsx)(K.Dialog,{open:!0,onOpenChange:e=>{e||l()},children:(0,t.jsxs)(K.DialogContent,{className:"sm:max-w-md","data-test":"book-apply-template-dialog",children:[(0,t.jsxs)(K.DialogHeader,{children:[(0,t.jsx)(K.DialogTitle,{children:(0,t.jsx)(W.Trans,{i18nKey:"common:book.templates.applyTitle",defaults:"Apply a workspace preset template"})}),(0,t.jsx)(K.DialogDescription,{children:(0,t.jsx)(W.Trans,{i18nKey:"common:book.templates.applyDescription",defaults:"Adds the template's presets and fields to this version. Nothing here is removed or retyped, and a preset this version already has keeps its own fields."})})]}),(0,t.jsx)("div",{className:"flex max-h-72 flex-col gap-0.5 overflow-y-auto","data-test":"book-apply-template-list",children:d.isPending?(0,t.jsx)("p",{className:"text-muted-foreground text-xs","data-test":"book-apply-template-loading",children:(0,t.jsx)(W.Trans,{i18nKey:"common:book.templates.loading",defaults:"Reading this workspace's templates…"})}):d.isError?(0,t.jsxs)("div",{className:"flex flex-col items-start gap-1","data-test":"book-apply-template-list-error",children:[(0,t.jsx)("p",{className:"text-destructive text-xs",children:(0,t.jsx)(W.Trans,{i18nKey:"common:book.templates.applyListFailed",defaults:"Could not read this workspace's templates. This is a failed read, not an empty workspace — try again."})}),(0,t.jsx)(R.Button,{variant:"ghost",size:"sm",className:"h-6 px-2 text-xs",disabled:d.isFetching,onClick:()=>void d.refetch(),children:(0,t.jsx)(W.Trans,{i18nKey:"common:tryAgain",defaults:"Try again"})})]}):0===d.data.length?(0,t.jsx)("p",{className:"text-muted-foreground text-xs","data-test":"book-apply-template-empty",children:(0,t.jsx)(W.Trans,{i18nKey:"common:book.templates.applyEmpty",defaults:"This workspace has no preset templates yet. Save one from any version's ⋯ menu and it will show up here."})}):d.data.map(e=>(0,t.jsxs)("button",{type:"button",onClick:()=>i(e.id),title:e.is_default?`${e.name} — the workspace default new drawings seed from`:e.name,className:(0,Q.cn)("hover:bg-accent flex w-full items-center gap-2 rounded px-2 py-1.5 text-left text-xs transition-colors",e.id===o&&"bg-accent"),"data-test":"book-apply-template-row","data-selected":e.id===o?"true":void 0,children:[(0,t.jsx)("span",{className:"min-w-0 flex-1 truncate",children:e.name}),e.is_default?(0,t.jsx)(F.Star,{className:"text-muted-foreground h-3 w-3 shrink-0"}):null,(0,t.jsxs)("span",{className:"text-muted-foreground shrink-0 text-[10px]",children:[ei(e.doc.presets.length,"preset")," ·"," ",ei(e.doc.tags.length,"field")]}),e.id===o?(0,t.jsx)(j.Check,{className:"h-3.5 w-3.5 shrink-0"}):null]},e.id))}),(0,t.jsxs)(K.DialogFooter,{children:[(0,t.jsx)(R.Button,{variant:"ghost",onClick:l,children:(0,t.jsx)(W.Trans,{i18nKey:"common:cancel",defaults:"Cancel"})}),(0,t.jsx)(R.Button,{disabled:null===c||r,onClick:()=>{c&&!r&&(s(c),l())},"data-test":"book-apply-template-submit",children:(0,t.jsx)(W.Trans,{i18nKey:"common:book.templates.apply",defaults:"Apply template"})})]})]})})}function ec({active:e,count:n,onSelect:r,testId:s,children:l}){return(0,t.jsxs)("button",{type:"button",role:"tab","aria-selected":e,onClick:r,className:(0,Q.cn)("-mb-px inline-flex items-center gap-1.5 border-b-2 px-2.5 py-1.5 font-mono text-[11px] transition-colors",e?"border-foreground text-foreground":"text-muted-foreground hover:text-foreground border-transparent"),"data-test":s,children:[l,(0,t.jsx)("span",{className:"text-muted-foreground text-[9px] tabular-nums",children:n})]})}function eu(e){return(0,Y.configEditText)({type:e.type,config:e.config??{}})}function em({row:e,live:r,editing:s,renderCells:l,onRemoveDefinition:a}){let{tag:o,usage:i}=e,d=i?.count??0,c=`${d} mark${1===d?"":"s"}`;return(0,t.jsx)(n.Fragment,{children:(0,t.jsxs)(B.ContextMenu,{children:[(0,t.jsx)(B.ContextMenuTrigger,{asChild:!0,disabled:!r,children:(0,t.jsxs)("tr",{className:"group hover:bg-muted/40","data-test":"book-tag-row","data-tag-key":o.key,children:[l(e),(0,t.jsx)("td",{className:L.CELL_CLASS})]})}),(0,t.jsxs)(B.ContextMenuContent,{className:"w-64",onCloseAutoFocus:e=>e.preventDefault(),children:[(0,t.jsxs)(B.ContextMenuItem,{onSelect:()=>s.begin(e,"key"),"data-test":"book-tag-menu-rename",children:[(0,t.jsx)(T.Pencil,{className:"h-3.5 w-3.5"}),(0,t.jsx)(W.Trans,{i18nKey:"common:book.rename",defaults:"Rename"})]}),(0,t.jsxs)(B.ContextMenuItem,{onSelect:a,title:d>0?"Definition only — marks keep the tag (it reports as an orphan)":void 0,"data-test":"book-tag-menu-remove-definition",children:[(0,t.jsx)(M.X,{
1className:"h-3.5 w-3.5"}),d>0?(0,t.jsx)(W.Trans,{i18nKey:"common:book.removeDefinitionInUse",defaults:"Remove definition — tag stays on {{marks}}",values:{marks:c}}):(0,t.jsx)(W.Trans,{i18nKey:"common:book.deleteDefinition",defaults:"Delete definition"})]})]})]})})}let ep=new Map(J.toolGroups.flatMap(e=>e.tools).flatMap(e=>l.PRESET_DEFAULT_TOOLS.includes(e.type)?[[e.type,e]]:[]));function eh({value:e,disabled:r,onChange:s}){let[a,o]=(0,n.useState)(!1),i=e=>{s(e),o(!1)};return(0,t.jsxs)(U.Popover,{open:a,onOpenChange:o,children:[(0,t.jsx)(U.PopoverTrigger,{asChild:!0,children:(0,t.jsxs)("button",{type:"button",disabled:r,className:"border-border hover:bg-accent text-muted-foreground flex h-8 shrink-0 items-center gap-1 rounded-md border px-2 text-xs transition-colors disabled:opacity-50",title:e?`Arming this preset also selects the ${ep.get(e)?.label??e} tool`:"Tool — pick one and arming this preset selects it, so drawing for a cell is one click","data-test":"book-preset-tool-chip",children:[e?ep.get(e)?.icon??(0,t.jsx)(C.PenLine,{className:"h-4 w-4"}):(0,t.jsx)(C.PenLine,{className:"h-4 w-4"}),e?ep.get(e)?.label??e:"No default tool"]})}),(0,t.jsxs)(U.PopoverContent,{align:"start",className:"w-52 p-1","data-test":"book-preset-tool",children:[(0,t.jsxs)("button",{type:"button",className:(0,Q.cn)("hover:bg-accent flex w-full items-center gap-2 rounded px-2 py-1 text-left text-xs",null===e&&"bg-accent"),onClick:()=>i(null),title:"Arming this preset keeps whatever tool is active","data-test":"book-preset-tool-option",children:[(0,t.jsx)("span",{"aria-hidden":!0,className:"w-4 shrink-0"}),"No default tool",null===e?(0,t.jsx)(j.Check,{className:"ml-auto h-3.5 w-3.5"}):null]}),l.PRESET_DEFAULT_TOOLS.map(n=>{let r=ep.get(n);return(0,t.jsxs)("button",{type:"button",className:(0,Q.cn)("hover:bg-accent flex w-full items-center gap-2 rounded px-2 py-1 text-left text-xs",n===e&&"bg-accent"),onClick:()=>i(n),"data-test":"book-preset-tool-option",children:[r?.icon,r?.label??n,n===e?(0,t.jsx)(j.Check,{className:"ml-auto h-3.5 w-3.5"}):null]},n)})]})]})}function ef({book:e,preset:r,live:s,deleteArmed:l,nameDraft:a,isDefaultPreset:o,onNameDraft:i,onRename:d,onStyle:c,onToggleDefaultPreset:u,onDelete:m,run:p,onLocalError:h}){let f=(0,n.useMemo)(()=>new Map(e.tags.map(e=>[e.id,e])),[e.tags]),x=(0,n.useMemo)(()=>{var t;let n,s;return t=r.id,n=[],(s=(t,r,l)=>{let a=e.presets.find(e=>e.id===t);for(let e of a?.includes??[])l.has(e)||(n.push({presetId:e,parentId:t,depth:r}),s(e,r+1,new Set([...l,e])))})(t,0,new Set([t])),n},[e,r.id]),g=(0,n.useMemo)(()=>(0,Y.presetComposition)(e,r.id),[e,r.id]),[b,y]=(0,n.useState)(!1),v=r.style?.stroke_width!=null?String(r.style.stroke_width):"",[w,k]=(0,n.useState)(v),[j,N]=(0,n.useState)(r.style?.opacity??1),S=(0,n.useRef)(null),C=()=>{w!==v&&c({stroke_width:""===w.trim()||0>=Number(w)?null:Number(w)})},T=n=>n.tags.map(r=>{let l=f.get(r);if(!l)return null;let a=(0,Y.fieldProvider)(g,l.key),o=a&&a.id!==n.id?a.name:null;return(0,t.jsx)(ex,{book:e,owner:n,tag:l,live:s,shadowedBy:o,run:p,onLocalError:h},`${n.id}:${r}`)});return(0,t.jsx)("div",{className:"min-h-0 flex-1 overflow-y-auto p-4","data-test":"book-preset-detail",children:(0,t.jsxs)("div",{className:"max-w-xl",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsxs)(U.Popover,{open:b,onOpenChange:e=>{y(e),e||C()},children:[(0,t.jsx)(U.PopoverTrigger,{asChild:!0,children:(0,t.jsx)("button",{type:"button",className:"border-border hover:bg-accent flex h-8 w-10 shrink-0 items-center justify-center rounded-md border transition-colors",title:"Style — stroke, fill, width, opacity","data-test":"book-preset-style-chip",children:(0,t.jsx)("span",{className:(0,Q.cn)("h-4 w-6 rounded-sm",!r.style?.stroke&&"border-border border-2 border-dashed"),style:{...r.style?.fill?{backgroundColor:r.style.fill}:{},...r.style?.stroke?{border:`${Math.min(Math.max(r.style.stroke_width??2,1.5),4)}px solid ${r.style.stroke}`}:{},opacity:r.style?.opacity??1}})})}),(0,t.jsxs)(U.PopoverContent,{align:"start",className:"flex w-72 flex-col gap-2 p-3","data-test":"book-preset-style",children:[(0,t.jsx)("p",{className:"text-muted-foreground
1/70 text-[10px] tracking-wider uppercase",children:(0,t.jsx)(W.Trans,{i18nKey:"common:book.style",defaults:"Style"})}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("span",{className:"text-muted-foreground w-14 text-xs",children:(0,t.jsx)(W.Trans,{i18nKey:"common:book.stroke",defaults:"Stroke"})}),(0,t.jsx)(A.ColorSwatchPicker,{value:r.style?.stroke??void 0,palette:[..._.DEFAULT_MARKUP_PALETTE],onChange:e=>c({stroke:e}),onClear:()=>c({stroke:null}),clearLabel:"No color"})]}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("span",{className:"text-muted-foreground w-14 text-xs",children:(0,t.jsx)(W.Trans,{i18nKey:"common:book.fill",defaults:"Fill"})}),(0,t.jsx)(A.ColorSwatchPicker,{value:r.style?.fill??void 0,palette:[..._.DEFAULT_MARKUP_PALETTE],onChange:e=>c({fill:e}),onClear:()=>c({fill:null}),clearLabel:"No fill"})]}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("span",{className:"text-muted-foreground w-14 text-xs",children:(0,t.jsx)(W.Trans,{i18nKey:"common:book.width",defaults:"Width"})}),(0,t.jsx)("input",{type:"number",min:0,step:.5,value:w,placeholder:"—",disabled:!s,onChange:e=>k(e.target.value),onBlur:C,onKeyDown:e=>{"Enter"===e.key&&e.currentTarget.blur()},className:"border-border h-7 w-20 rounded-md border bg-transparent px-2 text-xs outline-none focus-visible:ring-0","data-test":"book-preset-style-width"}),(0,t.jsx)("span",{className:"text-muted-foreground/60 text-xs",children:"px"})]}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("span",{className:"text-muted-foreground w-14 text-xs",children:(0,t.jsx)(W.Trans,{i18nKey:"common:book.opacity",defaults:"Opacity"})}),(0,t.jsx)("input",{type:"range",min:0,max:1,step:.05,value:j,disabled:!s,onChange:e=>{let t=Number(e.target.value);N(t),S.current&&clearTimeout(S.current),S.current=setTimeout(()=>c({opacity:t}),200)},className:"accent-foreground h-1 w-32","data-test":"book-preset-style-opacity"}),(0,t.jsxs)("span",{className:"text-muted-foreground/60 w-8 text-right text-xs",children:[Math.round(100*j),"%"]})]})]})]}),(0,t.jsx)(eh,{value:r.default_tool??null,disabled:!s,onChange:e=>p(t=>(0,Y.setPresetDefaultToolInBook)(t,r.id,e))}),(0,t.jsx)("input",{value:a??r.name,disabled:!s,onChange:e=>i(e.target.value),onBlur:()=>d(a??r.name),onKeyDown:e=>{"Enter"===e.key&&e.currentTarget.blur(),"Escape"===e.key&&i(null)},"data-test":"book-preset-name",className:"min-w-0 flex-1 rounded-md border px-2 py-1 text-sm font-medium"}),s?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(R.Button,{variant:o?"secondary":"ghost",size:"icon",className:"h-7 w-7",title:"The preset armed by default for new marks","data-test":"book-preset-default-toggle",onClick:u,children:(0,t.jsx)(F.Star,{className:(0,Q.cn)("h-3.5 w-3.5",o&&"fill-current")})}),(0,t.jsx)(R.Button,{variant:"ghost",size:"icon",className:(0,Q.cn)("text-muted-foreground hover:text-destructive h-7 w-7",l&&"text-destructive"),title:l?"Click again to delete — marks keep their values but lose the preset":"Delete preset","data-test":"book-preset-delete",onClick:m,children:(0,t.jsx)($.Trash2,{className:"h-3.5 w-3.5"})})]}):null]}),l?(0,t.jsx)("p",{className:"text-destructive mt-1 text-[10px]",children:(0,t.jsx)(W.Trans,{i18nKey:"common:book.deletePresetConfirm",defaults:"Click delete again to confirm."})}):null,(0,t.jsxs)("div",{className:"mt-5",children:[(0,t.jsx)("span",{className:"text-muted-foreground text-xs",children:(0,t.jsx)(W.Trans,{i18nKey:"common:book.memberTags",defaults:"Fields"})}),(0,t.jsxs)("div",{className:"mt-1.5 flex flex-col gap-0.5",children:[T(r),0===r.tags.length?(0,t.jsx)("p",{className:"text-muted-foreground text-xs",children:(0,t.jsx)(W.Trans,{i18nKey:"common:book.noMemberTags",defaults:"No fields yet — add the tags this kind of mark carries."})}):null,s?(0,t.jsx)(eg,{book:e,target:r,composition:g,run:p,onLocalError:h}):null]})]}),x.map(n=>{let r=e.presets.find(e=>e.id===n.presetId);if(!r)return null;let l=e.presets.find(e=>e.id===n.parentId);return(0,t.jsxs)("div",{className:"border-border/60 mt-3 flex flex-col gap-0.5 border-l pl-2",style:n.depth>0?{marginLeft:10*n.depth}:void 0,"data-test":"book-preset-include",children:[(0,t.jsx)(G.NestedPresetHeader,{name:r.name,parentName:l?.name??null,editable:s,onRename:t=>{let n=(0,Y.presetNameCollision)(e,r.id,t);n?h(n):p(e=>(0,Y.renamePresetInBook)(e,r.id,t))},onUnnest:()=>p(e=>(0,Y.removePresetIncludeInBook)(e,n.parentId,r.id))}),T(r),s?(0,t.jsx)(eg,{book:e,target:r,composition:g,run:p,onLocalError:h}):null]},r.id)})]})})}function ex({book:e,owner:n,tag:r,live:s,shadowedBy:l,run:a,onLocalError:o}){let i="flag"===r.type?"checkbox":r.type,d="select"===r.type?r.config?.options??[]:[],c=n.defaults?.[r.id],u=void 0===c||"boolean"==typeof c?"":String(c);return(0,t.jsxs)("div",{className:(0,Q.cn)("hover:bg-accent/40 group flex items-center gap-1.5 rounded px-1 py-0.5",null!==l&&"opacity-50"),title:null===l?void 0:`${l} provides this field — the viewer edits it there, not here. Remove it from this preset, or leave it as a fallback.`,"data-test":"book-preset-field","data-shadowed":null===l?void 0:"true",children:[(0,t.jsxs)("span",{className:"text-muted-foreground flex w-32 shrink-0 items-center gap-1 truncate font-mono text-[11px]",title:r.key,children:[s?(0,t.jsx)(G.FieldTypeMenu,{fieldKey:r.key,type:i,options:d,derive:"derived"===r.type?r.config?.derive:void 0,onRename:t=>{let n=(0,Y.renameCollision)(e,r.id,t);n?o(n):a(e=>null===(0,Y.renameCollision)(e,r.id,t)?(0,Y.renameTagInBook)(e,r.id,t):null)},onRetype:e=>a(t=>(0,Y.retypeTagInBook)(t,r.id,"checkbox"===e?"flag":e)),onConvertToPreset:()=>a(e=>(0,Y.convertTagToNestedPresetInBook)(e,n.id,r.id)),onRemoveColumn:()=>a(e=>(0,Y.togglePresetTagInBook)(e,n.id,r.id)),onAddOption:e=>a(t=>(0,Y.addSelectOptionInBook)(t,r.id,e)),onRenameOption:(e,t)=>{d.some(n=>n!==e&&n.toLowerCase()===t.trim().toLowerCase())?o(`"${t.trim()}" is already an option.`):a(n=>(0,Y.renameSelectOptionInBook)(n,r.id,e,t),void 0,{optionRenames:[{tagId:r.id,key:r.key,oldValue:e,newValue:t.trim()}]})},onRemoveOption:e=>a(t=>(0,Y.removeSelectOptionInBook)(t,r.id,e)),onSetDerive:t=>{let n=e.tags.find(e=>e.id!==r.id&&(0,z.normalizeTag)(e.key)===t);n?o(`"${n.key}" is already a field — every mark answers ${t} there.`):a(e=>(0,Y.setTagDeriveInBook)(e,r.id,t))}}
1):(0,t.jsx)(G.TypeIcon,{type:i,className:"text-muted-foreground/60"}),(0,t.jsx)("span",{className:"truncate",children:r.key})]}),null!==l&&(0,t.jsxs)("span",{className:"text-muted-foreground/60 shrink-0 text-[10px]",children:["— ",l," provides it"]}),"flag"===r.type||"bool"===r.type?(0,t.jsx)("span",{className:"flex-1"}):"derived"===r.type?(0,t.jsx)("span",{className:"text-muted-foreground flex-1 text-[10px]","data-test":"book-preset-derived",children:(0,t.jsx)(W.Trans,{i18nKey:"common:book.fromGeometry",defaults:"From geometry"})}):"select"===r.type?s?(0,t.jsx)(G.SelectValueCombobox,{value:""===u?void 0:u,options:d,placeholder:"default…",testId:"book-preset-default-select",onPick:e=>a(t=>{let s=null===e||d.includes(e)?t:(0,Y.addSelectOptionInBook)(t,r.id,e)??t;return(0,Y.setPresetDefaultInBook)(s,n.id,r.id,e)}),onAddOption:()=>{}}):(0,t.jsx)("span",{className:"text-muted-foreground truncate text-[10px]",children:""===u?et.EM_DASH:u}):(0,t.jsx)(eb,{tag:r,value:c,disabled:!s,onCommit:e=>a(t=>(0,Y.setPresetDefaultInBook)(t,n.id,r.id,e))},`${n.id}:${r.id}:${u}`)]})}function eg({book:e,target:r,composition:s,run:a,onLocalError:o}){let[i,d]=(0,n.useState)({open:!1,name:"",type:"checkbox",typePicked:!1}),c=(0,n.useMemo)(()=>e.tags.map(e=>e.key),[e.tags]),u=(0,n.useMemo)(()=>{let t=new Map;for(let n of e.tags){let e=(0,Y.fieldKeyBlocker)(s,r.id,n.key);e&&t.set(n.key,e.note)}return t},[e.tags,s,r.id]),m=(0,z.normalizeTag)(i.name),p=""===m?null:e.tags.find(e=>(0,z.normalizeTag)(e.key)===m)??null,h=null===p?null:{key:p.key,type:"flag"===p.type?"checkbox":p.type},f=i.typePicked||"preset"===i.type?i.type:h?.type??i.type,x=e.presets.filter(t=>null===(0,Y.nestBlocker)(e,s,r.id,t.id)),g=()=>d({open:!1,name:"",type:"checkbox",typePicked:!1}),b=()=>{let t=es(i.name);if(""===t||"preset"===f)return;let n="checkbox"===f?"flag":f,l=(0,Y.fieldKeyBlocker)(s,r.id,t)??(0,Y.fieldTypeBlocker)(e,t,n);l?o(l.message):(a(e=>(0,Y.addFieldToPresetInBook)(e,r.id,t,n)),g())};return i.open?(0,t.jsxs)("span",{className:"flex items-center gap-1",children:["preset"===f?x.length>0?(0,t.jsxs)(H.Select,{value:"",onValueChange:e=>{a(t=>(0,Y.addPresetIncludeInBook)(t,r.id,e)),g()},children:[(0,t.jsx)(H.SelectTrigger,{className:"h-6 w-40 text-xs","data-test":"book-preset-add-include",children:(0,t.jsx)(H.SelectValue,{placeholder:"Nest a preset…"})}),(0,t.jsx)(H.SelectContent,{children:x.map(e=>(0,t.jsx)(H.SelectItem,{value:e.id,className:"text-xs",children:e.name},e.id))})]}):(0,t.jsx)("span",{className:"text-muted-foreground text-[10px]",children:"No other presets to nest."}):"derived"===f?(0,t.jsxs)(H.Select,{value:"",onValueChange:e=>{a(t=>(0,Y.addFieldToPresetInBook)(t,r.id,e,"derived")),g()},children:[(0,t.jsx)(H.SelectTrigger,{className:(0,Q.cn)("h-6 w-40 gap-1 px-1.5",G.SMALL_INPUT),title:"A derived field is named the dimension it reads off each mark's geometry","data-test":"book-preset-add-derived",children:(0,t.jsx)(H.SelectValue,{placeholder:"dimension…"})}),(0,t.jsx)(H.SelectContent,{children:l.DERIVED_SOURCES.map(e=>(0,t.jsx)(H.SelectItem,{value:e,className:"text-xs capitalize",children:e},e))})]}):(0,t.jsx)(X.TagSuggestInput,{autoFocus:!0,value:i.name,options:c,notes:u,placeholder:"field…",className:"w-40",inputClassName:G.SMALL_INPUT,"data-test":"book-preset-add-field-input",onChange:e=>d(t=>({...t,name:e})),onKeyDown:e=>{"Escape"===e.key&&g(),"Enter"===e.key&&b()}}),(0,t.jsxs)(H.Select,{value:f,onValueChange:e=>d(t=>({...t,type:e,typePicked:!0})),children:[(0,t.jsx)(H.SelectTrigger,{className:(0,Q.cn)("h-6 w-auto gap-1 px-1.5",G.SMALL_INPUT),title:(0,G.addFieldTypeHint)(h,f),"data-test":"book-preset-add-field-type",children:"preset"===f?(0,t.jsx)(N.Layers,{className:"h-3 w-3 shrink-0"}):(0,t.jsx)(G.TypeIcon,{type:f})}),(0,t.jsxs)(H.SelectContent,{children:[G.FIELD_TYPE_ORDER.map(e=>(0,t.jsx)(H.SelectItem,{value:e,children:(0,t.jsxs)("span",{className:"flex items-center gap-1.5",children:[(0,t.jsx)(G.TypeIcon,{type:e}),G.TYPE_META[e].label]})},e)),(0,t.jsx)(H.SelectItem,{value:"preset",children:(0,t.jsxs)("span",{className:"flex items-center gap-1.5",children:[(0,t.jsx)(N.Layers,{className:"h-3 w-3 shrink-0"}),"Preset"]})})]})]}),"preset"!==f&&"derived"!==f&&(0,t.jsx)("button",{type:"button",className:"text-muted-foreground hover:text-foreground inline-flex h-6 w-6 shrink-0 items-center justify-center rounded","data-test":"book-preset-add-field-confirm",onClick:b,children:(0,t.jsx)(j.Check,{className:"h-3.5 w-3.5"})}),(0,t.jsx)("button",{type:"button",className:"text-muted-foreground
1/60 hover:text-foreground inline-flex h-6 w-6 shrink-0 items-center justify-center rounded",title:"Close","data-test":"book-preset-add-field-close",onClick:g,children:(0,t.jsx)(M.X,{className:"h-3 w-3"})})]}):(0,t.jsxs)("button",{type:"button",className:"text-muted-foreground/60 hover:text-muted-foreground inline-flex h-5 w-fit items-center gap-0.5 text-[10px] transition-colors","data-test":"book-preset-add-field",onClick:()=>d({open:!0,name:"",type:"checkbox",typePicked:!1}),children:[(0,t.jsx)(I.Plus,{className:"h-2.5 w-2.5 shrink-0"}),"Add field"]})}function eb({tag:e,value:r,disabled:s,onCommit:l}){let a=void 0===r||"boolean"==typeof r?"":String(r),[o,i]=(0,n.useState)(a);return(0,t.jsx)("input",{value:o,disabled:s,placeholder:"default…",inputMode:"number"===e.type?"decimal":void 0,onChange:e=>i(e.target.value),onKeyDown:e=>{"Enter"===e.key&&e.currentTarget.blur(),"Escape"===e.key&&i(a)},onBlur:()=>{if(o===a)return;let t=o.trim();""===t?l(null):"number"===e.type?l((0,Z.parseNumericInput)(t)):l(t)},className:(0,Q.cn)("border-border h-5 min-w-0 flex-1 rounded border bg-transparent px-1.5 outline-none focus-visible:ring-0",G.SMALL_INPUT),"data-test":"book-preset-default-input"})}function ey({accountId:e,book:l}){let a=(0,s.useInstructionRequest)(),o=(0,r.useQueryClient)(),i=(0,n.useRef)(Promise.resolve()),d=["workspace-books",e];return(0,t.jsx)(ea,{path:`preset-template:${l.id}`,scope:"template",doc:{doc:l.doc,usage:{tags:[],orphans:[]}},writer:t=>{let n=i.current.then(async()=>{try{let n=o.getQueryData(d)?.find(e=>e.id===l.id);if(!n)throw Error("This preset template is unavailable.");let r=t(structuredClone(n.doc));if(!r)return{ok:!0,doc:n.doc};let s=await a(`/api/accounts/${e}/preset-templates`,{action:"update",id:l.id,previous:n.doc,next:r});return o.setQueryData(d,e=>e?.map(e=>e.id===s.id?s:e)),{ok:!0,doc:s.doc}}catch(e){return await o.invalidateQueries({queryKey:d}),{ok:!1,reason:u(e)}}});return i.current=n.then(()=>void 0),n}})}e.s(["BookSheet",()=>ea],481456),e.s(["WorkspaceBookEditor",()=>ey],637163)},475485,e=>{"use strict";let t=(0,e.i(607655).default)("layout-template",[["rect",{width:"18",height:"7",x:"3",y:"3",rx:"1",key:"f1a2em"}],["rect",{width:"9",height:"7",x:"3",y:"14",rx:"1",key:"jqznyg"}],["rect",{width:"5",height:"7",x:"16",y:"14",rx:"1",key:"q5h2i8"}]]);e.s(["LayoutTemplate",()=>t],475485)},206350,e=>{"use strict";var t=e.i(138415),n=e.i(272875),r=e.i(735924),s=e.i(502916),l=e.i(802230);let a=e=>["drawing-reveal",e],o=(e,t)=>e.name.localeCompare(t.name);function i(e,i){let d=(0,s.useSupabase)(),c=(0,r.useQueryClient)();return(0,l.useVersionTreeUpdates)((0,t.useCallback)(()=>{c.invalidateQueries({queryKey:a(e)})},[e,c])),(0,n.useQuery)({queryKey:a(e),enabled:i,queryFn:async()=>{let{data:t,error:n}=await d.from("drawing_sets").select("drawing_set_versions(id, version_number, workbooks(id, name), tables(id, name, workbook_id))").eq("id",e).single();if(n)throw n;return t.drawing_set_versions.map(e=>{let t=e.workbooks.map(e=>({id:e.id,name:e.name,tables:[]})).sort(o),n=new Map(t.map(e=>[e.id,e]));for(let t of e.tables){let e=n.get(t.workbook_id);e&&e.tables.push({id:t.id,name:t.name,workbook:e.name})}for(let e of t)e.tables.sort(o);return{id:e.id,versionNumber:e.version_number,workbooks:t}}).sort((e,t)=>e.versionNumber-t.versionNumber)}})}e.s(["useDrawingRevealTree",()=>i],206350)},568071,e=>{"use strict";function t(e,t){let n,r=new Set(e.rows.map(e=>e.id)),s=(n=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,""),/^[a-z0-9]/.test(n)?n:`row-${n||"new"}`);if(!r.has(s))return s;for(let e=2;;e+=1){let t=`${s}-${e}`;if(!r.has(t))return t}}function n(e,t){let n=e[t]?.section??null,r=[];for(let s=t;s<e.length&&(e[s].section??null)===n;s+=1)r.push(e[s]);return r}function r(e,t){let n=new Map,r=0;for(let s of e){let e=s.section??null;null!==e&&t[e]||(n.set(s.id,r%2==1),r+=1)}return n}function s(e){let t=new Set(e.rows.map(e=>e.section??""));if(!t.has("New section"))return"New section";for(let e=2;;e+=1){let n=`New section ${e}`;if(!t.has(n))return n}}function l(e,t,n){let r=n.trim();if(r===t)return null;let s=!1,l=e.rows.map(e=>{if(e.section!==t)return e;s=!0;let{section:n,...l}=e;return""===r?l:{...l,section:r}});return s?{...e,rows:l,...function(e,t,n){let r=e.sections??[],s=r.find(e=>e.name===t);if(!s)return{};let l=r.filter(e=>e.name!==t&&e.name!==n),a=""===n?l:[...l,{...s,name:n}];return a.length>0?{sections:a}:{sections:void 0}}(e,t,r)}:null}function a(e,t,n){let r=e.sections??[],s=r.filter(e=>e.name!==t),l=r.find(e=>e.name===t),a=n??[];if(0===a.length&&l?.markups===void 0)return null;let o=0===a.length?s:[...s,{...l??{name:t},markups:a}];return{...e,...o.length>0?{sections:o}:{sections:void 0}}}function o(e,t){let n=t??[];return 0===n.length&&void 0===e.markups?null:0===n.length?{...e,markups:void 0}:{...e,markups:n}}function i(e,t){return null===t?e.markups??[]:e.sections?.find(e=>e.name===t)?.markups??[]}function d(e,t,n){let r=[...i(e,t),n];return null===t?o(e,r):a(e,t,r)}function c(e,t,n,r){let s=i(e,t),l=s[n];if(!l)return null;let d={...l,...r};void 0!==r.pct&&delete d.amount,void 0!==r.amount&&delete d.pct;let c=s.map((e,t)=>t===n?d:e);return null===t?o(e,c):a(e,t,c)}function u(e,t,n){let r=i(e,t);if(void 0===r[n])return null;let s=r.filter((e,t)=>
1t!==n);return null===t?o(e,s):a(e,t,s)}function m(e,t,n,r){let s=i(e,t),l=s[n];if(!l||n===r||r<0||r>=s.length)return null;let d=s.filter((e,t)=>t!==n);return d.splice(r,0,l),null===t?o(e,d):a(e,t,d)}e.i(206609),e.i(772771);let p=0;function h(){return p+=1,`line-${Date.now().toString(36)}-${p.toString(36)}`}function f(e,t){return e.rows.some(e=>e.id===t.id)?e:{...e,rows:[...e.rows,t]}}function x(e,t,n){let r=e.rows.findIndex(e=>e.id===t);return -1===r?{...e,rows:[...e.rows,n]}:{...e,rows:[...e.rows.slice(0,r),n,...e.rows.slice(r)]}}function g(e,t,n){let r=null===t?-1:e.rows.findIndex(e=>e.id===t);return -1===r?{...e,rows:[...e.rows,n]}:{...e,rows:[...e.rows.slice(0,r+1),n,...e.rows.slice(r+1)]}}function b(e,n,r){let s=e.rows.find(e=>e.id===n);if(!s)return null;let l={...s,id:r??t(e,s.id)};return g(e,n,l)}function y(e,t){let n=e.rows.filter(e=>e.id!==t);return n.length===e.rows.length?null:{...e,rows:n}}function v(e,t){let n=new Set(t),r=e.rows.filter(e=>!n.has(e.id));return r.length===e.rows.length?null:{...e,rows:r}}function w(e,t,n){let r=e.rows.findIndex(e=>e.id===t);if(-1===r)return null;let s={...e.rows[r]};return null===n?delete s.section:s.section=n,{...e,rows:[...e.rows.slice(0,r),s,...e.rows.slice(r+1)]}}function k(e,t){if((e.section??null)===t)return e;let{section:n,...r}=e;return null===t?r:{...r,section:t}}function j(e,t,n){let r=e.rows.find(e=>e.id===t);if(!r||t===n)return null;let s=e.rows.filter(e=>e.id!==t),l=null===n?s.length:s.findIndex(e=>e.id===n);if(-1===l||[...s.slice(0,l),r,...s.slice(l)].every((t,n)=>t===e.rows[n]))return null;let a=null===n?s[s.length-1]:s[l],o=a?.section??null;return{...e,rows:[...s.slice(0,l),k(r,o),...s.slice(l)]}}function N(e,t,n){let r=new Set(t);if(null!==n&&r.has(n))return null;let s=e.rows.filter(e=>r.has(e.id));if(0===s.length)return null;let l=e.rows.filter(e=>!r.has(e.id)),a=null===n?l.length:l.findIndex(e=>e.id===n);if(-1===a||[...l.slice(0,a),...s,...l.slice(a)].every((t,n)=>t===e.rows[n]))return null;let o=null===n?l[l.length-1]:l[a],i=o?.section??null,d=s.map(e=>k(e,i));return{...e,rows:[...l.slice(0,a),...d,...l.slice(a)]}}function S(e,t,n){let r=new Set(t);if(null!==n&&r.has(n))return null;let s=e.rows.filter(e=>r.has(e.id));if(0===s.length)return null;let l=e.rows.filter(e=>!r.has(e.id)),a=null===n?l.length:l.findIndex(e=>e.id===n);if(-1===a)return null;let o=[...l.slice(0,a),...s,...l.slice(a)];return o.every((t,n)=>t===e.rows[n])?null:{...e,rows:o}}function C(e,t,n){let r=e.rows.find(e=>e.id===t);if(!r||n===(r.section??null))return null;if(null===n)return w(e,t,null);let s=e.rows.filter(e=>e.id!==t),l=-1;for(let e=s.length-1;e>=0;e-=1)if(s[e].section===n){l=e+1;break}return -1===l?w(e,t,n):{...e,rows:[...s.slice(0,l),k(r,n),...s.slice(l)]}}function T(e,t,n){let r=new Set(t);if(null===n){let t=!1,n=e.rows.map(e=>{if(!r.has(e.id)||void 0===e.section)return e;t=!0;let{section:n,...s}=e;return s});return t?{...e,rows:n}:null}let s=e.rows.filter(e=>r.has(e.id));if(0===s.length)return null;let l=e.rows.filter(e=>!r.has(e.id)),a=l.length;for(let e=l.length-1;e>=0;e-=1)if(l[e].section===n){a=e+1;break}let o=s.map(e=>k(e,n)),i=[...l.slice(0,a),...o,...l.slice(a)];return i.every((t,n)=>t===e.rows[n])?null:{...e,rows:i}}function I(e,t,n,r){let s=e.rows.findIndex(e=>e.id===t);if(-1===s)return null;let l=e.rows[s],a={...l.values??{}},o=!1;null===r?n in a&&(delete a[n],o=!0):a[n]!==r&&(a[n]=r,o=!0);let i=function(e,t){let n=e.fan_overrides;if(!n)return null;let r=!1,s={};for(let[e,l]of Object.entries(n)){if(l.values?.[t]===void 0){s[e]=l;continue}r=!0;let n={...l.values};delete n[t],s[e]={...l,values:n}}return r?s:null}(l,n);if(!o&&null===i)return null;let d=null===i?{...l}:L(l,i);return Object.keys(a).length>0?d.values=a:delete d.values,{...e,rows:[...e.rows.slice(0,s),d,...e.rows.slice(s+1)]}}function F(e,t,n,r){let s=e.rows.findIndex(e=>e.id===t);if(-1===s)return null;let l=e.rows[s],a={...l.measures??{}};if(null===r){if(!(n in a))return null;delete a[n]}else a[n]=r;let o={...l};return Object.keys(a).length>0?o.measures=a:delete o.measures,{...e,rows:[...e.rows.slice(0,s),o,...e.rows.slice(s+1)]}}function $(e,t,n,r){let s=e.rows.findIndex(e=>e.id===t);if(-1===s)return null;let l=e.rows[s],a={...l.branch_scopes??{}};if(null===r||0===r.length){if(!(n in a))return null;delete a[n]}else a[n]=[...r];let o={...l};return Object.keys(a).length>0?o.branch_scopes=a:delete o.branch_scopes,{...e,rows:[...e.rows.slice(0,s),o,...e.rows.slice(s+1)]}}function M(e,t,n,r){let s=e.rows.findIndex(e=>e.id===t);if(-1===s)return null;let l=e.rows[s],a=r?.trim()??"",o={...l.units??{}};if(""===a){if(!(n in o))return null;delete o[n]}else{if(o[n]===a)return null;o[n]=a.slice(0,16)}let i={...l};return Object.keys(o).length>0?i.units=o:delete i.units,{...e,rows:[...e.rows.slice(0,s),i,...e.rows.slice(s+1)]}}function _(e,t){let n=e.branches;if(null===t||0===t.length){if(void 0===n)return null;let{branches:t,...r}=e;return r}return{...e,branches:[...t]}}function P(e,t,n,r){let s=e.rows.findIndex(e=>e.id===t);if(-1===s)return null;let l=e.rows[s],a={...l.links??{}},o=!1;null===r?n in a&&(delete a[n],o=!0):a[n]!==r&&(a[n]=r,o=!0);let i=function(e,t){let n=e.fan_overrides;if(!n)return null;let r=!1,s={};for(let[e,l]of Object.entries(n)){if(l.links?.[t]===void 0){s[e]=l;continue}r=!0;let n={...l.links};delete n[t],s[e]={...l,links:n}}return r?s:null}(l,n);if(!o&&null===i)return null;let d=null===i?{...l}:L(l,i);return Object.keys(a).length>0?d.links=a:delete d.links,{...e,rows:[...e.rows.slice(0,s),d,...e.rows.slice(s+1)]}}function z(e,t,n,r){let s=P(e,t,n,null);return I(s??e,t,r,null)??s}function L(e,t){let n={};for(let[e,r]of Object.entries(t)){let t={};r.values&&Object.keys(r.values).length>0&&(t.values=r.values),r.links&&Object.keys(r.links).length>0&&(t.links=r.links),Object.keys(t).length>0&&(n[e]=t)}let r={...e};return Object.keys(n).length>0?r.fan_overrides=n:delete r.fan_overrides,r}
1function E(e,t,n,r,s){let l=e.rows.findIndex(e=>e.id===t);if(-1===l)return null;let a=e.rows[l];if(void 0===a.fan)return null;let o=a.fan_overrides?.[n],i={...o?.values??{}};if(null===s){if(void 0===i[r])return null;delete i[r]}else{if(i[r]===s)return null;i[r]=s}let d=L(a,{...a.fan_overrides??{},[n]:{...o,values:i}});return{...e,rows:[...e.rows.slice(0,l),d,...e.rows.slice(l+1)]}}function D(e,t,n,r,s){let l=e.rows.findIndex(e=>e.id===t);if(-1===l)return null;let a=e.rows[l];if(void 0===a.fan)return null;let o=a.fan_overrides?.[n],i={...o?.links??{}};if(null===s){if(void 0===i[r])return null;delete i[r]}else{if(i[r]===s)return null;i[r]=s}let d=L(a,{...a.fan_overrides??{},[n]:{...o,links:i}});return{...e,rows:[...e.rows.slice(0,l),d,...e.rows.slice(l+1)]}}function R(e,t,n,r,s){let l=D(e,t,n,r,null);return E(l??e,t,n,s,null)??l}function O(e){return"number"==typeof e&&Number.isFinite(e)||"string"==typeof e&&""!==e&&e.length<=2e3?e:null}function A(e,t,n,r){if(void 0!==e.frozen)return null;let s=r?.preferItems&&void 0!==n?n:e.resolved?.items??n;if(void 0===s)return null;let l=new Map(s.map(e=>[e.id,e])),a=e.columns.map(e=>e.key),o=[],i=new Set(e.columns.filter(e=>"pointer"===e.kind&&e.unitField).map(e=>e.key)),d=(e,t)=>{let n=O(t?.value);return"number"==typeof n&&t?.unit&&i.has(e)?`${n} ${t.unit}`:n},c=e.rows.map(e=>{let t=l.get(e.id);if(!t)return e;let n=e,r=a.filter(n=>e.values?.[n]===void 0&&null!==O(t.cells[n]?.value));if(r.length>0){let s={...e.values??{}};for(let e of r)s[e]=d(e,t.cells[e]);n={...n,values:s},o.push({row:e.id,keys:r})}if(void 0!==e.fan){let r={...e.fan_overrides??{}},s=!1;for(let n of t.sub_rows??[]){if(n.key.length>200)continue;let t=r[n.key],l=void 0===t,i=a.filter(e=>t?.values?.[e]===void 0&&null!==O(n.cells[e]?.value));if(i.length>0){let e={...t?.values??{}};for(let t of i)e[t]=d(t,n.cells[t]);r[n.key]={...t??{},values:e},s=!0}else l&&(r[n.key]={},s=!0);(l||i.length>0)&&o.push({row:e.id,sub:n.key,keys:i})}s&&(n={...n,fan_overrides:r})}return n}),u=s.filter(e=>e.source).map(e=>({id:e.id,source:e.source,section:e.section,values:Object.fromEntries(Object.entries(e.cells).flatMap(([e,t])=>null===t.value?[]:[[e,t.value]])),units:Object.fromEntries(Object.entries(e.cells).flatMap(([e,t])=>t.unit?[[e,t.unit]]:[]))}));return{...e,rows:c,frozen:{at:t,added:o,...u.length?{linkedRows:u}:{}}}}function B(e){let t=e.frozen;if(void 0===t)return null;let n=new Map;for(let e of t.added){let t=n.get(e.row)??[];t.push(e),n.set(e.row,t)}let r=e.rows.map(e=>{let t=n.get(e.id);if(!t)return e;let r={...e};for(let e of t){if(void 0===e.sub){if(!r.values)continue;let t={...r.values};for(let n of e.keys)delete t[n];Object.keys(t).length>0?r.values=t:delete r.values;continue}let t=r.fan_overrides?.[e.sub];if(!t)continue;let n={...t.values??{}};for(let t of e.keys)delete n[t];let s={...r.fan_overrides},l={...t};Object.keys(n).length>0?l.values=n:delete l.values,Object.keys(l).length>0?s[e.sub]=l:delete s[e.sub],Object.keys(s).length>0?r.fan_overrides=s:delete r.fan_overrides}return r}),{frozen:s,...l}=e;return{...l,rows:r}}function K(e){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,"");return/^[a-z]/.test(t)?t:`col_${t||"new"}`}function V(e,t){if(!e.has(t))return t;let n=2;for(;e.has(`${t}_${n}`);)n+=1;return`${t}_${n}`}function q(e,t,n){var r;let s,l,a=(r=t.key,(l=(s=V(new Set(e.columns.map(e=>e.key)),r))===t.key?t:{...t,key:s}).key===t.key||"pointer"!==l.kind||l.field?l:{...l,field:t.key}),o=null===n?-1:e.columns.findIndex(e=>e.key===n);return -1===o?{...e,columns:[...e.columns,a]}:{...e,columns:[...e.columns.slice(0,o),a,...e.columns.slice(o)]}}function U(e,t){return q(e,t,null)}function H(e,t,n){let r=e.columns.findIndex(e=>e.key===t);return -1===r?null:{...e,columns:[...e.columns.slice(0,r),n,...e.columns.slice(r+1)]}}function W(e,t){let n=e.columns.filter(e=>e.key!==t);if(n.length===e.columns.length)return null;let r=e.rows.map(e=>{let n=void 0!==e.values&&t in e.values,r=void 0!==e.measures&&t in e.measures,s=void 0!==e.branch_scopes&&t in e.branch_scopes,l=void 0!==e.units&&t in e.units;if(!n&&!r&&!s&&!l&&!e.reference)return e;let a={...e};if(e.reference){let n={...e.reference.columns};delete n[t];let r=Object.fromEntries(Object.entries(e.reference.overrides??{}).map(([e,n])=>{let r={...n};for(let e of["values","measures","units","branch_scopes"])if(n[e]){let s={...n[e]};delete s[t],Object.assign(r,{[e]:s})}return[e,r]}));a.reference={...e.reference,columns:n,overrides:r}}if(n){let n={...e.values};delete n[t],Object.keys(n).length>0?a.values=n:delete a.values}if(r){let n={...e.measures};delete n[t],Object.keys(n).length>0?a.measures=n:delete a.measures}if(s){let n={...e.branch_scopes};delete n[t],Object.keys(n).length>0?a.branch_scopes=n:delete a.branch_scopes}if(l){let n={...e.units};delete n[t],Object.keys(n).length>0?a.units=n:delete a.units}return a});return{...e,columns:n,rows:r}}function Q(e,t,n){if(t===n)return null;let r=e.columns.find(e=>e.key===t);if(!r)return null;let s=e.columns.filter(e=>e.key!==t),l=null===n?s.length:s.findIndex(e=>e.key===n);if(-1===l)return null;let a=[...s.slice(0,l),r,...s.slice(l)];return a.every((t,n)=>t===e.columns[n])?null:{...e,columns:a}}function J(e,t,n){let r=e.rows.find(e=>e.id===t);if(!r||JSON.stringify(r.cutting)===JSON.stringify(n))return null;let s={...r};return n?s.cutting=n:delete s.cutting,{...e,rows:e.rows.map(e=>e.id===t?s:e)}}function G(e,t,n){let r=e.rows.findIndex(e=>e.id===t);if(-1===r)return null;let s=e.rows[r];if((s.fan?.by??null)===n)return null;let{fan:l,fan_overrides:a,...o}=s,i=null===n?o:{...o,fan:{by:n},...a?{fan_overrides:a}:{}}
1;return{...e,rows:[...e.rows.slice(0,r),i,...e.rows.slice(r+1)]}}function X(e,t,n){let r=new Set(t),s=!1,l=e.rows.map(e=>{if(!r.has(e.id)||(e.fan?.by??null)===n)return e;s=!0;let{fan:t,fan_overrides:l,...a}=e;return null===n?a:{...a,fan:{by:n},...l?{fan_overrides:l}:{}}});return s?{...e,rows:l}:null}function Y(e,t,n){let r=e.rows.findIndex(e=>e.id===n);if(r<0)return{...e,rows:[...e.rows,t]};let s=e.rows[r],l=e.columns.every(e=>"value"===e.kind&&null==e.default)&&Object.entries(s).every(([e,t])=>"id"===e||"section"===e||void 0===t),a=[...e.rows];return a.splice(r,+!!l,t),{...e,rows:a}}function Z(e,t,n){let r=new Set(e.layout?.hiddenColumns??[]);return n?r.delete(t):r.add(t),{...e,layout:{...e.layout,hiddenColumns:[...r]}}}e.s(["freshKeyFrom",()=>V,"freshRowId",()=>t,"freshSectionName",()=>s,"ladderOf",()=>i,"mintRowId",()=>h,"sectionRunAt",()=>n,"slugifyColumnKey",()=>K,"visibleStripes",()=>r,"withColumnAdded",()=>U,"withColumnInsertedBefore",()=>q,"withColumnRemoved",()=>W,"withColumnReordered",()=>Q,"withColumnReplaced",()=>H,"withColumnVisibility",()=>Z,"withLinkedTableInserted",()=>Y,"withMarkupAdded",()=>d,"withMarkupMoved",()=>m,"withMarkupPatched",()=>c,"withMarkupRemoved",()=>u,"withPointerCleared",()=>z,"withRowBranchScope",()=>$,"withRowCutting",()=>J,"withRowDuplicated",()=>b,"withRowEnsured",()=>f,"withRowFan",()=>G,"withRowInsertedAfter",()=>g,"withRowInsertedBefore",()=>x,"withRowLink",()=>P,"withRowMeasure",()=>F,"withRowMovedBefore",()=>j,"withRowMovedToSection",()=>C,"withRowRemoved",()=>y,"withRowSection",()=>w,"withRowUnit",()=>M,"withRowValue",()=>I,"withRowsFanned",()=>X,"withRowsMovedBefore",()=>N,"withRowsMovedToSection",()=>T,"withRowsRemoved",()=>v,"withSectionMovedBefore",()=>S,"withSectionRenamed",()=>l,"withSubRowLink",()=>D,"withSubRowPointerCleared",()=>R,"withSubRowValue",()=>E,"withTableBranches",()=>_,"withTableFrozen",()=>A,"withTableUnfrozen",()=>B])},523723,e=>{"use strict";let t=(0,e.i(607655).default)("snowflake",[["path",{d:"m10 20-1.25-2.5L6 18",key:"18frcb"}],["path",{d:"M10 4 8.75 6.5 6 6",key:"7mghy3"}],["path",{d:"m14 20 1.25-2.5L18 18",key:"1chtki"}],["path",{d:"m14 4 1.25 2.5L18 6",key:"1b4wsy"}],["path",{d:"m17 21-3-6h-4",key:"15hhxa"}],["path",{d:"m17 3-3 6 1.5 3",key:"11697g"}],["path",{d:"M2 12h6.5L10 9",key:"kv9z4n"}],["path",{d:"m20 10-1.5 2 1.5 2",key:"1swlpi"}],["path",{d:"M22 12h-6.5L14 15",key:"1mxi28"}],["path",{d:"m4 10 1.5 2L4 14",key:"k9enpj"}],["path",{d:"m7 21 3-6-1.5-3",key:"j8hb9u"}],["path",{d:"m7 3 3 6h4",key:"1otusx"}]]);e.s(["Snowflake",()=>t],523723)},171957,443933,e=>{"use strict";e.i(206609);var t=e.i(981449);e.i(835274);var n=e.i(21837),r=e.i(254958);function s(e){let t=[];for(let n of e){let e=t.find(e=>(0,r.sameModelViewPlacement)(e[0],n));e?e.push(n):t.push([n])}return t}function l(e,t){let n=e.find(e=>(0,r.modelViewId)(e)===t);return n?(0,r.modelViewId)(e.find(e=>(0,r.sameModelViewPlacement)(e,n))):t}function a(e){return s(e).map(e=>{let t=e[0],n=e.flatMap(e=>e.region?[e.region]:[]),r=Math.min(...n.map(e=>e.x)),s=Math.min(...n.map(e=>e.y));return{...t,visibility:void 0,memberIds:void 0,cut:e.find(e=>e.cut)?.cut,display:e.find(e=>e.display)?.display,region:n.length===e.length?{x:r,y:s,width:Math.max(...n.map(e=>e.x+e.width))-r,height:Math.max(...n.map(e=>e.y+e.height))-s}:void 0}})}function o(e){let r=new Map(e?.tags.map(e=>[e.id,e])),s=new Map(e?.presets.map(e=>[e.id,e])),l=new Map;for(let e of s.values()){let t=new Map,n=new Set,a=e=>{if(n.has(e))return;n.add(e);let l=s.get(e);if(l){for(let e of l.tags){let n=r.get(e);n&&!t.has(e)&&t.set(e,{tag:n,defaultValue:l.defaults?.[e]})}for(let e of l.includes??[])a(e)}};a(e.id),l.set(e.id,[...t.values()])}return e=>{let r=e.presetId?l.get(e.presetId):void 0;if(!r?.length)return e;let s={...e.properties},a=new Set(e.tags??[]),o=new Set(Object.keys(s).map(n.normalizeTag));for(let{tag:l,defaultValue:i}of r){if("flag"===l.type){a.add(l.key);continue}if(o.has((0,n.normalizeTag)(l.key))||void 0===i||(s[l.key]=i),"derived"===l.type&&l.config?.derive){let n=(0,t.extractDerivedValue)({type:"model-member",sizeInches:e.size,outlineInches:e.outline},l.config.derive,{scale:0,unitSystem:"imperial-fractional",precision:2,areaUnitSystem:"sq-ft",areaPrecision:2});null!==n&&(s[l.key]=n)}}return{...e,tags:[...a],properties:s}}}function i(e){let t=o(e.presetBook),n=e.members.map(t);return{...e,members:n,views:a(e.views)}}e.s(["canonicalModelViewId",()=>l,"combineModelViewScopes",()=>a,"groupModelViews",()=>s],443933),e.s(["createModelMemberResolver",()=>o,"resolveModelViewport",()=>i],171957)},212659,e=>{"use strict";e.i(206609),e.i(635959);var t=e.i(171957);function n(e,t){return`model:${e}:${t}`}function r(e){let r=(0,t.createModelMemberResolver)(e.document.presetBook);return{id:e.document.id,revision:e.revision,book:e.document.presetBook,marks:e.document.members.map(r).map(t=>({id:n(e.document.id,t.id),type:"model-member",page:(e.document.views.find(e=>!e.memberIds||e.memberIds.includes(t.id))??e.document.views[0]).page,label:t.label,tags:t.tags??[],preset
1:t.presetId,sizeInches:t.size,outlineInches:t.outline,origin:"model",properties:{...t.properties,member_id:t.id,model_id:e.document.id,length_ft:Math.max(...t.size)/12}}))}}e.s(["modelMemberRef",()=>n,"modelTableSource",()=>r])},900997,e=>{"use strict";function t(e){return e}e.s(["queryOptions",()=>t])},588843,e=>{"use strict";var t=e.i(393998);e.i(206609);var n=e.i(835274),r=e.i(939301),s=e.i(254958);let l=t.z.number().finite().min(-1e6).max(1e6),a=t.z.number().finite().positive().max(1e6),o=t.z.string().regex(/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,99}$/),i=t.z.tuple([l,l,l]),d=t.z.object({id:o,label:t.z.string().min(1).max(200),tags:t.z.array(t.z.string().min(1).max(200)).max(100).optional(),presetId:t.z.string().min(1).max(200).nullable().optional(),properties:t.z.record(t.z.string().min(1).max(200),t.z.union([t.z.string().max(2e3),t.z.number().finite(),t.z.boolean(),t.z.null()])).optional(),center:i,size:t.z.tuple([a,a,a]),outline:t.z.array(t.z.tuple([l,l])).min(3).max(16).optional(),orientation:t.z.tuple([l,l,l,l]).optional()}).strict(),c=t.z.object({axis:t.z.enum(["x","y","z"]),min:l.optional(),max:l.optional()}).strict(),u=t.z.object({id:o.optional(),label:t.z.string().min(1).max(200).optional(),page:t.z.number().int().min(1).max(1e5),pageSize:t.z.object({width:a,height:a}).strict(),origin:t.z.tuple([l,l]),pointsPerInch:t.z.number().finite().positive().max(1e3),rotation:l,projection:t.z.enum(["plan","front","back","left","right"]).optional(),region:t.z.object({x:l,y:l,width:a,height:a}).strict().optional(),visibility:t.z.object({tags:t.z.array(t.z.string().min(1).max(200)).max(100).optional(),presetIds:t.z.array(t.z.string().min(1).max(200)).max(1e3).optional(),properties:t.z.record(t.z.string().min(1).max(200),t.z.union([t.z.string().max(2e3),t.z.number().finite(),t.z.boolean(),t.z.null()])).optional()}).strict().optional(),cut:c.optional(),display:t.z.object({hidden:t.z.array(o).optional(),isolated:t.z.array(o).nullable().optional()}).strict().optional(),memberIds:t.z.array(o).min(1).max(1e4).optional()}).strict(),m=t.z.object({versionId:t.z.string().uuid(),contentUpdatedAt:t.z.string().nullable()}),p=t.z.union([m.extend({filePath:t.z.string().min(1).max(2e3),sha256:t.z.string().regex(/^[a-f0-9]{64}$/)}).strict(),m.extend({filePath:t.z.null(),sha256:t.z.null()}).strict()]),h=t.z.object({seq:t.z.number().int().min(0),hash:t.z.string().regex(/^[a-f0-9]{64}$/),templateId:t.z.string().uuid().optional(),templateName:t.z.string().min(1).max(200).optional(),templateUpdatedAt:t.z.string().optional(),amendments:t.z.string().max(65536),files:t.z.record(t.z.string().min(1).max(200),t.z.string().max(65536))}).strict(),f=t.z.object({schemaVersion:t.z.literal(1),id:o,label:t.z.string().min(1).max(200),units:t.z.literal("in"),upAxis:t.z.literal("Z"),source:p,presetBook:n.BookDocSchema.optional(),instructions:h.optional(),notes:t.z.array(t.z.object({kind:t.z.enum(["source","assumption","unresolved","change"]),text:t.z.string().min(1).max(2e3),pages:t.z.array(t.z.number().int().positive()).max(100)}).strict()).max(100).optional(),members:t.z.array(d).min(1).max(1e4),views:t.z.array(u).min(1).max(1e3)}).strict().superRefine((e,t)=>{if(e.presetBook)for(let r of(0,n.validateBook)(e.presetBook))t.addIssue({code:"custom",path:["presetBook"],message:r});let r=new Set(e.presetBook?.presets.map(e=>e.id));for(let n of e.members)for(let s of(n.presetId&&!r.has(n.presetId)&&t.addIssue({code:"custom",path:["members"],message:`Unknown preset on ${n.id}. Include the version's presetBook.`}),e.presetBook?.tags??[])){let e=n.properties?.[s.key];null!=e&&"derived"!==s.type&&"flag"!==s.type&&(("number"===s.type?"number"==typeof e:"bool"===s.type?"boolean"==typeof e:"select"===s.type?"string"==typeof e&&(s.config?.options??[]).includes(e):"string"==typeof e)||t.addIssue({code:"custom",path:["members"],message:`Invalid ${s.type} value for ${s.key} on ${n.id}.`}))}new Set(e.members.map(e=>e.id)).size!==e.members.length&&t.addIssue({code:"custom",path:["members"],message:"Member IDs must be unique across the model."}),(new Set(e.views.map(e=>e.id??`page-${e.page}`)).size!==e.views.length||e.views.some(t=>!t.id&&e.views.filter(e=>e.page===t.page).length>1))&&t.addIssue({code:"custom",path:["views"],message:"View IDs must be unique. Multiple placements on a page require explicit IDs."});let l=new Set(e.members.map(e=>e.id));for(let n of e.views){if(n.display){let r=e=>JSON.stringify({hidden:[...e.display?.hidden??[]].sort(),isolated:e.display?.isolated?[...e.display.isolated].sort():null});e.views.some(e=>e.display&&(0,s.sameModelViewPlacement)(n,e)&&r(n)!==r(e))&&t.addIssue({code:"custom",path:["views"],message:"Aligned placements share one display setting. Set display once or use matching defaults."})}for(let e of[n.display?.hidden,n.display?.isolated])e&&(new Set(e).size!==e.length||e.some(e=>!l.has(e)))&&t.addIssue({code:"custom",path:["views"],message:"View display references must be unique and belong to this model."});n.cut&&(void 0===n.cut.min&&void 0===n.cut.max||void 0!==n.cut.min&&void 0!==n.cut.max&&n.cut.min>=n.cut.max)&&t.addIssue({code:"custom",path:["views"],message:"A cut needs a bound, with min less than max."}),n.region&&(n.region.x<0||n.region.y<0||n.region.x+n.region.width>n.pageSize.width||n.region.y+n.region.height>n.pageSize.height)&&t.addIssue({code:"custom",path:["views"],message:"View region must be inside its PDF page."}),(n.memberIds?.some(e=>!l.has(e))||n.memberIds&&new Set(n.memberIds).size!==n.memberIds.length)&&t.addIssue({code:"custom",path:["views"],message:"View member references must be unique and belong to this model."})}
1e.members.forEach((e,n)=>{if(e.outline){let r=e.outline,s=0,l=new Set(r.map(([e,t])=>`${e},${t}`)).size!==r.length;for(let t=0;t<r.length;t++){let[n,a]=r[t],[o,i]=r[(t+1)%r.length];s+=n*i-o*a,(Math.abs(n)>e.size[0]/2+1e-6||Math.abs(a)>e.size[2]/2+1e-6)&&(l=!0)}1e-6>Math.abs(s)&&t.addIssue({code:"custom",path:["members",n,"outline"],message:"Face must have positive area."});for(let e=0;e<r.length;e++){let[t,n]=r[e],[a,o]=r[(e+1)%r.length];r.some(([e,r])=>((a-t)*(r-n)-(o-n)*(e-t))*Math.sign(s)<-1e-6)&&(l=!0)}l&&t.addIssue({code:"custom",path:["members",n,"outline"],message:"Face must be convex, have distinct vertices and stay inside the member bounds."})}e.orientation&&Math.abs(Math.hypot(...e.orientation)-1)>1e-5&&t.addIssue({code:"custom",path:["members",n,"orientation"],message:"Orientation must be a unit quaternion."})})}),x=t.z.object({workbook:t.z.string().regex(/^[a-z0-9][a-z0-9_-]*$/).max(200),expectedSeq:t.z.number().int().min(0),doc:r.TableDocSchema.omit({resolved:!0,model:!0}).superRefine((e,t)=>{for(let n of(0,r.validateTableDoc)(e))t.addIssue({code:"custom",message:n});/^[a-z0-9][a-z0-9_-]*$/.test(e.name)||t.addIssue({code:"custom",message:"Table name must be a slug."})})}).strict();t.z.object({operationId:t.z.string().uuid(),expectedRevision:t.z.number().int().min(0),document:f,takeoff:x.optional(),takeoffs:t.z.array(x).min(1).max(20).optional()}).strict().superRefine((e,t)=>{e.takeoff&&e.takeoffs&&t.addIssue({code:"custom",path:["takeoffs"],message:"Use takeoff or takeoffs, not both."}),e.takeoffs&&new Set(e.takeoffs.map(e=>e.doc.name)).size!==e.takeoffs.length&&t.addIssue({code:"custom",path:["takeoffs"],message:"Linked table names must be unique."})});let g=t.z.object({id:t.z.string().uuid(),drawing_set_version_id:t.z.string().uuid(),revision:t.z.number().int().positive(),operation_id:t.z.string().uuid(),created_at:t.z.string(),document:f,takeoff:x.nullable().optional(),takeoffs:t.z.array(x).nullable().optional()});e.s(["ModelRevisionSchema",0,g,"ModelViewCutSchema",0,c])},403682,83560,87846,e=>{"use strict";var t=e.i(138415),n=e.i(272875),r=e.i(502916);e.i(206609);var s=e.i(635959),l=e.i(212659),a=e.i(900997),o=e.i(393998),i=e.i(939301),d=e.i(588843);let c=i.TableDocSchema.pick({model:!0}).strip();function u(e,t){let n=c.safeParse(e),r=n.success?n.data.model:void 0;return(0,a.queryOptions)({queryKey:["model-table-snapshot",t,r?.revision],enabled:!!r&&!!t,staleTime:3e4,refetchOnWindowFocus:"always",refetchInterval:!!r&&3e4,queryFn:async()=>{let e=await fetch(`/api/drawings/versions/${t}/model?revision=${r.revision}`,{cache:"no-store"});if(!e.ok)throw Error("Could not read the model for this table.");let n=o.z.object({model:d.ModelRevisionSchema.nullable(),sourceChanged:o.z.boolean()}).parse(await e.json());return n.sourceChanged?null:n.model}})}function m(e,r){let s=(0,t.useMemo)(()=>u(e,r),[e,r]),l=(0,n.useQuery)(s);return{data:l.error?null:l.data,isPending:s.enabled&&l.isPending}}function p(){let e=new WeakMap;return(t,n,r)=>{let s=e.get(t);if(s&&s.dependencies.length===n.length&&n.every((e,t)=>Object.is(e,s.dependencies[t])))return s.value;let l=r();return e.set(t,{dependencies:n,value:l}),l}}e.s(["modelTableSnapshotOptions",()=>u,"useModelTableSnapshot",()=>m],83560),e.s(["createWeakMemo",()=>p],87846);var h=e.i(220507),f=e.i(958007),x=e.i(156566),g=e.i(7923),b=e.i(77331);async function y(e,t){let n=n=>e.from("annotations").select(b.PROJECTION_MARK_SELECT).eq("drawing_set_version_id",t).order("id").range(n,n+1e3-1),r=await n(0);if(r.error)throw r.error;let s=r.data??[];if(s.length<1e3)return s;for(let e=1e3;;e+=1e3){let t=await n(e);if(t.error)throw t.error;let r=t.data??[];if(s.push(...r),r.length<1e3)return s}}async function v(e,t){let[n,r,s,l,a]=await Promise.all([y(e,t),e.from("annotation_branches").select(b.PROJECTION_BRANCH_SELECT).eq("drawing_set_version_id",t),e.from("drawing_page_settings").select("page_number,scale,source_version_id").eq("version_id",t),e.from("drawing_set_versions").select("unit_system,precision,area_unit_system,area_precision,drawing_sets(external_file_id)").eq("id",t).single(),(0,f.loadVersionPageManifest)(e,t)]);if(r.error)throw r.error;if(s.error)throw s.error;if(l.error)throw l.error;let o=a?(0,x.marksOnAnyPage)(n.map(e=>({...e,page:e.page_number,manifestEntryId:e.manifest_entry_id})),a.entries,t).map(e=>({...e,displayPage:(0,h.ordinalOfMark)(e,a.entries,t),sheet:(0,g.markSheetKey)(e,e=>a.entries.find(t=>
1t.id===e),t)})):n.map(e=>({...e,displayPage:e.page_number,sheet:String(e.page_number)}));return{marks:o,droppedMarks:n.length-o.length,branches:r.data??[],pageSettings:s.data??[],version:l.data}}let w=p(),k=p(),j=p(),N=p();function S(e){return N(e,[],()=>(0,l.modelTableSource)(e))}function C(e,l){let a=(0,r.useSupabase)(),o=(0,n.useQuery)({queryKey:["table-projection-context",e],enabled:!!e,staleTime:1e4,queryFn:()=>v(a,e)});return{context:(0,t.useMemo)(()=>o.data&&e?w(o.data,[l,e],()=>(function(e,t,n){let{marks:r,branches:l,pageSettings:a,version:o}=e,i=(0,g.pageScalesFromRows)(a,t??""),d=o.drawing_sets,c=d?.external_file_id!=null,u=c||r.some(e=>null===e.branch_id);return{versionId:t,marks:r.map(e=>({...(0,s.toTableMark)({...e,geometry:null===e.geometry||"object"!=typeof e.geometry||Array.isArray(e.geometry)?null:e.geometry,properties:null===e.properties||"object"!=typeof e.properties||Array.isArray(e.properties)?null:e.properties},e.id,n,e.attached_annotation_id),sheet:e.sheet})),liveBranchIds:l.map(e=>e.id),branchesAvailable:(0,s.branchRoster)(l,e=>e,u,c),pageScales:i,unitSystem:o.unit_system,precision:o.precision,areaUnitSystem:o.area_unit_system,areaPrecision:o.area_precision,evidence:new Map(r.map(e=>[e.id,{id:e.id,type:e.type,page:e.displayPage,branchId:e.branch_id}]))}})(o.data,e,l)):null,[o.data,l,e]),isPending:o.isPending,error:o.error}}function T(e){let l=(0,r.useSupabase)(),a=(0,t.useMemo)(()=>(0,s.linkedLibraryRowIds)([{doc:e}]),[e]),o=a.slice().sort().join(","),i=(0,n.useQuery)({queryKey:["table-library-rows",o],enabled:a.length>0,staleTime:6e4,refetchInterval:5e3,queryFn:async()=>{let[e,t]=await Promise.all([l.from("libraries").select("id,slug"),l.from("library_rows").select("id,library_id,data").in("id",a)]);if(e.error)throw e.error;if(t.error)throw t.error;return{libraries:e.data??[],rows:t.data??[]}}});return(0,t.useMemo)(()=>{if(0===a.length||!i.data)return;let e=i.data;return k(e,[],()=>(0,s.makeTableLibraryResolver)(e.libraries,e.rows.map(e=>({id:e.id,library_id:e.library_id,data:e.data}))))},[a.length,i.data])}function I(e){let{name:n,doc:r,context:l,book:a,resolveLibraryRow:o,resolveTableReference:i}=e,d=m(r,l?.versionId);return(0,t.useMemo)(()=>l&&r&&"object"==typeof r?j(r,[n,l,a,o,d.data,i],()=>(0,s.projectTableDoc)({name:n,doc:r,resolveTableReference:i,marks:l.marks,...d.data?{model:S(d.data)}:{},liveBranchIds:l.liveBranchIds,branchesAvailable:l.branchesAvailable,pageSettings:e=>({scale:l.pageScales[String(e)]??0,unitSystem:l.unitSystem,precision:l.precision,areaUnitSystem:l.areaUnitSystem,areaPrecision:l.areaPrecision}),...o?{resolveLibraryRow:o}:{},book:a,now:new Date().toISOString()})):null,[n,r,l,a,o,d.data,i])}e.s(["getModelTableSource",()=>S,"useProjectedTableDoc",()=>I,"useTableLibraryResolver",()=>T,"useVersionProjectionContext",()=>C],403682)},635984,e=>{"use strict";let t=(0,e.i(607655).default)("circle-question-mark",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3",key:"1u773s"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);e.s(["CircleQuestionMark",()=>t],635984)},100655,81067,e=>{"use strict";let t=(0,e.i(607655).default)("text-quote",[["path",{d:"M17 5H3",key:"1cn7zz"}],["path",{d:"M21 12H8",key:"scolzb"}],["path",{d:"M21 19H8",key:"13qgcb"}],["path",{d:"M3 12v7",key:"1ri8j3"}]]);e.s(["TextQuote",()=>t],100655);var n=e.i(391610),r=e.i(138415),s=e.i(252680);e.i(206609);var l=e.i(315029),a=e.i(7205),o=e.i(963633),i=e.i(571290),d=e.i(424942),c=e.i(687123);function u({doc:e,onSave:t,onCancel:u}){let m=(0,s.useForm)({defaultValues:{name:e.name,includeRows:!1}}),p=(0,s.useWatch)({control:m.control,name:"includeRows"}),h=(0,r.useMemo)(()=>{try{return{warnings:(0,l.prepareTableTemplate)(e,{includeRows:p}).warnings,error:null}}catch(e){return{warnings:[],error:e instanceof Error?e.message:"This table cannot be reused as a template."}}},[e,p]);return(0,n.jsx)(i.Form,{...m,children:(0,n.jsxs)("form",{className:"space-y-4 p-3","data-test":"table-template-save-form",onSubmit:e=>{e.stopPropagation(),m.handleSubmit(async e=>{try{if(h.error)throw Error(h.error);await t(e)}catch(e){m.setError("root",{message:e instanceof Error?e.message:"The template could not be saved."})}})(e)},children:[(0,n.jsx)(i.FormField,{control:m.control,name:"name",rules:{required:"Give the template a name."},render:({field:e})=>(0,n.jsxs)(i.FormItem,{children:[(0,n.jsx)(i.FormLabel,{children:(0,n.jsx)(c.Trans,{i18nKey:"drawings:table.templateName",defaults:"Template name"})}),(0,n.jsx)(i.FormControl,{children:(0,n.jsx)(d.Input,{...e,autoF
1ocus:!0,"data-test":"table-template-input"})}),(0,n.jsx)(i.FormMessage,{})]})}),(0,n.jsx)(i.FormField,{control:m.control,name:"includeRows",render:({field:e})=>(0,n.jsxs)(i.FormItem,{className:"flex flex-row items-center gap-2 space-y-0",children:[(0,n.jsx)(i.FormControl,{children:(0,n.jsx)(o.Checkbox,{checked:e.value,onCheckedChange:t=>e.onChange(!0===t),"data-test":"table-template-include-rows"})}),(0,n.jsx)(i.FormLabel,{children:(0,n.jsx)(c.Trans,{i18nKey:"drawings:table.includeStarterRows",defaults:"Include starter rows"})})]})}),(0,n.jsx)("p",{className:"text-muted-foreground text-xs",children:(0,n.jsx)(c.Trans,{i18nKey:"drawings:table.starterRowsHelp",defaults:"Keep descriptions, catalog selections and reusable formulas. Project quantities and drawing bindings are cleared."})}),h.warnings.length?(0,n.jsxs)("details",{className:"text-muted-foreground text-xs","data-test":"table-template-warnings",children:[(0,n.jsx)("summary",{className:"cursor-pointer",children:(0,n.jsx)(c.Trans,{i18nKey:"drawings:table.templateChanges",defaults:"What will be cleared"})}),(0,n.jsx)("ul",{className:"mt-2 list-disc space-y-1 pl-4",children:h.warnings.map(e=>(0,n.jsx)("li",{children:e},e))})]}):null,h.error||m.formState.errors.root?(0,n.jsx)("p",{role:"alert",className:"text-destructive text-xs","data-test":"table-template-save-error",children:h.error??m.formState.errors.root?.message}):null,(0,n.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,n.jsx)(a.Button,{type:"button",variant:"outline",size:"sm",onClick:u,disabled:m.formState.isSubmitting,children:(0,n.jsx)(c.Trans,{i18nKey:"common:cancel",defaults:"Cancel"})}),(0,n.jsx)(a.Button,{type:"submit",size:"sm",disabled:m.formState.isSubmitting||!!h.error,"data-test":"table-template-save",children:(0,n.jsx)(c.Trans,{i18nKey:"common:save",defaults:"Save"})})]})]})})}e.s(["TableTemplateSaveForm",()=>u],81067)},39952,414235,e=>{"use strict";e.i(206609);var t=e.i(539529);let n={level:"version",ids:null};function r(e,t,r){if("measure"!==e.kind)return n;let s=t?.branch_scopes?.[e.key];return void 0!==s?{level:"row",ids:[...s]}:void 0!==e.branches?{level:"column",ids:[...e.branches]}:void 0!==r?{level:"table",ids:[...r]}:n}function s(e,t){if(null==e||null==t)return null==e&&null==t;if(e.length!==t.length)return!1;let n=new Set(e);return t.every(e=>n.has(e))}function l(e){if(e.id===t.MAIN_BRANCH_SCOPE)return e.notation?`${e.notation} Main`:"Main";let n=e.name?.trim()||e.segment;return e.notation?`${e.notation} ${n}`:n}function a(e,n){let r=n.find(t=>t.id===e);return r?l(r):e===t.MAIN_BRANCH_SCOPE?"Main":e}function o(e,t){return 0===e.length?"no branches":e.length>2?`${e.length} branches`:e.map(e=>a(e,t)).join(" · ")}function i(e,t){switch(e.level){case"row":return`This row reads ${o(e.ids,t)} for this column — right-click the cell to change it.`;case"column":return`This column reads ${o(e.ids,t)}, not the table default — open the column header to change it.`;case"table":return`The table default: every measure reads ${o(e.ids,t)}.`;case"version":return"Reads every branch in this version."}}function d(e,t){let n=e.unresolved?.reason==="branch_unresolved"?e.unresolved.branches:[],r=n.map(e=>`"${a(e,t)}"`).join(", "),s=1===n.length?"branch":"branches",l=`This cell is scoped to ${n.length>0?`${s} ${r}, which `:"a branch that "}no longer ${n.length>1?"resolve":"resolves"} in this version.`;return e.pinned?`${l} The value shown is a pinned number a human typed, so it stands — but nothing recomputes it.`:`${l} Its marks cannot be read, so there is no number: an unknown quantity is not a smaller one.`}function c(e,t){let n=e??[];if(!n.includes(t))return[...n,t];let r=n.filter(e=>e!==t);return 0===r.length?null:r}e.s(["branchIdLabel",()=>a,"branchOptionLabel",()=>l,"brokenBranchTitle",()=>d,"describeBranchScope",()=>o,"describeScopeSource",()=>i,"effectiveBranchScope",()=>r,"sameBranchScope",()=>s,"toggledBranchScope",()=>c],39952);var u=e.i(391610),m=e.i(138415),p=e.i(60787),h=e.i(828296);e.i(986406);var f=e.i(41802),x=e.i(383778);e.i(53759);var g=e.i(541048);let b=f.POPOVER_ITEM_CLASS;function y({options:e,value:n,inheritLabel:r,onChange:s,dataTest:a}){if(0===e.length)return(0,u.jsx)("span",{className:"text-muted-foreground text-[10px]",children:"This version has no branches, so takeoffs read the whole drawing."});let o=new Set(n??[]);return(0,u.jsxs)("div",{className:"flex flex-col gap-0.5","data-test":a,children:[(0,u.jsxs)("button",{type:"button",className:(0,g.cn)(b,void 0===n&&"bg-accent"),onClick:()=>s(null),"data-test":`${a}-inherit`,children:[(0,u.jsx)("input",{type:"checkbox",readOnly:!0,checked:void 0===n}),(0,u.jsx)("span",{className:"truncate",children:r})]}),(0,u.jsx)("div",{className:"max-h-40 overflow-y-auto",children:e.map(e=>(0,u.jsxs)("button",{type:"button",className:b,onClick:()=>s(c(n,e.id)),"data-test":`${a}-option`,"data-branch-id":e.id,children:[(0,u.jsx)("input",{type:"checkbox",readOnly:!0,checked:o.has(e.id)}),(0,u.jsx)("span",{className:"min-w-0 flex-1 truncate",children:l(e)}),e.is_default?(0,u.jsx)("span",{className:"text-muted-foreground shrink-0 font-mono text-[9px]",children:"default"}):null]},e.id))}),e.some(e=>e.id===t.MAIN_BRANCH_SCOPE&&!0===e.main_tracks_sync)?(0,u.jsx)("span",{className:"text-[10px] text-amber-600 dar
1k:text-amber-400","data-test":"branch-scope-sync-hint",children:"This drawing syncs from an external file: “Main” tracks the synced source and re-points on every sync. Scope to a named branch to hold still."}):null]})}function v({options:e,value:t,tableDefault:n,onChange:r}){return(0,u.jsxs)("div",{className:"flex flex-col gap-1",children:[(0,u.jsx)("span",{className:"text-muted-foreground text-[10px]",children:"Branches this column counts marks from"}),(0,u.jsx)(y,{options:e,value:t,inheritLabel:void 0===n?"Every branch in this version":`Table default — ${o(n,e)}`,onChange:r,dataTest:"column-branches"}),e.length>0?(0,u.jsx)("span",{className:"text-muted-foreground text-[10px]",children:"One row can differ — right-click its cell in this column."}):null]})}function w({options:e,value:t,busy:n,onChange:r}){let[s,l]=(0,m.useState)(!1),a=void 0!==t;return(0,u.jsxs)(x.Popover,{open:s,onOpenChange:l,children:[(0,u.jsx)(x.PopoverTrigger,{asChild:!0,children:(0,u.jsxs)("button",{type:"button",disabled:n,className:(0,g.cn)("inline-flex items-center gap-1 rounded font-mono text-[10px]",a?"border border-blue-500/50 bg-blue-500/10 px-1.5 py-0.5 text-blue-600 dark:text-blue-400":"text-muted-foreground hover:text-foreground"),title:a?`Every takeoff in this table reads ${o(t,e)} unless its column says otherwise`:"Branch scope: which branches this table’s takeoffs count marks from","data-test":"table-branch-scope",children:[(0,u.jsx)(p.GitBranch,{className:"h-3 w-3 shrink-0"}),a?o(t,e):null]})}),(0,u.jsx)(x.PopoverContent,{align:"end",className:"w-64 p-2",children:(0,u.jsxs)("div",{className:"flex flex-col gap-1",children:[(0,u.jsx)("span",{className:"text-muted-foreground text-[10px]",children:"Table default. Every takeoff column inherits this unless it sets its own."}),(0,u.jsx)(y,{options:e,value:t,inheritLabel:"Every branch in this version",onChange:r,dataTest:"table-branches"})]})})]})}function k({cell:e,options:t}){return(0,u.jsxs)("span",{className:"text-destructive inline-flex shrink-0 items-center gap-0.5 font-mono text-[10px]",title:d(e,t),"data-test":"table-cell-broken-branch",children:[(0,u.jsx)(h.TriangleAlert,{className:"h-2.5 w-2.5"}),"branch?"]})}function j({scope:e,options:t,dataTest:n}){return(0,u.jsxs)("span",{className:"text-muted-foreground inline-flex shrink-0 items-center gap-0.5 font-mono text-[9px]",title:i(e,t),"data-test":n,children:[(0,u.jsx)(p.GitBranch,{className:"h-2.5 w-2.5"}),null!==e.ids&&e.ids.length>1?e.ids.length:null]})}e.s(["BranchScopeMarker",()=>j,"BrokenBranchBadge",()=>k,"ColumnBranchScopeField",()=>v,"TableBranchScopeButton",()=>w],414235)},257271,e=>{"use strict";let t=(0,e.i(607655).default)("calculator",[["rect",{width:"16",height:"20",x:"4",y:"2",rx:"2",key:"1nb95v"}],["line",{x1:"8",x2:"16",y1:"6",y2:"6",key:"x4nwl0"}],["line",{x1:"16",x2:"16",y1:"14",y2:"18",key:"wjye3r"}],["path",{d:"M16 10h.01",key:"1m94wz"}],["path",{d:"M12 10h.01",key:"1nrarc"}],["path",{d:"M8 10h.01",key:"19clt8"}],["path",{d:"M12 14h.01",key:"1etili"}],["path",{d:"M8 14h.01",key:"6423bh"}],["path",{d:"M12 18h.01",key:"mhygvu"}],["path",{d:"M8 18h.01",key:"lrp35t"}]]);e.s(["Calculator",()=>t],257271)},503159,430223,404717,821695,17056,e=>{"use strict";var t=e.i(391610),n=e.i(138415),r=e.i(148135),s=e.i(257271),l=e.i(329267),a=e.i(536056),o=e.i(728387),i=e.i(43140),d=e.i(739351);e.i(206609);var c=e.i(2191),u=e.i(180152),m=e.i(772771);e.i(986406);var p=e.i(41802),h=e.i(38972),f=e.i(7205),x=e.i(424942),g=e.i(383778),b=e.i(486596),y=e.i(883872);e.i(53759);var v=e.i(541048),w=e.i(331570),k=e.i(39952),j=e.i(414235),N=e.i(568071);function S(e){let t=e.label.trim();return""===t?e.key:t}let C=e=>/[A-Za-z0-9_]/.test(e);function T(e){return"("===e?{kind:"open",text:"("}:")"===e?{kind:"close",text:")"}:","===e?{kind:"comma",text:","}:"+-*/".includes(e)?{kind:"op",text:e}:null}function I(e,t){for(let n of u.FORMULA_FUNCTIONS){if(!e.toLowerCase().startsWith(n,t))continue;let r=e.slice(t+n.length);if(/^\s*\(/.test(r))return n}return null}function F(e){let t=[],n=!1;return e.forEach((r,s)=>{let l=e[s-1],a=void 0===l||"open"===l.kind||"close"===r.kind||"comma"===r.kind||"fn"===l.kind&&"open"===r.kind||n,o="unknown"===r.kind?"?":r.text;t.push(a?o:` ${o}`),n="op"===r.kind&&"-"===r.text&&(void 0===l||"open"===l.kind||"op"===l.kind)}),t.join("")}function $(e,t,n){let r=e.toLowerCase();for(let s of n){let n=S(s).toLowerCase();if(""===n||!r.startsWith(n,t))continue;let l=t>0?e[t-1]:"",a=e[t+n.length]??"",o=""===l||!C(l)||!C(n[0]),i=""===a||!C(a)||!C(n[n.length-1]);if(o&&i)return s}return null}function M(e,t){let n=[...t].sort((e,t)=>
1S(t).length-S(e).length),r=[],s=0;for(;s<e.length;){let t=e[s];if(/\s/.test(t)){s+=1;continue}let l=I(e,s);if(null!==l){r.push({kind:"fn",text:l}),s+=l.length;continue}let a=$(e,s,n);if(null!==a){r.push({kind:"term",text:a.key}),s+=S(a).length;continue}let o=T(t);if(null!==o){r.push(o),s+=1;continue}let i=/^\d+(\.\d+)?/.exec(e.slice(s));if(null!==i){r.push({kind:"term",text:i[0]}),s+=i[0].length;continue}let d=s+1;for(;d<e.length&&null===T(e[d])&&null===I(e,d)&&null===$(e,d,n);)d+=1;r.push({kind:"unknown",name:e.slice(s,d).trim()}),s=d}let l=[];for(let e of r)"unknown"===e.kind&&""!==e.name&&(l.some(t=>t.toLowerCase()===e.name.toLowerCase())||l.push(e.name));return{expr:F(r),unknown:l}}function _(e,t){let n=new Map(t.map(e=>[e.key,S(e)])),r=[],s=0;for(;s<e.length;){let t=e[s];if(/\s/.test(t)){s+=1;continue}let l=T(t);if(null!==l){r.push(l),s+=1;continue}let a=/^([A-Za-z_][A-Za-z0-9_]*|\d+(\.\d+)?|[^\s(){}[\],+\-*/]+)/.exec(e.slice(s)),o=a?.[0]??t;r.push((0,u.isFunctionName)(o)&&/^\s*\(/.test(e.slice(s+o.length))?{kind:"fn",text:o}:{kind:"term",text:n.get(o)??o}),s+=o.length}return F(r)}e.s(["formulaOfNames",()=>M,"namesOfFormula",()=>_,"operandName",()=>S],430223);let P=[{mode:"measure",label:"Takeoff",hint:"counts and measures your marks",Icon:i.Ruler},{mode:"value",label:"Value",hint:"typed in per row",Icon:a.Hash},{mode:"formula",label:"Formula",hint:"from other columns",Icon:s.Calculator},{mode:"pointer",label:"Library",hint:"a field from a picked library row",Icon:r.BookOpen}];function z(e,t,n){return n===(0,m.totalsByDefault)(e,t)?{}:{total:n?"sum":"none"}}function L(e,t=[]){let n={label:e.label??e.key,expr:"",branches:[],library:"",field:"",formula:"",format:e.format??"number",totaled:(0,m.isTotaledColumn)(e),precision:e.precision??null,default:null};switch(e.kind){case"measure":return{...n,mode:"measure",expr:e.expr??"",branches:e.branches?[...e.branches]:[]};case"pointer":return{...n,mode:"pointer",library:e.library,field:e.field??e.key,...e.unitField?{unitField:e.unitField}:{},format:e.format??"currency",default:e.default??null};case"formula":return{...n,mode:"formula",formula:_(e.expr,t)};case"value":return{...n,mode:"value",default:e.default??null}}}function E(e,t,n=[],r=[]){let s=e.label.trim();if(!s)return null;let l=t??(0,N.slugifyColumnKey)(s),a={key:l,label:s,...null!==e.precision?{precision:e.precision}:{}};switch(e.mode){case"measure":{let t=e.expr.trim();
1if(""!==t&&(0,u.isExprError)((0,u.compileMeasure)(t)))return null;return{...a,kind:"measure",...""!==t?{expr:t}:{},...e.branches.length>0?{branches:e.branches}:{},..."number"!==e.format&&"text"!==e.format?{format:e.format}:{},...z("measure",e.format,e.totaled)}}case"pointer":{let t=e.library.trim(),r=e.field.trim();if(!t||!r)return null;let s=n?.find(e=>e.slug===t)?.columns??[],o=""!==r?r:l,i=(0,c.libraryFieldFormat)(s,o),d=s.find(e=>e.key===o)?.format,u=void 0!==d&&!c.FORMAT_META[d].numeric;return{...a,kind:"pointer",library:t,...e.unitField?.trim()?{unitField:e.unitField.trim()}:{},...""!==r&&r!==l?{field:r}:{},..."text"!==i?{format:i}:{},...z("pointer",i,!u&&e.totaled),...null!==e.default?{default:e.default}:{}}}case"formula":{if(""===e.formula.trim())return null;let{expr:t,unknown:n}=M(e.formula,r);if(n.length>0||(0,u.isExprError)((0,u.compileFormulaKeys)(t)))return null;return{...a,kind:"formula",expr:t,..."number"!==e.format?{format:e.format}:{},...z("formula",e.format,e.totaled)}}case"value":return{...a,kind:"value",format:e.format,...z("value",e.format,e.totaled),...null!==e.default?{default:e.default}:{}}}}function D(e,t,n){if("pointer"===e.mode){let t=(n?.find(t=>t.slug===e.library.trim())?.columns??[]).find(t=>t.key===e.field.trim()&&""!==e.field.trim()),r=void 0!==t?(t.label??t.key).trim():"";if(""!==r)return r}let r=new Set(t.map(S)),s=t.length+1;for(;r.has(`Column ${s}`);)s+=1;return`Column ${s}`}function R(e,t,n){let r=e.label.trim(),s=function(e,t){let n=e.trim(),r=new Set(t.map(e=>S(e).toLowerCase()));if(""===n||!r.has(n.toLowerCase()))return n;let s=2;for(;r.has(`${n} ${s}`.toLowerCase());)s+=1;return`${n} ${s}`}(""===r?D(e,t,n):r,t);return s===e.label?e:{...e,label:s}}function O(e){switch(e.mode){case"pointer":if(""===e.library.trim())return"Pick a library";if(""===e.field.trim())return"Pick a field";return null;case"formula":return""===e.formula.trim()?"Type a formula — column names complete as you type":null;case"measure":{let t=e.expr.trim();
1return""!==t&&(0,u.isExprError)((0,u.compileMeasure)(t))?"Fix the takeoff expression":null}case"value":return null}}function A(e,t){if(""===e.trim())return null;let{expr:n,unknown:r}=M(e,t);if(1===r.length)return`No column named “${r[0]}”`;if(r.length>1)return`No columns named ${r.map(e=>`“${e}”`).join(", ")}`;let s=(0,u.compileFormulaKeys)(n);return(0,u.isExprError)(s)?s.error:null}function B({value:e,onChange:n,operands:r}){return(0,t.jsx)(w.TagSuggestInput,{value:e,onChange:n,options:[...r.map(S),...u.FORMULA_FUNCTIONS.map(e=>`${e}(`)],operands:!0,autoFocus:!0,placeholder:function(e){let[t,n]=e;return void 0===t?"":void 0===n?`${S(t)} * 1.1`:`${S(t)} * ${S(n)}`}(r),className:"w-full","data-test":"column-expr"})}function K({totaled:e,onTotaled:n}){return(0,t.jsxs)("label",{className:"text-muted-foreground flex items-center gap-1 font-mono text-[10px]",title:"Sums into every section subtotal and the Total row",children:[(0,t.jsx)("input",{type:"checkbox",checked:e,onChange:e=>n(e.target.checked),"data-test":"column-totaled"}),"sums into Total"]})}function V({format:e,totaled:n,onFormat:r,onTotaled:s}){return(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsxs)(b.Select,{value:e,onValueChange:e=>r(e),children:[(0,t.jsx)(b.SelectTrigger,{className:"h-7 w-24 font-mono text-[11px]",children:(0,t.jsx)(b.SelectValue,{})}),(0,t.jsx)(b.SelectContent,{children:["number","currency"].map(e=>(0,t.jsx)(b.SelectItem,{value:e,className:"font-mono text-[11px]",children:e},e))})]}),(0,t.jsx)(K,{totaled:n,onTotaled:s})]})}function q({draft:e,setDraft:n,operands:r,libraries:s,branchOptions:l,tableBranches:a,defaultLibrary:o=null}){let i=e=>n(t=>({...t,...e})),d=s?.find(t=>t.slug===e.library),u=D(e,r,s),p=e.label.trim(),h=R(e,r,s).label,f=r.find(e=>S(e).toLowerCase()===p.toLowerCase());return(0,t.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,t.jsx)(x.Input,{value:e.label,onChange:e=>i({label:e.target.value}),placeholder:u,className:"h-7 text-[12px]","data-test":"column-label"}),void 0!==f?(0,t.jsxs)("span",{className:"-mt-1 text-[9px] text-amber-600 dark:text-amber-400","data-test":"column-label-taken",children:["another column is already called “",S(f),"” — this one saves as “",h,"”"]}):null,(0,t.jsxs)("div",{className:"flex flex-col gap-1",children:[(0,t.jsx)("span",{className:"text-muted-foreground text-[10px]",children:"This column is"}),(0,t.jsx)(y.TooltipProvider,{delayDuration:300,children:(0,t.jsx)("div",{className:"grid grid-cols-2 gap-1",children:P.map(l=>{let a=e.mode===l.mode,i=a?null:function(e,t,n){if("formula"===e&&0===t.length)return"Needs another column to reference";if("pointer"===e){if(null===n)return"Loading libraries…";if(!n.some(e=>e.columns.length>0))return 0===n.length?"No libraries yet":"No library has columns yet"}return null}(l.mode,r,s);return(0,t.jsxs)(y.Tooltip,{children:[(0,t.jsx)(y.TooltipTrigger,{asChild:!0,children:(0,t.jsxs)("button",{type:"button","aria-disabled":null!==i,className:(0,v.cn)("hover:bg-accent flex items-center gap-1.5 rounded border border-transparent px-2 py-1 text-left text-[11px]",a&&"border-border bg-accent text-foreground",null!==i&&"cursor-not-allowed opacity-40 hover:bg-transparent"),onClick:()=>{a||null!==i||n(e=>{let t="pointer"===l.mode?"currency":"number";return{...e,mode:l.mode,library:"pointer"===l.mode&&""===e.library.trim()&&null!==o&&s?.some(e=>e.slug===o&&e.columns.length>0)?o:e.library,format:t,totaled:(0,m.totalsByDefault)(l.mode,t)}})},"data-test":`column-mode-${l.mode}`,children:[(0,t.jsx)(l.Icon,{className:"text-muted-foreground h-3.5 w-3.5 shrink-0"}),(0,t.jsx)("span",{className:"truncate",children:l.label})]})}),(0,t.jsx)(y.TooltipContent,{side:"bottom",className:"max-w-56 text-[11px]",children:i??l.hint})]},l.mode)})})})]}),"measure"===e.mode?(0,t.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,t.jsx)(j.ColumnBranchScopeField,{options:l,value:e.branches.length>0?e.branches:void 0,tableDefault:a,onChange:e=>i({branches:e??[]})}),(0,t.jsx)(K,{totaled:e.totaled,onTotaled:e=>i({totaled:e})})]}):null,"pointer"===e.mode?(0,t.jsxs)("div",{className:"flex flex-col gap-1",children:[(0,t.jsx)("span",{className:"text-muted-foreground text-[10px]",children:"Library — each row picks one of its rows"}),(0,t.jsxs)(b.Select,{value:e.library,onValueChange:e=>i({library:e,field:"",unitField:"",totaled:!1}),children:[(0,t.jsx)(b.SelectTrigger,{className:"h-7 text-[11px]","data-test":"column-library",children:(0,t.jsx)(b.SelectValue,{placeholder:"Pick a library"})}),(0,t.jsx)(b.SelectContent,{children:(s??[]).filter(e=>e.columns.length>0).map(e=>(0,t.jsx)(b.SelectItem,{value:e.slug,className:"text-[11px]",children:e.name},e.slug))})]}),(0,t.jsx)("span",{className:"text-muted-foreground text-[10px]",children:""===e.library.trim()?"Field — pick a library first":"Field — its type comes with it"}),(0,t.jsxs)(b.Select,{value:e.field,onValueChange:e=>{let t=(0,c.libraryFieldFormat)(d?.columns??[],e);i({field:e,...c.FORMAT_META[t].numeric?{}:{totaled:!1}})},disabled:""===e.library.trim(),children:[(0,t.jsx)(b.SelectTrigger,{className:"h-7 font-mono text-[11px]","data-test":"column-library-field",children:(0,t.jsx)(b.SelectValue,{placeholder:"Pick a field"})}),(0,t.jsx)(b.SelectContent,{children:(d?.columns??[]).map(e=>(0,t.jsxs)(b.SelectItem,{value:e.key,className:"font-mono text-[11px]",children:[e.label??e.key,(0,t.jsx)("span",{className:"text-muted-foreground ml-1 text-[9px]",children:c.FORMAT_META[e.format??"text"].label})]},e.key))})]}),(0,t.jsx)("span",{className:"text-muted-foreground text-[10px]",children:"Units — optional library field"}),(0,t.jsxs)(b.Select,{value:e.unitField||"__none",onValueChange:e=>i({unitField:"__none"===e?"":e}),disabled:!e.library,children:[(0,t.jsx)(b.SelectTrigger,{className:"h-7 text-[11px]","data-test":"column-library-unit-field",children:(0,t.jsx)(b.SelectValue,{})}),(0,t.jsxs)(b.SelectContent,{children:[(0,t.jsx)(b.SelectItem,{value:"__none",children:"None / included in value"}),(d?.columns??[]).filter(t=>t.key!==e.field).map(e=>(0,t.jsx)(b.SelectItem,{value:e.key,children:e.label??e.key},e.key))]})]}),""!==e.field.trim()&&c.FORMAT_META[(0,c.libraryFieldFormat)(d?.columns??[],e.field)].numeric?(0,t.jsx)(K,{totaled:e.totaled,onTotaled:e=>i({totaled:e})}):null]}):null,"formula"===e.mode?(0,t.jsx)(B,{value:e.formula,onChange:e=>i({formula:e}),operands:r}):null,"value"===e.mode?(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsxs)(b.Select,{value:e.format,onValueChange:t=>{i({format:t,totaled:e.totaled===(0,m.totalsByDefault)(e.mode,e.format)?(0,m.totalsByDefault)(e.mode,t):e.totaled})},children:[(0,t.jsx)(b.SelectTrigger,{className:"h-7 w-28 font-mono text-[11px]","data-test":"column-format",children:(0,t.jsx)(b.SelectValue,{})}),(0,t.jsx)(b.SelectContent,{children:Object.keys(c.FORMAT_META).map(e=>(0,t.jsx)(b.SelectItem,{value:e,className:"font-mono text-[11px]",children:c.FORMAT_META[e].label},e))})]}),c.FORMAT_META[e.format].numeric?(0,t.jsx)(K,{totaled:e.totaled,onTotaled:e=>i({totaled:e})}):null]}):null,"formula"===e.mode?(0,t.jsx)(V,{format:"text"===e.format?"number":e.format,totaled:e.totaled,onFormat:e=>i({format:e}),onTotaled:e=>i({totaled:e})}):null]})}function U({busy:e,operands:r,libraries:s,branchOptions:l,tableBranches:a,trigger:i,defaultLibrary:d=null,onAdd:c}
1){let[u,m]=(0,n.useState)(!1);return(0,t.jsxs)(g.Popover,{open:u,onOpenChange:m,children:[(0,t.jsx)(g.PopoverTrigger,{asChild:!0,children:i??(0,t.jsx)(f.Button,{type:"button",variant:"ghost",size:"sm",className:(0,v.cn)(p.ROW_ACTION_CLASS,"text-muted-foreground"),title:"Add a column at the end","data-test":"add-column",children:(0,t.jsx)(o.Plus,{className:"h-3 w-3"})})}),(0,t.jsx)(g.PopoverContent,{align:"end",className:"w-72 p-2",children:(0,t.jsx)(W,{busy:e,operands:r,libraries:s,branchOptions:l,tableBranches:a,defaultLibrary:d,onAdd:c,onDone:()=>m(!1)})})]})}function H({beforeKey:e,busy:r,operands:s,libraries:l,branchOptions:a,tableBranches:i,defaultLibrary:d=null,onAdd:c}){let[u,m]=(0,n.useState)(!1);return(0,t.jsxs)(g.Popover,{open:u,onOpenChange:m,children:[(0,t.jsx)(g.PopoverTrigger,{asChild:!0,children:(0,t.jsx)("button",{type:"button",className:p.SEAM_INSERT_CLASS,title:"Insert a column here","aria-label":`Insert a column before ${e}`,"data-test":"column-seam-insert",onPointerDown:e=>e.stopPropagation(),onDoubleClick:e=>e.stopPropagation(),children:(0,t.jsx)(o.Plus,{className:"h-2.5 w-2.5"})})}),(0,t.jsx)(g.PopoverContent,{align:"center",className:"w-72 p-2",children:(0,t.jsx)(W,{busy:r,operands:s,libraries:l,branchOptions:a,tableBranches:i,defaultLibrary:d,onAdd:c,onDone:()=>m(!1)})})]})}function W({busy:e,operands:r,libraries:s,branchOptions:l,tableBranches:a,defaultLibrary:o=null,onAdd:i,onDone:d}){var c;let u,[h,x]=(0,n.useState)(()=>{var e;let t;return t="pointer"==(e="measure")?"currency":"number",{label:"",mode:e,expr:"",branches:[],library:"",field:"",formula:"",format:t,totaled:(0,m.totalsByDefault)(e,t),precision:null,default:null}}),g=R(h,r,s),b=E(g,(c=g.label,(""===(u=c.trim())?null:(0,N.freshKeyFrom)(new Set(r.map(e=>e.key)),(0,N.slugifyColumnKey)(u)))??void 0),s,r),y="formula"===h.mode?A(h.formula,r):null,w=null===b&&null===y?O(h):null,k=!e&&null!==b&&null===y,j=()=>{k&&b&&(i(b),d())};return(0,t.jsxs)("div",{onKeyDownCapture:J(j),onKeyDown:e=>{"Enter"!==e.key||e.defaultPrevented||(e.preventDefault(),j())},children:[(0,t.jsx)(q,{draft:h,setDraft:x,operands:r,libraries:s,branchOptions:l,tableBranches:a,defaultLibrary:o}),y?(0,t.jsx)(G,{problem:y}):w?(0,t.jsx)(X,{hint:w}):null,(0,t.jsx)(f.Button,{type:"button",variant:"outline",size:"sm",className:(0,v.cn)(p.GHOST_ACTION_CLASS,"mt-2"),disabled:!k,onClick:j,"data-test":"add-column-submit",children:"Add column"})]})}function Q({column:e,operands:r,libraries:s,branchOptions:l,tableBranches:a,abandoned:o,commitRef:i,onSave:d}
1){let[c,u]=(0,n.useState)(()=>L(e,r)),m=E(R(c,r,s),e.key,s,r),p="formula"===c.mode?A(c.formula,r):null,h=null===m&&null===p?O(c):null,f=(0,n.useRef)({next:null,onSave:d}),x=(0,n.useRef)(!1);return(0,n.useEffect)(()=>{if(x.current)return;let t=JSON.stringify(m)===JSON.stringify(E(R(L(e,r),r,s),e.key,s,r));f.current={next:null!==p||t?null:m,onSave:d}}),(0,n.useEffect)(()=>{o.current=!1,x.current=!1,i.current=()=>{let{next:e,onSave:t}=f.current;f.current={...f.current,next:null},x.current=!0,null===e||o.current||t(e)};let e=i.current;return()=>{e(),i.current===e&&(i.current=null)}},[]),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(q,{draft:c,setDraft:u,operands:r,libraries:s,branchOptions:l,tableBranches:a}),p?(0,t.jsx)(G,{problem:p}):h?(0,t.jsx)(X,{hint:h}):null]})}function J(e){return t=>{if("Enter"!==t.key)return;let n=t.target;"combobox"!==n.getAttribute("role")||"true"!==n.getAttribute("aria-expanded")&&(t.preventDefault(),t.stopPropagation(),e())}}function G({problem:e}){return(0,t.jsx)("p",{className:"text-destructive mt-2 text-[10px]","data-test":"column-editor-problem",children:e})}function X({hint:e}){return(0,t.jsx)("p",{className:"text-muted-foreground mt-2 text-[10px]","data-test":"column-editor-hint",children:e})}function Y({library:e,fills:n}){let s=n.length>1?`${e} — one picked row fills ${n.join(", ")}`:`Reads the ${e} library`;return(0,t.jsx)(y.TooltipProvider,{delayDuration:300,children:(0,t.jsxs)(y.Tooltip,{children:[(0,t.jsx)(y.TooltipTrigger,{asChild:!0,children:(0,t.jsx)("span",{tabIndex:0,"aria-label":s,className:"text-muted-foreground inline-flex shrink-0 items-center","data-test":"column-library-badge",children:(0,t.jsx)(r.BookOpen,{className:"h-2.5 w-2.5"})})}),(0,t.jsx)(y.TooltipContent,{side:"bottom",className:"max-w-64 text-[11px]",children:s})]})})}function Z({column:e,operands:r,libraries:s,branchOptions:a,tableBranches:o,pointerFills:i,onSave:c,onRemove:u,onHide:m,hiddenColumns:p=[],onShow:f,onDropBefore:x}){let g=(0,n.useRef)(!1),b=(0,n.useRef)(null),y=(0,k.effectiveBranchScope)(e,void 0,o),v="column"===y.level&&!(0,k.sameBranchScope)(y.ids,o),w="pointer"===e.kind?s?.find(t=>t.slug===e.library)?.name??e.library:null;return(0,t.jsx)(h.SheetColumnMenu,{colId:e.key,label:e.label??e.key,title:function(e,t=[]){switch(e.kind){case"measure":return e.expr??"per-row takeoffs";case"formula":return _(e.expr,t);case"pointer":return`Library \xb7 ${e.library} \xb7 ${e.field??e.key}`;case"value":return e.label??e.key}}(e,r),align:"end",justify:"end",contentClassName:"w-72",triggerDataTest:"column-header",onReorder:x,onClose:()=>b.current?.(),trailing:(0,t.jsxs)(t.Fragment,{children:[null!==w?(0,t.jsx)(Y,{library:w,fills:i??[]}):null,v?(0,t.jsx)(j.BranchScopeMarker,{scope:y,options:a,dataTest:"column-scope-marker"}):null]}),children:n=>(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("div",{onKeyDownCapture:J(()=>n({returnFocus:!1})),onKeyDown:e=>{"Enter"!==e.key||e.defaultPrevented||(e.preventDefault(),n({returnFocus:!1}))},children:(0,t.jsx)(Q,{column:e,operands:r,libraries:s,branchOptions:a,tableBranches:o,abandoned:g,commitRef:b,onSave:c})}),(0,t.jsx)(h.SheetColumnMenuSeparator,{}),m&&(0,t.jsxs)("button",{type:"button",className:"hover:bg-accent flex w-full items-center gap-1.5 rounded px-2 py-1 text-left text-[11px]","data-test":"column-menu-hide",onClick:()=>{g.current=!0,m(),n()},children:[(0,t.jsx)(l.EyeOff,{className:"size-3.5"}),"Hide column"]}),p.map(e=>(0,t.jsxs)("button",{type:"button",className:"hover:bg-accent flex w-full rounded px-2 py-1 text-left text-[11px]",onClick:()=>{g.current=!0,f?.(e.key),n()},children:["Show ",e.label??e.key]},e.key)),(0,t.jsxs)("button",{type:"button",className:"text-destructive hover:bg-accent flex w-full items-center gap-1.5 rounded px-2 py-1 text-left text-[11px]",onClick:()=>{g.current=!0,u(),n()},title:"Delete the column AND every row's value under it","data-test":"column-menu-delete",children:[(0,t.jsx)(d.X,{className:"h-3.5 w-3.5 shrink-0"}),"Delete column"]})]})})}e.s(["AddColumnButton",()=>U,"ColumnHeader",()=>Z,"SeamInsertColumn",()=>H],503159);var ee=e.i(607655);let et=(0,ee.default)("sliders-horizontal",[["path",{d:"M10 5H3",key:"1qgfaw"}],["path",{d:"M12 19H3",key:"yhmn1j"}
1],["path",{d:"M14 3v4",key:"1sua03"}],["path",{d:"M16 17v4",key:"1q0r14"}],["path",{d:"M21 12h-9",key:"1o4lsq"}],["path",{d:"M21 19h-5",key:"1rlt1p"}],["path",{d:"M21 5h-7",key:"1oszz2"}],["path",{d:"M8 10v4",key:"tgpxqk"}],["path",{d:"M8 12H3",key:"a7s4jb"}]]);e.s(["SlidersHorizontal",()=>et],404717);var en=e.i(735924),er=e.i(497243),es=e.i(280120),el=e.i(844884),ea=e.i(370654),eo=e.i(658318),ei=e.i(228415);function ed({count:e,estimateSize:r,header:s,renderItem:l}){let a=(0,n.useRef)(null),[o,i]=(0,n.useState)(0),[d,c]=(0,n.useState)(()=>new Set),u=(0,n.useCallback)(e=>{if(!e)return;let t=()=>i(e.getBoundingClientRect().height),n=new ResizeObserver(t);return n.observe(e),t(),()=>n.disconnect()},[]),m=(0,ei.useVirtualizer)({count:e,getScrollElement:()=>a.current,estimateSize:()=>r,paddingStart:o,overscan:4});return(0,t.jsxs)("div",{ref:a,tabIndex:0,role:"region","aria-label":"Cutting layouts",className:"min-h-0 overflow-y-auto overscroll-contain","data-test":"table-cutting-scroll",children:[(0,t.jsx)("div",{ref:u,children:s}),(0,t.jsx)("div",{className:"relative w-full",style:{height:Math.max(0,m.getTotalSize()-o)},children:m.getVirtualItems().map(e=>(0,t.jsx)("div",{ref:m.measureElement,"data-index":e.index,className:"absolute top-0 left-0 w-full",style:{transform:`translateY(${e.start-o}px)`},children:l(e.index,d.has(e.index),t=>c(n=>{if(n.has(e.index)===t)return n;let r=new Set(n);return t?r.add(e.index):r.delete(e.index),r}))},e.key))})]})}var ec=e.i(252680),eu=e.i(40579),em=e.i(571290),ep=e.i(393998),eh=e.i(981449);let ef=ep.z.object({library:ep.z.object({id:ep.z.string(),name:ep.z.string(),updatedAt:ep.z.string().nullable(),columns:ep.z.array(ep.z.object({key:ep.z.string(),label:ep.z.string().optional(),format:ep.z.enum(["text","number","currency"]).optional()}))}),row:ep.z.object({id:ep.z.string(),data:ep.z.record(ep.z.string(),ep.z.unknown()),updatedAt:ep.z.string().nullable()})});async function ex(e,t,n,r,s){let l=(0,el.quantityUnit)(s.unit),a=(0,el.quantityUnit)(t.coverageUnit);if(!l||1!==l.dimension||a?.dimension!==2||![s.width,s.length].every(e=>Number.isFinite(e)&&e>0))throw Error("Enter a positive sheet width and length, with area units on Coverage.");let o=Number((s.width*s.length*l.factor**2/a.factor).toPrecision(12));if(!Number.isFinite(o)||o<=0)throw Error("Enter a valid sheet size.");if(3!==new Set([r.widthField,r.lengthField,t.coverageField]).size)throw Error("Sheet width, length and Coverage must be separate product fields.");let i=t.endpoint,d=ef.parse(await e(`${i}?${new URLSearchParams({library:t.library,row:t.rowId})}`));for(let e of[r.widthField,r.lengthField,t.coverageField])if(d.row.data[e]!==n[e])throw Error("This product changed while you were editing. Reopen cutting settings to use its latest size.");let c=[{key:r.widthField,label:"Sheet width",format:"text"},{key:r.lengthField,label:"Sheet length",format:"text"}].filter(e=>!d.library.columns.some(t=>t.key===e.key));c.length&&await e(i,{action:"update-library",id:d.library.id,expectedUpdatedAt:d.library.updatedAt,name:d.library.name,columns:[...d.library.columns,...c]});let u=d.row.data[t.coverageField],m="string"==typeof u?(0,eh.parseQuantityText)(u)?.unit:void 0,p=t.coverageUnitField?d.row.data[t.coverageUnitField]:void 0,h="string"==typeof p&&(0,el.quantityUnit)(p.split("/")[0]??"")?.dimension===2,f={...d.row.data,[r.widthField]:`${s.width} ${s.unit}`,[r.lengthField]:`${s.length} ${s.unit}`,[t.coverageField]:m?`${o} ${m}`:h?o:`${o} ${t.coverageUnit}/${t.purchaseUnit}`};return await e(i,{action:"update-row",id:t.rowId,libraryId:d.library.id,expectedUpdatedAt:d.row.updatedAt,data:f}),{libraryId:d.library.id,data:f,columnsChanged:c.length>0}}let eg="border-input bg-background h-8 w-full rounded border px-2 text-sm";function eb({settings:e,unit:r,product:s,onChange:l,onSaveSize:a}){let o=(0,el.quantityUnit)(r)?.dimension===2,i=o?(0,el.quantityUnit)(r).factor>=.99?"m":"ft":r,d=["LF","ft","in"].includes(i)?"in":i||"mm",[c]=(0,n.useState)(s),u=function(e,t,n){if(t){let r=(0,eu.sheetStockDimensions)(t,e);if(!("error"in r)&&t.widthField!==t.lengthField)return{width:String(Number((0,el.convertQuantity)(r.width,r.unit,n)?.toPrecision(12))),length:String(Number((0,el.convertQuantity)(r.length,r.unit,n)?.toPrecision(12))),widthField:t.widthField,lengthField:t.lengthField}}let r=Object.values(e??{}).filter(e=>"string"==typeof e&&(0,el.quantityUnit)(e)?.dimension===1),s=1===new Set(r).size?r[0]:void 0,l=t=>{for(let r of["sheet_","stock_","panel_",""])for(let l of["","_in","_ft","_mm","_cm","_m"]){let a=`${r}${t}${l}`,o=e?.[a],i="number"==typeof o?{value:o,unit:void 0}:"string"==typeof o?(0,eh.parseQuantityText)(o):null,d=i?.unit||l.slice(1)||s;if(i&&i.value>0&&d){let e=(0,el.convertQuantity)(i.value,d,n);if(null!==e&&Number.isFinite(e))return{key:a,value:String(Number(e.toPrecision(12)))}}}let r=`sheet_${t}`;for(let n=2;e?.[r]!=null&&""!==e[r];n++)r=`sheet_${t}_${n}`;return{key:r,value:""}},a=l("width"),o=l("length");return{width:a.value,length:o.value,widthField:a.key,lengthField:o.key}}(c,e?.sheet,i),m=(0,ec.useForm)({shouldUnregister:!0,defaultValues:{mode:e?o?"sheet":"cut"
1:"bulk",groupBy:e?.groupBy??"",width:u.width,length:u.length,sizeUnit:i,allowRotation:e?.sheet?.allowRotation??!1,kerf:(0,el.convertQuantity)(e?.kerf??0,e?.kerfUnit??i,d)??0}}),p=(0,ec.useWatch)({control:m.control,name:"mode"}),[h,x,g]=(0,ec.useWatch)({control:m.control,name:["width","length","sizeUnit"]}),b=Number(h)*Number(x),y=e?.sheet?(0,eu.sheetStockDimensions)(e.sheet,s):null,v=h!==u.width||x!==u.length||g!==i||!y||"error"in y;return(0,t.jsx)(em.Form,{...m,children:(0,t.jsxs)("form",{className:"mt-3 space-y-3",onSubmit:m.handleSubmit(async t=>{m.clearErrors("root");try{if("sheet"===t.mode&&v){if(!a)throw Error("Link Coverage to a product before setting its sheet size.");await a(u,{width:Number(t.width),length:Number(t.length),unit:t.sizeUnit},c??{})}l("bulk"===t.mode?void 0:{..."cut"===t.mode&&t.groupBy.trim()?{groupBy:t.groupBy.trim()}:{},..."sheet"===t.mode?{sheet:{widthField:u.widthField,lengthField:u.lengthField,...!v&&e?.sheet?.unitField?{unitField:e.sheet.unitField}:{},allowRotation:t.allowRotation}}:{},kerf:(0,el.convertQuantity)(t.kerf,d,i)??t.kerf,kerfUnit:i||d})}catch(e){m.setError("root",{message:e instanceof Error?e.message:"Could not save sheet size."})}}),children:[(0,t.jsx)(em.FormField,{control:m.control,name:"mode",render:({field:e})=>(0,t.jsxs)(em.FormItem,{children:[(0,t.jsx)(em.FormLabel,{children:"Ordering"}),(0,t.jsx)(em.FormControl,{children:(0,t.jsxs)("select",{...e,className:eg,"data-test":"table-cutting-mode",children:[(0,t.jsx)("option",{value:"bulk",children:"Round Takeoff ÷ Coverage"}),o?(0,t.jsx)("option",{value:"sheet",children:"Fit pieces onto sheets"}):(0,t.jsx)("option",{value:"cut",children:"Pack individual cut lengths"})]})})]})}),"sheet"===p&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("fieldset",{className:"space-y-2",disabled:m.formState.isSubmitting,children:[(0,t.jsx)("legend",{className:"mb-2 text-sm font-medium",children:"Sheet size"}),(0,t.jsxs)("div",{className:"grid grid-cols-[1fr_1fr_5rem] items-start gap-2",children:[["width","length"].map(e=>(0,t.jsx)(em.FormField,{control:m.control,name:e,rules:{validate:e=>"sheet"!==p||Number.isFinite(Number(e))&&Number(e)>0||"Enter a positive size."},render:({field:n})=>(0,t.jsxs)(em.FormItem,{children:[(0,t.jsx)(em.FormLabel,{className:"text-xs",children:"width"===e?"Width":"Length"}),(0,t.jsx)(em.FormControl,{children:(0,t.jsx)("input",{...n,type:"number",min:"0",step:"any",placeholder:"width"===e?"e.g. 4":"e.g. 8",className:eg})}),(0,t.jsx)(em.FormMessage,{})]})},e)),(0,t.jsx)(em.FormField,{control:m.control,name:"sizeUnit",render:({field:e})=>(0,t.jsxs)(em.FormItem,{children:[(0,t.jsx)(em.FormLabel,{className:"text-xs",children:"Units"}),(0,t.jsx)(em.FormControl,{children:(0,t.jsxs)("select",{...e,className:eg,onChange:t=>{let n=t.target.value;for(let t of["width","length"]){let r=Number(m.getValues(t));r>0&&m.setValue(t,String(Number(((0,el.convertQuantity)(r,e.value??i,n)??r).toPrecision(12))))}e.onChange(n)},children:[(0,t.jsx)("option",{value:"ft",children:"ft"}),(0,t.jsx)("option",{value:"in",children:"in"}),(0,t.jsx)("option",{value:"mm",children:"mm"}),(0,t.jsx)("option",{value:"cm",children:"cm"}),(0,t.jsx)("option",{value:"m",children:"m"})]})})]})})]}),(0,t.jsxs)("p",{className:"text-muted-foreground text-xs",children:[Number(h)>0&&Number(x)>0&&Number.isFinite(b)?`${Number(b.toPrecision(8))} ${g}\xb2 per sheet. `:"Enter the size of one purchased sheet, for example 4 ft × 8 ft. ",v?"Saves the size and Coverage to the linked product for every table that uses it.":u.width&&u.length?"From the linked product.":"Coverage alone does not tell us the sheet shape."]}),v&&!a&&(0,t.jsx)("p",{className:"text-destructive text-xs",role:"alert",children:"Link Coverage to a product to save its sheet size."})]}),(0,t.jsx)(em.FormField,{control:m.control,name:"allowRotation",render:({field:e})=>(0,t.jsxs)(em.FormItem,{className:"flex-row items-center gap-2",children:[(0,t.jsx)(em.FormControl,{children:(0,t.jsx)("input",{className:"size-4 shrink-0",type:"checkbox",checked:e.value,onChange:t=>e.onChange(t.target.checked),"data-test":"table-sheet-rotation"})}),(0,t.jsx)(em.FormLabel,{children:"Allow 90° rotation"})]})}),(0,t.jsx)("p",{className:"text-muted-foreground text-xs",children:"Keep off when grain or panel direction matters."})]}),"cut"===p&&(0,t.jsx)(em.FormField,{control:m.control,name:"groupBy",render:({field:e})=>(0,t.jsxs)(em.FormItem,{children:[(0,t.jsx)(em.FormLabel,{children:"Physical piece property (optional)"}),(0,t.jsx)(em.FormControl,{children:(0,t.jsx)("input",{...e,placeholder:"e.g. bar_id for bent bars",className:eg,"data-test":"table-cutting-group"})}),(0,t.jsx)("p",{className:"text-muted-foreground text-xs",children:"Segments with the same value form one cut. Leave blank for separate members."})]})}),"bulk"!==p&&(0,t.jsx)(em.FormField,{control:m.control,name:"kerf",rules:{min:0,validate:e=>Number.isFinite(e)||"Enter a valid cut loss."},render:({field:e})=>(0,t.jsxs)(em.FormItem,{children:[(0,t.jsxs)(em.FormLabel,{children:["Saw cut width (",d,")"]}),(0,t.jsx)(em.FormControl,{children:(0,t.jsx)("input",{...e,type:"number",min:"0",step:"any",onChange:t=>e.onChange(""===t.target.value?NaN:Number(t.target.value)),className:eg,"data-test":"table-cutting-kerf"})}),(0,t.jsx)(em.FormMessage,{})]})}),m.formState.errors.root&&(0,t.jsx)("p",{role:"alert",className:"text-destructive text-xs",children:m.formState.errors.root.message}),(0,t.jsx)(f.Button,{type:"submit",size:"sm",disabled:m.formState.isSubmitting||"sheet"===p&&v&&!a,"data-test":"table-cutting-save",children:m.formState.isSubmitting?"Saving…":"sheet"===p&&v?"Save size & apply":"Apply"})]})})}let ey=e=>
1e.toLocaleString(void 0,{maximumFractionDigits:3});function ev(){return(0,t.jsxs)("div",{className:"space-y-2 px-4 pt-3 pb-2",children:[(0,t.jsx)("p",{className:"text-muted-foreground text-xs",children:"Best-fit layout. Shaped pieces reserve rectangular blanks; shape trim is not reused."}),(0,t.jsxs)("div",{className:"text-muted-foreground flex flex-wrap gap-x-3 gap-y-1 text-xs",children:[(0,t.jsxs)("span",{children:[(0,t.jsx)("span",{className:"bg-primary/50 mr-1 inline-block size-2 rounded-sm"}),"Pieces"]}),(0,t.jsxs)("span",{children:[(0,t.jsx)("span",{className:"bg-muted mr-1 inline-block size-2 rounded-sm border"}),"Reusable offcuts"]}),(0,t.jsxs)("span",{children:[(0,t.jsx)("span",{className:"mr-1 inline-block size-2 rounded-sm bg-amber-200/60"}),"Shape trim"]})]})]})}function ew({plan:e,lookup:n,index:r,expanded:s,onExpandedChange:l}){let a=e.sheets[r],o=e=>n.revealMany?n.revealMany(e,"fit"):n.reveal(e[0]);return(0,t.jsxs)("div",{"data-test":"table-cut-sheet",className:"border-b px-4 py-3",children:[(0,t.jsxs)("div",{className:"mb-2 flex items-baseline justify-between gap-2 text-xs",children:[(0,t.jsxs)("span",{className:"font-medium",children:["Sheet ",r+1]}),(0,t.jsxs)("span",{className:"text-muted-foreground",children:[a.cuts.length," ",1===a.cuts.length?"piece":"pieces"," ·"," ",ey(e.stockWidth)," × ",ey(e.stockLength)," ",e.unit]})]}),(0,t.jsxs)("svg",{viewBox:`0 0 ${e.stockWidth} ${e.stockLength}`,className:"mx-auto max-h-48 w-full",role:"group","aria-label":`Sheet ${r+1} cutting layout`,"data-test":"table-sheet-layout",children:[(0,t.jsx)("rect",{width:e.stockWidth,height:e.stockLength,className:"fill-background stroke-border",strokeWidth:"1",vectorEffect:"non-scaling-stroke"}),a.offcuts.map((n,r)=>(0,t.jsx)("rect",{x:n.x,y:n.y,width:n.width,height:n.length,className:"fill-muted stroke-border",strokeWidth:"0.5",vectorEffect:"non-scaling-stroke",children:(0,t.jsxs)("title",{children:["Offcut: ",ey(n.width)," × ",ey(n.length)," ",e.unit]})},r)),a.cuts.map((n,r)=>{let s=`${n.id.replace(/^model:[^:]+:/,"")}: ${ey(n.width)} \xd7 ${ey(n.length)} ${e.unit}${n.rotated?", rotated 90°":""}`;return(0,t.jsxs)("g",{role:"button",tabIndex:0,"aria-label":`Fit ${s}`,className:"group cursor-pointer outline-none","data-test":"table-sheet-piece",onClick:()=>o(n.refs),onKeyDown:e=>{("Enter"===e.key||" "===e.key)&&(e.preventDefault(),o(n.refs))},children:[(0,t.jsx)("title",{children:s}),(0,t.jsx)("rect",{x:n.x,y:n.y,width:n.width,height:n.length,className:"stroke-background fill-amber-200/60",strokeWidth:"1",vectorEffect:"non-scaling-stroke"}),(0,t.jsx)("polygon",{points:(n.outline??[[0,0],[n.width,0],[n.width,n.length],[0,n.length]]).map(([e,t])=>`${n.x+e},${n.y+t}`).join(" "),className:"fill-primary/50 stroke-background group-hover:fill-primary/75 group-focus:fill-primary/75",strokeWidth:"1",vectorEffect:"non-scaling-stroke"}),(0,t.jsx)("text",{x:n.x+n.width/2,y:n.y+n.length/2,textAnchor:"middle",dominantBaseline:"central",className:"fill-foreground pointer-events-none",fontSize:Math.min(e.stockWidth/8,n.width/3,n.length/3),children:r+1})]},n.id)})]}),(0,t.jsxs)("details",{className:"mt-2 text-xs",open:s,onToggle:e=>l(e.currentTarget.open),children:[(0,t.jsx)("summary",{className:"text-muted-foreground cursor-pointer",children:"Pieces & offcuts"}),s&&(0,t.jsxs)("div",{className:"mt-2 space-y-1",children:[a.cuts.map((n,r)=>(0,t.jsxs)("button",{type:"button",className:"hover:bg-muted flex w-full items-center gap-2 rounded px-1 py-1 text-left",onClick:()=>o(n.refs),children:[(0,t.jsx)("span",{className:"text-muted-foreground",children:r+1}),(0,t.jsx)("span",{className:"min-w-0 flex-1 truncate",children:n.id.replace(/^model:[^:]+:/,"")}),(0,t.jsxs)("span",{children:[ey(n.width)," × ",ey(n.length)," ",e.unit,n.rotated?" ↻":""]}),(0,t.jsx)(er.Scan,{className:"size-3"})]},n.id)),a.offcuts.map((n,r)=>(0,t.jsxs)("p",{className:"text-muted-foreground px-1",children:["Offcut ",r+1,": ",ey(n.width)," × ",ey(n.length)," ",e.unit]},r)),a.cutLoss>0&&(0,t.jsxs)("p",{className:"text-muted-foreground px-1",children:["Saw loss: ",ey(a.cutLoss)," ",e.unit,"²"]})]})]})]})}let ek=e=>
1e.toLocaleString(void 0,{maximumFractionDigits:3});function ej({cell:e,row:r,unit:s,product:l,productLink:a,lookup:o,onChange:i}){let[c,u]=(0,n.useState)(!1),m=(0,ea.useInstructionRequest)(),p=(0,en.useQueryClient)(),h=e?.cutting,f=e?.sheetCutting,x=!!(h||f),b=f?.sheets.length??h?.stocks.length??0;return(0,t.jsxs)(g.Popover,{open:c,onOpenChange:u,children:[(0,t.jsx)(g.PopoverTrigger,{asChild:!0,children:(0,t.jsxs)("button",{type:"button","data-test":"table-cutting-open",title:r.cutting?"Inspect cutting plan":"Stock cutting settings",className:"text-muted-foreground hover:text-foreground inline-flex items-center gap-1 rounded px-1 py-0.5 text-xs",onClick:e=>e.stopPropagation(),children:[(0,t.jsx)(es.Scissors,{className:"size-3.5"}),r.cutting?"Cuts":null]})}),(0,t.jsxs)(g.PopoverContent,{align:"end",collisionPadding:12,className:"flex w-[420px] max-w-[calc(100vw-1.5rem)] flex-col overflow-hidden p-0",style:{maxHeight:"min(32rem, 75dvh, var(--radix-popover-content-available-height))"},"data-test":"table-cutting-panel",onClick:e=>e.stopPropagation(),children:[(0,t.jsxs)("div",{className:"relative shrink-0 border-b py-3 pr-10 pl-4",children:[(0,t.jsx)("button",{type:"button","aria-label":"Close cutting plan","data-test":"table-cutting-close",onClick:()=>u(!1),className:"text-muted-foreground hover:bg-muted absolute top-2 right-2 rounded p-1",children:(0,t.jsx)(d.X,{className:"size-4"})}),(0,t.jsx)("div",{className:"font-medium",children:f?`${f.sheets.length} ${1===f.sheets.length?"sheet":"sheets"}`:h?`${h.stocks.length} stock lengths`:"Stock cutting"}),(0,t.jsx)("p",{className:"text-muted-foreground mt-1 text-xs",children:f?`${ek(f.stockWidth)} \xd7 ${ek(f.stockLength)} ${f.unit} each \xb7 ${ek(f.remaining)} ${f.unit}\xb2 reusable offcuts`:h?`${ek(h.stockLength)} ${h.unit} each \xb7 ${ek(h.installed)} ${h.unit} installed \xb7 ${ek(h.waste)} ${h.unit} left over`:r.cutting&&(0,el.quantityUnit)(s)?.dimension===2?"Set the purchased sheet size to generate a cutting layout.":"Quantity uses the Takeoff and Coverage columns."}),f&&(0,t.jsxs)("p",{className:"text-muted-foreground mt-1 text-xs",children:[ek(f.installed)," ",f.unit,"² installed",f.trim>0?` \xb7 ${ek(f.trim)} ${f.unit}\xb2 shape trim`:"",f.cutLoss>0?` \xb7 ${ek(f.cutLoss)} ${f.unit}\xb2 saw loss`:""]}),e?.ordering&&(0,el.quantityUnit)(s)?.dimension!==2&&(0,t.jsxs)("p",{className:"text-muted-foreground mt-1 text-xs","data-test":"table-order-units",children:[e.ordering.takeoffUnit||"Count"," →"," ",ek(e.ordering.coverage.value)," ",e.ordering.coverage.unit,"/",e.ordering.purchaseUnit,e.ordering.coverage.unit!==e.ordering.takeoffUnit?` = ${ek(e.ordering.normalizedCoverage)} ${e.ordering.takeoffUnit}/${e.ordering.purchaseUnit}
1`:""]})]}),(0,t.jsx)(ed,{count:b,estimateSize:f?285:62,header:(0,t.jsxs)(t.Fragment,{children:[i&&(0,t.jsxs)("details",{className:"border-b px-4 py-2",open:!x,children:[(0,t.jsx)("summary",{className:"cursor-pointer text-xs font-medium",children:"Cutting settings"}),c&&(0,t.jsx)(eb,{settings:r.cutting,unit:s,product:l,onChange:e=>{i(e),e||u(!1)},onSaveSize:l&&a?async(e,t,n)=>{let r=await ex(m,a,n,e,t);(0,eo.patchLibraryRow)(p,r.libraryId,a.rowId,e=>({...e,data:r.data})),(0,eo.publishLibraryWrite)(p,{kind:"row-data",libraryId:r.libraryId}),r.columnsChanged&&(0,eo.publishLibraryWrite)(p,{kind:"columns",libraryId:r.libraryId}),await p.refetchQueries({queryKey:eo.libraryKeys.linkedRows(),type:"active"},{cancelRefetch:!1})}:void 0},`${a?.rowId??""}:${JSON.stringify(r.cutting)}`)]}),e?.problem?.reason==="expr_invalid"&&(0,t.jsx)("p",{className:"text-destructive px-4 py-3 text-sm",role:"alert",children:e.problem.message}),f&&(0,t.jsx)(ev,{}),h&&(0,t.jsx)("p",{className:"text-muted-foreground px-4 py-2 text-xs",children:"Recalculated from the current pieces and selected stock. Best-fit packing; not a guarantee of the fewest possible stock lengths."})]}),renderItem:(e,n,r)=>f?(0,t.jsx)(ew,{plan:f,lookup:o,index:e,expanded:n,onExpandedChange:r}):h?(0,t.jsx)(eN,{plan:h,lookup:o,index:e,expanded:n,onExpandedChange:r}):null})]})]})}function eN({plan:e,lookup:n,index:r,expanded:s,onExpandedChange:l}){let a=e.stocks[r];return(0,t.jsxs)("details",{className:"border-b px-4 py-2","data-test":"table-cut-stock",open:s,onToggle:e=>l(e.currentTarget.open),children:[(0,t.jsxs)("summary",{className:"cursor-pointer text-xs",children:[(0,t.jsxs)("span",{className:"font-medium",children:["Stock ",r+1]})," ·"," ",a.cuts.length," ",1===a.cuts.length?"cut":"cuts"," ·"," ",ek(a.remaining)," ",e.unit," left",a.cutLoss>0?` \xb7 ${ek(a.cutLoss)} ${e.unit} cut loss`:"",(0,t.jsx)("span",{className:"bg-muted mt-2 flex h-3 w-full overflow-hidden rounded","aria-hidden":!0,children:a.cuts.map(n=>(0,t.jsx)("span",{className:"bg-primary/55 border-background border-r",style:{width:`${100*n.length/e.stockLength}%`}},n.id))})]}),s&&(0,t.jsx)("div",{className:"mt-2 space-y-1",children:a.cuts.map(r=>(0,t.jsxs)("button",{type:"button","data-test":"table-cut-piece",className:"hover:bg-muted flex w-full items-center gap-2 rounded px-2 py-1 text-left text-xs",onClick:()=>n.revealMany?n.revealMany(r.refs,"fit"):n.reveal(r.refs[0]),children:[(0,t.jsx)("span",{className:"min-w-0 flex-1 truncate",children:r.id.replace(/^model:[^:]+:/,"")}),(0,t.jsxs)("span",{children:[ek(r.length)," ",e.unit]}),(0,t.jsx)(er.Scan,{className:"size-3"})]},r.id))})]})}e.s(["CuttingPlanPopover",()=>ej],821695);let eS=(0,ee.default)("boxes",[["path",{d:"M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z",key:"lc1i9w"}],["path",{d:"m7 16.5-4.74-2.85",key:"1o9zyk"}],["path",{d:"m7 16.5 5-3",key:"va8pkn"}],["path",{d:"M7 16.5v5.17",key:"jnp8gn"}],["path",{d:"M12 13.5V19l3.97 2.38a2 2 0 0 0 2.06 0l3-1.8a2 2 0 0 0 .97-1.71v-3.24a2 2 0 0 0-.97-1.71L17 10.5l-5 3Z",key:"8zsnat"}],["path",{d:"m17 16.5-5-3",key:"8arw3v"}],["path",{d:"m17 16.5 4.74-2.85",key:"8rfmw"}],["path",{d:"M17 16.5v5.17",key:"k6z78m"}],["path",{d:"M7.97 4.42A2 2 0 0 0 7 6.13v4.37l5 3 5-3V6.13a2 2 0 0 0-.97-1.71l-3-1.8a2 2 0 0 0-2.06 0l-3 1.8Z",key:"1xygjf"}],["path",{d:"M12 8 7.26 5.15",key:"1vbdud"}],["path",{d:"m12 8 4.74-2.85",key:"3rx089"}],["path",{d:"M12 13.5V8",key:"1io7kd"}]]);e.s(["Boxes",()=>eS],17056)},778768,e=>{"use strict";let t=(0,e.i(607655).default)("focus",[["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}],["path",{d:"M3 7V5a2 2 0 0 1 2-2h2",key:"aa7l1z"}],["path",{d:"M17 3h2a2 2 0 0 1 2 2v2",key:"4qcy5o"}],["path",{d:"M21 17v2a2 2 0 0 1-2 2h-2",key:"6vwrx8"}],["path",{d:"M7 21H5a2 2 0 0 1-2-2v-2",key:"ioqczr"}]]);e.s(["Focus",()=>t],778768)},482796,e=>{"use strict";var t=e.i(391610),n=e.i(138415),r=e.i(638437),s=e.i(272875),l=e.i(735924),a=e.i(635984),o=e.i(22154),i=e.i(885129),d=e.i(88163),c=e.i(475485),u=e.i(689182),m=e.i(745045),p=e.i(728387),h=e.i(905844),f=e.i(523723),x=e.i(100655),g=e.i(470795),b=e.i(739351),y=e.i(502916);e.i(206609);var v=e.i(939301),w=e.i(536566),k=e.i(180152),j=e.i(530926),N=e.i(21837),S=e.i(722768),C=e.i(695679);e.i(986406);var T=e.i(41802),I=e.i(518216),F=e.i(792118),$=e.i(887069),M=e.i(7205),_=e.i(383778);e.i(831597);var P=e.i(779342),z=e.i(275879),L=e.i(687123);e.i(53759);var E=e.i(541048),D=e.i(81067),R=e.i(614547),O=e.i(190034),A=e.i(786775),B=e.i(553806),K=e.i(1671
177),V=e.i(252404),q=e.i(607393),U=e.i(802230),H=e.i(163130),W=e.i(212659),Q=e.i(535141),J=e.i(39952),G=e.i(414235),X=e.i(503159),Y=e.i(633129),Z=e.i(404717),ee=e.i(828296),et=e.i(2191),en=e.i(981449),er=e.i(331570),es=e.i(821695),el=e.i(17056);e.i(577630);var ea=e.i(455852),eo=e.i(236610),ei=e.i(883872),ed=e.i(275346),ec=e.i(778768),eu=e.i(497243),em=e.i(376305),ep=e.i(254958);let eh=(e,t)=>e.localeCompare(t,void 0,{numeric:!0,sensitivity:"base"});function ef(e,t,n){let r=n.trim().toLocaleLowerCase().split(/\s+/).filter(Boolean),s=new Map;for(let n of e){let{mark:e,deduction:l}=n,a=[e.id,e.type,e.model.preset,...e.model.tags??[],...Object.entries(e.model.properties??{}).flat()].join(" ").toLocaleLowerCase();if(!r.every(e=>a.includes(e)))continue;let o=t.startsWith("property:")?e.model.properties?.[t.slice("property:".length)]:"preset"===t?e.model.preset:"tags"===t?[...e.model.tags??[]].sort(eh).join(", "):"All members",i=null==o||""===o?"Unassigned":String(o),d=JSON.stringify([i,l]),c=s.get(d)??{key:d,label:i,deduction:l,entries:[]};c.entries.push(n),s.set(d,c)}return[...s.values()].sort((e,t)=>Number(e.deduction)-Number(t.deduction)||eh(e.label,t.label))}function ex({lookup:e,evidence:r}){let{t:s}=(0,ea.useTranslation)("drawings"),l=(0,n.useMemo)(()=>(function(e,t){let n=[];for(let r of[!1,!0])for(let s of new Set(r?e.deductions:e.marks)){let l=t(s);l?.model&&n.push({ref:s,mark:{...l,model:l.model},deduction:r,quantity:e.quantities?.[s],colors:e.colors?.[s]})}return n.sort((e,t)=>eh(e.mark.type,t.mark.type)||eh(e.ref,t.ref))})(r,t=>e.get(t)),[r,e]),a=(0,n.useId)(),o=(0,n.useMemo)(()=>(function(e){let t=new Set;for(let{mark:n}of e)for(let[e,r]of Object.entries(n.model.properties??{}))null!==r&&""!==r&&t.add(e);let n=["scope","level","wall","material","stock_sku"];return[...e.some(({mark:e})=>e.model.preset)?[{key:"preset",label:"Preset"}]:[],...[...t].sort((e,t)=>{let r=e=>n.includes(e)?n.indexOf(e):n.length;return r(e)-r(t)||eh(e,t)}).map(e=>({key:`property:${e}`,label:e.replaceAll("_"," ")})),...e.some(({mark:e})=>e.model.tags?.length)?[{key:"tags",label:"Tags"}]:[],{key:"all",label:"All members"}]})(l),[l]),i={open:!1,query:"",groupBy:o[0].key,expanded:null,page:0,groupLimit:24,selected:[],viewer:(0,K.lastViewerView)()},d=(0,n.useCallback)((e,t)=>{if(t?.source==="viewer-page")return{...e,viewer:t.facets};if(t?.source!=="model")return e;let{facets:n}=t,r=new Set(n.memberIds??(n.memberId?[n.memberId]:[])),s=l.filter(({mark:e})=>e.model.id===n.modelId&&e.model.versionId===n.sourceVersionId&&e.model.revision===n.modelRevision&&r.has(e.id)).map(({ref:e})=>e);if(!s.length)return{...e,selected:[]};let a=ef(l,e.groupBy,""),o=a.findIndex(e=>e.entries.some(({ref:e})=>s.includes(e))),i=a[o];return{...e,query:"",expanded:i.key,page:Math.floor(i.entries.findIndex(({ref:e})=>s.includes(e))/24),groupLimit:Math.max(24,o+1),selected:s}}
1,[l]),[c,u]=(0,n.useState)(()=>d(i,(0,K.getLastSelection)()));(0,n.useEffect)(()=>(0,K.subscribeSelection)(e=>{u(t=>d(t,e))}),[d]);let m=o.some(e=>e.key===c.groupBy)?c.groupBy:o[0].key,p=ef(l,m,c.query),h=new Set(l.map(({ref:e})=>e)).size,f=new Set(p.flatMap(e=>e.entries.map(({ref:e})=>e))).size,x=[...new Set(p.flatMap(e=>e.entries.map(({ref:e})=>e)))],g=new Set(c.selected),y=x.filter(e=>g.has(e)),v=y.length?y:x,w=e.get(v[0]??l[0]?.ref??"")?.model,k=!!w&&c.viewer?.modelId===w.id&&c.viewer?.sourceVersionId===w.versionId&&c.viewer?.modelRevision===w.revision&&!!c.viewer?.isolatedMemberIds?.length,j=(t,n="fit")=>{e.revealMany?e.revealMany(t,n):t[0]&&e.reveal(t[0])},N=e=>{u(t=>({...t,selected:e})),j(e,k?"isolate":"fit")};return(0,t.jsxs)("div",{className:"flex min-h-0 min-w-0 flex-col gap-3 px-4 py-3 text-xs","data-test":"model-evidence-browser",onClick:e=>e.stopPropagation(),onPointerDown:e=>e.stopPropagation(),children:[(0,t.jsxs)("div",{className:"flex shrink-0 items-center justify-between gap-2","data-test":"model-evidence-navigation",children:[(0,t.jsxs)("div",{className:"flex min-w-0 flex-1 items-center gap-1",children:[(0,t.jsxs)("button",{type:"button","data-test":"model-evidence-toggle","aria-expanded":c.open,"aria-controls":a,className:"hover:bg-accent flex min-w-0 flex-1 items-center gap-2 rounded-md py-1.5 text-left font-medium",onClick:()=>u(e=>({...e,open:!e.open})),children:[c.open?(0,t.jsx)(Y.ChevronDown,{className:"size-3.5 shrink-0","aria-hidden":!0}):(0,t.jsx)(ed.ChevronRight,{className:"size-3.5 shrink-0","aria-hidden":!0}),(0,t.jsx)("span",{className:"truncate","data-test":"model-evidence-count",children:y.length?(0,t.jsx)(L.Trans,{i18nKey:"drawings:modelEvidence.selectedCount",defaults:"{{count}} selected",values:{count:y.length}}):(0,t.jsx)(L.Trans,{i18nKey:"drawings:modelEvidence.members",defaults:"{{count}} members",values:{count:f===h?f:`${f} of ${h}`}})})]}),!!y.length&&(0,t.jsx)("button",{type:"button",className:"hover:bg-accent rounded p-1","data-test":"model-evidence-clear-selection","aria-label":s("modelEvidence.clearSelection","Use all matching members"),title:s("modelEvidence.clearSelection","Use all matching members"),onClick:()=>u(e=>({...e,selected:[]})),children:(0,t.jsx)(b.X,{className:"size-3"})})]}),(0,t.jsxs)("div",{className:"flex shrink-0 items-center gap-1",children:[(0,t.jsxs)("button",{type:"button",className:"hover:bg-accent inline-flex h-8 items-center gap-1.5 rounded-md px-2 font-medium disabled:opacity-40","data-test":"model-evidence-fit",disabled:!v.length,onClick:()=>j(v),children:[(0,t.jsx)(eu.Scan,{className:"size-3.5","aria-hidden":!0}),(0,t.jsx)(L.Trans,{i18nKey:"drawings:modelEvidence.fit",defaults:"Fit"})]}),(0,t.jsxs)("button",{type:"button",className:"hover:bg-accent aria-pressed:bg-accent aria-pressed:text-foreground inline-flex h-8 items-center gap-1.5 rounded-md px-2 font-medium disabled:opacity-40","data-test":"model-evidence-isolate","aria-pressed":k,disabled:!v.length&&!k||!e.revealMany,title:k?s("modelEvidence.restoreVisibility","Restore visibility"):s("modelEvidence.isolateHint","Isolate these members in the active view"),onClick:()=>j(v.length?v:x.length?x:l.map(({ref:e})=>e),k?"unisolate":"isolate"),children:[(0,t.jsx)(ec.Focus,{className:"size-3.5","aria-hidden":!0}),(0,t.jsx)(L.Trans,{i18nKey:"drawings:modelEvidence.isolate",defaults:"Isolate"})]})]})]}),c.open&&(0,t.jsxs)("div",{id:a,className:"flex min-h-0 flex-col gap-2 border-t pt-3","data-test":"model-evidence-details",children:[(0,t.jsxs)("div",{className:"flex shrink-0 items-center gap-2",children:[(0,t.jsxs)("div",{className:"relative min-w-0 flex-1",children:[(0,t.jsx)(em.Search,{className:"text-muted-foreground pointer-events-none absolute top-2.5 left-3 size-4","aria-hidden":!0}),(0,t.jsx)("input",{type:"search","aria-label":s("modelEvidence.searchLabel","Search members, tags and properties"),placeholder:s("modelEvidence.searchPlaceholder","Search members…"),className:"bg-background focus-visible:ring-ring h-9 w-full rounded-md border pr-3 pl-9 text-sm outline-none focus-visible:ring-2",value:c.query,"data-test":"model-evidence-search",onChange:e=>u(t=>
1({...t,query:e.target.value,selected:[],expanded:null,page:0,groupLimit:24}))})]}),(0,t.jsx)("select",{"aria-label":s("modelEvidence.groupLabel","Group contributing model members"),className:"bg-background text-foreground h-9 w-28 min-w-0 shrink-0 rounded-md border px-2 text-xs",value:m,"data-test":"model-evidence-group-by",onChange:e=>u(t=>({...t,groupBy:e.target.value,selected:[],expanded:null,page:0,groupLimit:24})),children:o.map(e=>(0,t.jsx)("option",{value:e.key,children:e.key.startsWith("property:")?e.label:s(`modelEvidence.group.${e.key}`,e.label)},e.key))})]}),(0,t.jsxs)("div",{className:"max-h-[min(22rem,45vh)] min-h-0 overflow-y-auto overscroll-contain","data-test":"model-evidence-groups",children:[p.slice(0,c.groupLimit).map(e=>{var n;let r,l=e.key===c.expanded,a=(n=e.entries,(r=n[0]?.quantity)&&n.every(e=>e.quantity===r)?r:null),o=Math.ceil(e.entries.length/24),i=l?Math.min(c.page,o-1):0;return(0,t.jsxs)("div",{className:"border-t first:border-t-0","data-test":"model-evidence-group","data-group-label":e.label,children:[(0,t.jsxs)("div",{className:"flex items-center gap-1 py-1",children:[(0,t.jsx)("button",{type:"button","aria-expanded":l,"aria-label":s("modelEvidence.expandGroup","Expand {{label}}",{label:e.label}),className:"hover:bg-accent shrink-0 rounded-md p-1.5","data-test":"model-evidence-expand",onClick:()=>u(t=>({...t,expanded:l?null:e.key,page:0})),children:l?(0,t.jsx)(Y.ChevronDown,{className:"size-3"}):(0,t.jsx)(ed.ChevronRight,{className:"size-3"})}),(0,t.jsxs)("button",{type:"button",className:(0,E.cn)("hover:bg-accent flex min-w-0 flex-1 items-center gap-2 rounded-md px-2 py-2 text-left",e.entries.every(({ref:e})=>g.has(e))&&"bg-accent"),"data-test":"model-evidence-select-group","aria-pressed":e.entries.every(({ref:e})=>g.has(e)),title:s("modelEvidence.fitGroup","Fit {{label}} in the drawing",{label:e.label}),onClick:()=>N(e.entries.map(({ref:e})=>e)),children:[(0,t.jsxs)("span",{className:"truncate",children:[e.deduction?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(L.Trans,{i18nKey:"drawings:modelEvidence.deduct",defaults:"Deduct"})," ","·"," "]}):null,e.label]}),(0,t.jsx)("span",{className:"text-muted-foreground bg-muted shrink-0 rounded px-1.5 py-0.5 text-[11px] tabular-nums",children:e.entries.length}),a?(0,t.jsx)("span",{className:"text-muted-foreground ml-auto truncate",children:(0,t.jsx)(L.Trans,{i18nKey:"drawings:modelEvidence.each",defaults:"{{quantity}} each",values:{quantity:a}})}):null]})]}),l?(0,t.jsxs)("div",{className:"mb-2 ml-1 border-l pl-2",children:[e.entries.slice(24*i,(i+1)*24).map(e=>(0,t.jsxs)("button",{type:"button",className:(0,E.cn)("hover:bg-accent flex w-full items-center gap-2 rounded-md px-2 py-2 text-left",g.has(e.ref)&&"bg-accent"),"data-test":"table-evidence-member","data-member-ref":e.ref,title:s("modelEvidence.fitMember","Fit {{label}} in the drawing",{label:e.mark.type}),"aria-pressed":g.has(e.ref),onClick:()=>N([e.ref]),children:[e.colors?(0,t.jsx)("span",{"aria-hidden":!0,className:"size-2 shrink-0 rounded-sm border",style:{borderColor:e.colors.stroke??e.colors.fill,backgroundColor:e.colors.fill??"transparent"},"data-test":"evidence-swatch"}):null,(0,t.jsx)("span",{className:"min-w-0 flex-1 truncate",children:e.mark.type}),(0,t.jsxs)("span",{className:"text-muted-foreground shrink-0 tabular-nums",children:[e.deduction?"− ":"",e.quantity]})]},`${e.ref}:${e.deduction}`)),o>1?(0,t.jsxs)("div",{className:"text-muted-foreground flex items-center justify-end gap-2 pt-1",children:[(0,t.jsx)("button",{type:"button",className:"hover:text-foreground disabled:opacity-40",disabled:0===i,onClick:()=>u(e=>({...e,page:i-1})),children:(0,t.jsx)(L.Trans,{i18nKey:"drawings:modelEvidence.previous",defaults:"Previous"})}),(0,t.jsxs)("span",{children:[i+1," / ",o]}),(0,t.jsx)("button",{type:"button",className:"hover:text-foreground disabled:opacity-40",disabled:i===o-1,onClick:()=>u(e=>({...e,page:i+1})),children:(0,t.jsx)(L.Trans,{i18nKey:"drawings:modelEvidence.next",defaults:"Next"})})]}):null]}):null]},e.key)}),f?null:(0,t.jsx)("p",{className:"text-muted-foreground py-2",children:(0,t.jsx)(L.Trans,{i18nKey:"drawings:modelEvidence.noMatches",defaults:"No contributing members match this search."})}),p.length>c.groupLimit?(0,t.jsx)("button",{type:"button",className:"hover:bg-accent w-full rounded py-1",onClick:()=>u(e=>({...e,groupLimit:e.groupLimit+24})),children:(0,t.jsx)(L.Trans,{i18nKey:"drawings:modelEvidence.moreGroups",defaults:"Show more groups ({{count}} remaining)",values:{count:p.length-c.groupLimit}})}):null]})]})]})}function eg(e,t){return t.marks.some(t=>e.get(t)?.model)||(t.deductions?.some(t=>e.get(t)?.model)??!1)}function eb({lookup:e,evidence:r,excludedReasons:s,label:l,quantity:a,open:o,onOpenChange:i}){let{t:d}=(0,ea.useTranslation)("drawings"),c=(0,n.useRef)(!1);return(0,t.jsxs)(_.Popover,{open:o,onOpenChange:i,children:[(0,t.jsx)(_.PopoverTrigger,{asChild:!0,children:(0,t.jsxs)("button",{type:"button","data-test":"table-cell-members","aria-label":d("modelEvidence.open","Browse members for {{label}}",{label:l}),className:"text-muted-foreground hover:bg-accent hover:text-foreground data-[state=open]:bg-accent data-[state=open]:text-foreground inline-flex h-7 min-w-7 items-center gap-1 overflow-hidden rounded px-1.5 font-sans text-[11px] font-medium",onClick:e=>{c.current=!0,e.stopPropagation()},onPointerDown:e=>e.stopPropagation(),children:[(0,t.jsx)(el.Boxes,{className:"size-3.5 shrink-0","aria-hidden":!0}),(0,t.jsx)("span",{className:"truncate",children:(0,t.jsx)(L.Trans,{i18nKey:"drawings:modelEvidence.browse",defaults:"Members"})})]})}),(0,t.jsxs)(_.PopoverContent,{align:"end",side:"top",sideOffset:8,collisionPadding:12,className:"flex max-h-[var(--radix-popover-content-available-height)] w-[26rem] max-w-[calc(100vw-1.5rem)] flex-col overflow-hidden rounded-xl p-0 font-sans","data-test":"model-evidence-popover","aria-label":d("modelEvidence.breakdown","Member breakdown"),onOpenAutoFocus:e=>{if(e.preventDefault(),!c.current)return;let t=e.target instanceof HTMLElement?e.target.querySelector('[data-test="model-evidence-toggle"]'):null;t?.focus()},onCloseAutoFocus:e=>{c.current||e.preventDefault(),c.current=!1},onClick:e=>e.stopPropagation(),onPointerDown:e=>e.stopPropagation(),children:[(0,t.jsxs)("div",{className:"flex shrink-0 items-start justify-between gap-3 border-b px-4 py-3",children:[(0,t.jsxs)("div",{className:"min-w-0",children:[(0,t.jsx)("p",{className:"truncate text-sm font-medium",title:l,children:l}),(0,t.jsx)("p",{className:"text-muted-foreground mt-0.5 text-xs","data-test":"model-evidence-quantity",children:a})]}),(0,t.jsx)("button",{type:"button",className:"text-muted-foreground hover:bg-accent hover:text-foreground rounded-md p-1.5","aria-label":d("modelEvidence.close","Close member breakdown"),onClick:()=>i(!1),"data-test":"model-evidence-close",children:(0,t.jsx)(b.X,{className:"size-4","aria-hidden":!0})})]}),o?(0,t.jsx)(eT,{lookup:e,evidence:r,excludedReasons:s}):null]})]})}
1function ey(e,t,n){let r=e?.evidence;if(!r)return null;if(!t||0===t.length)return r;let s=new Set;for(let e of t){let t=e.cells[n]?.evidence;if(t){for(let e of t.marks)s.add(e);for(let e of t.deductions??[])s.add(e)}}let l=r.marks.filter(e=>!s.has(e)),a=(r.deductions??[]).filter(e=>!s.has(e));if(0===l.length&&0===a.length)return null;let{deductions:o,...i}=r;return{...i,marks:l,...a.length>0?{deductions:a}:{}}}function ev(e,t){return e.get(t)?.type??"mark"}function ew(e){if(!e)return[];let t=[],n=e=>{let t=`${e.count} mark${1===e.count?"":"s"}`,n=function(e){if(0===e.length)return"";if(1===e.length)return`page ${e[0]}`;let t=e.slice(0,-1).join(", ");return`pages ${t} and ${e[e.length-1]}`}(e.pages);return""===n?t:`${t} on ${n}`};if(e.uncalibrated){let r=e.uncalibrated;t.push(`${n(r)} — no scale. Calibrate for ${function(e){switch(e){case"length":return"lengths";case"volume":return"volumes";default:return"areas"}}(r.dimension)}.`)}if(e.no_geometry){let r=e.no_geometry;t.push(`${n(r)} — no ${function(e){switch(e){case"length":return"length";case"volume":return"area to build a volume from";default:return"area"}}(r.dimension)}.`)}return e.missing_depth&&t.push(`${n(e.missing_depth)} — no depth set.`),e.missing_property&&t.push(`${n(e.missing_property)} — no value for the tag this weighs by.`),t}function ek({lookup:e,count:n,reasons:r,cell:s}){let l=ew(r),a=(s?.marks??[]).find(e=>s?.quantities?.[e]===void 0),o=void 0!==a&&void 0!==e.get(a);return(0,t.jsx)(ei.TooltipProvider,{delayDuration:200,children:(0,t.jsxs)(ei.Tooltip,{children:[(0,t.jsx)(ei.TooltipTrigger,{asChild:!0,children:(0,t.jsxs)("button",{type:"button",disabled:!o,className:"inline-flex shrink-0 items-center gap-0.5 font-mono text-[10px] text-amber-600 disabled:cursor-default dark:text-amber-400",onClick:t=>{t.stopPropagation(),a&&e.reveal(a)},"data-test":"table-cell-excluded",children:[(0,t.jsx)(ee.TriangleAlert,{className:"h-2.5 w-2.5"}),n]})}),(0,t.jsx)(ei.TooltipContent,{side:"bottom",className:"max-w-72 text-[11px]",children:(0,t.jsxs)("span",{className:"flex flex-col gap-1",children:[l.length>0?l.map(e=>(0,t.jsx)("span",{children:e},e)):(0,t.jsxs)("span",{children:[n," mark",1===n?"":"s"," matched but could not be measured."]}),o?(0,t.jsx)("span",{className:"text-muted-foreground",children:"Click to show one."}):null]})})]})})}function ej({names:e,nearest:n}){return(0,t.jsx)(t.Fragment,{children:e.map(e=>{let r="tag"===e.kind?n?.(e.text):null,s="tag"===e.kind?`Nothing in this version is tagged “${e.text}”`:"property"===e.kind?`No mark carries a property called “${e.text}”`:`Nothing is ${e.text}`;return(0,t.jsxs)("span",{children:[s,", so it contributes nothing",r?` — did you mean “${r}”?`:"."]},`${e.kind}:${e.text}`)})})}function eN({unit:e,authored:n=!1,message:r,onPick:s}){return(0,t.jsxs)(eo.DropdownMenu,{children:[(0,t.jsx)(eo.DropdownMenuTrigger,{asChild:!0,children:(0,t.jsx)("button",{type:"button",title:e?`${e}${n?" — set by hand":" — from the formula"}; click to change`:`${r} — pick the unit`,className:(0,E.cn)("inline-flex shrink-0 items-center gap-0.5 font-mono",e?"text-muted-foreground hover:text-foreground hover:underline hover:decoration-dotted hover:underline-offset-2":"text-[10px] text-amber-600 dark:text-amber-400"),onPointerDown:e=>e.stopPropagation(),onClick:e=>e.stopPropagation(),"data-test":e?"table-cell-unit":"table-cell-problem",...e?{}:{"data-problem":"unit_unknown"},children:e??(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(ee.TriangleAlert,{className:"h-2.5 w-2.5"}),"units?"]})})}),(0,t.jsxs)(eo.DropdownMenuContent,{align:"end",className:"min-w-0",onClick:e=>e.stopPropagation(),onPointerDown:e=>e.stopPropagation(),onCloseAutoFocus:e=>e.preventDefault(),children:[n?(0,t.jsx)(eo.DropdownMenuItem,{className:"justify-center px-1.5 py-1 text-[11px]",onSelect:()=>s(null),"data-test":"cell-unit-derived",children:"From the formula"}):null,(0,t.jsx)("div",{className:"grid grid-cols-4 gap-0.5 p-1",children:en.TAKEOFF_UNITS.map(n=>(0,t.jsx)(eo.DropdownMenuItem,{className:(0,E.cn)("justify-center px-1.5 py-1 font-mono text-[11px]",e===n&&"bg-accent"),onSelect:()=>s(n),"data-test":"cell-unit-option",children:n},n))})]})]})}function eS({problem:e,nearest:n,onPickUnit:r}){let s="unknown_names"===e.reason||"unit_unknown"===e.reason;return"unit_unknown"===e.reason&&r?(0,t.jsx)(eN,{message:e.message,onPick:r}):(0,t.jsx)(ei.TooltipProvider,{delayDuration:200,children:(0,t.jsxs)(ei.Tooltip,{children:[(0,t.jsx)(ei.TooltipTrigger,{asChild:!0,children:(0,t.jsxs)("span",{tabIndex:0,className:(0,E.cn)("inline-flex shrink-0 items-center gap-0.5 font-mono text-[10px]",s?"text-amber-600 dar
1k:text-amber-400":"text-destructive"),"data-test":"table-cell-problem","data-problem":e.reason,children:[(0,t.jsx)(ee.TriangleAlert,{className:"h-2.5 w-2.5"}),"unknown_names"===e.reason?"name?":"unit_unknown"===e.reason?"units?":"expr_invalid"===e.reason?"formula?":"math?"]})}),(0,t.jsx)(ei.TooltipContent,{side:"bottom",className:"max-w-72 text-[11px]",children:(0,t.jsx)("span",{className:"flex flex-col gap-1",children:"unknown_names"===e.reason?(0,t.jsx)(ej,{names:e.names,nearest:n}):"unit_unknown"===e.reason?(0,t.jsxs)("span",{children:[e.message," — no unit."]}):"expr_invalid"===e.reason?(0,t.jsxs)("span",{children:["This formula does not parse, so the cell stays empty however much gets drawn — ",e.message,"."]}):"divide_by_zero"===e.reason?(0,t.jsx)("span",{children:"This formula divides by zero, so it has no answer — the marks it counts are fine. Change the divisor."}):(0,t.jsx)("span",{children:"This formula overflowed to a number too large to hold. Check the multipliers."})})})]})})}function eC({lookup:e,markRef:n,quantity:r,colors:s,deduction:l}){return(0,t.jsxs)("button",{type:"button",className:(0,E.cn)("text-muted-foreground hover:bg-accent inline-flex items-center gap-1 rounded border border-dashed px-1.5 py-0.5 font-mono text-[10px]",l&&"text-destructive/80"),"data-test":"table-evidence-member","data-member-ref":n,onClick:()=>e.reveal(n),title:`${ev(e,n)}${l?" — deduction":""} — reveal on canvas`,children:[s?(0,t.jsx)("span",{"aria-hidden":!0,className:"h-2 w-2 shrink-0 rounded-[3px] border",style:{borderColor:s.stroke??s.fill,backgroundColor:s.fill??"transparent"},"data-test":"evidence-swatch"}):null,(0,t.jsxs)("span",{children:[l?"− ":"",ev(e,n),r?`: ${r}`:""]})]})}function eT({lookup:e,evidence:n,excludedReasons:r}){let s=ew(r),l=new Set([...n.marks,...n.deductions??[]].filter(t=>e.get(t)?.model));return(0,t.jsxs)("div",{className:"flex min-h-0 flex-col gap-0.5 py-0.5","data-test":"evidence-peek",children:[l.size?(0,t.jsx)(ex,{lookup:e,evidence:n}):null,(0,t.jsxs)("div",{className:(0,E.cn)("flex flex-wrap items-center gap-1 empty:hidden",l.size>0&&"px-4 pb-2"),children:[n.marks.filter(e=>!l.has(e)).map(r=>(0,t.jsx)(eC,{lookup:e,markRef:r,quantity:n.quantities?.[r],colors:n.colors?.[r]},r)),(n.deductions??[]).filter(e=>!l.has(e)).map(r=>(0,t.jsx)(eC,{lookup:e,markRef:r,quantity:n.quantities?.[r],colors:n.colors?.[r],deduction:!0},`deduct:${r}`)),0===n.marks.length&&(n.deductions?.length??0)===0?(0,t.jsx)("span",{className:"text-muted-foreground font-mono text-[10px]",children:"no evidence yet — draw tagged marks and they land here"}):null]}),s.map(e=>(0,t.jsx)("p",{className:"font-mono text-[10px] text-amber-600 dark:text-amber-400","data-test":"evidence-excluded-reason",children:e},e))]})}function eI(e){let t=e=>e&&"object"==typeof e&&!Array.isArray(e)&&"tag"===e.on&&"eq"===e.op&&"string"==typeof e.value&&""!==e.value.trim()?e.value.trim():null;if("or"in e&&Array.isArray(e.or))return e.or.flatMap(e=>eI(e));if("and"in e&&Array.isArray(e.and)){let n=e.and.map(t).filter(e=>null!==e);return n.length>0?[n]:[]}let n=t(e);return null!==n?[[n]]:[]}function eF(e,t){let n=e=>e.toLowerCase().replace(/s$/,""),r=e.toLowerCase(),s=t.find(e=>e.toLowerCase()===r);if(s)return s;let l=n(e);return t.find(e=>{let t=n(e);return t.includes(l)||l.includes(t)})??null}let e$="/docs/tables/takeoff-formulas";var eM=e.i(424942),e_=e.i(486596);let eP=new Set(["type","page","status","label","origin"]),ez=["eq","lte","gte","lt","gt"],eL={rows:[]};function eE(e){return"on"in e&&"op"in e}function eD(e){var t;if("tag"===e.on)return"eq"===e.op&&"string"==typeof e.value?{kind:"tag",tag:e.value}:null;if(t=e.op,!ez.includes(t)||"string"!=typeof e.value&&"number"!=typeof e.value)return null;let n=e.on.startsWith("properties.")?e.on.slice(11):eP.has(e.on)?e.on:null;return null===n?null:{kind:"cmp",key:n,op:e.op,value:e.value}}function eR(e,t,n,r){let s=function(e){let t=(e,t)=>{let n=e.map(e=>eE(e)?eD(e):null);return n.every(e=>null!==e)?{join:t,conditions:n}:null};if("and"in e&&Array.isArray(e.and))return t(e.and,"and");if("or"in e&&Array.isArray(e.or))return t(e.or,"or");
1if(eE(e)){let t=eD(e);return t?{join:"and",conditions:[t]}:null}return null}(n);if(null===s)return null;let l=function(e){if(void 0===e||"bin"!==e.kind||"*"!==e.op)return null;let{left:t,right:n}=e;return"geom"===t.kind&&"prop"===n.kind?n.key:"prop"===t.kind&&"geom"===n.kind?t.key:null}(r);return void 0!==r&&null===l?null:{op:e,kind:"measure",dimension:t,join:s.join,conditions:s.conditions,...null!==l?{weight:l}:{}}}let eO="this formula mixes and / or inside one condition list — edit it as text";function eA(e){var t,n;let r,s,l,a=e.trim();if(""===a)return eL;let o=(0,k.compileMeasure)(a);if((0,k.isExprError)(o))return o;if("takeoff"===o.kind)return function(e){let t=eR("+",e.dimension,e.filter,e.per);if(null===t)return{error:eO};if(void 0===e.deduct)return{rows:[t]};let n=e.deduct,r="or"in n&&Array.isArray(n.or)?n.or:[n],s=[t];for(let t of r){let n=eR("-",e.dimension,t,e.per);if(null===n)return{error:eO};s.push(n)}return{rows:s}}(o);let i=(t=o.ast,n=o.bindings,r=(e,t)=>{if("num"===e.kind)return{op:t,kind:"number",value:e.value};if("ref"!==e.kind)return null;let r=n[e.name];return r?eR(t,r.dimension,r.filter,r.per):null},s=[],(l=(e,t)=>{if("bin"===e.kind){if(!l(e.left,t))return!1;let n=r(e.right,e.op);return null!==n&&(s.push(n),!0)}let n=r(e,t);return null!==n&&(s.push(n),!0)})(t,"+")?s:null);return null===i?{error:"this formula is bracketed in a way the rows cannot show — edit it as text"}:{rows:i}}function eB(e){return"tag"===e.kind?{on:"tag",op:"eq",value:e.tag}:{on:eP.has(e.key)?e.key:`properties.${e.key}`,op:e.op,value:e.value}}let eK=e=>"+"===e||"-"===e?1:2,eV=["type","page","status","label","origin"];function eq(e,t){return e.get((0,N.normalizeTag)(t))??"unknown"}var eU=e.i(202369);let eH=(0,e.i(607655).default)("shapes",[["path",{d:"M8.3 10a.7.7 0 0 1-.626-1.079L11.4 3a.7.7 0 0 1 1.198-.043L16.3 8.9a.7.7 0 0 1-.572 1.1Z",key:"1bo67w"}],["rect",{x:"3",y:"14",width:"7",height:"7",rx:"1",key:"1bkyp8"}],["circle",{cx:"17.5",cy:"17.5",r:"3.5",key:"w3z12y"}]]);var eW=e.i(385823);function eQ({kind:e}){switch(e){case"preset":return(0,t.jsx)(eU.Layers,{className:"h-3 w-3 shrink-0"});case"tag":return(0,t.jsx)(eW.TypeIcon,{type:"checkbox"});case"bool":return(0,t.jsx)(eW.TypeIcon,{type:"bool"});case"number":return(0,t.jsx)(eW.TypeIcon,{type:"number"});case"text":return(0,t.jsx)(eW.TypeIcon,{type:"text"});case"select":return(0,t.jsx)(eW.TypeIcon,{type:"select"});case"mark-field":return(0,t.jsx)(eH,{className:"h-3 w-3 shrink-0"});case"unknown":return(0,t.jsx)(eW.TypeIcon,{type:"checkbox",className:"opacity-40"})}}let eJ={preset:"Preset — matches every mark wearing it, nested presets included",tag:`${eW.TYPE_META.checkbox.label} — presence only, so it carries no value to compare`,bool:`${eW.TYPE_META.bool.label} field`,number:`${eW.TYPE_META.number.label} field`,text:`${eW.TYPE_META.text.label} field`,select:`${eW.TYPE_META.select.label} field`,"mark-field":"Built into every mark",unknown:"Carried by marks, defined nowhere in the book"},eG=[{id:"count",label:"Count"},{id:"length",label:"Length"},{id:"area",label:"Area"},{id:"volume",label:"Volume"}],eX=[{id:"+",label:"+",hint:"add to everything above"},{id:"-",label:"−",hint:"subtract from everything above"},{id:"*",label:"×",hint:"multiply everything above"},{id:"/",label:"÷",hint:"divide everything above"}],eY=[{id:"eq",label:"=",hint:"is"},{id:"lte",label:"≤",hint:"is at most"},{id:"gte",label:"≥",hint:"is at least"},{id:"lt",label:"<",hint:"is under (excludes the value itself)"},{id:"gt",label:">",hint:"is over (excludes the value itself)"}],eZ="grid grid-cols-[3.5rem_minmax(0,1fr)_3rem_5rem_0.75rem] gap-1",e0="h-6 w-full gap-0.5 px-1.5 font-mono text-[10px]",e1="font-mono text-[10px]",e2="text-muted-foreground flex h-6 items-center px-1.5 font-mono text-[10px]",e5="text-muted-foreground shrink-0 font-mono text-[9px]",e3="text-muted-foreground/70 hover:text-muted-foreground inline-flex h-5 items-center gap-0.5 font-mono text-[10px] disabled:opacity-40",e8="text-muted-foreground hover:text-foreground flex items-center",e4="tag:",e7="key:",e6="weight:none";function e9({value:e,name:n,kind:r}){return(0,t.jsx)(e_.SelectItem,{value:e,className:e1,title:eJ[r],children:(0,t.jsxs)("span",{className:"flex items-center gap-1.5",children:[(0,t.jsx)(eQ,{kind:r}),n]})})}
1function te({value:e,onChange:n,dataTest:r}){return(0,t.jsxs)(e_.Select,{value:e,onValueChange:e=>n(e),children:[(0,t.jsx)(e_.SelectTrigger,{className:e0,"data-test":r,children:(0,t.jsx)(e_.SelectValue,{})}),(0,t.jsx)(e_.SelectContent,{children:eX.map(e=>(0,t.jsx)(e_.SelectItem,{value:e.id,className:e1,title:e.hint,children:e.label},e.id))})]})}function tt({condition:e,join:n,first:r,tagOptions:s,filterKeys:l,filterValues:a,kinds:o,onJoin:i,onChange:d,onRemove:c}){let u="cmp"===e.kind?a.get(e.key.toLowerCase())??[]:[],m="cmp"===e.kind?`values-${e.key}`:void 0,p="tag"!==e.kind||s.includes(e.tag)?s:[e.tag,...s],h="cmp"!==e.kind||l.includes(e.key)?l:[e.key,...l];return(0,t.jsxs)("div",{className:eZ,children:[r?(0,t.jsx)("span",{className:e2,children:"where"}):(0,t.jsxs)(e_.Select,{value:n,onValueChange:e=>i(e),children:[(0,t.jsx)(e_.SelectTrigger,{className:e0,"data-test":"builder-join",children:(0,t.jsx)(e_.SelectValue,{})}),(0,t.jsxs)(e_.SelectContent,{children:[(0,t.jsx)(e_.SelectItem,{value:"and",className:e1,children:"and"}),(0,t.jsx)(e_.SelectItem,{value:"or",className:e1,children:"or"})]})]}),(0,t.jsxs)(e_.Select,{value:"tag"===e.kind?`${e4}${e.tag}`:`${e7}${e.key}`,onValueChange:e=>{if(e.startsWith(e4))return void d({kind:"tag",tag:e.slice(e4.length)});let t=e.slice(e7.length),n=a.get(t.toLowerCase())??[];d({kind:"cmp",key:t,op:"eq",value:n[0]??""})},children:[(0,t.jsx)(e_.SelectTrigger,{className:e0,"data-test":"builder-field",children:(0,t.jsx)(e_.SelectValue,{})}),(0,t.jsxs)(e_.SelectContent,{children:[p.length>0?(0,t.jsx)("div",{className:(0,E.cn)(e5,"px-2 py-1 uppercase"),children:"Tags & presets"}):null,p.map(e=>(0,t.jsx)(e9,{value:`${e4}${e}`,name:e,kind:eq(o,e)},`${e4}${e}`)),h.length>0?(0,t.jsx)("div",{className:(0,E.cn)(e5,"px-2 py-1 uppercase"),children:"Fields"}):null,h.map(e=>(0,t.jsx)(e9,{value:`${e7}${e}`,name:e,kind:eq(o,e)},`${e7}${e}`))]})]}),"cmp"===e.kind?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(e_.Select,{value:e.op,onValueChange:t=>d({...e,op:t}),children:[(0,t.jsx)(e_.SelectTrigger,{className:e0,"data-test":"builder-op",children:(0,t.jsx)(e_.SelectValue,{})}),(0,t.jsx)(e_.SelectContent,{children:eY.map(e=>(0,t.jsx)(e_.SelectItem,{value:e.id,className:e1,title:e.hint,children:e.label},e.id))})]}),(0,t.jsx)(eM.Input,{value:String(e.value),onChange:t=>{var n;let r;return d({...e,value:""!==(r=(n=t.target.value).trim())&&/^-?\d+(\.\d+)?$/.test(r)?Number(r):n})},list:m,placeholder:"value",className:"h-6 w-full font-mono text-[10px] md:text-[10px]","data-test":"builder-value"}),u.length>0?(0,t.jsx)("datalist",{id:m,children:u.map(e=>(0,t.jsx)("option",{value:e},e))}):null]}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{}),(0,t.jsx)("span",{})]}),(0,t.jsx)("button",{type:"button",className:e8,onClick:c,title:"Remove this condition","data-test":"builder-condition-remove",children:(0,t.jsx)(b.X,{className:"h-2.5 w-2.5"})})]})}function tn({row:e,first:n,tagOptions:r,filterKeys:s,filterValues:l,kinds:a,weightOptions:o,onChange:i,onDimension:d,onRemove:c}){let u=e.weight&&!o.includes(e.weight)?[e.weight,...o]:o;return(0,t.jsxs)("div",{className:"border-border/70 flex flex-col gap-1 rounded border p-1.5","data-test":"builder-row",children:[(0,t.jsxs)("div",{className:eZ,children:[n?(0,t.jsx)("span",{className:e2,children:"take"}):(0,t.jsx)(te,{value:e.op,onChange:t=>i({...e,op:t}),dataTest:"builder-row-op"}),(0,t.jsxs)(e_.Select,{value:e.dimension,onValueChange:e=>d(e),children:[(0,t.jsx)(e_.SelectTrigger,{className:e0,"data-test":"builder-dimension",children:(0,t.jsx)(e_.SelectValue,{})}),(0,t.jsx)(e_.SelectContent,{children:eG.map(e=>(0,t.jsx)(e_.SelectItem,{value:e.id,className:e1,children:e.label},e.id))})]}),(0,t.jsx)("span",{className:(0,E.cn)(e5,"flex items-center"),children:"of marks"}),(0,t.jsxs)(e_.Select,{value:e.weight?`${e7}${e.weight}`:e6,onValueChange:t=>{let{weight:n,...r}=e;i(t===e6?r:{...r,weight:t.slice(e7.length)})},children:[(0,t.jsx)(e_.SelectTrigger,{className:e0,"data-test":"builder-weight",children:(0,t.jsx)(e_.SelectValue,{})}),(0,t.jsxs)(e_.SelectContent,{children:[(0,t.jsx)(e_.SelectItem,{value:e6,className:e1,children:"each ×1"}),u.map(e=>(0,t.jsxs)(e_.SelectItem,{value:`${e7}${e}`,className:e1,children:["× its ",e]},e))]})]}),(0,t.jsx)("button",{type:"button",className:e8,onClick:c,title:"Remove this row","data-test":"builder-row-remove",children:(0,t.jsx)(b.X,{className:"h-3 w-3"})})]}),e.conditions.map((n,o)=>(0,t.jsx)(tt,{condition:n,join:e.join,first:0===o,tagOptions:r,filterKeys:s,filterValues:l,kinds:a,onJoin:t=>i({...e,join:t}),onChange:t=>i({...e,conditions:e.conditions.map((e,n)=>n===o?t:e)}),onRemove:()=>i({...e,conditions:e.conditions.filter((e,t)=>
1t!==o)})},o)),(0,t.jsxs)("div",{className:eZ,children:[(0,t.jsx)("span",{}),(0,t.jsxs)("button",{type:"button",className:(0,E.cn)(e3,"w-fit"),disabled:0===r.length,onClick:()=>i({...e,conditions:[...e.conditions,{kind:"tag",tag:r[0]}]}),title:0===r.length?"No tags or presets exist in this version yet":"Narrow this row with another condition","data-test":"builder-add-condition",children:[(0,t.jsx)(p.Plus,{className:"h-2.5 w-2.5 shrink-0"}),"condition"]})]})]})}let tr=(e,t)=>"/"===e&&0===t;function ts({row:e,onChange:r,onRemove:s}){let[l,a]=(0,n.useState)(String(e.value)),[o,i]=(0,n.useState)(e.value);o!==e.value&&(i(e.value),Number(l)!==e.value&&a(String(e.value)));let d=""===l.trim()?NaN:Number(l.trim()),c=Number.isFinite(d)?tr(e.op,d)?"a divisor cannot be zero":null:"needs a number",u=(t,n)=>r({...e,op:t,value:n});return(0,t.jsx)("div",{className:"border-border/70 rounded border p-1.5","data-test":"builder-row",children:(0,t.jsxs)("div",{className:eZ,children:[(0,t.jsx)(te,{value:e.op,onChange:t=>tr(t,e.value)?void 0:u(t,e.value),dataTest:"builder-row-op"}),(0,t.jsx)(eM.Input,{value:l,onChange:t=>{let n=t.target.value;a(n);let r=Number(n.trim());""!==n.trim()&&Number.isFinite(r)&&!tr(e.op,r)&&u(e.op,r)},onBlur:()=>a(String(e.value)),inputMode:"decimal","aria-invalid":null!==c,className:(0,E.cn)("h-6 w-full font-mono text-[10px] md:text-[10px]",null!==c&&"text-destructive"),"data-test":"builder-number"}),(0,t.jsx)("span",{className:(0,E.cn)(e5,"col-span-2 flex items-center"),children:c??"everything above"}),(0,t.jsx)("button",{type:"button",className:e8,onClick:s,title:"Remove this row","data-test":"builder-row-remove",children:(0,t.jsx)(b.X,{className:"h-3 w-3"})})]})})}function tl(){return(0,t.jsx)("a",{href:e$,target:"_blank",rel:"noreferrer",className:"text-muted-foreground hover:text-foreground shrink-0 font-mono text-[9px] underline underline-offset-2","data-test":"builder-docs-link",children:"syntax ↗"})}function ta({text:e,onChange:n,tagOptions:r,filterKeys:s,filterValues:l,kinds:a,weightOptions:o,known:i,held:d,onHold:c}){let u=eA(e),m=""===e.trim()?null:(0,j.formulaProblem)((0,k.compileMeasure)(e),i),h=(0,k.isExprError)(u)?d?.text===e?{rows:d.rows}:null:u,f=(0,k.isExprError)(u)?u.error:null;if(null===h)return(0,t.jsxs)("div",{className:"flex flex-col gap-2","data-test":"builder-unavailable",children:[(0,t.jsx)("p",{className:"text-muted-foreground font-mono text-[10px] leading-relaxed",children:f}),(0,t.jsxs)("div",{className:"border-border flex items-center justify-between gap-2 border-t pt-1.5",children:[(0,t.jsx)("button",{type:"button",className:e3,onClick:()=>{c(null),n("")},title:"Clear the formula and build a new one here","data-test":"builder-reset",children:"Start over"}),(0,t.jsx)(tl,{})]})]});let x=e=>{let t=function(e){let t=e.rows.map(e=>({op:e.op,text:function(e){if("number"===e.kind)return String(e.value);if(0===e.conditions.length)return"";let t=e.conditions.map(eB);return(0,k.printMeasure)({kind:"takeoff",dimension:e.dimension,filter:1===t.length?t[0]:"and"===e.join?{and:t}:{or:t},...e.weight?{per:{kind:"bin",op:"*",left:{kind:"geom",measure:e.dimension},right:{kind:"prop",key:e.weight}}}:{}})}(e)})).filter(e=>""!==e.text),n=t[0];if(void 0===n)return"";let r=n.text,s=3;for(let e of t.slice(1)){let t=eK(e.op);t>s&&(r=`(${r})`),r=`${r} ${e.op} ${e.text}`,s=t}return r}({rows:e});c((0,k.isExprError)(eA(t))?{text:t,rows:e}:null),n(t)},g=(e,t)=>x(h.rows.map((n,r)=>r===e?t:n)),b=e=>
1x(h.rows.filter((t,n)=>n!==e));return(0,t.jsxs)("div",{className:"flex flex-col gap-1.5","data-test":"formula-builder",children:[null!==f?(0,t.jsx)("p",{className:"text-destructive font-mono text-[10px] leading-relaxed","data-test":"builder-error",children:f}):null,m?.reason==="unknown_names"?(0,t.jsx)("p",{className:"flex flex-col gap-0.5 font-mono text-[10px] leading-relaxed text-amber-600 dark:text-amber-400","data-test":"builder-unknown-names",children:(0,t.jsx)(ej,{names:m.names,nearest:e=>eF(e,r)})}):null,m?.reason==="unit_unknown"?(0,t.jsxs)("p",{className:"font-mono text-[10px] leading-relaxed text-amber-600 dark:text-amber-400","data-test":"builder-unit-unknown",children:[m.message,", so the result has no unit of its own — name one on the column to say what it is measured in."]}):null,h.rows.map((e,n)=>"measure"===e.kind?(0,t.jsx)(tn,{row:e,first:0===n,tagOptions:r,filterKeys:s,filterValues:l,kinds:a,weightOptions:o,onChange:e=>g(n,e),onDimension:e=>x(h.rows.map((t,r)=>"measure"===t.kind&&r===n?{...t,dimension:e}:t)),onRemove:()=>b(n)},n):(0,t.jsx)(ts,{row:e,onChange:e=>g(n,e),onRemove:()=>b(n)},n)),0===h.rows.length?(0,t.jsx)("p",{className:"text-muted-foreground font-mono text-[10px]",children:"Nothing yet — add a measure to say what this cell counts."}):null,(0,t.jsxs)("div",{className:eZ,children:[(0,t.jsx)("span",{}),(0,t.jsxs)("div",{className:"col-span-4 flex items-center gap-3",children:[(0,t.jsxs)("button",{type:"button",className:e3,disabled:0===r.length,onClick:()=>{var e;return x([...h.rows,{op:"+",kind:"measure",dimension:(e=h.rows,e.find(e=>"measure"===e.kind)?.dimension??"count"),join:"and",conditions:[{kind:"tag",tag:r[0]}]}])},title:0===r.length?"No tags or presets exist in this version yet":"Add another measure to the formula","data-test":"builder-add-measure",children:[(0,t.jsx)(p.Plus,{className:"h-2.5 w-2.5 shrink-0"}),"measure"]}),h.rows.length>0?(0,t.jsxs)("button",{type:"button",className:e3,onClick:()=>x([...h.rows,{op:"*",kind:"number",value:1.05}]),title:"A plain number — waste, or a unit conversion","data-test":"builder-add-number",children:[(0,t.jsx)(p.Plus,{className:"h-2.5 w-2.5 shrink-0"}),"number"]}):null]})]}),(0,t.jsxs)("div",{className:"border-border flex items-center justify-between gap-2 border-t pt-1.5",children:[(0,t.jsx)("code",{className:"text-muted-foreground min-w-0 truncate font-mono text-[10px]",title:e,"data-test":"builder-preview",children:""===e.trim()?"empty":e}),(0,t.jsx)(tl,{})]})]})}var to=e.i(430223);function ti(e){let t=e.trim();if(!/^https?:\/\/\S+$/i.test(t))return null;try{let e=new URL(t);return""===e.hostname?null:t}catch{return null}}function td(e){let t;try{t=new URL(e)}catch{return e}let n=t.hostname.replace(/^www\./i,""),r=t.pathname.split("/").filter(e=>""!==e),s=r[r.length-1];return void 0===s?n:`${n}/${s}`}var tc=e.i(745261);function tu({url:e}){return(0,t.jsxs)("span",{className:"inline-flex max-w-full min-w-0 items-center gap-1",children:[(0,t.jsx)("span",{className:"min-w-0 truncate text-sky-700 dark:text-sky-400",children:td(e)}),(0,t.jsx)("a",{href:e,target:"_blank",rel:"noreferrer noopener",className:"text-muted-foreground hover:text-foreground shrink-0",title:`Open ${e}`,"aria-label":"Open this link in a new tab",onClick:e=>e.stopPropagation(),"data-test":"cell-link-open",children:(0,t.jsx)(tc.ExternalLink,{className:"h-3 w-3"})})]})}function tm({text:e,linkify:n}){let r=ti(e);return null===r?(0,t.jsx)(t.Fragment,{children:e}):n?(0,t.jsx)("a",{href:r,target:"_blank",rel:"noreferrer noopener",className:"break-words text-sky-700 underline decoration-dotted underline-offset-2 dark:text-sky-400",title:r,onClick:e=>e.stopPropagation(),"data-test":"row-part-link",children:td(r)}):(0,t.jsx)("span",{title:r,children:td(r)})}function tp({parts:e,className:n,linkify:r=!1}){return(0,t.jsx)("span",{className:(0,E.cn)("min-w-0 break-words",n),children:e.map((e,n)=>(0,t.jsxs)("span",{children:[n>0?(0,t.jsx)("span",{className:"text-muted-foreground/60",children:" · "}):null,(0,t.jsx)(tm,{text:e,linkify:r})]},`${n}-${e}`))})}var th=e.i(921007),tf=e.i(148135),tx=e.i(712834),tg=e.i(835274),tb=e.i(961347);let ty=e=>e.map(N.normalizeTag).sort().join("\0");function tv({options:e,accountId:r,origin:s,className:l}){let a=(0,R.useCurrentVersionBookDoc)(),o=(0,A.useMarkIntent)(r??void 0),[i,d]=(0,n.use
1State)(!1),c=e=>a?(0,tg.resolvePresetForTags)(a,e.tags):null,u=e.findIndex(e=>{if(null===o||o.origin&&o.origin.deduct!==e.deduct)return!1;if(o.tags.length>0)return ty(o.tags)===ty(e.tags);let t=c(e);return null!==t&&o.presetId===t}),m=e=>{let t=c(e);return t?a?.presets.find(e=>e.id===t)?.name??null:null},p=e=>{let t=m(e)??e.tags.map(e=>`"${e}"`).join(" + ");return`${t}${e.deduct?" (deducts)":""}`},h=e=>{r&&(0,A.armMarkIntent)(r,{presetId:c(e),tags:e.tags,origin:{...s,deduct:e.deduct}})},f=()=>{r&&(0,A.clearMarkIntent)(r)};if(0===e.length)return null;if(1===e.length){let n=e[0],r=0===u;return(0,t.jsx)(M.Button,{type:"button",variant:r?"default":"ghost",size:"sm",className:(0,E.cn)(T.GHOST_ACTION_CLASS,l),title:r?`Stop drawing ${p(n)}`:n.deduct?`Draw ${p(n)} — they count AGAINST this cell`:`Draw ${p(n)} — they land in this cell`,onClick:e=>{e.stopPropagation(),r?f():h(n)},"data-test":"table-cell-draw",children:(0,t.jsx)(tx.PenLine,{className:"h-3 w-3"})})}return(0,t.jsxs)(_.Popover,{open:i,onOpenChange:d,children:[(0,t.jsx)(_.PopoverTrigger,{asChild:!0,children:(0,t.jsxs)(M.Button,{type:"button",variant:u>=0?"default":"ghost",size:"sm",className:(0,E.cn)(T.GHOST_ACTION_CLASS,l),onClick:e=>e.stopPropagation(),title:u>=0?`Drawing as ${p(e[u])} — click to switch or stop`:"Draw marks into this cell — pick which tag to draw as","data-test":"table-cell-draw",children:[(0,t.jsx)(tx.PenLine,{className:"h-3 w-3"}),(0,t.jsx)(Y.ChevronDown,{className:"h-2.5 w-2.5"})]})}),(0,t.jsx)(_.PopoverContent,{align:"end",className:"w-auto p-1",children:e.map((e,n)=>(0,t.jsxs)("button",{type:"button",className:(0,E.cn)(T.POPOVER_ITEM_CLASS,n===u&&"bg-accent"),title:n===u?"Stop drawing with this tag":e.deduct?`Marks drawn as ${p(e)} count AGAINST this cell`:`Marks drawn as ${p(e)} land in this cell`,onClick:()=>{n===u?f():h(e),d(!1)},"data-test":"table-cell-draw-option",children:[(0,t.jsx)(tx.PenLine,{className:"h-3 w-3 shrink-0"}),(0,t.jsx)("span",{children:e.tags.join(" + ")}),m(e)?(0,t.jsx)("span",{className:"text-muted-foreground shrink-0 text-[9px]",title:`Also arms the ${m(e)} preset`,children:m(e)}):null,e.deduct?(0,t.jsx)("span",{className:"text-muted-foreground text-[9px] uppercase",children:"deducts"}):null]},`${e.deduct?"-":"+"}${ty(e.tags)}`))})]})}function tw({accountId:e,librarySlug:r,field:l,fills:a,bound:o,canClear:i,onPick:d,onValue:c,onClear:u,onClose:m}){let p=(0,y.useSupabase)(),h=(0,Q.useConsoleActions)()?.openPriceBookTab??null,[f,x]=(0,n.useState)({term:"",query:"",highlight:0}),g=(0,n.useRef)(null),b=(0,s.useQuery)({queryKey:["libraries",e],queryFn:()=>(0,B.fetchLibraries)(p,e),staleTime:6e4}),v=b.data?.find(e=>e.slug===r)??null,w=(0,s.useQuery)({queryKey:["library-rows",v?.id??"none",f.query],queryFn:()=>(0,B.searchLibraryRows)(p,v.id,f.query),enabled:null!==v,placeholderData:th.keepPreviousData,staleTime:3e4}),k=w.data??[],j=f.term.trim(),N=""===j||Number.isNaN(Number(j))?null:Number(j),S=+(null!==N)+k.length;return(0,t.jsxs)("div",{className:"flex w-80 flex-col","data-test":"library-row-picker",children:[(0,t.jsx)("div",{className:"border-border/70 border-b p-2",children:(0,t.jsx)(eM.Input,{autoFocus:!0,value:f.term,onChange:e=>{var t;return t=e.target.value,void(x(e=>({...e,term:t,highlight:0})),null!==g.current&&clearTimeout(g.current),g.current=setTimeout(()=>x(e=>({...e,query:t})),200))},onKeyDown:e=>{if("ArrowDown"===e.key&&S>0){e.preventDefault(),x(e=>({...e,highlight:(e.highlight+1)%S}));return}if("ArrowUp"===e.key&&S>0){e.preventDefault(),x(e=>({...e,highlight:(e.highlight-1+S)%S}));return}"Enter"===e.key&&(e.preventDefault(),S>0&&(e=>{if(null!==N&&0===e){c(N),m();return}let t=k[null!==N?e-1:e];t&&(d(t.id),m())})(f.highlight))},placeholder:`Search the ${v?.name??r} library — or type a value`,className:"h-7 font-mono text-[11px] md:text-[11px]","data-test":"library-row-picker-input"})}),a.length>1?(0,t.jsxs)("p",{className:"text-muted-foreground border-border/70 border-b px-3 py-1.5 text-[10px]","data-test":"library-row-picker-fills",children:["Picking a row fills ",a.join(" · ")]}):null,o&&o.length>0?(0,t.jsxs)("p",{className:"text-muted-foreground border-border/70 border-b px-3 py-1.5 font-mono text-[11px]","data-test":"library-row-picker-bound",children:[(0,t.jsx)("span",{className:"text-muted-foreground
1/70",children:"Now: "}),(0,t.jsx)(tp,{parts:o,linkify:!0})]}):null,(0,t.jsxs)("div",{className:"max-h-64 overflow-y-auto p-1",children:[null===v&&void 0!==b.data?(0,t.jsxs)("p",{className:"text-muted-foreground px-2 py-3 text-center text-[11px]",children:["No library named “",r,"” — add it in the Library tab, or re-point this column."]}):null,null!==N?(0,t.jsx)("button",{type:"button",className:(0,E.cn)(T.POPOVER_ITEM_CLASS,"justify-between gap-2",0===f.highlight&&"bg-accent"),onClick:()=>{c(N),m()},"data-test":"library-row-picker-inline",children:(0,t.jsxs)("span",{children:["Set ",l," to ",(0,tb.formatNumberCell)(N)," — this row only"]})}):null,k.map((e,n)=>{let r=null!==N?n+1:n,s=e.data[l],a=null==s?"":String(s),o=(0,B.libraryRowParts)(e,l,v?.columns??[]),i=""!==a&&o[0]===a&&o.length>1?o.slice(1):o;return(0,t.jsxs)("button",{type:"button",className:(0,E.cn)(T.POPOVER_ITEM_CLASS,"items-baseline gap-2",f.highlight===r&&"bg-accent"),title:o.join(" · "),onClick:()=>{d(e.id),m()},"data-test":"library-row-picker-hit",children:[i.length>0?(0,t.jsx)(tp,{parts:i,className:"flex-1 truncate"}):(0,t.jsx)("span",{className:"text-muted-foreground min-w-0 flex-1 truncate",children:e.id}),(0,t.jsx)("span",{className:"shrink-0 font-mono tabular-nums",children:a})]},e.id)}),null!==v&&0===k.length&&void 0!==w.data?(0,t.jsx)("p",{className:"text-muted-foreground px-2 py-3 text-center text-[11px]",children:""===j?"This library is empty — import rows in the Library tab.":"No matches"}):null]}),(0,t.jsxs)("div",{className:"border-border/70 flex items-center justify-between gap-2 border-t px-2 py-1.5",children:[i?(0,t.jsx)("button",{type:"button",className:"text-muted-foreground hover:text-destructive text-[10px]",onClick:()=>{u(),m()},"data-test":"library-row-picker-clear",children:"Clear selection"}):(0,t.jsx)("span",{}),(0,t.jsxs)("div",{className:"flex min-w-0 shrink-0 items-center gap-2",children:[k.length>=20?(0,t.jsx)("span",{className:"text-muted-foreground text-[10px]",children:"first 20 — keep typing"}):null,h&&v?(0,t.jsxs)("button",{type:"button",className:"text-muted-foreground hover:text-foreground flex items-center gap-1 text-[10px]",title:`Open the ${v.name||v.slug} library`,onClick:()=>{h(e,v.id),m()},"data-test":"library-row-picker-open",children:[(0,t.jsx)(tf.BookOpen,{className:"h-3 w-3"}),"Open library"]}):null]})]})]})}function tk(e){return{rowId:e.def.id,...e.sub?{subKey:e.sub.key}:{}}}function tj(e){return e.sub?e.item.sub_rows?.find(t=>t.key===e.sub.key)?.cells??{}:e.item.cells}function tN(e){return e.sub?e.item.sub_rows?.find(t=>t.key===e.sub.key)?.linked:e.item.linked}function tS(e){let t=e.sub?e.def.fan_overrides?.[e.sub.key]:e.def;return{values:t?.values,links:t?.links}}function tC(e,t){return null===e||null===t?e===t:e.rowId===t.rowId&&e.colKey===t.colKey&&(e.subKey??null)===(t.subKey??null)}function tT(e){return(0,tb.peekTarget)(e.def.id,e.sub?.key)}function tI(e,t){return{rowId:e.def.id,colKey:t,...e.sub?{subKey:e.sub.key}:{}}}function tF(e,t){return t.measures?.[e.key]??e.expr??""}function t$(e,t){let n=e.trim();if(""===n)return t.pinned?{kind:"clear-pin"}:t.hasRowFormula?{kind:"clear-formula"}:{kind:"noop"};if(/^-?\d+(\.\d+)?$/.test(n))return{kind:"pin-number",value:Number(n)};if(null!==(0,en.parseQuantityText)(n))return{kind:"pin-lump",text:n};let r=(0,k.compileMeasure)(n);if((0,k.isExprError)(r))return{kind:"invalid",error:`not a number, a lump sum (4500 LS), or a takeoff — ${r.error}`};let s=t.columnExpr.trim();return{kind:"formula",expr:""!==s&&n===s?null:n}}function tM(e,t){return{pinned:tj(t)[e.key]?.pinned===!0,hasRowFormula:t.def.measures?.[e.key]!==void 0,columnExpr:e.expr??""}}function t_({editor:e,ctx:r}){let s=(0,n.useRef)(null),l=(0,n.useRef)(!1),a=(0,n.useRef)(!1),[o,i]=(0,n.useState)(!1),[d,c]=(0,n.useState)(null),u=(0,n.useMemo)(()=>{var e;return e=r.vocabularyKinds,function(n,r){if("weight"===r)return"where"===n?null:(0,t.jsx)(eQ,{kind:k.GEOMETRY_WORDS.includes(n)?"mark-field":eq(e,n)});if("term"!==r)return null;let s=n.endsWith("=")?n.slice(0,-1):n;return(0,t.jsx)(eQ,{kind:eq(e,s)})}},[r.vocabularyKinds]),m=r.weightKeys,p=""===e.text.trim()?null:(0,j.formulaProblem)((0,k.compileMeasure)(e.text),r.known,e.row.def.units?.[e.colId]);return(0,t.jsxs)("span",{className:"flex w-full items-center gap-0.5",children:[(0,t.jsx)(er.TagSuggestInput,{value:e.text,onChange:e.setText,options:r.tagOptions,expression:!0,filterKeys:r.filterKeys,filterValues:r.filterValues,weightKeys:m,icon:u,autoFocus:!0,inputRef:s,onKeyDown:e.onKeyDown,onBlur:()=>{l.current||e.commit()},className:"min-w-0 flex-1",inputClassName:(0,E.cn)(T.BARE_INPUT_CLASS,"w-full text-right font-mono text-[12px]"),"data-test":"table-cell-measure-input"}),p?(0,t.jsx)("span",{className:"absolute top-full left-0 z-10 mt-1","data-test":"table-cell-measure-draft-problem",children:(0,t.jsx)(eS,{problem:p,nearest:e=>eF(e,r.tagOptions)})}):null,(0,t.jsxs)(_.Popover,{open:o,onOpenChange:t=>t?void(l.current=!0,a.current=!1,i(!0)):(()=>
1{if(i(!1),l.current=!1,a.current){a.current=!1,e.commit();return}requestAnimationFrame(()=>s.current?.focus())})(),children:[(0,t.jsx)(_.PopoverTrigger,{asChild:!0,children:(0,t.jsx)("button",{type:"button",className:"text-muted-foreground hover:text-foreground inline-flex h-6 w-5 shrink-0 items-center justify-center",title:"Build this formula with controls",onMouseDown:e=>e.preventDefault(),"data-test":"table-cell-formula-builder",children:(0,t.jsx)(Z.SlidersHorizontal,{className:"h-3 w-3"})})}),(0,t.jsx)(_.PopoverContent,{align:"end",className:"w-[28rem] p-2",onInteractOutside:()=>{a.current=!0},children:o?(0,t.jsx)(ta,{text:e.text,onChange:e.setText,tagOptions:r.tagOptions,filterKeys:r.filterKeys,filterValues:r.filterValues,kinds:r.vocabularyKinds,weightOptions:r.weightKeys,known:r.known,held:d,onHold:c}):null})]})]})}function tP(e,n,r){let s,l=tj(r)[n.key],a=tF(n,r.def),o=l?.evidence&&eg(e.evidence,l.evidence),i=o?l.evidence:ey(l,r.sub?void 0:r.item.sub_rows,n.key),d=r.sub?.label??Object.entries(r.item.cells).find(([e,t])=>["description","label","item"].includes(e)&&"string"==typeof t.value)?.[1].value??Object.values(r.item.cells).find(e=>"string"==typeof e.value)?.value??r.def.id,c=!e.editable||!1===e.allowDrawing||e.modelBound||r.sub?[]:(s=(0,k.compileMeasure)(a),(0,k.isExprError)(s)?[]:function(e){let t,n=[];if("takeoff"===e.kind){for(let t of eI(e.filter))n.push({tags:t,deduct:!1});if(void 0!==e.deduct)for(let t of eI(e.deduct))n.push({tags:t,deduct:!0})}else for(let t of Object.values(e.bindings))for(let e of eI(t.filter))n.push({tags:e,deduct:!1});return t=new Set,n.filter(e=>{let n=`${e.deduct?"-":"+"}${e.tags.map(N.normalizeTag).sort().join("\0")}`;return!t.has(n)&&(t.add(n),!0)})}(s)),u=e.editable&&!e.frozen,m=(0,J.effectiveBranchScope)(n,r.def,e.tableBranches);return(0,t.jsxs)(t.Fragment,{children:[r.def.measures?.[n.key]===void 0||r.sub?null:(0,t.jsx)("span",{className:"text-muted-foreground shrink-0 text-[9px]",title:`${a} — this row's own takeoff formula`,"data-test":"table-cell-row-formula","aria-hidden":!0,children:"ƒ"}),i?o?(0,t.jsx)(eb,{lookup:e.evidence,evidence:i,excludedReasons:l?.excluded_reasons,label:String(d),quantity:`${n.label??n.key} \xb7 ${(0,tb.cellDisplayText)(n,l)}`,open:e.peekOf(tT(r))===n.key,onOpenChange:t=>{t!==(e.peekOf(tT(r))===n.key)&&e.onTogglePeek(tT(r),n.key)}}):(0,t.jsx)("button",{type:"button",className:"text-muted-foreground hover:text-foreground shrink-0",onClick:t=>{t.stopPropagation(),e.onTogglePeek(tT(r),n.key)},title:"Show the marks feeding this cell","data-test":"table-cell-peek",children:(0,t.jsx)(Y.ChevronDown,{className:"h-3 w-3"})}):null,l?.problem?(0,t.jsx)(eS,{problem:l.problem,nearest:t=>eF(t,e.tagOptions),onPickUnit:u?t=>e.onSetUnit(tk(r),n.key,t):void 0}):null,l&&(l.excluded??0)>0?(0,t.jsx)(ek,{lookup:e.evidence,count:l.excluded??0,reasons:l.excluded_reasons,cell:l.evidence}):null,l?.unresolved?(0,t.jsx)(G.BrokenBranchBadge,{cell:l,options:e.branchOptions}):"row"===m.level?(0,t.jsx)(G.BranchScopeMarker,{scope:m,options:e.branchOptions,dataTest:"table-cell-branch-scope"}):null,(0,t.jsx)(tv,{options:c,accountId:e.accountId,origin:{tableId:e.tableId,rowId:r.def.id,columnKey:n.key}})]})}function tz(e){let t="text"===e.format||"value"===e.kind&&void 0===e.format?200:"measure"===e.kind?132:112,n="pointer"===e.kind?72:56;return Math.min(320,Math.max(t,7*(e.label??e.key).length+n))}var tL=e.i(568071),tE=e.i(703789);function tD({actions:e}){return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(tE.ContextMenuItem,{onSelect:e.edit,"data-test":"row-menu-edit-link",children:(0,t.jsx)(L.Trans,{i18nKey:"tables:editTableLink",defaults:"Edit table link…"})}),(0,t.jsx)(tE.ContextMenuItem,{onSelect:e.insert,children:(0,t.jsx)(L.Trans,{i18nKey:"tables:linkAnotherTable",defaults:"Link another table here…"})}),(0,t.jsx)(tE.ContextMenuSeparator,{}),(0,t.jsx)(tE.ContextMenuItem,{onSelect:e.remove,className:"text-destructive",children:(0,t.jsx)(L.Trans,{i18nKey:"tables:removeTableLink",defaults:"Remove table link"})})]})}var tR=e.i(353950);let tO={ids:[],anchor:null};function tA(e,t){let n=new Set(t);return e.ids.some(e=>n.has(e))?{ids:e.ids.filter(e=>!n.has(e)),anchor:null!==e.anchor&&n.has(e.anchor)?null:e.anchor}:e}var tB=e.i(278549),tK=e.i(874267),tV=e.i(892142),tq=e.i(999269),tU=e.i(252680),tH=e.i(308370),tW=e.i(571290),tQ=e.i(347781),tJ=e.i(770203),tG=e.i(361687),tX=e.i(809760),tY=e.i(206350);
1function tZ({label:e,icon:r,initiallyOpen:s=!1,children:l}){let[a,o]=(0,n.useState)(s);return(0,t.jsxs)("div",{children:[(0,t.jsxs)("button",{type:"button",className:"hover:bg-accent flex w-full items-center gap-2 rounded px-2 py-1.5 text-left text-sm","aria-expanded":a,onClick:()=>o(!a),children:[(0,t.jsx)(ed.ChevronRight,{className:(0,E.cn)("size-3.5 shrink-0 transition-transform",a&&"rotate-90")}),r,(0,t.jsx)("span",{className:"truncate",children:e})]}),a&&(0,t.jsx)("div",{className:"ml-3 border-l pl-2",children:l})]})}let t0=(0,t.jsx)(tG.Folder,{className:"text-muted-foreground size-4 shrink-0"});function t1(e){let n=(0,y.useSupabase)(),r=(0,s.useQuery)({queryKey:["table-source-workspaces"],queryFn:async()=>{let{data:e,error:t}=await n.from("accounts").select("id,name").order("name");if(t)throw t;return e}});return(0,t.jsxs)("div",{className:"max-h-72 overflow-y-auto rounded-md border p-1","aria-label":"Browse tables by file","data-test":"table-source-tree",children:[r.isPending&&(0,t.jsx)("p",{className:"p-2 text-sm",children:"Loading workspaces…"}),r.isError&&(0,t.jsx)("p",{role:"alert",className:"text-destructive p-2 text-sm",children:"Could not load workspaces."}),r.data?.map(n=>(0,t.jsx)(tZ,{label:n.name,icon:t0,initiallyOpen:n.id===e.accountId,children:(0,t.jsx)(t2,{...e,accountId:n.id,path:n.name})},n.id))]})}function t2(e){let n=(0,tQ.useInfiniteQuery)({queryKey:["table-source-files",e.accountId,e.projectId??"root"],initialPageParam:null,queryFn:async({pageParam:t,signal:n})=>{let r=new URLSearchParams({accountId:e.accountId,sortField:"name",sortDirection:"asc",include:"folders"});e.projectId&&r.set("projectId",e.projectId),t&&r.set("cursor",t);let s=await fetch(`/api/file-browser/workspace?${r}`,{signal:n});if(!s.ok)throw Error("Could not load files.");return await s.json()},getNextPageParam:e=>e.nextCursor??void 0});return(0,t.jsxs)(t.Fragment,{children:[n.isPending&&(0,t.jsx)("p",{className:"p-2 text-xs",children:"Loading files…"}),n.isError&&(0,t.jsx)("p",{role:"alert",className:"text-destructive p-2 text-xs",children:"Could not load files."}),n.data?.pages[0]?.folders?.map(n=>(0,t.jsx)(tZ,{label:n.name,icon:t0,children:(0,t.jsx)(t2,{...e,projectId:n.id,path:`${e.path} / ${n.name}`})},n.id)),n.data?.pages.flatMap(e=>e.drawings).map(n=>(0,t.jsx)(tZ,{label:n.name,icon:(0,t.jsx)(tJ.FileText,{className:"text-muted-foreground size-4 shrink-0"}),children:(0,t.jsx)(t5,{...e,drawingId:n.id,path:`${e.path} / ${n.name}`})},n.id)),n.data&&!n.data.pages.some(e=>e.drawings.length||e.folders?.length)&&(0,t.jsx)("p",{className:"text-muted-foreground p-2 text-xs",children:"No files here."}),n.hasNextPage&&(0,t.jsx)("button",{type:"button",className:"hover:bg-accent w-full rounded p-2 text-left text-xs",disabled:n.isFetchingNextPage,onClick:()=>void n.fetchNextPage(),children:"More files…"})]})}function t5(e){let n=(0,tY.useDrawingRevealTree)(e.drawingId,!0);return(0,t.jsxs)(t.Fragment,{children:[n.isPending&&(0,t.jsx)("p",{className:"p-2 text-xs",children:"Loading tables…"}),n.isError&&(0,t.jsx)("p",{role:"alert",className:"text-destructive p-2 text-xs",children:"Could not load tables."}),n.data?.map(r=>(0,t.jsxs)(tZ,{label:`Version ${r.versionNumber}${r.id===e.versionId?" · Current":""}`,icon:t0,initiallyOpen:r.id===e.versionId||1===n.data.length,children:[r.workbooks.map(n=>(0,t.jsxs)(tZ,{label:(0,tb.titleCaseTableName)(n.name),icon:t0,initiallyOpen:1===r.workbooks.length,children:[n.tables.filter(t=>t.id!==e.excludeId).map(s=>(0,t.jsxs)("button",{type:"button",className:(0,E.cn)("hover:bg-accent flex w-full items-center gap-2 rounded px-2 py-1.5 text-left text-sm",e.selectedId===s.id&&"bg-accent font-medium"),"aria-pressed":e.selectedId===s.id,"data-test":"table-source-choice",onClick:()=>e.onSelect({tableId:s.id,name:s.name,path:`${e.path} / v${r.versionNumber} / ${(0,tb.titleCaseTableName)(n.name)} / ${(0,tb.titleCaseTableName)(s.name)}`}),children:[(0,t.jsx)(tX.Table2,{className:"text-muted-foreground size-4 shrink-0"}),(0,t.jsx)("span",{className:"truncate",children:(0,tb.titleCaseTableName)(s.name)})]},s.id)),!n.tables.some(t=>t.id!==e.excludeId)&&(0,t.jsx)("p",{className:"text-muted-foreground p-2 text-xs",children:"No other tables."})]},n.id)),!r.workbooks.length&&(0,t.jsx)("p",{className:"text-muted-foreground p-2 text-xs",children:"No workbooks."})]},r.id))]})}let t3="border-input bg-background h-9 w-full rounded-md border px-2 text-sm";function t8({doc:e,tableId:n,versionId:r,accountId:s,disabled:l,onChange:a,target:o,onClose:i,template:d=!1}){return(0,t.jsx)(tH.Dialog,{open:null!==o,onOpenChange:e=>{e||i()},children:(0,t.jsxs)(tH.DialogContent,{className:"max-h-[85dvh] overflow-y-auto sm:max-w-xl",onCloseAutoFocus:e=>e.preventDefault(),children:[(0,t.jsx)(tH.DialogHeader,{children:(0,t.jsx)(tH.DialogTitle,{children:o?.rowId?"Linked table":"Link a table"})}),o&&(0,t.jsx)(t4,{doc:e,tableId:n,versionId:r,accountId:s,row:e.rows.find(e=>e.id===o.rowId),beforeId:o.beforeId,disabled:l,template:d,onChange:a,onClose:i},o.rowId??o.beforeId??"new")]})})}function t4({doc:e,tableId:r,versionId:a,accountId:o,beforeId:i,row:d,disabled:c,onChange:u,onClose:m,template:p=!1}){let h=(0,y.useSupabase)(),f=(0,l.useQueryClient)(),[x,g]=(0,n.use
1State)(null),k=(0,n.useRef)(null),j=(0,tU.useForm)({defaultValues:{path:"",source:d?.reference?.tableId??"",name:d?.reference?.title??e.resolved?.items.find(e=>e.source?.anchor===d?.id)?.source?.name??d?.reference?.name??"",mode:d?.reference?.mode??"items",grouping:d?.reference?.grouping==="sections"?"sections":"table",mapping:d?.reference?.columns??{}}}),N=(0,tU.useWatch)({control:j.control,name:"source"}),S=(0,tU.useWatch)({control:j.control,name:"path"}),C=(0,s.useQuery)({queryKey:["table-link-selection",N],enabled:!!N,queryFn:async()=>{let{data:e,error:t}=await h.from("tables").select("id,name,doc").eq("id",N).single();if(t)throw t;return e}}).data,T=v.TableDocSchema.safeParse(C?.doc),I=T.success?T.data:null,F=(0,tU.useWatch)({control:j.control,name:"mapping"}),$=[...new Set([...I?.columns.map(e=>e.key)??[],...Object.values(F)])],_=async e=>{k.current=e.tableId,g(null);let{data:t,error:n}=await h.from("tables").select("id,name,doc").eq("id",e.tableId).single();if(k.current!==e.tableId)return;if(n)return void g("Could not read this table.");let r=v.TableDocSchema.safeParse(t.doc);r.success?(f.setQueryData(["table-link-selection",e.tableId],t),j.setValue("source",e.tableId),j.setValue("name",(0,tb.titleCaseTableName)(e.name)),j.setValue("path",e.path),j.setValue("mapping",Object.fromEntries(r.data.columns.map(e=>[e.key,e.key])))):g("Could not read this table.")},P=j.handleSubmit(async e=>{if(!e.name.trim()||!N&&!d?.reference)return void g("Choose a source table.");if(N){let e=await fetch(`/api/tables/${N}`);if(!e.ok)return void g("Could not read this source table.");if((await e.json()).sources.some(e=>e.id===r))return void g("This link would create a circular reference.")}u(t=>{let n=new Set(t.columns.map(e=>e.key)),r=[],s=new Set(I?(0,w.summedKeys)(I.columns):[]);for(let[t,l]of Object.entries(e.mapping)){if(n.has(t))continue;let e=I?.columns.find(e=>e.key===l);r.push({kind:"value",key:t,label:e?.label??l,format:e?.format??(e?.kind==="measure"||e?.kind==="formula"?"number":"text"),precision:e?.precision,total:s.has(l)?"sum":"none"})}let l={...d??{id:(0,tL.freshRowId)(t,e.name)},reference:{...d?.reference??{},tableId:p?void 0:N||void 0,name:C?.name??d?.reference?.name??e.name.trim(),title:e.name.trim()===(C?.name??d?.reference?.name)?void 0:e.name.trim(),mode:e.mode,grouping:d?.reference?.grouping==="flat"&&"table"===e.grouping?"flat":e.grouping,columns:e.mapping}},a={...t,columns:[...t.columns,...r]};return d?{...a,rows:a.rows.map(e=>e.id===d.id?l:e)}:(0,tL.withLinkedTableInserted)(a,l,i)}),m()}),z=e=>{d&&u(t=>{let n=[...t.rows],r=n.findIndex(e=>e.id===d.id),s=r+e;return s<0||s>=n.length?t:([n[r],n[s]]=[n[s],n[r]],{...t,rows:n})})};return(0,t.jsx)(tW.Form,{...j,children:(0,t.jsxs)("form",{onSubmit:e=>{P(e).catch(()=>g("Could not save this link. Try again."))},className:"space-y-4",children:[!d&&(0,t.jsx)(t1,{accountId:o,versionId:a,excludeId:r,selectedId:N,onSelect:e=>{_(e).catch(()=>g("Could not read this table."))}}),S&&(0,t.jsx)("p",{className:"text-muted-foreground text-xs","data-test":"table-source-path",children:S}),(0,t.jsx)(tW.FormField,{control:j.control,name:"name",render:({field:e})=>(0,t.jsxs)(tW.FormItem,{children:[(0,t.jsx)(tW.FormLabel,{children:"Heading"}),(0,t.jsx)(tW.FormControl,{children:(0,t.jsx)(eM.Input,{...e,disabled:c})})]})}),(0,t.jsxs)("div",{className:"grid grid-cols-2 gap-3",children:[(0,t.jsx)(tW.FormField,{control:j.control,name:"mode",render:({field:e})=>(0,t.jsxs)(tW.FormItem,{children:[(0,t.jsx)(tW.FormLabel,{children:"Include"}),(0,t.jsx)(tW.FormControl,{children:(0,t.jsxs)("select",{...e,disabled:c,className:t3,children:[(0,t.jsx)("option",{value:"items",children:"Item rows"}),(0,t.jsx)("option",{value:"total",children:"Total only"})]})})]})}),(0,t.jsx)(tW.FormField,{control:j.control,name:"grouping",render:({field:e})=>(0,t.jsxs)(tW.FormItem,{children:[(0,t.jsx)(tW.FormLabel,{children:(0,t.jsx)(L.Trans,{i18nKey:"tables:sourceSections",defaults:"Source sections"})}),(0,t.jsx)(tW.FormControl,{children:(0,t.jsxs)("select",{...e,disabled:c,className:t3,children:[(0,t.jsx)("option",{value:"table",children:(0,t.jsx)(L.Trans,{i18nKey:"tables:flattenSourceSections",defaults:"Flatten items"})}),(0,t.jsx)("option",{value:"sections",children:(0,t.jsx)(L.Trans,{i18nKey:"tables:keepSourceSections",defaults:"Keep section headings"})})]})})]})})]}),$.length>0&&(0,t.jsxs)("details",{className:"space-y-2",children:[(0,t.jsx)("summary",{className:"cursor-pointer text-sm",children:"Match columns"}),$.map(n=>{let r=Object.entries(F).find(([,e])=>e===n)?.[0]??"",s=I?.columns.find(e=>e.key===n)?.label??n;return(0,t.jsxs)("div",{className:"grid grid-cols-2 items-center gap-3 text-sm",children:[(0,t.jsx)("span",{children:s}
1),(0,t.jsxs)("select",{disabled:c,className:t3,"aria-label":`Destination for ${n}`,value:r,onChange:e=>{let t=e.target.value,s={...F};r&&delete s[r],t&&(s[t]=n),j.setValue("mapping",s),g(null)},children:[(0,t.jsx)("option",{value:"",children:"Not linked"}),e.columns.map(e=>(0,t.jsx)("option",{value:e.key,disabled:!!F[e.key]&&F[e.key]!==n,children:e.label??e.key},e.key)),!e.columns.some(e=>e.key===n)&&(0,t.jsxs)("option",{value:n,disabled:!!F[n]&&F[n]!==n,children:["Add ",s," column"]}),r&&r!==n&&!e.columns.some(e=>e.key===r)&&(0,t.jsx)("option",{value:r,children:r})]})]},n)})]}),(0,t.jsxs)("p",{className:"text-muted-foreground text-xs",children:[p?"Templates find the source by name in the destination drawing. ":"","Columns appear automatically. Hide a column from its header menu."]}),x&&(0,t.jsx)("p",{role:"alert",className:"text-destructive text-sm",children:x}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[d&&!c&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(M.Button,{type:"button",variant:"ghost",size:"icon","aria-label":"Move linked table up",onClick:()=>z(-1),children:(0,t.jsx)(tq.ArrowUp,{className:"size-4"})}),(0,t.jsx)(M.Button,{type:"button",variant:"ghost",size:"icon","aria-label":"Move linked table down",onClick:()=>z(1),children:(0,t.jsx)(tV.ArrowDown,{className:"size-4"})}),(0,t.jsxs)(M.Button,{type:"button",variant:"ghost",className:"text-destructive",onClick:()=>{u(e=>({...e,rows:e.rows.filter(e=>e.id!==d.id)})),m()},children:[(0,t.jsx)(b.X,{className:"size-4"}),"Remove link"]})]}),(0,t.jsx)(M.Button,{disabled:c||j.formState.isSubmitting||!N&&!d?.reference,className:"ml-auto",type:"submit",children:d?"Save":"Insert table"})]})]})})}var t7=e.i(885960),t6=e.i(112847),t9=e.i(265736),ne=e.i(852538);function nt({index:e,label:n,disabled:r,template:s}){let l=(0,tU.useFormContext)(),a=(0,tU.useWatch)({control:l.control,name:`fields.${e}.dateFormat`}),o=(0,t9.resolveDateFormat)(a);return(0,t.jsx)(tW.FormField,{control:l.control,name:`fields.${e}.value`,render:({field:a})=>(0,t.jsxs)(tW.FormItem,{children:[s?(0,t.jsx)(ne.DateFormatMenu,{value:(0,t9.toDateValue)(new Date),format:o.key,disabled:r,onChange:t=>l.setValue(`fields.${e}.dateFormat`,t,{shouldDirty:!0}),children:(0,t.jsxs)(M.Button,{type:"button",variant:"outline",disabled:r,className:"w-full justify-between font-normal shadow-none","aria-label":`${n} format`,children:[o.format(new Date),(0,t.jsx)(Y.ChevronDown,{className:"size-4"})]})}):(0,t.jsx)(tW.FormControl,{children:(0,t.jsx)(ne.DateField,{...a,value:a.value??"",allowEmpty:!0,disabled:r,format:o.key,"aria-label":n,placeholder:"Choose date",onChange:(t,n)=>{a.onChange(t),l.setValue(`fields.${e}.dateFormat`,n,{shouldDirty:!0}),t||l.setValue(`fields.${e}.default`,void 0,{shouldDirty:!0})}})}),(0,t.jsx)(tW.FormMessage,{})]})})}async function nn(e){if(!["image/png","image/jpeg","image/webp"].includes(e.type))throw Error("Choose a PNG, JPEG or WebP image.");if(e.size>5242880)throw Error("Choose a logo smaller than 5 MB.");let t=await createImageBitmap(e);try{let e=Math.min(1,640/t.width,240/t.height),n=document.createElement("canvas");n.width=Math.max(1,Math.round(t.width*e)),n.height=Math.max(1,Math.round(t.height*e));let r=n.getContext("2d");if(!r)throw Error("Could not read this image.");r.drawImage(t,0,0,n.width,n.height);let s=v.PrintLogoSchema.safeParse(n.toDataURL("image/webp",.9));if(!s.success)throw Error("This image is too detailed. Choose a smaller logo.");return s.data}finally{t.close()}}function nr({disabled:e,template:r=!1}){let s=(0,tU.useFormContext)(),l=(0,tU.useFieldArray)({control:s.control,name:"parties"}),a=(0,tU.useFieldArray)({control:s.control,name:"fields"}),o=(0,tU.useWatch)({control:s.control,name:"logo"}),i=(0,tU.useWatch)({control:s.control,name:"fields"}),[d,c]=(0,n.useState)(!1);return(0,t.jsxs)("div",{className:"space-y-5",children:[(0,t.jsx)(tW.FormField,{control:s.control,name:"title",render:({field:n})=>(0,t.jsxs)(tW.FormItem,{children:[(0,t.jsx)(tW.FormLabel,{children:"Document title"}),(0,t.jsx)(tW.FormControl,{children:(0,t.jsx)(eM.Input,{...n,value:n.value??"",maxLength:200,disabled:e,placeholder:"Material estimate"})}),(0,t.jsx)(tW.FormMessage,{})]})}),(0,t.jsxs)("details",{open:!0,className:"space-y-3",children:[(0,t.jsx)("summary",{className:"cursor-pointer text-sm font-medium",children:"Company & logo"}),(0,t.jsx)(tW.FormField,{control:s.control,name:"logo",render:()=>(0,t.jsxs)(tW.FormItem,{children:[(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsx)(tW.FormLabel,{children:"Logo"}),o&&(0,t.jsxs)(M.Button,{type:"button",variant:"ghost",size:"sm",disabled:e||d,onClick:()=>s.setValue("logo",void 0,{shouldDirty:!0}),children:[(0,t.jsx)(b.X,{className:"size-3"}),"Remove"]})]}),(0,t.jsx)(tW.FormControl,{children:(0,t.jsx)(eM.Input,{type:"file",accept:"image/png,image/jpeg,image/webp",disabled:e||d,onChange:async e=>{let t=e.target.files?.[0];if(e.target.value="",t){c(!0),s.clearErrors("logo");try{s.setValue("logo",await nn(t),{shouldDirty:!0})}catch(e){s.setError("logo",{message:e instanceof Error?e.message:"Could not read this image."})}finally{c(!1)}}}})}),d&&(0,t.jsx)("p",{className:"text-muted-foreground text-xs",role:"status",children:"Preparing logo…"}),(0,t.jsx)(tW.FormMessage,{})]})}),(0,t.jsx)(tW.FormField,{control:s.control,name:"company.name",render:({field:n})=>(0,t.jsxs)(tW.FormItem,{children:[(0,t.jsx)(tW.FormLabel,{children:"Company name"}),(0,t.jsx)(tW.FormControl,{children:(0,t.jsx)(eM.Input,{...n,value:n.value??"",maxLength:200,disabled:e})}),(0,t.jsx)(tW.FormMessage,{})]})}),(0,t.jsx)(tW.FormField,{control:s.control,name:"company.details",render:({field:n})=>(0,t.jsxs)(tW.FormItem,{children:[(0,t.jsx)(tW.FormLabel,{children:"Address & contact"}),(0,t.jsx)(tW.FormControl,{children:(0,t.jsx)(z.Textarea,{...n,value:n.value??"",maxLength:1e3,rows:3,disabled:e,placeholder:"Street, city, state, postal code\nContact name · phone · email"})}),(0,t.jsx)(tW.FormMessage,{})]})})]}),(0,t.jsxs)("details",{open:!0,className:"space-y-3",children:[(0,t.jsx)("summary",{className:"cursor-pointer text-sm font-medium",children:"Parties & project"}),r&&(0,t.jsx)("p",{className:"text-muted-foreground text-xs",children:"Choose the blocks to include. Names and addresses are filled 
1in for each estimate."}),l.fields.map((n,a)=>(0,t.jsxs)("div",{className:"space-y-2 rounded-md border p-3",children:[(0,t.jsxs)("div",{className:"flex items-center gap-1",children:[(0,t.jsx)(tW.FormField,{control:s.control,name:`parties.${a}.label`,render:({field:n})=>(0,t.jsxs)(tW.FormItem,{className:"min-w-0 flex-1",children:[(0,t.jsx)(tW.FormControl,{children:(0,t.jsx)(eM.Input,{...n,maxLength:80,"aria-label":`Party ${a+1} label`,disabled:e,className:"h-8 border-transparent px-0 font-medium shadow-none"})}),(0,t.jsx)(tW.FormMessage,{})]})}),(0,t.jsx)(M.Button,{type:"button",variant:"ghost",size:"icon",className:"size-7",disabled:e,"aria-label":`Remove party ${a+1}`,onClick:()=>l.remove(a),children:(0,t.jsx)(g.Trash2,{className:"size-3.5"})})]}),!r&&(0,t.jsx)(tW.FormField,{control:s.control,name:`parties.${a}.name`,render:({field:n})=>(0,t.jsxs)(tW.FormItem,{children:[(0,t.jsx)(tW.FormControl,{children:(0,t.jsx)(eM.Input,{...n,maxLength:200,"aria-label":`Party ${a+1} name`,disabled:e,placeholder:"Name"})}),(0,t.jsx)(tW.FormMessage,{})]})}),!r&&(0,t.jsx)(tW.FormField,{control:s.control,name:`parties.${a}.details`,render:({field:n})=>(0,t.jsxs)(tW.FormItem,{children:[(0,t.jsx)(tW.FormControl,{children:(0,t.jsx)(z.Textarea,{...n,maxLength:1e3,rows:2,"aria-label":`Party ${a+1} details`,disabled:e,placeholder:"Address and contact details"})}),(0,t.jsx)(tW.FormMessage,{})]})})]},n.id)),(0,t.jsxs)(M.Button,{type:"button",size:"sm",variant:"ghost",disabled:e||l.fields.length>=6,onClick:()=>l.append({label:"Party",name:"",details:""}),children:[(0,t.jsx)(p.Plus,{className:"size-3.5"}),"Add party"]})]}),(0,t.jsxs)("details",{open:!0,className:"space-y-3",children:[(0,t.jsx)("summary",{className:"cursor-pointer text-sm font-medium",children:"Document details"}),a.fields.map((n,l)=>(0,t.jsxs)("div",{className:"space-y-1.5",children:[(0,t.jsxs)("div",{className:"flex items-center gap-1",children:[(0,t.jsx)(tW.FormField,{control:s.control,name:`fields.${l}.label`,render:({field:n})=>(0,t.jsxs)(tW.FormItem,{className:"min-w-0 flex-1",children:[(0,t.jsx)(tW.FormControl,{children:(0,t.jsx)(eM.Input,{...n,maxLength:80,"aria-label":`Detail ${l+1} label`,disabled:e,placeholder:"Label",className:"h-7 border-transparent px-0 font-medium shadow-none"})}),(0,t.jsx)(tW.FormMessage,{})]})}),(0,t.jsx)(tW.FormField,{control:s.control,name:`fields.${l}.type`,render:({field:n})=>(0,t.jsx)(tW.FormItem,{children:(0,t.jsx)(tW.FormControl,{children:(0,t.jsxs)("select",{...n,value:n.value??"text",onChange:e=>{n.onChange(e),s.setValue(`fields.${l}.value`,"",{shouldDirty:!0}),s.setValue(`fields.${l}.default`,void 0,{shouldDirty:!0})},disabled:e,"aria-label":`Detail ${l+1} type`,className:"h-7 rounded border px-1 text-xs",children:[(0,t.jsx)("option",{value:"text",children:"Text"}),(0,t.jsx)("option",{value:"date",children:"Date"})]})})})}),(0,t.jsx)(M.Button,{type:"button",variant:"ghost",size:"icon",className:"text-muted-foreground size-7 shrink-0",disabled:e,"aria-label":`Remove detail ${l+1}`,onClick:()=>a.remove(l),children:(0,t.jsx)(b.X,{className:"size-3.5"})})]}),i?.[l]?.type==="date"?(0,t.jsx)(nt,{template:r,index:l,label:i?.[l]?.label||`Detail ${l+1}`,disabled:e}):r?null:(0,t.jsx)(tW.FormField,{control:s.control,name:`fields.${l}.value`,render:({field:n})=>(0,t.jsxs)(tW.FormItem,{children:[(0,t.jsx)(tW.FormControl,{children:(0,t.jsx)(eM.Input,{...n,maxLength:1e3,"aria-label":i?.[l]?.label||`Detail ${l+1} value`,disabled:e,placeholder:i?.[l]?.label})}),(0,t.jsx)(tW.FormMessage,{})]})}),i?.[l]?.type==="date"?(0,t.jsx)(tW.FormField,{control:s.control,name:`fields.${l}.default`,render:({field:n})=>(0,t.jsxs)(tW.FormItem,{className:"flex flex-row flex-wrap items-center gap-x-2 gap-y-1",children:[(0,t.jsx)(tW.FormControl,{children:(0,t.jsx)("input",{type:"checkbox",disabled:e,checked:i?.[l]?.default==="today",onChange:e=>{n.onChange(e.target.checked?"today":void 0),!e.target.checked||r||s.getValues(`fields.${l}.value`)||s.setValue(`fields.${l}.value`,(0,t6.localDateValue)(),{shouldDirty:!0})}})}),(0,t.jsx)(tW.FormLabel,{className:"text-muted-foreground text-xs font-normal",children:"Default to today"}),(0,t.jsx)("p",{className:"text-muted-foreground basis-full text-xs",children:"New estimates fill in today's date."})]})}):r?(0,t.jsx)("p",{className:"text-muted-foreground text-xs",children:"Filled in for each estimate"}):null]},n.id)),(0,t.jsxs)(M.Button,{type:"button",size:"sm",variant:"ghost",disabled:e||a.fields.length>=20,onClick:()=>a.append({label:"",value:""}),children:[(0,t.jsx)(p.Plus,{className:"size-3.5"}),"Add detail"]})]}),(0,t.jsxs)("details",{className:"space-y-3",children:[(0,t.jsx)("summary",{className:"cursor-pointer text-sm font-medium",children:"Notes & footer"}),(0,t.jsx)(tW.FormField,{control:s.control,name:"notes",render:({field:n})=>(0,t.jsxs)(tW.FormItem,{children:[(0,t.jsx)(tW.FormLabel,{children:"Notes / terms"}),(0,t.jsx)(tW.FormControl,{children:(0,t.jsx)(z.Textarea,{...n,value:n.value??"",maxLength:4e3,rows:4,disabled:e})}),(0,t.jsx)(tW.FormMessage,{})]})}),(0,t.jsx)(tW.FormField,{control:s.control,name:"footer",render:({field:n})=>(0,t.jsxs)(tW.FormItem,{children:[(0,t.jsx)(tW.FormLabel,{children:"Footer"}),(0,t.jsx)(tW.FormControl,{children:(0,t.jsx)(z.Textarea,{...n,value:n.value??"",maxLength:2e3,rows:2,disabled:e,placeholder:"Company registration, website or closing note"})}),(0,t.jsx)(tW.FormMessage,{})]})}),(0,t.jsx)(tW.FormField,{control:s.control,name:"showStatus",render:({field:n})=>(0,t.jsxs)(tW.FormItem,{className:"flex flex-row items-center gap-2",children:[(0,t.jsx)(tW.FormControl,{children:(0,t.jsx)("input",{type:"checkbox",checked:n.value??!0,onChange:n.onChange,disabled:e})}),(0,t.jsx)(tW.FormLabel,{children:"Show live / frozen status"})]})})]})]})}function ns(e){let t=e=>({label:e.label,name:e.name,details:e.details});return{title:e.title??"",logo:e.logo,company:e.company?t(e.company):void 0,parties:(e.parties??[]).map(e=>t({...e,name:"",details:""})),fields:(e.fields??[]).map(e=>{let t=(0,t6.printField)(e);return{label:t.label,value:"",type:t.type??"text",..."date"===t.type?{dateFormat:(0,t9.resolveDateFormat)(t.dateFormat).key,default:t.default}:{}}}),footer:e.footer??"",notes:e.notes??"",paper:e.paper??"letter",landscape:e.landscape??!1,pageNumbers:e.pageNumbers??!1,lineNumbers:e.lineNumbers??!1,showStatus:e.showStatus??!0}}function nl(e,t){return JSON.stringify(ns(e))===JSON.stringify(ns(t))}function na({accountId:e,doc:r,disabled:a,template:o}){let i=(0,tU.useFormContext)(),d=(0,y.useSupabase)(),c=(0,l.useQueryClient)(),[{saving:u,selection:m,updating:p}
1,h]=(0,n.useState)({saving:!1,selection:void 0,updating:!1}),f=(0,n.useRef)(!1),[x]=(0,n.useState)(r.layout),g=(0,tU.useWatch)({control:i.control}),b=(0,s.useQuery)({queryKey:["table-templates",e],queryFn:()=>(0,q.fetchTableTemplates)(d,e),staleTime:6e4}),v=function(e,t){let n=new Map;for(let r of[...e].sort((e,n)=>Number(n.id===t)-Number(e.id===t)||Number(n.isDefault)-Number(e.isDefault)||Number(!!e.doc.rows?.length)-Number(!!n.doc.rows?.length)||e.name.localeCompare(n.name))){let e=r.doc.layout;if(!e||![e.title,e.logo,e.company,e.parties?.length,e.fields?.length,e.footer,e.paper,e.landscape,e.pageNumbers,e.lineNumbers,e.showStatus].some(e=>void 0!==e&&!1!==e&&""!==e&&0!==e))continue;let t=JSON.stringify(ns(e));n.has(t)||n.set(t,r)}return[...n.values()]}(b.data??[],m),w=m?b.data?.find(e=>e.id===m):v.find(e=>!!x&&!!e.doc.layout&&nl(x,e.doc.layout)),k=!!w?.doc.layout&&!nl(g,w.doc.layout),j=()=>Promise.all([c.invalidateQueries({queryKey:["table-templates",e]}),c.invalidateQueries({queryKey:["template-table-templates",e]})]),N=async()=>{if(w&&!f.current){f.current=!0,h(e=>({...e,updating:!0}));try{if(!await i.trigger())return;let t=await (0,q.updateTableTemplate)(d,{accountId:e,id:w.id,expectedDoc:w.doc,doc:{...w.doc,layout:{...w.doc.layout,...ns(i.getValues())}}});if(!t.ok)throw Error(t.reason);h(e=>({...e,selection:t.value.id})),await j(),P.toast.success(`Updated the layout in “${t.value.name}”.`)}catch(e){P.toast.error(e instanceof Error?e.message:"The layout could not be updated.")}finally{f.current=!1,h(e=>({...e,updating:!1}))}}};return(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-2 border-b pb-3",children:[(0,t.jsx)("span",{className:"text-muted-foreground text-sm",children:(0,t.jsx)(L.Trans,{i18nKey:"drawings:table.printLayout",defaults:"Layout"})}),(0,t.jsxs)("select",{"aria-label":"Print layout template","data-test":"print-layout-template",disabled:a||p||b.isPending||b.isError,value:w?.id??"",className:"h-9 min-w-0 flex-1 rounded-md border bg-transparent px-2 text-sm",onChange:e=>{let t=b.data?.find(t=>t.id===e.target.value)?.doc.layout;if(!t)return;let n=e.target.value;h(e=>({...e,selection:n}));let r=(0,t6.applyPrintLayout)(i.getValues(),t);i.reset(o?r:(0,t6.fillPrintDates)(r),{keepDefaultValues:!0})},children:[(0,t.jsx)("option",{value:"",disabled:!0,children:b.isPending?"Loading layouts…":b.isError?"Could not load layouts":(0,t.jsx)(L.Trans,{i18nKey:"drawings:table.customPrintLayout",defaults:"Custom layout"})}),v.map(e=>(0,t.jsxs)("option",{value:e.id,children:[e.name,e.id===w?.id&&k?(0,t.jsxs)(t.Fragment,{children:[" ","·"," ",(0,t.jsx)(L.Trans,{i18nKey:"drawings:table.modifiedLayout",defaults:"Modified"})]}):""]},e.id))]}),!o&&w&&(0,t.jsx)(M.Button,{type:"button",size:"sm",variant:"outline",disabled:a||p||!k,title:`Update only the print layout in “${w.name}”`,"data-test":"print-update-template",onClick:()=>void N(),children:p?"Updating…":(0,t.jsx)(L.Trans,{i18nKey:"drawings:table.updatePrintLayout",defaults:"Update layout"})}),!o&&(0,t.jsx)(M.Button,{type:"button",size:"sm",variant:"outline",disabled:a||p,onClick:()=>{i.trigger().then(e=>{e&&h(e=>({...e,saving:!0}))})},children:(0,t.jsx)(L.Trans,{i18nKey:"drawings:table.saveNewTemplate",defaults:"Save as new template…"})}),(0,t.jsx)(tH.Dialog,{open:u,onOpenChange:e=>h(t=>({...t,saving:e})),children:(0,t.jsxs)(tH.DialogContent,{children:[(0,t.jsxs)(tH.DialogHeader,{children:[(0,t.jsx)(tH.DialogTitle,{children:(0,t.jsx)(L.Trans,{i18nKey:"drawings:table.newTemplate",defaults:"New table template"})}),(0,t.jsx)(tH.DialogDescription,{children:"Reuse this layout, branding and columns. Customer details and document dates are filled in for each estimate."})]}),u&&(0,t.jsx)(D.TableTemplateSaveForm,{doc:{...r,layout:i.getValues()},onCancel:()=>h(e=>({...e,saving:!1})),onSave:async t=>{let n=await (0,q.saveTableTemplate)(d,{accountId:e,...t,doc:{...r,layout:i.getValues()}});if(!n.ok)throw Error(n.reason);h(e=>({...e,selection:n.value.id})),await j(),h(e=>({...e,saving:!1})),P.toast.success(`Saved “${n.value.name}” in Library → Table templates.`)}})]})})]})}function no(e){let t=new Map(e.resolved?.items.map(e=>[e.id,e.source])),n=new Map,r=new Map;for(let s of(0,S.tableDisplayRows)(e)){let e=t.get(s.id)?.anchor;if(e){let t=n.get(e)??[];t.push(s),n.set(e,t)}else r.set(s.id,s)}let s=[];for(let l of e.rows)if(l.reference){let e=n.get(l.id)??[];s.push({key:`@link:${l.id}`,link:l,title:l.reference.title??(e[0]?t.get(e[0].id)?.name:void 0)??l.reference.name,rows:e})}else{let e=s.at(-1),t=r.get(l.id)??l;e&&!e.link?e.rows.push(t):s.push({key:l.id,rows:[t]})}return s}function ni(e,t){return e.link?e.link.reference?.grouping==="sections"&&t.section?.startsWith(`${e.t
1itle} / `)?t.section:void 0:t.section}function nd(e,t){return e.link?t.slice(`${e.title} / `.length):t}let nc=e=>e.replace(/[&<>"']/g,e=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[e]);function nu(e){let[t,n]=e?.paper==="a4"?[210,297]:[215.9,279.4];return{width:(e?.landscape?n:t)*96/25.4,height:(e?.landscape?t:n)*96/25.4}}function nm({html:e,width:r,height:s,frame:l,onReady:a}){let o=(0,n.useRef)(null),[i,d]=(0,n.useState)({available:r,content:s});(0,n.useEffect)(()=>{let e=o.current,t=l.current;if(!e||!t)return;let n=()=>{let n=t.contentDocument?.querySelector("main"),r={available:Math.max(1,e.clientWidth-32),content:Math.max(s,n?.getBoundingClientRect().height??s)};d(e=>e.available===r.available&&e.content===r.content?e:r)},r=new ResizeObserver(n);r.observe(e);let a=()=>{r.disconnect(),r.observe(e);let s=t.contentDocument?.querySelector("main");s&&r.observe(s),n()};return t.addEventListener("load",a),a(),()=>{r.disconnect(),t.removeEventListener("load",a)}},[l,e,s]);let c=Math.min(1,i.available/r);return(0,t.jsx)("div",{ref:o,className:"bg-muted/70 min-h-[220px] min-w-0 overflow-auto rounded-md border p-4","data-test":"print-preview-surface",children:(0,t.jsx)("div",{className:"relative mx-auto overflow-hidden shadow-md",style:{width:r*c,height:Math.max(s,i.content)*c},children:(0,t.jsx)("iframe",{ref:l,title:"Table print preview",className:"absolute top-0 left-0 origin-top-left border-0 bg-white",style:{width:r,height:Math.max(s,i.content),transform:`scale(${c})`},srcDoc:e,onLoad:()=>a(e)})})})}function np({doc:e,accountId:n,template:r=!1,columnWidths:s,disabled:l,saving:a=!1,saveError:o,onChange:i,open:d,onOpenChange:c}){return(0,t.jsx)(tH.Dialog,{open:d,onOpenChange:c,children:(0,t.jsxs)(tH.DialogContent,{className:"flex h-[90dvh] max-w-[95vw] flex-col sm:max-w-6xl",onCloseAutoFocus:e=>e.preventDefault(),children:[(0,t.jsxs)(tH.DialogHeader,{children:[(0,t.jsx)(tH.DialogTitle,{children:r?"Template layout":"Print table"}),(0,t.jsx)(tH.DialogDescription,{children:r?"Set the branding and fields to reuse for every estimate.":"Edit document details and see your changes on the page."})]}),d&&(0,t.jsx)(nh,{doc:e,accountId:n,template:r,columnWidths:s,disabled:l,saving:a,saveError:o,onChange:i})]})})}function nh({doc:e,accountId:r,template:s,columnWidths:l,disabled:a,saving:o=!1,saveError:i,onChange:d}){let c,u=(0,n.useRef)(null),[m,p]=(0,n.useState)("document"),[h,f]=(0,n.useState)(null),x=(0,tU.useForm)({resolver:(0,t7.zodResolver)(v.TableLayoutSchema),defaultValues:(c={...e.layout,title:e.layout?.title??(s?"Material estimate":(0,tb.titleCaseTableName)(e.name)),notes:e.layout?.notes??"",logo:e.layout?.logo,company:e.layout?.company??{label:"Prepared by",name:"",details:""},parties:e.layout?.parties??[{label:"Prepared for",name:"",details:""},{label:"Project",name:"",details:""}],fields:(e.layout?.fields??[{label:"Estimate no.",value:""},{label:"Date",value:"",type:"date",default:"today"},{label:"Valid until",value:"",type:"date"},{label:"Revision",value:""}]).map(t6.printField),footer:e.layout?.footer??"",pageNumbers:e.layout?.pageNumbers??!1,lineNumbers:e.layout?.lineNumbers??!1,showStatus:e.layout?.showStatus??!0,paper:e.layout?.paper??"letter",landscape:e.layout?.landscape??!1,widths:Object.fromEntries(e.columns.map(t=>[t.key,l?.[t.key]??e.layout?.widths?.[t.key]??140])),breaks:e.layout?.breaks??[]},s||e.frozen?c:(0,t6.fillPrintDates)(c))}),g=(0,tU.useWatch)({control:x.control,defaultValue:x.getValues()}),b={...e.layout,...g},y=s?{...b,parties:b.parties?.map(e=>({...e,name:`[${e.label}]`,details:"Address and contact details"})),fields:b.fields?.map(e=>({...e,value:"date"===e.type?(0,t6.localDateValue)():`[${e.label}]`}))}:b,w=function(e){let t=nu(e.layout),n=e.columns.filter(t=>!e.layout?.hiddenColumns?.includes(t.key)),r=e.layout?.lineNumbers===!0,s=n.length+ +!!r,l=0,a=()=>r?`<td class="line-number">${++l}</td>`:"",o=e=>n.map(t=>{let n=e[t.key];return`<td class="${"text"===t.format||!t.format?"text":"number"}">${nc(n?.problem?"#ERROR":(0,tb.cellDisplayText)(t,n))}</td>`}).join(""),i=[],d=new Map(e.resolved?.items.map(e=>[e.id,e])),c=(t,n,r=!1)=>`<tr class="section ${e.layout?.breaks?.includes(t)?"break":""}${r?" subsection":""}"><th colspan="${s}">${nc(n)}</th></tr>`;for(let t of no(e)){let n;for(let r of(t.link&&i.push(c(t.title,t.title)),t.rows)){let l=d.get(r.id);if(!l)continue;let u=ni(t,r);for(let e of(u&&u!==n&&i.push(c(u,nd(t,u),!!t.link)),i.push(`<tr>${a()}${o(l.cells)}</tr>`),l.sub_rows??[]))i.push(`<tr class="detail">${a()}${o(e.cells)}</tr>`);let m=e.resolved?.sections?.find(e=>e.rows.at(-1)===l.id);if(m)for(let t of m.markups??[])i.push(`<tr class="note"><td colspan="${s}">${nc(t.label)}: ${Object.entries(t.amounts).map(([t,n])=>`${nc(e.columns.find(e=>e.key===t)?.label??t)} ${n.toFixed(2)}`).join(" · ")}</td></tr>`);n=u}}for(let t of e.resolved?.totals.markups??[])i.push(`<tr class="note"><td colspan="${s}">${nc(t.label)}: ${Object.values(t.amounts).map(e=>e.toFixed(2)).join(" · ")}</td></tr>`);let u=Object.fromEntries(Object.entries(e.resolved?.totals.columns??{}).map(([e,t])=>[e,{status:"live",value:t}])),m=n.find(e=>"text"===e.format||!e.format);m&&u[m.key]?.value==null&&(u[m.key]={status:"live",value:"Total"});let p=n.reduce((t,n)=>t+(e.layout?.widths?.[n.key]??140),0),h=(r?Math.max(40,7*String(l).length+16):0)/(t.width-2880/25.4),f=(r?`<col style="width:${100*h}%">`:"")+n.map(t=>{let n=(e.layout?.widths?.[t.key]??140)/p,r=`${100*(1-h)*n}%`;return`<col style="width:${r}">`}).join(""),x=e.resolved?.reference_errors??[],g=e.layout?.title||e.name,b=v.PrintLogoSchema.safeParse(e.layout?.logo),y=e=>e&&(e.name.trim()||e.details.trim())?`<section class="party"><div class="label">${nc(e.label)}</div>${e.name.trim()?`<h2>${nc(e.name)}</h2>`:""}<div class="address">${nc(e.details)}</div></section>`:"",w=(e.layout?.fields??[]).filter(e=>e.value.trim()),k=y(e.layout?.company),j=(e.layout?.parties??[]).map(y).join(""),N=e.frozen?.at??e.resolved?.resolved_at,S=N?new Date(N):null,C=S&&!Number.isNaN(S.valueOf())?S.toLocaleDateString("en-US",{year:"numeric",month:"short",day:"numeric",timeZone:"UTC"}):"",T=e.layout?.showStatus===!1?"":`<div class="status">${e.frozen?"Frozen":"Live estimate"}${C?` \xb7 ${nc(C)}`:""}</div>`,I=`<header><div class="brand">${b.success?`<img class="logo" src="${nc(b.data)}" alt="Company logo">`:""}${k}</div><div class="document"><h1>${nc(g)}</h1>${w.length?`<dl>${w.map(e=>`<div><dt>${nc(e.label)}</dt><dd>${nc("date"!==e.type||!/^\d{4}-\d{2}-\d{2}$/.test(e.value)?e.value:(0,t9.resolveDateFormat)(e.dateFormat).format((0,t9.parseDateValue)(e.value)))}</dd></div>`).join("")}</dl>`:""}</div></header>${j?`<div class="parties">${j}</div>`:""}`;return`<!doctype html><html><head><meta charset="utf-8"><meta http-equiv="Content-Security-Policy" content="default-src 'none'; img-src data:; style-src 'unsafe-inline';"><title>${nc(g)}</title><style>
2    @page { size: ${e.layout?.paper==="a4"?"A4":"letter"} ${e.layout?.landscape?"landscape":"portrait"}; margin: 15mm;
3      ${e.layout?.pageNumbers?'@bottom-right { content: "Page " counter(page) " of " counter(pages); font: 10px Arial,sans-serif; color:#637080; }':""}
4    }
5    * { box-sizing: border-box; } body { font: 11px/1.45 Arial,sans-serif; color:#202020; margin:0; } main { padding:15mm; min-height:${t.height}px; width:${t.width}px; }
6    header { display:flex; justify-content:space-between; gap:32px; padding-bottom:22px; border-bottom:2px solid #303b46; margin-bottom:22px; break-inside:avoid; }
7    .brand { flex:1; min-width:0; } .brand:empty { display:none; } .logo { display:block; max-width:180px; max-height:76px; width:auto; height:auto; margin-bottom:14px; object-fit:contain; object-position:left; }
8    .document { flex:1; min-width:0; } h1 { font-size:24px; line-height:1.2; margin:0 0 16px; overflow-wrap:anywhere; } h2 { font-size:13px; margin:3px 0 5px; }
9    .label,dt { color:#637080; font-size:10px; } .label { text-transform:uppercase; letter-spacing:.07em; } .address { white-space:pre-wrap; overflow-wrap:anywhere; }
10    .parties { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:18px 32px; margin-bottom:24px; } .party { break-inside:avoid; }
11    dl { margin:0; } dl>div { display:grid; grid-template-columns:minmax(70px,1fr) minmax(0,2fr); gap:12px; padding:3px 0; } dd { margin:0; white-space:pre-wrap; overflow-wrap:anywhere; }
12    .notes { white-space:pre-wrap; margin:24px 0; overflow-wrap:anywhere; } footer { border-top:1px solid #ddd; padding-top:12px; margin-top:24px; color:#637080; font-size:10px; white-space:pre-wrap; overflow-wrap:anywhere; } .status { margin-top:14px;
12 color:#777; font-size:9px; }
13    table { width:100%; border-collapse:collapse; table-layout:fixed; } th,td { padding:7px 8px; border-bottom:1px solid #ddd; vertical-align:top; overflow-wrap:anywhere; }
14    thead { display:table-header-group; } thead th { background:#eee; text-align:left; } tr { break-inside:avoid; } .number { text-align:right; }
15    .line-number { color:#637080; white-space:nowrap; text-align:right; font-variant-numeric:tabular-nums; }
16    .section th { background:#f5f5f5; text-align:left; padding-top:14px; } .section { break-after:avoid; } .subsection th { padding-left:20px; font-weight:normal; } .break { break-before:page; }
17    .detail { color:#666; font-size:10px; } .total { font-weight:bold; border-top:2px solid #333; } .note { color:#555; } .error { color:#b91c1c; }
18    @media screen { html { overflow:hidden; } main { width:100%; } .break th::before { content:'Page break'; display:block; border-top:1px dashed #a0a0a0; margin:16px 0 12px; padding-top:8px; color:#637080; font-weight:normal; font-size:9px; } }
19    @media print { main { width:auto; min-height:0; padding:0; } }
20    </style></head><body><main>${I}${x.length?`<p class="error">Incomplete: ${nc(x.join(" "))}</p>`:""}<table><colgroup>${f}</colgroup><thead><tr>${r?'<th class="line-number" scope="col">Line</th>':""}${n.map(e=>`<th>${nc(e.label??e.key)}</th>`).join("")}</tr></thead><tbody>${i.join("")}<tr class="total">${r?"<td></td>":""}${o(u)}</tr></tbody></table>${e.layout?.notes?`<div class="notes">${nc(e.layout.notes)}</div>`:""}${e.layout?.footer?.trim()?`<footer>${nc(e.layout.footer)}</footer>`:""}${T}</main></body></html>`}({...e,layout:y}),k=nu(b),j=x.handleSubmit(e=>{d(t=>({...t,layout:{...t.layout,...e}}),()=>{JSON.stringify(x.getValues())===JSON.stringify(e)&&x.reset(e),s&&P.toast.success("Layout applied. Save the template to keep your changes.")})});return(0,t.jsx)(tW.Form,{...x,children:(0,t.jsxs)("form",{className:"flex min-h-0 flex-1 flex-col gap-3",onSubmit:e=>{e.stopPropagation(),j(e)},children:[r&&(0,t.jsx)(na,{accountId:r,doc:e,disabled:a,template:s}),(0,t.jsxs)("div",{className:"grid min-h-0 flex-1 grid-cols-1 gap-5 md:grid-cols-[300px_minmax(0,1fr)]",children:[(0,t.jsxs)("div",{className:"flex min-h-0 min-w-0 flex-col gap-3",children:[(0,t.jsx)("div",{className:"flex gap-1 border-b pb-2","aria-label":"Print layout settings",children:["document","page"].map(e=>(0,t.jsx)(M.Button,{type:"button",variant:"ghost",size:"sm","aria-pressed":m===e,className:m===e?"bg-muted font-semibold":"",onClick:()=>p(e),children:"document"===e?"Document":"Page"},e))}),(0,t.jsx)("div",{className:"max-h-[45dvh] min-h-0 min-w-0 flex-1 overflow-y-auto p-2 md:max-h-none","data-test":"print-settings-scroll",children:"document"===m?(0,t.jsx)(nr,{disabled:a,template:s}):(0,t.jsxs)("div",{className:"space-y-4",children:[(0,t.jsx)(tW.FormField,{control:x.control,name:"paper",render:({field:e})=>(0,t.jsxs)(tW.FormItem,{children:[(0,t.jsx)(tW.FormLabel,{children:"Paper"}),(0,t.jsx)(tW.FormControl,{children:(0,t.jsxs)("select",{...e,disabled:a,className:"h-9 w-full rounded-md border px-2",children:[(0,t.jsx)("option",{value:"letter",children:"Letter"}),(0,t.jsx)("option",{value:"a4",children:"A4"})]})})]})}),(0,t.jsx)(tW.FormField,{control:x.control,name:"landscape",render:({field:e})=>(0,t.jsxs)(tW.FormItem,{className:"flex flex-row items-center gap-2",children:[(0,t.jsx)(tW.FormControl,{children:(0,t.jsx)("input",{type:"checkbox",disabled:a,checked:e.value,onChange:e.onChange})}),(0,t.jsx)(tW.FormLabel,{children:"Landscape"})]})}),(0,t.jsx)("p",{className:"text-muted-foreground text-xs",children:"Column widths follow the table. Drag its column edges to resize; printing scales those proportions to the page."}),(0,t.jsx)(tW.FormField,{control:x.control,name:"lineNumbers",render:({field:e})=>(0,t.jsxs)(tW.FormItem,{children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(tW.FormControl,{children:(0,t.jsx)("input",{type:"checkbox",disabled:a,checked:e.value??!1,onChange:e.onChange})}),(0,t.jsx)(tW.FormLabel,{children:"Line numbers"})]}),(0,t.jsx)("p",{className:"text-muted-foreground text-xs",children:"Add a Line column numbering each item, including expanded details, across all pages."})]})}),(0,t.jsx)(tW.FormField,{control:x.control,name:"pageNumbers",render:({field:e})=>(0,t.jsxs)(tW.FormItem,{children:[(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(tW.FormControl,{children:(0,t.jsx)("input",{type:"checkbox",disabled:a,checked:e.value??!1,onChange:e.onChange})}),(0,t.jsx)(tW.FormLabel,{children:"Page numbers"})]}),(0,t.jsx)("p",{className:"text-muted-foreground text-xs",children:"Page 1 of 5, at the bottom right. Final numbering appears in print preview and saved PDFs."}),e.value&&(0,t.jsx)("p",{className:"text-muted-foreground text-xs",children:"Turn off the browser's headers and footers in the print dialog to avoid duplicate numbering."})]})}),e.resolved?.sections?.length?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("p",{className:"text-sm font-medium",children:"Start on a new page"}),e.resolved.sections.map(e=>(0,t.jsxs)("label",{className:"flex items-center gap-2 text-xs",children:[(0,t.jsx)("input",{type:"checkbox",disabled:a,checked:(b.breaks??[]).includes(e.name),onChange:t=>x.setValue("breaks",t.target.checked?[...b.breaks??[],e.name]:(b.breaks??[]).filter(t=>t!==e.name),{shouldDirty:!0})}),e.name]},e.name))]}):null]})}),(0,t.jsxs)("div",{className:"space-y-2 border-t pt-3",children:[i&&(0,t.jsx)("p",{role:"alert",className:"text-destructive text-xs",children:i}),!a&&(0,t.jsx)(M.Button,{type:"submit",variant:"outline",className:"w-full",disabled:o,children:o?"Saving…":s?"Apply to template":x.formState.isDirty?"Save changes":"Save layout"}),!s&&(0,t.jsx)(M.Button,{type:"button",className:"w-full",disabled:h!==w,onClick:()=>{x.trigger().then(e=>{if(e){if(b.pageNumbers&&!("CSSMarginRule"in window))return void P.toast.error("This browser cannot print page numbers. Open Deta in Chrome or Edge, or turn off page numbers.");u.current?.contentWindow?.focus(),u.current?.contentWindow?.print()}})},children:h===w?"Print / Save PDF":"Preparing preview…"}),(0,t.jsx)("p",{className:"text-muted-foreground text-xs",children:s?"Sample placeholders are replaced for each estimate.":x.formState.isDirty?"Unsaved changes":"Blank fields are omitted from the document."})]})]}),(0,t.jsx)(nm,{frame:u,html:w,width:k.width,height:k.height,onReady:f})]})]})})}
20function nf({rule:e,onChange:n,inline:r=!1}){let s=(0,tU.useForm)({values:{rule:e??""}});return(0,t.jsx)(tW.Form,{...s,children:(0,t.jsx)(tW.FormField,{control:s.control,name:"rule",render:({field:e})=>(0,t.jsxs)(tW.FormItem,{className:(0,E.cn)("flex min-w-0 flex-row items-start gap-3 space-y-0 font-sans",r&&"bg-muted/25 sticky left-20 w-[calc(100cqw-7rem)] max-w-5xl rounded-md px-3 py-2"),children:[(0,t.jsx)(tW.FormLabel,{className:(0,E.cn)("text-muted-foreground shrink-0 pt-2 text-xs font-medium",!r&&"sr-only"),children:(0,t.jsx)(L.Trans,{i18nKey:"drawings:table.rowRule",defaults:"Row rule"})}),(0,t.jsx)(tW.FormControl,{children:(0,t.jsx)(z.Textarea,{...e,rows:1,maxLength:2e3,placeholder:"When and how to count this item",className:"hover:border-input focus-visible:border-input focus-visible:bg-background field-sizing-content max-h-64 min-h-9 min-w-0 flex-1 resize-y border-transparent bg-transparent px-2 py-1 text-sm leading-relaxed shadow-none focus-visible:ring-0 md:text-sm","data-test":"table-row-rule-input",onChange:t=>{e.onChange(t),n(t.target.value)}})})]})})})}function nx({rowId:e,rule:n,colSpan:r,onChange:s,links:l}){return(0,t.jsxs)("tr",{"data-test":"table-row-rule","data-item-id":e,children:[(0,t.jsx)("td",{}),(0,t.jsxs)("td",{colSpan:r-1,className:"border-b px-3 pt-1 pb-3",children:[l,(0,t.jsx)(nf,{rule:n,onChange:s,inline:!0})]})]})}var ng=e.i(60787),nb=e.i(793102),ny=e.i(43140);function nv({keys:e}){return(0,t.jsx)("span",{className:"text-muted-foreground shrink-0 font-mono text-[10px]",children:e})}function nw({vm:e,evidence:r,columns:s,renderCells:l,ruleToggle:a,editable:o,linkedActions:i,striped:d,collapsed:c,peekKey:u,subPeekOf:m,renderSubCells:h,colSpan:f,ordinal:x,onSelect:g,onToggleCollapse:y,onMoveBefore:v,sectionOptions:w,branchOptions:k,fanOptions:j,actions:N}){let S=e.item,C=(S.sub_rows?.length??0)>0,I=new Map(s.map(e=>[e.key,e])),F=null!==u?S.cells[u]:void 0,$=null===u?null:ey(F,S.sub_rows,u),[M,_]=(0,n.use
20State)(null),[P,z]=(0,n.useState)(null),L=null===M?null:I.get(M),D=L?.kind==="measure"?L:null,R=null===D?void 0:e.def.branch_scopes?.[D.key],O=null===D?void 0:e.def.units?.[D.key];return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(tE.ContextMenu,{children:[(0,t.jsx)(tE.ContextMenuTrigger,{asChild:!0,disabled:!o&&!i,children:(0,t.jsxs)("tr",{"data-test":"table-row","data-item-id":e.def.id,"data-selected":e.selected,"data-item-section":e.def.section,className:(0,E.cn)("group hover:bg-muted/40",d&&"bg-muted/20",e.selected&&"bg-blue-600/10"),onContextMenuCapture:e=>{let t=e.target.closest?.("td[data-col-id]");_(t instanceof HTMLElement?t.dataset.colId??null:null)},children:[(0,t.jsxs)("td",{className:(0,E.cn)(T.CELL_CLASS,"text-muted-foreground/70 relative overflow-visible pr-1 pl-1",o&&"cursor-pointer select-none",e.selected&&"text-blue-600"),onClick:o?e=>g(e.shiftKey):void 0,title:o?"Click to select — Shift extends; selected rows drag and re-file together":void 0,"data-test":"table-row-ordinal",children:[o?(0,t.jsx)(nk,{onInsert:N.onInsertAbove}):null,(0,t.jsxs)("span",{className:"flex items-center justify-end gap-0.5",children:[o?(0,t.jsx)(nj,{vm:e,onMoveBefore:v}):null,a,C?(0,t.jsx)("button",{type:"button",onClick:e=>{e.stopPropagation(),y()},className:"text-muted-foreground hover:text-foreground shrink-0",title:c?`Fan out — by ${e.def.fan?.by??"fan"}`:`Collapse — by ${e.def.fan?.by??"fan"}`,"aria-expanded":!c,"data-test":"fan-toggle",children:c?(0,t.jsx)(ed.ChevronRight,{className:"h-3 w-3"}):(0,t.jsx)(Y.ChevronDown,{className:"h-3 w-3"})}):null,(0,t.jsx)("span",{className:(0,E.cn)("font-mono text-[11px] tabular-nums",e.selected&&"font-semibold"),children:x})]})]}),l,o||i?(0,t.jsx)("td",{className:(0,E.cn)(T.CELL_CLASS,"px-1")}):null,(0,t.jsx)("td",{className:T.CELL_CLASS})]})}),(0,t.jsx)(tE.ContextMenuContent,{className:"w-56",onCloseAutoFocus:e=>e.preventDefault(),children:i?(0,t.jsx)(tD,{actions:i}):(0,t.jsxs)(t.Fragment,{children:[N.onLinkTable&&(0,t.jsxs)(tE.ContextMenuItem,{onSelect:N.onLinkTable,"data-test":"row-menu-link-table",children:["Link table here… ",(0,t.jsx)(nv,{keys:"/table"})]}),(0,t.jsxs)(tE.ContextMenuItem,{onSelect:N.onInsertAbove,"data-test":"row-menu-insert-above",children:[(0,t.jsx)(p.Plus,{className:"h-3.5 w-3.5"}),(0,t.jsx)("span",{className:"flex-1",children:"Insert row above"}),(0,t.jsx)(nv,{keys:"⇧⌘⏎"})]}),(0,t.jsxs)(tE.ContextMenuItem,{onSelect:N.onInsertBelow,"data-test":"row-menu-insert-below",children:[(0,t.jsx)(p.Plus,{className:"h-3.5 w-3.5"}),(0,t.jsx)("span",{className:"flex-1",children:"Insert row below"}),(0,t.jsx)(nv,{keys:"⌘⏎"})]}),(0,t.jsxs)(tE.ContextMenuItem,{onSelect:N.onDuplicate,"data-test":"row-menu-duplicate",children:[(0,t.jsx)(eU.Layers,{className:"h-3.5 w-3.5"}),"Duplicate row"]}),(0,t.jsx)(tE.ContextMenuSeparator,{}),(0,t.jsxs)(tE.ContextMenuSub,{children:[(0,t.jsx)(tE.ContextMenuSubTrigger,{"data-test":"row-menu-section",children:e.selected&&e.selectionSize>1?`Section — ${e.selectionSize} rows`:"Section"}),(0,t.jsxs)(tE.ContextMenuSubContent,{className:"w-48",children:[w.map(n=>(0,t.jsx)(tE.ContextMenuCheckboxItem,{checked:(e.def.section??null)===n,onSelect:()=>N.onSetSection((e.def.section??null)===n?null:n),children:n},n)),w.length>0?(0,t.jsx)(tE.ContextMenuSeparator,{}):null,(0,t.jsx)(tE.ContextMenuItem,{onSelect:N.onNewSection,"data-test":"row-menu-new-section",children:"New section…"}),(0,t.jsx)(tE.ContextMenuItem,{disabled:!e.def.section,title:e.def.section?void 0:"This row has no section",onSelect:()=>N.onSetSection(null),children:"No section"})]})]}),(0,t.jsxs)(tE.ContextMenuSub,{children:[(0,t.jsx)(tE.ContextMenuSubTrigger,{"data-test":"row-menu-fan",children:e.selected&&e.selectionSize>1?`Fan — ${e.selectionSize} rows`:e.def.fan?`Fan — ${e.def.fan.by}`:"Fan"}),(0,t.jsxs)(tE.ContextMenuSubContent,{className:"w-48",children:[j.map(n=>(0,t.jsx)(tE.ContextMenuCheckboxItem,{checked:e.def.fan?.by===n,onSelect:()=>N.onSetFan(e.def.fan?.by===n?null:n),"data-test":"row-menu-fan-option",children:n},n)),j.length>0?(0,t.jsx)(tE.ContextMenuSeparator,{}):(0,t.jsx)("span",{className:"text-muted-foreground block px-2 py-1 text-[10px]","data-test":"row-menu-fan-none",children:"No mark in this version carries a property yet."}),(0,t.jsx)(tE.ContextMenuItem,{onSelect:()=>z(e.def.fan?.by??""),"data-test":"row-menu-fan-by",children:"Fan by…"}),(0,t.jsx)(tE.ContextMenuItem,{disabled:!e.def.fan,title:e.def.fan?void 0:"This row does not fan",onSelect:()=>N.onSetFan(null),"data-test":"row-menu-fan-off",children:"No fan"})]})]}),null!==D&&k.length>0?(0,t.jsxs)(tE.ContextMenuSub,{children:[(0,t.jsxs)(tE.ContextMenuSubTrigger,{"data-test":"row-menu-branch-scope",children:[(0,t.jsx)(ng.G
20itBranch,{className:"h-3.5 w-3.5"}),`Branch scope — ${D.label??D.key}`]}),(0,t.jsxs)(tE.ContextMenuSubContent,{className:"w-56",children:[(0,t.jsx)(tE.ContextMenuCheckboxItem,{checked:void 0===R,onSelect:e=>{e.preventDefault(),D&&N.onSetBranchScope(D.key,null)},"data-test":"row-branch-scope-inherit",children:D?.branches?`This column — ${(0,J.describeBranchScope)(D.branches,k)}`:"This column’s scope"}),(0,t.jsx)(tE.ContextMenuSeparator,{}),k.map(e=>(0,t.jsx)(tE.ContextMenuCheckboxItem,{checked:R?.includes(e.id)??!1,onSelect:t=>{t.preventDefault(),D&&N.onSetBranchScope(D.key,(0,J.toggledBranchScope)(R,e.id))},"data-test":"row-branch-scope-option",children:(0,J.branchOptionLabel)(e)},e.id)),void 0!==R?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(tE.ContextMenuSeparator,{}),(0,t.jsxs)("span",{className:"text-muted-foreground block px-2 py-1 text-[10px]",children:["This row reads"," ",R.map(e=>(0,J.branchIdLabel)(e,k)).join(" · "),"."]})]}):null,k.some(e=>e.main_tracks_sync)?(0,t.jsx)("span",{className:"block px-2 py-1 text-[10px] text-amber-600 dark:text-amber-400","data-test":"branch-scope-sync-hint",children:"“Main” tracks this drawing’s synced source and re-points on every sync."}):null]})]}):null,null!==D?(0,t.jsxs)(tE.ContextMenuSub,{children:[(0,t.jsxs)(tE.ContextMenuSubTrigger,{"data-test":"row-menu-unit",children:[(0,t.jsx)(ny.Ruler,{className:"h-3.5 w-3.5"}),`Unit — ${O??"from the formula"}`]}),(0,t.jsxs)(tE.ContextMenuSubContent,{className:"w-44",children:[(0,t.jsx)(tE.ContextMenuCheckboxItem,{checked:void 0===O,onSelect:()=>N.onSetUnit(D.key,null),"data-test":"row-unit-derived",children:"From the formula"}),(0,t.jsx)(tE.ContextMenuSeparator,{}),(0,t.jsx)("div",{className:"grid grid-cols-4 gap-0.5 p-1",children:en.TAKEOFF_UNITS.map(e=>(0,t.jsx)(tE.ContextMenuItem,{className:(0,E.cn)("justify-center px-1.5 py-1 font-mono text-[11px]",O===e&&"bg-accent"),onSelect:()=>N.onSetUnit(D.key,e),"data-test":"row-unit-option",children:e},e))})]})]}):null,(0,t.jsx)(tE.ContextMenuSeparator,{}),(0,t.jsxs)(tE.ContextMenuItem,{className:"text-destructive focus:text-destructive",onSelect:N.onRemove,"data-test":"row-menu-delete",children:[(0,t.jsx)(b.X,{className:"h-3.5 w-3.5"}),(0,t.jsx)("span",{className:"flex-1",children:e.selected&&e.selectionSize>1?`Delete ${e.selectionSize} rows`:"Delete row"}),(0,t.jsx)(nv,{keys:"⌘⌫"})]})]})})]}),null!==P?(0,t.jsx)("tr",{"data-test":"table-row-fan-editor",children:(0,t.jsx)("td",{colSpan:f,className:"border-border/70 bg-muted/20 border-b px-3 py-1.5",children:(0,t.jsxs)("span",{className:"flex items-center gap-2",children:[(0,t.jsx)("span",{className:"text-muted-foreground shrink-0 font-mono text-[10px]",children:"fan by"}),(0,t.jsx)("input",{autoFocus:!0,value:P,onFocus:e=>e.currentTarget.select(),onChange:e=>z(e.target.value),onKeyDown:e=>{if("Escape"===e.key){e.stopPropagation(),z(null);return}if("Enter"!==e.key)return;e.preventDefault();let t=P.trim();N.onSetFan(""===t?null:t),z(null)},onBlur:()=>z(null),list:`fan-props-${e.def.id}`,placeholder:j[0]??"door_type",className:"border-border w-48 rounded border bg-transparent px-1 font-mono text-[11px] outline-none","data-test":"row-fan-input"}),(0,t.jsx)("datalist",{id:`fan-props-${e.def.id}`,children:j.map(e=>(0,t.jsx)("option",{value:e},e))}),(0,t.jsx)("span",{className:"text-muted-foreground shrink-0 text-[10px]",children:"a mark property — Enter splits this row by it"})]})})}):null,e.def.fan&&!C?(0,t.jsx)("tr",{"data-test":"fan-empty-row",children:(0,t.jsx)("td",{colSpan:f,className:"border-border/70 text-muted-foreground border-b px-3 py-1 pl-8 text-[10px]",children:(0,t.jsxs)("span",{className:"flex items-center gap-2",children:[(0,t.jsxs)("span",{children:["fans by ",(0,t.jsx)("span",{className:"font-mono",children:e.def.fan.by})," — no mark carries that property, so this row does not split"]}),o?(0,t.jsx)("button",{type:"button",className:"hover:text-foreground shrink-0 underline",onClick:()=>N.onSetFan(null),"data-test":"fan-empty-clear",children:"clear"}):null]})})}):null,C&&!c?S.sub_rows.map(s=>{let l=m(s.key),a=null!==l?s.cells[l]:void 0;return(0,t.jsxs)(n.Fragment,{children:[(0,t.jsxs)("tr",{"data-test":"fan-sub-row",className:(0,E.cn)("text-muted-foreground",d&&"bg-muted/20",e.selected&&"bg-blue-600/10"),children:[(0,t.jsx)("td",{className:T.CELL_CLASS}),h(s),o?(0,t.jsx)("td",{className:T.CELL_CLASS}):null,(0,t.jsx)("td",{className:T.CELL_CLASS})]}),a?.evidence&&!eg(r,a.evidence)?(0,t.jsx)("tr",{"data-test":"evidence-row-sub",children:(0,t.jsx)("td",{colSpan:f,className:"border-border/70 bg-muted/20 border-b py-1.5 pr-3 pl-9",children:(0,t.jsx)(eT,{lookup:r,evidence:a.evidence,excludedReasons:a.excluded_reasons})})}):null]},s.key)}):null,$&&!eg(r,$)?(0,t.jsx)("tr",{"data-test":"evidence-row",children:(0,t.jsx)("td",{colSpan:f,className:"border-border/70 bg-muted/20 border-b px-3 py-1.5",children:(0,t.jsx)(eT,{lookup:r,evidence:$,excludedReasons:C?void 0:F?.excluded_reasons})})}):null]})}function nk({onInsert:e}){return(0,t.jsx)("button",{type:"button",className:T.ROW_SEAM_INSERT_CLASS,title:"Insert a row here (same section) — ⇧⌘⏎","aria-label":"Insert a row above this one","data-test":"table-row-seam-insert",onClick:t=>{t.stopPropagation(),e()},children:(0,t.jsx)(p.Plus,{className:"h-2.5 w-2.5"})})}function nj({vm:e,onMoveBefore:n}){return(0,t.jsx)("span",{role:"button","aria-label":"Drag to reorder",title:"Drag to move this row",className:"text-muted-foreground
20/50 hover:text-foreground shrink-0 cursor-grab touch-none opacity-0 group-hover:opacity-100","data-test":"table-row-grip",onClick:e=>e.stopPropagation(),onPointerDown:t=>{let r;t.preventDefault(),t.stopPropagation();let s=t.currentTarget,l=s.closest("tbody");if(!l)return;s.setPointerCapture(t.pointerId);let a=null,o=null,i=e.selected&&e.selectionSize>1?e.selectionSize:1,d=()=>{a&&(a.style.boxShadow="")},c=e=>{for(let t of(d(),r=null,a=null,l.querySelectorAll("tr[data-item-id]"))){let n=t.getBoundingClientRect();if(e.clientY<n.top+n.height/2){r=t.dataset.itemId??null,a=t;break}}a&&(a.style.boxShadow="inset 0 2px 0 0 #2563eb"),o||((o=document.createElement("div")).className="bg-foreground text-background pointer-events-none fixed z-[100] rounded px-2 py-1 font-mono text-[10px] shadow-md",document.body.appendChild(o)),o.style.left=`${e.clientX+14}px`,o.style.top=`${e.clientY+14}px`;let t=l.querySelectorAll("tr[data-item-id]"),n=a??t[t.length-1],s=n?.dataset.itemSection;o.textContent=`${i} row${1===i?"":"s"} → ${s||"no section"}`},u=()=>{s.removeEventListener("pointermove",c),s.removeEventListener("pointerup",u),d(),o?.remove(),void 0!==r&&r!==e.def.id&&n(r)};s.addEventListener("pointermove",c),s.addEventListener("pointerup",u)},children:(0,t.jsx)(nb.GripVertical,{className:"h-3 w-3"})})}let nN=(e,t)=>`deta:console:table-seen:${e??"any"}:${t}`,nS=e=>{let t={};for(let[n,r]of Object.entries(e)){let e=r.value;t[n]="number"==typeof e||"string"==typeof e?e:null}return t},nC=(e,t)=>"number"==typeof e&&"number"==typeof t?1e-9>Math.abs(e-t):e===t,nT=(e,t)=>{let n=0;for(let r of new Set([...Object.keys(e??{}),...Object.keys(t??{})]))nC(e?.[r]??null,t?.[r]??null)||(n+=1);return n};function nI({rows:e,expanded:r,sections:s,onToggle:l,onToggleSection:a,onChange:o,onAdd:i,renderTable:d,renderRuleLinks:c}){return(0,t.jsxs)("div",{"data-test":"table-template-rules",className:"min-w-0",children:[e.map((i,u)=>{let m=i.def.section,p=m&&m!==e[u-1]?.def.section,h=Object.entries(i.item.cells).find(([e,t])=>["description","label","item","name"].includes(e)&&"string"==typeof t.value&&t.value.trim())?.[1].value??Object.values(i.item.cells).find(e=>"string"==typeof e.value&&e.value.trim())?.value,f=!!r[i.def.id];return(0,t.jsxs)(n.Fragment,{children:[p?(0,t.jsxs)("button",{type:"button",className:"bg-muted/40 flex w-full items-center gap-2 border-b px-5 py-2 text-left text-sm font-medium","aria-expanded":!s[m],onClick:()=>a(m),"data-test":"template-rule-section",children:[s[m]?(0,t.jsx)(ed.ChevronRight,{className:"size-3.5"}):(0,t.jsx)(Y.ChevronDown,{className:"size-3.5"}),m]}):null,m&&s[m]?null:(0,t.jsxs)("div",{className:"border-b","data-test":"table-row-rule","data-item-id":i.def.id,children:[(0,t.jsxs)("div",{className:"px-5 py-3",children:[(0,t.jsxs)("div",{className:"mb-1 flex items-center gap-2",children:[(0,t.jsx)("span",{className:"text-muted-foreground w-5 shrink-0 text-right text-xs tabular-nums",children:u+1}),(0,t.jsx)("span",{className:"min-w-0 flex-1 text-sm font-medium",children:h?String(h):(0,t.jsx)(L.Trans,{i18nKey:"drawings:table.unnamedItem",defaults:"Untitled item"})}),(0,t.jsxs)(M.Button,{type:"button",size:"sm",variant:"ghost",className:"text-muted-foreground h-7 ga
20p-1 px-2 text-xs","aria-expanded":f,onClick:()=>l(i.def.id),"data-test":"template-row-table-toggle",children:[(0,t.jsx)(tX.Table2,{className:"size-3.5"}),(0,t.jsx)(L.Trans,{i18nKey:"drawings:table.templateTableView",defaults:"Table"}),f?(0,t.jsx)(Y.ChevronDown,{className:"size-3"}):(0,t.jsx)(ed.ChevronRight,{className:"size-3"})]})]}),(0,t.jsxs)("div",{className:"pl-5",children:[c?.(i.def.id),(0,t.jsx)(nf,{rule:i.def.rule,onChange:e=>o(i.def.id,e)})]})]}),f?(0,t.jsx)("div",{className:"overflow-x-auto border-t","data-test":"template-row-table",children:d(i,u)}):null]})]},i.def.id)}),(0,t.jsxs)(M.Button,{type:"button",size:"sm",variant:"ghost",className:"text-muted-foreground m-3",onClick:i,"data-test":"template-rules-add-row",children:[(0,t.jsx)(p.Plus,{className:"size-3.5"}),(0,t.jsx)(L.Trans,{i18nKey:"drawings:table.addRow",defaults:"Add row"})]})]})}var nF=e.i(539529),n$=e.i(974248);let nM=new Map,n_="branch-notations",nP=[];async function nz(e,t){let n=await e.from("annotation_branches").select("drawing_set_version_id").in("id",t).limit(1).maybeSingle();if(n.error)throw n.error;let r=n.data?.drawing_set_version_id;if(!r)return[];let s=await e.from("annotation_branches").select("id").eq("drawing_set_version_id",r).order("created_at",{ascending:!0}).order("id",{ascending:!0});if(s.error)throw s.error;return(s.data??[]).map(e=>e.id)}function nL(e){let t=(0,y.useSupabase)(),r=(0,l.useQueryClient)(),a=(0,n.useMemo)(()=>(e??[]).map(e=>e.id).filter(e=>e!==nF.MAIN_BRANCH_SCOPE).sort(),[e]),o=a.join(",");(0,U.useVersionTreeUpdates)((0,n.useCallback)(e=>{(0,H.affectsBranchTree)(e)&&r.invalidateQueries({queryKey:[n_]})},[r]));let i=(0,s.useQuery)({queryKey:[n_,o],enabled:a.length>0,queryFn:()=>nz(t,a),staleTime:3e4});return 0===a.length?nP:i.data}var nE=e.i(730859);let nD=T.POPOVER_ITEM_CLASS,nR="shrink-0 rounded border border-sky-500/50 px-1.5 py-0.5 text-[10px] hover:bg-sky-500/10 disabled:opacity-50";function nO({receipt:e,columns:n,capable:r,busy:s,onAccept:l,onFreezeAsLeft:a}){let o=[];for(let t of e.diff.totals.slice(0,2)){let e=n.find(e=>e.key===t.key),r=t=>null===t?tb.EM_DASH:e?(0,tb.formatColumnNumber)(e,t):String(t);o.push(`${e?e.label??e.key:t.key} ${r(t.before)} → ${r(t.after)}`)}e.diff.totals.length>2&&o.push(`+${e.diff.totals.length-2} more totals`),o.push(`${e.diff.changedCells} cell${1===e.diff.changedCells?"":"s"} changed`);let i=o.join(" · ");return(0,t.jsxs)("p",{className:"flex items-center gap-2 border-b border-sky-500/30 bg-sky-500/5 px-3 py-1.5 font-mono text-[11px] text-sky-700 dark:text-sky-300","data-test":"table-return-receipt",children:[(0,t.jsxs)("span",{className:"min-w-0 flex-1 truncate",title:i,children:["Since ",new Date(e.prev.seenAt).toLocaleDateString(),": ",i]}),(0,t.jsx)("button",{type:"button",className:nR,onClick:l,title:"Accept the update — the table stays live","data-test":"table-receipt-ok",children:"OK"}),r?(0,t.jsx)("button",{type:"button",className:nR,disabled:s,onClick:a,title:"Freeze at the values you left — not the update","data-test":"table-receipt-freeze",children:"Freeze as you left it"}):null]})}function nA({scope:e,label:n,ladder:r,count:s,columns:l,open:a,onOpenChange:o,onAdd:i,onPatch:d,onMove:c,onRemove:u}){return(0,t.jsxs)(_.Popover,{open:a,onOpenChange:o,children:[(0,t.jsx)(_.PopoverTrigger,{asChild:!0,children:(0,t.jsx)("button",{type:"button",className:(0,E.cn)("border-border ml-1 shrink-0 rounded border px-1 font-mono text-[10px]",s>0?"text-foreground":"text-muted-foreground hover:text-foreground"),title:`${n} — charged on this ${null===e?"table":"section"}'s subtotal`,"data-test":"ladder-button",children:s>0?`+${s}`:"%"})}),(0,t.jsx)(_.PopoverContent,{align:"start",className:"w-auto p-2",children:(0,t.jsx)(tR.MarkupLadderEditor,{ladder:r,columns:l,onAdd:i,onPatch:d,onMove:c,onRemove:u,onDone:()=>o(!1)})})]})}let nB=(0,n.memo)(function({doc:e,tableId:z,tableName:Y,versionNumber:Z,versionId:en,drawingSetId:er,workbookName:el,evidence:ea,writer:eo,onServerChange:ei,templateAccountId:ed,renderRuleLinks:ec,reproject:eu}){var em,eh,ef;
20let ex,eg,eb,ey,[ev,ew]=(0,n.useState)("sheet"),[ek,ej]=(0,n.useState)({link:null,print:null}),eC=(0,l.useQueryClient)(),eT=(0,Q.useConsoleActions)(),eI=void 0!==ed,[eM,e_]=(0,n.useState)({mode:"table",rules:{},tables:{}}),eP=eI&&"rules"===eM.mode,ez=(0,n.useRef)(null),eL=(0,n.useRef)(null),eE=()=>{let e=eL.current?.columnWidths??{};ej(t=>({...t,print:e}))},eD=`table:${z}`,eR=`v${Z}/tables/${el}/${Y}.json`,[eO,eA]=(0,n.useState)({busy:!1,saving:!1,error:null,notice:null,jsonOpen:!1,peeks:{},collapsed:{},sections:{}}),[eB,eK]=(0,n.useState)(void 0),[eU,eH]=(0,n.useState)({open:!1,rename:null,copy:"idle",template:null}),[eW,eQ]=(0,n.useState)(null),[eJ,eG]=(0,n.useState)(tO);(0,n.useEffect)(()=>(0,K.subscribeSelection)(({source:t,facets:n})=>{if(!n.modelId||"model"!==t||n.sourceVersionId!==en||!n.memberId&&!n.memberIds?.length||n.modelId!==e.model?.id||n.modelRevision!==e.model?.revision)return;let r=new Set((n.memberIds??[n.memberId]).map(e=>(0,W.modelMemberRef)(n.modelId,e))),s=e=>[...e.evidence?.marks??[],...e.evidence?.deductions??[]].some(e=>r.has(e)),l=e.resolved?.items.filter(e=>Object.values(e.cells).some(s))??[];eG({ids:l.map(e=>e.id),anchor:l[0]?.id??null});let a=Object.fromEntries(l.slice(0,1).map(e=>[e.id,Object.entries(e.cells).find(([,e])=>s(e))?.[0]??null]));eA(e=>({...e,peeks:a}))}),[e,en]);let eX=(0,n.useRef)(null);(0,n.useEffect)(()=>{if("sheet"!==ev)return;let e=e=>{let t=document.querySelector('[role="dialog"][data-state="open"]');if(t&&!t.contains(ez.current))return;let n="Escape"===e.key,r=("Backspace"===e.key||"Delete"===e.key)&&(e.metaKey||e.ctrlKey);if(!n&&!r||e.defaultPrevented)return;let s=e.target;if(!(s instanceof HTMLInputElement||s instanceof HTMLTextAreaElement||s instanceof HTMLElement&&s.isContentEditable)){if(r){let t=eX.current;if(!t)return;e.preventDefault(),t();return}eG(e=>0===e.ids.length?e:tO)}};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[ev]);let[eY,eZ]=(0,n.useState)(null),e0=(0,n.useRef)(null),[e1,e2]=(0,n.useState)(null),e5=(0,n.useMemo)(()=>e1&&eu&&(e.rows.some(e=>e.reference)||e1.rows.some(e=>e.reference))?eu(e1):(0,tb.overlayAuthoredOnDoc)(e,e1),[e,e1,eu]),e3=e5.frozen??null,e8=e.resolved?.unreadable??null,e4=null===e3&&null===e8,e7=(0,r.useParams)(),e6=ed??("string"==typeof e7?.account?e7.account:null),e9="string"==typeof e7?.id?e7.id:null,te=(0,y.useSupabase)(),tt=(0,A.useMarkIntent)(e6??void 0),tn=(0,R.useCurrentVersionBookDoc)(),tr=eI?null:tn,[ts,tl]=(0,n.useState)(null),ta=(0,n.useRef)(!1),td=(0,n.useRef)(!1),[tc,tm]=(0,n.useState)(0);(0,n.useEffect)(()=>{let e=()=>{"visible"===document.visibilityState&&(ta.current=!1,tm(e=>e+1))};return document.addEventListener("visibilitychange",e),()=>document.removeEventListener("visibilitychange",e)},[]),(0,n.useEffect)(()=>{if(eI||void 0!==e.frozen||null!==e1||eO.saving||eO.busy||"undefined"!=typeof document&&"hidden"===document.visibilityState)return;let t=function(e,t){let n=e.resolved;if(!n)return null;let r={},s={},l={};for(let e of n.items)if(r[e.id]=nS(e.cells),e.source&&(l[e.id]={source:e.source,section:e.section,units:Object.fromEntries(Object.entries(e.cells).flatMap(([e,t])=>t.unit?[[e,t.unit]]:[]))}),void 0!==e.sub_rows&&e.sub_rows.length>0){let t={};for(let n of e.sub_rows)t[n.key]=nS(n.cells);s[e.id]=t}return{seenAt:t,totals:{...n.totals.columns},...Object.keys(l).length?{linked:l}:{},cells:r,...Object.keys(s).length>0?{subs:s}:{}}}(e,Date.now());if(null!==t){if(!ta.current){ta.current=!0;let e=function(e,t){try{let n=window.localStorage.getItem(nN(e,t));if(null===n)return null;let r=JSON.parse(n);if(!r||"object"!=typeof r||"number"!=typeof r.seenAt||!r.totals||"object"!=typeof r.totals||!r.cells||"object"!=typeof r.cells)return null;return r}catch{return null}}(e6,eD);if(null!==e){let n=function(e,t){let n=0;for(let r of new Set([...Object.keys(e.cells),...Object.keys(t.cells)]))n+=nT(e.cells[r],t.cells[r]);for(let r of new Set([...Object.keys(e.subs??{}),...Object.keys(t.subs??{})])){let s=e.subs?.[r]??{},l=t.subs?.[r]??{};for(let e of new Set([...Object.keys(s),...Object.keys(l)]))n+=nT(s[e],l[e])}let r=[];for(let n of new Set([...Object.keys(e.totals),...Object.keys(t.totals)])){let s=e.totals[n]??null,l=t.totals[n]??null;nC(s,l)||r.push({key:n,before:s,after:l})}return 0===n&&0===r.length?null:{changedCells:n,totals:r}}(e,t);if(null!==n){td.current=!0,tl({prev:e,diff:n});return}}}null!==ts||td.current||function(e,t,n){try{window.localStorage.setItem(nN(e,t),JSON.stringify(n))}catch{}}(e6,eD,t)}},[e,e1,eO.saving,eO.busy,e6,eD,ts,tc,eI]);let tp=(0,s.useQuery)({queryKey:["libraries",e6??"any"],queryFn:()=>(0,B.fetchLibraries)(te,e6),enabled:null!==e6,staleTime:6e4}).data??null;(0,n.useEffect)(()=>{let e=null,t=(0,O.subscribeAnnotationsPersisted)(()=>{null!==e&&clearTimeout(e),e=setTimeout(()=>{eC.invalidateQueries({queryKey:["table-projection-context",en]})},350)});return()=>{null!==e&&clearTimeout(e),t()}},[en,eC]),(0,U.useVersionTreeUpdates)((0,n.useCallback)(e=>{(0,H.affectsBranchTree)(e)&&eC.invalidateQueries({queryKey:["table-projection-context",en]})},[en,eC]));let th=async()=>{await ei()},tf=(0,n.useRef)({jobs:[],running:!1,drained:Promise.resolve(),markDrained:null}),tx=()=>{let e=tf.current;e.running||e.jobs.length>0||(e.markDrained?.(),e.markDrained=null)},tg=()=>{let t=tf.current;if(t.running||0===t.jobs.length)return;t.running=!0,t.markDrained||(t.drained=new Promise(e=>{t.markDrained=e})),t.jobs.length=0,eA(e=>({...e,saving:!0}));let n=e0.current??(0,v.authoredHalf)(e);eo.save((0,v.authoredHalf)(n)).then(async e=>{if(t.running=!1,!e.ok){t.jobs.length=0,e0.current=null,e2(null),eA(t=>
20({...t,saving:!1,error:e.reason})),tx(),th();return}if(t.jobs.length>0)return void tg();eA(e=>({...e,saving:!1,error:null}));try{await th()}catch{}tf.current.running||0!==tf.current.jobs.length||(e0.current=null,e2(null)),tx()}).catch(e=>{t.running=!1,t.jobs.length=0,e0.current=null,e2(null),eA(t=>({...t,saving:!1,error:e instanceof Error?e.message:"That edit could not be saved. Reopen the table to continue."})),tx(),th()})},ty=(t,n,r)=>{if(null!==e8)return;let s=r?.evenWhenFrozen?t:e=>void 0!==e.frozen?null:t(e),l=s(e0.current??(0,v.authoredHalf)(e));if(!l)return;let a=(0,tK.checkTableDoc)(l,e.name);a.ok?(e0.current=l,e2(l),eA(e=>null===e.error?e:{...e,error:null}),tf.current.jobs.push(s),tg(),n?.()):eA(e=>({...e,error:a.reason}))},tv=(0,S.tableDisplayRows)(e5),tE=no(e5),tR=(em=eO.sections,tE.flatMap(e=>e.link&&em[e.key]?[]:e.rows.filter(t=>{let n=ni(e,t);return!n||!em[n]}))),tV=(0,n.useMemo)(()=>{let e=new Map;for(let t of e5.resolved?.items??[])e.set(t.id,t);return e},[e5.resolved]),tq=e5.columns.filter(e=>"measure"===e.kind).map(e=>e.key),tU=e5.columns.map(e=>({key:e.key,label:e.label??e.key})),tH=[...e5.columns].reverse().find(e=>"pointer"===e.kind)?.library??null,tW=e5.resolved?.tags_available??[],tQ=(eh=e5.resolved?.branches_available,ex=nL(eh),eg=(0,n.useMemo)(()=>{let e;return ex&&null!==Z?((e=new Map(ex.map((e,t)=>[e,(0,n$.formatNotation)(Z,t)]))).set(nF.MAIN_BRANCH_SCOPE,(0,n$.formatNotation)(Z,ex.length)),e):nM},[ex,Z]),(0,n.useMemo)(()=>eh?eh.map(e=>{let t=eg.get(e.id);return t?{...e,notation:t}:{...e}}):[],[eh,eg])),tJ=e5.branches,tG=function(e,t,s){let l=(0,r.useRouter)(),{accountId:a,drawingSetId:o,versionNumber:i,openDrawingId:d}=t,c=(0,n.useCallback)((t,n="fit")=>{let r=t.flatMap(t=>{let n=e.get(t);return n?.model?[n.model]:[]}),s=r[0];if(!s)return;let c=[...new Map(r.filter(e=>e.id===s.id&&e.revision===s.revision&&e.versionId===s.versionId).map(e=>[e.memberId,e])).values()],u=(0,K.lastViewerView)(),m=d===o&&u?.drawingSetId===o&&u.versionNumber===i,p="unisolate"===n&&m&&u.modelViewId&&u.page?{id:u.modelViewId,page:u.page}:function(e,t){let n=new Map;for(let t of e)for(let e of t.views??t.pages.map(e=>({id:`page-${e}`,page:e,containsMember:!0}))){let t=n.get(e.id)??{id:e.id,page:e.page,coverage:0};e.containsMember&&t.coverage++,n.set(e.id,t)}return(0,ep.chooseModelView)([...n.values()],t)}(c,m?u:null);if(!p)return;let h=[...new Set(c.map(e=>e.memberId))];if((0,K.publishSelection)("console",{drawingSetId:o,versionNumber:i,sourceVersionId:s.versionId,modelId:s.id,memberId:s.memberId,memberIds:h,modelRevision:s.revision,modelViewId:p.id,page:p.page,reveal:n}),m&&"unisolate"===n){let e=new URL(window.location.href),t=new URLSearchParams(e.hash.slice(1));t.get("model")===s.id&&t.has("isolate")&&(t.delete("isolate"),e.hash=t.toString(),window.history.replaceState(window.history.state,"",e))}if(!m&&a){let e=new URLSearchParams({p:String(p.page),model:s.id,member:s.memberId,members:h.join(","),mr:String(s.revision),mv:p.id});"isolate"===n&&e.set("isolate","1"),l.push(`/home/${a}/drawings/${o}?v=${i}#${e}`)}},[e,d,o,i,a,l]),u=(0,n.useCallback)(t=>{let n=e.get(t);if(!n)return;if(n.model)return void c([t]);let r=s(n.branchId),u={annotationId:n.id,page:n.page,drawingSetId:o,versionNumber:i,...void 0!==r?{branchIndex:r}:{}};if((0,K.publishSelection)("console",u),!a)return;let m=(0,nE.markRevealLocation)({accountId:a,drawingSetId:o,versionNumber:i,...void 0!==r?{branchIndex:r}:{},page:n.page,annotationId:n.id});if(d!==o)return void l.push(m.href);let p=(0,K.lastViewerView)();(null===p||p.drawingSetId!==o||p.versionNumber!==i||void 0!==r&&p.branchIndex!==r)&&(0,nE.softNavigate)(m)},[e,s,a,o,i,d,l,c]);return(0,n.useMemo)(()=>({get:t=>e.get(t),reveal:u,revealMany:c}),[e,u,c])}(ea,{accountId:e6,drawingSetId:er,versionNumber:Z,openDrawingId:e9},(eb=nL(e5.resolved?.branches_available),(0,n.useCallback)(e=>{if(!eb)return;if(null===e)return eb.length;let t=eb.indexOf(e);return -1===t?void 0:t},[eb]))),tX=function(e,t){let n=[];for(let r of e){let e=r.section??null;null!==e&&t[e]||n.push(r.id)}return n}(e5.rows,eO.sections),tY=(ef=eJ.ids,ey=new Set(tX),ef.filter(e=>ey.has(e)));(0,n.useEffect)(()=>{eX.current=e4&&null===e3&&0!==tY.length?()=>{ty(e=>tY.length>1?(0,tL.withRowsRemoved)(e,tY):(0,tL.withRowRemoved)(e,tY[0]),()=>eG(e=>tA(e,tY)))}:null});let tZ=new Set(tY),t0=tv.map(e=>({def:e,item:tV.get(e.id)??{id:e.id,cells:{}},selected:tZ.has(e.id),selectionSize:tY.length})),t1=new Map(t0.map((e,t)=>[e.def.id,{vm:e,index:t}])),t2=tX[tX.length-1]??null,t5=e5.rows.find(e=>
20e.id===t2)?.section??null,[t3,t4]=(0,n.useState)(tL.mintRowId),t7={id:t3,...t5?{section:t5}:{}},t6=e=>tY.includes(e)&&tY.length>1?[...tY]:[e],t9=(0,n.useMemo)(()=>{let e=[];for(let t of e5.rows)t.section&&!e.includes(t.section)&&e.push(t.section);return e},[e5.rows]),ne=(0,n.useMemo)(()=>[...new Set([...e5.resolved?.properties_available??[],...e5.rows.map(e=>e.fan?.by).filter(e=>void 0!==e)])].sort(),[e5.rows,e5.resolved?.properties_available]),nt=(0,n.useMemo)(()=>[...new Set([...e5.resolved?.properties_available??[],...Object.keys(e5.resolved?.property_values??{})])].sort(),[e5.resolved?.properties_available,e5.resolved?.property_values]),nn=(0,n.useMemo)(()=>new Map(Object.entries(e5.resolved?.property_values??{}).map(([e,t])=>[(0,N.normalizeTag)(e),t.map(k.filterValueLiteral)])),[e5.resolved?.property_values]),nr=(0,n.useMemo)(()=>(0,j.knownNames)({tags:e5.resolved?.tags_available,properties:e5.resolved?.properties_available,values:e5.resolved?.property_values}),[e5.resolved?.tags_available,e5.resolved?.properties_available,e5.resolved?.property_values]),ns=(0,n.useMemo)(()=>(function(e){let t=new Map;for(let e of eV)t.set((0,N.normalizeTag)(e),"mark-field");for(let n of e?.tags??[])t.set((0,N.normalizeTag)(n.key),"flag"===n.type?"tag":"derived"===n.type?"number":n.type);for(let n of e?.presets??[])t.set((0,N.normalizeTag)(n.name),"preset");return t})(tr),[tr]),nl=(0,n.useMemo)(()=>nt.filter(e=>(function(e,t,n){let r=eq(e,n);if("number"===r)return!0;if("select"!==r)return!1;let s=t?.tags.find(e=>(0,N.normalizeTag)(e.key)===(0,N.normalizeTag)(n))?.config?.options;return void 0!==s&&s.length>0&&s.every(e=>{let t=e.trim();return""!==t&&Number.isFinite(Number(t))})})(ns,tr,e)),[ns,tr,nt]),na=(e,t)=>{let n=tV.get(e)?.source;n?ty(r=>{let s=r.rows.find(e=>e.id===n.anchor);if(!s?.reference)return null;let l=s.reference.overrides?.[n.key],a=t({...r,rows:[{id:e,...l}]}),o=a?.rows.find(t=>t.id===e);return o?{...r,rows:r.rows.map(e=>e.id!==s.id?e:{...e,reference:{...s.reference,overrides:{...s.reference.overrides,[n.key]:{values:o.values,links:o.links,measures:o.measures,units:o.units,branch_scopes:o.branch_scopes}}}})}:null}):e!==t3?ty(t):(ty(e=>t((0,tL.withRowEnsured)(e,t7))),t4((0,tL.mintRowId)()))},nc=e5.columns.find(e=>"formula"!==e.kind&&("pointer"===e.kind?e4&&null!==e6:e4))?.key??null,nu=function(e,n){let r=[],s=e.find(e=>"measure"===e.kind)?.key??null,l=e.map(e=>({key:e.key,label:e.label??e.key}));for(let a of e){if("measure"===a.kind){r.push({id:a.key,header:()=>n.renderHeader(a),width:n.modelBound?Math.max(180,tz(a)):tz(a),...T.NUM_COLUMN,dataTest:"table-cell-measure",editDataTest:"table-cell-measure-input",editable:n.editable,enabledFor:e=>void 0===e.sub,editSeed:e=>{let t=tj(e)[a.key];return t?.pinned?(0,tb.cellEditSeed)(t):tF(a,e.def)},validate:(e,t)=>{let n=t$(t,tM(a,e));return"invalid"===n.kind?n.error:null},commit:(e,t)=>(function(e,t,n,r){let s=t$(r,tM(t,n));switch(s.kind){case"noop":case"invalid":return;case"clear-pin":e.onSetValue(tk(n),t.key,null);return;case"clear-formula":e.onSetMeasureOverride(tk(n),t.key,null);return;case"pin-number":e.onSetValue(tk(n),t.key,s.value);return;case"pin-lump":e.onSetValue(tk(n),t.key,s.text);return;case"formula":e.onSetMeasureOverride(tk(n),t.key,s.expr),tj(n)[t.key]?.pinned&&e.onSetValue(tk(n),t.key,null);return}})(n,a,e,t),editorAffordancePx:26,renderEditor:e=>(0,t.jsx)(t_,{editor:e,ctx:n}),render:e=>{let r=tj(e)[a.key],l=(0,tb.cellDisplayText)(a,r),o=r?.unit?` ${r.unit}`:"",i=""!==o&&l.endsWith(o)?{head:l.slice(0,-o.length),unit:r.unit}:{head:l,unit:null},d=(0,t.jsx)("span",{className:(0,E.cn)("min-w-0 truncate",n.modelBound&&"shrink-0",r?.pinned&&!n.frozen&&"underline decoration-dotted underline-offset-2",r?.unresolved&&!r.pinned&&"text-destructive"),"data-test":"table-cell-qty",children:""===l?(0,t.jsx)("span",{className:"text-muted-foreground",children:tb.EM_DASH}):i.head}),c=null!==i.unit&&n.editable&&!n.frozen?(0,t.jsx)(eN,{unit:i.unit,authored:e.def.units?.[a.key]!==void 0,onPick:t=>n.onSetUnit(tk(e),a.key,t)}):null!==i.unit?(0,t.jsx)("span",{className:"text-muted-foreground shrink-0 font-mono",children:i.unit}):null;return e.sub&&a.key===s?(0,t.jsxs)("span",{className:"flex items-center justify-between gap-2",children:[(0,t.jsx)("span",{className:"min-w-0 truncate text-left","data-test":"fan-sub-label",children:e.sub.label}),(0,t.jsxs)("span",{className:"flex shrink-0 items-center gap-1",children:[d,c,tP(n,a,e)]})]}):(0,t.jsxs)("span",{className:"flex items-center justify-end gap-1",children:[d,c,tP(n,a,e)]})}});continue}if("pointer"===a.kind){let s=a.field??a.key,l=e.filter(e=>"pointer"===e.kind&&e.library===a.library).map(e=>e.label??e.key),o=n.accountId,i=n.editable&&null!==o;r.push({id:a.key,header:()=>n.renderHeader(a),width:tz(a),...T.NUM_COLUMN,dataTest:"table-cell-pointer",activate:i?e=>n.setOpenPicker({rowId:e.def.id,colKey:a.key,...e.sub?{subKey:e.sub.key}:{}}):void 0,isOpen:i?e=>tC(n.openPicker,tI(e,a.key)):void 0,title:e=>{let t=tj(e)[a.key];if(t?.unresolved?.reason==="library_unresolved")return(0,tb.brokenLibraryTitle)(a.library);let n=tN(e)?.[a.library];return n?`picked row — ${String(n[s]??"")}`:`Pick a ${a.label??a.key} row from the ${a.library} library`},render:e=>{let r=tj(e)[a.key],d=(0,tb.cellDisplayText)(a,r),c=ti(d),u=tC(n.openPicker,tI(e,a.key)),m=""===d?e.pen
20ding&&a.key===n.pendingHintKey?(0,t.jsx)("span",{className:"text-muted-foreground/60",children:"Type to add a row"}):" ":r?.unresolved?.reason!=="library_unresolved"||r.pinned?null!==c?(0,t.jsx)(tu,{url:c}):d:(0,t.jsxs)("span",{className:"text-destructive inline-flex items-center gap-0.5","data-test":"table-cell-broken-library",children:[(0,t.jsx)(ee.TriangleAlert,{className:"h-2.5 w-2.5 shrink-0"}),d]});if(!i)return m;let p=tN(e)?.[a.library];return(0,t.jsxs)(_.Popover,{open:u,onOpenChange:t=>n.setOpenPicker(t?tI(e,a.key):null),children:[(0,t.jsx)(_.PopoverTrigger,{asChild:!0,children:(0,t.jsx)("span",{className:"block w-full min-w-0 truncate text-right",children:m})}),(0,t.jsx)(_.PopoverContent,{align:"end",className:"w-auto p-0",onClick:e=>e.stopPropagation(),children:(0,t.jsx)(tw,{accountId:o,librarySlug:a.library,field:s,fills:l,canClear:tS(e).links?.[a.library]!==void 0||tS(e).values?.[a.key]!==void 0,bound:p?Object.values(p).filter(e=>null!=e&&""!==e&&"object"!=typeof e).slice(0,4).map(String):null,onPick:t=>n.onSetLink(tk(e),a.library,t),onValue:t=>n.onSetValue(tk(e),a.key,t),onClear:()=>n.onClearPointer(tk(e),a.library,a.key),onClose:()=>n.setOpenPicker(null)})})]})}});continue}if("formula"===a.kind){let s=(0,to.namesOfFormula)(a.expr,l),o=/\border\s*\(/.test(a.expr),i=(0,k.stockOrderColumns)(a.expr),d=e.find(e=>e.key===i?.coverage);r.push({id:a.key,header:()=>n.renderHeader(a),width:tz(a),...T.NUM_COLUMN,dataTest:"table-cell-formula",editDataTest:"table-cell-formula-input",editable:n.editable,enabledFor:e=>!tj(e)[a.key]?.included,editSeed:e=>{let t=tj(e)[a.key];return t?.pinned?(0,tb.cellEditSeed)(t):""},hint:()=>`ƒ ${s}`,commit:(e,t)=>{let r=function(e,t){let n=(0,et.coerceInput)(e,"number");return void 0===n?t.pinned?{kind:"clear-pin"}:{kind:"noop"}:{kind:"pin",value:n}}(t,{pinned:tj(e)[a.key]?.pinned===!0});"noop"!==r.kind&&n.onSetValue(tk(e),a.key,"clear-pin"===r.kind?null:r.value)},title:e=>tj(e)[a.key]?.pinned?`Overridden — ƒ ${s} is not used for this row`:`ƒ ${s}`,render:e=>{let r=tj(e)[a.key],s=(0,tb.cellDisplayText)(a,r);return r?.included?(0,t.jsx)("span",{className:"text-muted-foreground text-xs",title:"Included in the parent row's shared stock purchase.","data-test":"table-cell-included",children:"Included ↑"}):(0,t.jsxs)("span",{className:"inline-flex max-w-full min-w-0 items-center gap-1",children:[(0,t.jsx)("span",{className:(0,E.cn)("min-w-0 truncate",r?.pinned&&!n.frozen&&"underline decoration-dotted underline-offset-2"),children:s}),(0,t.jsx)("span",{className:"text-muted-foreground shrink-0 text-[9px]","aria-hidden":!0,children:"ƒ"}),r?.problem&&(0,t.jsx)(eS,{problem:r.problem,nearest:e=>eF(e,n.tagOptions)}),o&&!e.sub&&(0,t.jsx)(es.CuttingPlanPopover,{cell:r,row:e.def,productLink:d?.kind==="pointer"&&(n.versionId||n.accountId)&&e.def.links?.[d.library]&&r?.ordering?{endpoint:n.versionId?`/api/drawings/versions/${n.versionId}/libraries`:`/api/accounts/${n.accountId}/libraries`,library:d.library,rowId:e.def.links[d.library],coverageField:d.field??d.key,coverageUnit:r.ordering.coverage.unit,coverageUnitField:d.unitField,purchaseUnit:r.ordering.purchaseUnit}:void 0,product:d?.kind==="pointer"?tN(e)?.[d.library]:void 0,unit:(i?tj(e)[i.takeoff]?.unit:void 0)??r?.ordering?.takeoffUnit??"",lookup:n.evidence,onChange:n.editable&&!n.frozen&&n.onSetCutting?t=>n.onSetCutting?.(e.def.id,t):void 0})]})}});continue}let o=et.FORMAT_META[a.format??"text"];r.push({id:a.key,header:()=>n.renderHeader(a),width:tz(a),...o.numeric?T.NUM_COLUMN:{align:o.align},dataTest:"table-cell-value",editDataTest:"table-cell-value-input",editable:n.editable,editSeed:e=>(0,tb.cellEditSeed)(tj(e)[a.key]),commit:(e,t)=>{let r=(0,et.coerceInput)(t,a.format);n.onSetValue(tk(e),a.key,void 0===r?null:r)},title:e=>(0,tb.cellDisplayText)(a,tj(e)[a.key]),render:e=>{let n=(0,tb.cellDisplayText)(a,tj(e)[a.key]),r=ti(n);return null===r?n:(0,t.jsx)(tu,{url:r})}})}return r}(e5.columns,{versionId:eI?void 0:en,onSetCutting:(e,t)=>ty(n=>(0,tL.withRowCutting)(n,e,t)),modelBound:!!e5.model,allowDrawing:!eI,editable:e4,frozen:null!==e3,accountId:e6,tableId:z,evidence:tG,pendingHintKey:nc,tagOptions:tW,filterKeys:nt,filterValues:nn,known:nr,vocabularyKinds:ns,weightKeys:nl,branchOptions:tQ,tableBranches:tJ,peekOf:e=>eO.peeks[e]??null,onTogglePeek:(t,n)=>eA(r=>({...r,peeks:{...e.model?{}:r.peeks,[t]:r.peeks[t]===n?null:n}}
20)),openPicker:eY,setOpenPicker:eZ,onSetValue:(e,t,n)=>na(e.rowId,r=>void 0===e.subKey?(0,tL.withRowValue)(r,e.rowId,t,n):(0,tL.withSubRowValue)(r,e.rowId,e.subKey,t,n)),onSetMeasureOverride:(e,t,n)=>void 0===e.subKey?na(e.rowId,r=>(0,tL.withRowMeasure)(r,e.rowId,t,n)):void 0,onSetUnit:(e,t,n)=>na(e.rowId,r=>(0,tL.withRowUnit)(r,e.rowId,t,n)),onSetLink:(e,t,n)=>na(e.rowId,r=>void 0===e.subKey?(0,tL.withRowLink)(r,e.rowId,t,n):(0,tL.withSubRowLink)(r,e.rowId,e.subKey,t,n)),onClearPointer:(e,t,n)=>na(e.rowId,r=>void 0===e.subKey?(0,tL.withPointerCleared)(r,e.rowId,t,n):(0,tL.withSubRowPointerCleared)(r,e.rowId,e.subKey,t,n)),renderHeader:e=>e4?(0,t.jsx)(X.ColumnHeader,{column:e,operands:tU.filter(t=>t.key!==e.key),libraries:tp,branchOptions:tQ,tableBranches:tJ,pointerFills:"pointer"===e.kind?e5.columns.filter(t=>"pointer"===t.kind&&t.library===e.library).map(e=>e.label??e.key):void 0,onSave:t=>ty(n=>(0,tL.withColumnReplaced)(n,e.key,t)),onRemove:()=>ty(t=>(0,tL.withColumnRemoved)(t,e.key)),onHide:()=>ty(t=>(0,tL.withColumnVisibility)(t,e.key,!1)),hiddenColumns:e5.columns.filter(e=>e5.layout?.hiddenColumns?.includes(e.key)),onShow:e=>ty(t=>(0,tL.withColumnVisibility)(t,e,!0)),onDropBefore:t=>{var n;t!==(n=e.key)&&ty(e=>(0,tL.withColumnReordered)(e,n,t))}}):e.label??e.key}),nm={def:t7,item:{id:t7.id,cells:{}},selected:!1,selectionSize:0,pending:!0},nh=new Set((0,w.chargeableColumns)(e5.columns).map(e=>e.key)),nf=new Set((0,w.summedKeys)(e5.columns)),ng=e5.rows.some(e=>e.reference)&&e5.resolved?.sections?e5.resolved.sections:(0,tb.sheetSections)({doc:e5,items:e5.resolved?.items??[],summed:[...nf],chargeable:[...nh]}),nb=new Map(ng.map(e=>[e.rows[0],e]).filter(e=>void 0!==e[0])),ny=new Map(ng.map(e=>[e.rows[e.rows.length-1],e]).filter(e=>void 0!==e[0])),nv=(e,n)=>(0,t.jsx)(nA,{scope:e,label:n,ladder:(0,tL.ladderOf)(e5,e),count:(0,tL.ladderOf)(e5,e).length,columns:e5.columns,open:void 0!==eB&&eB===e,onOpenChange:t=>eK(t?e:void 0),onAdd:t=>ty(n=>(0,tL.withMarkupAdded)(n,e,t)),onPatch:(t,n)=>ty(r=>(0,tL.withMarkupPatched)(r,e,t,n)),onMove:(t,n)=>ty(r=>(0,tL.withMarkupMoved)(r,e,t,n)),onRemove:t=>ty(n=>(0,tL.withMarkupRemoved)(n,e,t))}),nk=new Set(e5.columns.filter(e=>"pointer"===e.kind).map(e=>e.key)),nj=async e=>{let t=e.item.source?.tableId;if(!t)return;let n=await (0,V.fetchTable)(te,t);if(!n)return void eA(e=>({...e,error:"Source table is unavailable."}));let{data:r,error:s}=await te.from("drawing_set_versions").select("drawing_set_id,version_number").eq("id",n.versionId).single();s?eA(e=>({...e,error:s.message})):eT?.openTableTab({tableId:t,tableName:n.name,versionId:n.versionId,drawingSetId:r.drawing_set_id,versionNumber:r.version_number})},n_=nu.filter(e=>!e5.layout?.hiddenColumns?.includes(e.id)).map(e=>({...e,width:e5.layout?.widths?.[e.id]??e.width,enabledFor:t=>!t.item.source?.columns.includes(e.id)&&(e.enabledFor?.(t)??!0),render:n=>n.item.source?.columns.includes(e.id)?(0,t.jsx)("button",{type:"button",className:"w-full truncate [text-align:inherit] text-inherit hover:underline",title:`Open source: ${n.item.source.name}`,onClick:()=>{nj(n).catch(()=>eA(e=>({...e,error:"Could not open source table."})))},children:n.item.cells[e.id]?.problem?"#REF!":(0,tb.cellDisplayText)(e5.columns.find(t=>t.key===e.id),n.item.cells[e.id])}):!n.pending||nk.has(e.id)?e.render(n):e.id!==nc?null:(0,t.jsxs)("span",{className:"text-muted-foreground/60",children:["Type to add a row",t5?` \xb7 ${t5}`:""]})}
20)),nP=new Map(t0.map(e=>[e.def.id,e]));nP.set(nm.def.id,nm);let nz=eP?tX.filter(e=>eM.tables[e]):[...tR.map(e=>e.id),nm.def.id],nR=(0,$.useSheetEditing)({columns:n_,rowKey:e=>tT(e),nextCell:({row:e,colId:t},n,r)=>{let s=nz.indexOf(e.def.id);if(-1===s)return null;let l=nP.get(nz[s+(r?-1:1)]??"");if(!l)return null;let a=(0,F.editableSequence)(n_,l),o="Enter"===n?(0,F.landingColumn)(a,t):(0,F.edgeColumn)(a,r);return null===o?null:{row:l,colId:o}},insertRow:(e,t)=>(e.def.id===nm.def.id||nU((n,r)=>"below"===t?(0,tL.withRowInsertedAfter)(n,e.item.source?.anchor??e.def.id,r):(0,tL.withRowInsertedBefore)(n,e.item.source?.anchor??e.def.id,r),e.def.section??null),null)}),nB=e=>({def:e,item:{id:e.id,cells:{}},selected:!1,selectionSize:0}),nV=e=>{eP&&e_(t=>({...t,tables:{...t.tables,[e.def.id]:!0}}));let t=(0,F.editableSequence)(n_,e)[0];void 0!==t&&nR.begin(e,t,{selectAll:!0})},nq=e=>[{id:"table",label:"Link table here",run:()=>ej(t=>({...t,link:{beforeId:e.pending?void 0:e.item.source?.anchor??e.def.id}}))},{id:"section",label:"Section",hint:"name",run:t=>{let n=""===t?(0,tL.freshSectionName)(e5):t;if(e.pending){nU((e,t)=>(0,tL.withRowInsertedAfter)(e,t2,t),n,{openCell:""!==t}),""===t&&eQ(n);return}let r=t6(e.def.id);ty(t=>r.length>1?(0,tL.withRowsMovedToSection)(t,r,n):(0,tL.withRowSection)(t,e.def.id,n),()=>eQ(""===t?n:null))}},{id:"row",label:"Row below",hint:"⌘⏎",run:()=>nU((t,n)=>(0,tL.withRowInsertedAfter)(t,e.pending?t2:e.def.id,n),e.def.section??null)}],nU=(e,t,n)=>{let r={id:(0,tL.mintRowId)(),...t?{section:t}:{}};return ty(t=>e(t,r)),n?.openCell!==!1&&nV(nB(r)),r},nH=(0,tL.visibleStripes)(tR,{}),nW=()=>eH({open:!1,rename:null,copy:"idle",template:null}),nQ=(e,t,n)=>{let r=URL.createObjectURL(new Blob([t],{type:n})),s=document.createElement("a");s.href=r,s.download=e,s.click(),URL.revokeObjectURL(r)},nJ=async e=>{if(!e6)throw Error("Open a workspace to save a template.");let n=await (0,q.saveTableTemplate)(te,{accountId:e6,doc:e5,...e});if(!n.ok)throw Error(n.reason);await eC.invalidateQueries({queryKey:["table-templates",e6]}),P.toast.success((0,t.jsx)(L.Trans,{i18nKey:"drawings:table.templateSaved",defaults:"Saved “{{name}}” in Library → Table templates.",values:{name:n.value.name}})),nW()},nG=(0,t.jsxs)(_.Popover,{open:eU.open,onOpenChange:e=>eH({open:e,rename:null,copy:"idle",template:null}),children:[(0,t.jsx)(_.PopoverTrigger,{asChild:!0,children:(0,t.jsx)(M.Button,{type:"button",variant:"ghost",size:"sm",className:"h-6 w-6 p-0",title:"Table actions — view, export, rename, copy, delete","data-test":"table-menu",children:(0,t.jsx)(u.MoreVertical,{className:"h-3.5 w-3.5"})})}),(0,t.jsxs)(_.PopoverContent,{align:"end",className:null!==eU.template?"w-96 p-1":"w-64 p-1",children:[null!==eU.rename?(0,t.jsxs)("div",{className:"flex flex-col gap-1 p-1",children:[(0,t.jsx)("input",{autoFocus:!0,value:eU.rename,onChange:e=>eH(t=>({...t,rename:e.target.value})),onKeyDown:e=>{if("Escape"===e.key){e.stopPropagation(),eH(e=>({...e,rename:null}));return}"Enter"===e.key&&(e.preventDefault(),(e=>{let t=(0,tK.slugifyTableName)(e);if(""===t||t===Y)return nW();nW(),eA(e=>({...e,busy:!0,error:null})),tf.current.drained.then(()=>eo.rename(t).then(e=>{e.ok?(eA(e=>({...e,busy:!1})),ei()):eA(t=>({...t,busy:!1,error:e.reason}))}))})(eU.rename))},placeholder:"new table name",className:"border-border h-7 rounded border bg-transparent px-2 font-mono text-[11px] outline-none","data-test":"table-rename-input"}),(0,t.jsx)("p",{className:"text-muted-foreground px-1 font-mono text-[9px]",children:"Enter renames — rows and marks stay; the tab reopens under the new name"})]}):null!==eU.template?(0,t.jsx)(D.TableTemplateSaveForm,{doc:e5,onSave:nJ,onCancel:()=>eH(e=>({...e,template:null}))}):Array.isArray(eU.copy)||"loading"===eU.copy?(0,t.jsxs)("div",{className:"flex flex-col gap-0.5 p-1",children:[(0,t.jsx)("p",{className:"text-muted-foreground px-1 pb-1 font-mono text-[9px]",children:"Copy to version — the authored table copies; values recompute from that version's own marks"}),"loading"===eU.copy?(0,t.jsx)("p",{className:"text-muted-foreground px-1 font-mono text-[10px]",children:"Looking for versions…"}):0===eU.copy.length?(0,t.jsx)("p",{className:"text-muted-foreground px-1 font-mono text-[10px]",children:"No other versions to copy to."}):eU.copy.map(e=>(0,t.jsxs)("button",{type:"button",className:nD,onClick:()=>{nW(),eA(t=>({...t,error:null,notice:`Copying “${e5.name}” to v${e.versionNumber}…`})),eo.copyTo(e).then(t=>{eA(n=>({...n,error:t.ok?null:t.reason,notice:t.ok?t.notes??`Copied “${e5.name}” to v${e.versionNumber}.`:null}))})},"data-test":"table-copy-target",children:["v",e.versionNumber]},e.versionId))]}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("button",{type:"button",className:nD,onClick:()=>{ew("sheet"===ev?"raw":"sheet"),nW()},"data-test":"table-view-toggle",children:"sheet"===ev?"View raw JSON":"View sheet"}),(0,t.jsxs)("a",{href:e$,target:"_blank",rel:"noreferrer",className:nD,onClick:nW,"data-test":"table-formula-help",children:[(0,t.jsx)(a.CircleQuestionMark,{className:"h-3 w-3"}),"Formula reference"]}),(0,t.jsxs)("button",{type:"button",className:nD,onClick:()=>{nW(),nQ(`${e5.name}.csv`,(0,C.tableToCsv)(e5),"text/csv")},"data-test":"table-csv",children:[(0,t.jsx)(i.Download,{className:"h-3 w-3"}),"Download CSV"]}),(0,t.jsxs)("button",{type:"button",className:nD,onClick:()=>{nW(),nQ(`${e5.name}.json`,JSON.stringify(e5,null,2),"application/json")},"data-test":"table-json",children:[(0,t.jsx)(i.Download,{className:"h-3 w-3"}),"Download JSON"]}),(0,t.jsxs)("button",{type:"button",className:nD,disabled:eO.busy,onClick:()=>eH(e=>({...e,rename:e5.name})),"data-test":"table-rename",children:[(0,t.jsx)(m.Pencil,{className:"h-3 w-3"}),"Rename table…"]}),e6?(0,t.jsxs)("button",{type:"button",className:nD,disabled:0===e5.columns.length,title:0===e5.columns.length?"A table with no columns has no shape to save":"Save columns, sections and optional starter rows for reuse",onClick:()=>eH(e=>({...e,template:e5.name})),"data-test":"table-save-template",children:[(0,t.jsx)(c.LayoutTemplate,{className:"h-3 w-3"}),(0,t.jsx)(L.Trans,{i18nKey:"drawings:table.saveTemplate",defaults:"Save as table template…"})]}):null,e4?(0,t.jsxs)("button",{type:"button",className:nD,disabled:eO.busy,onClick:()=>{eA(e=>({...e,jsonOpen:!e.jsonOpen})),nW()},"data-test":"table-json-editor-toggle",children:[(0,t.jsx)(d.FileJson,{className:"h-3 w-3"}),"Edit JSON"]}):null,(0,t.jsxs)("button",{type:"button",className:nD,"data-test":"table-print",onClick:()=>{nW(),eE()},children:[(0,t.jsx)(h.Printer,{className:"h-3 w-3"}),(0,t.jsx)("span",{className:"flex-1",children:"Print…"}),(0,t.jsx)("span",{className:"text-muted-foreground text-[10px]",children:"⌘/Ctrl+P"})]}),e5.columns.filter(e=>
20e5.layout?.hiddenColumns?.includes(e.key)).map(e=>(0,t.jsxs)("button",{type:"button",className:nD,disabled:!e4||eO.busy,onClick:()=>{ty(t=>(0,tL.withColumnVisibility)(t,e.key,!0)),nW()},children:["Show ",e.label??e.key]},e.key)),e4?(0,t.jsxs)("button",{type:"button",className:nD,disabled:eO.busy,onClick:()=>{let e=(0,tL.freshSectionName)(e5);nU((e,t)=>(0,tL.withRowInsertedAfter)(e,t2,t),e,{openCell:!1}),eQ(e),nW()},title:"Start a section — a bold grouping header whose rows sum beneath it","data-test":"sheet-menu-new-section",children:[(0,t.jsx)(p.Plus,{className:"h-3 w-3"}),"New section"]}):null,e4&&(0,t.jsxs)("button",{type:"button",className:nD,"data-test":"table-menu-link",onClick:()=>{nW(),ej(e=>({...e,link:{}}))},children:["Link table…"," ",(0,t.jsx)("span",{className:"text-muted-foreground ml-auto",children:"/table"})]}),e4&&e5.rows.filter(e=>e.reference&&!e5.resolved?.items.some(t=>t.source?.anchor===e.id)).map(e=>(0,t.jsxs)("button",{type:"button",className:nD,onClick:()=>{nW(),ej(t=>({...t,link:{rowId:e.id}}))},children:["Edit link:"," ",e.reference?.title??e.reference?.name??"Table"]},e.id)),e4?(0,t.jsxs)("button",{type:"button",className:nD,disabled:eO.busy,onClick:()=>{if(e5.resolved?.reference_errors?.length)return void eA(e=>({...e,error:"Resolve the linked table errors before freezing."}));let e=new Date().toISOString(),t=e5.resolved?.items;ty(n=>(0,tL.withTableFrozen)(n,e,n.resolved?.items??t)),eA(e=>({...e,jsonOpen:!1})),nW()},title:"Hold every cell at today's value and lock the sheet","data-test":"table-freeze",children:[(0,t.jsx)(f.Snowflake,{className:"h-3 w-3"}),"Freeze table"]}):null,(0,t.jsxs)("button",{type:"button",className:nD,disabled:eO.busy,onClick:()=>{eH(e=>({...e,copy:"loading"})),eo.copyTargets().then(e=>{if(!e.ok){eH(e=>({...e,copy:"idle"})),eA(t=>({...t,error:e.reason}));return}eH(t=>({...t,copy:e.versions}))})},"data-test":"table-copy",children:[(0,t.jsx)(o.Copy,{className:"h-3 w-3"}),"Copy to version…"]}),(0,t.jsxs)("button",{type:"button",className:(0,E.cn)(nD,"text-destructive hover:text-destructive"),disabled:eO.busy,onClick:()=>{nW(),eT?.closeTableTab(z),tf.current.jobs.length=0,tf.current.drained.then(()=>eo.remove().then(e=>{e.ok?ei():P.toast.error(e.reason)}))},title:"Delete this table — the marks stay; only the table goes","data-test":"table-delete",children:[(0,t.jsx)(g.Trash2,{className:"h-3 w-3"}),"Delete table"]})]}),(0,t.jsxs)("div",{className:"border-border mt-1 border-t px-2 pt-1.5 pb-1",children:[(0,t.jsx)("p",{className:"text-muted-foreground font-mono text-[9px] break-all",children:eR}),e5.resolved?.resolved_at?(0,t.jsxs)("p",{className:"text-muted-foreground mt-0.5 font-mono text-[9px]",children:["resolved ",new Date(e5.resolved.resolved_at).toLocaleString()]}):null,(0,t.jsx)("button",{type:"button",className:"text-muted-foreground hover:text-foreground mt-1 font-mono text-[9px] underline decoration-dotted",onClick:()=>void navigator.clipboard.writeText(eR),children:"Copy path"})]})]})]}),nX="sheet"===ev&&e5.columns.length>0&&eJ.ids.length>1?(0,t.jsxs)("button",{type:"button",onClick:()=>eG(tO),className:"inline-flex items-center gap-1 rounded border border-blue-500/50 bg-blue-500/10 px-1.5 py-0.5 font-mono text-[10px] text-blue-600 dark:text-blue-400",title:tY.length<eJ.ids.length?`${eJ.ids.length-tY.length} more selected rows are hidden in collapsed sections — gestures skip them. Click to clear.`:"Click to clear the selection","data-test":"row-selection-chip",children:[tY.length<eJ.ids.length?`${tY.length} of ${eJ.ids.length} selected`:`${tY.length} selected`,(0,t.jsx)(b.X,{className:"h-2.5 w-2.5"})]}):null,nY=e3?Date.parse(e3.at):NaN,nZ=e3?(0,t.jsxs)(_.Popover,{children:[(0,t.jsx)(_.PopoverTrigger,{asChild:!0,children:(0,t.jsxs)("button",{type:"button",className:"inline-flex items-center gap-1 rounded border border-sky-500/50 bg-sky-500/10 px-1.5 py-0.5 font-mono text-[10px] text-sky-600 dark:text-sky-400",title:"Frozen — nothing syncs","data-test":"table-frozen-chip",children:[(0,t.jsx)(f.Snowflake,{className:"h-2.5 w-2.5 shrink-0"}),"Frozen",Number.isNaN(nY)?"":` ${new Date(nY).toLocaleDateString(void 0,{month:"short",day:"numeric"})}`]})}),(0,t.jsx)(_.PopoverContent,{align:"end",className:"w-52 p-2",children:(0,t.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,t.jsxs)("p",{className:"text-muted-foreground font-mono text-[9px]",children:["Frozen",Number.isNaN(nY)?"":` ${new Date(nY).toLocaleStr
20ing()}`," — nothing syncs."]}),(0,t.jsx)(M.Button,{size:"sm",variant:"outline",className:"h-6 self-end text-[10px]",disabled:eO.busy,onClick:()=>ty(e=>(0,tL.withTableUnfrozen)(e),void 0,{evenWhenFrozen:!0}),title:"Cells return to live values — library rows and marks resolve fresh","data-test":"table-unfreeze",children:"Unfreeze"})]})})]}):null,n0=(0,t.jsxs)("div",{className:"border-border/70 flex shrink-0 items-center justify-end gap-1 border-b px-2 py-1",children:[e5.model&&(0,t.jsx)("span",{className:"text-muted-foreground mr-auto px-1 text-xs","data-test":"table-model-revision",children:(0,t.jsx)(L.Trans,{i18nKey:"drawings:modelViewport.tableRevision",defaults:"Model r{{revision}} · physical members",values:{revision:e5.model.revision}})}),nX,nZ,!eI&&tt&&e6?(0,t.jsxs)("button",{type:"button",onClick:()=>(0,A.clearMarkIntent)(e6),className:"inline-flex items-center gap-1 rounded border border-emerald-500/50 bg-emerald-500/10 px-1.5 py-0.5 font-mono text-[10px] text-emerald-600 dark:text-emerald-400",title:tt.origin?`New marks fill ${tt.origin.columnKey}${tt.origin.deduct?" (as deductions)":""} — click to stop`:"New marks carry this preset — click to stop","data-test":"takeoff-preset-chip",children:["drawing ",(0,A.describeArmedIntent)(tt,tr),(0,t.jsx)(b.X,{className:"h-2.5 w-2.5"})]}):null,eO.saving||eO.busy?(0,t.jsx)("span",{className:"text-muted-foreground font-mono text-[9px]","data-test":"table-saving",children:"saving…"}):null,!e4||e5.model||eI?void 0!==tJ?(0,t.jsx)("span",{className:"inline-flex items-center gap-1 rounded border border-blue-500/50 bg-blue-500/10 px-1.5 py-0.5 font-mono text-[10px] text-blue-600 dark:text-blue-400","data-test":"table-branch-scope",children:(0,J.describeBranchScope)(tJ,tQ)}):null:(0,t.jsx)(G.TableBranchScopeButton,{options:tQ,value:tJ,busy:eO.busy,onChange:e=>ty(t=>(0,tL.withTableBranches)(t,e))}),eI?null:nG]}),n1=e5.resolved?.totals??null,n2=(()=>{let e={};for(let t of nf){let n=(e5.resolved?.items??[]).reduce((e,n)=>{let r=n.cells[t]?.value;return"number"==typeof r?e+r:e},0);e[t]=n+ng.reduce((e,n)=>e+((n.total[t]??0)-(n.subtotal[t]??0)),0)}return e})(),n5=(()=>{if(!n1)return null;if(e5.rows.some(e=>e.reference))return n1;let{columns:e,markups:t}=(0,tb.sheetTotals)({items:e5.resolved?.items??[],sections:ng,markups:e5.markups,summed:[...nf],chargeable:[...nh]});return{...n1,columns:e,...t.length>0?{markups:t}:{}}})(),n3=(e,t)=>ty(n=>({...n,rows:n.rows.map(n=>{if(n.id!==e)return n;let r={...n,rule:t};return t||delete r.rule,r})})),n8=e=>(0,t.jsx)(I.SheetGrid,{ref:eL,columns:n_,storageId:`table:${eD}`,editing:nR,fontClass:"text-[13px]",leading:{width:eI?80:e4?56:44},trailing:e4?{width:68,header:(0,t.jsx)(X.AddColumnButton,{busy:eO.busy,operands:tU,libraries:tp,branchOptions:tQ,tableBranches:tJ,defaultLibrary:tH,onAdd:e=>ty(t=>(0,tL.withColumnAdded)(t,e))})}:void 0,commandsFor:e4?e=>e.item.source?[]:nq(e):void 0,renderSeamInsert:e4?e=>(0,t.jsx)(X.SeamInsertColumn,{beforeKey:e,busy:eO.busy,operands:tU,libraries:tp,branchOptions:tQ,tableBranches:tJ,defaultLibrary:tH,onAdd:t=>ty(n=>(0,tL.withColumnInsertedBefore)(n,t,e))}):void 0,children:e}),n4=e=>({edit:()=>ej(t=>({...t,link:{rowId:e}})),remove:()=>ty(t=>(0,tL.withRowRemoved)(t,e)),insert:()=>ej(t=>({...t,link:{beforeId:e}}))}),n7=(e,n,r)=>(0,t.jsx)(nw,{ruleToggle:eI&&!eP?(0,t.jsx)("button",{type:"button",title:"Row rule","aria-label":"Row rule","aria-expanded":!!eM.rules[e.def.id],"data-test":"table-row-rule-toggle","data-has-rule":!!e.def.rule,className:(0,E.cn)("hover:bg-muted hover:text-foreground rounded p-1",e.def.rule?"text-foreground":"text-muted-foreground/60",eM.rules[e.def.id]&&"bg-muted text-foreground"),onClick:t=>{t.stopPropagation(),e_(t=>({...t,rules:{...t.rules,[e.def.id]:!t.rules[e.def.id]}}))},children:(0,t.jsx)(x.TextQuote,{className:"size-3.5"})}):void 0,vm:e,evidence:tG,columns:e5.columns,renderCells:r.renderCells(e),editable:e4&&!e.item.source,linkedActions:e4&&(e.item.source||e.def.reference)?n4(e.item.source?.anchor??e.def.id):void 0,striped:nH.get(e.def.id)??!1,collapsed:eO.collapsed[e.def.id]??!0,peekKey:eO.peeks[e.def.id]??null,subPeekOf:t=>
20eO.peeks[(0,tb.peekTarget)(e.def.id,t)]??null,renderSubCells:t=>r.renderCells({...e,sub:{key:t.key,label:t.label}}),colSpan:r.colSpan,ordinal:n+1,onSelect:t=>{var n;return n=e.def.id,void eG(e=>(function(e,t,n,r){if(n&&null!==e.anchor){let n=r.indexOf(e.anchor),s=r.indexOf(t);if(-1!==n&&-1!==s){let[t,l]=n<s?[n,s]:[s,n];return{ids:r.slice(t,l+1),anchor:e.anchor}}}return e.ids.includes(t)?{ids:e.ids.filter(e=>e!==t),anchor:e.anchor===t?null:e.anchor}:{ids:[...e.ids,t],anchor:t}})(e,n,t,tX))},onToggleCollapse:()=>eA(t=>({...t,collapsed:{...t.collapsed,[e.def.id]:!(t.collapsed[e.def.id]??!0)}})),onMoveBefore:t=>{var n;let r;return n=e.def.id,r=t6(n),void ty(e=>r.length>1?(0,tL.withRowsMovedBefore)(e,r,t):(0,tL.withRowMovedBefore)(e,n,t))},sectionOptions:t9,branchOptions:tQ,fanOptions:ne,actions:{onLinkTable:()=>ej(t=>({...t,link:{beforeId:e.def.id}})),onSetBranchScope:(t,n)=>ty(r=>(0,tL.withRowBranchScope)(r,e.def.id,t,n)),onSetUnit:(t,n)=>ty(r=>(0,tL.withRowUnit)(r,e.def.id,t,n)),onSetFan:t=>{let n=t6(e.def.id);ty(r=>n.length>1?(0,tL.withRowsFanned)(r,n,t):(0,tL.withRowFan)(r,e.def.id,t))},onRemove:()=>{let t=t6(e.def.id);ty(n=>t.length>1?(0,tL.withRowsRemoved)(n,t):(0,tL.withRowRemoved)(n,e.def.id),()=>eG(e=>tA(e,t)))},onInsertBelow:()=>nU((t,n)=>(0,tL.withRowInsertedAfter)(t,e.def.id,n),e.def.section??null),onInsertAbove:()=>nU((t,n)=>(0,tL.withRowInsertedBefore)(t,e.def.id,n),e.def.section??null),onDuplicate:()=>{let t=(0,tL.mintRowId)();ty(n=>(0,tL.withRowDuplicated)(n,e.def.id,t)),nV(nB({...e.def,id:t}))},onSetSection:t=>{let n=t6(e.def.id);ty(r=>n.length>1?(0,tL.withRowsMovedToSection)(r,n,t):(0,tL.withRowMovedToSection)(r,e.def.id,t))},onNewSection:()=>{let t=t6(e.def.id),n=null;ty(r=>(n=(0,tL.freshSectionName)(r),t.length>1?(0,tL.withRowsMovedToSection)(r,t,n):(0,tL.withRowSection)(r,e.def.id,n)),()=>eQ(n))}}});return(0,t.jsxs)("div",{ref:ez,className:"flex h-full flex-col outline-none",tabIndex:-1,onPointerDownCapture:e=>{!(!(e.target instanceof HTMLElement)||!e.currentTarget.contains(e.target)||e.target.closest('input,textarea,select,button,[contenteditable="true"]'))&&e.currentTarget.focus({preventScroll:!0})},onKeyDownCapture:e=>{"p"===e.key.toLowerCase()&&(e.metaKey||e.ctrlKey)&&e.currentTarget.contains(e.target)&&(e.preventDefault(),e.stopPropagation(),eE())},"data-test":"table-sheet",children:[eI?(0,t.jsxs)("div",{className:"flex shrink-0 gap-1 border-b px-3 py-2","aria-label":"Table template view",children:[["table","rules"].map(e=>(0,t.jsx)(M.Button,{type:"button",size:"sm",variant:"ghost",className:(0,E.cn)("h-8 shadow-none",eM.mode===e&&"bg-muted font-semibold"),"aria-pressed":eM.mode===e,"data-test":`template-view-${e}`,onClick:()=>e_(t=>({...t,mode:e})),children:"table"===e?(0,t.jsx)(L.Trans,{i18nKey:"drawings:table.templateTableView",defaults:"Table"}):(0,t.jsx)(L.Trans,{i18nKey:"drawings:table.templateRulesView",defaults:"Rules"})},e)),(0,t.jsxs)(M.Button,{type:"button",size:"sm",variant:"ghost",className:"ml-auto h-8",onClick:eE,"data-test":"template-layout",children:[(0,t.jsx)(h.Printer,{className:"size-3.5"}),"Layout…"]})]}):null,(0,t.jsx)(t8,{doc:e5,tableId:z,versionId:en,accountId:e6,template:eI,target:ek.link,disabled:!e4,onChange:ty,onClose:()=>ej(e=>({...e,link:null}))}),(0,t.jsx)(np,{doc:e5,accountId:e6??void 0,template:eI,columnWidths:ek.print??void 0,disabled:!e4,saving:eO.saving,saveError:eO.error,onChange:ty,open:null!==ek.print,onOpenChange:e=>e?eE():ej(e=>({...e,print:null}))}),e5.resolved?.reference_errors?.length?(0,t.jsx)("div",{role:"alert",className:"text-destructive border-b px-3 py-2 text-sm",children:eI?"Linked tables resolve by name when you use this template.":e5.resolved.reference_errors.join(" ")}):null,!eI||nX?n0:null,"raw"===ev?(0,t.jsx)("pre",{className:"min-h-0 flex-1 overflow-auto p-3 font-mono text-[11px]",children:JSON.stringify(e5,null,2)}):(0,t.jsxs)("div",{className:"min-h-0 flex-1 overflow-auto",children:[eI||null===ts||null!==e3?null:(0,t.jsx)(nO,{receipt:ts,columns:e5.columns,capable:!0,busy:eO.busy,onAccept:()=>{td.current=!1,tl(null)},onFreezeAsLeft:()=>{var e;let t;if(null===ts)return;let n=new Date().toISOString(),r=(e=ts.prev,t=e=>{let t={};for(let[n,r]of Object.entries(e))null!==r&&(t[n]={status:"live",value:r});return t},Object.entries(e.cells).map(([n,r])=>{let s=e.subs?.[n];return{id:n,...e.linked?.[n]?{source:e.linked[n].source,section:e.linked[n].section}:{},cells:Object.fromEntries(Object.entries(t(r)).map(([t,r])=>[t,{...r,...e.linked?.[n]?.units[t]?{unit:e.linked[n].units[t]}:{}}])),...void 0!==s?{sub_rows:Object.entries(s).map(([e,n])=>({key:e,label:e,cells:t(n)}))}:{}}}));ty(e=>(0,tL.withTableFrozen)(e,n,r,{preferItems:!0})),eA(e=>({...e,jsonOpen:!1}))}}),(0,t.jsx)(T.InlineWriteError,{error:eO.error}),eO.notice?(0,t.jsxs)("p",{className:"text-muted-foreground flex items-start gap-2 px-3 py-1.5 font-mono text-[11px] whitespace-pre-wrap","data-test":"table-write-notice",children:[(0,t.jsx)("span",{className:"min-w-0 flex-1",children:eO.notice}),(0,t.jsx)("button",{type:"button",className:"hover:text-foreground shrink-0",title:"Dismiss",onClick:()=>eA(e=>({...e,notice:null})),children:(0,t.jsx)(b.X,{className:"h-3 w-3"})})]}):null,null!==e8?(0,t.jsxs)("div",{className:"flex h-full flex-col items-center justify-center gap-2 p-8 text-center","data-test":"table-unreadable",children:[(0,t.jsxs)("p",{className:"text-destructive font-mono text-[11px]",children:["“",e5.name,"” could not be read"]}),(0,t.jsx)("p",{className:"text-muted-foreground max-w-96 text-[10px]",children:e8}
20),(0,t.jsx)("p",{className:"text-muted-foreground/70 max-w-96 text-[10px]",children:"Its contents are still stored — this sheet simply cannot parse them, so it is read-only until they can be. Nothing you do here will overwrite the file."})]}):0===e5.columns.length?(0,t.jsxs)("div",{className:"flex h-full flex-col items-center justify-center gap-2 p-8 text-center","data-test":"table-empty",children:[(0,t.jsxs)("p",{className:"text-muted-foreground font-mono text-[11px]",children:["“",e5.name,"” is empty"]}),(0,t.jsx)("p",{className:"text-muted-foreground/70 max-w-80 text-[10px]",children:"Start with a column."}),e4?(0,t.jsx)(X.AddColumnButton,{busy:eO.busy,operands:tU,libraries:tp,branchOptions:tQ,tableBranches:tJ,defaultLibrary:tH,trigger:(0,t.jsxs)(M.Button,{variant:"outline",size:"sm",className:"h-7 gap-1 text-[11px]","data-test":"table-empty-add-column",children:[(0,t.jsx)(p.Plus,{className:"h-3 w-3"}),"Add a column"]}),onAdd:e=>ty(t=>(0,tL.withColumnAdded)(t,e))}):null]}):eP?(0,t.jsx)(nI,{rows:t0,renderRuleLinks:ec,expanded:eM.tables,sections:eO.sections,onToggleSection:e=>eA(t=>({...t,sections:{...t.sections,[e]:!t.sections[e]}})),onToggle:e=>e_(t=>({...t,tables:{...t.tables,[e]:!t.tables[e]}})),onChange:n3,onAdd:()=>nU((e,t)=>(0,tL.withRowInsertedAfter)(e,t2,t),t5),renderTable:(e,n)=>n8(r=>(0,t.jsx)("tbody",{children:n7(e,n,r)}))}):n8(e=>{let r,s,l,a=e.orderedColumns.map(e=>e.id),o=n5?(0,tb.totalsFences)(n5):[];return(0,t.jsxs)("tbody",{children:[tE.map(r=>(0,t.jsxs)(n.Fragment,{children:[r.link&&(0,t.jsx)(tB.SectionHeaderRow,{section:r.title,items:r.rows.map(e=>tV.get(e.id)??{id:e.id,cells:{}}),columns:e5.columns,orderedIds:a,measureKeys:tq,firstItemId:r.link.id,collapsed:eO.sections[r.key]??!1,editable:!1,hasActions:e4,autoRename:!1,contextMenu:e4?(0,t.jsx)(tD,{actions:n4(r.link.id)}):void 0,onAutoRenameDone:()=>void 0,onToggle:()=>eA(e=>({...e,sections:{...e.sections,[r.key]:!e.sections[r.key]}})),onRename:()=>void 0,onMoveBefore:()=>void 0}),!(r.link&&eO.sections[r.key])&&r.rows.map((s,l)=>{let{vm:o,index:i}=t1.get(s.id),d=ni(r,s)??null,c=l>0?ni(r,r.rows[l-1])??null:null,u=null!==d&&d!==c?(0,tL.sectionRunAt)(r.rows,l):null,m=u&&null!==d?(0,t.jsx)(tB.SectionHeaderRow,{section:d,label:nd(r,d),nested:!!r.link,contextMenu:e4&&r.link?(0,t.jsx)(tD,{actions:n4(r.link.id)}):void 0,resolved:nb.get(o.def.id),items:u.map(e=>tV.get(e.id)??{id:e.id,cells:{}}),columns:e5.columns,orderedIds:a,measureKeys:tq,firstItemId:o.def.id,collapsed:eO.sections[d]??!1,editable:e4&&!o.item.source,hasActions:e4,autoRename:eW===d,markupControl:e4&&!o.item.source?nv(d,`${d} markups`):null,onAutoRenameDone:()=>eQ(null),onToggle:()=>eA(e=>({...e,sections:{...e.sections,[d]:!e.sections[d]}})),onRename:e=>ty(t=>(0,tL.withSectionRenamed)(t,d,e)),onMoveBefore:e=>ty(t=>(0,tL.withSectionMovedBefore)(t,u.map(e=>e.id),e))}):null,p=ny.get(o.def.id),h=p?(0,t.jsx)(tB.SectionLadderRows,{section:p,columns:e5.columns,orderedIds:a,hasActions:e4,onEditLadder:e4?()=>eK(p.name):void 0}):null;return null!==d&&eO.sections[d]?(0,t.jsx)(n.Fragment,{children:m},o.def.id):(0,t.jsxs)(n.Fragment,{children:[m,n7(o,i,e),eI&&eM.rules[o.def.id]?(0,t.jsx)(nx,{rowId:o.def.id,rule:o.def.rule,links:ec?.(o.def.id),colSpan:e.colSpan,onChange:e=>n3(o.def.id,e)}):null,h]},o.def.id)})]},r.key)),e4&&null===e3?(0,t.jsx)(tB.PendingRow,{vm:nm,renderCells:e.renderCells,hintKey:nc,commands:nq(nm),striped:tX.length%2==1,hasActions:e4,onOpenFirstCell:()=>nV(nm)}):null,n5&&(n5.markups??[]).length>0?(0,t.jsx)(tB.SectionLadderRows,{section:{name:"Sheet",rows:[],subtotal:n2,markups:n5.markups,total:Object.fromEntries(Object.entries(n5.columns).filter(e=>"number"==typeof e[1]))},columns:e5.columns,orderedIds:a,hasActions:e4,omitTotalLine:!0,onEditLadder:e4?()=>eK(null):void 0}):null,(0,t.jsxs)("tr",{"data-test":"table-totals-row",children:[(0,t.jsx)("td",{className:(0,E.cn)(T.CELL_CLASS,T.TOTAL_STICKY,"bg-muted","overflow-visible font-semibold"),colSpan:2,title:n5?[(0,tb.formatQuantitiesBreakdown)(n5),...o].filter(Boolean).join(" · "):void 0,"data-test":"table-totals-label",children:(0,t.jsxs)("span",{className:"flex items-center gap-2 pl-9",children:[(0,t.jsxs)("span",{className:(0,E.cn)("shrink-0 text-[11px]",o.length>0&&"text-destructive"),children:["Total",o.length>0?(0,t.jsx)("span",{"data-test":"table-totals-fence",children:" ?"}):null]}),e4?nv(null,"Sheet markups"):null,(0,t.jsx)("span",{className:(0,E.cn)(T.NUM_CLASS,"ml-auto shrink-0"),children:(r=a[0],s=e5.columns.find(e=>e.key===r),l=void 0===r?void 0:n5?.columns[r],s&&nf.has(s.key)&&"number"==typeof l?(0,tb.formatColumnNumber)(s,l):"")})]})}),a.slice(1).map(e=>{let n=e5.columns.find(t=>t.key===e),r=n5?.columns[e];return(0,t.jsx)("td",{className:(0,E.cn)(T.CELL_CLASS,T.NUM_CLASS,T.TOTAL_STICKY,"bg-muted","text-[11px] font-semibold"),children:n&&nf.has(n.key)&&"number"==typeof r?(0,tb.formatColumnNumber)(n,r):""},e)}),e4?(0,t.jsx)("td",{className:(0,E.cn)(T.CELL_CLASS,T.TOTAL_STICKY,"bg-muted")}):null,(0,t.jsx)("td",{className:(0,E.cn)(T.CELL_CLASS,T.TOTAL_STICKY,"bg-muted")})]})]})})]}),eO.jsonOpen&&null===e3?(0,t.jsx)(nK,{label:eR,initialText:JSON.stringify((0,v.authoredHalf)(e5),null,2),onSave:e=>{let t;try{t=JSON.parse(e)}
20catch(e){return`Not valid JSON: ${e instanceof Error?e.message:String(e)}`}let n=(0,tK.checkTableDoc)(t,Y);return n.ok?(ty(()=>n.doc),null):n.reason},onClose:()=>eA(e=>({...e,jsonOpen:!1}))}):null]})});function nK({label:e,initialText:r,onSave:s,onClose:l}){let[a,o]=(0,n.useState)({text:r,error:null});return(0,t.jsxs)("div",{className:"border-border bg-muted/30 flex flex-col gap-2 border-t p-3","data-test":"table-json-editor",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between",children:[(0,t.jsx)("span",{className:"text-muted-foreground font-mono text-[11px]",children:e}),(0,t.jsxs)("div",{className:"flex items-center gap-1",children:[(0,t.jsx)(M.Button,{type:"button",variant:"outline",size:"sm",className:"h-6 px-2 font-mono text-[11px]",onClick:()=>{let e=s(a.text);null===e?l():o(t=>({...t,error:e}))},children:"Save"}),(0,t.jsx)(M.Button,{type:"button",variant:"ghost",size:"sm",className:"h-6 px-2 font-mono text-[11px]",onClick:l,children:"Close"})]})]}),(0,t.jsx)(z.Textarea,{value:a.text,onChange:e=>o(t=>({...t,text:e.target.value})),spellCheck:!1,className:"min-h-48 font-mono text-[11px] leading-relaxed"}),(0,t.jsx)(T.InlineWriteError,{error:a.error})]})}e.s(["TableSheet",0,nB],482796)}]);

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.