@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,190 @@
1
+ // Renderer-layer suite — verifies the `window.desktop.fontawesome` bridge and the
2
+ // REAL auto-render pipeline: an `<i class="fa-solid fa-*">` inserted into the
3
+ // live DOM gets the bundled SVG injected by renderer.js's MutationObserver.
4
+ //
5
+ // Runs inside a hidden BrowserWindow. Test bodies are reconstructed via
6
+ // `new Function('ctx', body)` — no closures over module scope, so each test
7
+ // inlines its own poll helper.
8
+
9
+ const defineCases = require('../../../vendor/devkit/test/define-cases.js');
10
+
11
+ module.exports = defineCases({
12
+ type: 'suite',
13
+ layer: 'renderer',
14
+ description: 'fontawesome bridge + auto-render',
15
+ tests: [
16
+ {
17
+ name: 'window.desktop.fontawesome.get is exposed and resolves an SVG',
18
+ run: async (ctx) => {
19
+ ctx.expect(typeof window.desktop.fontawesome.get).toBe('function');
20
+ const svg = await window.desktop.fontawesome.get('play');
21
+ ctx.expect(typeof svg).toBe('string');
22
+ ctx.expect(svg.startsWith('<svg ')).toBe(true);
23
+ ctx.expect(svg.includes('fill="currentColor"')).toBe(true);
24
+ },
25
+ },
26
+ {
27
+ name: 'unknown icons resolve to null over the bridge',
28
+ run: async (ctx) => {
29
+ const svg = await window.desktop.fontawesome.get('definitely-not-an-icon-xyz');
30
+ ctx.expect(svg).toBe(null);
31
+ },
32
+ },
33
+ {
34
+ name: 'an inserted <i class="fa-solid fa-play"> gets the SVG injected',
35
+ run: async (ctx) => {
36
+ const until = async (fn) => {
37
+ const t0 = Date.now();
38
+ while (!fn()) {
39
+ if (Date.now() - t0 > 3000) throw new Error('timed out waiting for icon injection');
40
+ await new Promise((r) => setTimeout(r, 25));
41
+ }
42
+ };
43
+
44
+ const el = document.createElement('i');
45
+ el.className = 'fa-solid fa-play me-2';
46
+ document.body.appendChild(el);
47
+
48
+ await until(() => el.querySelector('svg'));
49
+ const svg = el.querySelector('svg');
50
+ ctx.expect(svg.getAttribute('width')).toBe('1em');
51
+ ctx.expect(svg.getAttribute('fill')).toBe('currentColor');
52
+ ctx.expect(el.dataset.omegaFa).toBe('solid/play');
53
+ el.remove();
54
+ },
55
+ },
56
+ {
57
+ name: 'injected SVGs render with overflow visible (FA Pro 7 glyphs overshoot their viewBox)',
58
+ run: async (ctx) => {
59
+ const until = async (fn) => {
60
+ const t0 = Date.now();
61
+ while (!fn()) {
62
+ if (Date.now() - t0 > 3000) throw new Error('timed out waiting for icon injection');
63
+ await new Promise((r) => setTimeout(r, 25));
64
+ }
65
+ };
66
+
67
+ // fa-lock draws its shackle above the viewBox top (y=-32 in
68
+ // 0 0 384 512) — with the SVG-root default (overflow: hidden) the
69
+ // shackle clips flat. The COMPUTED style is the proof the fix
70
+ // reaches the paint, not just the markup.
71
+ const el = document.createElement('i');
72
+ el.className = 'fa-solid fa-lock';
73
+ document.body.appendChild(el);
74
+
75
+ await until(() => el.querySelector('svg'));
76
+ ctx.expect(getComputedStyle(el.querySelector('svg')).overflow).toBe('visible');
77
+ el.remove();
78
+ },
79
+ },
80
+ {
81
+ name: 'fa-brands picks the brands style; modifier classes are not names',
82
+ run: async (ctx) => {
83
+ const until = async (fn) => {
84
+ const t0 = Date.now();
85
+ while (!fn()) {
86
+ if (Date.now() - t0 > 3000) throw new Error('timed out waiting for icon injection');
87
+ await new Promise((r) => setTimeout(r, 25));
88
+ }
89
+ };
90
+
91
+ const el = document.createElement('i');
92
+ el.className = 'fa-brands fa-fw fa-github';
93
+ document.body.appendChild(el);
94
+
95
+ await until(() => el.querySelector('svg'));
96
+ ctx.expect(el.dataset.omegaFa).toBe('brands/github'); // not 'fw'
97
+ el.remove();
98
+ },
99
+ },
100
+ {
101
+ name: 'Pro family/weight classes request the composed style — never a wrong-style fallback (cp111)',
102
+ run: async (ctx) => {
103
+ const until = async (fn) => {
104
+ const t0 = Date.now();
105
+ while (!fn()) {
106
+ if (Date.now() - t0 > 3000) throw new Error('timed out waiting for icon mark');
107
+ await new Promise((r) => setTimeout(r, 25));
108
+ }
109
+ };
110
+
111
+ // Without a Pro set, `fa-light fa-play` must stay EMPTY (style
112
+ // 'light' resolves null) — the pre-cp111 renderer ignored the class
113
+ // and wrongly injected the SOLID glyph. With Pro supplied it lights
114
+ // up for real; either way an SVG here may only be a non-solid one.
115
+ const el = document.createElement('i');
116
+ el.className = 'fa-light fa-play';
117
+ document.body.appendChild(el);
118
+
119
+ await until(() => el.dataset.omegaFa);
120
+ ctx.expect(el.dataset.omegaFa).toBe('light/play'); // family/weight classes are never names
121
+ const lightSvg = await window.desktop.fontawesome.get('play', 'light');
122
+ await new Promise((r) => setTimeout(r, 150));
123
+ ctx.expect((el.querySelector('svg') !== null)).toBe(lightSvg !== null);
124
+
125
+ // sharp + weight composes: `fa-sharp fa-light` asks for sharp-light.
126
+ const sharpSvg = await window.desktop.fontawesome.get('play', 'sharp-light');
127
+ const el2 = document.createElement('i');
128
+ el2.className = 'fa-sharp fa-light fa-play';
129
+ document.body.appendChild(el2);
130
+ await until(() => el2.dataset.omegaFa === 'sharp-light/play');
131
+ await new Promise((r) => setTimeout(r, 150));
132
+ ctx.expect((el2.querySelector('svg') !== null)).toBe(sharpSvg !== null);
133
+
134
+ el.remove();
135
+ el2.remove();
136
+ },
137
+ },
138
+ {
139
+ name: 'changing fa-* classes on a RENDERED element re-renders it in place (cp112)',
140
+ run: async (ctx) => {
141
+ const until = async (fn) => {
142
+ const t0 = Date.now();
143
+ while (!fn()) {
144
+ if (Date.now() - t0 > 3000) throw new Error('timed out waiting for icon swap');
145
+ await new Promise((r) => setTimeout(r, 25));
146
+ }
147
+ };
148
+
149
+ const el = document.createElement('i');
150
+ el.className = 'fa-solid fa-play';
151
+ document.body.appendChild(el);
152
+ await until(() => el.dataset.omegaFa === 'solid/play' && el.querySelector('svg'));
153
+ const playSvg = el.innerHTML;
154
+
155
+ // The dynamic MUST: set fa-{icon} via JS on an EXISTING element.
156
+ el.className = 'fa-solid fa-lock';
157
+ await until(() => el.dataset.omegaFa === 'solid/lock' && el.querySelector('svg'));
158
+ ctx.expect(el.innerHTML !== playSvg).toBe(true);
159
+
160
+ // Dropping the icon classes clears the rendered SVG.
161
+ el.className = 'me-2';
162
+ await until(() => !el.dataset.omegaFa);
163
+ ctx.expect(el.querySelector('svg')).toBe(null);
164
+ el.remove();
165
+ },
166
+ },
167
+ {
168
+ name: 'unknown icon names leave the element empty (marked, no SVG)',
169
+ run: async (ctx) => {
170
+ const until = async (fn) => {
171
+ const t0 = Date.now();
172
+ while (!fn()) {
173
+ if (Date.now() - t0 > 3000) throw new Error('timed out waiting for icon mark');
174
+ await new Promise((r) => setTimeout(r, 25));
175
+ }
176
+ };
177
+
178
+ const el = document.createElement('i');
179
+ el.className = 'fa-solid fa-definitely-not-an-icon-xyz';
180
+ document.body.appendChild(el);
181
+
182
+ await until(() => el.dataset.omegaFa);
183
+ // Give the (null) resolution a beat to land, then assert no SVG appeared.
184
+ await new Promise((r) => setTimeout(r, 150));
185
+ ctx.expect(el.querySelector('svg')).toBe(null);
186
+ el.remove();
187
+ },
188
+ },
189
+ ],
190
+ });
@@ -0,0 +1,107 @@
1
+ // Renderer-layer round-trip tests. The window-omega-surface suite asserts the SHAPE
2
+ // of `window.desktop.*` (functions exist). This suite asserts the BEHAVIOR — that calls
3
+ // from a real renderer process land in main, get processed, and the response or
4
+ // side-effect comes back correctly.
5
+ //
6
+ // Test bodies run inside a BrowserWindow with only `ctx` and `window` in scope —
7
+ // no closures, no require. The main harness pre-registered a couple of test-only
8
+ // IPC channels (desktop:__test:echo, desktop:__test:read-last-log) for these tests to use.
9
+
10
+ const defineCases = require('../../../vendor/devkit/test/define-cases.js');
11
+
12
+ module.exports = defineCases({
13
+ type: 'suite',
14
+ layer: 'renderer',
15
+ description: 'renderer ⇄ main round-trip',
16
+ tests: [
17
+ {
18
+ name: 'window.desktop.ipc.invoke: renderer → main → response',
19
+ run: async (ctx) => {
20
+ // Main registered the desktop:__test:echo channel — call it via the bridged ipc.
21
+ const result = await window.desktop.ipc.invoke('desktop:__test:echo', { hello: 'from-renderer', n: 7 });
22
+ ctx.expect(result).toBeDefined();
23
+ ctx.expect(result.echoed).toEqual({ hello: 'from-renderer', n: 7 });
24
+ ctx.expect(typeof result.ts).toBe('number');
25
+ },
26
+ },
27
+ {
28
+ name: 'window.desktop.ipc.invoke: unhandled channel rejects',
29
+ run: async (ctx) => {
30
+ let threw;
31
+ try {
32
+ await window.desktop.ipc.invoke('desktop:__test:does-not-exist');
33
+ } catch (e) { threw = e; }
34
+ ctx.expect(threw).toBeDefined();
35
+ },
36
+ },
37
+ {
38
+ name: 'window.desktop.logger.log forwards to main where it can be read back',
39
+ run: async (ctx) => {
40
+ const marker = `__em_test_log_${Date.now()}_${Math.random()}`;
41
+ window.desktop.logger.log(marker, { extra: 'payload' });
42
+ // Give main a moment to receive (IPC send is async, no callback).
43
+ await new Promise((r) => setTimeout(r, 50));
44
+ const last = await window.desktop.ipc.invoke('desktop:__test:read-last-log');
45
+ ctx.expect(last).toBeDefined();
46
+ // The forwarded payload shape is `{ scope, level, args }` — verify our
47
+ // marker appears in the args. Don't tie to exact shape since the forwarder
48
+ // serializes via JSON for cloneability.
49
+ const serialized = JSON.stringify(last);
50
+ ctx.expect(serialized).toContain(marker);
51
+ },
52
+ },
53
+ {
54
+ name: 'window.desktop.logger.warn also forwards',
55
+ run: async (ctx) => {
56
+ const marker = `__em_test_warn_${Date.now()}_${Math.random()}`;
57
+ window.desktop.logger.warn(marker);
58
+ await new Promise((r) => setTimeout(r, 50));
59
+ const last = await window.desktop.ipc.invoke('desktop:__test:read-last-log');
60
+ const serialized = JSON.stringify(last);
61
+ ctx.expect(serialized).toContain(marker);
62
+ },
63
+ },
64
+ {
65
+ name: 'window.desktop.storage.set → window.desktop.storage.onChange fires across IPC',
66
+ run: async (ctx) => {
67
+ // Subscribe FIRST so we don't miss the broadcast.
68
+ const key = `__em_renderer_change_${Date.now()}`;
69
+ let received = null;
70
+ const off = window.desktop.storage.onChange(key, (payload) => { received = payload; });
71
+ try {
72
+ await window.desktop.storage.set(key, { changed: true });
73
+ // Allow the broadcast to round-trip back.
74
+ for (let i = 0; i < 20 && !received; i++) {
75
+ await new Promise((r) => setTimeout(r, 50));
76
+ }
77
+ ctx.expect(received).toBeDefined();
78
+ ctx.expect(received.key).toBe(key);
79
+ } finally {
80
+ off?.();
81
+ await window.desktop.storage.delete(key);
82
+ }
83
+ },
84
+ },
85
+ {
86
+ name: 'window.desktop.autoUpdater.getStatus round-trips main state',
87
+ run: async (ctx) => {
88
+ const status = await window.desktop.autoUpdater.getStatus();
89
+ ctx.expect(status).toBeDefined();
90
+ ctx.expect(['idle', 'checking', 'available', 'downloading', 'downloaded', 'not-available', 'error'])
91
+ .toContain(status.code);
92
+ },
93
+ },
94
+ {
95
+ name: 'window.desktop.autoUpdater.onStatus subscribes (returns unsub fn)',
96
+ run: (ctx) => {
97
+ // The status broadcasts from main are best-effort — outside dev-simulation mode
98
+ // the auto-updater may not transition during the test window. Just verify the
99
+ // subscription API works (returns an unsub function) — dev-simulation flow is
100
+ // exercised separately in main-layer auto-updater.test.js.
101
+ const off = window.desktop.autoUpdater.onStatus(() => {});
102
+ ctx.expect(typeof off).toBe('function');
103
+ off();
104
+ },
105
+ },
106
+ ],
107
+ });
@@ -0,0 +1,118 @@
1
+ // Renderer-layer suite — verifies the `window.desktop.theme` surface and the REAL
2
+ // propagation mechanism: main sets nativeTheme.themeSource → this renderer's
3
+ // `prefers-color-scheme` media query flips → matchMedia listeners fire.
4
+ //
5
+ // Runs inside a hidden BrowserWindow. Test bodies are reconstructed via
6
+ // `new Function('ctx', body)` — no closures over module scope, so each test
7
+ // inlines its own poll helper.
8
+ //
9
+ // The last test restores 'system' + clears the persisted override so the
10
+ // harness leaves no theme residue for later suites.
11
+
12
+ const defineCases = require('../../../vendor/devkit/test/define-cases.js');
13
+
14
+ module.exports = defineCases({
15
+ type: 'suite',
16
+ layer: 'renderer',
17
+ description: 'theme surface + matchMedia propagation',
18
+ tests: [
19
+ {
20
+ name: 'window.desktop.theme has get / set / onChange',
21
+ run: (ctx) => {
22
+ ctx.expect(typeof window.desktop.theme.get).toBe('function');
23
+ ctx.expect(typeof window.desktop.theme.set).toBe('function');
24
+ ctx.expect(typeof window.desktop.theme.onChange).toBe('function');
25
+ },
26
+ },
27
+ {
28
+ name: 'get() returns a { source, resolved } pair',
29
+ run: async (ctx) => {
30
+ const state = await window.desktop.theme.get();
31
+ ctx.expect(['system', 'light', 'dark'].includes(state.source)).toBe(true);
32
+ ctx.expect(['light', 'dark'].includes(state.resolved)).toBe(true);
33
+ },
34
+ },
35
+ {
36
+ name: 'set("dark") flips prefers-color-scheme in this renderer',
37
+ run: async (ctx) => {
38
+ const until = async (fn) => {
39
+ const t0 = Date.now();
40
+ while (!fn()) {
41
+ if (Date.now() - t0 > 3000) throw new Error('timed out waiting for media query flip');
42
+ await new Promise((r) => setTimeout(r, 25));
43
+ }
44
+ };
45
+ const media = window.matchMedia('(prefers-color-scheme: dark)');
46
+
47
+ const state = await window.desktop.theme.set('dark');
48
+ ctx.expect(state).toEqual({ source: 'dark', resolved: 'dark' });
49
+ await until(() => media.matches === true);
50
+ ctx.expect(media.matches).toBe(true);
51
+ },
52
+ },
53
+ {
54
+ name: 'set("light") flips it back',
55
+ run: async (ctx) => {
56
+ const until = async (fn) => {
57
+ const t0 = Date.now();
58
+ while (!fn()) {
59
+ if (Date.now() - t0 > 3000) throw new Error('timed out waiting for media query flip');
60
+ await new Promise((r) => setTimeout(r, 25));
61
+ }
62
+ };
63
+ const media = window.matchMedia('(prefers-color-scheme: dark)');
64
+
65
+ const state = await window.desktop.theme.set('light');
66
+ ctx.expect(state).toEqual({ source: 'light', resolved: 'light' });
67
+ await until(() => media.matches === false);
68
+ ctx.expect(media.matches).toBe(false);
69
+ },
70
+ },
71
+ {
72
+ name: 'onChange fires on a theme flip and unsubscribes cleanly',
73
+ run: async (ctx) => {
74
+ const events = [];
75
+ const unsub = window.desktop.theme.onChange((payload) => events.push(payload));
76
+
77
+ const current = await window.desktop.theme.get();
78
+ const target = current.resolved === 'dark' ? 'light' : 'dark';
79
+ await window.desktop.theme.set(target);
80
+
81
+ const t0 = Date.now();
82
+ while (events.length === 0) {
83
+ if (Date.now() - t0 > 3000) throw new Error('timed out waiting for onChange');
84
+ await new Promise((r) => setTimeout(r, 25));
85
+ }
86
+ ctx.expect(events[0]).toEqual({ resolved: target });
87
+
88
+ unsub();
89
+ const seen = events.length;
90
+ await window.desktop.theme.set(target === 'dark' ? 'light' : 'dark');
91
+ await new Promise((r) => setTimeout(r, 200));
92
+ ctx.expect(events.length).toBe(seen);
93
+ },
94
+ },
95
+ {
96
+ name: 'set() rejects invalid sources',
97
+ run: async (ctx) => {
98
+ let threw = false;
99
+ try {
100
+ await window.desktop.theme.set('midnight');
101
+ } catch (e) {
102
+ threw = true;
103
+ }
104
+ ctx.expect(threw).toBe(true);
105
+ },
106
+ },
107
+ {
108
+ name: 'restore: back to system + no persisted override left behind',
109
+ run: async (ctx) => {
110
+ const state = await window.desktop.theme.set('system');
111
+ ctx.expect(state.source).toBe('system');
112
+ await window.desktop.storage.delete('theme.appearance');
113
+ const has = await window.desktop.storage.has('theme.appearance');
114
+ ctx.expect(has).toBe(false);
115
+ },
116
+ },
117
+ ],
118
+ });
@@ -0,0 +1,166 @@
1
+ // Renderer-layer suite — verifies @omega.js/desktop's zero-setup Bootstrap tooltips: the
2
+ // prebuilt Bootstrap bundle (Popper inlined) loads, every
3
+ // `[data-bs-toggle="tooltip"]` element is auto-initialized (including ones
4
+ // inserted after boot), title changes update the live instance, and removal
5
+ // disposes it. Real DOM, real Bootstrap — the tip element actually renders.
6
+ //
7
+ // The harness wires the renderer Manager in the PRELOAD world (contextIsolation
8
+ // — see harness/renderer-preload.js), so instance-level assertions and the
9
+ // show trigger go through the `window.__emTestTooltip` probe (page-world
10
+ // synthetic mouse events can't reach preload-world listeners). Real
11
+ // hover-in-one-world behavior + `window.bootstrap` page exposure are covered
12
+ // by consumer boot suites.
13
+ //
14
+ // Runs inside a hidden BrowserWindow. Test bodies are reconstructed via
15
+ // `new Function('ctx', body)` — no closures over module scope, so each test
16
+ // inlines its own poll helper.
17
+
18
+ const defineCases = require('../../../vendor/devkit/test/define-cases.js');
19
+
20
+ module.exports = defineCases({
21
+ type: 'suite',
22
+ layer: 'renderer',
23
+ description: 'bootstrap tooltips auto-init',
24
+ tests: [
25
+ {
26
+ name: 'the Bootstrap bundle loads — Tooltip is available',
27
+ run: (ctx) => {
28
+ if (!window.__emTestTooltip.available()) {
29
+ throw new Error(`Bootstrap bundle failed to load: ${window.__emTestTooltip.error() || '(no require error — wiring bailed earlier)'}`);
30
+ }
31
+ ctx.expect(window.__emTestTooltip.available()).toBe(true);
32
+ },
33
+ },
34
+ {
35
+ name: 'an inserted [data-bs-toggle="tooltip"] element is auto-initialized and renders its title',
36
+ run: async (ctx) => {
37
+ const until = async (fn) => {
38
+ const t0 = Date.now();
39
+ while (!fn()) {
40
+ if (Date.now() - t0 > 3000) throw new Error('timed out waiting for tooltip');
41
+ await new Promise((r) => setTimeout(r, 25));
42
+ }
43
+ };
44
+
45
+ const el = document.createElement('button');
46
+ el.type = 'button';
47
+ el.id = 'tt-show';
48
+ el.setAttribute('data-bs-toggle', 'tooltip');
49
+ el.setAttribute('data-bs-title', 'Hello from @omega.js/desktop');
50
+ el.textContent = 'hover me';
51
+ document.body.appendChild(el);
52
+
53
+ // The auto-init observer creates the instance without any consumer code.
54
+ await until(() => window.__emTestTooltip.hasInstance('tt-show'));
55
+
56
+ const shown = window.__emTestTooltip.showDirect('tt-show');
57
+ ctx.expect(shown).toBe(true);
58
+ await until(() => document.querySelector('.tooltip .tooltip-inner'));
59
+ ctx.expect(document.querySelector('.tooltip .tooltip-inner').textContent).toBe('Hello from @omega.js/desktop');
60
+
61
+ // Removing the host while shown must clean up the tip (dispose path).
62
+ el.remove();
63
+ await until(() => !document.querySelector('.tooltip'));
64
+ },
65
+ },
66
+ {
67
+ name: 'changing data-bs-title updates the live instance',
68
+ run: async (ctx) => {
69
+ const until = async (fn) => {
70
+ const t0 = Date.now();
71
+ while (!fn()) {
72
+ if (Date.now() - t0 > 3000) throw new Error('timed out waiting for tooltip');
73
+ await new Promise((r) => setTimeout(r, 25));
74
+ }
75
+ };
76
+
77
+ const el = document.createElement('button');
78
+ el.type = 'button';
79
+ el.id = 'tt-retitle';
80
+ el.setAttribute('data-bs-toggle', 'tooltip');
81
+ el.setAttribute('data-bs-title', 'before');
82
+ document.body.appendChild(el);
83
+ await until(() => window.__emTestTooltip.hasInstance('tt-retitle'));
84
+
85
+ el.setAttribute('data-bs-title', 'after');
86
+ // The observer applies setContent asynchronously (mutation microtask) —
87
+ // give it a beat, then show and assert the rendered text.
88
+ await new Promise((r) => setTimeout(r, 100));
89
+ ctx.expect(window.__emTestTooltip.showDirect('tt-retitle')).toBe(true);
90
+ await until(() => document.querySelector('.tooltip .tooltip-inner'));
91
+ ctx.expect(document.querySelector('.tooltip .tooltip-inner').textContent).toBe('after');
92
+
93
+ el.remove();
94
+ await until(() => !document.querySelector('.tooltip'));
95
+ },
96
+ },
97
+ {
98
+ name: 'a title-only host initializes ONCE and the renderer stays responsive (the observer/dispose loop regression)',
99
+ run: async (ctx) => {
100
+ const until = async (fn) => {
101
+ const t0 = Date.now();
102
+ while (!fn()) {
103
+ if (Date.now() - t0 > 3000) throw new Error('timed out waiting for tooltip');
104
+ await new Promise((r) => setTimeout(r, 25));
105
+ }
106
+ };
107
+
108
+ // A host with a PLAIN `title` (no data-bs-title): Bootstrap's
109
+ // constructor MOVES title → data-bs-original-title, which the
110
+ // observer must read as a live title — reading only title/
111
+ // data-bs-title made it dispose (which RESTORES title) and re-init
112
+ // forever: a MutationObserver microtask storm that froze the whole
113
+ // renderer (found by Somiibo's session-limits boot suite).
114
+ const el = document.createElement('button');
115
+ el.type = 'button';
116
+ el.id = 'tt-title-only';
117
+ el.setAttribute('data-bs-toggle', 'tooltip');
118
+ el.setAttribute('title', 'plain title');
119
+ document.body.appendChild(el);
120
+
121
+ await until(() => window.__emTestTooltip.hasInstance('tt-title-only'));
122
+
123
+ // The loop starved macrotasks — a timer firing IS the proof the
124
+ // main thread survived the mutation settling.
125
+ const responsive = await new Promise((resolve) => setTimeout(() => resolve(true), 150));
126
+ ctx.expect(responsive).toBe(true);
127
+
128
+ // Stable end state: title moved into Bootstrap's bookkeeping, the
129
+ // instance alive, and the tip renders the original text.
130
+ ctx.expect(el.hasAttribute('title')).toBe(false);
131
+ ctx.expect(el.getAttribute('data-bs-original-title')).toBe('plain title');
132
+ ctx.expect(window.__emTestTooltip.hasInstance('tt-title-only')).toBe(true);
133
+ ctx.expect(window.__emTestTooltip.showDirect('tt-title-only')).toBe(true);
134
+ await until(() => document.querySelector('.tooltip .tooltip-inner'));
135
+ ctx.expect(document.querySelector('.tooltip .tooltip-inner').textContent).toBe('plain title');
136
+
137
+ el.remove();
138
+ await until(() => !document.querySelector('.tooltip'));
139
+ },
140
+ },
141
+ {
142
+ name: 'removing a tooltip host disposes its instance',
143
+ run: async (ctx) => {
144
+ const until = async (fn) => {
145
+ const t0 = Date.now();
146
+ while (!fn()) {
147
+ if (Date.now() - t0 > 3000) throw new Error('timed out waiting for tooltip lifecycle');
148
+ await new Promise((r) => setTimeout(r, 25));
149
+ }
150
+ };
151
+
152
+ const el = document.createElement('button');
153
+ el.type = 'button';
154
+ el.id = 'tt-dispose';
155
+ el.setAttribute('data-bs-toggle', 'tooltip');
156
+ el.setAttribute('data-bs-title', 'bye');
157
+ document.body.appendChild(el);
158
+ await until(() => window.__emTestTooltip.hasInstance('tt-dispose'));
159
+
160
+ el.remove();
161
+ await until(() => !window.__emTestTooltip.hasInstance('tt-dispose'));
162
+ ctx.expect(window.__emTestTooltip.hasInstance('tt-dispose')).toBe(false);
163
+ },
164
+ },
165
+ ],
166
+ });
@@ -0,0 +1,100 @@
1
+ // Renderer-layer suite — verifies the verts auto-bind (ads-system phase 4):
2
+ // a `[data-omega-vert]` element inserted into the live DOM is picked up by
3
+ // renderer.js's MutationObserver wiring and handed to @omega.js/client's verts
4
+ // module with the type pinned to 'house'. The harness preload seeds an
5
+ // AdSense client into the config ON PURPOSE and no inhouse source — proving
6
+ // the pin: the provider lane must never be attempted (no adsbygoogle script,
7
+ // no <ins>), and the source-less house render collapses the host.
8
+ //
9
+ // Runs inside a hidden BrowserWindow. Test bodies are reconstructed via
10
+ // `new Function('ctx', body)` — no closures over module scope, so each test
11
+ // inlines its own poll helper. The binding marker (data-omega-vert-bound) is a
12
+ // DOM attribute because preload-world expandos don't cross contextIsolation.
13
+
14
+ const defineCases = require('../../../vendor/devkit/test/define-cases.js');
15
+
16
+ module.exports = defineCases({
17
+ type: 'suite',
18
+ layer: 'renderer',
19
+ description: 'verts auto-bind — live [data-omega-vert] binding, house-lane pin',
20
+ tests: [
21
+ {
22
+ name: 'an inserted [data-omega-vert] element gets bound to the house lane',
23
+ run: async (ctx) => {
24
+ const until = async (fn) => {
25
+ const t0 = Date.now();
26
+ while (!fn()) {
27
+ if (Date.now() - t0 > 3000) throw new Error('timed out waiting for ad binding');
28
+ await new Promise((r) => setTimeout(r, 25));
29
+ }
30
+ };
31
+
32
+ const el = document.createElement('div');
33
+ el.setAttribute('data-omega-vert', 'display');
34
+ el.setAttribute('data-omega-vert-size', 'banner');
35
+ document.body.appendChild(el);
36
+
37
+ await until(() => el.dataset.omegaVertBound);
38
+ ctx.expect(el.dataset.omegaVertBound).toBe('house');
39
+ el.remove();
40
+ },
41
+ },
42
+ {
43
+ name: 'descendants of an inserted subtree bind too',
44
+ run: async (ctx) => {
45
+ const until = async (fn) => {
46
+ const t0 = Date.now();
47
+ while (!fn()) {
48
+ if (Date.now() - t0 > 3000) throw new Error('timed out waiting for ad binding');
49
+ await new Promise((r) => setTimeout(r, 25));
50
+ }
51
+ };
52
+
53
+ const wrap = document.createElement('div');
54
+ wrap.innerHTML = '<section><div id="vertInner" data-omega-vert></div></section>';
55
+ document.body.appendChild(wrap);
56
+
57
+ const inner = document.getElementById('vertInner');
58
+ await until(() => inner.dataset.omegaVertBound);
59
+ ctx.expect(inner.dataset.omegaVertBound).toBe('house');
60
+ wrap.remove();
61
+ },
62
+ },
63
+ {
64
+ name: 'the provider lane is never attempted — no adsbygoogle script or <ins> despite a configured AdSense client',
65
+ run: async (ctx) => {
66
+ const until = async (fn) => {
67
+ const t0 = Date.now();
68
+ while (!fn()) {
69
+ if (Date.now() - t0 > 3000) throw new Error('timed out waiting for ad binding');
70
+ await new Promise((r) => setTimeout(r, 25));
71
+ }
72
+ };
73
+
74
+ const el = document.createElement('div');
75
+ el.setAttribute('data-omega-vert', 'display');
76
+ document.body.appendChild(el);
77
+ await until(() => el.dataset.omegaVertBound);
78
+
79
+ // Give any (wrong) provider-lane attempt a beat to surface, then
80
+ // assert the AdSense machinery never touched the page.
81
+ await new Promise((r) => setTimeout(r, 300));
82
+ ctx.expect(document.querySelector('script[src*="adsbygoogle"]')).toBe(null);
83
+ ctx.expect(document.querySelector('ins.adsbygoogle')).toBe(null);
84
+ el.remove();
85
+ },
86
+ },
87
+ {
88
+ name: 'elements without data-omega-vert are untouched',
89
+ run: async (ctx) => {
90
+ const el = document.createElement('div');
91
+ el.className = 'not-an-ad';
92
+ document.body.appendChild(el);
93
+
94
+ await new Promise((r) => setTimeout(r, 200));
95
+ ctx.expect(el.hasAttribute('data-omega-vert-bound')).toBe(false);
96
+ el.remove();
97
+ },
98
+ },
99
+ ],
100
+ });