@omega.js/desktop 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (818) hide show
  1. package/LICENSE +98 -0
  2. package/README.md +166 -0
  3. package/bin/omega +2 -0
  4. package/bin/omega-desktop +2 -0
  5. package/bin/omg +2 -0
  6. package/dist/assets/css/core/_fontawesome.scss +146 -0
  7. package/dist/assets/css/core/_initialize.scss +38 -0
  8. package/dist/assets/css/omega-desktop.scss +39 -0
  9. package/dist/assets/css/shell/_index.scss +207 -0
  10. package/dist/assets/css/tokens/_index.scss +166 -0
  11. package/dist/assets/js/bootstrap.bundle.js +1 -0
  12. package/dist/assets/js/core/app-shell.js +136 -0
  13. package/dist/assets/themes/_template/README.md +115 -0
  14. package/dist/assets/themes/_template/_config.scss +60 -0
  15. package/dist/assets/themes/_template/_theme.js +14 -0
  16. package/dist/assets/themes/_template/_theme.scss +28 -0
  17. package/dist/assets/themes/_template/css/base/_root.scss +19 -0
  18. package/dist/assets/themes/_template/css/components/_components.scss +23 -0
  19. package/dist/assets/themes/base/README.md +5 -0
  20. package/dist/assets/themes/base/_components/data/org-chart/component.html +33 -0
  21. package/dist/assets/themes/base/_components/data/org-chart/component.json5 +33 -0
  22. package/dist/assets/themes/base/_components/data/org-chart/component.scss +183 -0
  23. package/dist/assets/themes/base/_components/heading/masthead/component.html +22 -0
  24. package/dist/assets/themes/base/_components/heading/masthead/component.json5 +30 -0
  25. package/dist/assets/themes/base/_components/heading/section-head/component.html +18 -0
  26. package/dist/assets/themes/base/_components/heading/section-head/component.json5 +27 -0
  27. package/dist/assets/themes/base/_components/pricing/features/component.html +29 -0
  28. package/dist/assets/themes/base/_components/pricing/features/component.json5 +30 -0
  29. package/dist/assets/themes/base/_hero/orbit/index.html +30 -0
  30. package/dist/assets/themes/base/_hero/orbit/script.js +33 -0
  31. package/dist/assets/themes/base/_hero/orbit/style.scss +133 -0
  32. package/dist/assets/themes/base/_includes/admin/sections/sidebar.html +3 -0
  33. package/dist/assets/themes/base/_includes/admin/sections/topbar.html +3 -0
  34. package/dist/assets/themes/base/_includes/backend/sections/sidebar.html +3 -0
  35. package/dist/assets/themes/base/_includes/backend/sections/topbar.html +3 -0
  36. package/dist/assets/themes/base/_includes/frontend/components/connection-card.html +49 -0
  37. package/dist/assets/themes/base/_includes/frontend/components/post-card.html +54 -0
  38. package/dist/assets/themes/base/_includes/frontend/sections/account-connections.html +42 -0
  39. package/dist/assets/themes/base/_includes/frontend/sections/account-section-header.html +11 -0
  40. package/dist/assets/themes/base/_includes/frontend/sections/footer.html +154 -0
  41. package/dist/assets/themes/base/_includes/frontend/sections/nav.html +276 -0
  42. package/dist/assets/themes/base/_includes/global/sections/account.html +72 -0
  43. package/dist/assets/themes/base/_includes/global/sections/app-sidebar.html +248 -0
  44. package/dist/assets/themes/base/_includes/global/sections/app-topbar.html +228 -0
  45. package/dist/assets/themes/base/_includes/global/sections/page-header.html +99 -0
  46. package/dist/assets/themes/base/_layouts/admin/core/minimal-viewport-locked.html +22 -0
  47. package/dist/assets/themes/base/_layouts/admin/core/minimal.html +23 -0
  48. package/dist/assets/themes/base/_layouts/backend/core/base.html +57 -0
  49. package/dist/assets/themes/base/_layouts/backend/core/minimal-viewport-locked.html +32 -0
  50. package/dist/assets/themes/base/_layouts/backend/core/minimal.html +32 -0
  51. package/dist/assets/themes/base/_layouts/backend/pages/dashboard/index.html +230 -0
  52. package/dist/assets/themes/base/_layouts/frontend/core/base.html +31 -0
  53. package/dist/assets/themes/base/_layouts/frontend/core/cover.html +40 -0
  54. package/dist/assets/themes/base/_layouts/frontend/core/minimal.html +47 -0
  55. package/dist/assets/themes/base/_layouts/frontend/pages/404.html +54 -0
  56. package/dist/assets/themes/base/_layouts/frontend/pages/about.html +144 -0
  57. package/dist/assets/themes/base/_layouts/frontend/pages/account/index.html +2104 -0
  58. package/dist/assets/themes/base/_layouts/frontend/pages/alternatives/alternative.html +319 -0
  59. package/dist/assets/themes/base/_layouts/frontend/pages/alternatives/index.html +186 -0
  60. package/dist/assets/themes/base/_layouts/frontend/pages/app.html +142 -0
  61. package/dist/assets/themes/base/_layouts/frontend/pages/auth/reset.html +53 -0
  62. package/dist/assets/themes/base/_layouts/frontend/pages/auth/signin.html +90 -0
  63. package/dist/assets/themes/base/_layouts/frontend/pages/auth/signup.html +141 -0
  64. package/dist/assets/themes/base/_layouts/frontend/pages/auth/token.html +44 -0
  65. package/dist/assets/themes/base/_layouts/frontend/pages/blog/categories/category.html +88 -0
  66. package/dist/assets/themes/base/_layouts/frontend/pages/blog/categories/index.html +88 -0
  67. package/dist/assets/themes/base/_layouts/frontend/pages/blog/index.html +255 -0
  68. package/dist/assets/themes/base/_layouts/frontend/pages/blog/post.html +261 -0
  69. package/dist/assets/themes/base/_layouts/frontend/pages/blog/tags/index.html +84 -0
  70. package/dist/assets/themes/base/_layouts/frontend/pages/blog/tags/tag.html +88 -0
  71. package/dist/assets/themes/base/_layouts/frontend/pages/collection/category.html +72 -0
  72. package/dist/assets/themes/base/_layouts/frontend/pages/collection/document.html +54 -0
  73. package/dist/assets/themes/base/_layouts/frontend/pages/collection/index.html +84 -0
  74. package/dist/assets/themes/base/_layouts/frontend/pages/connections/callback.html +55 -0
  75. package/dist/assets/themes/base/_layouts/frontend/pages/contact.html +214 -0
  76. package/dist/assets/themes/base/_layouts/frontend/pages/download.html +793 -0
  77. package/dist/assets/themes/base/_layouts/frontend/pages/extension/index.html +253 -0
  78. package/dist/assets/themes/base/_layouts/frontend/pages/extension/installed.html +198 -0
  79. package/dist/assets/themes/base/_layouts/frontend/pages/feedback.html +171 -0
  80. package/dist/assets/themes/base/_layouts/frontend/pages/index.html +66 -0
  81. package/dist/assets/themes/base/_layouts/frontend/pages/legal/document.html +78 -0
  82. package/dist/assets/themes/base/_layouts/frontend/pages/payment/checkout.html +459 -0
  83. package/dist/assets/themes/base/_layouts/frontend/pages/payment/confirmation.html +131 -0
  84. package/dist/assets/themes/base/_layouts/frontend/pages/portal/email-preferences.html +104 -0
  85. package/dist/assets/themes/base/_layouts/frontend/pages/pricing.html +596 -0
  86. package/dist/assets/themes/base/_layouts/frontend/pages/status.html +361 -0
  87. package/dist/assets/themes/base/_layouts/frontend/pages/team/index.html +210 -0
  88. package/dist/assets/themes/base/_layouts/frontend/pages/team/member.html +125 -0
  89. package/dist/assets/themes/base/_layouts/frontend/pages/updates/index.html +119 -0
  90. package/dist/assets/themes/base/_layouts/frontend/pages/updates/update.html +118 -0
  91. package/dist/assets/themes/base/_sections/about/hero/section.html +68 -0
  92. package/dist/assets/themes/base/_sections/about/hero/section.json5 +58 -0
  93. package/dist/assets/themes/base/_sections/about/letter/section.html +60 -0
  94. package/dist/assets/themes/base/_sections/about/letter/section.json5 +56 -0
  95. package/dist/assets/themes/base/_sections/about/photo-band/section.html +24 -0
  96. package/dist/assets/themes/base/_sections/about/photo-band/section.json5 +23 -0
  97. package/dist/assets/themes/base/_sections/about/principles/section.html +17 -0
  98. package/dist/assets/themes/base/_sections/about/principles/section.json5 +34 -0
  99. package/dist/assets/themes/base/_sections/about/timeline/section.html +20 -0
  100. package/dist/assets/themes/base/_sections/about/timeline/section.json5 +34 -0
  101. package/dist/assets/themes/base/_sections/marketing/bento/section.html +91 -0
  102. package/dist/assets/themes/base/_sections/marketing/bento/section.json5 +152 -0
  103. package/dist/assets/themes/base/_sections/marketing/cta/section.html +44 -0
  104. package/dist/assets/themes/base/_sections/marketing/cta/section.json5 +47 -0
  105. package/dist/assets/themes/base/_sections/marketing/faq/section.html +52 -0
  106. package/dist/assets/themes/base/_sections/marketing/faq/section.json5 +68 -0
  107. package/dist/assets/themes/base/_sections/marketing/hero/section.html +349 -0
  108. package/dist/assets/themes/base/_sections/marketing/hero/section.json5 +335 -0
  109. package/dist/assets/themes/base/_sections/marketing/newsletter-cta/section.html +38 -0
  110. package/dist/assets/themes/base/_sections/marketing/newsletter-cta/section.js +86 -0
  111. package/dist/assets/themes/base/_sections/marketing/newsletter-cta/section.json5 +29 -0
  112. package/dist/assets/themes/base/_sections/marketing/pricing-cards/section.html +115 -0
  113. package/dist/assets/themes/base/_sections/marketing/pricing-cards/section.json5 +72 -0
  114. package/dist/assets/themes/base/_sections/marketing/product-demo/section.html +62 -0
  115. package/dist/assets/themes/base/_sections/marketing/product-demo/section.js +44 -0
  116. package/dist/assets/themes/base/_sections/marketing/product-demo/section.json5 +52 -0
  117. package/dist/assets/themes/base/_sections/marketing/prose/section.html +22 -0
  118. package/dist/assets/themes/base/_sections/marketing/prose/section.json5 +41 -0
  119. package/dist/assets/themes/base/_sections/marketing/showcase/section.html +35 -0
  120. package/dist/assets/themes/base/_sections/marketing/showcase/section.json5 +52 -0
  121. package/dist/assets/themes/base/_sections/marketing/stats/section.html +32 -0
  122. package/dist/assets/themes/base/_sections/marketing/stats/section.json5 +44 -0
  123. package/dist/assets/themes/base/_sections/marketing/testimonials/section.html +54 -0
  124. package/dist/assets/themes/base/_sections/marketing/testimonials/section.json5 +70 -0
  125. package/dist/assets/themes/base/_sections/marketing/trusted-by/section.html +30 -0
  126. package/dist/assets/themes/base/_sections/marketing/trusted-by/section.json5 +38 -0
  127. package/dist/assets/themes/base/_sections/verts/unit/section.html +7 -0
  128. package/dist/assets/themes/base/_sections/verts/unit/section.js +22 -0
  129. package/dist/assets/themes/base/_sections/verts/unit/section.json5 +24 -0
  130. package/dist/assets/themes/base/_sections/verts/unit/section.scss +24 -0
  131. package/dist/assets/themes/base/_theme.js +13 -0
  132. package/dist/assets/themes/base/_theme.scss +4 -0
  133. package/dist/assets/themes/bootstrap/_theme.js +16 -0
  134. package/dist/assets/themes/bootstrap/_theme.scss +11 -0
  135. package/dist/assets/themes/bootstrap/js/index.esm.js +19 -0
  136. package/dist/assets/themes/bootstrap/js/index.umd.js +34 -0
  137. package/dist/assets/themes/bootstrap/js/src/alert.js +87 -0
  138. package/dist/assets/themes/bootstrap/js/src/base-component.js +86 -0
  139. package/dist/assets/themes/bootstrap/js/src/button.js +72 -0
  140. package/dist/assets/themes/bootstrap/js/src/carousel.js +474 -0
  141. package/dist/assets/themes/bootstrap/js/src/collapse.js +297 -0
  142. package/dist/assets/themes/bootstrap/js/src/dom/data.js +55 -0
  143. package/dist/assets/themes/bootstrap/js/src/dom/event-handler.js +317 -0
  144. package/dist/assets/themes/bootstrap/js/src/dom/manipulator.js +71 -0
  145. package/dist/assets/themes/bootstrap/js/src/dom/selector-engine.js +126 -0
  146. package/dist/assets/themes/bootstrap/js/src/dropdown.js +458 -0
  147. package/dist/assets/themes/bootstrap/js/src/modal.js +378 -0
  148. package/dist/assets/themes/bootstrap/js/src/offcanvas.js +282 -0
  149. package/dist/assets/themes/bootstrap/js/src/popover.js +97 -0
  150. package/dist/assets/themes/bootstrap/js/src/scrollspy.js +296 -0
  151. package/dist/assets/themes/bootstrap/js/src/tab.js +315 -0
  152. package/dist/assets/themes/bootstrap/js/src/toast.js +224 -0
  153. package/dist/assets/themes/bootstrap/js/src/tooltip.js +632 -0
  154. package/dist/assets/themes/bootstrap/js/src/util/backdrop.js +151 -0
  155. package/dist/assets/themes/bootstrap/js/src/util/component-functions.js +35 -0
  156. package/dist/assets/themes/bootstrap/js/src/util/config.js +65 -0
  157. package/dist/assets/themes/bootstrap/js/src/util/focustrap.js +115 -0
  158. package/dist/assets/themes/bootstrap/js/src/util/index.js +306 -0
  159. package/dist/assets/themes/bootstrap/js/src/util/sanitizer.js +117 -0
  160. package/dist/assets/themes/bootstrap/js/src/util/scrollbar.js +114 -0
  161. package/dist/assets/themes/bootstrap/js/src/util/swipe.js +146 -0
  162. package/dist/assets/themes/bootstrap/js/src/util/template-factory.js +160 -0
  163. package/dist/assets/themes/bootstrap/overrides/_accordion.scss +21 -0
  164. package/dist/assets/themes/bootstrap/overrides/_avatars.scss +51 -0
  165. package/dist/assets/themes/bootstrap/overrides/_blog-images.scss +45 -0
  166. package/dist/assets/themes/bootstrap/overrides/_buttons-adaptive.scss +141 -0
  167. package/dist/assets/themes/bootstrap/overrides/_color-shades.scss +25 -0
  168. package/dist/assets/themes/bootstrap/overrides/_cursor-utilities.scss +13 -0
  169. package/dist/assets/themes/bootstrap/overrides/_index.scss +30 -0
  170. package/dist/assets/themes/bootstrap/overrides/_links.scss +26 -0
  171. package/dist/assets/themes/bootstrap/overrides/_soft-colors.scss +99 -0
  172. package/dist/assets/themes/bootstrap/overrides/_spacing-extended.scss +74 -0
  173. package/dist/assets/themes/bootstrap/overrides/_spinners.scss +22 -0
  174. package/dist/assets/themes/bootstrap/overrides/_typography-utilities.scss +40 -0
  175. package/dist/assets/themes/bootstrap/scss/_accordion.scss +153 -0
  176. package/dist/assets/themes/bootstrap/scss/_alert.scss +68 -0
  177. package/dist/assets/themes/bootstrap/scss/_badge.scss +38 -0
  178. package/dist/assets/themes/bootstrap/scss/_breadcrumb.scss +40 -0
  179. package/dist/assets/themes/bootstrap/scss/_button-group.scss +147 -0
  180. package/dist/assets/themes/bootstrap/scss/_buttons.scss +216 -0
  181. package/dist/assets/themes/bootstrap/scss/_card.scss +238 -0
  182. package/dist/assets/themes/bootstrap/scss/_carousel.scss +226 -0
  183. package/dist/assets/themes/bootstrap/scss/_close.scss +66 -0
  184. package/dist/assets/themes/bootstrap/scss/_containers.scss +41 -0
  185. package/dist/assets/themes/bootstrap/scss/_dropdown.scss +250 -0
  186. package/dist/assets/themes/bootstrap/scss/_forms.scss +9 -0
  187. package/dist/assets/themes/bootstrap/scss/_functions.scss +302 -0
  188. package/dist/assets/themes/bootstrap/scss/_grid.scss +39 -0
  189. package/dist/assets/themes/bootstrap/scss/_helpers.scss +12 -0
  190. package/dist/assets/themes/bootstrap/scss/_images.scss +42 -0
  191. package/dist/assets/themes/bootstrap/scss/_list-group.scss +199 -0
  192. package/dist/assets/themes/bootstrap/scss/_maps.scss +174 -0
  193. package/dist/assets/themes/bootstrap/scss/_mixins.scss +42 -0
  194. package/dist/assets/themes/bootstrap/scss/_modal.scss +240 -0
  195. package/dist/assets/themes/bootstrap/scss/_nav.scss +197 -0
  196. package/dist/assets/themes/bootstrap/scss/_navbar.scss +289 -0
  197. package/dist/assets/themes/bootstrap/scss/_offcanvas.scss +147 -0
  198. package/dist/assets/themes/bootstrap/scss/_pagination.scss +109 -0
  199. package/dist/assets/themes/bootstrap/scss/_placeholders.scss +51 -0
  200. package/dist/assets/themes/bootstrap/scss/_popover.scss +196 -0
  201. package/dist/assets/themes/bootstrap/scss/_progress.scss +68 -0
  202. package/dist/assets/themes/bootstrap/scss/_reboot.scss +611 -0
  203. package/dist/assets/themes/bootstrap/scss/_root.scss +187 -0
  204. package/dist/assets/themes/bootstrap/scss/_spinners.scss +85 -0
  205. package/dist/assets/themes/bootstrap/scss/_tables.scss +171 -0
  206. package/dist/assets/themes/bootstrap/scss/_toasts.scss +73 -0
  207. package/dist/assets/themes/bootstrap/scss/_tooltip.scss +119 -0
  208. package/dist/assets/themes/bootstrap/scss/_transitions.scss +27 -0
  209. package/dist/assets/themes/bootstrap/scss/_type.scss +106 -0
  210. package/dist/assets/themes/bootstrap/scss/_utilities.scss +806 -0
  211. package/dist/assets/themes/bootstrap/scss/_variables-dark.scss +102 -0
  212. package/dist/assets/themes/bootstrap/scss/_variables.scss +1753 -0
  213. package/dist/assets/themes/bootstrap/scss/bootstrap-grid.scss +62 -0
  214. package/dist/assets/themes/bootstrap/scss/bootstrap-reboot.scss +10 -0
  215. package/dist/assets/themes/bootstrap/scss/bootstrap-utilities.scss +19 -0
  216. package/dist/assets/themes/bootstrap/scss/bootstrap.scss +52 -0
  217. package/dist/assets/themes/bootstrap/scss/forms/_floating-labels.scss +97 -0
  218. package/dist/assets/themes/bootstrap/scss/forms/_form-check.scss +189 -0
  219. package/dist/assets/themes/bootstrap/scss/forms/_form-control.scss +214 -0
  220. package/dist/assets/themes/bootstrap/scss/forms/_form-range.scss +91 -0
  221. package/dist/assets/themes/bootstrap/scss/forms/_form-select.scss +80 -0
  222. package/dist/assets/themes/bootstrap/scss/forms/_form-text.scss +11 -0
  223. package/dist/assets/themes/bootstrap/scss/forms/_input-group.scss +132 -0
  224. package/dist/assets/themes/bootstrap/scss/forms/_labels.scss +36 -0
  225. package/dist/assets/themes/bootstrap/scss/forms/_validation.scss +12 -0
  226. package/dist/assets/themes/bootstrap/scss/helpers/_clearfix.scss +3 -0
  227. package/dist/assets/themes/bootstrap/scss/helpers/_color-bg.scss +7 -0
  228. package/dist/assets/themes/bootstrap/scss/helpers/_colored-links.scss +30 -0
  229. package/dist/assets/themes/bootstrap/scss/helpers/_focus-ring.scss +5 -0
  230. package/dist/assets/themes/bootstrap/scss/helpers/_icon-link.scss +25 -0
  231. package/dist/assets/themes/bootstrap/scss/helpers/_position.scss +36 -0
  232. package/dist/assets/themes/bootstrap/scss/helpers/_ratio.scss +26 -0
  233. package/dist/assets/themes/bootstrap/scss/helpers/_stacks.scss +15 -0
  234. package/dist/assets/themes/bootstrap/scss/helpers/_stretched-link.scss +15 -0
  235. package/dist/assets/themes/bootstrap/scss/helpers/_text-truncation.scss +7 -0
  236. package/dist/assets/themes/bootstrap/scss/helpers/_visually-hidden.scss +8 -0
  237. package/dist/assets/themes/bootstrap/scss/helpers/_vr.scss +8 -0
  238. package/dist/assets/themes/bootstrap/scss/mixins/_alert.scss +18 -0
  239. package/dist/assets/themes/bootstrap/scss/mixins/_backdrop.scss +14 -0
  240. package/dist/assets/themes/bootstrap/scss/mixins/_banner.scss +7 -0
  241. package/dist/assets/themes/bootstrap/scss/mixins/_border-radius.scss +78 -0
  242. package/dist/assets/themes/bootstrap/scss/mixins/_box-shadow.scss +18 -0
  243. package/dist/assets/themes/bootstrap/scss/mixins/_breakpoints.scss +127 -0
  244. package/dist/assets/themes/bootstrap/scss/mixins/_buttons.scss +70 -0
  245. package/dist/assets/themes/bootstrap/scss/mixins/_caret.scss +69 -0
  246. package/dist/assets/themes/bootstrap/scss/mixins/_clearfix.scss +9 -0
  247. package/dist/assets/themes/bootstrap/scss/mixins/_color-mode.scss +21 -0
  248. package/dist/assets/themes/bootstrap/scss/mixins/_color-scheme.scss +7 -0
  249. package/dist/assets/themes/bootstrap/scss/mixins/_container.scss +11 -0
  250. package/dist/assets/themes/bootstrap/scss/mixins/_deprecate.scss +10 -0
  251. package/dist/assets/themes/bootstrap/scss/mixins/_forms.scss +163 -0
  252. package/dist/assets/themes/bootstrap/scss/mixins/_gradients.scss +47 -0
  253. package/dist/assets/themes/bootstrap/scss/mixins/_grid.scss +151 -0
  254. package/dist/assets/themes/bootstrap/scss/mixins/_image.scss +16 -0
  255. package/dist/assets/themes/bootstrap/scss/mixins/_list-group.scss +26 -0
  256. package/dist/assets/themes/bootstrap/scss/mixins/_lists.scss +7 -0
  257. package/dist/assets/themes/bootstrap/scss/mixins/_pagination.scss +10 -0
  258. package/dist/assets/themes/bootstrap/scss/mixins/_reset-text.scss +17 -0
  259. package/dist/assets/themes/bootstrap/scss/mixins/_resize.scss +6 -0
  260. package/dist/assets/themes/bootstrap/scss/mixins/_table-variants.scss +24 -0
  261. package/dist/assets/themes/bootstrap/scss/mixins/_text-truncate.scss +8 -0
  262. package/dist/assets/themes/bootstrap/scss/mixins/_transition.scss +26 -0
  263. package/dist/assets/themes/bootstrap/scss/mixins/_utilities.scss +97 -0
  264. package/dist/assets/themes/bootstrap/scss/mixins/_visually-hidden.scss +38 -0
  265. package/dist/assets/themes/bootstrap/scss/tests/jasmine.js +16 -0
  266. package/dist/assets/themes/bootstrap/scss/tests/mixins/_auto-import-of-variables-dark.test.scss +7 -0
  267. package/dist/assets/themes/bootstrap/scss/tests/mixins/_color-modes.test.scss +69 -0
  268. package/dist/assets/themes/bootstrap/scss/tests/mixins/_media-query-color-mode-full.test.scss +8 -0
  269. package/dist/assets/themes/bootstrap/scss/tests/mixins/_utilities.test.scss +393 -0
  270. package/dist/assets/themes/bootstrap/scss/tests/sass-true/register.js +14 -0
  271. package/dist/assets/themes/bootstrap/scss/tests/sass-true/runner.js +17 -0
  272. package/dist/assets/themes/bootstrap/scss/tests/utilities/_api.test.scss +75 -0
  273. package/dist/assets/themes/bootstrap/scss/utilities/_api.scss +47 -0
  274. package/dist/assets/themes/bootstrap/scss/vendor/_rfs.scss +348 -0
  275. package/dist/assets/themes/classy/README.md +89 -0
  276. package/dist/assets/themes/classy/_config.scss +245 -0
  277. package/dist/assets/themes/classy/_theme.js +31 -0
  278. package/dist/assets/themes/classy/_theme.scss +57 -0
  279. package/dist/assets/themes/classy/css/app/_panels.scss +183 -0
  280. package/dist/assets/themes/classy/css/base/_fonts.scss +79 -0
  281. package/dist/assets/themes/classy/css/base/_no-raise.scss +49 -0
  282. package/dist/assets/themes/classy/css/base/_root.scss +113 -0
  283. package/dist/assets/themes/classy/css/base/_typography.scss +154 -0
  284. package/dist/assets/themes/classy/css/base/_utilities.scss +284 -0
  285. package/dist/assets/themes/classy/css/components/_alerts.scss +51 -0
  286. package/dist/assets/themes/classy/css/components/_badges.scss +46 -0
  287. package/dist/assets/themes/classy/css/components/_buttons.scss +175 -0
  288. package/dist/assets/themes/classy/css/components/_cards.scss +41 -0
  289. package/dist/assets/themes/classy/css/components/_dropdowns.scss +48 -0
  290. package/dist/assets/themes/classy/css/components/_forms.scss +171 -0
  291. package/dist/assets/themes/classy/css/components/_receipt.scss +45 -0
  292. package/dist/assets/themes/classy/css/layout/_footer.scss +298 -0
  293. package/dist/assets/themes/classy/css/layout/_general.scss +209 -0
  294. package/dist/assets/themes/classy/css/layout/_nav.scss +154 -0
  295. package/dist/assets/themes/classy/css/layout/_shell.scss +458 -0
  296. package/dist/assets/themes/classy/css/marketing/_bento.scss +238 -0
  297. package/dist/assets/themes/classy/css/marketing/_content.scss +1328 -0
  298. package/dist/assets/themes/classy/css/marketing/_downloads.scss +246 -0
  299. package/dist/assets/themes/classy/css/marketing/_hero.scss +311 -0
  300. package/dist/assets/themes/classy/css/marketing/_sections.scss +649 -0
  301. package/dist/assets/themes/classy/css/pages/404/index.scss +67 -0
  302. package/dist/assets/themes/classy/css/pages/_auth.scss +235 -0
  303. package/dist/assets/themes/classy/css/pages/admin/firebase/index.scss +22 -0
  304. package/dist/assets/themes/classy/css/pages/blog/[slug].scss +56 -0
  305. package/dist/assets/themes/classy/css/pages/cookies.scss +2 -0
  306. package/dist/assets/themes/classy/css/pages/dashboard/account/index.scss +31 -0
  307. package/dist/assets/themes/classy/css/pages/feedback/index.scss +39 -0
  308. package/dist/assets/themes/classy/css/pages/legal/_document.scss +192 -0
  309. package/dist/assets/themes/classy/css/pages/payment/checkout/index.scss +585 -0
  310. package/dist/assets/themes/classy/css/pages/payment/confirmation/index.scss +9 -0
  311. package/dist/assets/themes/classy/css/pages/privacy.scss +2 -0
  312. package/dist/assets/themes/classy/css/pages/status/index.scss +164 -0
  313. package/dist/assets/themes/classy/css/pages/terms.scss +2 -0
  314. package/dist/assets/themes/classy/css/pages/updates/index.scss +128 -0
  315. package/dist/assets/themes/classy/fonts/inter-italic-latin-ext.woff2 +0 -0
  316. package/dist/assets/themes/classy/fonts/inter-italic-latin.woff2 +0 -0
  317. package/dist/assets/themes/classy/fonts/inter-normal-latin-ext.woff2 +0 -0
  318. package/dist/assets/themes/classy/fonts/inter-normal-latin.woff2 +0 -0
  319. package/dist/assets/themes/classy/fonts/newsreader-italic-latin-ext.woff2 +0 -0
  320. package/dist/assets/themes/classy/fonts/newsreader-italic-latin.woff2 +0 -0
  321. package/dist/assets/themes/classy/fonts/newsreader-normal-latin-ext.woff2 +0 -0
  322. package/dist/assets/themes/classy/fonts/newsreader-normal-latin.woff2 +0 -0
  323. package/dist/assets/themes/classy/js/hero-demo-form.js +56 -0
  324. package/dist/assets/themes/neobrutalism/README.md +118 -0
  325. package/dist/assets/themes/neobrutalism/_config.scss +139 -0
  326. package/dist/assets/themes/neobrutalism/_layouts/frontend/core/base.html +30 -0
  327. package/dist/assets/themes/neobrutalism/_layouts/frontend/pages/index.html +275 -0
  328. package/dist/assets/themes/neobrutalism/_theme.js +24 -0
  329. package/dist/assets/themes/neobrutalism/_theme.scss +61 -0
  330. package/dist/assets/themes/neobrutalism/css/base/_mixins.scss +46 -0
  331. package/dist/assets/themes/neobrutalism/css/base/_root.scss +169 -0
  332. package/dist/assets/themes/neobrutalism/css/base/_typography.scss +61 -0
  333. package/dist/assets/themes/neobrutalism/css/base/_utilities.scss +89 -0
  334. package/dist/assets/themes/neobrutalism/css/components/_billing-toggle.scss +74 -0
  335. package/dist/assets/themes/neobrutalism/css/components/_buttons.scss +148 -0
  336. package/dist/assets/themes/neobrutalism/css/components/_cards.scss +47 -0
  337. package/dist/assets/themes/neobrutalism/css/components/_forms.scss +88 -0
  338. package/dist/assets/themes/neobrutalism/css/components/_marketing.scss +244 -0
  339. package/dist/assets/themes/neobrutalism/css/layout/_general.scss +213 -0
  340. package/dist/assets/themes/neobrutalism/css/layout/_navigation.scss +171 -0
  341. package/dist/assets/themes/neobrutalism/css/pages/index.scss +203 -0
  342. package/dist/assets/themes/neobrutalism/css/pages/pricing/index.scss +58 -0
  343. package/dist/assets/themes/neobrutalism/css/pages/test/libraries/layers/index.scss +7 -0
  344. package/dist/assets/themes/neobrutalism/js/pages/test/libraries/layers/index.js +9 -0
  345. package/dist/assets/themes/newsflash/README.md +117 -0
  346. package/dist/assets/themes/newsflash/_components/heading/lede/component.html +14 -0
  347. package/dist/assets/themes/newsflash/_components/heading/lede/component.json5 +23 -0
  348. package/dist/assets/themes/newsflash/_components/heading/rule-head/component.html +17 -0
  349. package/dist/assets/themes/newsflash/_components/heading/rule-head/component.json5 +23 -0
  350. package/dist/assets/themes/newsflash/_components/news/byline/component.html +12 -0
  351. package/dist/assets/themes/newsflash/_components/news/byline/component.json5 +18 -0
  352. package/dist/assets/themes/newsflash/_components/news/story-card/component.html +25 -0
  353. package/dist/assets/themes/newsflash/_components/news/story-card/component.json5 +21 -0
  354. package/dist/assets/themes/newsflash/_config.scss +147 -0
  355. package/dist/assets/themes/newsflash/_layouts/frontend/core/base.html +51 -0
  356. package/dist/assets/themes/newsflash/_layouts/frontend/pages/blog/index.html +299 -0
  357. package/dist/assets/themes/newsflash/_layouts/frontend/pages/blog/post.html +235 -0
  358. package/dist/assets/themes/newsflash/_layouts/frontend/pages/index.html +328 -0
  359. package/dist/assets/themes/newsflash/_sections/marketing/desks/section.html +39 -0
  360. package/dist/assets/themes/newsflash/_sections/marketing/desks/section.json5 +49 -0
  361. package/dist/assets/themes/newsflash/_sections/marketing/newsletter-cta/section.html +103 -0
  362. package/dist/assets/themes/newsflash/_sections/marketing/newsletter-cta/section.json5 +50 -0
  363. package/dist/assets/themes/newsflash/_sections/marketing/rundown/section.html +28 -0
  364. package/dist/assets/themes/newsflash/_sections/marketing/rundown/section.json5 +40 -0
  365. package/dist/assets/themes/newsflash/_theme.js +24 -0
  366. package/dist/assets/themes/newsflash/_theme.scss +70 -0
  367. package/dist/assets/themes/newsflash/css/base/_fonts.scss +80 -0
  368. package/dist/assets/themes/newsflash/css/base/_mixins.scss +51 -0
  369. package/dist/assets/themes/newsflash/css/base/_root.scss +257 -0
  370. package/dist/assets/themes/newsflash/css/base/_typography.scss +49 -0
  371. package/dist/assets/themes/newsflash/css/base/_utilities.scss +122 -0
  372. package/dist/assets/themes/newsflash/css/components/_badges.scss +65 -0
  373. package/dist/assets/themes/newsflash/css/components/_billing-toggle.scss +61 -0
  374. package/dist/assets/themes/newsflash/css/components/_buttons.scss +139 -0
  375. package/dist/assets/themes/newsflash/css/components/_cards.scss +47 -0
  376. package/dist/assets/themes/newsflash/css/components/_editorial.scss +173 -0
  377. package/dist/assets/themes/newsflash/css/components/_forms.scss +75 -0
  378. package/dist/assets/themes/newsflash/css/components/_infinite-scroll.scss +102 -0
  379. package/dist/assets/themes/newsflash/css/components/_panels.scss +156 -0
  380. package/dist/assets/themes/newsflash/css/components/_ticker.scss +67 -0
  381. package/dist/assets/themes/newsflash/css/layout/_general.scss +330 -0
  382. package/dist/assets/themes/newsflash/css/layout/_navigation.scss +168 -0
  383. package/dist/assets/themes/newsflash/css/pages/404/index.scss +79 -0
  384. package/dist/assets/themes/newsflash/css/pages/blog/[slug].scss +186 -0
  385. package/dist/assets/themes/newsflash/css/pages/blog/index.scss +17 -0
  386. package/dist/assets/themes/newsflash/css/pages/index.scss +157 -0
  387. package/dist/assets/themes/newsflash/css/pages/pricing/index.scss +55 -0
  388. package/dist/assets/themes/newsflash/css/pages/test/libraries/layers/index.scss +7 -0
  389. package/dist/assets/themes/newsflash/fonts/fraunces-italic-latin-ext.woff2 +0 -0
  390. package/dist/assets/themes/newsflash/fonts/fraunces-italic-latin.woff2 +0 -0
  391. package/dist/assets/themes/newsflash/fonts/fraunces-normal-latin-ext.woff2 +0 -0
  392. package/dist/assets/themes/newsflash/fonts/fraunces-normal-latin.woff2 +0 -0
  393. package/dist/assets/themes/newsflash/fonts/schibsted-grotesk-italic-latin-ext.woff2 +0 -0
  394. package/dist/assets/themes/newsflash/fonts/schibsted-grotesk-italic-latin.woff2 +0 -0
  395. package/dist/assets/themes/newsflash/fonts/schibsted-grotesk-normal-latin-ext.woff2 +0 -0
  396. package/dist/assets/themes/newsflash/fonts/schibsted-grotesk-normal-latin.woff2 +0 -0
  397. package/dist/assets/themes/newsflash/js/pages/blog/[slug].js +29 -0
  398. package/dist/assets/themes/newsflash/js/pages/test/libraries/layers/index.js +9 -0
  399. package/dist/build.js +249 -0
  400. package/dist/cli-run.js +34 -0
  401. package/dist/cli.js +49 -0
  402. package/dist/commands/build.js +32 -0
  403. package/dist/commands/cdp/capture.js +91 -0
  404. package/dist/commands/cdp/client.js +140 -0
  405. package/dist/commands/cdp/eval.js +20 -0
  406. package/dist/commands/cdp/quit.js +84 -0
  407. package/dist/commands/cdp/relaunch.js +62 -0
  408. package/dist/commands/cdp/shot.js +20 -0
  409. package/dist/commands/cdp/status.js +38 -0
  410. package/dist/commands/cdp/theme.js +21 -0
  411. package/dist/commands/cdp.js +53 -0
  412. package/dist/commands/clean.js +34 -0
  413. package/dist/commands/deploy.js +75 -0
  414. package/dist/commands/finalize-release.js +238 -0
  415. package/dist/commands/install.js +37 -0
  416. package/dist/commands/launch.js +150 -0
  417. package/dist/commands/lib/dependencies.js +35 -0
  418. package/dist/commands/lib/deploy-precheck.js +117 -0
  419. package/dist/commands/lib/ensure-target.js +300 -0
  420. package/dist/commands/logs.js +185 -0
  421. package/dist/commands/package.js +31 -0
  422. package/dist/commands/publish.js +34 -0
  423. package/dist/commands/push-secrets.js +141 -0
  424. package/dist/commands/release.js +286 -0
  425. package/dist/commands/runner.js +1874 -0
  426. package/dist/commands/sign-windows.js +563 -0
  427. package/dist/commands/test.js +121 -0
  428. package/dist/commands/update.js +21 -0
  429. package/dist/commands/validate-certs.js +238 -0
  430. package/dist/commands/version.js +9 -0
  431. package/dist/config/page-template.html +35 -0
  432. package/dist/defaults/.github/workflows/build.yml +276 -0
  433. package/dist/defaults/AGENTS.md +109 -0
  434. package/dist/defaults/CHANGELOG.md +15 -0
  435. package/dist/defaults/CLAUDE.md +1 -0
  436. package/dist/defaults/_.gitignore +24 -0
  437. package/dist/defaults/_mas/README.md +49 -0
  438. package/dist/defaults/_mas/entitlements.mas.inherit.plist +12 -0
  439. package/dist/defaults/_mas/entitlements.mas.loginhelper.plist +8 -0
  440. package/dist/defaults/_mas/entitlements.mas.plist +33 -0
  441. package/dist/defaults/config/certs/.gitkeep +0 -0
  442. package/dist/defaults/config/certs/README.md +60 -0
  443. package/dist/defaults/config/icons/macos/dmg.png +0 -0
  444. package/dist/defaults/config/icons/macos/icon.png +0 -0
  445. package/dist/defaults/config/icons/macos/tray.png +0 -0
  446. package/dist/defaults/config/icons/windows/icon.png +0 -0
  447. package/dist/defaults/config/omega.json5 +279 -0
  448. package/dist/defaults/docs/README.md +17 -0
  449. package/dist/defaults/gulpfile.js +6 -0
  450. package/dist/defaults/hooks/build/post.js +9 -0
  451. package/dist/defaults/hooks/build/pre.js +9 -0
  452. package/dist/defaults/hooks/notarize/post.js +16 -0
  453. package/dist/defaults/hooks/release/post.js +9 -0
  454. package/dist/defaults/hooks/release/pre.js +9 -0
  455. package/dist/defaults/src/assets/js/components/about/index.js +10 -0
  456. package/dist/defaults/src/assets/js/components/main/index.js +14 -0
  457. package/dist/defaults/src/assets/js/components/settings/index.js +10 -0
  458. package/dist/defaults/src/assets/scss/main.scss +34 -0
  459. package/dist/defaults/src/assets/scss/pages/about.scss +3 -0
  460. package/dist/defaults/src/assets/scss/pages/main.scss +4 -0
  461. package/dist/defaults/src/assets/scss/pages/settings.scss +3 -0
  462. package/dist/defaults/src/integrations/context-menu/index.js +60 -0
  463. package/dist/defaults/src/integrations/menu/index.js +58 -0
  464. package/dist/defaults/src/integrations/tray/index.js +60 -0
  465. package/dist/defaults/src/main.js +78 -0
  466. package/dist/defaults/src/preload.js +15 -0
  467. package/dist/defaults/src/views/about/index.html +3 -0
  468. package/dist/defaults/src/views/main/index.html +8 -0
  469. package/dist/defaults/src/views/settings/index.html +3 -0
  470. package/dist/defaults/test/README.md +41 -0
  471. package/dist/defaults/test/_init.js +10 -0
  472. package/dist/gulp/main.js +144 -0
  473. package/dist/gulp/tasks/audit.js +82 -0
  474. package/dist/gulp/tasks/build-config.js +445 -0
  475. package/dist/gulp/tasks/bundle.js +451 -0
  476. package/dist/gulp/tasks/defaults.js +20 -0
  477. package/dist/gulp/tasks/distribute.js +8 -0
  478. package/dist/gulp/tasks/html.js +95 -0
  479. package/dist/gulp/tasks/package-quick.js +102 -0
  480. package/dist/gulp/tasks/package.js +53 -0
  481. package/dist/gulp/tasks/release.js +57 -0
  482. package/dist/gulp/tasks/sass.js +82 -0
  483. package/dist/gulp/tasks/serve.js +191 -0
  484. package/dist/hooks/notarize.js +70 -0
  485. package/dist/index.js +14 -0
  486. package/dist/lib/_menu-mixin.js +199 -0
  487. package/dist/lib/analytics.js +360 -0
  488. package/dist/lib/app-state.js +220 -0
  489. package/dist/lib/auth-flow.js +160 -0
  490. package/dist/lib/auth-persistence.js +207 -0
  491. package/dist/lib/auto-updater.js +752 -0
  492. package/dist/lib/client-bridge.js +371 -0
  493. package/dist/lib/context-menu.js +302 -0
  494. package/dist/lib/context.js +162 -0
  495. package/dist/lib/deep-link.js +370 -0
  496. package/dist/lib/fontawesome.js +203 -0
  497. package/dist/lib/ipc.js +169 -0
  498. package/dist/lib/logger-lite.js +259 -0
  499. package/dist/lib/logger.js +4 -0
  500. package/dist/lib/menu.js +521 -0
  501. package/dist/lib/protocol.js +85 -0
  502. package/dist/lib/remote-config.js +224 -0
  503. package/dist/lib/remote-scripts.js +158 -0
  504. package/dist/lib/restart-manager/index.js +550 -0
  505. package/dist/lib/restart-manager/install.js +353 -0
  506. package/dist/lib/restart-manager/protocol.js +274 -0
  507. package/dist/lib/sign-helpers/auto-unlock.js +95 -0
  508. package/dist/lib/sign-helpers/entitlements.js +98 -0
  509. package/dist/lib/sign-helpers/resolve-icons.js +171 -0
  510. package/dist/lib/sign-helpers/sign-events.js +75 -0
  511. package/dist/lib/sign-helpers/update-info.js +186 -0
  512. package/dist/lib/startup.js +214 -0
  513. package/dist/lib/storage.js +193 -0
  514. package/dist/lib/templating.js +85 -0
  515. package/dist/lib/theme.js +173 -0
  516. package/dist/lib/tray.js +414 -0
  517. package/dist/lib/usage.js +141 -0
  518. package/dist/lib/window-manager.js +509 -0
  519. package/dist/main.js +542 -0
  520. package/dist/omega-bin.js +6 -0
  521. package/dist/preload.js +241 -0
  522. package/dist/renderer.js +456 -0
  523. package/dist/test/assert.js +4 -0
  524. package/dist/test/fixtures/consumer-app/config/omega.json5 +39 -0
  525. package/dist/test/fixtures/consumer-app/package.json +13 -0
  526. package/dist/test/fixtures/consumer-app/src/assets/js/components/main/index.js +11 -0
  527. package/dist/test/fixtures/consumer-app/src/assets/scss/main.scss +3 -0
  528. package/dist/test/fixtures/consumer-app/src/main.js +17 -0
  529. package/dist/test/fixtures/consumer-app/src/preload.js +4 -0
  530. package/dist/test/fixtures/consumer-app/src/views/main/index.html +4 -0
  531. package/dist/test/harness/boot-entry.js +237 -0
  532. package/dist/test/harness/main-entry.js +494 -0
  533. package/dist/test/harness/package.json +6 -0
  534. package/dist/test/harness/renderer-entry.js +173 -0
  535. package/dist/test/harness/renderer-preload.js +310 -0
  536. package/dist/test/harness/renderer.html +12 -0
  537. package/dist/test/index.js +65 -0
  538. package/dist/test/runner.js +99 -0
  539. package/dist/test/runners/boot.js +414 -0
  540. package/dist/test/runners/electron.js +92 -0
  541. package/dist/test/runners/render-event.js +46 -0
  542. package/dist/test/suites/boot/build-isolation.test.js +54 -0
  543. package/dist/test/suites/boot/consumer-app-boots.test.js +99 -0
  544. package/dist/test/suites/boot/restart-manager.test.js +38 -0
  545. package/dist/test/suites/boot/storage-bundled.test.js +59 -0
  546. package/dist/test/suites/boot/theme.test.js +68 -0
  547. package/dist/test/suites/boot/view-suite.test.js +47 -0
  548. package/dist/test/suites/build/attach-log-file.test.js +99 -0
  549. package/dist/test/suites/build/audit.test.js +271 -0
  550. package/dist/test/suites/build/boot-fixture.test.js +48 -0
  551. package/dist/test/suites/build/build-config.test.js +457 -0
  552. package/dist/test/suites/build/build-verbs.test.js +156 -0
  553. package/dist/test/suites/build/build-workflow-jobs.test.js +55 -0
  554. package/dist/test/suites/build/cdp.test.js +89 -0
  555. package/dist/test/suites/build/cli.test.js +135 -0
  556. package/dist/test/suites/build/config-schema.test.js +133 -0
  557. package/dist/test/suites/build/defaults-scaffold.test.js +192 -0
  558. package/dist/test/suites/build/deliver-certs.test.js +95 -0
  559. package/dist/test/suites/build/derive-signing-env.test.js +122 -0
  560. package/dist/test/suites/build/electron-node-version.test.js +49 -0
  561. package/dist/test/suites/build/electron-targets.test.js +92 -0
  562. package/dist/test/suites/build/ensure-target.test.js +131 -0
  563. package/dist/test/suites/build/entitlements.test.js +107 -0
  564. package/dist/test/suites/build/env-delivery.test.js +166 -0
  565. package/dist/test/suites/build/env-watch.test.js +86 -0
  566. package/dist/test/suites/build/exports.test.js +63 -0
  567. package/dist/test/suites/build/finalize-release.test.js +152 -0
  568. package/dist/test/suites/build/format-fetch-error.test.js +85 -0
  569. package/dist/test/suites/build/framework-deps.test.js +173 -0
  570. package/dist/test/suites/build/get-config.test.js +137 -0
  571. package/dist/test/suites/build/github-utils.test.js +54 -0
  572. package/dist/test/suites/build/icon-sheet.test.js +62 -0
  573. package/dist/test/suites/build/license-stamp.test.js +63 -0
  574. package/dist/test/suites/build/logger-lite.test.js +148 -0
  575. package/dist/test/suites/build/logs-command.test.js +226 -0
  576. package/dist/test/suites/build/manager.test.js +193 -0
  577. package/dist/test/suites/build/menu-mixin.test.js +130 -0
  578. package/dist/test/suites/build/merge-line-files.test.js +230 -0
  579. package/dist/test/suites/build/omega-shell.test.js +94 -0
  580. package/dist/test/suites/build/omega-tokens.test.js +64 -0
  581. package/dist/test/suites/build/project-scripts-deps.test.js +90 -0
  582. package/dist/test/suites/build/push-secrets.test.js +226 -0
  583. package/dist/test/suites/build/release-pipeline.test.js +365 -0
  584. package/dist/test/suites/build/renderer-auth-bridge.test.js +158 -0
  585. package/dist/test/suites/build/renderer-entry-key.test.js +37 -0
  586. package/dist/test/suites/build/renderer-node-shims.test.js +125 -0
  587. package/dist/test/suites/build/resolve-icons.test.js +296 -0
  588. package/dist/test/suites/build/resolve-signing-cert.test.js +342 -0
  589. package/dist/test/suites/build/restart-manager-install.test.js +178 -0
  590. package/dist/test/suites/build/restart-manager-protocol.test.js +158 -0
  591. package/dist/test/suites/build/run-consumer-hook.test.js +137 -0
  592. package/dist/test/suites/build/runner.test.js +2599 -0
  593. package/dist/test/suites/build/sanitize-signing-env.test.js +98 -0
  594. package/dist/test/suites/build/sanitize-url.test.js +78 -0
  595. package/dist/test/suites/build/secure-remote-url.test.js +42 -0
  596. package/dist/test/suites/build/sentry.test.js +89 -0
  597. package/dist/test/suites/build/serve-resolve-electron.test.js +58 -0
  598. package/dist/test/suites/build/setup-scripts.test.js +172 -0
  599. package/dist/test/suites/build/sign-events.test.js +90 -0
  600. package/dist/test/suites/build/sign-windows-e2e.test.js +302 -0
  601. package/dist/test/suites/build/sign-windows.test.js +313 -0
  602. package/dist/test/suites/build/strip-dev-blocks.test.js +116 -0
  603. package/dist/test/suites/build/templating.test.js +95 -0
  604. package/dist/test/suites/build/test-discovery.test.js +64 -0
  605. package/dist/test/suites/build/test-stealth.test.js +83 -0
  606. package/dist/test/suites/build/test-target-no-match.test.js +119 -0
  607. package/dist/test/suites/build/update-info.test.js +224 -0
  608. package/dist/test/suites/build/url-helpers.test.js +289 -0
  609. package/dist/test/suites/build/validate-certs.test.js +103 -0
  610. package/dist/test/suites/build/validate-config.test.js +90 -0
  611. package/dist/test/suites/build/verb-logs.test.js +43 -0
  612. package/dist/test/suites/build/wave5-pins.test.js +35 -0
  613. package/dist/test/suites/main/analytics.test.js +364 -0
  614. package/dist/test/suites/main/app-state.test.js +197 -0
  615. package/dist/test/suites/main/auth-flow.test.js +196 -0
  616. package/dist/test/suites/main/auth-persistence.test.js +167 -0
  617. package/dist/test/suites/main/auto-updater.test.js +1138 -0
  618. package/dist/test/suites/main/boot-sequence.test.js +77 -0
  619. package/dist/test/suites/main/client-bridge.integration.test.js +134 -0
  620. package/dist/test/suites/main/client-bridge.test.js +249 -0
  621. package/dist/test/suites/main/context-menu.test.js +365 -0
  622. package/dist/test/suites/main/context.test.js +155 -0
  623. package/dist/test/suites/main/deep-link.test.js +288 -0
  624. package/dist/test/suites/main/epipe-handler.test.js +40 -0
  625. package/dist/test/suites/main/fontawesome.test.js +147 -0
  626. package/dist/test/suites/main/harness-cdp.test.js +49 -0
  627. package/dist/test/suites/main/ipc.test.js +165 -0
  628. package/dist/test/suites/main/menu.test.js +419 -0
  629. package/dist/test/suites/main/protocol.test.js +77 -0
  630. package/dist/test/suites/main/remote-config.test.js +189 -0
  631. package/dist/test/suites/main/remote-scripts.test.js +276 -0
  632. package/dist/test/suites/main/restart-manager.test.js +328 -0
  633. package/dist/test/suites/main/startup-paths-and-ua.test.js +99 -0
  634. package/dist/test/suites/main/startup.test.js +129 -0
  635. package/dist/test/suites/main/stealth-window.test.js +74 -0
  636. package/dist/test/suites/main/storage.test.js +89 -0
  637. package/dist/test/suites/main/theme.test.js +137 -0
  638. package/dist/test/suites/main/tray.test.js +322 -0
  639. package/dist/test/suites/main/truncate-on-boot.test.js +22 -0
  640. package/dist/test/suites/main/url-helpers.test.js +429 -0
  641. package/dist/test/suites/main/usage.test.js +127 -0
  642. package/dist/test/suites/main/window-bounds.test.js +169 -0
  643. package/dist/test/suites/main/window-manager.test.js +233 -0
  644. package/dist/test/suites/renderer/analytics-bridge.test.js +128 -0
  645. package/dist/test/suites/renderer/cross-context-helpers.test.js +131 -0
  646. package/dist/test/suites/renderer/fontawesome.test.js +190 -0
  647. package/dist/test/suites/renderer/round-trip.test.js +107 -0
  648. package/dist/test/suites/renderer/theme.test.js +118 -0
  649. package/dist/test/suites/renderer/tooltips.test.js +166 -0
  650. package/dist/test/suites/renderer/verts.test.js +100 -0
  651. package/dist/test/suites/renderer/window-em-surface.test.js +107 -0
  652. package/dist/test/utils/dist-snapshot.js +36 -0
  653. package/dist/test/utils/extended-mode-warning.js +13 -0
  654. package/dist/utils/app-root.js +28 -0
  655. package/dist/utils/attach-log-file.js +4 -0
  656. package/dist/utils/build-pipeline.js +58 -0
  657. package/dist/utils/deliver-certs.js +69 -0
  658. package/dist/utils/derive-signing-env.js +56 -0
  659. package/dist/utils/dist-root.js +21 -0
  660. package/dist/utils/electron-node-version.js +48 -0
  661. package/dist/utils/electron-targets.js +72 -0
  662. package/dist/utils/format-fetch-error.js +38 -0
  663. package/dist/utils/github.js +73 -0
  664. package/dist/utils/load-consumer-file.js +26 -0
  665. package/dist/utils/merge-line-files.js +5 -0
  666. package/dist/utils/mode-helpers.js +147 -0
  667. package/dist/utils/resolve-signing-cert.js +175 -0
  668. package/dist/utils/run-consumer-hook.js +38 -0
  669. package/dist/utils/runner-env.js +687 -0
  670. package/dist/utils/safe-install.js +4 -0
  671. package/dist/utils/sanitize-signing-env.js +45 -0
  672. package/dist/utils/sanitize-url.js +28 -0
  673. package/dist/utils/secure-remote-url.js +25 -0
  674. package/dist/utils/stealth-window.js +37 -0
  675. package/dist/utils/test-stealth.js +29 -0
  676. package/dist/utils/url-helpers.js +169 -0
  677. package/dist/vendor/account/engine.js +182 -0
  678. package/dist/vendor/account/features.js +220 -0
  679. package/dist/vendor/account/index.js +53 -0
  680. package/dist/vendor/account/schema.js +272 -0
  681. package/dist/vendor/account/subscription.js +38 -0
  682. package/dist/vendor/analytics/adapters/ga4.js +26 -0
  683. package/dist/vendor/analytics/adapters/meta.js +26 -0
  684. package/dist/vendor/analytics/adapters/resolve.js +130 -0
  685. package/dist/vendor/analytics/adapters/tiktok.js +27 -0
  686. package/dist/vendor/analytics/catalog.js +908 -0
  687. package/dist/vendor/analytics/consent.js +49 -0
  688. package/dist/vendor/analytics/core.js +141 -0
  689. package/dist/vendor/analytics/identity.js +136 -0
  690. package/dist/vendor/analytics/index.js +170 -0
  691. package/dist/vendor/analytics/logger.js +40 -0
  692. package/dist/vendor/analytics/transports/browser.js +110 -0
  693. package/dist/vendor/config/company.js +31 -0
  694. package/dist/vendor/config/defaults.js +173 -0
  695. package/dist/vendor/config/demo.js +18 -0
  696. package/dist/vendor/config/desktop-artifacts.js +110 -0
  697. package/dist/vendor/config/edit.js +769 -0
  698. package/dist/vendor/config/env-delivery.js +145 -0
  699. package/dist/vendor/config/env-rules.js +93 -0
  700. package/dist/vendor/config/env-schema.js +1078 -0
  701. package/dist/vendor/config/env.js +445 -0
  702. package/dist/vendor/config/hooks.js +97 -0
  703. package/dist/vendor/config/index.js +237 -0
  704. package/dist/vendor/config/instances.js +208 -0
  705. package/dist/vendor/config/load.js +490 -0
  706. package/dist/vendor/config/merge.js +68 -0
  707. package/dist/vendor/config/order.js +139 -0
  708. package/dist/vendor/config/ports.js +374 -0
  709. package/dist/vendor/config/providers.js +32 -0
  710. package/dist/vendor/config/repo.js +142 -0
  711. package/dist/vendor/config/retired-keys.js +430 -0
  712. package/dist/vendor/config/schema.js +1610 -0
  713. package/dist/vendor/config/secrets.js +50 -0
  714. package/dist/vendor/config/seed.js +34 -0
  715. package/dist/vendor/config/site-global.js +205 -0
  716. package/dist/vendor/config/validate.js +554 -0
  717. package/dist/vendor/config/winback.js +61 -0
  718. package/dist/vendor/devkit/actions-secrets.js +145 -0
  719. package/dist/vendor/devkit/attach-log-file.js +262 -0
  720. package/dist/vendor/devkit/bundle.js +292 -0
  721. package/dist/vendor/devkit/certs.js +199 -0
  722. package/dist/vendor/devkit/ci-workflows.js +520 -0
  723. package/dist/vendor/devkit/clean-dirs.js +28 -0
  724. package/dist/vendor/devkit/cli-router.js +156 -0
  725. package/dist/vendor/devkit/defaults-engine.js +372 -0
  726. package/dist/vendor/devkit/deploy-precheck.js +54 -0
  727. package/dist/vendor/devkit/deploy-record.js +180 -0
  728. package/dist/vendor/devkit/deploy.js +286 -0
  729. package/dist/vendor/devkit/empty-modules-plugin.js +64 -0
  730. package/dist/vendor/devkit/env-watch.js +132 -0
  731. package/dist/vendor/devkit/framework-deps.js +46 -0
  732. package/dist/vendor/devkit/license.js +155 -0
  733. package/dist/vendor/devkit/local.js +1905 -0
  734. package/dist/vendor/devkit/logger.js +128 -0
  735. package/dist/vendor/devkit/merge-line-files.js +296 -0
  736. package/dist/vendor/devkit/npm-registry.js +52 -0
  737. package/dist/vendor/devkit/omega-bin.js +345 -0
  738. package/dist/vendor/devkit/prompt.js +187 -0
  739. package/dist/vendor/devkit/safe-install.js +18 -0
  740. package/dist/vendor/devkit/scaffold-guard.js +96 -0
  741. package/dist/vendor/devkit/stop-signals.js +28 -0
  742. package/dist/vendor/devkit/strip-dev-blocks-plugin.js +29 -0
  743. package/dist/vendor/devkit/strip-dev-blocks.js +32 -0
  744. package/dist/vendor/devkit/target-dependencies.js +137 -0
  745. package/dist/vendor/devkit/target-secrets.js +165 -0
  746. package/dist/vendor/devkit/test/assert.js +120 -0
  747. package/dist/vendor/devkit/test/define-cases.js +104 -0
  748. package/dist/vendor/devkit/test/extended-mode-warning.js +22 -0
  749. package/dist/vendor/devkit/test/runner-core.js +554 -0
  750. package/dist/vendor/devkit/test/scope.js +162 -0
  751. package/dist/vendor/devkit/update.js +569 -0
  752. package/dist/vendor/monitoring/core.js +180 -0
  753. package/dist/vendor/monitoring/env.js +49 -0
  754. package/dist/vendor/monitoring/index.js +28 -0
  755. package/dist/vendor/monitoring/logger.js +39 -0
  756. package/dist/vendor/monitoring/main.js +99 -0
  757. package/dist/vendor/monitoring/preload.js +45 -0
  758. package/dist/vendor/monitoring/renderer.js +87 -0
  759. package/docs/analytics.md +140 -0
  760. package/docs/app-state.md +92 -0
  761. package/docs/audit.md +69 -0
  762. package/docs/auto-updater.md +243 -0
  763. package/docs/boot-sequence.md +39 -0
  764. package/docs/build-system.md +161 -0
  765. package/docs/cdp-debugging.md +169 -0
  766. package/docs/client-bridge.md +267 -0
  767. package/docs/common-mistakes.md +21 -0
  768. package/docs/config-schema.md +120 -0
  769. package/docs/context-menu.md +112 -0
  770. package/docs/context.md +81 -0
  771. package/docs/css.md +84 -0
  772. package/docs/deep-link.md +178 -0
  773. package/docs/environment-detection.md +104 -0
  774. package/docs/fontawesome.md +107 -0
  775. package/docs/hooks.md +87 -0
  776. package/docs/icons.md +79 -0
  777. package/docs/index.md +279 -0
  778. package/docs/installer-options.md +162 -0
  779. package/docs/ipc.md +61 -0
  780. package/docs/lib-modules.md +53 -0
  781. package/docs/logging.md +229 -0
  782. package/docs/menu.md +160 -0
  783. package/docs/releasing.md +229 -0
  784. package/docs/remote-config.md +118 -0
  785. package/docs/remote-scripts.md +144 -0
  786. package/docs/restart-manager.md +144 -0
  787. package/docs/runner.md +253 -0
  788. package/docs/sentry.md +97 -0
  789. package/docs/shared/agent-docs.md +89 -0
  790. package/docs/shared/analytics.md +612 -0
  791. package/docs/shared/brands.md +51 -0
  792. package/docs/shared/breaking-changes.md +497 -0
  793. package/docs/shared/config.md +1387 -0
  794. package/docs/shared/deploys.md +215 -0
  795. package/docs/shared/icons.md +201 -0
  796. package/docs/shared/local-dev.md +147 -0
  797. package/docs/shared/logging.md +202 -0
  798. package/docs/shared/monitoring.md +153 -0
  799. package/docs/shared/publishing.md +183 -0
  800. package/docs/shared/rulings.md +34 -0
  801. package/docs/shared/testing.md +147 -0
  802. package/docs/shared/theming.md +604 -0
  803. package/docs/shared/translation.md +291 -0
  804. package/docs/shared/updates.md +61 -0
  805. package/docs/signing.md +267 -0
  806. package/docs/startup.md +142 -0
  807. package/docs/storage.md +59 -0
  808. package/docs/templating.md +101 -0
  809. package/docs/test-boot-layer.md +157 -0
  810. package/docs/test-framework.md +357 -0
  811. package/docs/themes.md +135 -0
  812. package/docs/tooltips.md +99 -0
  813. package/docs/tray.md +164 -0
  814. package/docs/usage.md +58 -0
  815. package/docs/verts.md +62 -0
  816. package/docs/windows.md +149 -0
  817. package/package.json +184 -0
  818. package/scripts/sync-nvmrc.js +100 -0
