@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,509 @@
|
|
|
1
|
+
// Window manager — named-window registry over BrowserWindow.
|
|
2
|
+
//
|
|
3
|
+
// **Lazy creation.** @omega.js/desktop does NOT auto-create any windows. Consumers call
|
|
4
|
+
// `manager.windows.create('main', opts?)` from their main.js when they want UI
|
|
5
|
+
// to surface — typically right after `manager.initialize()` resolves, but may
|
|
6
|
+
// be deferred (e.g. agent apps that only show UI when the user clicks the tray).
|
|
7
|
+
//
|
|
8
|
+
// Defaults baked in (no JSON config required):
|
|
9
|
+
// main → { width: 1024, height: 720, hideOnClose: true, view: 'main' }
|
|
10
|
+
// any other → { width: 800, height: 600, hideOnClose: false, view: name }
|
|
11
|
+
//
|
|
12
|
+
// Override at the call site:
|
|
13
|
+
// manager.windows.create('main', { width: 1280, height: 800 });
|
|
14
|
+
// manager.windows.create('settings', { width: 600, height: 480 });
|
|
15
|
+
//
|
|
16
|
+
// `view` resolves to `<projectRoot>/dist/views/<view>/index.html`.
|
|
17
|
+
//
|
|
18
|
+
// Optional config (only if you need to override defaults persistently):
|
|
19
|
+
// "windows": { "main": { "width": 1280, "height": 800 } }
|
|
20
|
+
// — overrides flow into create() unless overridden again at call site.
|
|
21
|
+
//
|
|
22
|
+
// macOS dock auto-show: when `LSUIElement: true` is baked at build time
|
|
23
|
+
// (`startup.mode = 'hidden'`), the app launches with NO dock icon. The first
|
|
24
|
+
// time `create()` or `show()` runs, @omega.js/desktop calls `app.dock.show()` so the icon
|
|
25
|
+
// appears alongside the window.
|
|
26
|
+
//
|
|
27
|
+
// Bounds persistence: every named window's position + size is saved to storage
|
|
28
|
+
// on resize/move/close and restored on the next create(). Disable per-window
|
|
29
|
+
// with `persistBounds: false`. Storage key: `windows.<name>.bounds`.
|
|
30
|
+
|
|
31
|
+
const path = require('path');
|
|
32
|
+
const LoggerLite = require('./logger-lite.js');
|
|
33
|
+
|
|
34
|
+
const logger = new LoggerLite('window-manager');
|
|
35
|
+
|
|
36
|
+
const SAVE_DEBOUNCE_MS = 250;
|
|
37
|
+
|
|
38
|
+
const windowManager = {
|
|
39
|
+
_initialized: false,
|
|
40
|
+
_manager: null,
|
|
41
|
+
_windows: {}, // name -> BrowserWindow
|
|
42
|
+
_saveTimers: {}, // name -> debounce timer
|
|
43
|
+
_electron: null,
|
|
44
|
+
|
|
45
|
+
initialize(manager) {
|
|
46
|
+
windowManager._manager = manager;
|
|
47
|
+
windowManager._initialized = true;
|
|
48
|
+
|
|
49
|
+
windowManager._electron = require('electron');
|
|
50
|
+
|
|
51
|
+
// Quit when all windows close on win/linux. macOS is sticky (apps stay running).
|
|
52
|
+
if (process.platform !== 'darwin') {
|
|
53
|
+
windowManager._electron.app.on('window-all-closed', () => {
|
|
54
|
+
windowManager._electron.app.quit();
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// macOS: when the user clicks the dock icon or double-clicks the running app
|
|
59
|
+
// (e.g. CleanMyMac-style: launches hidden at login as tray-only, but double-clicking
|
|
60
|
+
// opens the main window), surface `main`. We only show — never create — so @omega.js/desktop's "no
|
|
61
|
+
// auto-create" contract holds. The consumer is expected to have called
|
|
62
|
+
// `windows.create('main', { show: !startup.isLaunchHidden() })` at boot, which puts
|
|
63
|
+
// the window in the registry but invisible in hidden-mode launches.
|
|
64
|
+
if (process.platform === 'darwin') {
|
|
65
|
+
windowManager._electron.app.on('activate', () => {
|
|
66
|
+
const main = windowManager.get('main');
|
|
67
|
+
if (!main) {
|
|
68
|
+
logger.log('activate (macOS) — no main window in registry; ignoring. (consumer should call windows.create(\'main\', { show: false }) at boot to enable hidden-mode reopen)');
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
logger.log(`activate (macOS) — surfacing main (visible=${main.isVisible()}, minimized=${main.isMinimized()})`);
|
|
72
|
+
if (main.isMinimized()) main.restore();
|
|
73
|
+
windowManager._ensureDockVisible();
|
|
74
|
+
main.show();
|
|
75
|
+
main.focus();
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
logger.log('initialize');
|
|
80
|
+
},
|
|
81
|
+
|
|
82
|
+
// Public create() — canonical name. Accepts (name, overrides?) so consumers
|
|
83
|
+
// can configure entirely from main.js without touching JSON. Falls through to
|
|
84
|
+
// createNamed which does the heavy lifting.
|
|
85
|
+
async create(name, overrides) {
|
|
86
|
+
return windowManager.createNamed(name, windowManager._manager, overrides);
|
|
87
|
+
},
|
|
88
|
+
|
|
89
|
+
// Create or focus a named window. Args:
|
|
90
|
+
// name — registry key + default view name + storage key for bounds.
|
|
91
|
+
// manager — Manager instance (defaults to the one passed to initialize()).
|
|
92
|
+
// overrides — optional opts that take precedence over config.windows.<name>.
|
|
93
|
+
async createNamed(name, manager, overrides) {
|
|
94
|
+
manager = manager || windowManager._manager;
|
|
95
|
+
overrides = overrides || {};
|
|
96
|
+
|
|
97
|
+
// Single-instance dedup
|
|
98
|
+
const existing = windowManager._windows[name];
|
|
99
|
+
if (existing && !existing.isDestroyed()) {
|
|
100
|
+
logger.log(`createNamed: focusing existing window "${name}"`);
|
|
101
|
+
windowManager._surface(existing, name);
|
|
102
|
+
if (!windowManager._isStealth()) {
|
|
103
|
+
existing.focus();
|
|
104
|
+
}
|
|
105
|
+
return existing;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if (!windowManager._electron) {
|
|
109
|
+
logger.warn(`createNamed: electron not available, cannot create "${name}"`);
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const { BrowserWindow } = windowManager._electron;
|
|
114
|
+
|
|
115
|
+
// Resolve final per-window config: framework defaults < JSON config < call-site overrides.
|
|
116
|
+
// Defaults are split: `main` gets a wider default + hideOnClose; everything else gets a
|
|
117
|
+
// smaller default + close-actually-closes.
|
|
118
|
+
const isMain = name === 'main';
|
|
119
|
+
const defaults = isMain
|
|
120
|
+
? { width: 1024, height: 720, view: 'main', hideOnClose: true }
|
|
121
|
+
: { width: 800, height: 600, view: name, hideOnClose: false };
|
|
122
|
+
const jsonConfig = manager.config.windows?.[name] || {};
|
|
123
|
+
const config = { ...defaults, ...jsonConfig, ...overrides };
|
|
124
|
+
|
|
125
|
+
logger.log(`createNamed: building "${name}" (show=${config.show !== false}, hideOnClose=${config.hideOnClose})`);
|
|
126
|
+
|
|
127
|
+
const persistBounds = config.persistBounds !== false;
|
|
128
|
+
const appRoot = require('../utils/app-root.js')();
|
|
129
|
+
const viewName = config.view || name;
|
|
130
|
+
// Built outputs live under dist/. window-manager always loads from there;
|
|
131
|
+
// the gulp pipeline produces them.
|
|
132
|
+
const htmlPath = path.join(appRoot, 'dist', 'views', viewName, 'index.html');
|
|
133
|
+
const preloadPath = path.join(appRoot, 'dist', 'preload.bundle.js');
|
|
134
|
+
|
|
135
|
+
// Resolve initial bounds: saved bounds (if any + valid + persistBounds enabled)
|
|
136
|
+
// override config defaults. `x` and `y` are passed through from config when set
|
|
137
|
+
// (so call-site overrides like `{ x: 100, y: 100 }` actually take effect).
|
|
138
|
+
const defaultBounds = {
|
|
139
|
+
width: config.width || 1024,
|
|
140
|
+
height: config.height || 720,
|
|
141
|
+
};
|
|
142
|
+
if (typeof config.x === 'number') defaultBounds.x = config.x;
|
|
143
|
+
if (typeof config.y === 'number') defaultBounds.y = config.y;
|
|
144
|
+
const savedBounds = persistBounds ? windowManager._loadBounds(name, manager) : null;
|
|
145
|
+
const bounds = savedBounds
|
|
146
|
+
? windowManager._clampToDisplays(savedBounds)
|
|
147
|
+
: defaultBounds;
|
|
148
|
+
|
|
149
|
+
// skipTaskbar is per-window now. The old startup-mode 'tray-only' has been folded
|
|
150
|
+
// into 'hidden' (LSUIElement on macOS) — visibility in the dock is handled by the
|
|
151
|
+
// Info.plist flag, not by skipTaskbar on individual windows.
|
|
152
|
+
const skipTaskbar = config.skipTaskbar === true;
|
|
153
|
+
|
|
154
|
+
// Inset titlebar by default. Mac → traffic lights inset into the window, Windows →
|
|
155
|
+
// native min/max/close overlay drawn by the OS in the corner of our chrome region,
|
|
156
|
+
// Linux → native frame (no override). Override per-window via config.windows.<name>.
|
|
157
|
+
// titleBar: 'inset' (default) | 'native' (frame:true everywhere)
|
|
158
|
+
// Consumers needing finer control (custom overlay color, frame:false everywhere)
|
|
159
|
+
// can pass `electronBuilder`-style options via config.windows.<name>.titleBarOverlay
|
|
160
|
+
// / config.windows.<name>.frame.
|
|
161
|
+
const titleBarMode = config.titleBar || 'inset';
|
|
162
|
+
const isMac = process.platform === 'darwin';
|
|
163
|
+
const isWin = process.platform === 'win32';
|
|
164
|
+
|
|
165
|
+
const titleBarOpts = {};
|
|
166
|
+
if (titleBarMode === 'inset') {
|
|
167
|
+
if (isMac) {
|
|
168
|
+
titleBarOpts.titleBarStyle = 'hiddenInset';
|
|
169
|
+
// Custom traffic-light position (e.g. centered inside a floating chrome
|
|
170
|
+
// panel) — config.windows.<name>.trafficLightPosition = { x, y }.
|
|
171
|
+
if (config.trafficLightPosition) {
|
|
172
|
+
titleBarOpts.trafficLightPosition = config.trafficLightPosition;
|
|
173
|
+
}
|
|
174
|
+
} else if (isWin) {
|
|
175
|
+
titleBarOpts.titleBarStyle = 'hidden';
|
|
176
|
+
titleBarOpts.titleBarOverlay = config.titleBarOverlay || {
|
|
177
|
+
color: config.backgroundColor || '#ffffff',
|
|
178
|
+
symbolColor: '#000000',
|
|
179
|
+
height: 36,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
// Linux → native frame, no override.
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
const winOpts = {
|
|
186
|
+
width: bounds.width,
|
|
187
|
+
height: bounds.height,
|
|
188
|
+
minWidth: config.minWidth || 400,
|
|
189
|
+
minHeight: config.minHeight || 300,
|
|
190
|
+
show: false, // flicker prevention — show on ready-to-show
|
|
191
|
+
// Tray-only apps suppress all taskbar/dock representation for their windows.
|
|
192
|
+
skipTaskbar,
|
|
193
|
+
title: config.title || manager.config.app?.productName || name,
|
|
194
|
+
backgroundColor: config.backgroundColor || '#ffffff',
|
|
195
|
+
...titleBarOpts,
|
|
196
|
+
webPreferences: {
|
|
197
|
+
preload: preloadPath,
|
|
198
|
+
contextIsolation: true,
|
|
199
|
+
sandbox: false, // preload uses require()
|
|
200
|
+
nodeIntegration: false,
|
|
201
|
+
devTools: true,
|
|
202
|
+
},
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
if (typeof bounds.x === 'number' && typeof bounds.y === 'number') {
|
|
206
|
+
winOpts.x = bounds.x;
|
|
207
|
+
winOpts.y = bounds.y;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
const win = new BrowserWindow(winOpts);
|
|
211
|
+
|
|
212
|
+
windowManager._windows[name] = win;
|
|
213
|
+
|
|
214
|
+
// Restore maximized/fullscreen state if it was saved.
|
|
215
|
+
if (persistBounds && savedBounds) {
|
|
216
|
+
if (savedBounds.maximized) win.maximize();
|
|
217
|
+
if (savedBounds.fullscreen) win.setFullScreen(true);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// Attach the context-menu listener so right-click works in this window.
|
|
221
|
+
manager.contextMenu.attach(win.webContents);
|
|
222
|
+
|
|
223
|
+
// ALL event listeners must attach BEFORE `await loadFile()` below — otherwise the
|
|
224
|
+
// window can be in the registry but missing close/resize/etc. listeners during the
|
|
225
|
+
// ~ms window between BrowserWindow construction and load completion. Boot tests +
|
|
226
|
+
// any code that inspects/interacts with the window via the registry before await
|
|
227
|
+
// resolves would see an inconsistent state.
|
|
228
|
+
|
|
229
|
+
// Show when ready (unless config says otherwise).
|
|
230
|
+
win.once('ready-to-show', () => {
|
|
231
|
+
if (config.show !== false) {
|
|
232
|
+
logger.log(`window "${name}": ready-to-show — surfacing`);
|
|
233
|
+
windowManager._surface(win, name);
|
|
234
|
+
} else {
|
|
235
|
+
logger.log(`window "${name}": ready-to-show — staying invisible (show:false at create)`);
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
// Visibility lifecycle — high-signal for debugging hidden-mode + hide-on-close.
|
|
240
|
+
win.on('show', () => logger.log(`window "${name}": show event`));
|
|
241
|
+
win.on('hide', () => logger.log(`window "${name}": hide event`));
|
|
242
|
+
win.on('focus', () => logger.log(`window "${name}": focus event`));
|
|
243
|
+
win.on('minimize', () => logger.log(`window "${name}": minimize event`));
|
|
244
|
+
win.on('restore', () => logger.log(`window "${name}": restore event`));
|
|
245
|
+
win.on('closed', () => logger.log(`window "${name}": closed (destroyed)`));
|
|
246
|
+
|
|
247
|
+
// Bounds persistence — save on resize/move/maximize/unmaximize/enter|leave-fullscreen.
|
|
248
|
+
if (persistBounds) {
|
|
249
|
+
const saveDebounced = () => windowManager._scheduleSave(name);
|
|
250
|
+
win.on('resize', saveDebounced);
|
|
251
|
+
win.on('move', saveDebounced);
|
|
252
|
+
win.on('maximize', saveDebounced);
|
|
253
|
+
win.on('unmaximize', saveDebounced);
|
|
254
|
+
win.on('enter-full-screen', saveDebounced);
|
|
255
|
+
win.on('leave-full-screen', saveDebounced);
|
|
256
|
+
// Also flush on close so the final state lands even if a debounce is pending.
|
|
257
|
+
win.on('close', () => windowManager._saveBoundsNow(name));
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// Hide-on-close vs quit-on-close.
|
|
261
|
+
//
|
|
262
|
+
// Default `hideOnClose: true` for the `main` window — Discord-style behavior on
|
|
263
|
+
// every platform (X = hide, real quit only via Cmd+Q / menu Quit / tray Quit /
|
|
264
|
+
// auto-updater install). Other named windows default to `false` (X = close).
|
|
265
|
+
// Consumers override per-window via config.windows.<name>.hideOnClose.
|
|
266
|
+
//
|
|
267
|
+
// Three escape hatches let a close-event ACTUALLY close:
|
|
268
|
+
// 1. `manager._allowQuit` — set by manager.quit({ force: true }) and by the
|
|
269
|
+
// auto-updater before installNow().
|
|
270
|
+
// 2. `manager._isQuitting` — set by app.on('before-quit'), so any quit path
|
|
271
|
+
// Electron knows about (Cmd+Q, role:'quit' menu, app.quit() programmatic,
|
|
272
|
+
// OS shutdown) flows through naturally.
|
|
273
|
+
// 3. `win._emForceClose` — per-window override for one-off "close this for
|
|
274
|
+
// real" scenarios.
|
|
275
|
+
const hideOnClose = config.hideOnClose === true;
|
|
276
|
+
|
|
277
|
+
win.on('close', (event) => {
|
|
278
|
+
const allowQuit = manager._allowQuit === true;
|
|
279
|
+
const isQuitting = manager._isQuitting === true;
|
|
280
|
+
const force = win._emForceClose === true;
|
|
281
|
+
|
|
282
|
+
if (hideOnClose && !allowQuit && !isQuitting && !force) {
|
|
283
|
+
event.preventDefault();
|
|
284
|
+
logger.log(`window "${name}": close intercepted (hide-on-close) — hiding instead`);
|
|
285
|
+
win.hide();
|
|
286
|
+
} else {
|
|
287
|
+
logger.log(`window "${name}": close allowed (hideOnClose=${hideOnClose}, allowQuit=${allowQuit}, isQuitting=${isQuitting}, force=${force})`);
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
// LSUIElement apps (startup.mode='hidden'): hiding the last visible window —
|
|
292
|
+
// hide-on-close X, windows.hide(), any consumer hide() — drops the dock icon
|
|
293
|
+
// again so the app returns to its fully-invisible posture. Inverse of the
|
|
294
|
+
// dock.show() that surfacing performed. See _maybeRehideDock.
|
|
295
|
+
win.on('hide', () => windowManager._maybeRehideDock());
|
|
296
|
+
|
|
297
|
+
// Cleanup on real close
|
|
298
|
+
win.on('closed', () => {
|
|
299
|
+
delete windowManager._windows[name];
|
|
300
|
+
if (windowManager._saveTimers[name]) {
|
|
301
|
+
clearTimeout(windowManager._saveTimers[name]);
|
|
302
|
+
delete windowManager._saveTimers[name];
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
// Load the HTML *after* all listeners are attached, so the window is fully observable
|
|
307
|
+
// by the time loadFile completes. This also means createNamed's returned promise
|
|
308
|
+
// resolves with a fully-wired window, which is what consumers + tests expect.
|
|
309
|
+
try {
|
|
310
|
+
await win.loadFile(htmlPath);
|
|
311
|
+
logger.log(`createNamed: loaded ${htmlPath} for "${name}"`);
|
|
312
|
+
} catch (e) {
|
|
313
|
+
logger.error(`createNamed: failed to load ${htmlPath}`, e);
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
return win;
|
|
317
|
+
},
|
|
318
|
+
|
|
319
|
+
// Bounds persistence ──────────────────────────────────────────────────────────
|
|
320
|
+
|
|
321
|
+
_scheduleSave(name) {
|
|
322
|
+
if (windowManager._saveTimers[name]) {
|
|
323
|
+
clearTimeout(windowManager._saveTimers[name]);
|
|
324
|
+
}
|
|
325
|
+
windowManager._saveTimers[name] = setTimeout(() => {
|
|
326
|
+
delete windowManager._saveTimers[name];
|
|
327
|
+
windowManager._saveBoundsNow(name);
|
|
328
|
+
}, SAVE_DEBOUNCE_MS);
|
|
329
|
+
},
|
|
330
|
+
|
|
331
|
+
_saveBoundsNow(name) {
|
|
332
|
+
const win = windowManager._windows[name];
|
|
333
|
+
if (!win || win.isDestroyed()) return;
|
|
334
|
+
|
|
335
|
+
const storage = windowManager._manager.storage;
|
|
336
|
+
|
|
337
|
+
// Use getNormalBounds when maximized/fullscreen so we restore to the underlying size on next launch.
|
|
338
|
+
const isMaximized = win.isMaximized();
|
|
339
|
+
const isFullScreen = win.isFullScreen();
|
|
340
|
+
const rawBounds = (isMaximized || isFullScreen)
|
|
341
|
+
? win.getNormalBounds()
|
|
342
|
+
: win.getBounds();
|
|
343
|
+
|
|
344
|
+
const bounds = {
|
|
345
|
+
x: rawBounds.x,
|
|
346
|
+
y: rawBounds.y,
|
|
347
|
+
width: rawBounds.width,
|
|
348
|
+
height: rawBounds.height,
|
|
349
|
+
maximized: isMaximized,
|
|
350
|
+
fullscreen: isFullScreen,
|
|
351
|
+
};
|
|
352
|
+
|
|
353
|
+
storage.set(`windows.${name}.bounds`, bounds);
|
|
354
|
+
},
|
|
355
|
+
|
|
356
|
+
_loadBounds(name, manager) {
|
|
357
|
+
const storage = (manager || windowManager._manager).storage;
|
|
358
|
+
|
|
359
|
+
const saved = storage.get(`windows.${name}.bounds`);
|
|
360
|
+
if (!saved || typeof saved !== 'object') return null;
|
|
361
|
+
if (typeof saved.width !== 'number' || typeof saved.height !== 'number') return null;
|
|
362
|
+
if (saved.width < 100 || saved.height < 100) return null; // sanity floor
|
|
363
|
+
|
|
364
|
+
return saved;
|
|
365
|
+
},
|
|
366
|
+
|
|
367
|
+
// Keep the window on a real display. If saved bounds put the top-left off-screen
|
|
368
|
+
// (monitor unplugged, resolution changed), discard the position and just keep the size.
|
|
369
|
+
_clampToDisplays(bounds) {
|
|
370
|
+
const out = { ...bounds };
|
|
371
|
+
|
|
372
|
+
if (typeof out.x !== 'number' || typeof out.y !== 'number') {
|
|
373
|
+
return out;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
const displays = windowManager._electron.screen.getAllDisplays();
|
|
377
|
+
const onScreen = displays.some((d) => {
|
|
378
|
+
const wa = d.workArea;
|
|
379
|
+
// Require at least 100x50px of overlap with this display so a barely-visible window doesn't pass.
|
|
380
|
+
const overlapX = Math.max(0, Math.min(out.x + out.width, wa.x + wa.width) - Math.max(out.x, wa.x));
|
|
381
|
+
const overlapY = Math.max(0, Math.min(out.y + out.height, wa.y + wa.height) - Math.max(out.y, wa.y));
|
|
382
|
+
return overlapX >= 100 && overlapY >= 50;
|
|
383
|
+
});
|
|
384
|
+
|
|
385
|
+
if (!onScreen) {
|
|
386
|
+
delete out.x;
|
|
387
|
+
delete out.y;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
return out;
|
|
391
|
+
},
|
|
392
|
+
|
|
393
|
+
// Public API ──────────────────────────────────────────────────────────────────
|
|
394
|
+
|
|
395
|
+
get(name) {
|
|
396
|
+
const win = windowManager._windows[name];
|
|
397
|
+
if (!win || win.isDestroyed()) {
|
|
398
|
+
return null;
|
|
399
|
+
}
|
|
400
|
+
return win;
|
|
401
|
+
},
|
|
402
|
+
|
|
403
|
+
show(name) {
|
|
404
|
+
const win = windowManager.get(name);
|
|
405
|
+
if (!win) {
|
|
406
|
+
logger.warn(`show: no window named "${name}"`);
|
|
407
|
+
return;
|
|
408
|
+
}
|
|
409
|
+
logger.log(`show("${name}") — visible=${win.isVisible()} → showing`);
|
|
410
|
+
windowManager._surface(win, name);
|
|
411
|
+
if (!windowManager._isStealth()) {
|
|
412
|
+
win.focus();
|
|
413
|
+
}
|
|
414
|
+
},
|
|
415
|
+
|
|
416
|
+
// ── Test stealth ──────────────────────────────────────────────────────────
|
|
417
|
+
// In Testing mode windows surface INVISIBLY so test runs don't interrupt the
|
|
418
|
+
// developer: shown INACTIVE (keyboard focus never leaves their editor),
|
|
419
|
+
// opacity 0, and click-through (real OS clicks pass through to whatever is
|
|
420
|
+
// underneath; synthetic test input — executeJavaScript, sendInputEvent — is
|
|
421
|
+
// unaffected). Set OMEGA_TEST_SHOW=1 to surface windows normally and watch a
|
|
422
|
+
// run live.
|
|
423
|
+
//
|
|
424
|
+
// Deliberately NOT hide()/minimize(): occluded windows get throttled by
|
|
425
|
+
// Chromium — requestAnimationFrame pauses and document.visibilityState flips
|
|
426
|
+
// to 'hidden' — so tests would exercise a DIFFERENT runtime. An opacity-0,
|
|
427
|
+
// shown-inactive window keeps rendering, focus semantics, and timers
|
|
428
|
+
// identical to a visible one.
|
|
429
|
+
//
|
|
430
|
+
// App-level activation (macOS launching a test process and yanking keyboard
|
|
431
|
+
// focus app-wide) is suppressed separately — main.js flips the app to the
|
|
432
|
+
// accessory activation policy under the same predicate.
|
|
433
|
+
_isStealth() {
|
|
434
|
+
return require('../utils/test-stealth.js')(windowManager._manager);
|
|
435
|
+
},
|
|
436
|
+
|
|
437
|
+
// Surface a window: normal show (+ dock) — or stealth-show in Testing mode.
|
|
438
|
+
// The stealth recipe itself lives in utils/stealth-window.js (shared with
|
|
439
|
+
// main.js's browser-window-created hook, which covers RAW windows).
|
|
440
|
+
_surface(win, name) {
|
|
441
|
+
if (windowManager._isStealth()) {
|
|
442
|
+
logger.log(`window "${name}": surfacing STEALTH (testing) — inactive, opacity 0, click-through (OMEGA_TEST_SHOW=1 to watch)`);
|
|
443
|
+
require('../utils/stealth-window.js').applyStealth(win);
|
|
444
|
+
win.showInactive();
|
|
445
|
+
return;
|
|
446
|
+
}
|
|
447
|
+
windowManager._ensureDockVisible();
|
|
448
|
+
win.show();
|
|
449
|
+
},
|
|
450
|
+
|
|
451
|
+
// Internal: make the macOS dock icon appear if it's currently hidden (LSUIElement
|
|
452
|
+
// mode). No-op on Windows/Linux. Idempotent. Called automatically by show()/create()
|
|
453
|
+
// whenever we surface a window — apps that ship with LSUIElement=true (mode='hidden')
|
|
454
|
+
// are completely invisible until UI is requested, then dock + window appear together.
|
|
455
|
+
_ensureDockVisible() {
|
|
456
|
+
if (process.platform !== 'darwin') return;
|
|
457
|
+
const { dock } = windowManager._electron.app;
|
|
458
|
+
if (dock.isVisible()) {
|
|
459
|
+
logger.log('_ensureDockVisible — dock already visible');
|
|
460
|
+
return;
|
|
461
|
+
}
|
|
462
|
+
logger.log('_ensureDockVisible — calling dock.show()');
|
|
463
|
+
dock.show();
|
|
464
|
+
},
|
|
465
|
+
|
|
466
|
+
// Inverse of _ensureDockVisible, for LSUIElement apps only (startup.mode='hidden'):
|
|
467
|
+
// when the LAST visible window hides, drop the dock icon (and with it the Cmd+Tab
|
|
468
|
+
// entry) so the app disappears completely again — dock and UI appear and vanish
|
|
469
|
+
// TOGETHER. Normal-mode apps keep their dock icon for life; quit paths are left
|
|
470
|
+
// alone. No-op off macOS. Wired to every named window's 'hide' event.
|
|
471
|
+
_maybeRehideDock() {
|
|
472
|
+
if (process.platform !== 'darwin') return;
|
|
473
|
+
const manager = windowManager._manager;
|
|
474
|
+
if (manager.startup.getMode() !== 'hidden') return;
|
|
475
|
+
if (manager._isQuitting === true) return;
|
|
476
|
+
|
|
477
|
+
const anyVisible = Object.values(windowManager._windows)
|
|
478
|
+
.some((win) => !win.isDestroyed() && win.isVisible());
|
|
479
|
+
if (anyVisible) return;
|
|
480
|
+
|
|
481
|
+
const { dock } = windowManager._electron.app;
|
|
482
|
+
if (!dock.isVisible()) return;
|
|
483
|
+
logger.log('_maybeRehideDock — last visible window hidden; dock.hide() (startup.mode=hidden)');
|
|
484
|
+
dock.hide();
|
|
485
|
+
},
|
|
486
|
+
|
|
487
|
+
hide(name) {
|
|
488
|
+
const win = windowManager.get(name);
|
|
489
|
+
if (!win) return;
|
|
490
|
+
win.hide();
|
|
491
|
+
},
|
|
492
|
+
|
|
493
|
+
close(name) {
|
|
494
|
+
const win = windowManager.get(name);
|
|
495
|
+
if (!win) return;
|
|
496
|
+
win._emForceClose = true;
|
|
497
|
+
win.close();
|
|
498
|
+
},
|
|
499
|
+
|
|
500
|
+
// List all currently-open named windows
|
|
501
|
+
list() {
|
|
502
|
+
return Object.keys(windowManager._windows).filter((name) => {
|
|
503
|
+
const w = windowManager._windows[name];
|
|
504
|
+
return w && !w.isDestroyed();
|
|
505
|
+
});
|
|
506
|
+
},
|
|
507
|
+
};
|
|
508
|
+
|
|
509
|
+
module.exports = windowManager;
|