@omega.js/extension 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (684) hide show
  1. package/LICENSE +98 -0
  2. package/README.md +194 -0
  3. package/bin/omega +2 -0
  4. package/bin/omega-extension +2 -0
  5. package/bin/omg +2 -0
  6. package/dist/assets/css/bundles/.gitkeep +0 -0
  7. package/dist/assets/css/components/content/index.scss +5 -0
  8. package/dist/assets/css/components/options/index.scss +9 -0
  9. package/dist/assets/css/components/pages/index.scss +5 -0
  10. package/dist/assets/css/components/popup/index.scss +9 -0
  11. package/dist/assets/css/core/_animations.scss +64 -0
  12. package/dist/assets/css/core/_fontawesome.scss +146 -0
  13. package/dist/assets/css/core/_initialize.scss +23 -0
  14. package/dist/assets/css/core/_utilities.scss +80 -0
  15. package/dist/assets/css/omega-extension.scss +43 -0
  16. package/dist/assets/css/shell/_index.scss +207 -0
  17. package/dist/assets/css/tokens/_index.scss +166 -0
  18. package/dist/assets/js/core/app-shell.js +136 -0
  19. package/dist/assets/js/libs/initialize-tooltips.js +31 -0
  20. package/dist/assets/js/libs/recaptcha.js +94 -0
  21. package/dist/assets/js/main.js +4 -0
  22. package/dist/assets/themes/_template/README.md +115 -0
  23. package/dist/assets/themes/_template/_config.scss +60 -0
  24. package/dist/assets/themes/_template/_theme.js +14 -0
  25. package/dist/assets/themes/_template/_theme.scss +28 -0
  26. package/dist/assets/themes/_template/css/base/_root.scss +19 -0
  27. package/dist/assets/themes/_template/css/components/_components.scss +23 -0
  28. package/dist/assets/themes/base/README.md +5 -0
  29. package/dist/assets/themes/base/_components/data/org-chart/component.html +33 -0
  30. package/dist/assets/themes/base/_components/data/org-chart/component.json5 +33 -0
  31. package/dist/assets/themes/base/_components/data/org-chart/component.scss +183 -0
  32. package/dist/assets/themes/base/_components/heading/masthead/component.html +22 -0
  33. package/dist/assets/themes/base/_components/heading/masthead/component.json5 +30 -0
  34. package/dist/assets/themes/base/_components/heading/section-head/component.html +18 -0
  35. package/dist/assets/themes/base/_components/heading/section-head/component.json5 +27 -0
  36. package/dist/assets/themes/base/_components/pricing/features/component.html +29 -0
  37. package/dist/assets/themes/base/_components/pricing/features/component.json5 +30 -0
  38. package/dist/assets/themes/base/_hero/orbit/index.html +30 -0
  39. package/dist/assets/themes/base/_hero/orbit/script.js +33 -0
  40. package/dist/assets/themes/base/_hero/orbit/style.scss +133 -0
  41. package/dist/assets/themes/base/_includes/admin/sections/sidebar.html +3 -0
  42. package/dist/assets/themes/base/_includes/admin/sections/topbar.html +3 -0
  43. package/dist/assets/themes/base/_includes/backend/sections/sidebar.html +3 -0
  44. package/dist/assets/themes/base/_includes/backend/sections/topbar.html +3 -0
  45. package/dist/assets/themes/base/_includes/frontend/components/connection-card.html +49 -0
  46. package/dist/assets/themes/base/_includes/frontend/components/post-card.html +54 -0
  47. package/dist/assets/themes/base/_includes/frontend/sections/account-connections.html +42 -0
  48. package/dist/assets/themes/base/_includes/frontend/sections/account-section-header.html +11 -0
  49. package/dist/assets/themes/base/_includes/frontend/sections/footer.html +154 -0
  50. package/dist/assets/themes/base/_includes/frontend/sections/nav.html +276 -0
  51. package/dist/assets/themes/base/_includes/global/sections/account.html +72 -0
  52. package/dist/assets/themes/base/_includes/global/sections/app-sidebar.html +248 -0
  53. package/dist/assets/themes/base/_includes/global/sections/app-topbar.html +228 -0
  54. package/dist/assets/themes/base/_includes/global/sections/page-header.html +99 -0
  55. package/dist/assets/themes/base/_layouts/admin/core/minimal-viewport-locked.html +22 -0
  56. package/dist/assets/themes/base/_layouts/admin/core/minimal.html +23 -0
  57. package/dist/assets/themes/base/_layouts/backend/core/base.html +57 -0
  58. package/dist/assets/themes/base/_layouts/backend/core/minimal-viewport-locked.html +32 -0
  59. package/dist/assets/themes/base/_layouts/backend/core/minimal.html +32 -0
  60. package/dist/assets/themes/base/_layouts/backend/pages/dashboard/index.html +230 -0
  61. package/dist/assets/themes/base/_layouts/frontend/core/base.html +31 -0
  62. package/dist/assets/themes/base/_layouts/frontend/core/cover.html +40 -0
  63. package/dist/assets/themes/base/_layouts/frontend/core/minimal.html +47 -0
  64. package/dist/assets/themes/base/_layouts/frontend/pages/404.html +54 -0
  65. package/dist/assets/themes/base/_layouts/frontend/pages/about.html +144 -0
  66. package/dist/assets/themes/base/_layouts/frontend/pages/account/index.html +2104 -0
  67. package/dist/assets/themes/base/_layouts/frontend/pages/alternatives/alternative.html +319 -0
  68. package/dist/assets/themes/base/_layouts/frontend/pages/alternatives/index.html +186 -0
  69. package/dist/assets/themes/base/_layouts/frontend/pages/app.html +142 -0
  70. package/dist/assets/themes/base/_layouts/frontend/pages/auth/reset.html +53 -0
  71. package/dist/assets/themes/base/_layouts/frontend/pages/auth/signin.html +90 -0
  72. package/dist/assets/themes/base/_layouts/frontend/pages/auth/signup.html +141 -0
  73. package/dist/assets/themes/base/_layouts/frontend/pages/auth/token.html +44 -0
  74. package/dist/assets/themes/base/_layouts/frontend/pages/blog/categories/category.html +88 -0
  75. package/dist/assets/themes/base/_layouts/frontend/pages/blog/categories/index.html +88 -0
  76. package/dist/assets/themes/base/_layouts/frontend/pages/blog/index.html +255 -0
  77. package/dist/assets/themes/base/_layouts/frontend/pages/blog/post.html +261 -0
  78. package/dist/assets/themes/base/_layouts/frontend/pages/blog/tags/index.html +84 -0
  79. package/dist/assets/themes/base/_layouts/frontend/pages/blog/tags/tag.html +88 -0
  80. package/dist/assets/themes/base/_layouts/frontend/pages/collection/category.html +72 -0
  81. package/dist/assets/themes/base/_layouts/frontend/pages/collection/document.html +54 -0
  82. package/dist/assets/themes/base/_layouts/frontend/pages/collection/index.html +84 -0
  83. package/dist/assets/themes/base/_layouts/frontend/pages/connections/callback.html +55 -0
  84. package/dist/assets/themes/base/_layouts/frontend/pages/contact.html +214 -0
  85. package/dist/assets/themes/base/_layouts/frontend/pages/download.html +793 -0
  86. package/dist/assets/themes/base/_layouts/frontend/pages/extension/index.html +253 -0
  87. package/dist/assets/themes/base/_layouts/frontend/pages/extension/installed.html +198 -0
  88. package/dist/assets/themes/base/_layouts/frontend/pages/feedback.html +171 -0
  89. package/dist/assets/themes/base/_layouts/frontend/pages/index.html +66 -0
  90. package/dist/assets/themes/base/_layouts/frontend/pages/legal/document.html +78 -0
  91. package/dist/assets/themes/base/_layouts/frontend/pages/payment/checkout.html +459 -0
  92. package/dist/assets/themes/base/_layouts/frontend/pages/payment/confirmation.html +131 -0
  93. package/dist/assets/themes/base/_layouts/frontend/pages/portal/email-preferences.html +104 -0
  94. package/dist/assets/themes/base/_layouts/frontend/pages/pricing.html +596 -0
  95. package/dist/assets/themes/base/_layouts/frontend/pages/status.html +361 -0
  96. package/dist/assets/themes/base/_layouts/frontend/pages/team/index.html +210 -0
  97. package/dist/assets/themes/base/_layouts/frontend/pages/team/member.html +125 -0
  98. package/dist/assets/themes/base/_layouts/frontend/pages/updates/index.html +119 -0
  99. package/dist/assets/themes/base/_layouts/frontend/pages/updates/update.html +118 -0
  100. package/dist/assets/themes/base/_sections/about/hero/section.html +68 -0
  101. package/dist/assets/themes/base/_sections/about/hero/section.json5 +58 -0
  102. package/dist/assets/themes/base/_sections/about/letter/section.html +60 -0
  103. package/dist/assets/themes/base/_sections/about/letter/section.json5 +56 -0
  104. package/dist/assets/themes/base/_sections/about/photo-band/section.html +24 -0
  105. package/dist/assets/themes/base/_sections/about/photo-band/section.json5 +23 -0
  106. package/dist/assets/themes/base/_sections/about/principles/section.html +17 -0
  107. package/dist/assets/themes/base/_sections/about/principles/section.json5 +34 -0
  108. package/dist/assets/themes/base/_sections/about/timeline/section.html +20 -0
  109. package/dist/assets/themes/base/_sections/about/timeline/section.json5 +34 -0
  110. package/dist/assets/themes/base/_sections/marketing/bento/section.html +91 -0
  111. package/dist/assets/themes/base/_sections/marketing/bento/section.json5 +152 -0
  112. package/dist/assets/themes/base/_sections/marketing/cta/section.html +44 -0
  113. package/dist/assets/themes/base/_sections/marketing/cta/section.json5 +47 -0
  114. package/dist/assets/themes/base/_sections/marketing/faq/section.html +52 -0
  115. package/dist/assets/themes/base/_sections/marketing/faq/section.json5 +68 -0
  116. package/dist/assets/themes/base/_sections/marketing/hero/section.html +349 -0
  117. package/dist/assets/themes/base/_sections/marketing/hero/section.json5 +335 -0
  118. package/dist/assets/themes/base/_sections/marketing/newsletter-cta/section.html +38 -0
  119. package/dist/assets/themes/base/_sections/marketing/newsletter-cta/section.js +86 -0
  120. package/dist/assets/themes/base/_sections/marketing/newsletter-cta/section.json5 +29 -0
  121. package/dist/assets/themes/base/_sections/marketing/pricing-cards/section.html +115 -0
  122. package/dist/assets/themes/base/_sections/marketing/pricing-cards/section.json5 +72 -0
  123. package/dist/assets/themes/base/_sections/marketing/product-demo/section.html +62 -0
  124. package/dist/assets/themes/base/_sections/marketing/product-demo/section.js +44 -0
  125. package/dist/assets/themes/base/_sections/marketing/product-demo/section.json5 +52 -0
  126. package/dist/assets/themes/base/_sections/marketing/prose/section.html +22 -0
  127. package/dist/assets/themes/base/_sections/marketing/prose/section.json5 +41 -0
  128. package/dist/assets/themes/base/_sections/marketing/showcase/section.html +35 -0
  129. package/dist/assets/themes/base/_sections/marketing/showcase/section.json5 +52 -0
  130. package/dist/assets/themes/base/_sections/marketing/stats/section.html +32 -0
  131. package/dist/assets/themes/base/_sections/marketing/stats/section.json5 +44 -0
  132. package/dist/assets/themes/base/_sections/marketing/testimonials/section.html +54 -0
  133. package/dist/assets/themes/base/_sections/marketing/testimonials/section.json5 +70 -0
  134. package/dist/assets/themes/base/_sections/marketing/trusted-by/section.html +30 -0
  135. package/dist/assets/themes/base/_sections/marketing/trusted-by/section.json5 +38 -0
  136. package/dist/assets/themes/base/_sections/verts/unit/section.html +7 -0
  137. package/dist/assets/themes/base/_sections/verts/unit/section.js +22 -0
  138. package/dist/assets/themes/base/_sections/verts/unit/section.json5 +24 -0
  139. package/dist/assets/themes/base/_sections/verts/unit/section.scss +24 -0
  140. package/dist/assets/themes/base/_theme.js +13 -0
  141. package/dist/assets/themes/base/_theme.scss +4 -0
  142. package/dist/assets/themes/bootstrap/_theme.js +16 -0
  143. package/dist/assets/themes/bootstrap/_theme.scss +11 -0
  144. package/dist/assets/themes/bootstrap/js/index.esm.js +19 -0
  145. package/dist/assets/themes/bootstrap/js/index.umd.js +34 -0
  146. package/dist/assets/themes/bootstrap/js/src/alert.js +87 -0
  147. package/dist/assets/themes/bootstrap/js/src/base-component.js +86 -0
  148. package/dist/assets/themes/bootstrap/js/src/button.js +72 -0
  149. package/dist/assets/themes/bootstrap/js/src/carousel.js +474 -0
  150. package/dist/assets/themes/bootstrap/js/src/collapse.js +297 -0
  151. package/dist/assets/themes/bootstrap/js/src/dom/data.js +55 -0
  152. package/dist/assets/themes/bootstrap/js/src/dom/event-handler.js +317 -0
  153. package/dist/assets/themes/bootstrap/js/src/dom/manipulator.js +71 -0
  154. package/dist/assets/themes/bootstrap/js/src/dom/selector-engine.js +126 -0
  155. package/dist/assets/themes/bootstrap/js/src/dropdown.js +458 -0
  156. package/dist/assets/themes/bootstrap/js/src/modal.js +378 -0
  157. package/dist/assets/themes/bootstrap/js/src/offcanvas.js +282 -0
  158. package/dist/assets/themes/bootstrap/js/src/popover.js +97 -0
  159. package/dist/assets/themes/bootstrap/js/src/scrollspy.js +296 -0
  160. package/dist/assets/themes/bootstrap/js/src/tab.js +315 -0
  161. package/dist/assets/themes/bootstrap/js/src/toast.js +224 -0
  162. package/dist/assets/themes/bootstrap/js/src/tooltip.js +632 -0
  163. package/dist/assets/themes/bootstrap/js/src/util/backdrop.js +151 -0
  164. package/dist/assets/themes/bootstrap/js/src/util/component-functions.js +35 -0
  165. package/dist/assets/themes/bootstrap/js/src/util/config.js +65 -0
  166. package/dist/assets/themes/bootstrap/js/src/util/focustrap.js +115 -0
  167. package/dist/assets/themes/bootstrap/js/src/util/index.js +306 -0
  168. package/dist/assets/themes/bootstrap/js/src/util/sanitizer.js +117 -0
  169. package/dist/assets/themes/bootstrap/js/src/util/scrollbar.js +114 -0
  170. package/dist/assets/themes/bootstrap/js/src/util/swipe.js +146 -0
  171. package/dist/assets/themes/bootstrap/js/src/util/template-factory.js +160 -0
  172. package/dist/assets/themes/bootstrap/overrides/_accordion.scss +21 -0
  173. package/dist/assets/themes/bootstrap/overrides/_avatars.scss +51 -0
  174. package/dist/assets/themes/bootstrap/overrides/_blog-images.scss +45 -0
  175. package/dist/assets/themes/bootstrap/overrides/_buttons-adaptive.scss +141 -0
  176. package/dist/assets/themes/bootstrap/overrides/_color-shades.scss +25 -0
  177. package/dist/assets/themes/bootstrap/overrides/_cursor-utilities.scss +13 -0
  178. package/dist/assets/themes/bootstrap/overrides/_index.scss +30 -0
  179. package/dist/assets/themes/bootstrap/overrides/_links.scss +26 -0
  180. package/dist/assets/themes/bootstrap/overrides/_soft-colors.scss +99 -0
  181. package/dist/assets/themes/bootstrap/overrides/_spacing-extended.scss +74 -0
  182. package/dist/assets/themes/bootstrap/overrides/_spinners.scss +22 -0
  183. package/dist/assets/themes/bootstrap/overrides/_typography-utilities.scss +40 -0
  184. package/dist/assets/themes/bootstrap/scss/_accordion.scss +153 -0
  185. package/dist/assets/themes/bootstrap/scss/_alert.scss +68 -0
  186. package/dist/assets/themes/bootstrap/scss/_badge.scss +38 -0
  187. package/dist/assets/themes/bootstrap/scss/_breadcrumb.scss +40 -0
  188. package/dist/assets/themes/bootstrap/scss/_button-group.scss +147 -0
  189. package/dist/assets/themes/bootstrap/scss/_buttons.scss +216 -0
  190. package/dist/assets/themes/bootstrap/scss/_card.scss +238 -0
  191. package/dist/assets/themes/bootstrap/scss/_carousel.scss +226 -0
  192. package/dist/assets/themes/bootstrap/scss/_close.scss +66 -0
  193. package/dist/assets/themes/bootstrap/scss/_containers.scss +41 -0
  194. package/dist/assets/themes/bootstrap/scss/_dropdown.scss +250 -0
  195. package/dist/assets/themes/bootstrap/scss/_forms.scss +9 -0
  196. package/dist/assets/themes/bootstrap/scss/_functions.scss +302 -0
  197. package/dist/assets/themes/bootstrap/scss/_grid.scss +39 -0
  198. package/dist/assets/themes/bootstrap/scss/_helpers.scss +12 -0
  199. package/dist/assets/themes/bootstrap/scss/_images.scss +42 -0
  200. package/dist/assets/themes/bootstrap/scss/_list-group.scss +199 -0
  201. package/dist/assets/themes/bootstrap/scss/_maps.scss +174 -0
  202. package/dist/assets/themes/bootstrap/scss/_mixins.scss +42 -0
  203. package/dist/assets/themes/bootstrap/scss/_modal.scss +240 -0
  204. package/dist/assets/themes/bootstrap/scss/_nav.scss +197 -0
  205. package/dist/assets/themes/bootstrap/scss/_navbar.scss +289 -0
  206. package/dist/assets/themes/bootstrap/scss/_offcanvas.scss +147 -0
  207. package/dist/assets/themes/bootstrap/scss/_pagination.scss +109 -0
  208. package/dist/assets/themes/bootstrap/scss/_placeholders.scss +51 -0
  209. package/dist/assets/themes/bootstrap/scss/_popover.scss +196 -0
  210. package/dist/assets/themes/bootstrap/scss/_progress.scss +68 -0
  211. package/dist/assets/themes/bootstrap/scss/_reboot.scss +611 -0
  212. package/dist/assets/themes/bootstrap/scss/_root.scss +187 -0
  213. package/dist/assets/themes/bootstrap/scss/_spinners.scss +85 -0
  214. package/dist/assets/themes/bootstrap/scss/_tables.scss +171 -0
  215. package/dist/assets/themes/bootstrap/scss/_toasts.scss +73 -0
  216. package/dist/assets/themes/bootstrap/scss/_tooltip.scss +119 -0
  217. package/dist/assets/themes/bootstrap/scss/_transitions.scss +27 -0
  218. package/dist/assets/themes/bootstrap/scss/_type.scss +106 -0
  219. package/dist/assets/themes/bootstrap/scss/_utilities.scss +806 -0
  220. package/dist/assets/themes/bootstrap/scss/_variables-dark.scss +102 -0
  221. package/dist/assets/themes/bootstrap/scss/_variables.scss +1753 -0
  222. package/dist/assets/themes/bootstrap/scss/bootstrap-grid.scss +62 -0
  223. package/dist/assets/themes/bootstrap/scss/bootstrap-reboot.scss +10 -0
  224. package/dist/assets/themes/bootstrap/scss/bootstrap-utilities.scss +19 -0
  225. package/dist/assets/themes/bootstrap/scss/bootstrap.scss +52 -0
  226. package/dist/assets/themes/bootstrap/scss/forms/_floating-labels.scss +97 -0
  227. package/dist/assets/themes/bootstrap/scss/forms/_form-check.scss +189 -0
  228. package/dist/assets/themes/bootstrap/scss/forms/_form-control.scss +214 -0
  229. package/dist/assets/themes/bootstrap/scss/forms/_form-range.scss +91 -0
  230. package/dist/assets/themes/bootstrap/scss/forms/_form-select.scss +80 -0
  231. package/dist/assets/themes/bootstrap/scss/forms/_form-text.scss +11 -0
  232. package/dist/assets/themes/bootstrap/scss/forms/_input-group.scss +132 -0
  233. package/dist/assets/themes/bootstrap/scss/forms/_labels.scss +36 -0
  234. package/dist/assets/themes/bootstrap/scss/forms/_validation.scss +12 -0
  235. package/dist/assets/themes/bootstrap/scss/helpers/_clearfix.scss +3 -0
  236. package/dist/assets/themes/bootstrap/scss/helpers/_color-bg.scss +7 -0
  237. package/dist/assets/themes/bootstrap/scss/helpers/_colored-links.scss +30 -0
  238. package/dist/assets/themes/bootstrap/scss/helpers/_focus-ring.scss +5 -0
  239. package/dist/assets/themes/bootstrap/scss/helpers/_icon-link.scss +25 -0
  240. package/dist/assets/themes/bootstrap/scss/helpers/_position.scss +36 -0
  241. package/dist/assets/themes/bootstrap/scss/helpers/_ratio.scss +26 -0
  242. package/dist/assets/themes/bootstrap/scss/helpers/_stacks.scss +15 -0
  243. package/dist/assets/themes/bootstrap/scss/helpers/_stretched-link.scss +15 -0
  244. package/dist/assets/themes/bootstrap/scss/helpers/_text-truncation.scss +7 -0
  245. package/dist/assets/themes/bootstrap/scss/helpers/_visually-hidden.scss +8 -0
  246. package/dist/assets/themes/bootstrap/scss/helpers/_vr.scss +8 -0
  247. package/dist/assets/themes/bootstrap/scss/mixins/_alert.scss +18 -0
  248. package/dist/assets/themes/bootstrap/scss/mixins/_backdrop.scss +14 -0
  249. package/dist/assets/themes/bootstrap/scss/mixins/_banner.scss +7 -0
  250. package/dist/assets/themes/bootstrap/scss/mixins/_border-radius.scss +78 -0
  251. package/dist/assets/themes/bootstrap/scss/mixins/_box-shadow.scss +18 -0
  252. package/dist/assets/themes/bootstrap/scss/mixins/_breakpoints.scss +127 -0
  253. package/dist/assets/themes/bootstrap/scss/mixins/_buttons.scss +70 -0
  254. package/dist/assets/themes/bootstrap/scss/mixins/_caret.scss +69 -0
  255. package/dist/assets/themes/bootstrap/scss/mixins/_clearfix.scss +9 -0
  256. package/dist/assets/themes/bootstrap/scss/mixins/_color-mode.scss +21 -0
  257. package/dist/assets/themes/bootstrap/scss/mixins/_color-scheme.scss +7 -0
  258. package/dist/assets/themes/bootstrap/scss/mixins/_container.scss +11 -0
  259. package/dist/assets/themes/bootstrap/scss/mixins/_deprecate.scss +10 -0
  260. package/dist/assets/themes/bootstrap/scss/mixins/_forms.scss +163 -0
  261. package/dist/assets/themes/bootstrap/scss/mixins/_gradients.scss +47 -0
  262. package/dist/assets/themes/bootstrap/scss/mixins/_grid.scss +151 -0
  263. package/dist/assets/themes/bootstrap/scss/mixins/_image.scss +16 -0
  264. package/dist/assets/themes/bootstrap/scss/mixins/_list-group.scss +26 -0
  265. package/dist/assets/themes/bootstrap/scss/mixins/_lists.scss +7 -0
  266. package/dist/assets/themes/bootstrap/scss/mixins/_pagination.scss +10 -0
  267. package/dist/assets/themes/bootstrap/scss/mixins/_reset-text.scss +17 -0
  268. package/dist/assets/themes/bootstrap/scss/mixins/_resize.scss +6 -0
  269. package/dist/assets/themes/bootstrap/scss/mixins/_table-variants.scss +24 -0
  270. package/dist/assets/themes/bootstrap/scss/mixins/_text-truncate.scss +8 -0
  271. package/dist/assets/themes/bootstrap/scss/mixins/_transition.scss +26 -0
  272. package/dist/assets/themes/bootstrap/scss/mixins/_utilities.scss +97 -0
  273. package/dist/assets/themes/bootstrap/scss/mixins/_visually-hidden.scss +38 -0
  274. package/dist/assets/themes/bootstrap/scss/tests/jasmine.js +16 -0
  275. package/dist/assets/themes/bootstrap/scss/tests/mixins/_auto-import-of-variables-dark.test.scss +7 -0
  276. package/dist/assets/themes/bootstrap/scss/tests/mixins/_color-modes.test.scss +69 -0
  277. package/dist/assets/themes/bootstrap/scss/tests/mixins/_media-query-color-mode-full.test.scss +8 -0
  278. package/dist/assets/themes/bootstrap/scss/tests/mixins/_utilities.test.scss +393 -0
  279. package/dist/assets/themes/bootstrap/scss/tests/sass-true/register.js +14 -0
  280. package/dist/assets/themes/bootstrap/scss/tests/sass-true/runner.js +17 -0
  281. package/dist/assets/themes/bootstrap/scss/tests/utilities/_api.test.scss +75 -0
  282. package/dist/assets/themes/bootstrap/scss/utilities/_api.scss +47 -0
  283. package/dist/assets/themes/bootstrap/scss/vendor/_rfs.scss +348 -0
  284. package/dist/assets/themes/classy/README.md +89 -0
  285. package/dist/assets/themes/classy/_config.scss +245 -0
  286. package/dist/assets/themes/classy/_theme.js +31 -0
  287. package/dist/assets/themes/classy/_theme.scss +57 -0
  288. package/dist/assets/themes/classy/css/app/_panels.scss +183 -0
  289. package/dist/assets/themes/classy/css/base/_fonts.scss +79 -0
  290. package/dist/assets/themes/classy/css/base/_no-raise.scss +49 -0
  291. package/dist/assets/themes/classy/css/base/_root.scss +113 -0
  292. package/dist/assets/themes/classy/css/base/_typography.scss +154 -0
  293. package/dist/assets/themes/classy/css/base/_utilities.scss +284 -0
  294. package/dist/assets/themes/classy/css/components/_alerts.scss +51 -0
  295. package/dist/assets/themes/classy/css/components/_badges.scss +46 -0
  296. package/dist/assets/themes/classy/css/components/_buttons.scss +175 -0
  297. package/dist/assets/themes/classy/css/components/_cards.scss +41 -0
  298. package/dist/assets/themes/classy/css/components/_dropdowns.scss +48 -0
  299. package/dist/assets/themes/classy/css/components/_forms.scss +171 -0
  300. package/dist/assets/themes/classy/css/components/_receipt.scss +45 -0
  301. package/dist/assets/themes/classy/css/layout/_footer.scss +298 -0
  302. package/dist/assets/themes/classy/css/layout/_general.scss +209 -0
  303. package/dist/assets/themes/classy/css/layout/_nav.scss +154 -0
  304. package/dist/assets/themes/classy/css/layout/_shell.scss +458 -0
  305. package/dist/assets/themes/classy/css/marketing/_bento.scss +238 -0
  306. package/dist/assets/themes/classy/css/marketing/_content.scss +1328 -0
  307. package/dist/assets/themes/classy/css/marketing/_downloads.scss +246 -0
  308. package/dist/assets/themes/classy/css/marketing/_hero.scss +311 -0
  309. package/dist/assets/themes/classy/css/marketing/_sections.scss +649 -0
  310. package/dist/assets/themes/classy/css/pages/404/index.scss +67 -0
  311. package/dist/assets/themes/classy/css/pages/_auth.scss +235 -0
  312. package/dist/assets/themes/classy/css/pages/admin/firebase/index.scss +22 -0
  313. package/dist/assets/themes/classy/css/pages/blog/[slug].scss +56 -0
  314. package/dist/assets/themes/classy/css/pages/cookies.scss +2 -0
  315. package/dist/assets/themes/classy/css/pages/dashboard/account/index.scss +31 -0
  316. package/dist/assets/themes/classy/css/pages/feedback/index.scss +39 -0
  317. package/dist/assets/themes/classy/css/pages/legal/_document.scss +192 -0
  318. package/dist/assets/themes/classy/css/pages/payment/checkout/index.scss +585 -0
  319. package/dist/assets/themes/classy/css/pages/payment/confirmation/index.scss +9 -0
  320. package/dist/assets/themes/classy/css/pages/privacy.scss +2 -0
  321. package/dist/assets/themes/classy/css/pages/status/index.scss +164 -0
  322. package/dist/assets/themes/classy/css/pages/terms.scss +2 -0
  323. package/dist/assets/themes/classy/css/pages/updates/index.scss +128 -0
  324. package/dist/assets/themes/classy/fonts/inter-italic-latin-ext.woff2 +0 -0
  325. package/dist/assets/themes/classy/fonts/inter-italic-latin.woff2 +0 -0
  326. package/dist/assets/themes/classy/fonts/inter-normal-latin-ext.woff2 +0 -0
  327. package/dist/assets/themes/classy/fonts/inter-normal-latin.woff2 +0 -0
  328. package/dist/assets/themes/classy/fonts/newsreader-italic-latin-ext.woff2 +0 -0
  329. package/dist/assets/themes/classy/fonts/newsreader-italic-latin.woff2 +0 -0
  330. package/dist/assets/themes/classy/fonts/newsreader-normal-latin-ext.woff2 +0 -0
  331. package/dist/assets/themes/classy/fonts/newsreader-normal-latin.woff2 +0 -0
  332. package/dist/assets/themes/classy/js/hero-demo-form.js +56 -0
  333. package/dist/assets/themes/neobrutalism/README.md +118 -0
  334. package/dist/assets/themes/neobrutalism/_config.scss +139 -0
  335. package/dist/assets/themes/neobrutalism/_layouts/frontend/core/base.html +30 -0
  336. package/dist/assets/themes/neobrutalism/_layouts/frontend/pages/index.html +275 -0
  337. package/dist/assets/themes/neobrutalism/_theme.js +24 -0
  338. package/dist/assets/themes/neobrutalism/_theme.scss +61 -0
  339. package/dist/assets/themes/neobrutalism/css/base/_mixins.scss +46 -0
  340. package/dist/assets/themes/neobrutalism/css/base/_root.scss +169 -0
  341. package/dist/assets/themes/neobrutalism/css/base/_typography.scss +61 -0
  342. package/dist/assets/themes/neobrutalism/css/base/_utilities.scss +89 -0
  343. package/dist/assets/themes/neobrutalism/css/components/_billing-toggle.scss +74 -0
  344. package/dist/assets/themes/neobrutalism/css/components/_buttons.scss +148 -0
  345. package/dist/assets/themes/neobrutalism/css/components/_cards.scss +47 -0
  346. package/dist/assets/themes/neobrutalism/css/components/_forms.scss +88 -0
  347. package/dist/assets/themes/neobrutalism/css/components/_marketing.scss +244 -0
  348. package/dist/assets/themes/neobrutalism/css/layout/_general.scss +213 -0
  349. package/dist/assets/themes/neobrutalism/css/layout/_navigation.scss +171 -0
  350. package/dist/assets/themes/neobrutalism/css/pages/index.scss +203 -0
  351. package/dist/assets/themes/neobrutalism/css/pages/pricing/index.scss +58 -0
  352. package/dist/assets/themes/neobrutalism/css/pages/test/libraries/layers/index.scss +7 -0
  353. package/dist/assets/themes/neobrutalism/js/pages/test/libraries/layers/index.js +9 -0
  354. package/dist/assets/themes/newsflash/README.md +117 -0
  355. package/dist/assets/themes/newsflash/_components/heading/lede/component.html +14 -0
  356. package/dist/assets/themes/newsflash/_components/heading/lede/component.json5 +23 -0
  357. package/dist/assets/themes/newsflash/_components/heading/rule-head/component.html +17 -0
  358. package/dist/assets/themes/newsflash/_components/heading/rule-head/component.json5 +23 -0
  359. package/dist/assets/themes/newsflash/_components/news/byline/component.html +12 -0
  360. package/dist/assets/themes/newsflash/_components/news/byline/component.json5 +18 -0
  361. package/dist/assets/themes/newsflash/_components/news/story-card/component.html +25 -0
  362. package/dist/assets/themes/newsflash/_components/news/story-card/component.json5 +21 -0
  363. package/dist/assets/themes/newsflash/_config.scss +147 -0
  364. package/dist/assets/themes/newsflash/_layouts/frontend/core/base.html +51 -0
  365. package/dist/assets/themes/newsflash/_layouts/frontend/pages/blog/index.html +299 -0
  366. package/dist/assets/themes/newsflash/_layouts/frontend/pages/blog/post.html +235 -0
  367. package/dist/assets/themes/newsflash/_layouts/frontend/pages/index.html +328 -0
  368. package/dist/assets/themes/newsflash/_sections/marketing/desks/section.html +39 -0
  369. package/dist/assets/themes/newsflash/_sections/marketing/desks/section.json5 +49 -0
  370. package/dist/assets/themes/newsflash/_sections/marketing/newsletter-cta/section.html +103 -0
  371. package/dist/assets/themes/newsflash/_sections/marketing/newsletter-cta/section.json5 +50 -0
  372. package/dist/assets/themes/newsflash/_sections/marketing/rundown/section.html +28 -0
  373. package/dist/assets/themes/newsflash/_sections/marketing/rundown/section.json5 +40 -0
  374. package/dist/assets/themes/newsflash/_theme.js +24 -0
  375. package/dist/assets/themes/newsflash/_theme.scss +70 -0
  376. package/dist/assets/themes/newsflash/css/base/_fonts.scss +80 -0
  377. package/dist/assets/themes/newsflash/css/base/_mixins.scss +51 -0
  378. package/dist/assets/themes/newsflash/css/base/_root.scss +257 -0
  379. package/dist/assets/themes/newsflash/css/base/_typography.scss +49 -0
  380. package/dist/assets/themes/newsflash/css/base/_utilities.scss +122 -0
  381. package/dist/assets/themes/newsflash/css/components/_badges.scss +65 -0
  382. package/dist/assets/themes/newsflash/css/components/_billing-toggle.scss +61 -0
  383. package/dist/assets/themes/newsflash/css/components/_buttons.scss +139 -0
  384. package/dist/assets/themes/newsflash/css/components/_cards.scss +47 -0
  385. package/dist/assets/themes/newsflash/css/components/_editorial.scss +173 -0
  386. package/dist/assets/themes/newsflash/css/components/_forms.scss +75 -0
  387. package/dist/assets/themes/newsflash/css/components/_infinite-scroll.scss +102 -0
  388. package/dist/assets/themes/newsflash/css/components/_panels.scss +156 -0
  389. package/dist/assets/themes/newsflash/css/components/_ticker.scss +67 -0
  390. package/dist/assets/themes/newsflash/css/layout/_general.scss +330 -0
  391. package/dist/assets/themes/newsflash/css/layout/_navigation.scss +168 -0
  392. package/dist/assets/themes/newsflash/css/pages/404/index.scss +79 -0
  393. package/dist/assets/themes/newsflash/css/pages/blog/[slug].scss +186 -0
  394. package/dist/assets/themes/newsflash/css/pages/blog/index.scss +17 -0
  395. package/dist/assets/themes/newsflash/css/pages/index.scss +157 -0
  396. package/dist/assets/themes/newsflash/css/pages/pricing/index.scss +55 -0
  397. package/dist/assets/themes/newsflash/css/pages/test/libraries/layers/index.scss +7 -0
  398. package/dist/assets/themes/newsflash/fonts/fraunces-italic-latin-ext.woff2 +0 -0
  399. package/dist/assets/themes/newsflash/fonts/fraunces-italic-latin.woff2 +0 -0
  400. package/dist/assets/themes/newsflash/fonts/fraunces-normal-latin-ext.woff2 +0 -0
  401. package/dist/assets/themes/newsflash/fonts/fraunces-normal-latin.woff2 +0 -0
  402. package/dist/assets/themes/newsflash/fonts/schibsted-grotesk-italic-latin-ext.woff2 +0 -0
  403. package/dist/assets/themes/newsflash/fonts/schibsted-grotesk-italic-latin.woff2 +0 -0
  404. package/dist/assets/themes/newsflash/fonts/schibsted-grotesk-normal-latin-ext.woff2 +0 -0
  405. package/dist/assets/themes/newsflash/fonts/schibsted-grotesk-normal-latin.woff2 +0 -0
  406. package/dist/assets/themes/newsflash/js/pages/blog/[slug].js +29 -0
  407. package/dist/assets/themes/newsflash/js/pages/test/libraries/layers/index.js +9 -0
  408. package/dist/background.js +684 -0
  409. package/dist/build.js +268 -0
  410. package/dist/cli-run.js +25 -0
  411. package/dist/cli.js +30 -0
  412. package/dist/commands/build.js +67 -0
  413. package/dist/commands/clean.js +29 -0
  414. package/dist/commands/deploy.js +97 -0
  415. package/dist/commands/install.js +58 -0
  416. package/dist/commands/lib/dependencies.js +33 -0
  417. package/dist/commands/lib/deploy-precheck.js +57 -0
  418. package/dist/commands/lib/ensure-target.js +151 -0
  419. package/dist/commands/lib/push-secrets.js +60 -0
  420. package/dist/commands/migrate.js +77 -0
  421. package/dist/commands/test.js +110 -0
  422. package/dist/commands/update.js +21 -0
  423. package/dist/commands/version.js +12 -0
  424. package/dist/config/manifest.json +117 -0
  425. package/dist/config/page-template.html +21 -0
  426. package/dist/content.js +37 -0
  427. package/dist/defaults/.github/workflows/publish.yml +86 -0
  428. package/dist/defaults/.nvmrc +1 -0
  429. package/dist/defaults/.vscode/settings.json +8 -0
  430. package/dist/defaults/AGENTS.md +113 -0
  431. package/dist/defaults/CHANGELOG.md +15 -0
  432. package/dist/defaults/CLAUDE.md +1 -0
  433. package/dist/defaults/_.gitignore +75 -0
  434. package/dist/defaults/config/description.md +46 -0
  435. package/dist/defaults/config/messages.json +20 -0
  436. package/dist/defaults/config/omega.json5 +64 -0
  437. package/dist/defaults/docs/README.md +17 -0
  438. package/dist/defaults/gulpfile.js +6 -0
  439. package/dist/defaults/hooks/build/post.js +8 -0
  440. package/dist/defaults/hooks/build/pre.js +8 -0
  441. package/dist/defaults/src/assets/css/bundles/.gitkeep +0 -0
  442. package/dist/defaults/src/assets/css/components/content/index.scss +11 -0
  443. package/dist/defaults/src/assets/css/components/offscreen/index.scss +4 -0
  444. package/dist/defaults/src/assets/css/components/options/index.scss +14 -0
  445. package/dist/defaults/src/assets/css/components/pages/index.scss +10 -0
  446. package/dist/defaults/src/assets/css/components/popup/index.scss +10 -0
  447. package/dist/defaults/src/assets/css/components/sidepanel/index.scss +6 -0
  448. package/dist/defaults/src/assets/css/main.scss +32 -0
  449. package/dist/defaults/src/assets/images/.gitkeep +0 -0
  450. package/dist/defaults/src/assets/js/components/background/index.js +25 -0
  451. package/dist/defaults/src/assets/js/components/content/index.js +22 -0
  452. package/dist/defaults/src/assets/js/components/offscreen/index.js +25 -0
  453. package/dist/defaults/src/assets/js/components/options/index.js +22 -0
  454. package/dist/defaults/src/assets/js/components/pages/index.js +22 -0
  455. package/dist/defaults/src/assets/js/components/popup/index.js +22 -0
  456. package/dist/defaults/src/assets/js/components/sidepanel/index.js +20 -0
  457. package/dist/defaults/src/assets/vendor/.gitkeep +0 -0
  458. package/dist/defaults/src/manifest.json +131 -0
  459. package/dist/defaults/src/views/offscreen/index.html +3 -0
  460. package/dist/defaults/src/views/options/index.html +8 -0
  461. package/dist/defaults/src/views/pages/index.html +10 -0
  462. package/dist/defaults/src/views/popup/index.html +4 -0
  463. package/dist/defaults/src/views/sidepanel/index.html +4 -0
  464. package/dist/defaults/test/README.md +41 -0
  465. package/dist/defaults/test/_init.js +10 -0
  466. package/dist/defaults/test/boot/externally-connectable.test.js +28 -0
  467. package/dist/gulp/config/locales.js +12 -0
  468. package/dist/gulp/main.js +78 -0
  469. package/dist/gulp/tasks/_.js +18 -0
  470. package/dist/gulp/tasks/audit.js +222 -0
  471. package/dist/gulp/tasks/bundle.js +687 -0
  472. package/dist/gulp/tasks/defaults.js +281 -0
  473. package/dist/gulp/tasks/distribute.js +172 -0
  474. package/dist/gulp/tasks/fontawesome.js +25 -0
  475. package/dist/gulp/tasks/html.js +163 -0
  476. package/dist/gulp/tasks/icons.js +126 -0
  477. package/dist/gulp/tasks/package.js +742 -0
  478. package/dist/gulp/tasks/publish.js +417 -0
  479. package/dist/gulp/tasks/sass.js +252 -0
  480. package/dist/gulp/tasks/serve.js +103 -0
  481. package/dist/gulp/tasks/translate.js +252 -0
  482. package/dist/gulp/tasks/utils/build-json.js +43 -0
  483. package/dist/gulp/tasks/utils/template-transform.js +50 -0
  484. package/dist/gulp/templates/BUILD_INSTRUCTIONS.md +69 -0
  485. package/dist/index.js +46 -0
  486. package/dist/lib/affiliatizer.js +224 -0
  487. package/dist/lib/analytics.js +26 -0
  488. package/dist/lib/auth-helpers.js +213 -0
  489. package/dist/lib/extension.js +116 -0
  490. package/dist/lib/icons.js +36 -0
  491. package/dist/lib/logger-lite.js +35 -0
  492. package/dist/lib/logger.js +4 -0
  493. package/dist/lib/messaging.js +48 -0
  494. package/dist/lib/safe-install.js +4 -0
  495. package/dist/lib/theme.js +73 -0
  496. package/dist/lib/verts.js +68 -0
  497. package/dist/offscreen.js +31 -0
  498. package/dist/omega-bin.js +6 -0
  499. package/dist/options.js +80 -0
  500. package/dist/page.js +80 -0
  501. package/dist/popup.js +80 -0
  502. package/dist/sidepanel.js +80 -0
  503. package/dist/test/assert.js +4 -0
  504. package/dist/test/fixtures/consumer-extension/dist/background.js +23 -0
  505. package/dist/test/fixtures/consumer-extension/dist/manifest.json +20 -0
  506. package/dist/test/fixtures/consumer-extension/dist/options.html +10 -0
  507. package/dist/test/fixtures/consumer-extension/dist/popup.bundle.js +5 -0
  508. package/dist/test/fixtures/consumer-extension/dist/popup.html +12 -0
  509. package/dist/test/harness/extension/background.js +26 -0
  510. package/dist/test/harness/extension/manifest.json +27 -0
  511. package/dist/test/harness/extension/options.html +12 -0
  512. package/dist/test/harness/extension/popup.html +12 -0
  513. package/dist/test/harness/extension/sidepanel.html +12 -0
  514. package/dist/test/index.js +63 -0
  515. package/dist/test/runner.js +99 -0
  516. package/dist/test/runners/boot.js +221 -0
  517. package/dist/test/runners/chromium.js +391 -0
  518. package/dist/test/runners/helpers.js +24 -0
  519. package/dist/test/suites/background/messaging.test.js +44 -0
  520. package/dist/test/suites/background/storage.test.js +46 -0
  521. package/dist/test/suites/background/sw-context.test.js +49 -0
  522. package/dist/test/suites/boot/build-json-bake.test.js +80 -0
  523. package/dist/test/suites/boot/extension-loads.test.js +58 -0
  524. package/dist/test/suites/build/affiliatizer.test.js +64 -0
  525. package/dist/test/suites/build/app-launch.test.js +65 -0
  526. package/dist/test/suites/build/attach-log-file.test.js +99 -0
  527. package/dist/test/suites/build/auth-emulator-gate.test.js +118 -0
  528. package/dist/test/suites/build/auth-triggers.test.js +71 -0
  529. package/dist/test/suites/build/boot-discovery.test.js +134 -0
  530. package/dist/test/suites/build/boot-timeout.test.js +92 -0
  531. package/dist/test/suites/build/build-error-notification.test.js +122 -0
  532. package/dist/test/suites/build/build-json-bake.test.js +302 -0
  533. package/dist/test/suites/build/build-verb.test.js +138 -0
  534. package/dist/test/suites/build/bundle-targets.test.js +66 -0
  535. package/dist/test/suites/build/cache-warming.test.js +44 -0
  536. package/dist/test/suites/build/cli.test.js +150 -0
  537. package/dist/test/suites/build/default-boot-test.test.js +100 -0
  538. package/dist/test/suites/build/defaults-scaffold.test.js +287 -0
  539. package/dist/test/suites/build/deploy-dispatch.test.js +76 -0
  540. package/dist/test/suites/build/distribute-task.test.js +111 -0
  541. package/dist/test/suites/build/ensure-target.test.js +141 -0
  542. package/dist/test/suites/build/env-delivery.test.js +239 -0
  543. package/dist/test/suites/build/env-watch.test.js +86 -0
  544. package/dist/test/suites/build/expect.test.js +48 -0
  545. package/dist/test/suites/build/exports.test.js +53 -0
  546. package/dist/test/suites/build/extension-fallback.test.js +82 -0
  547. package/dist/test/suites/build/framework-deps.test.js +176 -0
  548. package/dist/test/suites/build/global-handlers.test.js +70 -0
  549. package/dist/test/suites/build/icon-sheet.test.js +74 -0
  550. package/dist/test/suites/build/logger-lite.test.js +61 -0
  551. package/dist/test/suites/build/manager.test.js +249 -0
  552. package/dist/test/suites/build/mode-helpers.test.js +136 -0
  553. package/dist/test/suites/build/omega-shell.test.js +103 -0
  554. package/dist/test/suites/build/omega-tokens.test.js +76 -0
  555. package/dist/test/suites/build/package-task.test.js +831 -0
  556. package/dist/test/suites/build/setup-scripts.test.js +172 -0
  557. package/dist/test/suites/build/strip-dev-blocks.test.js +122 -0
  558. package/dist/test/suites/build/template-replace.test.js +116 -0
  559. package/dist/test/suites/build/test-discovery.test.js +64 -0
  560. package/dist/test/suites/build/test-target-no-match.test.js +119 -0
  561. package/dist/test/suites/build/theme-resolve.test.js +115 -0
  562. package/dist/test/suites/build/translate.test.js +85 -0
  563. package/dist/test/suites/build/url-helpers.test.js +119 -0
  564. package/dist/test/suites/build/verb-logs.test.js +43 -0
  565. package/dist/test/suites/build/verts-binding.test.js +67 -0
  566. package/dist/test/suites/build/wakeup-ping.test.js +90 -0
  567. package/dist/test/suites/build/wave5-messenger.test.js +80 -0
  568. package/dist/test/suites/view/options-and-sidepanel.test.js +16 -0
  569. package/dist/test/suites/view/popup-context.test.js +53 -0
  570. package/dist/test/suites/view/sidepanel.test.js +16 -0
  571. package/dist/test/utils/extended-mode-warning.js +13 -0
  572. package/dist/utils/attach-log-file.js +4 -0
  573. package/dist/utils/mode-helpers.js +117 -0
  574. package/dist/utils/url-helpers.js +69 -0
  575. package/dist/vendor/account/engine.js +182 -0
  576. package/dist/vendor/account/features.js +220 -0
  577. package/dist/vendor/account/index.js +53 -0
  578. package/dist/vendor/account/schema.js +272 -0
  579. package/dist/vendor/account/subscription.js +38 -0
  580. package/dist/vendor/config/company.js +31 -0
  581. package/dist/vendor/config/defaults.js +173 -0
  582. package/dist/vendor/config/demo.js +18 -0
  583. package/dist/vendor/config/desktop-artifacts.js +110 -0
  584. package/dist/vendor/config/edit.js +769 -0
  585. package/dist/vendor/config/env-delivery.js +145 -0
  586. package/dist/vendor/config/env-rules.js +93 -0
  587. package/dist/vendor/config/env-schema.js +1078 -0
  588. package/dist/vendor/config/env.js +445 -0
  589. package/dist/vendor/config/hooks.js +97 -0
  590. package/dist/vendor/config/index.js +237 -0
  591. package/dist/vendor/config/instances.js +208 -0
  592. package/dist/vendor/config/load.js +490 -0
  593. package/dist/vendor/config/merge.js +68 -0
  594. package/dist/vendor/config/order.js +139 -0
  595. package/dist/vendor/config/ports.js +374 -0
  596. package/dist/vendor/config/providers.js +32 -0
  597. package/dist/vendor/config/repo.js +142 -0
  598. package/dist/vendor/config/retired-keys.js +430 -0
  599. package/dist/vendor/config/schema.js +1610 -0
  600. package/dist/vendor/config/secrets.js +50 -0
  601. package/dist/vendor/config/seed.js +34 -0
  602. package/dist/vendor/config/site-global.js +205 -0
  603. package/dist/vendor/config/validate.js +554 -0
  604. package/dist/vendor/config/winback.js +61 -0
  605. package/dist/vendor/devkit/actions-secrets.js +145 -0
  606. package/dist/vendor/devkit/attach-log-file.js +262 -0
  607. package/dist/vendor/devkit/bundle.js +292 -0
  608. package/dist/vendor/devkit/ci-workflows.js +520 -0
  609. package/dist/vendor/devkit/clean-dirs.js +28 -0
  610. package/dist/vendor/devkit/cli-router.js +156 -0
  611. package/dist/vendor/devkit/defaults-engine.js +372 -0
  612. package/dist/vendor/devkit/deploy-precheck.js +54 -0
  613. package/dist/vendor/devkit/deploy-record.js +180 -0
  614. package/dist/vendor/devkit/deploy.js +286 -0
  615. package/dist/vendor/devkit/empty-modules-plugin.js +64 -0
  616. package/dist/vendor/devkit/env-watch.js +132 -0
  617. package/dist/vendor/devkit/framework-deps.js +46 -0
  618. package/dist/vendor/devkit/icons.js +178 -0
  619. package/dist/vendor/devkit/license.js +155 -0
  620. package/dist/vendor/devkit/local.js +1905 -0
  621. package/dist/vendor/devkit/logger.js +128 -0
  622. package/dist/vendor/devkit/merge-line-files.js +296 -0
  623. package/dist/vendor/devkit/npm-registry.js +52 -0
  624. package/dist/vendor/devkit/omega-bin.js +345 -0
  625. package/dist/vendor/devkit/safe-install.js +18 -0
  626. package/dist/vendor/devkit/scaffold-guard.js +96 -0
  627. package/dist/vendor/devkit/strip-dev-blocks-plugin.js +29 -0
  628. package/dist/vendor/devkit/strip-dev-blocks.js +32 -0
  629. package/dist/vendor/devkit/target-dependencies.js +137 -0
  630. package/dist/vendor/devkit/target-secrets.js +165 -0
  631. package/dist/vendor/devkit/test/assert.js +120 -0
  632. package/dist/vendor/devkit/test/define-cases.js +104 -0
  633. package/dist/vendor/devkit/test/extended-mode-warning.js +22 -0
  634. package/dist/vendor/devkit/test/runner-core.js +554 -0
  635. package/dist/vendor/devkit/test/scope.js +162 -0
  636. package/dist/vendor/devkit/translate/cache.js +84 -0
  637. package/dist/vendor/devkit/translate/engine.js +243 -0
  638. package/dist/vendor/devkit/translate/index.js +49 -0
  639. package/dist/vendor/devkit/translate/languages.js +134 -0
  640. package/dist/vendor/devkit/translate/providers.js +188 -0
  641. package/dist/vendor/devkit/update.js +569 -0
  642. package/docs/affiliatizer.md +81 -0
  643. package/docs/audit.md +67 -0
  644. package/docs/auth.md +149 -0
  645. package/docs/build-system.md +176 -0
  646. package/docs/cdp-debugging.md +42 -0
  647. package/docs/cli.md +73 -0
  648. package/docs/common-mistakes.md +10 -0
  649. package/docs/components.md +87 -0
  650. package/docs/css.md +133 -0
  651. package/docs/defaults.md +72 -0
  652. package/docs/environment-detection.md +79 -0
  653. package/docs/extension.md +93 -0
  654. package/docs/hooks.md +111 -0
  655. package/docs/icons.md +47 -0
  656. package/docs/index.md +291 -0
  657. package/docs/logging.md +33 -0
  658. package/docs/managers.md +100 -0
  659. package/docs/offscreen.md +57 -0
  660. package/docs/publishing.md +182 -0
  661. package/docs/shared/agent-docs.md +89 -0
  662. package/docs/shared/analytics.md +612 -0
  663. package/docs/shared/brands.md +51 -0
  664. package/docs/shared/breaking-changes.md +497 -0
  665. package/docs/shared/config.md +1387 -0
  666. package/docs/shared/deploys.md +215 -0
  667. package/docs/shared/icons.md +201 -0
  668. package/docs/shared/local-dev.md +147 -0
  669. package/docs/shared/logging.md +202 -0
  670. package/docs/shared/monitoring.md +153 -0
  671. package/docs/shared/publishing.md +183 -0
  672. package/docs/shared/rulings.md +34 -0
  673. package/docs/shared/testing.md +147 -0
  674. package/docs/shared/theming.md +604 -0
  675. package/docs/shared/translation.md +291 -0
  676. package/docs/shared/updates.md +61 -0
  677. package/docs/templating.md +66 -0
  678. package/docs/test-boot-layer.md +143 -0
  679. package/docs/test-framework.md +411 -0
  680. package/docs/themes.md +89 -0
  681. package/docs/translations.md +73 -0
  682. package/docs/verts.md +67 -0
  683. package/docs/xss-prevention.md +95 -0
  684. package/package.json +159 -0