@@ -0,0 +1,214 @@
1
+ // Startup — open-at-login + launch-mode management.
2
+ //
3
+ // Two independent things this lib controls:
4
+ //
5
+ // 1. `startup.mode` — how the app launches when the USER opens it directly:
6
+ // normal — default. Dock icon visible on macOS, taskbar entry on Windows.
7
+ // hidden — packaged builds get LSUIElement=true on macOS (zero dock bounce, no
8
+ // dock icon, not in Cmd+Tab). Tray/notifications/networking still work.
9
+ // Consumer surfaces UI later via `manager.windows.create('main')`, which
10
+ // calls app.dock.show() automatically so the icon appears alongside the
11
+ // window. Use this for menubar apps, agent apps, anything that should
12
+ // be invisible until the user explicitly asks for UI.
13
+ //
14
+ // 2. `startup.openAtLogin` — what the OS does at user login:
15
+ // enabled (default true) — register the app to auto-launch at login.
16
+ // mode (default 'hidden') — what mode the app launches in WHEN OS-launched.
17
+ // Independent from the user-launch mode above.
18
+ //
19
+ // @omega.js/desktop does NOT auto-create any windows anymore — the consumer's main.js drives that.
20
+ // So "isLaunchHidden" no longer needs to gate window creation; we just expose the
21
+ // raw mode and let the consumer decide whether to call `manager.windows.create()`.
22
+ //
23
+ // Detection: macOS sets `getLoginItemSettings().wasOpenedAtLogin = true`. On Windows we
24
+ // register the login item with `--omega-launched-at-login` arg and check process.argv.
25
+ // On Linux there's no standard signal, so we treat all launches as user-launches.
26
+
27
+ const LoggerLite = require('./logger-lite.js');
28
+
29
+ const logger = new LoggerLite('startup');
30
+
31
+ // Valid startup modes. `tray-only` is now folded into `hidden` (they were always the
32
+ // same idea — LSUIElement on macOS — so we collapse to a single name).
33
+ const VALID_MODES = ['normal', 'hidden'];
34
+ const LOGIN_ARG = '--omega-launched-at-login'; // marker for Windows + Linux login-launch detection
35
+
36
+ const startup = {
37
+ _initialized: false,
38
+ _manager: null,
39
+ _electron: null,
40
+
41
+ initialize(manager) {
42
+ if (startup._initialized) {
43
+ return;
44
+ }
45
+
46
+ startup._manager = manager;
47
+ startup._electron = require('electron');
48
+
49
+ const mode = startup.getMode();
50
+ const loginEnabled = startup._loginEnabled();
51
+ const loginMode = startup._loginMode();
52
+ const isDev = startup._isDev();
53
+
54
+ // In dev, force open-at-login OFF regardless of config. And actively UNSET any prior
55
+ // registration so a dev run that previously ran with config:enabled=true doesn't leave
56
+ // electron.app (or worse, a stale dev binary path) trying to launch every login.
57
+ // Otherwise: sync the OS open-at-login flag with config. Pass --omega-launched-at-login
58
+ // in args so we can detect login launches reliably on Windows/Linux (macOS exposes
59
+ // wasOpenedAtLogin natively).
60
+ if (isDev) {
61
+ startup._electron.app.setLoginItemSettings({
62
+ openAtLogin: false,
63
+ openAsHidden: false,
64
+ args: [],
65
+ });
66
+ } else {
67
+ startup._electron.app.setLoginItemSettings({
68
+ openAtLogin: loginEnabled,
69
+ openAsHidden: loginMode === 'hidden',
70
+ args: loginEnabled ? [LOGIN_ARG] : [],
71
+ });
72
+ }
73
+
74
+ // Boot summary — RAW inputs (what the OS/shell gave us) + RESOLVED values (what @omega.js/desktop
75
+ // decided to act on). Two parallel blocks so you can debug in either direction:
76
+ // "Why is @omega.js/desktop behaving like X?" → check resolved values
77
+ // "Why did @omega.js/desktop decide X?" → check raw inputs
78
+ const macLogin = process.platform === 'darwin' ? startup._electron.app.getLoginItemSettings() : null;
79
+ const emEnv = Object.fromEntries(
80
+ Object.entries(process.env).filter(([k]) => k.startsWith('EM_') || k === 'ELECTRON_RUN_AS_NODE' || k === 'NODE_ENV')
81
+ );
82
+ const launchedAtLogin = startup.wasLaunchedAtLogin();
83
+ const launchedAtLoginVia = startup._launchedAtLoginVia();
84
+ const isHidden = startup.isLaunchHidden();
85
+
86
+ logger.log('startup boot summary — RAW inputs:');
87
+ logger.log(` process.argv: ${JSON.stringify(process.argv.slice(1))}`);
88
+ logger.log(` process.platform: ${process.platform}`);
89
+ logger.log(` process.arch: ${process.arch}`);
90
+ logger.log(` app.isPackaged: ${startup._electron.app.isPackaged}`);
91
+ logger.log(` app.getLoginItemSettings(): ${macLogin ? JSON.stringify(macLogin) : '(not macOS)'}`);
92
+ logger.log(` EM_/electron/node env: ${JSON.stringify(emEnv)}`);
93
+
94
+ logger.log('startup boot summary — RESOLVED values:');
95
+ logger.log(` config.startup.mode: ${mode}`);
96
+ logger.log(` config.startup.openAtLogin: ${isDev ? 'OFF (dev — config ignored)' : `{enabled:${loginEnabled}, mode:${loginMode}}`}`);
97
+ logger.log(` isDev: ${isDev}`);
98
+ logger.log(` hasLoginArg: ${process.argv.includes(LOGIN_ARG)}`);
99
+ logger.log(` wasLaunchedAtLogin(): ${launchedAtLogin}${launchedAtLogin ? ` (via ${launchedAtLoginVia})` : ''}`);
100
+ logger.log(` isLaunchHidden(): ${isHidden}`);
101
+ startup._initialized = true;
102
+ },
103
+
104
+ // Internal: report HOW we determined this launch was at login. Used by initialize logging
105
+ // to distinguish "fake login via --omega-launched-at-login flag" from "real macOS at-login".
106
+ _launchedAtLoginVia() {
107
+ if (process.argv.includes(LOGIN_ARG)) return 'argv-flag';
108
+ if (process.platform === 'darwin' && startup._electron.app.getLoginItemSettings().wasOpenedAtLogin) {
109
+ return 'macos-wasOpenedAtLogin';
110
+ }
111
+ return 'none';
112
+ },
113
+
114
+ // Should we suppress login-item changes? Suppressed in any non-production run (dev OR
115
+ // testing) so we never touch the real user's OS login items outside a packaged build.
116
+ // OMEGA_FORCE_LOGIN_ITEM=1 bypasses the guard so you can intentionally exercise the flow.
117
+ _isDev() {
118
+ if (process.env.OMEGA_FORCE_LOGIN_ITEM === '1') return false;
119
+ return !startup._manager.isProduction();
120
+ },
121
+
122
+ // Returns the resolved user-launch mode, defaulting to 'normal' for unknown values.
123
+ getMode() {
124
+ const raw = startup._manager.config.startup?.mode || 'normal';
125
+ return VALID_MODES.includes(raw) ? raw : 'normal';
126
+ },
127
+
128
+ // openAtLogin block reads. `_loginEnabled` defaults to true; `_loginMode` defaults to 'hidden'.
129
+ _loginEnabled() {
130
+ const v = startup._manager.config.startup?.openAtLogin;
131
+ if (typeof v === 'boolean') return v; // back-compat for boolean form
132
+ if (v && typeof v === 'object') return v.enabled !== false; // object form: default true
133
+ return true; // unset → true (apps open at login by default)
134
+ },
135
+
136
+ _loginMode() {
137
+ const v = startup._manager.config.startup?.openAtLogin;
138
+ if (v && typeof v === 'object' && VALID_MODES.includes(v.mode)) return v.mode;
139
+ return 'hidden'; // default: launch hidden at login
140
+ },
141
+
142
+ // True if this launch is hidden — combines user-launch mode (always honored) with
143
+ // login-launch mode (only honored when the app was launched at login). Consumers can
144
+ // read this to decide whether to call manager.windows.create() during boot.
145
+ isLaunchHidden() {
146
+ if (startup.getMode() === 'hidden') return true;
147
+ if (startup.wasLaunchedAtLogin() && startup._loginMode() === 'hidden') return true;
148
+ return false;
149
+ },
150
+
151
+ // Did the OS launch us at login (vs the user opening the app directly)?
152
+ // macOS: getLoginItemSettings().wasOpenedAtLogin.
153
+ // Windows/Linux: we registered with LOGIN_ARG, look for it in argv.
154
+ wasLaunchedAtLogin() {
155
+ if (process.argv.includes(LOGIN_ARG)) return true;
156
+ if (process.platform === 'darwin') {
157
+ return Boolean(startup._electron.app.getLoginItemSettings().wasOpenedAtLogin);
158
+ }
159
+ return false;
160
+ },
161
+
162
+ // Apply the runtime side of the mode (dock.hide for macOS). Called from main.js
163
+ // BEFORE whenReady so the dock animation is suppressed as early as JS allows.
164
+ // Note: in packaged tray-only builds the plist already prevents the dock entry,
165
+ // so this call is a no-op there. In dev or hidden mode it shaves the visible time.
166
+ applyEarly() {
167
+ if (!startup._electron) return;
168
+ if (process.platform !== 'darwin') return;
169
+ if (!startup.isLaunchHidden()) return;
170
+
171
+ startup._electron.app.dock.hide();
172
+ },
173
+
174
+ // Public mutators
175
+
176
+ // Toggle the OS open-at-login flag. Pass a boolean for back-compat, or an object
177
+ // { enabled, mode } to control both. Persists via setLoginItemSettings; does not mutate config.
178
+ // No-op in dev (no packaged build = no point registering electron.app for login-launch).
179
+ setOpenAtLogin(input) {
180
+ if (startup._isDev()) {
181
+ logger.log('setOpenAtLogin ignored — running in dev mode (set OMEGA_FORCE_LOGIN_ITEM=1 to override)');
182
+ return;
183
+ }
184
+
185
+ let enabled;
186
+ let openAsHidden;
187
+ if (typeof input === 'boolean') {
188
+ enabled = input;
189
+ openAsHidden = startup._loginMode() !== 'normal';
190
+ } else if (input && typeof input === 'object') {
191
+ enabled = input.enabled !== false;
192
+ const mode = VALID_MODES.includes(input.mode) ? input.mode : startup._loginMode();
193
+ openAsHidden = mode === 'hidden';
194
+ } else {
195
+ enabled = true;
196
+ openAsHidden = startup._loginMode() !== 'normal';
197
+ }
198
+
199
+ startup._electron.app.setLoginItemSettings({
200
+ openAtLogin: enabled,
201
+ openAsHidden,
202
+ args: enabled ? [LOGIN_ARG] : [],
203
+ });
204
+ logger.log(`setOpenAtLogin → enabled=${enabled} openAsHidden=${openAsHidden}`);
205
+ },
206
+
207
+ // Read the current OS open-at-login state (may differ from config if user changed it
208
+ // via System Settings; useful for keeping a settings UI in sync).
209
+ isOpenAtLogin() {
210
+ return Boolean(startup._electron.app.getLoginItemSettings().openAtLogin);
211
+ },
212
+ };
213
+
214
+ module.exports = startup;
@@ -0,0 +1,193 @@
1
+ // Storage — unified KV store for main + renderer.
2
+ //
3
+ // Main-side (sync, direct disk-backed via electron-store):
4
+ // manager.storage.get(key, default)
5
+ // manager.storage.set(key, value)
6
+ // manager.storage.delete(key)
7
+ // manager.storage.has(key)
8
+ // manager.storage.clear()
9
+ // manager.storage.onChange(key, fn) // returns unsubscribe fn
10
+ //
11
+ // Renderer-side (async, proxied through preload contextBridge → IPC → main):
12
+ // window.desktop.storage.get(key, default) → Promise
13
+ // window.desktop.storage.set(key, value) → Promise
14
+ // etc.
15
+ //
16
+ // Key paths support dot-notation (e.g. 'window.main.bounds') natively via electron-store.
17
+ //
18
+ // Storage file lives at:
19
+ // macOS: ~/Library/Application Support/<productName>/config.json
20
+ // Windows: %APPDATA%/<productName>/config.json
21
+ // Linux: ~/.config/<productName>/config.json
22
+
23
+ const LoggerLite = require('./logger-lite.js');
24
+ const ipc = require('./ipc.js');
25
+
26
+ const logger = new LoggerLite('storage');
27
+
28
+ const storage = {
29
+ _initialized: false,
30
+ _manager: null,
31
+ _store: null,
32
+ _changeSubs: {}, // key -> Set<fn>
33
+ _ipcRegistered: false,
34
+
35
+ async initialize(manager) {
36
+ if (storage._initialized) {
37
+ return;
38
+ }
39
+
40
+ storage._manager = manager;
41
+
42
+ let ElectronStore;
43
+ try {
44
+ // electron-store is ESM-only. The STATIC specifier is what matters: the
45
+ // bundler inlines it INTO main.bundle.js (no lazy chunk, no runtime
46
+ // resolution) — packaged consumers need nothing installed. Unbundled
47
+ // (@omega.js/desktop's own harness), Node resolves it from
48
+ // @omega.js/desktop's node_modules. Pinned by
49
+ // src/test/suites/boot/storage-bundled.test.js.
50
+ const mod = await import('electron-store');
51
+ ElectronStore = mod.default || mod;
52
+ } catch (e) {
53
+ logger.warn(`electron-store not available — storage running as no-op. (${e.message})`);
54
+ storage._initialized = true;
55
+ return;
56
+ }
57
+ const electron = require('electron');
58
+
59
+ // Build the store. Filename is `omega-storage.json` (electron-store appends .json).
60
+ // Production name is read from electron's app.name (set automatically from package.productName).
61
+ const projectName = manager.config.app?.productName || electron.app.getName();
62
+
63
+ storage._store = new ElectronStore({
64
+ name: 'omega-storage',
65
+ // electron-store handles the cwd; no need to override unless we want a custom path.
66
+ });
67
+
68
+ logger.log(`initialize — file=${storage._store.path} (project=${projectName})`);
69
+
70
+ // Register main-side IPC handlers so the renderer proxy works.
71
+ storage._registerIpc();
72
+
73
+ storage._initialized = true;
74
+ },
75
+
76
+ _registerIpc() {
77
+ if (storage._ipcRegistered) {
78
+ return;
79
+ }
80
+
81
+ if (!ipc._initialized) {
82
+ // ipc is initialized before storage in the boot sequence; if we're here, ipc is unavailable
83
+ // (e.g. running outside electron). Skip silently — main-side API still works.
84
+ return;
85
+ }
86
+
87
+ ipc.handle('desktop:storage:get', ({ key, def }) => storage.get(key, def));
88
+ ipc.handle('desktop:storage:set', ({ key, val }) => { storage.set(key, val); return true; });
89
+ ipc.handle('desktop:storage:delete', ({ key }) => { storage.delete(key); return true; });
90
+ ipc.handle('desktop:storage:has', ({ key }) => storage.has(key));
91
+ ipc.handle('desktop:storage:clear', () => { storage.clear(); return true; });
92
+
93
+ storage._ipcRegistered = true;
94
+ },
95
+
96
+ // Main-side public API
97
+ get(key, defaultValue) {
98
+ if (!storage._store) {
99
+ return defaultValue;
100
+ }
101
+ const value = storage._store.get(key);
102
+ return value === undefined ? defaultValue : value;
103
+ },
104
+
105
+ set(key, value) {
106
+ if (!storage._store) {
107
+ return;
108
+ }
109
+ const previous = storage._store.get(key);
110
+ storage._store.set(key, value);
111
+
112
+ // Notify subscribers
113
+ const subs = storage._changeSubs[key];
114
+ if (subs) {
115
+ subs.forEach((fn) => {
116
+ try {
117
+ fn(value, previous);
118
+ } catch (e) {
119
+ logger.error('onChange subscriber threw:', e);
120
+ }
121
+ });
122
+ }
123
+
124
+ // Broadcast change to all renderers so renderer caches can invalidate.
125
+ storage._broadcast(key, value, previous);
126
+ },
127
+
128
+ delete(key) {
129
+ if (!storage._store) {
130
+ return;
131
+ }
132
+ const previous = storage._store.get(key);
133
+ storage._store.delete(key);
134
+
135
+ const subs = storage._changeSubs[key];
136
+ if (subs) {
137
+ subs.forEach((fn) => {
138
+ try {
139
+ fn(undefined, previous);
140
+ } catch (e) {
141
+ logger.error('onChange subscriber threw:', e);
142
+ }
143
+ });
144
+ }
145
+
146
+ storage._broadcast(key, undefined, previous);
147
+ },
148
+
149
+ has(key) {
150
+ if (!storage._store) {
151
+ return false;
152
+ }
153
+ return storage._store.has(key);
154
+ },
155
+
156
+ clear() {
157
+ if (!storage._store) {
158
+ return;
159
+ }
160
+ storage._store.clear();
161
+ storage._broadcast('*', undefined, undefined);
162
+ },
163
+
164
+ // Subscribe to changes for a specific key. Returns an unsubscribe function.
165
+ onChange(key, fn) {
166
+ if (!storage._changeSubs[key]) {
167
+ storage._changeSubs[key] = new Set();
168
+ }
169
+ storage._changeSubs[key].add(fn);
170
+
171
+ return () => {
172
+ const set = storage._changeSubs[key];
173
+ if (set) {
174
+ set.delete(fn);
175
+ if (set.size === 0) {
176
+ delete storage._changeSubs[key];
177
+ }
178
+ }
179
+ };
180
+ },
181
+
182
+ _broadcast(key, value, previous) {
183
+ if (!ipc._initialized) return;
184
+ ipc.broadcast('desktop:storage:change', { key, value, previous });
185
+ },
186
+
187
+ // Expose the on-disk path (handy for debugging)
188
+ getPath() {
189
+ return storage._store?.path || null;
190
+ },
191
+ };
192
+
193
+ module.exports = storage;
@@ -0,0 +1,85 @@
1
+ // Templating — light token-replacement engine for HTML/CSS/JS at build time.
2
+ //
3
+ // Wraps node-powertools' template() with framework-friendly defaults:
4
+ // - Brackets are `{{ }}` (matches BXM/UJM convention).
5
+ // - Standard variable scope built from manager.config + page metadata.
6
+ //
7
+ // Public API:
8
+ // manager.templating.render(input, vars) // arbitrary string + arbitrary vars
9
+ // manager.templating.buildPageVars(pageName, extras) // produces { brand, app, page, theme, cacheBust }
10
+ // manager.templating.renderPage(pageTemplate, vars) // shortcut that uses {{ }} brackets
11
+ //
12
+ // Manager.initialize calls .initialize(manager) but the lib is mostly used at build time
13
+ // (gulp/html), not at runtime. The runtime surface is exposed for consumer hooks that want
14
+ // to template their own strings.
15
+
16
+ const LoggerLite = require('./logger-lite.js');
17
+ const { template } = require('node-powertools');
18
+
19
+ const logger = new LoggerLite('templating');
20
+
21
+ const DEFAULT_BRACKETS = ['{{', '}}'];
22
+
23
+ const templating = {
24
+ _initialized: false,
25
+ _manager: null,
26
+
27
+ initialize(manager) {
28
+ templating._manager = manager;
29
+ templating._initialized = true;
30
+ logger.log('initialize');
31
+ },
32
+
33
+ // Render an arbitrary template string with the given vars. Brackets default to {{ }}.
34
+ render(input, vars, opts) {
35
+ opts = opts || {};
36
+ const brackets = opts.brackets || DEFAULT_BRACKETS;
37
+ return template(String(input || ''), vars || {}, { brackets });
38
+ },
39
+
40
+ // Build the standard variable scope for a page render. Combines manager.config with
41
+ // page-specific metadata + cache-buster for asset URLs.
42
+ // `manager` is optional — buildPageVars works at build time (where Manager singleton is built
43
+ // from build.js) without needing the runtime manager singleton.
44
+ buildPageVars(pageName, extras, manager) {
45
+ const m = manager || templating._manager;
46
+ const cfg = (m && m.config) || (m && typeof m.getConfig === 'function' ? m.getConfig() : {}) || {};
47
+ // Pull version from the consumer's package.json at build time. This baked-in
48
+ // string is used by templates that want to display the running version in the
49
+ // UI (e.g. "v1.0.5" in a footer). At runtime it always matches the version
50
+ // that was packaged + signed + uploaded, since both come from the same
51
+ // package.json read.
52
+ const pkg = (m && typeof m.getPackage === 'function' ? m.getPackage('project') : null) || {};
53
+ const appBlock = { ...(cfg.app || {}) };
54
+ if (pkg.version && !appBlock.version) appBlock.version = pkg.version;
55
+ const vars = {
56
+ brand: cfg.brand || {},
57
+ app: appBlock,
58
+ // 'system' is inert as a data-bs-theme value (Bootstrap knows light/dark only) —
59
+ // the preload's theme applier replaces it with the RESOLVED appearance at runtime.
60
+ theme: { appearance: cfg.theme?.appearance || 'system' },
61
+ page: {
62
+ name: pageName,
63
+ title: (extras && extras.title) || cfg.app?.productName || cfg.brand?.name || 'App',
64
+ },
65
+ cacheBust: String((extras && extras.cacheBust) || Date.now()),
66
+ // Slot for the body content. gulp/html sets this after rendering the inner view.
67
+ content: (extras && extras.content) || '',
68
+ };
69
+ if (extras && typeof extras === 'object') {
70
+ // Merge any extra keys (e.g. content), but don't clobber the structured groups above
71
+ // unless explicitly provided.
72
+ for (const [k, v] of Object.entries(extras)) {
73
+ if (v !== undefined) vars[k] = v;
74
+ }
75
+ }
76
+ return vars;
77
+ },
78
+
79
+ // Convenience: render a page template (outer shell) with the given vars.
80
+ renderPage(pageTemplate, vars) {
81
+ return templating.render(pageTemplate, vars);
82
+ },
83
+ };
84
+
85
+ module.exports = templating;
@@ -0,0 +1,173 @@
1
+ // Theme — system-aware dynamic appearance (light / dark / follow-the-OS).
2
+ //
3
+ // Main-side API:
4
+ // manager.theme.get() → 'system' | 'light' | 'dark' (the SOURCE — what's chosen)
5
+ // manager.theme.resolved() → 'light' | 'dark' (what's actually showing)
6
+ // manager.theme.set(source) → apply + persist a new source
7
+ // manager.theme.onChange(fn) → fn({ source, resolved }) on every effective change; returns unsubscribe
8
+ //
9
+ // Renderer-side (preload contextBridge):
10
+ // window.desktop.theme.get() → Promise<{ source, resolved }>
11
+ // window.desktop.theme.set(s) → Promise<{ source, resolved }>
12
+ // window.desktop.theme.onChange(fn) — matchMedia-powered (see below); returns unsubscribe
13
+ //
14
+ // How it works: everything rides on Electron's `nativeTheme.themeSource`, which accepts
15
+ // exactly the same three values. Setting it (a) drives `shouldUseDarkColors`, (b) flips
16
+ // `prefers-color-scheme` in EVERY renderer of the app — BrowserWindows AND
17
+ // WebContentsViews — firing their matchMedia listeners, and (c) makes native UI (menus,
18
+ // dialogs) follow. Renderers therefore SELF-RESOLVE via matchMedia instead of depending
19
+ // on `ipc.broadcast` (which only reaches BrowserWindows — embedded WebContentsViews
20
+ // would never hear it). The `desktop:theme:changed` broadcast below is a main-side courtesy
21
+ // for windows that want the source+resolved pair pushed; it is not the sync mechanism.
22
+ //
23
+ // Source resolution at boot: storage override (the user's runtime choice) → config
24
+ // `theme.appearance` (the app's default) → 'system'. Invalid values fall through.
25
+ //
26
+ // The `<html data-bs-theme>` attribute is applied/maintained by the preload's theme
27
+ // applier on every framework-templated page (see src/preload.js) — pages that don't carry the
28
+ // attribute (e.g. external sites loaded in an embedding consumer's web views) are left
29
+ // untouched.
30
+
31
+ const LoggerLite = require('./logger-lite.js');
32
+ const ipc = require('./ipc.js');
33
+
34
+ const logger = new LoggerLite('theme');
35
+
36
+ const STORAGE_KEY = 'theme';
37
+ const SOURCES = ['system', 'light', 'dark'];
38
+
39
+ const theme = {
40
+ _initialized: false,
41
+ _manager: null,
42
+ _nativeTheme: null,
43
+ _listeners: new Set(),
44
+ _lastEmitted: null,
45
+ _onNativeUpdated: null,
46
+
47
+ initialize(manager) {
48
+ if (theme._initialized) {
49
+ return;
50
+ }
51
+
52
+ theme._manager = manager;
53
+
54
+ let nativeTheme;
55
+ try {
56
+ nativeTheme = require('electron').nativeTheme;
57
+ } catch (e) {
58
+ nativeTheme = null;
59
+ }
60
+ if (!nativeTheme) {
61
+ logger.warn('nativeTheme not available — theme running as no-op.');
62
+ theme._initialized = true;
63
+ return;
64
+ }
65
+ theme._nativeTheme = nativeTheme;
66
+
67
+ // Boot source: storage override → config default → 'system'.
68
+ const stored = manager.storage.get(`${STORAGE_KEY}.appearance`);
69
+ const configured = manager.config?.theme?.appearance;
70
+ const source = SOURCES.includes(stored) ? stored
71
+ : SOURCES.includes(configured) ? configured
72
+ : 'system';
73
+
74
+ nativeTheme.themeSource = source;
75
+ logger.log(`initialize — source=${source} (stored=${stored ?? '—'} config=${configured ?? '—'}) resolved=${theme.resolved()}`);
76
+
77
+ // OS preference changes (in 'system' mode) and themeSource flips both land here.
78
+ theme._onNativeUpdated = () => theme._emitChange();
79
+ nativeTheme.on('updated', theme._onNativeUpdated);
80
+
81
+ theme._registerIpc();
82
+
83
+ theme._lastEmitted = `${theme.get()}|${theme.resolved()}`;
84
+ theme._initialized = true;
85
+ },
86
+
87
+ _registerIpc() {
88
+ if (!ipc._initialized) {
89
+ return;
90
+ }
91
+
92
+ ipc.handle('desktop:theme:get', () => ({ source: theme.get(), resolved: theme.resolved() }));
93
+ ipc.handle('desktop:theme:set', ({ source }) => {
94
+ theme.set(source);
95
+ return { source: theme.get(), resolved: theme.resolved() };
96
+ });
97
+ },
98
+
99
+ // The chosen source ('system' tracks the OS; 'light'/'dark' are explicit overrides).
100
+ get() {
101
+ return theme._nativeTheme ? theme._nativeTheme.themeSource : 'system';
102
+ },
103
+
104
+ // What's actually showing right now.
105
+ resolved() {
106
+ return theme._nativeTheme?.shouldUseDarkColors ? 'dark' : 'light';
107
+ },
108
+
109
+ // Apply + persist a new source. Throws on anything outside the three valid values —
110
+ // a bad call is a programmer error, not a state to limp through.
111
+ set(source) {
112
+ if (!SOURCES.includes(source)) {
113
+ throw new Error(`theme.set: invalid source '${source}' — expected 'system' | 'light' | 'dark'.`);
114
+ }
115
+ if (!theme._nativeTheme) {
116
+ return;
117
+ }
118
+
119
+ theme._manager.storage.set(`${STORAGE_KEY}.appearance`, source);
120
+ theme._nativeTheme.themeSource = source;
121
+
122
+ // nativeTheme 'updated' only fires when the RESOLVED appearance changes — a
123
+ // source change with the same resolution (e.g. system-resolving-dark → dark)
124
+ // would otherwise go unannounced. _emitChange dedupes, so when 'updated' also
125
+ // fires this is still exactly one notification.
126
+ theme._emitChange();
127
+ },
128
+
129
+ // Subscribe to effective changes (source or resolution). Returns an unsubscribe fn.
130
+ onChange(fn) {
131
+ theme._listeners.add(fn);
132
+ return () => theme._listeners.delete(fn);
133
+ },
134
+
135
+ _emitChange() {
136
+ const payload = { source: theme.get(), resolved: theme.resolved() };
137
+ const stamp = `${payload.source}|${payload.resolved}`;
138
+ if (stamp === theme._lastEmitted) {
139
+ return;
140
+ }
141
+ theme._lastEmitted = stamp;
142
+
143
+ logger.log(`changed — source=${payload.source} resolved=${payload.resolved}`);
144
+
145
+ theme._listeners.forEach((fn) => {
146
+ try {
147
+ fn(payload);
148
+ } catch (e) {
149
+ logger.error('onChange subscriber threw:', e);
150
+ }
151
+ });
152
+
153
+ if (ipc._initialized) {
154
+ ipc.broadcast('desktop:theme:changed', payload);
155
+ }
156
+ },
157
+
158
+ // Tear down listeners + IPC (idempotent).
159
+ disable() {
160
+ if (theme._nativeTheme && theme._onNativeUpdated) {
161
+ theme._nativeTheme.removeListener('updated', theme._onNativeUpdated);
162
+ theme._onNativeUpdated = null;
163
+ }
164
+ theme._listeners.clear();
165
+ if (ipc._initialized) {
166
+ ipc.unhandle('desktop:theme:get');
167
+ ipc.unhandle('desktop:theme:set');
168
+ }
169
+ theme._initialized = false;
170
+ },
171
+ };
172
+
173
+ module.exports = theme;