[{"data":1,"prerenderedAt":1102},["ShallowReactive",2],{"docs-navigation":3,"\u002Fdocs\u002Fdevelopment\u002Farchitecture":231,"\u002Fdocs\u002Fdevelopment\u002Farchitecture-surround":1097},[4],{"title":5,"path":6,"stem":7,"children":8,"page":-1},"Docs","\u002Fdocs","docs",[9,12,16,20,69,90,123,144,165,190],{"title":10,"path":6,"stem":11},"Gerbtrace Documentation","docs\u002Findex",{"title":13,"path":14,"stem":15},"Getting Started","\u002Fdocs\u002Fgetting-started","docs\u002F1.getting-started",{"title":17,"path":18,"stem":19},"Licensing","\u002Fdocs\u002Flicensing","docs\u002F2.licensing",{"title":21,"path":22,"stem":23,"children":24,"page":68},"Viewer","\u002Fdocs\u002Fviewer","docs\u002F3.viewer",[25,29,33,37,41,45,49,53,56,60,64],{"title":26,"path":27,"stem":28},"Files","\u002Fdocs\u002Fviewer\u002Ffiles","docs\u002F3.viewer\u002F01.files",{"title":30,"path":31,"stem":32},"PCB","\u002Fdocs\u002Fviewer\u002Fpcb","docs\u002F3.viewer\u002F02.pcb",{"title":34,"path":35,"stem":36},"Panel","\u002Fdocs\u002Fviewer\u002Fpanel","docs\u002F3.viewer\u002F03.panel",{"title":38,"path":39,"stem":40},"Paste","\u002Fdocs\u002Fviewer\u002Fpaste","docs\u002F3.viewer\u002F04.paste",{"title":42,"path":43,"stem":44},"SMD","\u002Fdocs\u002Fviewer\u002Fsmd","docs\u002F3.viewer\u002F05.smd",{"title":46,"path":47,"stem":48},"THT","\u002Fdocs\u002Fviewer\u002Ftht","docs\u002F3.viewer\u002F06.tht",{"title":50,"path":51,"stem":52},"BOM","\u002Fdocs\u002Fviewer\u002Fbom","docs\u002F3.viewer\u002F07.bom",{"title":5,"path":54,"stem":55},"\u002Fdocs\u002Fviewer\u002Fdocs","docs\u002F3.viewer\u002F08.docs",{"title":57,"path":58,"stem":59},"Conversation","\u002Fdocs\u002Fviewer\u002Fconversation","docs\u002F3.viewer\u002F09.conversation",{"title":61,"path":62,"stem":63},"Summary","\u002Fdocs\u002Fviewer\u002Fsummary","docs\u002F3.viewer\u002F10.summary",{"title":65,"path":66,"stem":67},"Pricing","\u002Fdocs\u002Fviewer\u002Fpricing","docs\u002F3.viewer\u002F11.pricing",false,{"title":70,"path":71,"stem":72,"children":73,"page":68},"Tools","\u002Fdocs\u002Ftools","docs\u002F4.tools",[74,78,82,86],{"title":75,"path":76,"stem":77},"Exports","\u002Fdocs\u002Ftools\u002Fexports","docs\u002F4.tools\u002F1.exports",{"title":79,"path":80,"stem":81},"Compare","\u002Fdocs\u002Ftools\u002Fcompare","docs\u002F4.tools\u002F2.compare",{"title":83,"path":84,"stem":85},"Package Manager","\u002Fdocs\u002Ftools\u002Fpackage-manager","docs\u002F4.tools\u002F3.package-manager",{"title":87,"path":88,"stem":89},"Draw Tool","\u002Fdocs\u002Ftools\u002Fdraw-tool","docs\u002F4.tools\u002F4.draw-tool",{"title":91,"path":92,"stem":93,"children":94,"page":68},"Collaboration","\u002Fdocs\u002Fcollaboration","docs\u002F5.collaboration",[95,99,103,107,111,115,119],{"title":96,"path":97,"stem":98},"Team Settings","\u002Fdocs\u002Fcollaboration\u002Fteam-settings","docs\u002F5.collaboration\u002F1.team-settings",{"title":100,"path":101,"stem":102},"Team Members","\u002Fdocs\u002Fcollaboration\u002Fteam-members","docs\u002F5.collaboration\u002F2.team-members",{"title":104,"path":105,"stem":106},"User Profile","\u002Fdocs\u002Fcollaboration\u002Fuser-profile","docs\u002F5.collaboration\u002F3.user-profile",{"title":108,"path":109,"stem":110},"Spaces","\u002Fdocs\u002Fcollaboration\u002Fspaces","docs\u002F5.collaboration\u002F4.spaces",{"title":112,"path":113,"stem":114},"Notifications","\u002Fdocs\u002Fcollaboration\u002Fnotifications","docs\u002F5.collaboration\u002F6.notifications",{"title":116,"path":117,"stem":118},"Plans & Billing","\u002Fdocs\u002Fcollaboration\u002Fplans-and-billing","docs\u002F5.collaboration\u002F7.plans-and-billing",{"title":120,"path":121,"stem":122},"Connected Apps & MCP","\u002Fdocs\u002Fcollaboration\u002Fconnected-apps","docs\u002F5.collaboration\u002F8.connected-apps",{"title":124,"path":125,"stem":126,"children":127,"page":68},"App","\u002Fdocs\u002Fapp","docs\u002F6.app",[128,132,136,140],{"title":129,"path":130,"stem":131},"Desktop App","\u002Fdocs\u002Fapp\u002Fdesktop","docs\u002F6.app\u002F1.desktop",{"title":133,"path":134,"stem":135},"Light & Dark Mode","\u002Fdocs\u002Fapp\u002Flight-dark-mode","docs\u002F6.app\u002F2.light-dark-mode",{"title":137,"path":138,"stem":139},"Performance Monitor","\u002Fdocs\u002Fapp\u002Fperformance-monitor","docs\u002F6.app\u002F3.performance-monitor",{"title":141,"path":142,"stem":143},"Report a Bug","\u002Fdocs\u002Fapp\u002Freport-a-bug","docs\u002F6.app\u002F4.report-a-bug",{"title":145,"path":146,"stem":147,"children":148,"page":68},"Guides","\u002Fdocs\u002Fguides","docs\u002F7.guides",[149,153,157,161],{"title":150,"path":151,"stem":152},"Importing Files","\u002Fdocs\u002Fguides\u002Fimporting-files","docs\u002F7.guides\u002F1.importing-files",{"title":154,"path":155,"stem":156},"Supported Formats","\u002Fdocs\u002Fguides\u002Fsupported-formats","docs\u002F7.guides\u002F2.supported-formats",{"title":158,"path":159,"stem":160},"Package Library","\u002Fdocs\u002Fguides\u002Fpackage-library","docs\u002F7.guides\u002F3.package-library",{"title":162,"path":163,"stem":164},"Panel Checks","\u002Fdocs\u002Fguides\u002Fpanel-checks","docs\u002F7.guides\u002F4.panel-checks",{"title":166,"path":167,"stem":168,"children":169,"page":68},"Reference","\u002Fdocs\u002Freference","docs\u002F8.reference",[170,174,178,182,186],{"title":171,"path":172,"stem":173},"BOM File Format","\u002Fdocs\u002Freference\u002Fbom-format","docs\u002F8.reference\u002F1.bom-format",{"title":175,"path":176,"stem":177},"Package Definitions","\u002Fdocs\u002Freference\u002Fpackage-definitions","docs\u002F8.reference\u002F2.package-definitions",{"title":179,"path":180,"stem":181},"Package Naming","\u002Fdocs\u002Freference\u002Fpackage-naming","docs\u002F8.reference\u002F3.package-naming",{"title":183,"path":184,"stem":185},"TPSys Format","\u002Fdocs\u002Freference\u002Ftpsys-format","docs\u002F8.reference\u002F4.tpsys-format",{"title":187,"path":188,"stem":189},"Jet Printing","\u002Fdocs\u002Freference\u002Fjet-printing","docs\u002F8.reference\u002F5.jet-printing",{"title":191,"path":192,"stem":193,"children":194,"page":68},"Development","\u002Fdocs\u002Fdevelopment","docs\u002F9.development",[195,199,203,207,211,215,219,223,227],{"title":196,"path":197,"stem":198},"Development Setup","\u002Fdocs\u002Fdevelopment\u002Fsetup","docs\u002F9.development\u002F1.setup",{"title":200,"path":201,"stem":202},"Architecture","\u002Fdocs\u002Fdevelopment\u002Farchitecture","docs\u002F9.development\u002F2.architecture",{"title":204,"path":205,"stem":206},"CAD Libraries","\u002Fdocs\u002Fdevelopment\u002Fcad-libraries","docs\u002F9.development\u002F3.cad-libraries",{"title":208,"path":209,"stem":210},"Release Process","\u002Fdocs\u002Fdevelopment\u002Frelease-process","docs\u002F9.development\u002F4.release-process",{"title":212,"path":213,"stem":214},"Error Monitoring","\u002Fdocs\u002Fdevelopment\u002Ferror-monitoring","docs\u002F9.development\u002F5.error-monitoring",{"title":216,"path":217,"stem":218},"Contributing","\u002Fdocs\u002Fdevelopment\u002Fcontributing","docs\u002F9.development\u002F6.contributing",{"title":220,"path":221,"stem":222},"Commit Conventions","\u002Fdocs\u002Fdevelopment\u002Fcommit-conventions","docs\u002F9.development\u002F7.commit-conventions",{"title":224,"path":225,"stem":226},"Sidebar Design","\u002Fdocs\u002Fdevelopment\u002Fsidebar-design","docs\u002F9.development\u002F8.sidebar-design",{"title":228,"path":229,"stem":230},"Operational Runbooks","\u002Fdocs\u002Fdevelopment\u002Frunbooks","docs\u002F9.development\u002F9.runbooks",{"id":232,"title":200,"body":233,"description":1090,"extension":1091,"links":1092,"meta":1093,"navigation":1094,"path":201,"seo":1095,"stem":202,"__hash__":1096},"docs\u002Fdocs\u002F9.development\u002F2.architecture.md",{"type":234,"value":235,"toc":1073},"minimark",[236,240,257,262,265,287,290,294,306,310,313,347,358,363,450,454,535,538,549,553,564,574,581,585,636,640,647,845,849,852,979,983,986,1019,1023,1026],[237,238,200],"h1",{"id":239},"architecture",[241,242,243,244,248,249,252,253,256],"p",{},"Gerbtrace uses a ",[245,246,247],"strong",{},"client-rendered Nuxt application"," and a ",[245,250,251],{},"Tauri desktop app"," that bundles the same application frontend. Public marketing and documentation routes render and prerender HTML on the web (ADR-012); authenticated application routes remain client-rendered. Collaboration features are backed by ",[245,254,255],{},"Supabase Cloud",".",[258,259,261],"h2",{"id":260},"high-level-components","High-level components",[241,263,264],{},"The system consists of three main deployment targets:",[266,267,268,275,281],"ul",{},[269,270,271,274],"li",{},[245,272,273],{},"Web app"," – hosted on Cloudflare Workers with public HTML and client-rendered application routes; the Worker serves static assets, a small set of Nitro API routes, and docs content from D1",[269,276,277,280],{},[245,278,279],{},"Desktop app"," – Tauri 2 (Rust) wrapping the same Nuxt frontend, distributed via GitHub Releases",[269,282,283,286],{},[245,284,285],{},"API server"," – Supabase Cloud (PostgreSQL, Storage, Realtime, Edge Functions, Auth)",[241,288,289],{},"The browser\u002Fdesktop client communicates with the API server over HTTPS for data operations and WSS for real-time subscriptions. The desktop app additionally checks GitHub Releases for auto-updates.",[258,291,293],{"id":292},"architecture-decisions","Architecture decisions",[241,295,296,297,301,302,305],{},"Architecture Decision Records (ADRs) live in ",[298,299,300],"code",{},"docs\u002Fadr\u002F",". Start with\n",[298,303,304],{},"docs\u002Fadr\u002FREADME.md"," for the central decision log, status taxonomy, accepted\ndecisions, and proposed roadmap decisions. When this overview conflicts with an\nADR, the ADR is the source of truth for the decision it covers.",[258,307,309],{"id":308},"gerber-rendering-pipeline","Gerber rendering pipeline",[241,311,312],{},"Raw Gerber and drill files are processed through a multi-stage pipeline:",[314,315,316,322,328,338],"ol",{},[269,317,318,321],{},[245,319,320],{},"Tokenizer"," – raw Gerber\u002Fdrill text is split into tokens",[269,323,324,327],{},[245,325,326],{},"Parser"," – tokens are parsed into a typed AST (Abstract Syntax Tree) of Gerber commands",[269,329,330,333,334,337],{},[245,331,332],{},"Plotter"," – the AST is transformed into an ",[298,335,336],{},"ImageTree"," of drawing primitives (arcs, lines, regions, flashes)",[269,339,340,343,344,346],{},[245,341,342],{},"Renderer"," – the ",[298,345,336],{}," is drawn onto an HTML5 Canvas element",[241,348,349,350,353,354,357],{},"The pipeline lives in ",[298,351,352],{},"lib\u002Fgerber\u002F"," (tokenizer, parser, plotter) and ",[298,355,356],{},"lib\u002Frenderer\u002F"," (canvas renderer, realistic renderer, SVG exporter, pixel diff).",[359,360,362],"h3",{"id":361},"renderer-variants","Renderer variants",[364,365,366,381],"table",{},[367,368,369],"thead",{},[370,371,372,375,378],"tr",{},[373,374,342],"th",{},[373,376,377],{},"Location",[373,379,380],{},"Purpose",[382,383,384,398,411,424,437],"tbody",{},[370,385,386,390,395],{},[387,388,389],"td",{},"Canvas 2D",[387,391,392],{},[298,393,394],{},"lib\u002Frenderer\u002Fcanvas-renderer.ts",[387,396,397],{},"Standard layer rendering",[370,399,400,403,408],{},[387,401,402],{},"Realistic",[387,404,405],{},[298,406,407],{},"lib\u002Frenderer\u002Frealistic-renderer.ts",[387,409,410],{},"3D-style PCB appearance",[370,412,413,416,421],{},[387,414,415],{},"SVG Exporter",[387,417,418],{},[298,419,420],{},"lib\u002Frenderer\u002Fsvg-exporter.ts",[387,422,423],{},"SVG export",[370,425,426,429,434],{},[387,427,428],{},"DXF Exporter",[387,430,431],{},[298,432,433],{},"lib\u002Frenderer\u002Fdxf-exporter.ts",[387,435,436],{},"DXF export for CAD integration",[370,438,439,442,447],{},[387,440,441],{},"Pixel Diff",[387,443,444],{},[298,445,446],{},"lib\u002Frenderer\u002Fpixel-diff.ts",[387,448,449],{},"Comparison mode pixel differencing",[258,451,453],{"id":452},"data-persistence","Data persistence",[364,455,456,469],{},[367,457,458],{},[370,459,460,463,466],{},[373,461,462],{},"Data",[373,464,465],{},"Local (browser\u002Fdesktop)",[373,467,468],{},"Team (cloud)",[382,470,471,482,491,509,524],{},[370,472,473,476,479],{},[387,474,475],{},"Projects",[387,477,478],{},"IndexedDB via Dexie.js",[387,480,481],{},"Supabase Postgres",[370,483,484,486,488],{},[387,485,26],{},[387,487,478],{},[387,489,490],{},"Supabase Storage",[370,492,493,496,503],{},[387,494,495],{},"Packages",[387,497,498,499,502],{},"Static JSON (",[298,500,501],{},"public\u002Fpackages\u002F",")",[387,504,505,506,502],{},"Supabase JSONB (",[298,507,508],{},"team_packages",[370,510,511,514,519],{},[387,512,513],{},"THT Packages",[387,515,498,516,502],{},[298,517,518],{},"public\u002Fpackages\u002Ftht-libraries\u002F",[387,520,505,521,502],{},[298,522,523],{},"team_tht_packages",[370,525,526,529,532],{},[387,527,528],{},"User preferences",[387,530,531],{},"localStorage",[387,533,534],{},"–",[241,536,537],{},"Local projects work entirely offline. A successfully opened team project and\nits downloaded files are cached in account-scoped IndexedDB, so they can be\nreopened without a connection and edits queue in the durable outbox. Live\ncollaboration, authentication refreshes, AI enrichment, supplier pricing, and\nthe first load of uncached team data still require the Supabase\u002FAPI connection.",[241,539,540,541,544,545,548],{},"Team project updates are measured at the viewer persistence boundary with\n",[298,542,543],{},"app\u002Futils\u002Fproject-payload-metrics.ts",". The metrics warn when a single update or\nfield approaches the ADR-006 row-growth thresholds, which informs future\nextraction of large\u002Fhot feature data into child tables. BOM lines and pricing\nnow use independent ",[298,546,547],{},"project_bom_data"," child rows.",[258,550,552],{"id":551},"package-system","Package system",[241,554,555,556,559,560,563],{},"Built-in packages are organized as a library tree under ",[298,557,558],{},"public\u002Fpackages\u002Flibraries\u002F",". At runtime, the library tree manifest (",[298,561,562],{},"_tree.json",") is loaded, and individual packages are fetched on demand.",[241,565,566,567,570,571,256],{},"Team packages are stored in Supabase as JSONB and merged into the in-app library at runtime. Export to ",[298,568,569],{},".pck"," uses the TPSys serializer in ",[298,572,573],{},"app\u002Futils\u002Fpck-serializer.ts",[241,575,576,577,580],{},"All packages use TPSys package types exclusively. See ",[578,579,175],"a",{"href":176}," for the type system.",[258,582,584],{"id":583},"collaboration-and-sync","Collaboration and sync",[266,586,587,593,599,604,610,615,621,630],{},[269,588,589,592],{},[245,590,591],{},"Auth"," – Supabase Auth with Microsoft OAuth (Entra ID), GitHub OAuth, email\u002Fpassword, and magic link flows",[269,594,595,598],{},[245,596,597],{},"Teams and projects"," – stored in Postgres, shared via Supabase Realtime subscriptions",[269,600,601,603],{},[245,602,108],{}," – project and package scoping within teams, with guest access via space invitations",[269,605,606,609],{},[245,607,608],{},"Conversations"," – threaded project discussions with mentions, references, and file attachments",[269,611,612,614],{},[245,613,112],{}," – real-time notification delivery for mentions, approvals, and status changes",[269,616,617,620],{},[245,618,619],{},"Presence"," – tracked via Realtime channels to show who is viewing a project",[269,622,623,625,626,629],{},[245,624,26],{}," – stored in Supabase Storage (",[298,627,628],{},"gerber-files"," bucket), metadata tracked in Postgres",[269,631,632,635],{},[245,633,634],{},"Row-level security"," – all tables use RLS policies that enforce team membership, role-based access, and space-level scoping",[258,637,639],{"id":638},"database-schema","Database schema",[241,641,642,643,646],{},"The database is defined through idempotent SQL migrations in ",[298,644,645],{},"supabase\u002Fmigrations\u002F",". Key tables:",[364,648,649,658],{},[367,650,651],{},[370,652,653,656],{},[373,654,655],{},"Table",[373,657,380],{},[382,659,660,670,680,690,700,710,720,730,746,767,777,787,797,807,817,827,836],{},[370,661,662,667],{},[387,663,664],{},[298,665,666],{},"profiles",[387,668,669],{},"User profiles with avatar and display name (auto-created on signup)",[370,671,672,677],{},[387,673,674],{},[298,675,676],{},"teams",[387,678,679],{},"Team definitions with subdomain slugs and settings",[370,681,682,687],{},[387,683,684],{},[298,685,686],{},"team_members",[387,688,689],{},"User-team relationships with roles (admin, editor, viewer, guest)",[370,691,692,697],{},[387,693,694],{},[298,695,696],{},"team_invitations",[387,698,699],{},"Pending email invitations",[370,701,702,707],{},[387,703,704],{},[298,705,706],{},"spaces",[387,708,709],{},"Workgroups within teams for organizing projects",[370,711,712,717],{},[387,713,714],{},[298,715,716],{},"space_members",[387,718,719],{},"User-space membership",[370,721,722,727],{},[387,723,724],{},[298,725,726],{},"space_invitations",[387,728,729],{},"Guest invitations to spaces with expiry tokens",[370,731,732,737],{},[387,733,734],{},[298,735,736],{},"projects",[387,738,739,740,743,744],{},"PCB projects with PnP, panel, paste, and ",[298,741,742],{},"pcb_data"," JSONB. BOM lines and pricing live in ",[298,745,547],{},[370,747,748,752],{},[387,749,750],{},[298,751,547],{},[387,753,754,755,758,759,762,763,766],{},"Partitioned BOM payloads keyed by ",[298,756,757],{},"kind"," (",[298,760,761],{},"lines"," or ",[298,764,765],{},"pricing_cache","), each an independent realtime row",[370,768,769,774],{},[387,770,771],{},[298,772,773],{},"project_files",[387,775,776],{},"Gerber\u002Fdrill file metadata",[370,778,779,784],{},[387,780,781],{},[298,782,783],{},"project_documents",[387,785,786],{},"PDF document metadata",[370,788,789,794],{},[387,790,791],{},[298,792,793],{},"project_conversation_messages",[387,795,796],{},"Threaded conversation messages per project",[370,798,799,804],{},[387,800,801],{},[298,802,803],{},"project_conversation_attachments",[387,805,806],{},"File attachments on conversation messages",[370,808,809,814],{},[387,810,811],{},[298,812,813],{},"notifications",[387,815,816],{},"User notifications (mentions, approvals, status changes)",[370,818,819,824],{},[387,820,821],{},[298,822,823],{},"bom_groups",[387,825,826],{},"Named groups for organizing BOM lines",[370,828,829,833],{},[387,830,831],{},[298,832,508],{},[387,834,835],{},"Custom SMD package definitions",[370,837,838,842],{},[387,839,840],{},[298,841,523],{},[387,843,844],{},"Custom THT package definitions",[258,846,848],{"id":847},"edge-functions","Edge functions",[241,850,851],{},"Supabase Edge Functions (Deno runtime) handle server-side operations:",[364,853,854,863],{},[367,855,856],{},[370,857,858,861],{},[373,859,860],{},"Function",[373,862,380],{},[382,864,865,875,885,895,905,915,929,939,949,959,969],{},[370,866,867,872],{},[387,868,869],{},[298,870,871],{},"admin-password-reset",[387,873,874],{},"Admin-initiated password resets",[370,876,877,882],{},[387,878,879],{},[298,880,881],{},"send-invitation",[387,883,884],{},"Send team and space guest invitation emails (via Resend API)",[370,886,887,892],{},[387,888,889],{},[298,890,891],{},"elexess-exchange-rate",[387,893,894],{},"Daily USD→EUR rate for BOM pricing, proxied from the ECB reference feed (CORS bypass)",[370,896,897,902],{},[387,898,899],{},[298,900,901],{},"main\u002Fai-enrich-bom",[387,903,904],{},"Spark AI BOM enrichment",[370,906,907,912],{},[387,908,909],{},[298,910,911],{},"main\u002Fai-validate-key",[387,913,914],{},"Validate Spark AI provider keys (platform admins only)",[370,916,917,922],{},[387,918,919],{},[298,920,921],{},"main\u002Felexess-search",[387,923,924,925,928],{},"Elexess part search through ",[298,926,927],{},"api.elexess.com"," with the team's or the platform's Elexess API token, mapped to the cached pricing shape",[370,930,931,936],{},[387,932,933],{},[298,934,935],{},"main\u002Felexess-validate-credentials",[387,937,938],{},"Validate an Elexess API token against the quota-free suppliers endpoint (platform admins only)",[370,940,941,946],{},[387,942,943],{},[298,944,945],{},"stripe-*",[387,947,948],{},"Stripe checkout, portal, and webhook handling",[370,950,951,956],{},[387,952,953],{},[298,954,955],{},"admin-*",[387,957,958],{},"Platform admin usage and team actions",[370,960,961,966],{},[387,962,963],{},[298,964,965],{},"delete-account",[387,967,968],{},"Account deletion workflow",[370,970,971,976],{},[387,972,973],{},[298,974,975],{},"telemetry",[387,977,978],{},"Lightweight telemetry endpoint",[258,980,982],{"id":981},"api-routes","API routes",[241,984,985],{},"Supabase Edge Functions are the canonical server-side API for business logic\n(ADR-001). Nuxt server API routes are reserved for operations that must live on\nthe app's own origin:",[364,987,988,997],{},[367,989,990],{},[370,991,992,995],{},[373,993,994],{},"Route",[373,996,380],{},[382,998,999,1009],{},[370,1000,1001,1006],{},[387,1002,1003],{},[298,1004,1005],{},"\u002Fapi\u002Flegal\u002Fconsent",[387,1007,1008],{},"Record legal consent on the app origin",[370,1010,1011,1016],{},[387,1012,1013],{},[298,1014,1015],{},"\u002Fapi\u002Faccount\u002Fexport",[387,1017,1018],{},"Export account data as a same-origin download",[258,1020,1022],{"id":1021},"frontend-structure","Frontend structure",[241,1024,1025],{},"The Nuxt app follows a composable-driven architecture:",[266,1027,1028,1037,1046,1055,1064],{},[269,1029,1030,758,1033,1036],{},[245,1031,1032],{},"Pages",[298,1034,1035],{},"app\u002Fpages\u002F",") – route definitions for viewer, compare, team, auth, docs, inbox, and spaces",[269,1038,1039,758,1042,1045],{},[245,1040,1041],{},"Components",[298,1043,1044],{},"app\u002Fcomponents\u002F",") – organized by feature area (viewer, compare, import, packages, docs, shared)",[269,1047,1048,758,1051,1054],{},[245,1049,1050],{},"Composables",[298,1052,1053],{},"app\u002Fcomposables\u002F",") – state management and business logic (useProject, useBom, usePickAndPlace, useAuth, useTeamProjects, useSpaces, useProjectConversation, useNotifications, useDrawTool, useAiEnrichment, useErrorReporting, etc.)",[269,1056,1057,758,1060,1063],{},[245,1058,1059],{},"Utils",[298,1061,1062],{},"app\u002Futils\u002F",") – pure functions for parsing, geometry, formatting, and conventions",[269,1065,1066,758,1069,1072],{},[245,1067,1068],{},"Libraries",[298,1070,1071],{},"lib\u002F",") – rendering pipeline, Gerber\u002Fdrill generation, jet print export, DXF export",{"title":1074,"searchDepth":1075,"depth":1076,"links":1077},"",3,2,[1078,1079,1080,1083,1084,1085,1086,1087,1088,1089],{"id":260,"depth":1076,"text":261},{"id":292,"depth":1076,"text":293},{"id":308,"depth":1076,"text":309,"children":1081},[1082],{"id":361,"depth":1075,"text":362},{"id":452,"depth":1076,"text":453},{"id":551,"depth":1076,"text":552},{"id":583,"depth":1076,"text":584},{"id":638,"depth":1076,"text":639},{"id":847,"depth":1076,"text":848},{"id":981,"depth":1076,"text":982},{"id":1021,"depth":1076,"text":1022},"System architecture, rendering pipeline, data flow, and high-level component overview.","md",null,{},true,{"title":200,"description":1090},"C-eoumsFYPIEnvQSV52owRHLuAKAasNJX1U7Lk_6-FU",[1098,1100],{"title":196,"path":197,"stem":198,"description":1099,"children":-1},"Prerequisites, development server, desktop builds, and production builds.",{"title":204,"path":205,"stem":206,"description":1101,"children":-1},"External CAD library ingestion, parser pipelines, and package generation workflow.",1790998746359]