@@ -0,0 +1,335 @@
1
+ {
2
+ description: 'Serif display hero — rotating italic second line, ink CTA + mono command, optional stat cards, floating product frame, optional demo capture (input/form/video/custom). The classy homepage opener.',
3
+
4
+ // Top-level arg contract (validation is warn-only; names are API — renames
5
+ // follow deprecation discipline, spec §6)
6
+ args: {
7
+ breadcrumb: 'array', // ordered [{ label, href }] rendered as the nav above the headline — the LAST crumb is the current page and never links; absent renders nothing (#513). Pair it with the BreadcrumbList JSON-LD foot.html emits: the arg is the on-page trail, not the structured data
8
+ badge: 'object',
9
+ headline: 'string',
10
+ headline_accent: 'string',
11
+ heading_level: 'number', // the headline's heading tag (default 1) — a hero-shaped band BELOW the page's opener authors 2, so one page never ships two h1s (#500)
12
+ rotating: 'array',
13
+ description: 'string',
14
+ primary_button: 'object', // { text, href, enabled, icon?, class? } — an authored class replaces btn-adaptive; an authored icon leads the label INSTEAD of the arrow nudge
15
+ command: 'string',
16
+ command_href: 'string',
17
+ secondary_button: 'object', // { text, href, enabled, icon?, class? } — same contract over btn-outline-adaptive
18
+ meta: 'array',
19
+ cards: 'array', // stat cards under the hero ({ number, label, icon? }) — the marketing/stats vocabulary, no default: brand content is never a theme's voice
20
+ frame: 'object', // { enabled, title } — the centred product mock; a demo that IS the hero visual suppresses it: a side demo of any type (#496), and a video demo in any placement (#486)
21
+ // demo.type 'video' (legacy parity, #486) carries its knobs in the same
22
+ // options object: { src, poster, autoplay, loop, muted, controls, class,
23
+ // subtext }. The player rides omega_video, so the file lazy-loads like
24
+ // every other media; controls default ON (an unauthored video plays only
25
+ // on click) and an authored autoplay is ALWAYS muted.
26
+ // A `custom` demo has TWO fills: `name` points at a consumer animation
27
+ // folder — src/_hero/<name>/{index.html, style.scss, script.js}, resolved
28
+ // through the layer chain, its css and js bundled like a section's (#441) —
29
+ // and `options.content` is finished markup authored at the call site. A
30
+ // name wins over content. The framework ships `orbit` as the reference one.
31
+ demo: 'object', // { enabled, type, placement, name, options } — type: input | form | video | custom; placement: 'side' sets the demo BESIDE the copy; anything else (the default) centres it under the CTAs
32
+ demo_html: 'html', // finished markup for the demo position ({% slot demo_html %}) — replaces the typed demo lanes when set
33
+ },
34
+
35
+ // Every key consumer-overridable; string values liquify at the call site
36
+ // (so {{ resolved.config.brand.name }} resolves against the calling page's scope).
37
+ defaults: {
38
+ badge: {
39
+ text: 'Introducing {{ resolved.config.brand.name }}',
40
+ href: null,
41
+ },
42
+ headline: 'The platform for',
43
+ rotating: [
44
+ 'modern business',
45
+ 'shipping faster',
46
+ 'scaling your team',
47
+ ],
48
+ description: 'Everything you need to launch, measure, and grow: auth, payments, analytics, and every surface of your product in one place.',
49
+ primary_button: {
50
+ text: 'Get started free',
51
+ href: '/signup',
52
+ },
53
+ // No command default (pass B): the mono $ button renders only when the
54
+ // BRAND sets one — a framework command is never a theme's voice.
55
+ secondary_button: {
56
+ enabled: false,
57
+ text: 'See pricing',
58
+ href: '/pricing',
59
+ },
60
+ meta: [
61
+ 'Free plan',
62
+ 'No credit card required',
63
+ 'Set up in minutes',
64
+ ],
65
+ frame: {
66
+ enabled: true,
67
+ title: '{{ resolved.config.brand.name }} · Overview',
68
+ },
69
+ demo: {
70
+ enabled: false,
71
+ type: 'input',
72
+ placement: 'bottom',
73
+ // Input-lane knobs only — they render inside the input/form branches and
74
+ // leak nothing. Copy (subtext) and the card width live with the CALLER:
75
+ // a default here rides the deep merge onto every other demo type.
76
+ options: {
77
+ placeholder: 'Enter your email',
78
+ name: 'email',
79
+ input_type: 'email',
80
+ required: true,
81
+ redirect: '/dashboard/account',
82
+ button: {
83
+ text: 'Start free trial',
84
+ class: 'btn-adaptive',
85
+ },
86
+ },
87
+ },
88
+ },
89
+
90
+ // Showcase variants (spec §9) — args ride the data bridge over the
91
+ // defaults above, exactly like a consumer composition.
92
+ demo: [
93
+ { label: 'Default' },
94
+ {
95
+ label: 'Email capture',
96
+ args: {
97
+ demo: {
98
+ enabled: true,
99
+ options: { subtext: 'No credit card required' },
100
+ },
101
+ },
102
+ },
103
+ {
104
+ label: 'No frame, second button',
105
+ args: {
106
+ frame: { enabled: false },
107
+ secondary_button: { enabled: true },
108
+ },
109
+ },
110
+ {
111
+ label: 'Input capture',
112
+ args: {
113
+ headline: 'Create your logo in',
114
+ headline_accent: 'seconds',
115
+ description: 'Enter your business name and watch the magic happen',
116
+ demo: {
117
+ enabled: true,
118
+ type: 'input',
119
+ options: {
120
+ class: 'mw-md',
121
+ placeholder: 'Enter your business name...',
122
+ name: 'business_name',
123
+ input_type: 'text',
124
+ required: true,
125
+ redirect: '/dashboard',
126
+ subtext: 'No credit card required - 5 free logos',
127
+ button: {
128
+ text: 'Generate logo',
129
+ icon: 'wand-magic-sparkles',
130
+ class: 'btn-adaptive-inverse',
131
+ },
132
+ },
133
+ },
134
+ // The legacy button contract (#476): an authored class replaces
135
+ // btn-adaptive and an authored icon takes the arrow nudge's place.
136
+ primary_button: {
137
+ text: 'Get started free',
138
+ icon: 'rocket',
139
+ href: '/dashboard',
140
+ class: 'btn-light',
141
+ },
142
+ secondary_button: {
143
+ text: 'Explore solutions',
144
+ icon: 'book-open',
145
+ href: '/pricing',
146
+ class: 'btn-outline-light',
147
+ },
148
+ },
149
+ },
150
+ {
151
+ label: 'Form',
152
+ args: {
153
+ headline: 'Get your custom',
154
+ headline_accent: 'quote',
155
+ description: "Tell us about your project and we'll get back to you within 24 hours",
156
+ demo: {
157
+ enabled: true,
158
+ type: 'form',
159
+ options: {
160
+ class: 'mw-lg',
161
+ redirect: '/contact',
162
+ subtext: 'We respond within 24 hours',
163
+ fields: [
164
+ {
165
+ name: 'industry',
166
+ label: 'Industry',
167
+ icon: 'building',
168
+ type: 'select',
169
+ size: 'half',
170
+ placeholder: 'Select industry',
171
+ options: [
172
+ { value: 'technology', label: 'Technology' },
173
+ { value: 'healthcare', label: 'Healthcare' },
174
+ { value: 'finance', label: 'Finance' },
175
+ { value: 'retail', label: 'Retail' },
176
+ ],
177
+ },
178
+ {
179
+ name: 'company_size',
180
+ label: 'Company size',
181
+ icon: 'users',
182
+ type: 'select',
183
+ size: 'half',
184
+ placeholder: 'Select size',
185
+ options: [
186
+ { value: '1-10', label: '1-10 employees' },
187
+ { value: '11-50', label: '11-50 employees' },
188
+ { value: '51-200', label: '51-200 employees' },
189
+ { value: '200+', label: '200+ employees' },
190
+ ],
191
+ },
192
+ {
193
+ name: 'message',
194
+ label: 'Tell us about your project',
195
+ icon: 'comment',
196
+ type: 'textarea',
197
+ size: 'full',
198
+ placeholder: 'Describe your goals, challenges, or questions...',
199
+ rows: 4,
200
+ required: true,
201
+ },
202
+ ],
203
+ button: {
204
+ text: 'Get quote',
205
+ icon: 'paper-plane',
206
+ full_width: true,
207
+ class: 'btn-adaptive-inverse',
208
+ },
209
+ },
210
+ },
211
+ },
212
+ },
213
+ {
214
+ // No frame authored off: a video demo IS the hero visual, so the
215
+ // centred product frame suppresses itself (#486).
216
+ label: 'Video',
217
+ args: {
218
+ headline: 'See the platform in',
219
+ headline_accent: 'action',
220
+ description: 'Watch how easy it is to ship every surface of your product',
221
+ demo: {
222
+ enabled: true,
223
+ type: 'video',
224
+ options: {
225
+ class: 'mw-lg',
226
+ src: 'https://cdn.itwcreativeworks.com/assets/sample/videos/demos/16x9/sample-demo-1.webm',
227
+ autoplay: true,
228
+ loop: true,
229
+ muted: true,
230
+ controls: false,
231
+ subtext: 'No sound - autoplay enabled',
232
+ },
233
+ },
234
+ },
235
+ },
236
+ {
237
+ label: 'Side placement',
238
+ args: {
239
+ headline: 'Everything you need,',
240
+ headline_accent: 'side by side',
241
+ description: 'The demo sits beside the copy instead of under the CTAs',
242
+ demo: {
243
+ enabled: true,
244
+ type: 'video',
245
+ placement: 'side',
246
+ options: {
247
+ class: 'mw-lg',
248
+ src: 'https://cdn.itwcreativeworks.com/assets/sample/videos/demos/16x9/sample-demo-1.webm',
249
+ autoplay: true,
250
+ loop: true,
251
+ muted: true,
252
+ controls: false,
253
+ subtext: 'No sound, autoplay enabled',
254
+ },
255
+ },
256
+ },
257
+ },
258
+ {
259
+ // The named-folder lane (#441): the framework's own reference animation,
260
+ // resolved out of themes/base/_hero/orbit/ the way a consumer's
261
+ // src/_hero/<name>/ resolves. No frame — the animation IS the visual.
262
+ label: 'Custom animation',
263
+ args: {
264
+ headline: 'One stack for',
265
+ headline_accent: 'every surface',
266
+ description: 'A hero animation the brand owns: one folder, its own markup, styles and behavior.',
267
+ frame: { enabled: false },
268
+ demo: {
269
+ enabled: true,
270
+ type: 'custom',
271
+ name: 'orbit',
272
+ options: { subtext: 'src/_hero/orbit/' },
273
+ },
274
+ },
275
+ },
276
+ {
277
+ label: 'Custom slot',
278
+ args: {
279
+ headline: 'Design your',
280
+ headline_accent: 'brand',
281
+ description: 'Try our interactive brand builder right here',
282
+ demo: {
283
+ enabled: true,
284
+ type: 'custom',
285
+ options: {
286
+ class: 'bg-glassy rounded-4 p-4 mw-md',
287
+ subtext: 'Customize and preview in real-time',
288
+ // Finished markup, authored at the CALL site: it liquifies in the
289
+ // caller's scope (omega_* tags work) and lands in the demo slot as
290
+ // is. Anchors are welcome — the route guard skips escaped code
291
+ // display, so the gallery's copyable args block no longer reads a
292
+ // demo's href= as a link the page emits (#521).
293
+ content: '<div class="row g-3 text-start">\
294
+ <div class="col-12">\
295
+ <label for="demo-brand-color" class="form-label fw-bold"><i class="fa-solid fa-palette me-1"></i>Choose your brand color:</label>\
296
+ <input type="color" class="form-control form-control-color form-control-lg border-0 w-100" id="demo-brand-color" value="#6366f1" aria-label="Choose your brand color">\
297
+ </div>\
298
+ <div class="col-12">\
299
+ <a href="/signup" class="btn btn-adaptive-inverse btn-lg px-4 w-100"><i class="fa-solid fa-palette me-2"></i>Apply theme</a>\
300
+ </div>\
301
+ </div>',
302
+ },
303
+ },
304
+ },
305
+ },
306
+ {
307
+ // The deep-page shape: a page inside a hub says where it sits before it
308
+ // says anything else. No frame — the trail carries the page, not a mock.
309
+ // The crumb hrefs are REAL default routes: a variant's rendered frame
310
+ // rides the #427 route guard like every other default page.
311
+ label: 'Breadcrumb',
312
+ args: {
313
+ breadcrumb: [
314
+ { label: 'Home', href: '/' },
315
+ { label: 'Blog', href: '/blog' },
316
+ { label: 'Shipping faster' },
317
+ ],
318
+ headline: 'Everything we learned',
319
+ headline_accent: 'shipping faster',
320
+ description: 'A deep page that says where it sits before it says anything else.',
321
+ frame: { enabled: false },
322
+ },
323
+ },
324
+ {
325
+ label: 'Stat cards',
326
+ args: {
327
+ cards: [
328
+ { number: '99%', label: 'Uptime', icon: 'shield-halved' },
329
+ { number: '500K+', label: 'Builds shipped', icon: 'rocket' },
330
+ { number: '30+', label: 'Integrations' },
331
+ ],
332
+ },
333
+ },
334
+ ],
335
+ }
@@ -0,0 +1,38 @@
1
+ <section{% if args.section_class != blank %} class="{{ args.section_class }}"{% endif %} data-omega-section="marketing/newsletter-cta">
2
+ <div class="container">
3
+ <div class="omega-cta omega-ink-panel" data-omega-reveal="scale">
4
+ {% iftruthy args.superheadline.text %}
5
+ <span class="omega-micro d-block mb-3">{{ args.superheadline.text }}</span>
6
+ {% endiftruthy %}
7
+ <h2 class="omega-cta__headline">{{ args.headline }}</h2>
8
+ {% iftruthy args.subheadline %}
9
+ <p class="omega-cta__sub">{{ args.subheadline }}</p>
10
+ {% endiftruthy %}
11
+
12
+ <!-- Newsletter Form -->
13
+ <form id="newsletter-form" class="newsletter-form mt-4" novalidate data-form-state="initializing" onsubmit="return false">
14
+ <div class="row g-3 justify-content-center">
15
+ <div class="col-md-5">
16
+ <input
17
+ type="email"
18
+ class="form-control form-control-lg"
19
+ placeholder="{{ args.form.placeholder }}"
20
+ name="email"
21
+ required
22
+ autocomplete="email"
23
+ >
24
+ <div class="invalid-feedback text-start">
25
+ Please enter a valid email address.
26
+ </div>
27
+ </div>
28
+ <div class="col-md-auto">
29
+ <button type="submit" class="btn btn-adaptive btn-lg px-4">
30
+ <i class="fa-solid fa-paper-plane fa-sm me-2"></i>
31
+ <span class="button-text">{{ args.button.text }}</span>
32
+ </button>
33
+ </div>
34
+ </div>
35
+ </form>
36
+ </div>
37
+ </div>
38
+ </section>
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Newsletter capture behavior — binds this section's form to the client
3
+ * FormManager (managed states, validation, success/error alerts) and posts
4
+ * the address to the backend's public subscribe endpoint
5
+ * (`POST /omega/marketing/contact` — email validation, reCAPTCHA, rate
6
+ * limiting, provider add server-side). The §7 presence init calls this once
7
+ * per rendered instance with the section's root element, so the binding
8
+ * works on ANY page that composes the band.
9
+ *
10
+ * reCAPTCHA loads lazily on first interaction with the form (not at page
11
+ * load — the band rides most pages and passive visitors shouldn't pay for
12
+ * the Google script). No site key configured → the request still sends;
13
+ * the backend decides.
14
+ */
15
+ import omega from '@omega.js/client';
16
+ import { WAKEUP_ROUTE } from '@omega.js/client/modules/request.js';
17
+ import { FormManager } from '@omega.js/client/modules/form-manager.js';
18
+ import { initializeRecaptcha, getRecaptchaToken } from '__main_assets__/js/libs/recaptcha.js';
19
+ import { event } from '__main_assets__/js/libs/analytics.js';
20
+
21
+ export default (el) => {
22
+ const $form = el.querySelector('form.newsletter-form');
23
+ if (!$form) {
24
+ return;
25
+ }
26
+
27
+ // Warm reCAPTCHA on first interaction so the token is ready by submit
28
+ let recaptchaWarmup = null;
29
+ const warmup = () => {
30
+ recaptchaWarmup = recaptchaWarmup || initializeRecaptcha(omega.config?.captcha?.providers?.recaptcha?.siteKey);
31
+ return recaptchaWarmup;
32
+ };
33
+
34
+ // The backend warms on that same first interaction, and not on load: this
35
+ // band rides most pages, so a passive visitor would ping a function they are
36
+ // never going to POST to. A focus IS the intent, and the submit behind it is
37
+ // `/omega/marketing/contact`
38
+ // ([#644](https://github.com/Omega-JS-Stack/omega/issues/644)).
39
+ $form.addEventListener('focusin', () => {
40
+ omega.request(WAKEUP_ROUTE, { wakeup: true });
41
+ warmup();
42
+ }, { once: true });
43
+
44
+ const formManager = new FormManager($form, {
45
+ allowResubmit: false,
46
+ resetOnSuccess: true,
47
+ submittingText: 'Subscribing...',
48
+ submittedText: 'Subscribed!',
49
+ });
50
+
51
+ formManager.on('submit', async ({ data }) => {
52
+ await warmup();
53
+ const recaptchaToken = await getRecaptchaToken('newsletter_signup');
54
+
55
+ // A thrown error runs FormManager's own catch: it shows the error alert
56
+ // AND restores the ready state so the visitor can retry. Swallowing the
57
+ // error here would let FormManager run its success path (reset +
58
+ // disabled + "Subscribed!") on a failed submit. Single attempt on
59
+ // purpose — reCAPTCHA tokens are single-use, so a retry would resend a
60
+ // consumed token; the restored form IS the retry path.
61
+ try {
62
+ await omega.request('/omega/marketing/contact', {
63
+ method: 'POST',
64
+ auth: false,
65
+ timeout: 15000,
66
+ body: {
67
+ email: data.email,
68
+ source: 'newsletter-cta',
69
+ 'g-recaptcha-response': recaptchaToken || '',
70
+ },
71
+ });
72
+ } catch (e) {
73
+ throw new Error('Something went wrong. Please try again.');
74
+ }
75
+
76
+ trackNewsletterSignup();
77
+ formManager.showSuccess('Thanks for subscribing!');
78
+ });
79
+ };
80
+
81
+ // Tracking (the guarded helper no-ops per provider when its global is absent)
82
+ function trackNewsletterSignup() {
83
+ event('marketing_newsletter_subscribe', {
84
+ method: 'newsletter-cta',
85
+ });
86
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ description: 'The ink newsletter band — email capture over the classy CTA panel, speaking the client form-manager dialect (data-form-state; its section.js binds the form through the §7 presence init — the reference consumer of the section-JS lane). SHARED band: defaults stay neutral, every page passes its own copy.',
3
+
4
+ args: {
5
+ superheadline: 'object',
6
+ headline: 'string',
7
+ subheadline: 'string',
8
+ button: 'object',
9
+ form: 'object',
10
+ section_class: 'string',
11
+ },
12
+
13
+ defaults: {},
14
+
15
+ // Showcase variants (spec §9) — a SHARED band keeps neutral defaults, so
16
+ // the demo carries its own generic copy.
17
+ demo: [
18
+ {
19
+ label: 'Capture band',
20
+ args: {
21
+ superheadline: { text: 'Newsletter' },
22
+ headline: 'Stay in the loop',
23
+ subheadline: 'One email a month: product updates, guides, and nothing else.',
24
+ button: { text: 'Subscribe' },
25
+ form: { placeholder: 'you@example.com' },
26
+ },
27
+ },
28
+ ],
29
+ }
@@ -0,0 +1,115 @@
1
+ {% comment %} The minimal plan band (#493). Every figure comes from the plan
2
+ view-models the layout bridges in — the same `resolved.pricing` /pricing
3
+ renders — so the homepage can never drift from the catalog. The annual view
4
+ shows the resolver's own floored monthly equivalent (#477); nothing here does
5
+ arithmetic. The card vocabulary is /pricing's `omega-price-card`, minus the
6
+ billing-toggle JS hooks (`amount`, `billing-info`): the toggle is a page
7
+ module, and a hook nothing binds is a dead contract. Each CTA is a real link
8
+ for the same reason — the checkout button only works on /pricing. {% endcomment %}
9
+ {% if args.enabled != false and args.plans and args.plans.size > 0 %}
10
+ <section>
11
+ <div class="container" data-omega-reveal-stagger="80">
12
+ <div class="omega-section-head omega-section-head--center mb-5" data-omega-reveal>
13
+ {% component "heading/section-head", superheadline: args.superheadline, headline: args.headline, headline_accent: args.headline_accent, sub: args.subheadline %}
14
+ </div>
15
+
16
+ {% comment %} The row fits the catalog it was given — a brand with two
17
+ tiers gets two wide cards, not two thirds of a row. {% endcomment %}
18
+ {% assign plan_count = args.plans | size %}
19
+ {% if plan_count == 1 %}
20
+ {% assign col_classes = "col-12 col-md-8 col-lg-5" %}
21
+ {% elsif plan_count == 2 %}
22
+ {% assign col_classes = "col-12 col-md-6 col-lg-5" %}
23
+ {% elsif plan_count == 3 %}
24
+ {% assign col_classes = "col-12 col-md-6 col-lg-4" %}
25
+ {% else %}
26
+ {% assign col_classes = "col-12 col-sm-6 col-lg-4 col-xl-3" %}
27
+ {% endif %}
28
+
29
+ <div class="row g-4 justify-content-center">
30
+ {% for plan in args.plans %}
31
+ <div class="{{ col_classes }}" data-omega-reveal>
32
+ <div class="card omega-price-card {% if plan.popular %}omega-price-card--popular{% endif %} h-100">
33
+ {% if plan.popular %}
34
+ <span class="omega-chip omega-chip--ink omega-price-card__popular">Most popular</span>
35
+ {% endif %}
36
+
37
+ <h3 class="card-title omega-price-card__name mb-0">{{ plan.name }}</h3>
38
+ {% iftruthy plan.tagline %}
39
+ <p class="omega-price-card__tagline">{{ plan.tagline }}</p>
40
+ {% endiftruthy %}
41
+
42
+ {% if plan.free %}
43
+ <div class="omega-price-card__price">
44
+ <span class="omega-price-card__amount">Free</span>
45
+ </div>
46
+ {% else %}
47
+ {% if args.annual and plan.prices.annually > 0 %}
48
+ {% assign plan_amount = plan.prices.annuallyPerMonth %}
49
+ {% else %}
50
+ {% assign plan_amount = plan.prices.monthly %}
51
+ {% endif %}
52
+ <div class="omega-price-card__price">
53
+ <span class="omega-price-card__currency">$</span>
54
+ <span class="omega-price-card__amount">{{ plan_amount }}</span>
55
+ <span class="omega-price-card__per">/month</span>
56
+ </div>
57
+ {% endif %}
58
+
59
+ {% comment %} The features, through the SAME component /pricing's
60
+ cards render (#539): the catalog's definitions carry their hover
61
+ explanations here too. The tier note between the two lists reads
62
+ `and:` — the ONE wording, here and on /pricing, because a thing
63
+ never renders differently in two places (Ian 2026-08-24).
64
+ {% endcomment %}
65
+ {% comment %} The composer splits a plan's features into the set
66
+ every plan shares and that plan's extras; a plan hand-authored in
67
+ a page body carries neither, so its whole list is the shared one.
68
+ {% endcomment %}
69
+ {% assign plan_common = plan.commonFeatures %}
70
+ {% if plan.commonFeatures == nil and plan.extraFeatures == nil %}
71
+ {% assign plan_common = plan.features %}
72
+ {% endif %}
73
+ {% if plan_common.size > 0 or plan.extraFeatures.size > 0 %}
74
+ {% component "pricing/features", features: plan_common %}
75
+
76
+ {% if plan.extraFeatures.size > 0 %}
77
+ {% unless forloop.first %}
78
+ {% assign prev_index = forloop.index0 | minus: 1 %}
79
+ {% assign prev_plan = args.plans[prev_index] %}
80
+ <div class="omega-price-card__tier-note">
81
+ Everything in <strong>{{ prev_plan.name }}</strong>, and:
82
+ </div>
83
+ {% endunless %}
84
+ {% component "pricing/features", features: plan.extraFeatures %}
85
+ {% elsif forloop.first == false %}
86
+ {% assign prev_index = forloop.index0 | minus: 1 %}
87
+ {% assign prev_plan = args.plans[prev_index] %}
88
+ <div class="omega-price-card__tier-note">
89
+ Everything in <strong>{{ prev_plan.name }}</strong>
90
+ </div>
91
+ {% endif %}
92
+ {% endif %}
93
+
94
+ <div class="d-grid omega-price-card__cta">
95
+ {% if plan.popular %}
96
+ {% assign plan_btn = "btn-adaptive omega-btn-ring" %}
97
+ {% else %}
98
+ {% assign plan_btn = "btn-outline-adaptive" %}
99
+ {% endif %}
100
+ <a href="{{ plan.url | default: args.href }}" class="btn {{ plan_btn }} fw-semibold omega-hover-nudge">
101
+ {% if plan.trialDays > 0 %}
102
+ Get free trial
103
+ {% else %}
104
+ Get started
105
+ {% endif %}
106
+ <span class="omega-nudge ms-2"><i class="fa-solid fa-arrow-right fa-sm"></i></span>
107
+ </a>
108
+ </div>
109
+ </div>
110
+ </div>
111
+ {% endfor %}
112
+ </div>
113
+ </div>
114
+ </section>
115
+ {% endif %}
@@ -0,0 +1,72 @@
1
+ {
2
+ description: 'The minimal plan band — one compact card per subscription plan (name, price, the feature list, one CTA), for a homepage that should say what it costs without sending you to /pricing first. The bullets are /pricing\'s own `pricing/features` component, hover explanations included, and the line introducing a tier\'s extras reads "Everything in <previous>, and:" (#539). Reads the SAME resolved catalog /pricing renders (`resolved.pricing`), so no number here is ever a copy: the layout bridges `plans` and `annual` in. No plans, no band. `enabled: false` removes it (#473 family gate).',
3
+
4
+ args: {
5
+ enabled: 'boolean',
6
+ superheadline: 'string',
7
+ headline: 'string',
8
+ headline_accent: 'string',
9
+ subheadline: 'string',
10
+ plans: 'array', // the composed plan view-models — `resolved.pricing.plans`, never hand-authored numbers
11
+ annual: 'boolean', // show each plan's floored monthly equivalent (#477) instead of its monthly price — `resolved.pricing.billing.annually`
12
+ href: 'string', // where a plan with no url of its own sends you
13
+ },
14
+
15
+ defaults: {
16
+ enabled: true,
17
+ superheadline: 'Pricing',
18
+ headline: 'Simple pricing that',
19
+ headline_accent: 'scales with you',
20
+ // No sub line by default: an ABSENT subheadline renders NOTHING. A band
21
+ // the brand authors inherits no words it never wrote (the demo line lives
22
+ // in the gallery variant below, where sample content belongs).
23
+ subheadline: '',
24
+ // No plan defaults, ever: a plan a brand does not sell is fiction, and the
25
+ // catalog is the one source (C2). An empty list renders no band.
26
+ plans: [],
27
+ annual: false,
28
+ href: '/pricing',
29
+ },
30
+
31
+ // Showcase variants (spec §9): the band is catalog-driven, so the demo
32
+ // bridges plan view-models the way the layout does.
33
+ demo: [
34
+ {
35
+ label: 'Two plans',
36
+ args: {
37
+ subheadline: 'Start free, upgrade when it pays for itself.',
38
+ // commonFeatures/extraFeatures are the composer's own split (the tier
39
+ // note renders from it), and a `definition` is what makes a bullet
40
+ // hoverable — the demo carries both because the layout bridges both.
41
+ plans: [
42
+ {
43
+ id: 'starter',
44
+ name: 'Starter',
45
+ tagline: 'best for getting started',
46
+ free: true,
47
+ url: '/signup',
48
+ commonFeatures: [
49
+ { id: 'projects', name: 'Projects', value: 3, definition: 'Live projects you can keep at once.' },
50
+ { id: 'seats', name: 'Seat', value: 1 },
51
+ ],
52
+ },
53
+ {
54
+ id: 'team',
55
+ name: 'Team',
56
+ tagline: 'best for growing teams',
57
+ popular: true,
58
+ trialDays: 14,
59
+ prices: { monthly: 19, annually: 190, annuallyPerMonth: 15 },
60
+ commonFeatures: [
61
+ { id: 'projects', name: 'Projects', value: 'Unlimited', definition: 'Live projects you can keep at once.' },
62
+ { id: 'seats', name: 'Seats', value: 10 },
63
+ ],
64
+ extraFeatures: [
65
+ { id: 'support', name: 'Priority support', value: true },
66
+ ],
67
+ },
68
+ ],
69
+ },
70
+ },
71
+ ],
72
+ }