[{"data":1,"prerenderedAt":2160},["ShallowReactive",2],{"navigation_docs":3,"-apps-create-from-scratch":217,"-apps-create-from-scratch-surround":2155},[4,25,41,84,126,165,201],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":24},"Overview","i-lucide-house","\u002Fgetting-started","1.getting-started",[10,14,19],{"title":11,"path":12,"stem":13,"icon":6},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F2.introduction",{"title":15,"path":16,"stem":17,"icon":18},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F3.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Project structure","\u002Fgetting-started\u002Fproject-structure","1.getting-started\u002F4.project-structure","i-lucide-folder-tree",false,{"title":26,"icon":27,"path":28,"stem":29,"children":30,"page":24},"Architecture","i-lucide-cpu","\u002Farchitecture","3.architecture",[31,36],{"title":32,"path":33,"stem":34,"icon":35},"Core, themes, and apps","\u002Farchitecture\u002Foverview","3.architecture\u002F1.overview","i-lucide-layers",{"title":37,"path":38,"stem":39,"icon":40},"Kits and extension modules","\u002Farchitecture\u002Fkits","3.architecture\u002F3.kits","i-lucide-puzzle",{"title":42,"icon":43,"path":44,"stem":45,"children":46,"page":24},"Apps","i-lucide-app-window","\u002Fapps","4.apps",[47,51,55,60,64,69,74,79],{"title":5,"path":48,"stem":49,"icon":50},"\u002Fapps\u002Foverview","4.apps\u002F1.overview","i-lucide-info",{"title":52,"path":53,"stem":54,"icon":23},"Package layout","\u002Fapps\u002Fpackage-layout","4.apps\u002F2.package-layout",{"title":56,"path":57,"stem":58,"icon":59},"Create from scratch","\u002Fapps\u002Fcreate-from-scratch","4.apps\u002F3.create-from-scratch","i-lucide-list-checks",{"title":61,"path":62,"stem":63,"icon":40},"Module and runtime","\u002Fapps\u002Fmodule-and-runtime","4.apps\u002F4.module-and-runtime",{"title":65,"path":66,"stem":67,"icon":68},"Plugins","\u002Fapps\u002Fplugins","4.apps\u002F5.plugins","i-lucide-plug",{"title":70,"path":71,"stem":72,"icon":73},"Windows and commands","\u002Fapps\u002Fwindows-and-commands","4.apps\u002F6.windows-and-commands","i-lucide-layout-panel-top",{"title":75,"path":76,"stem":77,"icon":78},"Playground","\u002Fapps\u002Fplayground","4.apps\u002F7.playground","i-lucide-flask-conical",{"title":80,"path":81,"stem":82,"icon":83},"Build and publish","\u002Fapps\u002Fbuild-and-publish","4.apps\u002F8.build-and-publish","i-lucide-package",{"title":85,"icon":86,"path":87,"stem":88,"children":89,"page":24},"Themes","i-lucide-palette","\u002Fthemes","5.themes",[90,93,98,102,106,111,116,121],{"title":5,"path":91,"stem":92,"icon":50},"\u002Fthemes\u002Foverview","5.themes\u002F1.overview",{"title":94,"path":95,"stem":96,"icon":97},"Theme anatomy","\u002Fthemes\u002Ftheme-anatomy","5.themes\u002F2.theme-anatomy","i-lucide-component",{"title":99,"path":100,"stem":101},"Create From Scratch","\u002Fthemes\u002Fcreate-from-scratch","5.themes\u002F3.create-from-scratch",{"title":103,"path":104,"stem":105,"icon":68},"Theme plugins","\u002Fthemes\u002Fplugins","5.themes\u002F4.plugins",{"title":107,"path":108,"stem":109,"icon":110},"Styling and Tailwind","\u002Fthemes\u002Fstyling-and-tailwind","5.themes\u002F5.styling-and-tailwind","i-lucide-brush",{"title":112,"path":113,"stem":114,"icon":115},"Pages and boot flow","\u002Fthemes\u002Fpages-and-boot-flow","5.themes\u002F6.pages-and-boot-flow","i-lucide-power",{"title":117,"path":118,"stem":119,"icon":120},"Theme and optional modules","\u002Fthemes\u002Ftheme-and-optional-modules","5.themes\u002F7.theme-and-optional-modules","i-lucide-link",{"title":122,"path":123,"stem":124,"icon":125},"Window chrome and nav buttons","\u002Fthemes\u002Fwindow-chrome-and-nav-buttons","5.themes\u002F8.window-chrome-and-nav-buttons","i-lucide-square-mouse-pointer",{"title":127,"icon":128,"path":129,"stem":130,"children":131,"page":24},"Client & CLI","i-lucide-terminal","\u002Fsetup","6.setup",[132,136,141,146,151,156,161],{"title":133,"path":134,"stem":135,"icon":128},"desktop CLI","\u002Fsetup\u002Fdesktop-cli","6.setup\u002F1.desktop-cli",{"title":137,"path":138,"stem":139,"icon":140},"Package linking","\u002Fsetup\u002Fpackage-linking","6.setup\u002F2.package-linking","i-lucide-link-2",{"title":142,"path":143,"stem":144,"icon":145},"Monorepo and workspace","\u002Fsetup\u002Fmonorepo-workspace","6.setup\u002F3.monorepo-workspace","i-lucide-blocks",{"title":147,"path":148,"stem":149,"icon":150},"desktop.config.ts","\u002Fsetup\u002Fdesktop-config","6.setup\u002F4.desktop-config","i-lucide-file-code",{"title":152,"path":153,"stem":154,"icon":155},"Migrate themes, apps, and modules (3.3.2)","\u002Fsetup\u002Fmigrate-packages-3.3.2","6.setup\u002F5.migrate-packages-3.3.2","i-lucide-arrow-right-left",{"title":157,"path":158,"stem":159,"icon":160},"Migrate themes, apps, and modules (3.4)","\u002Fsetup\u002Fmigrate-packages-3.4","6.setup\u002F6.migrate-packages-3.4","i-lucide-arrow-up-right",{"title":162,"path":163,"stem":164},"Troubleshooting","\u002Fsetup\u002Ftroubleshooting","6.setup\u002F7.troubleshooting",{"title":166,"icon":167,"path":168,"stem":169,"children":170,"page":24},"Internals","i-lucide-book-open","\u002Finternals","7.internals",[171,176,181,186,191,196],{"title":172,"path":173,"stem":174,"icon":175},"Boot sequence","\u002Finternals\u002Fboot-sequence","7.internals\u002F1.boot-sequence","i-lucide-list-ordered",{"title":177,"path":178,"stem":179,"icon":180},"Stores and composables","\u002Finternals\u002Fstores-and-composables","7.internals\u002F2.stores-and-composables","i-lucide-database",{"title":182,"path":183,"stem":184,"icon":185},"Core components","\u002Finternals\u002Fcore-components","7.internals\u002F3.core-components","i-lucide-layout-grid",{"title":187,"path":188,"stem":189,"icon":190},"Dialog provider","\u002Finternals\u002Fdialog-provider","7.internals\u002F4.dialog-provider","i-lucide-message-square",{"title":192,"path":193,"stem":194,"icon":195},"Kernel contract","\u002Finternals\u002Fkernel-contract","7.internals\u002F5.kernel-contract","i-lucide-shield-check",{"title":197,"path":198,"stem":199,"icon":200},"Shell identity","\u002Finternals\u002Fshell-identity","7.internals\u002F6.shell-identity","i-lucide-user",{"title":202,"icon":203,"path":204,"stem":205,"children":206,"page":24},"Reference","i-lucide-book-marked","\u002Freference","8.reference",[207,212],{"title":208,"path":209,"stem":210,"icon":211},"Glossary","\u002Freference\u002Fglossary","8.reference\u002F1.glossary","i-lucide-book-a",{"title":213,"path":214,"stem":215,"icon":216},"Ecosystem","\u002Freference\u002Fuseful-links","8.reference\u002F2.useful-links","i-lucide-external-link",{"id":218,"title":56,"body":219,"description":2148,"extension":2149,"links":2150,"meta":2151,"navigation":2152,"path":57,"seo":2153,"stem":58,"__hash__":2154},"docs\u002F4.apps\u002F3.create-from-scratch.md",{"type":220,"value":221,"toc":2134},"minimark",[222,246,251,257,267,275,336,345,352,355,696,718,725,740,1167,1172,1179,1192,1344,1364,1368,1380,1394,1404,1408,1415,1487,1494,1587,1620,1627,1737,1757,1788,1798,1802,1810,1970,1979,1991,1995,1998,2014,2024,2030,2057,2084,2105,2109,2130],[223,224,225,226,239,240,245],"p",{},"This walkthrough builds an app like ",[227,228,229],"strong",{},[230,231,235],"a",{"href":232,"rel":233},"https:\u002F\u002Fgithub.com\u002Fowdproject\u002Fapp-about",[234],"nofollow",[236,237,238],"code",{},"app-about"," — a singleton “About” window registered via ",[227,241,242],{},[236,243,244],{},"defineDesktopApp",". Use it as a checklist when starting a new repository.",[247,248,250],"h2",{"id":249},"_1-scaffold-the-repository","1. Scaffold the repository",[223,252,253,254,256],{},"Create a Nuxt module package with the layout from ",[230,255,52],{"href":53},":",[258,259,265],"pre",{"className":260,"code":262,"language":263,"meta":264},[261],"language-text","@owdproject\u002Fmy-app\u002F\n├── package.json\n├── src\u002F\n│   ├── module.ts\n│   └── runtime\u002F\n│       ├── plugin.ts\n│       ├── app.config.ts\n│       └── components\u002FWindow\u002FWindowMain.vue\n└── playground\u002F\n    ├── nuxt.config.ts\n    ├── desktop.config.ts\n    └── package.json\n","text","",[236,266,262],{"__ignoreMap":264},[223,268,269],{},[227,270,271,274],{},[236,272,273],{},"package.json"," essentials:",[276,277,278,284,295,306,323],"ul",{},[279,280,281],"li",{},[236,282,283],{},"\"type\": \"module\"",[279,285,286,291,292],{},[227,287,288],{},[236,289,290],{},"exports"," → ",[236,293,294],{},".\u002Fdist\u002Fmodule.mjs",[279,296,297,302,303],{},[227,298,299],{},[236,300,301],{},"peerDependencies",": ",[236,304,305],{},"\"@owdproject\u002Fcore\": \"^3.4.0\"",[279,307,308,302,313,316,317,316,320],{},[227,309,310],{},[236,311,312],{},"devDependencies",[236,314,315],{},"nuxt",", ",[236,318,319],{},"@nuxt\u002Fmodule-builder",[236,321,322],{},"@nuxt\u002Fschema",[279,324,325,302,328,331,332,335],{},[227,326,327],{},"Scripts",[236,329,330],{},"dev:prepare"," (stub + playground prepare), ",[236,333,334],{},"prepack"," (release build)",[223,337,338,339,344],{},"Clone ",[230,340,342],{"href":232,"rel":341},[234],[236,343,238],{}," and rename if you prefer starting from a working tree.",[247,346,348,349],{"id":347},"_2-write-srcmodulets","2. Write ",[236,350,351],{},"src\u002Fmodule.ts",[223,353,354],{},"The module wires components, the register plugin, and Tailwind scanning:",[258,356,360],{"className":357,"code":358,"language":359,"meta":264,"style":264},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import {\n  defineNuxtModule,\n  createResolver,\n  addComponentsDir,\n  addPlugin,\n} from '@nuxt\u002Fkit'\nimport { registerTailwindPath } from '@owdproject\u002Fkit-tailwind\u002Fkit\u002FregisterTailwindPath'\n\nexport default defineNuxtModule({\n  meta: {\n    name: 'owd-app-my-app',\n    configKey: 'myApp', \u002F\u002F optional — see step 3\n  },\n  async setup(_options, nuxt) {\n    const { resolve } = createResolver(import.meta.url)\n\n    addComponentsDir({ path: resolve('.\u002Fruntime\u002Fcomponents') })\n    addPlugin(resolve('.\u002Fruntime\u002Fplugin'))\n    registerTailwindPath(nuxt, resolve('.\u002Fruntime\u002Fcomponents\u002F**\u002F*.{vue,mjs,ts}'))\n  },\n})\n","ts",[236,361,362,375,385,393,401,409,428,451,458,477,488,506,528,534,560,597,602,636,659,684,689],{"__ignoreMap":264},[363,364,367,371],"span",{"class":365,"line":366},"line",1,[363,368,370],{"class":369},"s7zQu","import",[363,372,374],{"class":373},"sMK4o"," {\n",[363,376,378,382],{"class":365,"line":377},2,[363,379,381],{"class":380},"sTEyZ","  defineNuxtModule",[363,383,384],{"class":373},",\n",[363,386,388,391],{"class":365,"line":387},3,[363,389,390],{"class":380},"  createResolver",[363,392,384],{"class":373},[363,394,396,399],{"class":365,"line":395},4,[363,397,398],{"class":380},"  addComponentsDir",[363,400,384],{"class":373},[363,402,404,407],{"class":365,"line":403},5,[363,405,406],{"class":380},"  addPlugin",[363,408,384],{"class":373},[363,410,412,415,418,421,425],{"class":365,"line":411},6,[363,413,414],{"class":373},"}",[363,416,417],{"class":369}," from",[363,419,420],{"class":373}," '",[363,422,424],{"class":423},"sfazB","@nuxt\u002Fkit",[363,426,427],{"class":373},"'\n",[363,429,431,433,436,439,442,444,446,449],{"class":365,"line":430},7,[363,432,370],{"class":369},[363,434,435],{"class":373}," {",[363,437,438],{"class":380}," registerTailwindPath",[363,440,441],{"class":373}," }",[363,443,417],{"class":369},[363,445,420],{"class":373},[363,447,448],{"class":423},"@owdproject\u002Fkit-tailwind\u002Fkit\u002FregisterTailwindPath",[363,450,427],{"class":373},[363,452,454],{"class":365,"line":453},8,[363,455,457],{"emptyLinePlaceholder":456},true,"\n",[363,459,461,464,467,471,474],{"class":365,"line":460},9,[363,462,463],{"class":369},"export",[363,465,466],{"class":369}," default",[363,468,470],{"class":469},"s2Zo4"," defineNuxtModule",[363,472,473],{"class":380},"(",[363,475,476],{"class":373},"{\n",[363,478,480,484,486],{"class":365,"line":479},10,[363,481,483],{"class":482},"swJcz","  meta",[363,485,256],{"class":373},[363,487,374],{"class":373},[363,489,491,494,496,498,501,504],{"class":365,"line":490},11,[363,492,493],{"class":482},"    name",[363,495,256],{"class":373},[363,497,420],{"class":373},[363,499,500],{"class":423},"owd-app-my-app",[363,502,503],{"class":373},"'",[363,505,384],{"class":373},[363,507,509,512,514,516,519,521,524],{"class":365,"line":508},12,[363,510,511],{"class":482},"    configKey",[363,513,256],{"class":373},[363,515,420],{"class":373},[363,517,518],{"class":423},"myApp",[363,520,503],{"class":373},[363,522,523],{"class":373},",",[363,525,527],{"class":526},"sHwdD"," \u002F\u002F optional — see step 3\n",[363,529,531],{"class":365,"line":530},13,[363,532,533],{"class":373},"  },\n",[363,535,537,541,544,546,550,552,555,558],{"class":365,"line":536},14,[363,538,540],{"class":539},"spNyl","  async",[363,542,543],{"class":482}," setup",[363,545,473],{"class":373},[363,547,549],{"class":548},"sHdIc","_options",[363,551,523],{"class":373},[363,553,554],{"class":548}," nuxt",[363,556,557],{"class":373},")",[363,559,374],{"class":373},[363,561,563,566,568,571,573,576,579,581,583,586,589,591,594],{"class":365,"line":562},15,[363,564,565],{"class":539},"    const",[363,567,435],{"class":373},[363,569,570],{"class":380}," resolve",[363,572,441],{"class":373},[363,574,575],{"class":373}," =",[363,577,578],{"class":469}," createResolver",[363,580,473],{"class":482},[363,582,370],{"class":369},[363,584,585],{"class":373},".",[363,587,588],{"class":380},"meta",[363,590,585],{"class":373},[363,592,593],{"class":380},"url",[363,595,596],{"class":482},")\n",[363,598,600],{"class":365,"line":599},16,[363,601,457],{"emptyLinePlaceholder":456},[363,603,605,608,610,613,616,618,620,622,624,627,629,632,634],{"class":365,"line":604},17,[363,606,607],{"class":469},"    addComponentsDir",[363,609,473],{"class":482},[363,611,612],{"class":373},"{",[363,614,615],{"class":482}," path",[363,617,256],{"class":373},[363,619,570],{"class":469},[363,621,473],{"class":482},[363,623,503],{"class":373},[363,625,626],{"class":423},".\u002Fruntime\u002Fcomponents",[363,628,503],{"class":373},[363,630,631],{"class":482},") ",[363,633,414],{"class":373},[363,635,596],{"class":482},[363,637,639,642,644,647,649,651,654,656],{"class":365,"line":638},18,[363,640,641],{"class":469},"    addPlugin",[363,643,473],{"class":482},[363,645,646],{"class":469},"resolve",[363,648,473],{"class":482},[363,650,503],{"class":373},[363,652,653],{"class":423},".\u002Fruntime\u002Fplugin",[363,655,503],{"class":373},[363,657,658],{"class":482},"))\n",[363,660,662,665,667,669,671,673,675,677,680,682],{"class":365,"line":661},19,[363,663,664],{"class":469},"    registerTailwindPath",[363,666,473],{"class":482},[363,668,315],{"class":380},[363,670,523],{"class":373},[363,672,570],{"class":469},[363,674,473],{"class":482},[363,676,503],{"class":373},[363,678,679],{"class":423},".\u002Fruntime\u002Fcomponents\u002F**\u002F*.{vue,mjs,ts}",[363,681,503],{"class":373},[363,683,658],{"class":482},[363,685,687],{"class":365,"line":686},20,[363,688,533],{"class":373},[363,690,692,694],{"class":365,"line":691},21,[363,693,414],{"class":373},[363,695,596],{"class":380},[223,697,698,699,704,705,709,710,713,714,717],{},"Optional ",[227,700,701],{},[236,702,703],{},"configKey"," lets consumers override app-specific defaults from ",[227,706,707],{},[236,708,147],{}," (About uses ",[236,711,712],{},"configKey: 'about'"," and merges into ",[236,715,716],{},"runtimeConfig.public.desktop.about",").",[247,719,721,722],{"id":720},"_3-define-runtimeappconfigts","3. Define ",[236,723,724],{},"runtime\u002Fapp.config.ts",[223,726,727,728,733,734,256],{},"Export an ",[227,729,730],{},[236,731,732],{},"ApplicationConfig"," object. From ",[230,735,738],{"href":736,"rel":737},"https:\u002F\u002Fgithub.com\u002Fowdproject\u002Fapp-about\u002Fblob\u002Fmain\u002Fsrc\u002Fruntime\u002Fapp.config.ts",[234],[236,739,238],{},[258,741,743],{"className":357,"code":742,"language":359,"meta":264,"style":264},"export default {\n  id: 'org.owdproject.about',\n  title: 'About',\n  category: 'system-tools',\n  singleton: true,\n  icon: 'mdi:hexagon-multiple-outline',\n  windows: {\n    main: {\n      component: () => import('.\u002Fcomponents\u002FWindow\u002FWindowAbout.vue'),\n      resizable: false,\n      size: { width: 448, height: 240 },\n      position: { x: 400, y: 240, z: 0 },\n    },\n  },\n  entries: {\n    about: { command: 'about' },\n  },\n  commands: {\n    about: (app) => {\n      const existing = app.getFirstWindowByModel('main')\n      if (existing) {\n        existing.actions.setActive(true)\n        existing.actions.bringToFront()\n        return existing\n      }\n      return app.openWindow('main')\n    },\n  },\n}\n",[236,744,745,753,769,785,801,814,830,839,848,877,889,920,958,963,967,976,999,1003,1012,1030,1059,1073,1096,1113,1122,1128,1151,1156,1161],{"__ignoreMap":264},[363,746,747,749,751],{"class":365,"line":366},[363,748,463],{"class":369},[363,750,466],{"class":369},[363,752,374],{"class":373},[363,754,755,758,760,762,765,767],{"class":365,"line":377},[363,756,757],{"class":482},"  id",[363,759,256],{"class":373},[363,761,420],{"class":373},[363,763,764],{"class":423},"org.owdproject.about",[363,766,503],{"class":373},[363,768,384],{"class":373},[363,770,771,774,776,778,781,783],{"class":365,"line":387},[363,772,773],{"class":482},"  title",[363,775,256],{"class":373},[363,777,420],{"class":373},[363,779,780],{"class":423},"About",[363,782,503],{"class":373},[363,784,384],{"class":373},[363,786,787,790,792,794,797,799],{"class":365,"line":395},[363,788,789],{"class":482},"  category",[363,791,256],{"class":373},[363,793,420],{"class":373},[363,795,796],{"class":423},"system-tools",[363,798,503],{"class":373},[363,800,384],{"class":373},[363,802,803,806,808,812],{"class":365,"line":403},[363,804,805],{"class":482},"  singleton",[363,807,256],{"class":373},[363,809,811],{"class":810},"sfNiH"," true",[363,813,384],{"class":373},[363,815,816,819,821,823,826,828],{"class":365,"line":411},[363,817,818],{"class":482},"  icon",[363,820,256],{"class":373},[363,822,420],{"class":373},[363,824,825],{"class":423},"mdi:hexagon-multiple-outline",[363,827,503],{"class":373},[363,829,384],{"class":373},[363,831,832,835,837],{"class":365,"line":430},[363,833,834],{"class":482},"  windows",[363,836,256],{"class":373},[363,838,374],{"class":373},[363,840,841,844,846],{"class":365,"line":453},[363,842,843],{"class":482},"    main",[363,845,256],{"class":373},[363,847,374],{"class":373},[363,849,850,853,855,858,861,864,866,868,871,873,875],{"class":365,"line":460},[363,851,852],{"class":469},"      component",[363,854,256],{"class":373},[363,856,857],{"class":373}," ()",[363,859,860],{"class":539}," =>",[363,862,863],{"class":373}," import",[363,865,473],{"class":380},[363,867,503],{"class":373},[363,869,870],{"class":423},".\u002Fcomponents\u002FWindow\u002FWindowAbout.vue",[363,872,503],{"class":373},[363,874,557],{"class":380},[363,876,384],{"class":373},[363,878,879,882,884,887],{"class":365,"line":479},[363,880,881],{"class":482},"      resizable",[363,883,256],{"class":373},[363,885,886],{"class":810}," false",[363,888,384],{"class":373},[363,890,891,894,896,898,901,903,907,909,912,914,917],{"class":365,"line":490},[363,892,893],{"class":482},"      size",[363,895,256],{"class":373},[363,897,435],{"class":373},[363,899,900],{"class":482}," width",[363,902,256],{"class":373},[363,904,906],{"class":905},"sbssI"," 448",[363,908,523],{"class":373},[363,910,911],{"class":482}," height",[363,913,256],{"class":373},[363,915,916],{"class":905}," 240",[363,918,919],{"class":373}," },\n",[363,921,922,925,927,929,932,934,937,939,942,944,946,948,951,953,956],{"class":365,"line":508},[363,923,924],{"class":482},"      position",[363,926,256],{"class":373},[363,928,435],{"class":373},[363,930,931],{"class":482}," x",[363,933,256],{"class":373},[363,935,936],{"class":905}," 400",[363,938,523],{"class":373},[363,940,941],{"class":482}," y",[363,943,256],{"class":373},[363,945,916],{"class":905},[363,947,523],{"class":373},[363,949,950],{"class":482}," z",[363,952,256],{"class":373},[363,954,955],{"class":905}," 0",[363,957,919],{"class":373},[363,959,960],{"class":365,"line":530},[363,961,962],{"class":373},"    },\n",[363,964,965],{"class":365,"line":536},[363,966,533],{"class":373},[363,968,969,972,974],{"class":365,"line":562},[363,970,971],{"class":482},"  entries",[363,973,256],{"class":373},[363,975,374],{"class":373},[363,977,978,981,983,985,988,990,992,995,997],{"class":365,"line":599},[363,979,980],{"class":482},"    about",[363,982,256],{"class":373},[363,984,435],{"class":373},[363,986,987],{"class":482}," command",[363,989,256],{"class":373},[363,991,420],{"class":373},[363,993,994],{"class":423},"about",[363,996,503],{"class":373},[363,998,919],{"class":373},[363,1000,1001],{"class":365,"line":604},[363,1002,533],{"class":373},[363,1004,1005,1008,1010],{"class":365,"line":638},[363,1006,1007],{"class":482},"  commands",[363,1009,256],{"class":373},[363,1011,374],{"class":373},[363,1013,1014,1016,1018,1021,1024,1026,1028],{"class":365,"line":661},[363,1015,980],{"class":469},[363,1017,256],{"class":373},[363,1019,1020],{"class":373}," (",[363,1022,1023],{"class":548},"app",[363,1025,557],{"class":373},[363,1027,860],{"class":539},[363,1029,374],{"class":373},[363,1031,1032,1035,1038,1040,1043,1045,1048,1050,1052,1055,1057],{"class":365,"line":686},[363,1033,1034],{"class":539},"      const",[363,1036,1037],{"class":380}," existing",[363,1039,575],{"class":373},[363,1041,1042],{"class":380}," app",[363,1044,585],{"class":373},[363,1046,1047],{"class":469},"getFirstWindowByModel",[363,1049,473],{"class":482},[363,1051,503],{"class":373},[363,1053,1054],{"class":423},"main",[363,1056,503],{"class":373},[363,1058,596],{"class":482},[363,1060,1061,1064,1066,1069,1071],{"class":365,"line":691},[363,1062,1063],{"class":369},"      if",[363,1065,1020],{"class":482},[363,1067,1068],{"class":380},"existing",[363,1070,631],{"class":482},[363,1072,476],{"class":373},[363,1074,1076,1079,1081,1084,1086,1089,1091,1094],{"class":365,"line":1075},22,[363,1077,1078],{"class":380},"        existing",[363,1080,585],{"class":373},[363,1082,1083],{"class":380},"actions",[363,1085,585],{"class":373},[363,1087,1088],{"class":469},"setActive",[363,1090,473],{"class":482},[363,1092,1093],{"class":810},"true",[363,1095,596],{"class":482},[363,1097,1099,1101,1103,1105,1107,1110],{"class":365,"line":1098},23,[363,1100,1078],{"class":380},[363,1102,585],{"class":373},[363,1104,1083],{"class":380},[363,1106,585],{"class":373},[363,1108,1109],{"class":469},"bringToFront",[363,1111,1112],{"class":482},"()\n",[363,1114,1116,1119],{"class":365,"line":1115},24,[363,1117,1118],{"class":369},"        return",[363,1120,1121],{"class":380}," existing\n",[363,1123,1125],{"class":365,"line":1124},25,[363,1126,1127],{"class":373},"      }\n",[363,1129,1131,1134,1136,1138,1141,1143,1145,1147,1149],{"class":365,"line":1130},26,[363,1132,1133],{"class":369},"      return",[363,1135,1042],{"class":380},[363,1137,585],{"class":373},[363,1139,1140],{"class":469},"openWindow",[363,1142,473],{"class":482},[363,1144,503],{"class":373},[363,1146,1054],{"class":423},[363,1148,503],{"class":373},[363,1150,596],{"class":482},[363,1152,1154],{"class":365,"line":1153},27,[363,1155,962],{"class":373},[363,1157,1159],{"class":365,"line":1158},28,[363,1160,533],{"class":373},[363,1162,1164],{"class":365,"line":1163},29,[363,1165,1166],{"class":373},"}\n",[223,1168,1169,1170,585],{},"Details: ",[230,1171,70],{"href":71},[247,1173,1175,1176],{"id":1174},"_4-add-runtimeplugints","4. Add ",[236,1177,1178],{},"runtime\u002Fplugin.ts",[223,1180,1181,1182,1185,1186,1191],{},"The register plugin must run ",[227,1183,1184],{},"client-side only"," and use a stable name for ",[227,1187,1188],{},[236,1189,1190],{},"dependsOn"," ordering:",[258,1193,1195],{"className":357,"code":1194,"language":359,"meta":264,"style":264},"import { defineNuxtPlugin } from 'nuxt\u002Fapp'\nimport { defineDesktopApp } from '@owdproject\u002Fcore'\nimport config from '.\u002Fapp.config'\n\nexport default defineNuxtPlugin({\n  name: 'desktop-app-about-register',\n  async setup() {\n    if (import.meta.server) return\n    await defineDesktopApp(config)\n  },\n})\n",[236,1196,1197,1217,1237,1254,1258,1270,1286,1297,1320,1334,1338],{"__ignoreMap":264},[363,1198,1199,1201,1203,1206,1208,1210,1212,1215],{"class":365,"line":366},[363,1200,370],{"class":369},[363,1202,435],{"class":373},[363,1204,1205],{"class":380}," defineNuxtPlugin",[363,1207,441],{"class":373},[363,1209,417],{"class":369},[363,1211,420],{"class":373},[363,1213,1214],{"class":423},"nuxt\u002Fapp",[363,1216,427],{"class":373},[363,1218,1219,1221,1223,1226,1228,1230,1232,1235],{"class":365,"line":377},[363,1220,370],{"class":369},[363,1222,435],{"class":373},[363,1224,1225],{"class":380}," defineDesktopApp",[363,1227,441],{"class":373},[363,1229,417],{"class":369},[363,1231,420],{"class":373},[363,1233,1234],{"class":423},"@owdproject\u002Fcore",[363,1236,427],{"class":373},[363,1238,1239,1241,1244,1247,1249,1252],{"class":365,"line":387},[363,1240,370],{"class":369},[363,1242,1243],{"class":380}," config ",[363,1245,1246],{"class":369},"from",[363,1248,420],{"class":373},[363,1250,1251],{"class":423},".\u002Fapp.config",[363,1253,427],{"class":373},[363,1255,1256],{"class":365,"line":395},[363,1257,457],{"emptyLinePlaceholder":456},[363,1259,1260,1262,1264,1266,1268],{"class":365,"line":403},[363,1261,463],{"class":369},[363,1263,466],{"class":369},[363,1265,1205],{"class":469},[363,1267,473],{"class":380},[363,1269,476],{"class":373},[363,1271,1272,1275,1277,1279,1282,1284],{"class":365,"line":411},[363,1273,1274],{"class":482},"  name",[363,1276,256],{"class":373},[363,1278,420],{"class":373},[363,1280,1281],{"class":423},"desktop-app-about-register",[363,1283,503],{"class":373},[363,1285,384],{"class":373},[363,1287,1288,1290,1292,1295],{"class":365,"line":430},[363,1289,540],{"class":539},[363,1291,543],{"class":482},[363,1293,1294],{"class":373},"()",[363,1296,374],{"class":373},[363,1298,1299,1302,1304,1306,1308,1310,1312,1315,1317],{"class":365,"line":453},[363,1300,1301],{"class":369},"    if",[363,1303,1020],{"class":482},[363,1305,370],{"class":369},[363,1307,585],{"class":373},[363,1309,588],{"class":380},[363,1311,585],{"class":373},[363,1313,1314],{"class":380},"server",[363,1316,631],{"class":482},[363,1318,1319],{"class":369},"return\n",[363,1321,1322,1325,1327,1329,1332],{"class":365,"line":460},[363,1323,1324],{"class":369},"    await",[363,1326,1225],{"class":469},[363,1328,473],{"class":482},[363,1330,1331],{"class":380},"config",[363,1333,596],{"class":482},[363,1335,1336],{"class":365,"line":479},[363,1337,533],{"class":373},[363,1339,1340,1342],{"class":365,"line":490},[363,1341,414],{"class":373},[363,1343,596],{"class":380},[223,1345,1346,1347,1350,1351,1353,1354,1357,1358,1361,1362,585],{},"Do ",[227,1348,1349],{},"not"," wrap ",[236,1352,244],{}," in ",[236,1355,1356],{},"app:created"," — the current validator and reference apps call it directly in the plugin ",[236,1359,1360],{},"setup",". See ",[230,1363,65],{"href":66},[247,1365,1367],{"id":1366},"_5-build-the-window-component","5. Build the window component",[223,1369,1370,1371,1376,1377,256],{},"Window components live under ",[227,1372,1373],{},[236,1374,1375],{},"runtime\u002Fcomponents\u002FWindow\u002F",". Keep them ",[227,1378,1379],{},"theme-neutral",[276,1381,1382,1391],{},[279,1383,1384,1385,1390],{},"Use ",[227,1386,1387],{},[236,1388,1389],{},"DesktopWindowContent"," and core composables where possible.",[279,1392,1393],{},"Avoid importing theme-specific chrome (taskbar, Win95 borders, etc.).",[223,1395,1396,1397,1399,1400,585],{},"About’s window is a simple panel with props read from ",[236,1398,716],{}," when using ",[227,1401,1402],{},[236,1403,703],{},[247,1405,1407],{"id":1406},"_6-configure-the-playground","6. Configure the playground",[223,1409,1410],{},[227,1411,1412,256],{},[236,1413,1414],{},"playground\u002Fnuxt.config.ts",[258,1416,1418],{"className":357,"code":1417,"language":359,"meta":264,"style":264},"export default defineNuxtConfig({\n  modules: ['@owdproject\u002Fcore'],\n  ssr: false,\n  compatibilityDate: 'latest',\n})\n",[236,1419,1420,1433,1454,1465,1481],{"__ignoreMap":264},[363,1421,1422,1424,1426,1429,1431],{"class":365,"line":366},[363,1423,463],{"class":369},[363,1425,466],{"class":369},[363,1427,1428],{"class":469}," defineNuxtConfig",[363,1430,473],{"class":380},[363,1432,476],{"class":373},[363,1434,1435,1438,1440,1443,1445,1447,1449,1452],{"class":365,"line":377},[363,1436,1437],{"class":482},"  modules",[363,1439,256],{"class":373},[363,1441,1442],{"class":380}," [",[363,1444,503],{"class":373},[363,1446,1234],{"class":423},[363,1448,503],{"class":373},[363,1450,1451],{"class":380},"]",[363,1453,384],{"class":373},[363,1455,1456,1459,1461,1463],{"class":365,"line":387},[363,1457,1458],{"class":482},"  ssr",[363,1460,256],{"class":373},[363,1462,886],{"class":810},[363,1464,384],{"class":373},[363,1466,1467,1470,1472,1474,1477,1479],{"class":365,"line":395},[363,1468,1469],{"class":482},"  compatibilityDate",[363,1471,256],{"class":373},[363,1473,420],{"class":373},[363,1475,1476],{"class":423},"latest",[363,1478,503],{"class":373},[363,1480,384],{"class":373},[363,1482,1483,1485],{"class":365,"line":403},[363,1484,414],{"class":373},[363,1486,596],{"class":380},[223,1488,1489],{},[227,1490,1491,256],{},[236,1492,1493],{},"playground\u002Fdesktop.config.ts",[258,1495,1497],{"className":357,"code":1496,"language":359,"meta":264,"style":264},"import { defineDesktopConfig } from '@owdproject\u002Fcore'\n\nexport default defineDesktopConfig({\n  theme: '@owdproject\u002Ftheme-nova',\n  apps: ['@owdproject\u002Fapp-about'],\n  modules: [],\n})\n",[236,1498,1499,1518,1522,1534,1550,1570,1581],{"__ignoreMap":264},[363,1500,1501,1503,1505,1508,1510,1512,1514,1516],{"class":365,"line":366},[363,1502,370],{"class":369},[363,1504,435],{"class":373},[363,1506,1507],{"class":380}," defineDesktopConfig",[363,1509,441],{"class":373},[363,1511,417],{"class":369},[363,1513,420],{"class":373},[363,1515,1234],{"class":423},[363,1517,427],{"class":373},[363,1519,1520],{"class":365,"line":377},[363,1521,457],{"emptyLinePlaceholder":456},[363,1523,1524,1526,1528,1530,1532],{"class":365,"line":387},[363,1525,463],{"class":369},[363,1527,466],{"class":369},[363,1529,1507],{"class":469},[363,1531,473],{"class":380},[363,1533,476],{"class":373},[363,1535,1536,1539,1541,1543,1546,1548],{"class":365,"line":395},[363,1537,1538],{"class":482},"  theme",[363,1540,256],{"class":373},[363,1542,420],{"class":373},[363,1544,1545],{"class":423},"@owdproject\u002Ftheme-nova",[363,1547,503],{"class":373},[363,1549,384],{"class":373},[363,1551,1552,1555,1557,1559,1561,1564,1566,1568],{"class":365,"line":403},[363,1553,1554],{"class":482},"  apps",[363,1556,256],{"class":373},[363,1558,1442],{"class":380},[363,1560,503],{"class":373},[363,1562,1563],{"class":423},"@owdproject\u002Fapp-about",[363,1565,503],{"class":373},[363,1567,1451],{"class":380},[363,1569,384],{"class":373},[363,1571,1572,1574,1576,1579],{"class":365,"line":411},[363,1573,1437],{"class":482},[363,1575,256],{"class":373},[363,1577,1578],{"class":380}," []",[363,1580,384],{"class":373},[363,1582,1583,1585],{"class":365,"line":430},[363,1584,414],{"class":373},[363,1586,596],{"class":380},[223,1588,1589,1592,1593,316,1598,1603,1604,1609,1610,1615,1616,1619],{},[227,1590,1591],{},"Critical rule:"," every package listed in ",[227,1594,1595],{},[236,1596,1597],{},"theme",[227,1599,1600],{},[236,1601,1602],{},"apps",", or ",[227,1605,1606],{},[236,1607,1608],{},"modules"," must appear in ",[227,1611,1612],{},[236,1613,1614],{},"playground\u002Fpackage.json"," ",[236,1617,1618],{},"dependencies",". Mismatch causes install or runtime resolution errors.",[223,1621,1622],{},[227,1623,1624,1626],{},[236,1625,1614],{}," (minimal):",[258,1628,1632],{"className":1629,"code":1630,"language":1631,"meta":264,"style":264},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"dependencies\": {\n    \"@owdproject\u002Fcore\": \"^3.4.0\",\n    \"@owdproject\u002Ftheme-nova\": \"^3.4.0\",\n    \"@owdproject\u002Fapp-about\": \"^3.4.0\",\n    \"nuxt\": \"^4.4.4\"\n  }\n}\n","json",[236,1633,1634,1638,1652,1674,1692,1710,1728,1733],{"__ignoreMap":264},[363,1635,1636],{"class":365,"line":366},[363,1637,476],{"class":373},[363,1639,1640,1643,1645,1648,1650],{"class":365,"line":377},[363,1641,1642],{"class":373},"  \"",[363,1644,1618],{"class":539},[363,1646,1647],{"class":373},"\"",[363,1649,256],{"class":373},[363,1651,374],{"class":373},[363,1653,1654,1657,1660,1662,1664,1667,1670,1672],{"class":365,"line":387},[363,1655,1656],{"class":373},"    \"",[363,1658,1234],{"class":1659},"sBMFI",[363,1661,1647],{"class":373},[363,1663,256],{"class":373},[363,1665,1666],{"class":373}," \"",[363,1668,1669],{"class":423},"^3.4.0",[363,1671,1647],{"class":373},[363,1673,384],{"class":373},[363,1675,1676,1678,1680,1682,1684,1686,1688,1690],{"class":365,"line":395},[363,1677,1656],{"class":373},[363,1679,1545],{"class":1659},[363,1681,1647],{"class":373},[363,1683,256],{"class":373},[363,1685,1666],{"class":373},[363,1687,1669],{"class":423},[363,1689,1647],{"class":373},[363,1691,384],{"class":373},[363,1693,1694,1696,1698,1700,1702,1704,1706,1708],{"class":365,"line":403},[363,1695,1656],{"class":373},[363,1697,1563],{"class":1659},[363,1699,1647],{"class":373},[363,1701,256],{"class":373},[363,1703,1666],{"class":373},[363,1705,1669],{"class":423},[363,1707,1647],{"class":373},[363,1709,384],{"class":373},[363,1711,1712,1714,1716,1718,1720,1722,1725],{"class":365,"line":411},[363,1713,1656],{"class":373},[363,1715,315],{"class":1659},[363,1717,1647],{"class":373},[363,1719,256],{"class":373},[363,1721,1666],{"class":373},[363,1723,1724],{"class":423},"^4.4.4",[363,1726,1727],{"class":373},"\"\n",[363,1729,1730],{"class":365,"line":430},[363,1731,1732],{"class":373},"  }\n",[363,1734,1735],{"class":365,"line":453},[363,1736,1166],{"class":373},[223,1738,1739,1740,1745,1746,1751,1752,1745,1754,585],{},"When the theme imports PrimeVue directly (Nova explorer), also add ",[227,1741,1742],{},[236,1743,1744],{},"primevue"," and ",[227,1747,1748],{},[236,1749,1750],{},"@primeuix\u002Fthemes"," — see ",[230,1753,75],{"href":76},[230,1755,1756],{"href":100},"Create a theme",[258,1758,1762],{"className":1759,"code":1760,"language":1761,"meta":264,"style":264},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","cd playground && pnpm install && pnpm dev\n","bash",[236,1763,1764],{"__ignoreMap":264},[363,1765,1766,1769,1772,1775,1778,1781,1783,1785],{"class":365,"line":366},[363,1767,1768],{"class":469},"cd",[363,1770,1771],{"class":423}," playground",[363,1773,1774],{"class":373}," &&",[363,1776,1777],{"class":1659}," pnpm",[363,1779,1780],{"class":423}," install",[363,1782,1774],{"class":373},[363,1784,1777],{"class":1659},[363,1786,1787],{"class":423}," dev\n",[223,1789,1790,1791,1794,1795,1797],{},"Or from the app root: ",[236,1792,1793],{},"pnpm run dev"," (runs ",[236,1796,330],{}," then playground dev).",[247,1799,1801],{"id":1800},"_7-optional-playground-launch-plugin","7. Optional: playground launch plugin",[223,1803,1804,1805,256],{},"For dev ergonomics and GitHub Pages, auto-open your app after boot. Create ",[227,1806,1807],{},[236,1808,1809],{},"playground\u002Fapp\u002Fplugins\u002Flaunch-about.client.ts",[258,1811,1813],{"className":357,"code":1812,"language":359,"meta":264,"style":264},"import { defineNuxtPlugin } from 'nuxt\u002Fapp'\n\nexport default defineNuxtPlugin({\n  name: 'app-about-playground-launch',\n  dependsOn: ['desktop-app-about-register'],\n  setup(nuxtApp) {\n    autoStartPlaygroundApps(nuxtApp, [\n      { id: 'org.owdproject.about', entry: 'about', windowModel: 'main' },\n    ])\n  },\n})\n",[236,1814,1815,1833,1837,1849,1864,1883,1897,1911,1955,1960,1964],{"__ignoreMap":264},[363,1816,1817,1819,1821,1823,1825,1827,1829,1831],{"class":365,"line":366},[363,1818,370],{"class":369},[363,1820,435],{"class":373},[363,1822,1205],{"class":380},[363,1824,441],{"class":373},[363,1826,417],{"class":369},[363,1828,420],{"class":373},[363,1830,1214],{"class":423},[363,1832,427],{"class":373},[363,1834,1835],{"class":365,"line":377},[363,1836,457],{"emptyLinePlaceholder":456},[363,1838,1839,1841,1843,1845,1847],{"class":365,"line":387},[363,1840,463],{"class":369},[363,1842,466],{"class":369},[363,1844,1205],{"class":469},[363,1846,473],{"class":380},[363,1848,476],{"class":373},[363,1850,1851,1853,1855,1857,1860,1862],{"class":365,"line":395},[363,1852,1274],{"class":482},[363,1854,256],{"class":373},[363,1856,420],{"class":373},[363,1858,1859],{"class":423},"app-about-playground-launch",[363,1861,503],{"class":373},[363,1863,384],{"class":373},[363,1865,1866,1869,1871,1873,1875,1877,1879,1881],{"class":365,"line":403},[363,1867,1868],{"class":482},"  dependsOn",[363,1870,256],{"class":373},[363,1872,1442],{"class":380},[363,1874,503],{"class":373},[363,1876,1281],{"class":423},[363,1878,503],{"class":373},[363,1880,1451],{"class":380},[363,1882,384],{"class":373},[363,1884,1885,1888,1890,1893,1895],{"class":365,"line":411},[363,1886,1887],{"class":482},"  setup",[363,1889,473],{"class":373},[363,1891,1892],{"class":548},"nuxtApp",[363,1894,557],{"class":373},[363,1896,374],{"class":373},[363,1898,1899,1902,1904,1906,1908],{"class":365,"line":430},[363,1900,1901],{"class":469},"    autoStartPlaygroundApps",[363,1903,473],{"class":482},[363,1905,1892],{"class":380},[363,1907,523],{"class":373},[363,1909,1910],{"class":482}," [\n",[363,1912,1913,1916,1919,1921,1923,1925,1927,1929,1932,1934,1936,1938,1940,1942,1945,1947,1949,1951,1953],{"class":365,"line":453},[363,1914,1915],{"class":373},"      {",[363,1917,1918],{"class":482}," id",[363,1920,256],{"class":373},[363,1922,420],{"class":373},[363,1924,764],{"class":423},[363,1926,503],{"class":373},[363,1928,523],{"class":373},[363,1930,1931],{"class":482}," entry",[363,1933,256],{"class":373},[363,1935,420],{"class":373},[363,1937,994],{"class":423},[363,1939,503],{"class":373},[363,1941,523],{"class":373},[363,1943,1944],{"class":482}," windowModel",[363,1946,256],{"class":373},[363,1948,420],{"class":373},[363,1950,1054],{"class":423},[363,1952,503],{"class":373},[363,1954,919],{"class":373},[363,1956,1957],{"class":365,"line":460},[363,1958,1959],{"class":482},"    ])\n",[363,1961,1962],{"class":365,"line":479},[363,1963,533],{"class":373},[363,1965,1966,1968],{"class":365,"line":490},[363,1967,414],{"class":373},[363,1969,596],{"class":380},[223,1971,1346,1972,1974,1975,1978],{},[227,1973,1349],{}," guard with ",[236,1976,1977],{},"if (!import.meta.dev) return"," — static generate and GitHub Pages need the same path.",[223,1980,1981,1982,1361,1989,585],{},"Full reference: ",[230,1983,1986,1988],{"href":1984,"rel":1985},"https:\u002F\u002Fgithub.com\u002Fowdproject\u002Fapp-about\u002Fblob\u002Fmain\u002Fplayground\u002Fapp\u002Fplugins\u002Flaunch-about.client.ts",[234],[236,1987,238],{}," launch plugin",[230,1990,65],{"href":66},[247,1992,1994],{"id":1993},"_8-validate-and-wire-into-the-desktop","8. Validate and wire into the desktop",[223,1996,1997],{},"From the app repo root:",[258,1999,2001],{"className":1759,"code":2000,"language":1761,"meta":264,"style":264},"desktop validate .\n",[236,2002,2003],{"__ignoreMap":264},[363,2004,2005,2008,2011],{"class":365,"line":366},[363,2006,2007],{"class":1659},"desktop",[363,2009,2010],{"class":423}," validate",[363,2012,2013],{"class":423}," .\n",[223,2015,2016,2017,316,2020,2023],{},"Checks include ",[236,2018,2019],{},"src\u002Fruntime\u002Fplugin.ts",[236,2021,2022],{},"app.config.ts",", playground deps on your package and core, and optional launch plugin.",[223,2025,2026,2027,256],{},"To test inside the ",[227,2028,2029],{},"client monorepo",[258,2031,2033],{"className":1629,"code":2032,"language":1631,"meta":264,"style":264},"\u002F\u002F desktop\u002Fpackage.json\n\"@owdproject\u002Fapp-about\": \"workspace:*\"\n",[236,2034,2035,2040],{"__ignoreMap":264},[363,2036,2037],{"class":365,"line":366},[363,2038,2039],{"class":526},"\u002F\u002F desktop\u002Fpackage.json\n",[363,2041,2042,2044,2046,2048,2050,2052,2055],{"class":365,"line":377},[363,2043,1647],{"class":373},[363,2045,1563],{"class":423},[363,2047,1647],{"class":373},[363,2049,302],{"class":380},[363,2051,1647],{"class":373},[363,2053,2054],{"class":423},"workspace:*",[363,2056,1727],{"class":373},[258,2058,2060],{"className":357,"code":2059,"language":359,"meta":264,"style":264},"\u002F\u002F desktop\u002Fdesktop.config.ts\napps: ['@owdproject\u002Fapp-about']\n",[236,2061,2062,2067],{"__ignoreMap":264},[363,2063,2064],{"class":365,"line":366},[363,2065,2066],{"class":526},"\u002F\u002F desktop\u002Fdesktop.config.ts\n",[363,2068,2069,2071,2073,2075,2077,2079,2081],{"class":365,"line":377},[363,2070,1602],{"class":1659},[363,2072,256],{"class":373},[363,2074,1442],{"class":380},[363,2076,503],{"class":373},[363,2078,1563],{"class":423},[363,2080,503],{"class":373},[363,2082,2083],{"class":380},"]\n",[258,2085,2087],{"className":1759,"code":2086,"language":1761,"meta":264,"style":264},"pnpm install && pnpm run dev\n",[236,2088,2089],{"__ignoreMap":264},[363,2090,2091,2094,2096,2098,2100,2103],{"class":365,"line":366},[363,2092,2093],{"class":1659},"pnpm",[363,2095,1780],{"class":423},[363,2097,1774],{"class":373},[363,2099,1777],{"class":1659},[363,2101,2102],{"class":423}," run",[363,2104,1787],{"class":423},[247,2106,2108],{"id":2107},"next","Next",[276,2110,2111,2120,2125],{},[279,2112,2113,2115,2116,2119],{},[230,2114,61],{"href":62}," — deeper dive on ",[236,2117,2118],{},"module.ts"," and Tailwind.",[279,2121,2122,2124],{},[230,2123,65],{"href":66}," — register vs launch, validator rules.",[279,2126,2127,2129],{},[230,2128,80],{"href":81}," — npm release.",[2131,2132,2133],"style",{},"html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":264,"searchDepth":377,"depth":377,"links":2135},[2136,2137,2139,2141,2143,2144,2145,2146,2147],{"id":249,"depth":377,"text":250},{"id":347,"depth":377,"text":2138},"2. Write src\u002Fmodule.ts",{"id":720,"depth":377,"text":2140},"3. Define runtime\u002Fapp.config.ts",{"id":1174,"depth":377,"text":2142},"4. Add runtime\u002Fplugin.ts",{"id":1366,"depth":377,"text":1367},{"id":1406,"depth":377,"text":1407},{"id":1800,"depth":377,"text":1801},{"id":1993,"depth":377,"text":1994},{"id":2107,"depth":377,"text":2108},"End-to-end guide to building an OWD app module, from scaffold to desktop integration.","md",null,{},{"icon":59},{"title":56,"description":2148},"cjNcRXd344SlEOBVnczWzp5s8_cxf-mCaJkmFzH5Qoo",[2156,2158],{"title":52,"path":53,"stem":54,"description":2157,"icon":23,"children":-1},"Recommended folder layout for an OWD app module (src, playground, dist).",{"title":61,"path":62,"stem":63,"description":2159,"icon":40,"children":-1},"module.ts, plugins, defineDesktopApp, configKey merge, and Tailwind registration.",1782171655060]