@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,214 @@
|
|
|
1
|
+
// Startup — open-at-login + launch-mode management.
|
|
2
|
+
//
|
|
3
|
+
// Two independent things this lib controls:
|
|
4
|
+
//
|
|
5
|
+
// 1. `startup.mode` — how the app launches when the USER opens it directly:
|
|
6
|
+
// normal — default. Dock icon visible on macOS, taskbar entry on Windows.
|
|
7
|
+
// hidden — packaged builds get LSUIElement=true on macOS (zero dock bounce, no
|
|
8
|
+
// dock icon, not in Cmd+Tab). Tray/notifications/networking still work.
|
|
9
|
+
// Consumer surfaces UI later via `manager.windows.create('main')`, which
|
|
10
|
+
// calls app.dock.show() automatically so the icon appears alongside the
|
|
11
|
+
// window. Use this for menubar apps, agent apps, anything that should
|
|
12
|
+
// be invisible until the user explicitly asks for UI.
|
|
13
|
+
//
|
|
14
|
+
// 2. `startup.openAtLogin` — what the OS does at user login:
|
|
15
|
+
// enabled (default true) — register the app to auto-launch at login.
|
|
16
|
+
// mode (default 'hidden') — what mode the app launches in WHEN OS-launched.
|
|
17
|
+
// Independent from the user-launch mode above.
|
|
18
|
+
//
|
|
19
|
+
// @omega.js/desktop does NOT auto-create any windows anymore — the consumer's main.js drives that.
|
|
20
|
+
// So "isLaunchHidden" no longer needs to gate window creation; we just expose the
|
|
21
|
+
// raw mode and let the consumer decide whether to call `manager.windows.create()`.
|
|
22
|
+
//
|
|
23
|
+
// Detection: macOS sets `getLoginItemSettings().wasOpenedAtLogin = true`. On Windows we
|
|
24
|
+
// register the login item with `--omega-launched-at-login` arg and check process.argv.
|
|
25
|
+
// On Linux there's no standard signal, so we treat all launches as user-launches.
|
|
26
|
+
|
|
27
|
+
const LoggerLite = require('./logger-lite.js');
|
|
28
|
+
|
|
29
|
+
const logger = new LoggerLite('startup');
|
|
30
|
+
|
|
31
|
+
// Valid startup modes. `tray-only` is now folded into `hidden` (they were always the
|
|
32
|
+
// same idea — LSUIElement on macOS — so we collapse to a single name).
|
|
33
|
+
const VALID_MODES = ['normal', 'hidden'];
|
|
34
|
+
const LOGIN_ARG = '--omega-launched-at-login'; // marker for Windows + Linux login-launch detection
|
|
35
|
+
|
|
36
|
+
const startup = {
|
|
37
|
+
_initialized: false,
|
|
38
|
+
_manager: null,
|
|
39
|
+
_electron: null,
|
|
40
|
+
|
|
41
|
+
initialize(manager) {
|
|
42
|
+
if (startup._initialized) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
startup._manager = manager;
|
|
47
|
+
startup._electron = require('electron');
|
|
48
|
+
|
|
49
|
+
const mode = startup.getMode();
|
|
50
|
+
const loginEnabled = startup._loginEnabled();
|
|
51
|
+
const loginMode = startup._loginMode();
|
|
52
|
+
const isDev = startup._isDev();
|
|
53
|
+
|
|
54
|
+
// In dev, force open-at-login OFF regardless of config. And actively UNSET any prior
|
|
55
|
+
// registration so a dev run that previously ran with config:enabled=true doesn't leave
|
|
56
|
+
// electron.app (or worse, a stale dev binary path) trying to launch every login.
|
|
57
|
+
// Otherwise: sync the OS open-at-login flag with config. Pass --omega-launched-at-login
|
|
58
|
+
// in args so we can detect login launches reliably on Windows/Linux (macOS exposes
|
|
59
|
+
// wasOpenedAtLogin natively).
|
|
60
|
+
if (isDev) {
|
|
61
|
+
startup._electron.app.setLoginItemSettings({
|
|
62
|
+
openAtLogin: false,
|
|
63
|
+
openAsHidden: false,
|
|
64
|
+
args: [],
|
|
65
|
+
});
|
|
66
|
+
} else {
|
|
67
|
+
startup._electron.app.setLoginItemSettings({
|
|
68
|
+
openAtLogin: loginEnabled,
|
|
69
|
+
openAsHidden: loginMode === 'hidden',
|
|
70
|
+
args: loginEnabled ? [LOGIN_ARG] : [],
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Boot summary — RAW inputs (what the OS/shell gave us) + RESOLVED values (what @omega.js/desktop
|
|
75
|
+
// decided to act on). Two parallel blocks so you can debug in either direction:
|
|
76
|
+
// "Why is @omega.js/desktop behaving like X?" → check resolved values
|
|
77
|
+
// "Why did @omega.js/desktop decide X?" → check raw inputs
|
|
78
|
+
const macLogin = process.platform === 'darwin' ? startup._electron.app.getLoginItemSettings() : null;
|
|
79
|
+
const emEnv = Object.fromEntries(
|
|
80
|
+
Object.entries(process.env).filter(([k]) => k.startsWith('EM_') || k === 'ELECTRON_RUN_AS_NODE' || k === 'NODE_ENV')
|
|
81
|
+
);
|
|
82
|
+
const launchedAtLogin = startup.wasLaunchedAtLogin();
|
|
83
|
+
const launchedAtLoginVia = startup._launchedAtLoginVia();
|
|
84
|
+
const isHidden = startup.isLaunchHidden();
|
|
85
|
+
|
|
86
|
+
logger.log('startup boot summary — RAW inputs:');
|
|
87
|
+
logger.log(` process.argv: ${JSON.stringify(process.argv.slice(1))}`);
|
|
88
|
+
logger.log(` process.platform: ${process.platform}`);
|
|
89
|
+
logger.log(` process.arch: ${process.arch}`);
|
|
90
|
+
logger.log(` app.isPackaged: ${startup._electron.app.isPackaged}`);
|
|
91
|
+
logger.log(` app.getLoginItemSettings(): ${macLogin ? JSON.stringify(macLogin) : '(not macOS)'}`);
|
|
92
|
+
logger.log(` EM_/electron/node env: ${JSON.stringify(emEnv)}`);
|
|
93
|
+
|
|
94
|
+
logger.log('startup boot summary — RESOLVED values:');
|
|
95
|
+
logger.log(` config.startup.mode: ${mode}`);
|
|
96
|
+
logger.log(` config.startup.openAtLogin: ${isDev ? 'OFF (dev — config ignored)' : `{enabled:${loginEnabled}, mode:${loginMode}}`}`);
|
|
97
|
+
logger.log(` isDev: ${isDev}`);
|
|
98
|
+
logger.log(` hasLoginArg: ${process.argv.includes(LOGIN_ARG)}`);
|
|
99
|
+
logger.log(` wasLaunchedAtLogin(): ${launchedAtLogin}${launchedAtLogin ? ` (via ${launchedAtLoginVia})` : ''}`);
|
|
100
|
+
logger.log(` isLaunchHidden(): ${isHidden}`);
|
|
101
|
+
startup._initialized = true;
|
|
102
|
+
},
|
|
103
|
+
|
|
104
|
+
// Internal: report HOW we determined this launch was at login. Used by initialize logging
|
|
105
|
+
// to distinguish "fake login via --omega-launched-at-login flag" from "real macOS at-login".
|
|
106
|
+
_launchedAtLoginVia() {
|
|
107
|
+
if (process.argv.includes(LOGIN_ARG)) return 'argv-flag';
|
|
108
|
+
if (process.platform === 'darwin' && startup._electron.app.getLoginItemSettings().wasOpenedAtLogin) {
|
|
109
|
+
return 'macos-wasOpenedAtLogin';
|
|
110
|
+
}
|
|
111
|
+
return 'none';
|
|
112
|
+
},
|
|
113
|
+
|
|
114
|
+
// Should we suppress login-item changes? Suppressed in any non-production run (dev OR
|
|
115
|
+
// testing) so we never touch the real user's OS login items outside a packaged build.
|
|
116
|
+
// OMEGA_FORCE_LOGIN_ITEM=1 bypasses the guard so you can intentionally exercise the flow.
|
|
117
|
+
_isDev() {
|
|
118
|
+
if (process.env.OMEGA_FORCE_LOGIN_ITEM === '1') return false;
|
|
119
|
+
return !startup._manager.isProduction();
|
|
120
|
+
},
|
|
121
|
+
|
|
122
|
+
// Returns the resolved user-launch mode, defaulting to 'normal' for unknown values.
|
|
123
|
+
getMode() {
|
|
124
|
+
const raw = startup._manager.config.startup?.mode || 'normal';
|
|
125
|
+
return VALID_MODES.includes(raw) ? raw : 'normal';
|
|
126
|
+
},
|
|
127
|
+
|
|
128
|
+
// openAtLogin block reads. `_loginEnabled` defaults to true; `_loginMode` defaults to 'hidden'.
|
|
129
|
+
_loginEnabled() {
|
|
130
|
+
const v = startup._manager.config.startup?.openAtLogin;
|
|
131
|
+
if (typeof v === 'boolean') return v; // back-compat for boolean form
|
|
132
|
+
if (v && typeof v === 'object') return v.enabled !== false; // object form: default true
|
|
133
|
+
return true; // unset → true (apps open at login by default)
|
|
134
|
+
},
|
|
135
|
+
|
|
136
|
+
_loginMode() {
|
|
137
|
+
const v = startup._manager.config.startup?.openAtLogin;
|
|
138
|
+
if (v && typeof v === 'object' && VALID_MODES.includes(v.mode)) return v.mode;
|
|
139
|
+
return 'hidden'; // default: launch hidden at login
|
|
140
|
+
},
|
|
141
|
+
|
|
142
|
+
// True if this launch is hidden — combines user-launch mode (always honored) with
|
|
143
|
+
// login-launch mode (only honored when the app was launched at login). Consumers can
|
|
144
|
+
// read this to decide whether to call manager.windows.create() during boot.
|
|
145
|
+
isLaunchHidden() {
|
|
146
|
+
if (startup.getMode() === 'hidden') return true;
|
|
147
|
+
if (startup.wasLaunchedAtLogin() && startup._loginMode() === 'hidden') return true;
|
|
148
|
+
return false;
|
|
149
|
+
},
|
|
150
|
+
|
|
151
|
+
// Did the OS launch us at login (vs the user opening the app directly)?
|
|
152
|
+
// macOS: getLoginItemSettings().wasOpenedAtLogin.
|
|
153
|
+
// Windows/Linux: we registered with LOGIN_ARG, look for it in argv.
|
|
154
|
+
wasLaunchedAtLogin() {
|
|
155
|
+
if (process.argv.includes(LOGIN_ARG)) return true;
|
|
156
|
+
if (process.platform === 'darwin') {
|
|
157
|
+
return Boolean(startup._electron.app.getLoginItemSettings().wasOpenedAtLogin);
|
|
158
|
+
}
|
|
159
|
+
return false;
|
|
160
|
+
},
|
|
161
|
+
|
|
162
|
+
// Apply the runtime side of the mode (dock.hide for macOS). Called from main.js
|
|
163
|
+
// BEFORE whenReady so the dock animation is suppressed as early as JS allows.
|
|
164
|
+
// Note: in packaged tray-only builds the plist already prevents the dock entry,
|
|
165
|
+
// so this call is a no-op there. In dev or hidden mode it shaves the visible time.
|
|
166
|
+
applyEarly() {
|
|
167
|
+
if (!startup._electron) return;
|
|
168
|
+
if (process.platform !== 'darwin') return;
|
|
169
|
+
if (!startup.isLaunchHidden()) return;
|
|
170
|
+
|
|
171
|
+
startup._electron.app.dock.hide();
|
|
172
|
+
},
|
|
173
|
+
|
|
174
|
+
// Public mutators
|
|
175
|
+
|
|
176
|
+
// Toggle the OS open-at-login flag. Pass a boolean for back-compat, or an object
|
|
177
|
+
// { enabled, mode } to control both. Persists via setLoginItemSettings; does not mutate config.
|
|
178
|
+
// No-op in dev (no packaged build = no point registering electron.app for login-launch).
|
|
179
|
+
setOpenAtLogin(input) {
|
|
180
|
+
if (startup._isDev()) {
|
|
181
|
+
logger.log('setOpenAtLogin ignored — running in dev mode (set OMEGA_FORCE_LOGIN_ITEM=1 to override)');
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
let enabled;
|
|
186
|
+
let openAsHidden;
|
|
187
|
+
if (typeof input === 'boolean') {
|
|
188
|
+
enabled = input;
|
|
189
|
+
openAsHidden = startup._loginMode() !== 'normal';
|
|
190
|
+
} else if (input && typeof input === 'object') {
|
|
191
|
+
enabled = input.enabled !== false;
|
|
192
|
+
const mode = VALID_MODES.includes(input.mode) ? input.mode : startup._loginMode();
|
|
193
|
+
openAsHidden = mode === 'hidden';
|
|
194
|
+
} else {
|
|
195
|
+
enabled = true;
|
|
196
|
+
openAsHidden = startup._loginMode() !== 'normal';
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
startup._electron.app.setLoginItemSettings({
|
|
200
|
+
openAtLogin: enabled,
|
|
201
|
+
openAsHidden,
|
|
202
|
+
args: enabled ? [LOGIN_ARG] : [],
|
|
203
|
+
});
|
|
204
|
+
logger.log(`setOpenAtLogin → enabled=${enabled} openAsHidden=${openAsHidden}`);
|
|
205
|
+
},
|
|
206
|
+
|
|
207
|
+
// Read the current OS open-at-login state (may differ from config if user changed it
|
|
208
|
+
// via System Settings; useful for keeping a settings UI in sync).
|
|
209
|
+
isOpenAtLogin() {
|
|
210
|
+
return Boolean(startup._electron.app.getLoginItemSettings().openAtLogin);
|
|
211
|
+
},
|
|
212
|
+
};
|
|
213
|
+
|
|
214
|
+
module.exports = startup;
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
// Storage — unified KV store for main + renderer.
|
|
2
|
+
//
|
|
3
|
+
// Main-side (sync, direct disk-backed via electron-store):
|
|
4
|
+
// manager.storage.get(key, default)
|
|
5
|
+
// manager.storage.set(key, value)
|
|
6
|
+
// manager.storage.delete(key)
|
|
7
|
+
// manager.storage.has(key)
|
|
8
|
+
// manager.storage.clear()
|
|
9
|
+
// manager.storage.onChange(key, fn) // returns unsubscribe fn
|
|
10
|
+
//
|
|
11
|
+
// Renderer-side (async, proxied through preload contextBridge → IPC → main):
|
|
12
|
+
// window.desktop.storage.get(key, default) → Promise
|
|
13
|
+
// window.desktop.storage.set(key, value) → Promise
|
|
14
|
+
// etc.
|
|
15
|
+
//
|
|
16
|
+
// Key paths support dot-notation (e.g. 'window.main.bounds') natively via electron-store.
|
|
17
|
+
//
|
|
18
|
+
// Storage file lives at:
|
|
19
|
+
// macOS: ~/Library/Application Support/<productName>/config.json
|
|
20
|
+
// Windows: %APPDATA%/<productName>/config.json
|
|
21
|
+
// Linux: ~/.config/<productName>/config.json
|
|
22
|
+
|
|
23
|
+
const LoggerLite = require('./logger-lite.js');
|
|
24
|
+
const ipc = require('./ipc.js');
|
|
25
|
+
|
|
26
|
+
const logger = new LoggerLite('storage');
|
|
27
|
+
|
|
28
|
+
const storage = {
|
|
29
|
+
_initialized: false,
|
|
30
|
+
_manager: null,
|
|
31
|
+
_store: null,
|
|
32
|
+
_changeSubs: {}, // key -> Set<fn>
|
|
33
|
+
_ipcRegistered: false,
|
|
34
|
+
|
|
35
|
+
async initialize(manager) {
|
|
36
|
+
if (storage._initialized) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
storage._manager = manager;
|
|
41
|
+
|
|
42
|
+
let ElectronStore;
|
|
43
|
+
try {
|
|
44
|
+
// electron-store is ESM-only. The STATIC specifier is what matters: the
|
|
45
|
+
// bundler inlines it INTO main.bundle.js (no lazy chunk, no runtime
|
|
46
|
+
// resolution) — packaged consumers need nothing installed. Unbundled
|
|
47
|
+
// (@omega.js/desktop's own harness), Node resolves it from
|
|
48
|
+
// @omega.js/desktop's node_modules. Pinned by
|
|
49
|
+
// src/test/suites/boot/storage-bundled.test.js.
|
|
50
|
+
const mod = await import('electron-store');
|
|
51
|
+
ElectronStore = mod.default || mod;
|
|
52
|
+
} catch (e) {
|
|
53
|
+
logger.warn(`electron-store not available — storage running as no-op. (${e.message})`);
|
|
54
|
+
storage._initialized = true;
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const electron = require('electron');
|
|
58
|
+
|
|
59
|
+
// Build the store. Filename is `omega-storage.json` (electron-store appends .json).
|
|
60
|
+
// Production name is read from electron's app.name (set automatically from package.productName).
|
|
61
|
+
const projectName = manager.config.app?.productName || electron.app.getName();
|
|
62
|
+
|
|
63
|
+
storage._store = new ElectronStore({
|
|
64
|
+
name: 'omega-storage',
|
|
65
|
+
// electron-store handles the cwd; no need to override unless we want a custom path.
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
logger.log(`initialize — file=${storage._store.path} (project=${projectName})`);
|
|
69
|
+
|
|
70
|
+
// Register main-side IPC handlers so the renderer proxy works.
|
|
71
|
+
storage._registerIpc();
|
|
72
|
+
|
|
73
|
+
storage._initialized = true;
|
|
74
|
+
},
|
|
75
|
+
|
|
76
|
+
_registerIpc() {
|
|
77
|
+
if (storage._ipcRegistered) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (!ipc._initialized) {
|
|
82
|
+
// ipc is initialized before storage in the boot sequence; if we're here, ipc is unavailable
|
|
83
|
+
// (e.g. running outside electron). Skip silently — main-side API still works.
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
ipc.handle('desktop:storage:get', ({ key, def }) => storage.get(key, def));
|
|
88
|
+
ipc.handle('desktop:storage:set', ({ key, val }) => { storage.set(key, val); return true; });
|
|
89
|
+
ipc.handle('desktop:storage:delete', ({ key }) => { storage.delete(key); return true; });
|
|
90
|
+
ipc.handle('desktop:storage:has', ({ key }) => storage.has(key));
|
|
91
|
+
ipc.handle('desktop:storage:clear', () => { storage.clear(); return true; });
|
|
92
|
+
|
|
93
|
+
storage._ipcRegistered = true;
|
|
94
|
+
},
|
|
95
|
+
|
|
96
|
+
// Main-side public API
|
|
97
|
+
get(key, defaultValue) {
|
|
98
|
+
if (!storage._store) {
|
|
99
|
+
return defaultValue;
|
|
100
|
+
}
|
|
101
|
+
const value = storage._store.get(key);
|
|
102
|
+
return value === undefined ? defaultValue : value;
|
|
103
|
+
},
|
|
104
|
+
|
|
105
|
+
set(key, value) {
|
|
106
|
+
if (!storage._store) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
const previous = storage._store.get(key);
|
|
110
|
+
storage._store.set(key, value);
|
|
111
|
+
|
|
112
|
+
// Notify subscribers
|
|
113
|
+
const subs = storage._changeSubs[key];
|
|
114
|
+
if (subs) {
|
|
115
|
+
subs.forEach((fn) => {
|
|
116
|
+
try {
|
|
117
|
+
fn(value, previous);
|
|
118
|
+
} catch (e) {
|
|
119
|
+
logger.error('onChange subscriber threw:', e);
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Broadcast change to all renderers so renderer caches can invalidate.
|
|
125
|
+
storage._broadcast(key, value, previous);
|
|
126
|
+
},
|
|
127
|
+
|
|
128
|
+
delete(key) {
|
|
129
|
+
if (!storage._store) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
const previous = storage._store.get(key);
|
|
133
|
+
storage._store.delete(key);
|
|
134
|
+
|
|
135
|
+
const subs = storage._changeSubs[key];
|
|
136
|
+
if (subs) {
|
|
137
|
+
subs.forEach((fn) => {
|
|
138
|
+
try {
|
|
139
|
+
fn(undefined, previous);
|
|
140
|
+
} catch (e) {
|
|
141
|
+
logger.error('onChange subscriber threw:', e);
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
storage._broadcast(key, undefined, previous);
|
|
147
|
+
},
|
|
148
|
+
|
|
149
|
+
has(key) {
|
|
150
|
+
if (!storage._store) {
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
return storage._store.has(key);
|
|
154
|
+
},
|
|
155
|
+
|
|
156
|
+
clear() {
|
|
157
|
+
if (!storage._store) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
storage._store.clear();
|
|
161
|
+
storage._broadcast('*', undefined, undefined);
|
|
162
|
+
},
|
|
163
|
+
|
|
164
|
+
// Subscribe to changes for a specific key. Returns an unsubscribe function.
|
|
165
|
+
onChange(key, fn) {
|
|
166
|
+
if (!storage._changeSubs[key]) {
|
|
167
|
+
storage._changeSubs[key] = new Set();
|
|
168
|
+
}
|
|
169
|
+
storage._changeSubs[key].add(fn);
|
|
170
|
+
|
|
171
|
+
return () => {
|
|
172
|
+
const set = storage._changeSubs[key];
|
|
173
|
+
if (set) {
|
|
174
|
+
set.delete(fn);
|
|
175
|
+
if (set.size === 0) {
|
|
176
|
+
delete storage._changeSubs[key];
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
},
|
|
181
|
+
|
|
182
|
+
_broadcast(key, value, previous) {
|
|
183
|
+
if (!ipc._initialized) return;
|
|
184
|
+
ipc.broadcast('desktop:storage:change', { key, value, previous });
|
|
185
|
+
},
|
|
186
|
+
|
|
187
|
+
// Expose the on-disk path (handy for debugging)
|
|
188
|
+
getPath() {
|
|
189
|
+
return storage._store?.path || null;
|
|
190
|
+
},
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
module.exports = storage;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
// Templating — light token-replacement engine for HTML/CSS/JS at build time.
|
|
2
|
+
//
|
|
3
|
+
// Wraps node-powertools' template() with framework-friendly defaults:
|
|
4
|
+
// - Brackets are `{{ }}` (matches BXM/UJM convention).
|
|
5
|
+
// - Standard variable scope built from manager.config + page metadata.
|
|
6
|
+
//
|
|
7
|
+
// Public API:
|
|
8
|
+
// manager.templating.render(input, vars) // arbitrary string + arbitrary vars
|
|
9
|
+
// manager.templating.buildPageVars(pageName, extras) // produces { brand, app, page, theme, cacheBust }
|
|
10
|
+
// manager.templating.renderPage(pageTemplate, vars) // shortcut that uses {{ }} brackets
|
|
11
|
+
//
|
|
12
|
+
// Manager.initialize calls .initialize(manager) but the lib is mostly used at build time
|
|
13
|
+
// (gulp/html), not at runtime. The runtime surface is exposed for consumer hooks that want
|
|
14
|
+
// to template their own strings.
|
|
15
|
+
|
|
16
|
+
const LoggerLite = require('./logger-lite.js');
|
|
17
|
+
const { template } = require('node-powertools');
|
|
18
|
+
|
|
19
|
+
const logger = new LoggerLite('templating');
|
|
20
|
+
|
|
21
|
+
const DEFAULT_BRACKETS = ['{{', '}}'];
|
|
22
|
+
|
|
23
|
+
const templating = {
|
|
24
|
+
_initialized: false,
|
|
25
|
+
_manager: null,
|
|
26
|
+
|
|
27
|
+
initialize(manager) {
|
|
28
|
+
templating._manager = manager;
|
|
29
|
+
templating._initialized = true;
|
|
30
|
+
logger.log('initialize');
|
|
31
|
+
},
|
|
32
|
+
|
|
33
|
+
// Render an arbitrary template string with the given vars. Brackets default to {{ }}.
|
|
34
|
+
render(input, vars, opts) {
|
|
35
|
+
opts = opts || {};
|
|
36
|
+
const brackets = opts.brackets || DEFAULT_BRACKETS;
|
|
37
|
+
return template(String(input || ''), vars || {}, { brackets });
|
|
38
|
+
},
|
|
39
|
+
|
|
40
|
+
// Build the standard variable scope for a page render. Combines manager.config with
|
|
41
|
+
// page-specific metadata + cache-buster for asset URLs.
|
|
42
|
+
// `manager` is optional — buildPageVars works at build time (where Manager singleton is built
|
|
43
|
+
// from build.js) without needing the runtime manager singleton.
|
|
44
|
+
buildPageVars(pageName, extras, manager) {
|
|
45
|
+
const m = manager || templating._manager;
|
|
46
|
+
const cfg = (m && m.config) || (m && typeof m.getConfig === 'function' ? m.getConfig() : {}) || {};
|
|
47
|
+
// Pull version from the consumer's package.json at build time. This baked-in
|
|
48
|
+
// string is used by templates that want to display the running version in the
|
|
49
|
+
// UI (e.g. "v1.0.5" in a footer). At runtime it always matches the version
|
|
50
|
+
// that was packaged + signed + uploaded, since both come from the same
|
|
51
|
+
// package.json read.
|
|
52
|
+
const pkg = (m && typeof m.getPackage === 'function' ? m.getPackage('project') : null) || {};
|
|
53
|
+
const appBlock = { ...(cfg.app || {}) };
|
|
54
|
+
if (pkg.version && !appBlock.version) appBlock.version = pkg.version;
|
|
55
|
+
const vars = {
|
|
56
|
+
brand: cfg.brand || {},
|
|
57
|
+
app: appBlock,
|
|
58
|
+
// 'system' is inert as a data-bs-theme value (Bootstrap knows light/dark only) —
|
|
59
|
+
// the preload's theme applier replaces it with the RESOLVED appearance at runtime.
|
|
60
|
+
theme: { appearance: cfg.theme?.appearance || 'system' },
|
|
61
|
+
page: {
|
|
62
|
+
name: pageName,
|
|
63
|
+
title: (extras && extras.title) || cfg.app?.productName || cfg.brand?.name || 'App',
|
|
64
|
+
},
|
|
65
|
+
cacheBust: String((extras && extras.cacheBust) || Date.now()),
|
|
66
|
+
// Slot for the body content. gulp/html sets this after rendering the inner view.
|
|
67
|
+
content: (extras && extras.content) || '',
|
|
68
|
+
};
|
|
69
|
+
if (extras && typeof extras === 'object') {
|
|
70
|
+
// Merge any extra keys (e.g. content), but don't clobber the structured groups above
|
|
71
|
+
// unless explicitly provided.
|
|
72
|
+
for (const [k, v] of Object.entries(extras)) {
|
|
73
|
+
if (v !== undefined) vars[k] = v;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return vars;
|
|
77
|
+
},
|
|
78
|
+
|
|
79
|
+
// Convenience: render a page template (outer shell) with the given vars.
|
|
80
|
+
renderPage(pageTemplate, vars) {
|
|
81
|
+
return templating.render(pageTemplate, vars);
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
module.exports = templating;
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
// Theme — system-aware dynamic appearance (light / dark / follow-the-OS).
|
|
2
|
+
//
|
|
3
|
+
// Main-side API:
|
|
4
|
+
// manager.theme.get() → 'system' | 'light' | 'dark' (the SOURCE — what's chosen)
|
|
5
|
+
// manager.theme.resolved() → 'light' | 'dark' (what's actually showing)
|
|
6
|
+
// manager.theme.set(source) → apply + persist a new source
|
|
7
|
+
// manager.theme.onChange(fn) → fn({ source, resolved }) on every effective change; returns unsubscribe
|
|
8
|
+
//
|
|
9
|
+
// Renderer-side (preload contextBridge):
|
|
10
|
+
// window.desktop.theme.get() → Promise<{ source, resolved }>
|
|
11
|
+
// window.desktop.theme.set(s) → Promise<{ source, resolved }>
|
|
12
|
+
// window.desktop.theme.onChange(fn) — matchMedia-powered (see below); returns unsubscribe
|
|
13
|
+
//
|
|
14
|
+
// How it works: everything rides on Electron's `nativeTheme.themeSource`, which accepts
|
|
15
|
+
// exactly the same three values. Setting it (a) drives `shouldUseDarkColors`, (b) flips
|
|
16
|
+
// `prefers-color-scheme` in EVERY renderer of the app — BrowserWindows AND
|
|
17
|
+
// WebContentsViews — firing their matchMedia listeners, and (c) makes native UI (menus,
|
|
18
|
+
// dialogs) follow. Renderers therefore SELF-RESOLVE via matchMedia instead of depending
|
|
19
|
+
// on `ipc.broadcast` (which only reaches BrowserWindows — embedded WebContentsViews
|
|
20
|
+
// would never hear it). The `desktop:theme:changed` broadcast below is a main-side courtesy
|
|
21
|
+
// for windows that want the source+resolved pair pushed; it is not the sync mechanism.
|
|
22
|
+
//
|
|
23
|
+
// Source resolution at boot: storage override (the user's runtime choice) → config
|
|
24
|
+
// `theme.appearance` (the app's default) → 'system'. Invalid values fall through.
|
|
25
|
+
//
|
|
26
|
+
// The `<html data-bs-theme>` attribute is applied/maintained by the preload's theme
|
|
27
|
+
// applier on every framework-templated page (see src/preload.js) — pages that don't carry the
|
|
28
|
+
// attribute (e.g. external sites loaded in an embedding consumer's web views) are left
|
|
29
|
+
// untouched.
|
|
30
|
+
|
|
31
|
+
const LoggerLite = require('./logger-lite.js');
|
|
32
|
+
const ipc = require('./ipc.js');
|
|
33
|
+
|
|
34
|
+
const logger = new LoggerLite('theme');
|
|
35
|
+
|
|
36
|
+
const STORAGE_KEY = 'theme';
|
|
37
|
+
const SOURCES = ['system', 'light', 'dark'];
|
|
38
|
+
|
|
39
|
+
const theme = {
|
|
40
|
+
_initialized: false,
|
|
41
|
+
_manager: null,
|
|
42
|
+
_nativeTheme: null,
|
|
43
|
+
_listeners: new Set(),
|
|
44
|
+
_lastEmitted: null,
|
|
45
|
+
_onNativeUpdated: null,
|
|
46
|
+
|
|
47
|
+
initialize(manager) {
|
|
48
|
+
if (theme._initialized) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
theme._manager = manager;
|
|
53
|
+
|
|
54
|
+
let nativeTheme;
|
|
55
|
+
try {
|
|
56
|
+
nativeTheme = require('electron').nativeTheme;
|
|
57
|
+
} catch (e) {
|
|
58
|
+
nativeTheme = null;
|
|
59
|
+
}
|
|
60
|
+
if (!nativeTheme) {
|
|
61
|
+
logger.warn('nativeTheme not available — theme running as no-op.');
|
|
62
|
+
theme._initialized = true;
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
theme._nativeTheme = nativeTheme;
|
|
66
|
+
|
|
67
|
+
// Boot source: storage override → config default → 'system'.
|
|
68
|
+
const stored = manager.storage.get(`${STORAGE_KEY}.appearance`);
|
|
69
|
+
const configured = manager.config?.theme?.appearance;
|
|
70
|
+
const source = SOURCES.includes(stored) ? stored
|
|
71
|
+
: SOURCES.includes(configured) ? configured
|
|
72
|
+
: 'system';
|
|
73
|
+
|
|
74
|
+
nativeTheme.themeSource = source;
|
|
75
|
+
logger.log(`initialize — source=${source} (stored=${stored ?? '—'} config=${configured ?? '—'}) resolved=${theme.resolved()}`);
|
|
76
|
+
|
|
77
|
+
// OS preference changes (in 'system' mode) and themeSource flips both land here.
|
|
78
|
+
theme._onNativeUpdated = () => theme._emitChange();
|
|
79
|
+
nativeTheme.on('updated', theme._onNativeUpdated);
|
|
80
|
+
|
|
81
|
+
theme._registerIpc();
|
|
82
|
+
|
|
83
|
+
theme._lastEmitted = `${theme.get()}|${theme.resolved()}`;
|
|
84
|
+
theme._initialized = true;
|
|
85
|
+
},
|
|
86
|
+
|
|
87
|
+
_registerIpc() {
|
|
88
|
+
if (!ipc._initialized) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
ipc.handle('desktop:theme:get', () => ({ source: theme.get(), resolved: theme.resolved() }));
|
|
93
|
+
ipc.handle('desktop:theme:set', ({ source }) => {
|
|
94
|
+
theme.set(source);
|
|
95
|
+
return { source: theme.get(), resolved: theme.resolved() };
|
|
96
|
+
});
|
|
97
|
+
},
|
|
98
|
+
|
|
99
|
+
// The chosen source ('system' tracks the OS; 'light'/'dark' are explicit overrides).
|
|
100
|
+
get() {
|
|
101
|
+
return theme._nativeTheme ? theme._nativeTheme.themeSource : 'system';
|
|
102
|
+
},
|
|
103
|
+
|
|
104
|
+
// What's actually showing right now.
|
|
105
|
+
resolved() {
|
|
106
|
+
return theme._nativeTheme?.shouldUseDarkColors ? 'dark' : 'light';
|
|
107
|
+
},
|
|
108
|
+
|
|
109
|
+
// Apply + persist a new source. Throws on anything outside the three valid values —
|
|
110
|
+
// a bad call is a programmer error, not a state to limp through.
|
|
111
|
+
set(source) {
|
|
112
|
+
if (!SOURCES.includes(source)) {
|
|
113
|
+
throw new Error(`theme.set: invalid source '${source}' — expected 'system' | 'light' | 'dark'.`);
|
|
114
|
+
}
|
|
115
|
+
if (!theme._nativeTheme) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
theme._manager.storage.set(`${STORAGE_KEY}.appearance`, source);
|
|
120
|
+
theme._nativeTheme.themeSource = source;
|
|
121
|
+
|
|
122
|
+
// nativeTheme 'updated' only fires when the RESOLVED appearance changes — a
|
|
123
|
+
// source change with the same resolution (e.g. system-resolving-dark → dark)
|
|
124
|
+
// would otherwise go unannounced. _emitChange dedupes, so when 'updated' also
|
|
125
|
+
// fires this is still exactly one notification.
|
|
126
|
+
theme._emitChange();
|
|
127
|
+
},
|
|
128
|
+
|
|
129
|
+
// Subscribe to effective changes (source or resolution). Returns an unsubscribe fn.
|
|
130
|
+
onChange(fn) {
|
|
131
|
+
theme._listeners.add(fn);
|
|
132
|
+
return () => theme._listeners.delete(fn);
|
|
133
|
+
},
|
|
134
|
+
|
|
135
|
+
_emitChange() {
|
|
136
|
+
const payload = { source: theme.get(), resolved: theme.resolved() };
|
|
137
|
+
const stamp = `${payload.source}|${payload.resolved}`;
|
|
138
|
+
if (stamp === theme._lastEmitted) {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
theme._lastEmitted = stamp;
|
|
142
|
+
|
|
143
|
+
logger.log(`changed — source=${payload.source} resolved=${payload.resolved}`);
|
|
144
|
+
|
|
145
|
+
theme._listeners.forEach((fn) => {
|
|
146
|
+
try {
|
|
147
|
+
fn(payload);
|
|
148
|
+
} catch (e) {
|
|
149
|
+
logger.error('onChange subscriber threw:', e);
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
if (ipc._initialized) {
|
|
154
|
+
ipc.broadcast('desktop:theme:changed', payload);
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
|
|
158
|
+
// Tear down listeners + IPC (idempotent).
|
|
159
|
+
disable() {
|
|
160
|
+
if (theme._nativeTheme && theme._onNativeUpdated) {
|
|
161
|
+
theme._nativeTheme.removeListener('updated', theme._onNativeUpdated);
|
|
162
|
+
theme._onNativeUpdated = null;
|
|
163
|
+
}
|
|
164
|
+
theme._listeners.clear();
|
|
165
|
+
if (ipc._initialized) {
|
|
166
|
+
ipc.unhandle('desktop:theme:get');
|
|
167
|
+
ipc.unhandle('desktop:theme:set');
|
|
168
|
+
}
|
|
169
|
+
theme._initialized = false;
|
|
170
|
+
},
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
module.exports = theme;
|