@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.
- package/LICENSE +98 -0
- package/README.md +166 -0
- package/bin/omega +2 -0
- package/bin/omega-desktop +2 -0
- package/bin/omg +2 -0
- package/dist/assets/css/core/_fontawesome.scss +146 -0
- package/dist/assets/css/core/_initialize.scss +38 -0
- package/dist/assets/css/omega-desktop.scss +39 -0
- package/dist/assets/css/shell/_index.scss +207 -0
- package/dist/assets/css/tokens/_index.scss +166 -0
- package/dist/assets/js/bootstrap.bundle.js +1 -0
- package/dist/assets/js/core/app-shell.js +136 -0
- package/dist/assets/themes/_template/README.md +115 -0
- package/dist/assets/themes/_template/_config.scss +60 -0
- package/dist/assets/themes/_template/_theme.js +14 -0
- package/dist/assets/themes/_template/_theme.scss +28 -0
- package/dist/assets/themes/_template/css/base/_root.scss +19 -0
- package/dist/assets/themes/_template/css/components/_components.scss +23 -0
- package/dist/assets/themes/base/README.md +5 -0
- package/dist/assets/themes/base/_components/data/org-chart/component.html +33 -0
- package/dist/assets/themes/base/_components/data/org-chart/component.json5 +33 -0
- package/dist/assets/themes/base/_components/data/org-chart/component.scss +183 -0
- package/dist/assets/themes/base/_components/heading/masthead/component.html +22 -0
- package/dist/assets/themes/base/_components/heading/masthead/component.json5 +30 -0
- package/dist/assets/themes/base/_components/heading/section-head/component.html +18 -0
- package/dist/assets/themes/base/_components/heading/section-head/component.json5 +27 -0
- package/dist/assets/themes/base/_components/pricing/features/component.html +29 -0
- package/dist/assets/themes/base/_components/pricing/features/component.json5 +30 -0
- package/dist/assets/themes/base/_hero/orbit/index.html +30 -0
- package/dist/assets/themes/base/_hero/orbit/script.js +33 -0
- package/dist/assets/themes/base/_hero/orbit/style.scss +133 -0
- package/dist/assets/themes/base/_includes/admin/sections/sidebar.html +3 -0
- package/dist/assets/themes/base/_includes/admin/sections/topbar.html +3 -0
- package/dist/assets/themes/base/_includes/backend/sections/sidebar.html +3 -0
- package/dist/assets/themes/base/_includes/backend/sections/topbar.html +3 -0
- package/dist/assets/themes/base/_includes/frontend/components/connection-card.html +49 -0
- package/dist/assets/themes/base/_includes/frontend/components/post-card.html +54 -0
- package/dist/assets/themes/base/_includes/frontend/sections/account-connections.html +42 -0
- package/dist/assets/themes/base/_includes/frontend/sections/account-section-header.html +11 -0
- package/dist/assets/themes/base/_includes/frontend/sections/footer.html +154 -0
- package/dist/assets/themes/base/_includes/frontend/sections/nav.html +276 -0
- package/dist/assets/themes/base/_includes/global/sections/account.html +72 -0
- package/dist/assets/themes/base/_includes/global/sections/app-sidebar.html +248 -0
- package/dist/assets/themes/base/_includes/global/sections/app-topbar.html +228 -0
- package/dist/assets/themes/base/_includes/global/sections/page-header.html +99 -0
- package/dist/assets/themes/base/_layouts/admin/core/minimal-viewport-locked.html +22 -0
- package/dist/assets/themes/base/_layouts/admin/core/minimal.html +23 -0
- package/dist/assets/themes/base/_layouts/backend/core/base.html +57 -0
- package/dist/assets/themes/base/_layouts/backend/core/minimal-viewport-locked.html +32 -0
- package/dist/assets/themes/base/_layouts/backend/core/minimal.html +32 -0
- package/dist/assets/themes/base/_layouts/backend/pages/dashboard/index.html +230 -0
- package/dist/assets/themes/base/_layouts/frontend/core/base.html +31 -0
- package/dist/assets/themes/base/_layouts/frontend/core/cover.html +40 -0
- package/dist/assets/themes/base/_layouts/frontend/core/minimal.html +47 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/404.html +54 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/about.html +144 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/account/index.html +2104 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/alternatives/alternative.html +319 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/alternatives/index.html +186 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/app.html +142 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/auth/reset.html +53 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/auth/signin.html +90 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/auth/signup.html +141 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/auth/token.html +44 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/blog/categories/category.html +88 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/blog/categories/index.html +88 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/blog/index.html +255 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/blog/post.html +261 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/blog/tags/index.html +84 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/blog/tags/tag.html +88 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/collection/category.html +72 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/collection/document.html +54 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/collection/index.html +84 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/connections/callback.html +55 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/contact.html +214 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/download.html +793 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/extension/index.html +253 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/extension/installed.html +198 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/feedback.html +171 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/index.html +66 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/legal/document.html +78 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/payment/checkout.html +459 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/payment/confirmation.html +131 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/portal/email-preferences.html +104 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/pricing.html +596 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/status.html +361 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/team/index.html +210 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/team/member.html +125 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/updates/index.html +119 -0
- package/dist/assets/themes/base/_layouts/frontend/pages/updates/update.html +118 -0
- package/dist/assets/themes/base/_sections/about/hero/section.html +68 -0
- package/dist/assets/themes/base/_sections/about/hero/section.json5 +58 -0
- package/dist/assets/themes/base/_sections/about/letter/section.html +60 -0
- package/dist/assets/themes/base/_sections/about/letter/section.json5 +56 -0
- package/dist/assets/themes/base/_sections/about/photo-band/section.html +24 -0
- package/dist/assets/themes/base/_sections/about/photo-band/section.json5 +23 -0
- package/dist/assets/themes/base/_sections/about/principles/section.html +17 -0
- package/dist/assets/themes/base/_sections/about/principles/section.json5 +34 -0
- package/dist/assets/themes/base/_sections/about/timeline/section.html +20 -0
- package/dist/assets/themes/base/_sections/about/timeline/section.json5 +34 -0
- package/dist/assets/themes/base/_sections/marketing/bento/section.html +91 -0
- package/dist/assets/themes/base/_sections/marketing/bento/section.json5 +152 -0
- package/dist/assets/themes/base/_sections/marketing/cta/section.html +44 -0
- package/dist/assets/themes/base/_sections/marketing/cta/section.json5 +47 -0
- package/dist/assets/themes/base/_sections/marketing/faq/section.html +52 -0
- package/dist/assets/themes/base/_sections/marketing/faq/section.json5 +68 -0
- package/dist/assets/themes/base/_sections/marketing/hero/section.html +349 -0
- package/dist/assets/themes/base/_sections/marketing/hero/section.json5 +335 -0
- package/dist/assets/themes/base/_sections/marketing/newsletter-cta/section.html +38 -0
- package/dist/assets/themes/base/_sections/marketing/newsletter-cta/section.js +86 -0
- package/dist/assets/themes/base/_sections/marketing/newsletter-cta/section.json5 +29 -0
- package/dist/assets/themes/base/_sections/marketing/pricing-cards/section.html +115 -0
- package/dist/assets/themes/base/_sections/marketing/pricing-cards/section.json5 +72 -0
- package/dist/assets/themes/base/_sections/marketing/product-demo/section.html +62 -0
- package/dist/assets/themes/base/_sections/marketing/product-demo/section.js +44 -0
- package/dist/assets/themes/base/_sections/marketing/product-demo/section.json5 +52 -0
- package/dist/assets/themes/base/_sections/marketing/prose/section.html +22 -0
- package/dist/assets/themes/base/_sections/marketing/prose/section.json5 +41 -0
- package/dist/assets/themes/base/_sections/marketing/showcase/section.html +35 -0
- package/dist/assets/themes/base/_sections/marketing/showcase/section.json5 +52 -0
- package/dist/assets/themes/base/_sections/marketing/stats/section.html +32 -0
- package/dist/assets/themes/base/_sections/marketing/stats/section.json5 +44 -0
- package/dist/assets/themes/base/_sections/marketing/testimonials/section.html +54 -0
- package/dist/assets/themes/base/_sections/marketing/testimonials/section.json5 +70 -0
- package/dist/assets/themes/base/_sections/marketing/trusted-by/section.html +30 -0
- package/dist/assets/themes/base/_sections/marketing/trusted-by/section.json5 +38 -0
- package/dist/assets/themes/base/_sections/verts/unit/section.html +7 -0
- package/dist/assets/themes/base/_sections/verts/unit/section.js +22 -0
- package/dist/assets/themes/base/_sections/verts/unit/section.json5 +24 -0
- package/dist/assets/themes/base/_sections/verts/unit/section.scss +24 -0
- package/dist/assets/themes/base/_theme.js +13 -0
- package/dist/assets/themes/base/_theme.scss +4 -0
- package/dist/assets/themes/bootstrap/_theme.js +16 -0
- package/dist/assets/themes/bootstrap/_theme.scss +11 -0
- package/dist/assets/themes/bootstrap/js/index.esm.js +19 -0
- package/dist/assets/themes/bootstrap/js/index.umd.js +34 -0
- package/dist/assets/themes/bootstrap/js/src/alert.js +87 -0
- package/dist/assets/themes/bootstrap/js/src/base-component.js +86 -0
- package/dist/assets/themes/bootstrap/js/src/button.js +72 -0
- package/dist/assets/themes/bootstrap/js/src/carousel.js +474 -0
- package/dist/assets/themes/bootstrap/js/src/collapse.js +297 -0
- package/dist/assets/themes/bootstrap/js/src/dom/data.js +55 -0
- package/dist/assets/themes/bootstrap/js/src/dom/event-handler.js +317 -0
- package/dist/assets/themes/bootstrap/js/src/dom/manipulator.js +71 -0
- package/dist/assets/themes/bootstrap/js/src/dom/selector-engine.js +126 -0
- package/dist/assets/themes/bootstrap/js/src/dropdown.js +458 -0
- package/dist/assets/themes/bootstrap/js/src/modal.js +378 -0
- package/dist/assets/themes/bootstrap/js/src/offcanvas.js +282 -0
- package/dist/assets/themes/bootstrap/js/src/popover.js +97 -0
- package/dist/assets/themes/bootstrap/js/src/scrollspy.js +296 -0
- package/dist/assets/themes/bootstrap/js/src/tab.js +315 -0
- package/dist/assets/themes/bootstrap/js/src/toast.js +224 -0
- package/dist/assets/themes/bootstrap/js/src/tooltip.js +632 -0
- package/dist/assets/themes/bootstrap/js/src/util/backdrop.js +151 -0
- package/dist/assets/themes/bootstrap/js/src/util/component-functions.js +35 -0
- package/dist/assets/themes/bootstrap/js/src/util/config.js +65 -0
- package/dist/assets/themes/bootstrap/js/src/util/focustrap.js +115 -0
- package/dist/assets/themes/bootstrap/js/src/util/index.js +306 -0
- package/dist/assets/themes/bootstrap/js/src/util/sanitizer.js +117 -0
- package/dist/assets/themes/bootstrap/js/src/util/scrollbar.js +114 -0
- package/dist/assets/themes/bootstrap/js/src/util/swipe.js +146 -0
- package/dist/assets/themes/bootstrap/js/src/util/template-factory.js +160 -0
- package/dist/assets/themes/bootstrap/overrides/_accordion.scss +21 -0
- package/dist/assets/themes/bootstrap/overrides/_avatars.scss +51 -0
- package/dist/assets/themes/bootstrap/overrides/_blog-images.scss +45 -0
- package/dist/assets/themes/bootstrap/overrides/_buttons-adaptive.scss +141 -0
- package/dist/assets/themes/bootstrap/overrides/_color-shades.scss +25 -0
- package/dist/assets/themes/bootstrap/overrides/_cursor-utilities.scss +13 -0
- package/dist/assets/themes/bootstrap/overrides/_index.scss +30 -0
- package/dist/assets/themes/bootstrap/overrides/_links.scss +26 -0
- package/dist/assets/themes/bootstrap/overrides/_soft-colors.scss +99 -0
- package/dist/assets/themes/bootstrap/overrides/_spacing-extended.scss +74 -0
- package/dist/assets/themes/bootstrap/overrides/_spinners.scss +22 -0
- package/dist/assets/themes/bootstrap/overrides/_typography-utilities.scss +40 -0
- package/dist/assets/themes/bootstrap/scss/_accordion.scss +153 -0
- package/dist/assets/themes/bootstrap/scss/_alert.scss +68 -0
- package/dist/assets/themes/bootstrap/scss/_badge.scss +38 -0
- package/dist/assets/themes/bootstrap/scss/_breadcrumb.scss +40 -0
- package/dist/assets/themes/bootstrap/scss/_button-group.scss +147 -0
- package/dist/assets/themes/bootstrap/scss/_buttons.scss +216 -0
- package/dist/assets/themes/bootstrap/scss/_card.scss +238 -0
- package/dist/assets/themes/bootstrap/scss/_carousel.scss +226 -0
- package/dist/assets/themes/bootstrap/scss/_close.scss +66 -0
- package/dist/assets/themes/bootstrap/scss/_containers.scss +41 -0
- package/dist/assets/themes/bootstrap/scss/_dropdown.scss +250 -0
- package/dist/assets/themes/bootstrap/scss/_forms.scss +9 -0
- package/dist/assets/themes/bootstrap/scss/_functions.scss +302 -0
- package/dist/assets/themes/bootstrap/scss/_grid.scss +39 -0
- package/dist/assets/themes/bootstrap/scss/_helpers.scss +12 -0
- package/dist/assets/themes/bootstrap/scss/_images.scss +42 -0
- package/dist/assets/themes/bootstrap/scss/_list-group.scss +199 -0
- package/dist/assets/themes/bootstrap/scss/_maps.scss +174 -0
- package/dist/assets/themes/bootstrap/scss/_mixins.scss +42 -0
- package/dist/assets/themes/bootstrap/scss/_modal.scss +240 -0
- package/dist/assets/themes/bootstrap/scss/_nav.scss +197 -0
- package/dist/assets/themes/bootstrap/scss/_navbar.scss +289 -0
- package/dist/assets/themes/bootstrap/scss/_offcanvas.scss +147 -0
- package/dist/assets/themes/bootstrap/scss/_pagination.scss +109 -0
- package/dist/assets/themes/bootstrap/scss/_placeholders.scss +51 -0
- package/dist/assets/themes/bootstrap/scss/_popover.scss +196 -0
- package/dist/assets/themes/bootstrap/scss/_progress.scss +68 -0
- package/dist/assets/themes/bootstrap/scss/_reboot.scss +611 -0
- package/dist/assets/themes/bootstrap/scss/_root.scss +187 -0
- package/dist/assets/themes/bootstrap/scss/_spinners.scss +85 -0
- package/dist/assets/themes/bootstrap/scss/_tables.scss +171 -0
- package/dist/assets/themes/bootstrap/scss/_toasts.scss +73 -0
- package/dist/assets/themes/bootstrap/scss/_tooltip.scss +119 -0
- package/dist/assets/themes/bootstrap/scss/_transitions.scss +27 -0
- package/dist/assets/themes/bootstrap/scss/_type.scss +106 -0
- package/dist/assets/themes/bootstrap/scss/_utilities.scss +806 -0
- package/dist/assets/themes/bootstrap/scss/_variables-dark.scss +102 -0
- package/dist/assets/themes/bootstrap/scss/_variables.scss +1753 -0
- package/dist/assets/themes/bootstrap/scss/bootstrap-grid.scss +62 -0
- package/dist/assets/themes/bootstrap/scss/bootstrap-reboot.scss +10 -0
- package/dist/assets/themes/bootstrap/scss/bootstrap-utilities.scss +19 -0
- package/dist/assets/themes/bootstrap/scss/bootstrap.scss +52 -0
- package/dist/assets/themes/bootstrap/scss/forms/_floating-labels.scss +97 -0
- package/dist/assets/themes/bootstrap/scss/forms/_form-check.scss +189 -0
- package/dist/assets/themes/bootstrap/scss/forms/_form-control.scss +214 -0
- package/dist/assets/themes/bootstrap/scss/forms/_form-range.scss +91 -0
- package/dist/assets/themes/bootstrap/scss/forms/_form-select.scss +80 -0
- package/dist/assets/themes/bootstrap/scss/forms/_form-text.scss +11 -0
- package/dist/assets/themes/bootstrap/scss/forms/_input-group.scss +132 -0
- package/dist/assets/themes/bootstrap/scss/forms/_labels.scss +36 -0
- package/dist/assets/themes/bootstrap/scss/forms/_validation.scss +12 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_clearfix.scss +3 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_color-bg.scss +7 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_colored-links.scss +30 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_focus-ring.scss +5 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_icon-link.scss +25 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_position.scss +36 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_ratio.scss +26 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_stacks.scss +15 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_stretched-link.scss +15 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_text-truncation.scss +7 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_visually-hidden.scss +8 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_vr.scss +8 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_alert.scss +18 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_backdrop.scss +14 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_banner.scss +7 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_border-radius.scss +78 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_box-shadow.scss +18 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_breakpoints.scss +127 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_buttons.scss +70 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_caret.scss +69 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_clearfix.scss +9 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_color-mode.scss +21 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_color-scheme.scss +7 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_container.scss +11 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_deprecate.scss +10 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_forms.scss +163 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_gradients.scss +47 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_grid.scss +151 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_image.scss +16 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_list-group.scss +26 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_lists.scss +7 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_pagination.scss +10 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_reset-text.scss +17 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_resize.scss +6 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_table-variants.scss +24 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_text-truncate.scss +8 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_transition.scss +26 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_utilities.scss +97 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_visually-hidden.scss +38 -0
- package/dist/assets/themes/bootstrap/scss/tests/jasmine.js +16 -0
- package/dist/assets/themes/bootstrap/scss/tests/mixins/_auto-import-of-variables-dark.test.scss +7 -0
- package/dist/assets/themes/bootstrap/scss/tests/mixins/_color-modes.test.scss +69 -0
- package/dist/assets/themes/bootstrap/scss/tests/mixins/_media-query-color-mode-full.test.scss +8 -0
- package/dist/assets/themes/bootstrap/scss/tests/mixins/_utilities.test.scss +393 -0
- package/dist/assets/themes/bootstrap/scss/tests/sass-true/register.js +14 -0
- package/dist/assets/themes/bootstrap/scss/tests/sass-true/runner.js +17 -0
- package/dist/assets/themes/bootstrap/scss/tests/utilities/_api.test.scss +75 -0
- package/dist/assets/themes/bootstrap/scss/utilities/_api.scss +47 -0
- package/dist/assets/themes/bootstrap/scss/vendor/_rfs.scss +348 -0
- package/dist/assets/themes/classy/README.md +89 -0
- package/dist/assets/themes/classy/_config.scss +245 -0
- package/dist/assets/themes/classy/_theme.js +31 -0
- package/dist/assets/themes/classy/_theme.scss +57 -0
- package/dist/assets/themes/classy/css/app/_panels.scss +183 -0
- package/dist/assets/themes/classy/css/base/_fonts.scss +79 -0
- package/dist/assets/themes/classy/css/base/_no-raise.scss +49 -0
- package/dist/assets/themes/classy/css/base/_root.scss +113 -0
- package/dist/assets/themes/classy/css/base/_typography.scss +154 -0
- package/dist/assets/themes/classy/css/base/_utilities.scss +284 -0
- package/dist/assets/themes/classy/css/components/_alerts.scss +51 -0
- package/dist/assets/themes/classy/css/components/_badges.scss +46 -0
- package/dist/assets/themes/classy/css/components/_buttons.scss +175 -0
- package/dist/assets/themes/classy/css/components/_cards.scss +41 -0
- package/dist/assets/themes/classy/css/components/_dropdowns.scss +48 -0
- package/dist/assets/themes/classy/css/components/_forms.scss +171 -0
- package/dist/assets/themes/classy/css/components/_receipt.scss +45 -0
- package/dist/assets/themes/classy/css/layout/_footer.scss +298 -0
- package/dist/assets/themes/classy/css/layout/_general.scss +209 -0
- package/dist/assets/themes/classy/css/layout/_nav.scss +154 -0
- package/dist/assets/themes/classy/css/layout/_shell.scss +458 -0
- package/dist/assets/themes/classy/css/marketing/_bento.scss +238 -0
- package/dist/assets/themes/classy/css/marketing/_content.scss +1328 -0
- package/dist/assets/themes/classy/css/marketing/_downloads.scss +246 -0
- package/dist/assets/themes/classy/css/marketing/_hero.scss +311 -0
- package/dist/assets/themes/classy/css/marketing/_sections.scss +649 -0
- package/dist/assets/themes/classy/css/pages/404/index.scss +67 -0
- package/dist/assets/themes/classy/css/pages/_auth.scss +235 -0
- package/dist/assets/themes/classy/css/pages/admin/firebase/index.scss +22 -0
- package/dist/assets/themes/classy/css/pages/blog/[slug].scss +56 -0
- package/dist/assets/themes/classy/css/pages/cookies.scss +2 -0
- package/dist/assets/themes/classy/css/pages/dashboard/account/index.scss +31 -0
- package/dist/assets/themes/classy/css/pages/feedback/index.scss +39 -0
- package/dist/assets/themes/classy/css/pages/legal/_document.scss +192 -0
- package/dist/assets/themes/classy/css/pages/payment/checkout/index.scss +585 -0
- package/dist/assets/themes/classy/css/pages/payment/confirmation/index.scss +9 -0
- package/dist/assets/themes/classy/css/pages/privacy.scss +2 -0
- package/dist/assets/themes/classy/css/pages/status/index.scss +164 -0
- package/dist/assets/themes/classy/css/pages/terms.scss +2 -0
- package/dist/assets/themes/classy/css/pages/updates/index.scss +128 -0
- package/dist/assets/themes/classy/fonts/inter-italic-latin-ext.woff2 +0 -0
- package/dist/assets/themes/classy/fonts/inter-italic-latin.woff2 +0 -0
- package/dist/assets/themes/classy/fonts/inter-normal-latin-ext.woff2 +0 -0
- package/dist/assets/themes/classy/fonts/inter-normal-latin.woff2 +0 -0
- package/dist/assets/themes/classy/fonts/newsreader-italic-latin-ext.woff2 +0 -0
- package/dist/assets/themes/classy/fonts/newsreader-italic-latin.woff2 +0 -0
- package/dist/assets/themes/classy/fonts/newsreader-normal-latin-ext.woff2 +0 -0
- package/dist/assets/themes/classy/fonts/newsreader-normal-latin.woff2 +0 -0
- package/dist/assets/themes/classy/js/hero-demo-form.js +56 -0
- package/dist/assets/themes/neobrutalism/README.md +118 -0
- package/dist/assets/themes/neobrutalism/_config.scss +139 -0
- package/dist/assets/themes/neobrutalism/_layouts/frontend/core/base.html +30 -0
- package/dist/assets/themes/neobrutalism/_layouts/frontend/pages/index.html +275 -0
- package/dist/assets/themes/neobrutalism/_theme.js +24 -0
- package/dist/assets/themes/neobrutalism/_theme.scss +61 -0
- package/dist/assets/themes/neobrutalism/css/base/_mixins.scss +46 -0
- package/dist/assets/themes/neobrutalism/css/base/_root.scss +169 -0
- package/dist/assets/themes/neobrutalism/css/base/_typography.scss +61 -0
- package/dist/assets/themes/neobrutalism/css/base/_utilities.scss +89 -0
- package/dist/assets/themes/neobrutalism/css/components/_billing-toggle.scss +74 -0
- package/dist/assets/themes/neobrutalism/css/components/_buttons.scss +148 -0
- package/dist/assets/themes/neobrutalism/css/components/_cards.scss +47 -0
- package/dist/assets/themes/neobrutalism/css/components/_forms.scss +88 -0
- package/dist/assets/themes/neobrutalism/css/components/_marketing.scss +244 -0
- package/dist/assets/themes/neobrutalism/css/layout/_general.scss +213 -0
- package/dist/assets/themes/neobrutalism/css/layout/_navigation.scss +171 -0
- package/dist/assets/themes/neobrutalism/css/pages/index.scss +203 -0
- package/dist/assets/themes/neobrutalism/css/pages/pricing/index.scss +58 -0
- package/dist/assets/themes/neobrutalism/css/pages/test/libraries/layers/index.scss +7 -0
- package/dist/assets/themes/neobrutalism/js/pages/test/libraries/layers/index.js +9 -0
- package/dist/assets/themes/newsflash/README.md +117 -0
- package/dist/assets/themes/newsflash/_components/heading/lede/component.html +14 -0
- package/dist/assets/themes/newsflash/_components/heading/lede/component.json5 +23 -0
- package/dist/assets/themes/newsflash/_components/heading/rule-head/component.html +17 -0
- package/dist/assets/themes/newsflash/_components/heading/rule-head/component.json5 +23 -0
- package/dist/assets/themes/newsflash/_components/news/byline/component.html +12 -0
- package/dist/assets/themes/newsflash/_components/news/byline/component.json5 +18 -0
- package/dist/assets/themes/newsflash/_components/news/story-card/component.html +25 -0
- package/dist/assets/themes/newsflash/_components/news/story-card/component.json5 +21 -0
- package/dist/assets/themes/newsflash/_config.scss +147 -0
- package/dist/assets/themes/newsflash/_layouts/frontend/core/base.html +51 -0
- package/dist/assets/themes/newsflash/_layouts/frontend/pages/blog/index.html +299 -0
- package/dist/assets/themes/newsflash/_layouts/frontend/pages/blog/post.html +235 -0
- package/dist/assets/themes/newsflash/_layouts/frontend/pages/index.html +328 -0
- package/dist/assets/themes/newsflash/_sections/marketing/desks/section.html +39 -0
- package/dist/assets/themes/newsflash/_sections/marketing/desks/section.json5 +49 -0
- package/dist/assets/themes/newsflash/_sections/marketing/newsletter-cta/section.html +103 -0
- package/dist/assets/themes/newsflash/_sections/marketing/newsletter-cta/section.json5 +50 -0
- package/dist/assets/themes/newsflash/_sections/marketing/rundown/section.html +28 -0
- package/dist/assets/themes/newsflash/_sections/marketing/rundown/section.json5 +40 -0
- package/dist/assets/themes/newsflash/_theme.js +24 -0
- package/dist/assets/themes/newsflash/_theme.scss +70 -0
- package/dist/assets/themes/newsflash/css/base/_fonts.scss +80 -0
- package/dist/assets/themes/newsflash/css/base/_mixins.scss +51 -0
- package/dist/assets/themes/newsflash/css/base/_root.scss +257 -0
- package/dist/assets/themes/newsflash/css/base/_typography.scss +49 -0
- package/dist/assets/themes/newsflash/css/base/_utilities.scss +122 -0
- package/dist/assets/themes/newsflash/css/components/_badges.scss +65 -0
- package/dist/assets/themes/newsflash/css/components/_billing-toggle.scss +61 -0
- package/dist/assets/themes/newsflash/css/components/_buttons.scss +139 -0
- package/dist/assets/themes/newsflash/css/components/_cards.scss +47 -0
- package/dist/assets/themes/newsflash/css/components/_editorial.scss +173 -0
- package/dist/assets/themes/newsflash/css/components/_forms.scss +75 -0
- package/dist/assets/themes/newsflash/css/components/_infinite-scroll.scss +102 -0
- package/dist/assets/themes/newsflash/css/components/_panels.scss +156 -0
- package/dist/assets/themes/newsflash/css/components/_ticker.scss +67 -0
- package/dist/assets/themes/newsflash/css/layout/_general.scss +330 -0
- package/dist/assets/themes/newsflash/css/layout/_navigation.scss +168 -0
- package/dist/assets/themes/newsflash/css/pages/404/index.scss +79 -0
- package/dist/assets/themes/newsflash/css/pages/blog/[slug].scss +186 -0
- package/dist/assets/themes/newsflash/css/pages/blog/index.scss +17 -0
- package/dist/assets/themes/newsflash/css/pages/index.scss +157 -0
- package/dist/assets/themes/newsflash/css/pages/pricing/index.scss +55 -0
- package/dist/assets/themes/newsflash/css/pages/test/libraries/layers/index.scss +7 -0
- package/dist/assets/themes/newsflash/fonts/fraunces-italic-latin-ext.woff2 +0 -0
- package/dist/assets/themes/newsflash/fonts/fraunces-italic-latin.woff2 +0 -0
- package/dist/assets/themes/newsflash/fonts/fraunces-normal-latin-ext.woff2 +0 -0
- package/dist/assets/themes/newsflash/fonts/fraunces-normal-latin.woff2 +0 -0
- package/dist/assets/themes/newsflash/fonts/schibsted-grotesk-italic-latin-ext.woff2 +0 -0
- package/dist/assets/themes/newsflash/fonts/schibsted-grotesk-italic-latin.woff2 +0 -0
- package/dist/assets/themes/newsflash/fonts/schibsted-grotesk-normal-latin-ext.woff2 +0 -0
- package/dist/assets/themes/newsflash/fonts/schibsted-grotesk-normal-latin.woff2 +0 -0
- package/dist/assets/themes/newsflash/js/pages/blog/[slug].js +29 -0
- package/dist/assets/themes/newsflash/js/pages/test/libraries/layers/index.js +9 -0
- package/dist/build.js +249 -0
- package/dist/cli-run.js +34 -0
- package/dist/cli.js +49 -0
- package/dist/commands/build.js +32 -0
- package/dist/commands/cdp/capture.js +91 -0
- package/dist/commands/cdp/client.js +140 -0
- package/dist/commands/cdp/eval.js +20 -0
- package/dist/commands/cdp/quit.js +84 -0
- package/dist/commands/cdp/relaunch.js +62 -0
- package/dist/commands/cdp/shot.js +20 -0
- package/dist/commands/cdp/status.js +38 -0
- package/dist/commands/cdp/theme.js +21 -0
- package/dist/commands/cdp.js +53 -0
- package/dist/commands/clean.js +34 -0
- package/dist/commands/deploy.js +75 -0
- package/dist/commands/finalize-release.js +238 -0
- package/dist/commands/install.js +37 -0
- package/dist/commands/launch.js +150 -0
- package/dist/commands/lib/dependencies.js +35 -0
- package/dist/commands/lib/deploy-precheck.js +117 -0
- package/dist/commands/lib/ensure-target.js +300 -0
- package/dist/commands/logs.js +185 -0
- package/dist/commands/package.js +31 -0
- package/dist/commands/publish.js +34 -0
- package/dist/commands/push-secrets.js +141 -0
- package/dist/commands/release.js +286 -0
- package/dist/commands/runner.js +1874 -0
- package/dist/commands/sign-windows.js +563 -0
- package/dist/commands/test.js +121 -0
- package/dist/commands/update.js +21 -0
- package/dist/commands/validate-certs.js +238 -0
- package/dist/commands/version.js +9 -0
- package/dist/config/page-template.html +35 -0
- package/dist/defaults/.github/workflows/build.yml +276 -0
- package/dist/defaults/AGENTS.md +109 -0
- package/dist/defaults/CHANGELOG.md +15 -0
- package/dist/defaults/CLAUDE.md +1 -0
- package/dist/defaults/_.gitignore +24 -0
- package/dist/defaults/_mas/README.md +49 -0
- package/dist/defaults/_mas/entitlements.mas.inherit.plist +12 -0
- package/dist/defaults/_mas/entitlements.mas.loginhelper.plist +8 -0
- package/dist/defaults/_mas/entitlements.mas.plist +33 -0
- package/dist/defaults/config/certs/.gitkeep +0 -0
- package/dist/defaults/config/certs/README.md +60 -0
- package/dist/defaults/config/icons/macos/dmg.png +0 -0
- package/dist/defaults/config/icons/macos/icon.png +0 -0
- package/dist/defaults/config/icons/macos/tray.png +0 -0
- package/dist/defaults/config/icons/windows/icon.png +0 -0
- package/dist/defaults/config/omega.json5 +279 -0
- package/dist/defaults/docs/README.md +17 -0
- package/dist/defaults/gulpfile.js +6 -0
- package/dist/defaults/hooks/build/post.js +9 -0
- package/dist/defaults/hooks/build/pre.js +9 -0
- package/dist/defaults/hooks/notarize/post.js +16 -0
- package/dist/defaults/hooks/release/post.js +9 -0
- package/dist/defaults/hooks/release/pre.js +9 -0
- package/dist/defaults/src/assets/js/components/about/index.js +10 -0
- package/dist/defaults/src/assets/js/components/main/index.js +14 -0
- package/dist/defaults/src/assets/js/components/settings/index.js +10 -0
- package/dist/defaults/src/assets/scss/main.scss +34 -0
- package/dist/defaults/src/assets/scss/pages/about.scss +3 -0
- package/dist/defaults/src/assets/scss/pages/main.scss +4 -0
- package/dist/defaults/src/assets/scss/pages/settings.scss +3 -0
- package/dist/defaults/src/integrations/context-menu/index.js +60 -0
- package/dist/defaults/src/integrations/menu/index.js +58 -0
- package/dist/defaults/src/integrations/tray/index.js +60 -0
- package/dist/defaults/src/main.js +78 -0
- package/dist/defaults/src/preload.js +15 -0
- package/dist/defaults/src/views/about/index.html +3 -0
- package/dist/defaults/src/views/main/index.html +8 -0
- package/dist/defaults/src/views/settings/index.html +3 -0
- package/dist/defaults/test/README.md +41 -0
- package/dist/defaults/test/_init.js +10 -0
- package/dist/gulp/main.js +144 -0
- package/dist/gulp/tasks/audit.js +82 -0
- package/dist/gulp/tasks/build-config.js +445 -0
- package/dist/gulp/tasks/bundle.js +451 -0
- package/dist/gulp/tasks/defaults.js +20 -0
- package/dist/gulp/tasks/distribute.js +8 -0
- package/dist/gulp/tasks/html.js +95 -0
- package/dist/gulp/tasks/package-quick.js +102 -0
- package/dist/gulp/tasks/package.js +53 -0
- package/dist/gulp/tasks/release.js +57 -0
- package/dist/gulp/tasks/sass.js +82 -0
- package/dist/gulp/tasks/serve.js +191 -0
- package/dist/hooks/notarize.js +70 -0
- package/dist/index.js +14 -0
- package/dist/lib/_menu-mixin.js +199 -0
- package/dist/lib/analytics.js +360 -0
- package/dist/lib/app-state.js +220 -0
- package/dist/lib/auth-flow.js +160 -0
- package/dist/lib/auth-persistence.js +207 -0
- package/dist/lib/auto-updater.js +752 -0
- package/dist/lib/client-bridge.js +371 -0
- package/dist/lib/context-menu.js +302 -0
- package/dist/lib/context.js +162 -0
- package/dist/lib/deep-link.js +370 -0
- package/dist/lib/fontawesome.js +203 -0
- package/dist/lib/ipc.js +169 -0
- package/dist/lib/logger-lite.js +259 -0
- package/dist/lib/logger.js +4 -0
- package/dist/lib/menu.js +521 -0
- package/dist/lib/protocol.js +85 -0
- package/dist/lib/remote-config.js +224 -0
- package/dist/lib/remote-scripts.js +158 -0
- package/dist/lib/restart-manager/index.js +550 -0
- package/dist/lib/restart-manager/install.js +353 -0
- package/dist/lib/restart-manager/protocol.js +274 -0
- package/dist/lib/sign-helpers/auto-unlock.js +95 -0
- package/dist/lib/sign-helpers/entitlements.js +98 -0
- package/dist/lib/sign-helpers/resolve-icons.js +171 -0
- package/dist/lib/sign-helpers/sign-events.js +75 -0
- package/dist/lib/sign-helpers/update-info.js +186 -0
- package/dist/lib/startup.js +214 -0
- package/dist/lib/storage.js +193 -0
- package/dist/lib/templating.js +85 -0
- package/dist/lib/theme.js +173 -0
- package/dist/lib/tray.js +414 -0
- package/dist/lib/usage.js +141 -0
- package/dist/lib/window-manager.js +509 -0
- package/dist/main.js +542 -0
- package/dist/omega-bin.js +6 -0
- package/dist/preload.js +241 -0
- package/dist/renderer.js +456 -0
- package/dist/test/assert.js +4 -0
- package/dist/test/fixtures/consumer-app/config/omega.json5 +39 -0
- package/dist/test/fixtures/consumer-app/package.json +13 -0
- package/dist/test/fixtures/consumer-app/src/assets/js/components/main/index.js +11 -0
- package/dist/test/fixtures/consumer-app/src/assets/scss/main.scss +3 -0
- package/dist/test/fixtures/consumer-app/src/main.js +17 -0
- package/dist/test/fixtures/consumer-app/src/preload.js +4 -0
- package/dist/test/fixtures/consumer-app/src/views/main/index.html +4 -0
- package/dist/test/harness/boot-entry.js +237 -0
- package/dist/test/harness/main-entry.js +494 -0
- package/dist/test/harness/package.json +6 -0
- package/dist/test/harness/renderer-entry.js +173 -0
- package/dist/test/harness/renderer-preload.js +310 -0
- package/dist/test/harness/renderer.html +12 -0
- package/dist/test/index.js +65 -0
- package/dist/test/runner.js +99 -0
- package/dist/test/runners/boot.js +414 -0
- package/dist/test/runners/electron.js +92 -0
- package/dist/test/runners/render-event.js +46 -0
- package/dist/test/suites/boot/build-isolation.test.js +54 -0
- package/dist/test/suites/boot/consumer-app-boots.test.js +99 -0
- package/dist/test/suites/boot/restart-manager.test.js +38 -0
- package/dist/test/suites/boot/storage-bundled.test.js +59 -0
- package/dist/test/suites/boot/theme.test.js +68 -0
- package/dist/test/suites/boot/view-suite.test.js +47 -0
- package/dist/test/suites/build/attach-log-file.test.js +99 -0
- package/dist/test/suites/build/audit.test.js +271 -0
- package/dist/test/suites/build/boot-fixture.test.js +48 -0
- package/dist/test/suites/build/build-config.test.js +457 -0
- package/dist/test/suites/build/build-verbs.test.js +156 -0
- package/dist/test/suites/build/build-workflow-jobs.test.js +55 -0
- package/dist/test/suites/build/cdp.test.js +89 -0
- package/dist/test/suites/build/cli.test.js +135 -0
- package/dist/test/suites/build/config-schema.test.js +133 -0
- package/dist/test/suites/build/defaults-scaffold.test.js +192 -0
- package/dist/test/suites/build/deliver-certs.test.js +95 -0
- package/dist/test/suites/build/derive-signing-env.test.js +122 -0
- package/dist/test/suites/build/electron-node-version.test.js +49 -0
- package/dist/test/suites/build/electron-targets.test.js +92 -0
- package/dist/test/suites/build/ensure-target.test.js +131 -0
- package/dist/test/suites/build/entitlements.test.js +107 -0
- package/dist/test/suites/build/env-delivery.test.js +166 -0
- package/dist/test/suites/build/env-watch.test.js +86 -0
- package/dist/test/suites/build/exports.test.js +63 -0
- package/dist/test/suites/build/finalize-release.test.js +152 -0
- package/dist/test/suites/build/format-fetch-error.test.js +85 -0
- package/dist/test/suites/build/framework-deps.test.js +173 -0
- package/dist/test/suites/build/get-config.test.js +137 -0
- package/dist/test/suites/build/github-utils.test.js +54 -0
- package/dist/test/suites/build/icon-sheet.test.js +62 -0
- package/dist/test/suites/build/license-stamp.test.js +63 -0
- package/dist/test/suites/build/logger-lite.test.js +148 -0
- package/dist/test/suites/build/logs-command.test.js +226 -0
- package/dist/test/suites/build/manager.test.js +193 -0
- package/dist/test/suites/build/menu-mixin.test.js +130 -0
- package/dist/test/suites/build/merge-line-files.test.js +230 -0
- package/dist/test/suites/build/omega-shell.test.js +94 -0
- package/dist/test/suites/build/omega-tokens.test.js +64 -0
- package/dist/test/suites/build/project-scripts-deps.test.js +90 -0
- package/dist/test/suites/build/push-secrets.test.js +226 -0
- package/dist/test/suites/build/release-pipeline.test.js +365 -0
- package/dist/test/suites/build/renderer-auth-bridge.test.js +158 -0
- package/dist/test/suites/build/renderer-entry-key.test.js +37 -0
- package/dist/test/suites/build/renderer-node-shims.test.js +125 -0
- package/dist/test/suites/build/resolve-icons.test.js +296 -0
- package/dist/test/suites/build/resolve-signing-cert.test.js +342 -0
- package/dist/test/suites/build/restart-manager-install.test.js +178 -0
- package/dist/test/suites/build/restart-manager-protocol.test.js +158 -0
- package/dist/test/suites/build/run-consumer-hook.test.js +137 -0
- package/dist/test/suites/build/runner.test.js +2599 -0
- package/dist/test/suites/build/sanitize-signing-env.test.js +98 -0
- package/dist/test/suites/build/sanitize-url.test.js +78 -0
- package/dist/test/suites/build/secure-remote-url.test.js +42 -0
- package/dist/test/suites/build/sentry.test.js +89 -0
- package/dist/test/suites/build/serve-resolve-electron.test.js +58 -0
- package/dist/test/suites/build/setup-scripts.test.js +172 -0
- package/dist/test/suites/build/sign-events.test.js +90 -0
- package/dist/test/suites/build/sign-windows-e2e.test.js +302 -0
- package/dist/test/suites/build/sign-windows.test.js +313 -0
- package/dist/test/suites/build/strip-dev-blocks.test.js +116 -0
- package/dist/test/suites/build/templating.test.js +95 -0
- package/dist/test/suites/build/test-discovery.test.js +64 -0
- package/dist/test/suites/build/test-stealth.test.js +83 -0
- package/dist/test/suites/build/test-target-no-match.test.js +119 -0
- package/dist/test/suites/build/update-info.test.js +224 -0
- package/dist/test/suites/build/url-helpers.test.js +289 -0
- package/dist/test/suites/build/validate-certs.test.js +103 -0
- package/dist/test/suites/build/validate-config.test.js +90 -0
- package/dist/test/suites/build/verb-logs.test.js +43 -0
- package/dist/test/suites/build/wave5-pins.test.js +35 -0
- package/dist/test/suites/main/analytics.test.js +364 -0
- package/dist/test/suites/main/app-state.test.js +197 -0
- package/dist/test/suites/main/auth-flow.test.js +196 -0
- package/dist/test/suites/main/auth-persistence.test.js +167 -0
- package/dist/test/suites/main/auto-updater.test.js +1138 -0
- package/dist/test/suites/main/boot-sequence.test.js +77 -0
- package/dist/test/suites/main/client-bridge.integration.test.js +134 -0
- package/dist/test/suites/main/client-bridge.test.js +249 -0
- package/dist/test/suites/main/context-menu.test.js +365 -0
- package/dist/test/suites/main/context.test.js +155 -0
- package/dist/test/suites/main/deep-link.test.js +288 -0
- package/dist/test/suites/main/epipe-handler.test.js +40 -0
- package/dist/test/suites/main/fontawesome.test.js +147 -0
- package/dist/test/suites/main/harness-cdp.test.js +49 -0
- package/dist/test/suites/main/ipc.test.js +165 -0
- package/dist/test/suites/main/menu.test.js +419 -0
- package/dist/test/suites/main/protocol.test.js +77 -0
- package/dist/test/suites/main/remote-config.test.js +189 -0
- package/dist/test/suites/main/remote-scripts.test.js +276 -0
- package/dist/test/suites/main/restart-manager.test.js +328 -0
- package/dist/test/suites/main/startup-paths-and-ua.test.js +99 -0
- package/dist/test/suites/main/startup.test.js +129 -0
- package/dist/test/suites/main/stealth-window.test.js +74 -0
- package/dist/test/suites/main/storage.test.js +89 -0
- package/dist/test/suites/main/theme.test.js +137 -0
- package/dist/test/suites/main/tray.test.js +322 -0
- package/dist/test/suites/main/truncate-on-boot.test.js +22 -0
- package/dist/test/suites/main/url-helpers.test.js +429 -0
- package/dist/test/suites/main/usage.test.js +127 -0
- package/dist/test/suites/main/window-bounds.test.js +169 -0
- package/dist/test/suites/main/window-manager.test.js +233 -0
- package/dist/test/suites/renderer/analytics-bridge.test.js +128 -0
- package/dist/test/suites/renderer/cross-context-helpers.test.js +131 -0
- package/dist/test/suites/renderer/fontawesome.test.js +190 -0
- package/dist/test/suites/renderer/round-trip.test.js +107 -0
- package/dist/test/suites/renderer/theme.test.js +118 -0
- package/dist/test/suites/renderer/tooltips.test.js +166 -0
- package/dist/test/suites/renderer/verts.test.js +100 -0
- package/dist/test/suites/renderer/window-em-surface.test.js +107 -0
- package/dist/test/utils/dist-snapshot.js +36 -0
- package/dist/test/utils/extended-mode-warning.js +13 -0
- package/dist/utils/app-root.js +28 -0
- package/dist/utils/attach-log-file.js +4 -0
- package/dist/utils/build-pipeline.js +58 -0
- package/dist/utils/deliver-certs.js +69 -0
- package/dist/utils/derive-signing-env.js +56 -0
- package/dist/utils/dist-root.js +21 -0
- package/dist/utils/electron-node-version.js +48 -0
- package/dist/utils/electron-targets.js +72 -0
- package/dist/utils/format-fetch-error.js +38 -0
- package/dist/utils/github.js +73 -0
- package/dist/utils/load-consumer-file.js +26 -0
- package/dist/utils/merge-line-files.js +5 -0
- package/dist/utils/mode-helpers.js +147 -0
- package/dist/utils/resolve-signing-cert.js +175 -0
- package/dist/utils/run-consumer-hook.js +38 -0
- package/dist/utils/runner-env.js +687 -0
- package/dist/utils/safe-install.js +4 -0
- package/dist/utils/sanitize-signing-env.js +45 -0
- package/dist/utils/sanitize-url.js +28 -0
- package/dist/utils/secure-remote-url.js +25 -0
- package/dist/utils/stealth-window.js +37 -0
- package/dist/utils/test-stealth.js +29 -0
- package/dist/utils/url-helpers.js +169 -0
- package/dist/vendor/account/engine.js +182 -0
- package/dist/vendor/account/features.js +220 -0
- package/dist/vendor/account/index.js +53 -0
- package/dist/vendor/account/schema.js +272 -0
- package/dist/vendor/account/subscription.js +38 -0
- package/dist/vendor/analytics/adapters/ga4.js +26 -0
- package/dist/vendor/analytics/adapters/meta.js +26 -0
- package/dist/vendor/analytics/adapters/resolve.js +130 -0
- package/dist/vendor/analytics/adapters/tiktok.js +27 -0
- package/dist/vendor/analytics/catalog.js +908 -0
- package/dist/vendor/analytics/consent.js +49 -0
- package/dist/vendor/analytics/core.js +141 -0
- package/dist/vendor/analytics/identity.js +136 -0
- package/dist/vendor/analytics/index.js +170 -0
- package/dist/vendor/analytics/logger.js +40 -0
- package/dist/vendor/analytics/transports/browser.js +110 -0
- package/dist/vendor/config/company.js +31 -0
- package/dist/vendor/config/defaults.js +173 -0
- package/dist/vendor/config/demo.js +18 -0
- package/dist/vendor/config/desktop-artifacts.js +110 -0
- package/dist/vendor/config/edit.js +769 -0
- package/dist/vendor/config/env-delivery.js +145 -0
- package/dist/vendor/config/env-rules.js +93 -0
- package/dist/vendor/config/env-schema.js +1078 -0
- package/dist/vendor/config/env.js +445 -0
- package/dist/vendor/config/hooks.js +97 -0
- package/dist/vendor/config/index.js +237 -0
- package/dist/vendor/config/instances.js +208 -0
- package/dist/vendor/config/load.js +490 -0
- package/dist/vendor/config/merge.js +68 -0
- package/dist/vendor/config/order.js +139 -0
- package/dist/vendor/config/ports.js +374 -0
- package/dist/vendor/config/providers.js +32 -0
- package/dist/vendor/config/repo.js +142 -0
- package/dist/vendor/config/retired-keys.js +430 -0
- package/dist/vendor/config/schema.js +1610 -0
- package/dist/vendor/config/secrets.js +50 -0
- package/dist/vendor/config/seed.js +34 -0
- package/dist/vendor/config/site-global.js +205 -0
- package/dist/vendor/config/validate.js +554 -0
- package/dist/vendor/config/winback.js +61 -0
- package/dist/vendor/devkit/actions-secrets.js +145 -0
- package/dist/vendor/devkit/attach-log-file.js +262 -0
- package/dist/vendor/devkit/bundle.js +292 -0
- package/dist/vendor/devkit/certs.js +199 -0
- package/dist/vendor/devkit/ci-workflows.js +520 -0
- package/dist/vendor/devkit/clean-dirs.js +28 -0
- package/dist/vendor/devkit/cli-router.js +156 -0
- package/dist/vendor/devkit/defaults-engine.js +372 -0
- package/dist/vendor/devkit/deploy-precheck.js +54 -0
- package/dist/vendor/devkit/deploy-record.js +180 -0
- package/dist/vendor/devkit/deploy.js +286 -0
- package/dist/vendor/devkit/empty-modules-plugin.js +64 -0
- package/dist/vendor/devkit/env-watch.js +132 -0
- package/dist/vendor/devkit/framework-deps.js +46 -0
- package/dist/vendor/devkit/license.js +155 -0
- package/dist/vendor/devkit/local.js +1905 -0
- package/dist/vendor/devkit/logger.js +128 -0
- package/dist/vendor/devkit/merge-line-files.js +296 -0
- package/dist/vendor/devkit/npm-registry.js +52 -0
- package/dist/vendor/devkit/omega-bin.js +345 -0
- package/dist/vendor/devkit/prompt.js +187 -0
- package/dist/vendor/devkit/safe-install.js +18 -0
- package/dist/vendor/devkit/scaffold-guard.js +96 -0
- package/dist/vendor/devkit/stop-signals.js +28 -0
- package/dist/vendor/devkit/strip-dev-blocks-plugin.js +29 -0
- package/dist/vendor/devkit/strip-dev-blocks.js +32 -0
- package/dist/vendor/devkit/target-dependencies.js +137 -0
- package/dist/vendor/devkit/target-secrets.js +165 -0
- package/dist/vendor/devkit/test/assert.js +120 -0
- package/dist/vendor/devkit/test/define-cases.js +104 -0
- package/dist/vendor/devkit/test/extended-mode-warning.js +22 -0
- package/dist/vendor/devkit/test/runner-core.js +554 -0
- package/dist/vendor/devkit/test/scope.js +162 -0
- package/dist/vendor/devkit/update.js +569 -0
- package/dist/vendor/monitoring/core.js +180 -0
- package/dist/vendor/monitoring/env.js +49 -0
- package/dist/vendor/monitoring/index.js +28 -0
- package/dist/vendor/monitoring/logger.js +39 -0
- package/dist/vendor/monitoring/main.js +99 -0
- package/dist/vendor/monitoring/preload.js +45 -0
- package/dist/vendor/monitoring/renderer.js +87 -0
- package/docs/analytics.md +140 -0
- package/docs/app-state.md +92 -0
- package/docs/audit.md +69 -0
- package/docs/auto-updater.md +243 -0
- package/docs/boot-sequence.md +39 -0
- package/docs/build-system.md +161 -0
- package/docs/cdp-debugging.md +169 -0
- package/docs/client-bridge.md +267 -0
- package/docs/common-mistakes.md +21 -0
- package/docs/config-schema.md +120 -0
- package/docs/context-menu.md +112 -0
- package/docs/context.md +81 -0
- package/docs/css.md +84 -0
- package/docs/deep-link.md +178 -0
- package/docs/environment-detection.md +104 -0
- package/docs/fontawesome.md +107 -0
- package/docs/hooks.md +87 -0
- package/docs/icons.md +79 -0
- package/docs/index.md +279 -0
- package/docs/installer-options.md +162 -0
- package/docs/ipc.md +61 -0
- package/docs/lib-modules.md +53 -0
- package/docs/logging.md +229 -0
- package/docs/menu.md +160 -0
- package/docs/releasing.md +229 -0
- package/docs/remote-config.md +118 -0
- package/docs/remote-scripts.md +144 -0
- package/docs/restart-manager.md +144 -0
- package/docs/runner.md +253 -0
- package/docs/sentry.md +97 -0
- package/docs/shared/agent-docs.md +89 -0
- package/docs/shared/analytics.md +612 -0
- package/docs/shared/brands.md +51 -0
- package/docs/shared/breaking-changes.md +497 -0
- package/docs/shared/config.md +1387 -0
- package/docs/shared/deploys.md +215 -0
- package/docs/shared/icons.md +201 -0
- package/docs/shared/local-dev.md +147 -0
- package/docs/shared/logging.md +202 -0
- package/docs/shared/monitoring.md +153 -0
- package/docs/shared/publishing.md +183 -0
- package/docs/shared/rulings.md +34 -0
- package/docs/shared/testing.md +147 -0
- package/docs/shared/theming.md +604 -0
- package/docs/shared/translation.md +291 -0
- package/docs/shared/updates.md +61 -0
- package/docs/signing.md +267 -0
- package/docs/startup.md +142 -0
- package/docs/storage.md +59 -0
- package/docs/templating.md +101 -0
- package/docs/test-boot-layer.md +157 -0
- package/docs/test-framework.md +357 -0
- package/docs/themes.md +135 -0
- package/docs/tooltips.md +99 -0
- package/docs/tray.md +164 -0
- package/docs/usage.md +58 -0
- package/docs/verts.md +62 -0
- package/docs/windows.md +149 -0
- package/package.json +184 -0
- package/scripts/sync-nvmrc.js +100 -0
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# Installer & Distribution Options
|
|
2
|
+
|
|
3
|
+
Single source of truth for everything that controls how your app is packaged + delivered to end users. @omega.js/desktop owns the *target type* choices (NSIS on Windows, DMG+zip on Mac, deb+AppImage on Linux) and lets you configure the per-target UX through a small set of config knobs.
|
|
4
|
+
|
|
5
|
+
## Why @omega.js/desktop owns the target list
|
|
6
|
+
|
|
7
|
+
@omega.js/desktop picks specific installer types because they're the only ones that play well with the auto-update mechanism + cross-platform release pipeline:
|
|
8
|
+
|
|
9
|
+
| Platform | Target | Why |
|
|
10
|
+
|---|---|---|
|
|
11
|
+
| **macOS** | `dmg` + `zip` | DMG is the user-facing installer, zip is what `electron-updater` consumes for the auto-update feed. Universal binary (one .dmg works on Intel + Apple Silicon). |
|
|
12
|
+
| **Windows** | `nsis` | The only target that integrates with `electron-updater` for delta updates. Squirrel.Windows works too but installs to a weird per-user location with no Add/Remove Programs entry. MSI uses Windows Installer's own update mechanism (no electron-updater). |
|
|
13
|
+
| **Linux** | `deb` + `AppImage` (+ optional `snap`) | `deb` for Ubuntu/Debian/Mint users, `AppImage` for distro-agnostic distribution. `snap` opt-in for Snap Store distribution. |
|
|
14
|
+
|
|
15
|
+
If you genuinely need a different target (Squirrel for "no installer UI" UX, MSI for enterprise, MAS for App Store), use the raw `electronBuilder` override block in `omega.json5` — that's an escape hatch into electron-builder's full config surface. We just don't expose those choices in the consumer-facing API to keep the default path safe.
|
|
16
|
+
|
|
17
|
+
## Cross-platform fields (`app.*`)
|
|
18
|
+
|
|
19
|
+
These apply identically on every OS — set them once.
|
|
20
|
+
|
|
21
|
+
| Field | Default | What it does |
|
|
22
|
+
|---|---|---|
|
|
23
|
+
| `app.category` | `'productivity'` | Generic app category. @omega.js/desktop maps to `mac.category` (Apple UTI) and `linux.category` (freedesktop). Allowed: `productivity`, `developer-tools`, `utilities`, `media`, `social`, `network`. |
|
|
24
|
+
| `app.copyright` | `'© {YEAR}, ITW Creative Works'` | Copyright string. `{YEAR}` token is expanded to the current year at build time, so the string stays current without consumers ever editing it. |
|
|
25
|
+
| `app.languages` | `['en']` | Locale list. Applied as `mac.electronLanguages` (which strips other locales' `.lproj` dirs from the .app bundle). win/linux currently ignore this. |
|
|
26
|
+
| `app.darkModeSupport` | `true` | macOS honors via `NSRequiresAquaSystemAppearance: false` in Info.plist. Win/linux ignore. |
|
|
27
|
+
|
|
28
|
+
### Category mapping table
|
|
29
|
+
|
|
30
|
+
| `app.category` | mac (`mac.category`) | linux (`linux.category`) |
|
|
31
|
+
|---|---|---|
|
|
32
|
+
| `productivity` (default) | `public.app-category.productivity` | `Utility` |
|
|
33
|
+
| `developer-tools` | `public.app-category.developer-tools` | `Development` |
|
|
34
|
+
| `utilities` | `public.app-category.utilities` | `Utility` |
|
|
35
|
+
| `media` | `public.app-category.entertainment` | `AudioVideo` |
|
|
36
|
+
| `social` | `public.app-category.social-networking` | `Network` |
|
|
37
|
+
| `network` | `public.app-category.business` | `Network` |
|
|
38
|
+
|
|
39
|
+
If you need a per-platform value not in the table, use the raw `electronBuilder.mac.category` / `electronBuilder.linux.category` override.
|
|
40
|
+
|
|
41
|
+
## Windows (`platforms.win.*`)
|
|
42
|
+
|
|
43
|
+
| Field | Default | What it does |
|
|
44
|
+
|---|---|---|
|
|
45
|
+
| `platforms.win.arch` | `['x64', 'ia32']` | Architectures. Single multi-arch NSIS installer ships both. |
|
|
46
|
+
| `platforms.win.oneClick` | `true` | Slack-style: no installer wizard, just installs immediately to `%LocalAppData%\Programs\<App>`. Set to `false` for a standard "Next, Next, Finish" wizard. |
|
|
47
|
+
| `platforms.win.desktopShortcut` | `true` | Create desktop shortcut. |
|
|
48
|
+
| `platforms.win.startMenuShortcut` | `true` | Create Start menu entry. |
|
|
49
|
+
| `platforms.win.runAfterFinish` | `true` | Auto-launch the app when the install completes. |
|
|
50
|
+
| `platforms.win.perMachine` | `false` | Install for current user. Set `true` to install for all users (requires UAC elevation; **incompatible with `oneClick: true`**). |
|
|
51
|
+
|
|
52
|
+
### Why `oneClick: true` by default
|
|
53
|
+
|
|
54
|
+
Most Electron consumer apps default to `oneClick: true` (Slack, Discord) — it's a "nothing to think about" flow that gets users to your app fast. Trade-offs:
|
|
55
|
+
- ✅ No installer wizard, no choices for the user, fastest install
|
|
56
|
+
- ✅ Combined with `runAfterFinish: true`, the app just opens after install finishes
|
|
57
|
+
- ❌ Cannot install per-machine (incompatible with multi-user environments / enterprise)
|
|
58
|
+
- ❌ User can't pick install location (always per-user `%LocalAppData%`)
|
|
59
|
+
|
|
60
|
+
If your app needs enterprise deployment, set `oneClick: false` to opt into the wizard installer with `perMachine: true`.
|
|
61
|
+
|
|
62
|
+
### `ia32` (32-bit Windows)
|
|
63
|
+
|
|
64
|
+
@omega.js/desktop ships `ia32` alongside `x64` in a single multi-arch installer. Real-world 32-bit Windows usage is <3%, but the cost of including it is just ~2x installer size + ~2x signing time — no separate code path. Worth keeping for the long-tail user on an old Win 10 machine. To drop, set `platforms.win.arch: ['x64']`.
|
|
65
|
+
|
|
66
|
+
## macOS (`platforms.mac.*`)
|
|
67
|
+
|
|
68
|
+
| Field | Default | What it does |
|
|
69
|
+
|---|---|---|
|
|
70
|
+
| `platforms.mac.arch` | `['universal']` | Architectures. `universal` produces one .dmg/.zip that runs on both Intel and Apple Silicon (electron-builder lipo's the two arch binaries together). Override to `['arm64']` or `['x64']` for single-arch builds. |
|
|
71
|
+
| `platforms.mac.mas.*` | (stubbed) | Mac App Store distribution config. **Not yet implemented** — see "MAS distribution" below. |
|
|
72
|
+
|
|
73
|
+
### Universal binary trade-off
|
|
74
|
+
|
|
75
|
+
`universal` produces ~2x file size (~225MB vs ~117MB) and ~2x build time on the Mac CI runner (builds both archs sequentially then stitches with `lipo`). Win: one .dmg link to give users — no "which one do I download?" flow.
|
|
76
|
+
|
|
77
|
+
### MAS distribution (stubbed)
|
|
78
|
+
|
|
79
|
+
Mac App Store config keys exist in @omega.js/desktop (`platforms.mac.mas.{enabled, provisioningProfile, entitlements, entitlementsInherit}`) but **are not yet wired up** — setting `enabled: true` triggers an audit warning and is otherwise ignored. The standard DMG+zip targets still build normally.
|
|
80
|
+
|
|
81
|
+
When MAS support lands, the work covered will be: separate `mas` target alongside DMG/zip, separate sandbox entitlements (4 plist files instead of 1), provisioning profile copy from `config/embedded.provisionprofile`, application-groups derivation, App Store Connect submission flow (manual via Transporter, not GH Releases).
|
|
82
|
+
|
|
83
|
+
Reference plists from a working MAS-published Electron app (Slapform) are archived at `<em>/src/defaults/_mas/` for the eventual implementation.
|
|
84
|
+
|
|
85
|
+
## Linux (`platforms.linux.*`)
|
|
86
|
+
|
|
87
|
+
| Field | Default | What it does |
|
|
88
|
+
|---|---|---|
|
|
89
|
+
| `platforms.linux.arch` | `['x64']` | Architectures. ia32 is essentially extinct on modern Linux. |
|
|
90
|
+
| `platforms.linux.snap.enabled` | `true` (in scaffold) | Snap Store publishing. @omega.js/desktop scaffold ships this `true`; programmatic callers without the field default to OFF. Auto-skipped if `SNAPCRAFT_STORE_CREDENTIALS` env is unset. |
|
|
91
|
+
| `platforms.linux.snap.confinement` | `'strict'` | `strict` (sandboxed) or `classic` (unrestricted, requires Snap Store approval). |
|
|
92
|
+
| `platforms.linux.snap.grade` | `'stable'` | `stable` or `devel`. |
|
|
93
|
+
| `platforms.linux.snap.autoStart` | `true` | Register the snap to auto-start on login. |
|
|
94
|
+
| `platforms.linux.snap.channels` | `['stable']` | Snap Store channels to publish to. |
|
|
95
|
+
|
|
96
|
+
### Snap Store publishing
|
|
97
|
+
|
|
98
|
+
Tri-state behavior:
|
|
99
|
+
|
|
100
|
+
- **Field missing entirely** → off. `build-config.js` checks `=== true` strictly, so older configs / programmatic callers without the field don't suddenly emit a snap target.
|
|
101
|
+
- **`enabled: true` (scaffold default) + no `SNAPCRAFT_STORE_CREDENTIALS`** → off, with a build-time log line: `Snap target enabled in config but SNAPCRAFT_STORE_CREDENTIALS not set — skipping snap target.` This means a fresh `mgr setup` produces a working `.deb + .AppImage` build out of the box without failing on a missing snap publish credential.
|
|
102
|
+
- **`enabled: true` + `SNAPCRAFT_STORE_CREDENTIALS` set** → snap target emits, snap publishes on release.
|
|
103
|
+
- **`enabled: false`** → off, regardless of credentials. Explicit opt-out.
|
|
104
|
+
|
|
105
|
+
To turn snap publishing on for a project that already has the field set to `true`:
|
|
106
|
+
|
|
107
|
+
1. Mint store credentials locally:
|
|
108
|
+
```bash
|
|
109
|
+
snapcraft export-login - # writes a credentials blob to stdout
|
|
110
|
+
```
|
|
111
|
+
2. Paste the entire blob (multi-line) into `.env` as `SNAPCRAFT_STORE_CREDENTIALS=...`.
|
|
112
|
+
3. Run `npx omega push-secrets` to flow the secret to GitHub Actions.
|
|
113
|
+
4. Next `npm run release` builds + uploads the snap automatically. No config flip needed.
|
|
114
|
+
|
|
115
|
+
Reference: the workflow's Linux step conditionally installs `snapcraft` (`sudo snap install snapcraft --classic`) only when both (a) `platforms.linux.snap.enabled !== false` AND (b) `SNAPCRAFT_STORE_CREDENTIALS` secret is present. Mirrors the build-config-side gate.
|
|
116
|
+
|
|
117
|
+
## File associations + custom protocols (uncommon)
|
|
118
|
+
|
|
119
|
+
Available for the rare app that needs them — both pass through to electron-builder verbatim.
|
|
120
|
+
|
|
121
|
+
```jsonc
|
|
122
|
+
{
|
|
123
|
+
fileAssociations: [
|
|
124
|
+
{ name: 'My Document', description: 'My App document', ext: 'mydoc', role: 'Editor' },
|
|
125
|
+
],
|
|
126
|
+
protocols: [
|
|
127
|
+
{ name: 'CustomScheme', schemes: ['mycustom'] },
|
|
128
|
+
],
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
`protocols` is **additive** — @omega.js/desktop auto-registers `<brand.id>://` for every app (handled by `lib/protocol.js` at runtime). Use this to add EXTRA schemes (e.g., to handle `mailto:` if you're a custom email client).
|
|
133
|
+
|
|
134
|
+
99% of apps don't need either of these — leave both unset.
|
|
135
|
+
|
|
136
|
+
## Raw `electronBuilder` overrides (escape hatch)
|
|
137
|
+
|
|
138
|
+
For anything @omega.js/desktop doesn't expose, set the value directly on `config.electronBuilder.*` in `omega.json5`. @omega.js/desktop merges your overrides on top of its generated config:
|
|
139
|
+
|
|
140
|
+
**Gotcha: the merge REPLACES arrays wholesale** (objects deep-merge, arrays don't). A `target:` override must restate the FULL target list — `target: [{ target: 'mas' }]` alone would silently DROP dmg+zip and break auto-update.
|
|
141
|
+
|
|
142
|
+
```jsonc
|
|
143
|
+
{
|
|
144
|
+
electronBuilder: {
|
|
145
|
+
mac: {
|
|
146
|
+
target: [
|
|
147
|
+
{ target: 'dmg', arch: ['universal'] }, // restate @omega.js/desktop's defaults…
|
|
148
|
+
{ target: 'zip', arch: ['universal'] }, // …(zip is the auto-update artifact)
|
|
149
|
+
{ target: 'mas', arch: ['universal'] }, // …then add MAS
|
|
150
|
+
],
|
|
151
|
+
},
|
|
152
|
+
win: {
|
|
153
|
+
target: [
|
|
154
|
+
{ target: 'nsis', arch: ['x64', 'ia32'] },
|
|
155
|
+
{ target: 'msi', arch: ['x64'] }, // add MSI alongside NSIS
|
|
156
|
+
],
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
Use this for: legacy apps migrating from a custom builder config, enterprise deployments needing MSI, MAS apps until first-class support lands. Generally try the framework-native config first.
|
package/docs/ipc.md
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# IPC
|
|
2
|
+
|
|
3
|
+
Typed channel bus for main ↔ renderer communication. All @omega.js/desktop features register their channels through this single layer rather than calling `ipcMain.handle` directly, so you have one place to look and one place to instrument.
|
|
4
|
+
|
|
5
|
+
## Main-process API
|
|
6
|
+
|
|
7
|
+
```js
|
|
8
|
+
manager.ipc.handle(channel, async (payload, evt) => result) // request/response
|
|
9
|
+
manager.ipc.unhandle(channel)
|
|
10
|
+
manager.ipc.invoke(channel, payload) // call locally (also what renderer triggers)
|
|
11
|
+
manager.ipc.on(channel, (payload, evt) => void) // one-way subscribe (renderer → main)
|
|
12
|
+
manager.ipc.off(channel, fn)
|
|
13
|
+
manager.ipc.broadcast(channel, payload) // → all BrowserWindows
|
|
14
|
+
manager.ipc.send(webContents, channel, payload) // → one renderer
|
|
15
|
+
manager.ipc.hasHandler(channel)
|
|
16
|
+
manager.ipc.listenerCount(channel)
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Renderer-process API (via preload contextBridge)
|
|
20
|
+
|
|
21
|
+
```js
|
|
22
|
+
await window.desktop.ipc.invoke(channel, payload) // → Promise<result>
|
|
23
|
+
const off = window.desktop.ipc.on(channel, (payload) => { ... });
|
|
24
|
+
window.desktop.ipc.send(channel, payload); // fire-and-forget
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Channel naming
|
|
28
|
+
|
|
29
|
+
framework-internal channels are prefixed `desktop:` (e.g. `desktop:storage:get`, `desktop:storage:change`). Consumers are free to use any namespace.
|
|
30
|
+
|
|
31
|
+
## Validation
|
|
32
|
+
|
|
33
|
+
- `handle()` throws if `channel` is empty/non-string or `handler` is non-function.
|
|
34
|
+
- `handle()` throws on duplicate registration. Call `unhandle()` first if you need to swap.
|
|
35
|
+
- `invoke()` rejects with a clear message if no handler is registered for the channel.
|
|
36
|
+
- Handler errors propagate through `invoke()` (both main-local and renderer-side) — your renderer's `await window.desktop.ipc.invoke(...)` will reject with the original error message.
|
|
37
|
+
|
|
38
|
+
## Zero-trust payloads
|
|
39
|
+
|
|
40
|
+
Registration is validated for you (above) — payload CONTENT is not. Treat every payload reaching a `handle()` / `on()` callback as untrusted input: renderers can be compromised, and apps that embed remote web content (e.g. external pages in `WebContentsView`s) expose the IPC surface to code you don't control.
|
|
41
|
+
|
|
42
|
+
- **Validate shape and values before acting** — types match, IDs are well-formed, enums are from the expected set, paths resolve inside the expected roots.
|
|
43
|
+
- **Gate any URL arriving via IPC** through `sanitize-url.js` before `shell.openExternal` / `loadURL` (the zero-trust URL rule — see [common-mistakes.md](common-mistakes.md)).
|
|
44
|
+
- **Never feed raw payload values** into filesystem paths, shell commands, or `webContents.executeJavaScript`.
|
|
45
|
+
|
|
46
|
+
## Boot order
|
|
47
|
+
|
|
48
|
+
`ipc` initializes **before** `storage` so that storage (and every other feature) can register handlers via `ipc.handle`. This is the canonical pattern: don't touch `ipcMain` directly.
|
|
49
|
+
|
|
50
|
+
## Example
|
|
51
|
+
|
|
52
|
+
```js
|
|
53
|
+
// main
|
|
54
|
+
manager.ipc.handle('user:get-token', async (payload) => {
|
|
55
|
+
const token = await fetchToken(payload.userId);
|
|
56
|
+
return { token };
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
// renderer
|
|
60
|
+
const { token } = await window.desktop.ipc.invoke('user:get-token', { userId: 'abc' });
|
|
61
|
+
```
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Lib Modules
|
|
2
|
+
|
|
3
|
+
`src/lib/*.js` — every Electron concern is its own module. Each exports a singleton with `initialize(manager)`; the main-process Manager wires them in a fixed order at boot (see [boot-sequence.md](boot-sequence.md)). Each module's deep reference lives at `docs/<lib-name>.md`; the module list is in the framework guide's Architecture section ([docs/desktop/index.md](../../../docs/desktop/index.md)).
|
|
4
|
+
|
|
5
|
+
## Lib initialization contract
|
|
6
|
+
|
|
7
|
+
Each lib exposes the same skeleton:
|
|
8
|
+
|
|
9
|
+
```js
|
|
10
|
+
const myLib = {
|
|
11
|
+
_initialized: false,
|
|
12
|
+
_manager: null,
|
|
13
|
+
|
|
14
|
+
initialize(manager) {
|
|
15
|
+
myLib._manager = manager;
|
|
16
|
+
// wire IPC handlers, app event listeners, etc.
|
|
17
|
+
myLib._initialized = true;
|
|
18
|
+
},
|
|
19
|
+
|
|
20
|
+
// Public API
|
|
21
|
+
doThing() { ... },
|
|
22
|
+
|
|
23
|
+
// Disable at runtime (idempotent)
|
|
24
|
+
disable() {
|
|
25
|
+
// tear down listeners; safe to call multiple times
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
module.exports = myLib;
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Don't use `EventEmitter` unless the lib genuinely emits multiple event types. For "fires once when ready" use a promise; for "broadcasts changes" use IPC with renderer subscriptions.
|
|
33
|
+
|
|
34
|
+
## Adding a new lib
|
|
35
|
+
|
|
36
|
+
1. Create `src/lib/<name>.js` exporting a singleton object with `initialize(manager)`.
|
|
37
|
+
2. Wire it into the boot order in `src/main.js` (or the renderer/preload Manager if it's a per-context lib) — check [boot-sequence.md](boot-sequence.md) for where it belongs and what it may depend on.
|
|
38
|
+
3. Attach it to `Manager.prototype` as `manager.<camelCaseName>` so consumers can access it at runtime.
|
|
39
|
+
4. Write tests at every layer the lib has a surface in (see [test-framework.md](test-framework.md)) — at minimum `src/test/suites/main/<name>.test.js`.
|
|
40
|
+
5. Add a `docs/<name>.md` deep reference, add the module's row to the Lib modules table in the framework guide (`docs/desktop/index.md`), and link it from the Documentation index.
|
|
41
|
+
|
|
42
|
+
## Flat file vs directory split
|
|
43
|
+
|
|
44
|
+
- **Default to flat `src/lib/<name>.js`.**
|
|
45
|
+
- **Split into a directory** (`src/lib/<name>/{index,core,main,renderer,preload}.js`) ONLY when each Electron context has materially different logic that would force ugly runtime branching inside one file. `index.js` becomes a thin context detector that delegates.
|
|
46
|
+
- `lib/sentry/` was that split (the SDK has separate main/renderer/preload entry points) until it moved WHOLE into `@omega.js/monitoring` (#380) — the backend and the client needed the same policy, so the shape it proved now lives in the shared package. `lib/restart-manager/` is split for a different, also-valid reason — a **shared-SSOT split**: its `protocol.js` (the wire contract) must be importable by the Restart Manager app via the `exports` map with zero Electron/@omega.js/desktop baggage, so the contract lives in its own pure-Node file next to the main-only `index.js` + `install.js`. `sign-helpers/` is a helpers directory, not a lib.
|
|
47
|
+
- Don't split prophylactically; convert when the branching gets ugly.
|
|
48
|
+
|
|
49
|
+
## See also
|
|
50
|
+
|
|
51
|
+
- [boot-sequence.md](boot-sequence.md) — the fixed `manager.initialize()` order + rationale
|
|
52
|
+
- [environment-detection.md](environment-detection.md) — cross-context helpers shared by all four Managers via `attachTo(Manager)`
|
|
53
|
+
- [test-framework.md](test-framework.md) — the four-layer harness new libs must ship tests in
|
package/docs/logging.md
ADDED
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
# Logging
|
|
2
|
+
|
|
3
|
+
@omega.js/desktop ships a runtime logger that writes to **both the console and a file on disk**, so production issues are inspectable without remoting into the user's machine.
|
|
4
|
+
|
|
5
|
+
## What you get
|
|
6
|
+
|
|
7
|
+
- **One log file**, `runtime.log`, populated by all three Electron processes (main / preload / renderer)
|
|
8
|
+
- **Live console output** during development (DevTools console for renderer, terminal stdout for main)
|
|
9
|
+
- **Kept across boots** — never truncated; it rotates by size instead (see the lifetime table below), unlike `dev.log`/`build.log`/`test.log`
|
|
10
|
+
- **Cross-process timestamps** so log lines from main + preload + renderer interleave in arrival order
|
|
11
|
+
|
|
12
|
+
## Where the file lives
|
|
13
|
+
|
|
14
|
+
| Mode | Location |
|
|
15
|
+
|---|---|
|
|
16
|
+
| Dev (`npm start`, `app.isPackaged === false`) | `<projectRoot>/logs/runtime.log` |
|
|
17
|
+
| Prod (installed `.dmg` / `.exe` / `.deb`, `app.isPackaged === true`) | OS log dir: `~/Library/Logs/<ProductName>/runtime.log` (macOS), `%APPDATA%\<ProductName>\logs\runtime.log` (Windows), `~/.config/<ProductName>/logs/runtime.log` (Linux) |
|
|
18
|
+
|
|
19
|
+
`<ProductName>` = `config.app.productName` (falls back to `config.brand.name`). @omega.js/desktop calls `app.setName(productName)` at boot so `app.getPath('logs')` uses the human-readable brand name, not `package.json#name`.
|
|
20
|
+
|
|
21
|
+
## How to write logs
|
|
22
|
+
|
|
23
|
+
In **main process** (uses the same `manager.logger` you've always had):
|
|
24
|
+
|
|
25
|
+
```js
|
|
26
|
+
const Manager = require('@omega.js/desktop/main');
|
|
27
|
+
const manager = new Manager();
|
|
28
|
+
await manager.initialize();
|
|
29
|
+
|
|
30
|
+
manager.logger.log('booted');
|
|
31
|
+
manager.logger.warn('connection slow');
|
|
32
|
+
manager.logger.error(new Error('boom'));
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
In **preload**:
|
|
36
|
+
|
|
37
|
+
```js
|
|
38
|
+
const Manager = require('@omega.js/desktop/preload');
|
|
39
|
+
const manager = new Manager();
|
|
40
|
+
await manager.initialize();
|
|
41
|
+
manager.logger.log('preload ready');
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
In **renderer** (use the contextBridge surface, which forwards to main → file):
|
|
45
|
+
|
|
46
|
+
```js
|
|
47
|
+
window.desktop.logger.log('user clicked Save');
|
|
48
|
+
window.desktop.logger.warn('IPC slow');
|
|
49
|
+
window.desktop.logger.error(new Error('ui blew up'));
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
All three end up in the same `runtime.log`, prefixed with their scope (`main`, `preload`, `renderer`):
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
[2026-05-05 14:32:11.045] [info] main manager.initialize
|
|
56
|
+
[2026-05-05 14:32:11.122] [info] main ipc ready
|
|
57
|
+
[2026-05-05 14:32:11.187] [info] preload contextBridge exposed
|
|
58
|
+
[2026-05-05 14:32:11.401] [info] renderer auth.listen attached
|
|
59
|
+
[2026-05-05 14:32:12.998] [warn] main auto-updater check failed: network
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Grep one context with:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
grep ' main ' logs/runtime.log
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## CLI: `npx omega logs`
|
|
69
|
+
|
|
70
|
+
For dev-loop convenience. From the consumer project root:
|
|
71
|
+
|
|
72
|
+
| Command | Effect |
|
|
73
|
+
|---|---|
|
|
74
|
+
| `npx omega logs` | Print path, then `tail -50` of the file |
|
|
75
|
+
| `npx omega logs --tail` (or `-f`) | Follow mode (like `tail -f`). Ctrl+C to stop. Cross-platform. |
|
|
76
|
+
| `npx omega logs --path` (or `-p`) | Print the resolved path only (pipe-friendly) |
|
|
77
|
+
| `npx omega logs --open` | Open the log file in OS default editor |
|
|
78
|
+
| `npx omega logs --lines=100` | Default mode with custom tail length |
|
|
79
|
+
|
|
80
|
+
### The surface argument
|
|
81
|
+
|
|
82
|
+
An optional positional names which of the project's logs to read — `npx omega logs [runtime|dev|build|test]`, resolving `<cwd>/logs/<surface>.log`. It defaults to `runtime`, and every flag above works the same on whichever surface was named:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
npx omega logs dev --tail # follow the gulp pipeline live
|
|
86
|
+
npx omega logs test --lines=100 # last 100 lines of the previous test run
|
|
87
|
+
npx omega logs build --path # just the path, for piping
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Anything else fails naming the four surfaces. (The four files themselves are described in the lifetime table below; `ci.log` and `signing.log` are not tail targets.)
|
|
91
|
+
|
|
92
|
+
`mgr logs` only resolves the dev path (`<cwd>/logs/<surface>.log`). To find the production runtime log on a user's machine, use the table above or call `getLogFilePath()` from app code.
|
|
93
|
+
|
|
94
|
+
## How to find the file path from app code
|
|
95
|
+
|
|
96
|
+
```js
|
|
97
|
+
const LoggerLite = require('@omega.js/desktop/lib/logger-lite');
|
|
98
|
+
const filePath = LoggerLite.getLogFilePath();
|
|
99
|
+
// → '/Users/<user>/Library/Logs/MyApp/runtime.log' in production
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Useful for:
|
|
103
|
+
- "Send us your log" buttons in your settings UI
|
|
104
|
+
- Programmatic log shipping (e.g. POSTing the file to your support backend)
|
|
105
|
+
- Crash reporters that want to attach the runtime log
|
|
106
|
+
|
|
107
|
+
## What @omega.js/desktop logs automatically
|
|
108
|
+
|
|
109
|
+
Beyond what you write yourself, @omega.js/desktop emits a fixed set of high-signal lifecycle lines so post-mortem debugging works without redeploying:
|
|
110
|
+
|
|
111
|
+
**At boot (`manager.initialize()`):**
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
(main) Initializing @omega.js/desktop (main)... pid=12345 platform=darwin arch=arm64 packaged=true argv=["--omega-launched-at-login"]
|
|
115
|
+
(startup) startup boot summary — RAW inputs:
|
|
116
|
+
(startup) process.argv: ["--omega-launched-at-login"]
|
|
117
|
+
(startup) process.platform: darwin
|
|
118
|
+
(startup) process.arch: arm64
|
|
119
|
+
(startup) app.isPackaged: true
|
|
120
|
+
(startup) app.getLoginItemSettings(): {"status":"enabled","openAtLogin":true,"openAsHidden":false,"restoreState":false,"wasOpenedAtLogin":false,"wasOpenedAsHidden":false}
|
|
121
|
+
(startup) EM_/electron/node env: {}
|
|
122
|
+
(startup) startup boot summary — RESOLVED values:
|
|
123
|
+
(startup) config.startup.mode: normal
|
|
124
|
+
(startup) config.startup.openAtLogin: {enabled:true, mode:hidden}
|
|
125
|
+
(startup) isDev: false
|
|
126
|
+
(startup) hasLoginArg: true
|
|
127
|
+
(startup) wasLaunchedAtLogin(): true (via argv-flag)
|
|
128
|
+
(startup) isLaunchHidden(): true
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
The boot summary has two parallel blocks: **RAW inputs** (what the OS / shell gave us) and **RESOLVED values** (what @omega.js/desktop decided to act on). Use it to debug both directions:
|
|
132
|
+
- "Why is @omega.js/desktop behaving like X?" → check resolved values
|
|
133
|
+
- "Why did @omega.js/desktop decide X?" → check raw inputs
|
|
134
|
+
|
|
135
|
+
The `via:` annotation on `wasLaunchedAtLogin()` distinguishes a real login launch (`via:macos-wasOpenedAtLogin`) from a flag-based simulation (`via:argv-flag` — i.e. the user passed `--omega-launched-at-login`).
|
|
136
|
+
|
|
137
|
+
**App lifecycle events** (logged from `main.js`):
|
|
138
|
+
|
|
139
|
+
```
|
|
140
|
+
app event: before-quit (entering quit sequence — close events bypass hide-on-close)
|
|
141
|
+
app event: will-quit
|
|
142
|
+
app event: quit code=0
|
|
143
|
+
app event: window-all-closed
|
|
144
|
+
app event: activate (macOS — dock click or app re-launch)
|
|
145
|
+
app event: open-url url=myapp://auth/token?...
|
|
146
|
+
app event: render-process-gone reason=crashed exitCode=139
|
|
147
|
+
app event: child-process-gone type=GPU reason=killed exitCode=9
|
|
148
|
+
process exit code=0
|
|
149
|
+
uncaughtException: <stack>
|
|
150
|
+
unhandledRejection: <stack>
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
**Window lifecycle events** (per named window, logged from `window-manager`):
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
createNamed: building "main" (show=false, hideOnClose=true)
|
|
157
|
+
createNamed: loaded /path/to/app.asar/dist/views/main/index.html for "main"
|
|
158
|
+
window "main": ready-to-show — staying invisible (show:false at create)
|
|
159
|
+
window "main": ready-to-show — surfacing
|
|
160
|
+
window "main": show event
|
|
161
|
+
window "main": hide event
|
|
162
|
+
window "main": focus event
|
|
163
|
+
window "main": minimize event
|
|
164
|
+
window "main": restore event
|
|
165
|
+
window "main": close intercepted (hide-on-close) — hiding instead
|
|
166
|
+
window "main": close allowed (hideOnClose=true, allowQuit=false, isQuitting=true, force=false)
|
|
167
|
+
window "main": closed (destroyed)
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
**Re-surface handlers**:
|
|
171
|
+
|
|
172
|
+
```
|
|
173
|
+
activate (macOS) — surfacing main (visible=false, minimized=false)
|
|
174
|
+
_ensureDockVisible — calling dock.show()
|
|
175
|
+
_ensureDockVisible — dock already visible
|
|
176
|
+
second-instance — argv=["..."] cwd=/...
|
|
177
|
+
second-instance — surfacing main (visible=false, minimized=false)
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
These cover everything you'd want when debugging "why did the app go invisible / crash / fail to surface" without needing to attach a debugger.
|
|
181
|
+
|
|
182
|
+
## Log levels
|
|
183
|
+
|
|
184
|
+
Standard: `log`, `info`, `warn`, `error`, `debug`. All levels are written to both transports by default.
|
|
185
|
+
|
|
186
|
+
To dial down via env vars (useful in CI to silence verbose framework noise):
|
|
187
|
+
|
|
188
|
+
| Var | Effect |
|
|
189
|
+
|---|---|
|
|
190
|
+
| `OMEGA_LOG_LEVEL_FILE=warn` | Only `warn` + `error` reach the file |
|
|
191
|
+
| `OMEGA_LOG_LEVEL_CONSOLE=error` | Only `error` reaches stdout/stderr |
|
|
192
|
+
|
|
193
|
+
Default is `silly` (everything) on both.
|
|
194
|
+
|
|
195
|
+
## How it works under the hood
|
|
196
|
+
|
|
197
|
+
@omega.js/desktop's runtime logger (`lib/logger-lite.js`) detects which process it's in:
|
|
198
|
+
|
|
199
|
+
- **Main**: writes to `runtime.log` directly via [electron-log](https://github.com/megahertz/electron-log)'s file transport. Sets up an IPC listener on channel `desktop:log:forward` to receive forwarded calls from preload + renderer.
|
|
200
|
+
- **Preload**: writes to console (DevTools) AND forwards each call via `ipcRenderer.send('desktop:log:forward', ...)` to main.
|
|
201
|
+
- **Renderer**: same as preload via `window.desktop.logger` (contextBridge surface).
|
|
202
|
+
- **Outside Electron** (build/CLI tools that happen to require this module): falls back to console-only.
|
|
203
|
+
|
|
204
|
+
File path resolution in main:
|
|
205
|
+
1. Read `app.isPackaged`.
|
|
206
|
+
2. If packaged → `app.getPath('logs')`.
|
|
207
|
+
3. If dev → `<cwd>/logs/`.
|
|
208
|
+
4. `mkdirSync` the dir, point electron-log at `<dir>/runtime.log`.
|
|
209
|
+
|
|
210
|
+
The transport is set up lazily on first `log()` call, so importing `LoggerLite` in build/CLI contexts that have no Electron is harmless.
|
|
211
|
+
|
|
212
|
+
## Coexisting with `dev.log`, `build.log`, `test.log`, and `ci.log`
|
|
213
|
+
|
|
214
|
+
Five separate logs in `<projectRoot>/logs/`:
|
|
215
|
+
|
|
216
|
+
| File | Source | Lifetime |
|
|
217
|
+
|---|---|---|
|
|
218
|
+
| `runtime.log` | Packaged-app runtime in dev mode | Persistent, rotates at 10 MB to `runtime.old.log` (one archive generation) |
|
|
219
|
+
| `dev.log` | Gulp pipeline + spawned Electron child stdout (`npm start`) | Truncated each `npm start` |
|
|
220
|
+
| `build.log` | Gulp pipeline output for production builds/packages (`npm run build` / `package` / `publish`, i.e. `OMEGA_BUILD_MODE=true`) | Truncated each build |
|
|
221
|
+
| `test.log` | `npx omega test` runner output (suite names, pass/fail states, harness boot lines) | Truncated each test run |
|
|
222
|
+
| `ci.log` | GH Actions release run output (streamed locally during `npm run release`) | Truncated each release run |
|
|
223
|
+
| `signing.log` | JSONL signing events from Windows code-signing (local dev fallback; on CI this writes to the runner home as `omega-signing.log` instead) | Appended (not truncated) |
|
|
224
|
+
|
|
225
|
+
`dev.log` and `build.log` are the same gulp tee — which one it writes is chosen by `OMEGA_BUILD_MODE`, so they never both fill up in one run. (Disable the tee with `OMEGA_LOG_FILE=false`; override its path with `OMEGA_LOG_FILE=<path>`.)
|
|
226
|
+
|
|
227
|
+
They serve different purposes and don't overlap — `dev.log`/`build.log` show you "is the build still running?", `test.log` shows you "which test failed on the last run?", `ci.log` shows you "did the release workflow pass?", `runtime.log` shows you "is my app's auto-updater finding the right release feed?". All useful.
|
|
228
|
+
|
|
229
|
+
In production: only `runtime.log` exists (no project, no gulp, no GH Actions stream).
|
package/docs/menu.md
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# Application Menu
|
|
2
|
+
|
|
3
|
+
File-based application menu (the macOS menu bar / Windows + Linux menu). Same builder + id-path API as [tray](tray.md) and [context-menu](context-menu.md).
|
|
4
|
+
|
|
5
|
+
## Config
|
|
6
|
+
|
|
7
|
+
No config block. Path is conventional: `src/integrations/menu/index.js`. To opt out, call `manager.menu.disable()` from your main entry.
|
|
8
|
+
|
|
9
|
+
## Definition file
|
|
10
|
+
|
|
11
|
+
```js
|
|
12
|
+
// src/integrations/menu/index.js
|
|
13
|
+
module.exports = ({ manager, menu, defaults }) => {
|
|
14
|
+
// Easiest: start from the platform-aware default template.
|
|
15
|
+
menu.useDefaults();
|
|
16
|
+
|
|
17
|
+
// Mutate by id-path:
|
|
18
|
+
menu.show('main/preferences'); // @omega.js/desktop ships this hidden by default
|
|
19
|
+
menu.update('main/check-for-updates', { label: 'Get Latest Version' });
|
|
20
|
+
menu.insertAfter('main/check-for-updates', {
|
|
21
|
+
id: 'main/account', label: 'Account...', click: () => manager.windows.show('account'),
|
|
22
|
+
});
|
|
23
|
+
menu.remove('view/reload');
|
|
24
|
+
menu.hide('main/services');
|
|
25
|
+
|
|
26
|
+
// Or add a whole new top-level menu:
|
|
27
|
+
menu.menu('Tools', [{ id: 'tools/sync', label: 'Sync Now', click: () => {} }]);
|
|
28
|
+
};
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Builder API (during definition)
|
|
32
|
+
|
|
33
|
+
```js
|
|
34
|
+
menu.menu(label, items) // add a top-level menu bar entry
|
|
35
|
+
menu.useDefaults() // populate with the platform-appropriate default template
|
|
36
|
+
menu.append(item) // append a top-level descriptor (rare; prefer menu())
|
|
37
|
+
menu.clear() // start over
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Id-path API
|
|
41
|
+
|
|
42
|
+
Same shape across menu / tray / context-menu. Available **during definition** (on the `menu` builder arg) AND **at runtime** on `manager.menu`:
|
|
43
|
+
|
|
44
|
+
```js
|
|
45
|
+
.find(idPath) // live descriptor or null
|
|
46
|
+
.has(idPath) // bool
|
|
47
|
+
.update(idPath, patch) // Object.assign + re-render. returns true if found.
|
|
48
|
+
.remove(idPath) // splice + re-render. returns true if removed.
|
|
49
|
+
.enable(idPath, bool = true) // sugar over update({enabled})
|
|
50
|
+
.show(idPath, bool = true) // sugar over update({visible})
|
|
51
|
+
.hide(idPath) // visible:false
|
|
52
|
+
.insertBefore(idPath, item) // splice in a sibling
|
|
53
|
+
.insertAfter(idPath, item) // splice in a sibling
|
|
54
|
+
.appendTo(idPath, item) // push into a submenu (creates submenu if absent)
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Menu ids are **paths** because menus actually nest (`main/check-for-updates`, `view/developer/toggle-devtools`). @omega.js/desktop matches by full id field first; if that misses it walks the path treating each segment as the last component of an id.
|
|
58
|
+
|
|
59
|
+
## Default template ids
|
|
60
|
+
|
|
61
|
+
Every item in @omega.js/desktop's default template carries a stable id you can target.
|
|
62
|
+
|
|
63
|
+
### macOS App menu (the one labeled with your app name)
|
|
64
|
+
|
|
65
|
+
| ID | Item | Notes |
|
|
66
|
+
|---|---|---|
|
|
67
|
+
| `main/about` | About | |
|
|
68
|
+
| `main/check-for-updates` | Check for Updates… | Auto-updater wired |
|
|
69
|
+
| `main/preferences` | Preferences… | `visible:false` by default — use `menu.show('main/preferences')` |
|
|
70
|
+
| `main/services` | Services submenu | |
|
|
71
|
+
| `main/hide` | Hide | |
|
|
72
|
+
| `main/hide-others` | Hide Others | |
|
|
73
|
+
| `main/show-all` | Show All | |
|
|
74
|
+
| `main/relaunch` | Relaunch | Restarts the app |
|
|
75
|
+
| `main/quit` | Quit | |
|
|
76
|
+
|
|
77
|
+
### File menu (win/linux equivalents of the App menu)
|
|
78
|
+
|
|
79
|
+
| ID | Item | Notes |
|
|
80
|
+
|---|---|---|
|
|
81
|
+
| `file/close` | Close (mac only) | |
|
|
82
|
+
| `file/preferences` | Preferences… (win/linux) | `visible:false` by default |
|
|
83
|
+
| `file/relaunch` | Relaunch (win/linux) | |
|
|
84
|
+
| `file/quit` | Exit | |
|
|
85
|
+
|
|
86
|
+
### Cross-platform
|
|
87
|
+
|
|
88
|
+
| ID | Item |
|
|
89
|
+
|---|---|
|
|
90
|
+
| `edit/undo`, `edit/redo`, `edit/cut`, `edit/copy`, `edit/paste`, `edit/select-all`, `edit/delete` | Edit submenu |
|
|
91
|
+
| `edit/paste-and-match-style` | mac only |
|
|
92
|
+
| `view/reload`, `view/reset-zoom`, `view/zoom-in`, `view/zoom-out`, `view/toggle-fullscreen` | View submenu |
|
|
93
|
+
| `view/developer` | Submenu (dev mode only) |
|
|
94
|
+
| `view/developer/toggle-devtools` | Toggle Developer Tools |
|
|
95
|
+
| `view/developer/inspect-elements` | Inspect Element |
|
|
96
|
+
| `view/developer/force-reload` | Force Reload |
|
|
97
|
+
| `view/developer/simulate-update` | Simulate update submenu (see [docs/auto-updater.md](auto-updater.md)) |
|
|
98
|
+
| `view/developer/simulate-update/available`, `.../unavailable`, `.../error` | Run the update simulator for one scenario |
|
|
99
|
+
| `window/minimize`, `window/zoom`, `window/front` | Window submenu (mac) |
|
|
100
|
+
| `window/minimize`, `window/close` | Window submenu (win/linux) |
|
|
101
|
+
|
|
102
|
+
### Help menu
|
|
103
|
+
|
|
104
|
+
| ID | Item | Notes |
|
|
105
|
+
|---|---|---|
|
|
106
|
+
| `help/check-for-updates` | Check for Updates… (win/linux only) | Auto-updater wired |
|
|
107
|
+
| `help/website` | "`<brandName>` Home" | Only when `brand.url` configured |
|
|
108
|
+
|
|
109
|
+
### Development menu (dev mode only)
|
|
110
|
+
|
|
111
|
+
Top-level, only visible when `manager.isDevelopment()`. Mirrors legacy @omega.js/desktop's developer utilities.
|
|
112
|
+
|
|
113
|
+
| ID | Item | Action |
|
|
114
|
+
|---|---|---|
|
|
115
|
+
| `development/open-exe-folder` | Open exe folder | Reveals `app.getPath('exe')` |
|
|
116
|
+
| `development/open-user-data` | Open user data folder | Reveals `app.getPath('userData')` |
|
|
117
|
+
| `development/open-logs` | Open logs folder | Reveals `app.getPath('logs')` |
|
|
118
|
+
| `development/open-app-config` | Open app config folder | Reveals `app.getPath('appData')` |
|
|
119
|
+
| `development/test-error` | Throw test error | Throws an uncaught error (verifies sentry / error handling) |
|
|
120
|
+
|
|
121
|
+
## Built-in framework items
|
|
122
|
+
|
|
123
|
+
`main/check-for-updates` (mac) and `help/check-for-updates` (win/linux) are **wired to `manager.autoUpdater`**:
|
|
124
|
+
- Label updates dynamically: *Checking…*, *Downloading 42%*, *Restart to Update v1.2.3*, *You're up to date*.
|
|
125
|
+
- Click triggers `autoUpdater.checkNow()` or `autoUpdater.installNow()` depending on state.
|
|
126
|
+
|
|
127
|
+
The same hook also patches the tray's `check-for-updates` item if present, so both UIs stay in lockstep.
|
|
128
|
+
|
|
129
|
+
Patch or remove either as needed — the auto-updater hook is a no-op when the item is missing.
|
|
130
|
+
|
|
131
|
+
## Item descriptors
|
|
132
|
+
|
|
133
|
+
Same dynamic conveniences as tray:
|
|
134
|
+
- `label` / `enabled` / `visible` / `checked` may be functions, evaluated on every `refresh()`
|
|
135
|
+
- `click` wrapped to catch errors
|
|
136
|
+
- `submenu` recursively resolved
|
|
137
|
+
|
|
138
|
+
## Runtime API on `manager.menu`
|
|
139
|
+
|
|
140
|
+
```js
|
|
141
|
+
manager.menu.refresh() // re-evaluate dynamic state
|
|
142
|
+
manager.menu.define(fn) // replace the whole definition at runtime
|
|
143
|
+
manager.menu.destroy() // tear down (mostly for tests)
|
|
144
|
+
manager.menu.disable() // turn the menu off entirely (idempotent)
|
|
145
|
+
|
|
146
|
+
// Id-path API — same as listed above.
|
|
147
|
+
manager.menu.find('main/check-for-updates')
|
|
148
|
+
manager.menu.update('main/check-for-updates', { label: 'Updates...' })
|
|
149
|
+
manager.menu.remove('view/reload')
|
|
150
|
+
manager.menu.insertAfter('main/check-for-updates', { id: 'main/account', label: 'Account...' })
|
|
151
|
+
|
|
152
|
+
// Inspection
|
|
153
|
+
manager.menu.getItems() // top-level descriptors (shallow copy)
|
|
154
|
+
manager.menu.isRendered() // bool
|
|
155
|
+
manager.menu.getMenu() // the underlying Electron Menu instance
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
## Default scaffold
|
|
159
|
+
|
|
160
|
+
The scaffold every verb runs ships `src/integrations/menu/index.js` calling `menu.useDefaults()` plus commented-out examples (show preferences, insertAfter, update, remove, hide, add a Tools menu, appendTo).
|