@omega.js/desktop 0.50.0 → 0.51.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 (267) hide show
  1. package/README.md +1 -1
  2. package/dist/assets/css/tokens/_index.scss +1 -1
  3. package/dist/assets/themes/base/_includes/frontend/sections/account-section-header.html +4 -1
  4. package/dist/assets/themes/base/_includes/frontend/sections/footer.html +13 -6
  5. package/dist/assets/themes/base/_includes/frontend/sections/nav.html +10 -8
  6. package/dist/assets/themes/base/_includes/global/sections/account.html +3 -1
  7. package/dist/assets/themes/base/_includes/global/sections/app-sidebar.html +12 -8
  8. package/dist/assets/themes/base/_includes/global/sections/app-topbar.html +10 -6
  9. package/dist/assets/themes/base/_includes/global/sections/page-header.html +8 -4
  10. package/dist/assets/themes/base/_layouts/backend/pages/dashboard/index.html +24 -24
  11. package/dist/assets/themes/base/_layouts/frontend/pages/about.html +10 -10
  12. package/dist/assets/themes/base/_layouts/frontend/pages/account/index.html +35 -35
  13. package/dist/assets/themes/base/_layouts/frontend/pages/alternatives/index.html +4 -4
  14. package/dist/assets/themes/base/_layouts/frontend/pages/auth/signin.html +1 -1
  15. package/dist/assets/themes/base/_layouts/frontend/pages/auth/signup.html +4 -4
  16. package/dist/assets/themes/base/_layouts/frontend/pages/contact.html +3 -3
  17. package/dist/assets/themes/base/_layouts/frontend/pages/download.html +34 -33
  18. package/dist/assets/themes/base/_layouts/frontend/pages/extension/index.html +11 -11
  19. package/dist/assets/themes/base/_layouts/frontend/pages/legal/document.html +1 -1
  20. package/dist/assets/themes/base/_layouts/frontend/pages/status.html +1 -1
  21. package/dist/assets/themes/base/_layouts/frontend/pages/team/index.html +9 -7
  22. package/dist/assets/themes/base/_layouts/frontend/pages/team/member.html +5 -3
  23. package/dist/assets/themes/base/_sections/about/letter/section.html +1 -1
  24. package/dist/assets/themes/base/_sections/about/letter/section.json5 +4 -4
  25. package/dist/assets/themes/base/_sections/marketing/bento/section.html +1 -1
  26. package/dist/assets/themes/base/_sections/marketing/bento/section.json5 +15 -15
  27. package/dist/assets/themes/base/_sections/marketing/cta/section.json5 +1 -1
  28. package/dist/assets/themes/base/_sections/marketing/hero/section.html +6 -6
  29. package/dist/assets/themes/base/_sections/marketing/hero/section.json5 +10 -10
  30. package/dist/assets/themes/base/_sections/marketing/product-demo/section.html +1 -1
  31. package/dist/assets/themes/base/_sections/marketing/product-demo/section.json5 +2 -2
  32. package/dist/assets/themes/base/_sections/marketing/stats/section.html +1 -1
  33. package/dist/assets/themes/base/_sections/marketing/stats/section.json5 +5 -5
  34. package/dist/assets/themes/base/_sections/marketing/trusted-by/section.html +1 -1
  35. package/dist/assets/themes/base/_sections/marketing/trusted-by/section.json5 +2 -2
  36. package/dist/assets/themes/neobrutalism/_layouts/frontend/pages/index.html +10 -10
  37. package/dist/assets/themes/newsflash/_layouts/frontend/pages/index.html +10 -10
  38. package/dist/assets/themes/newsflash/_sections/marketing/desks/section.html +2 -2
  39. package/dist/assets/themes/newsflash/_sections/marketing/desks/section.json5 +4 -4
  40. package/dist/build.js +69 -28
  41. package/dist/cli-run.js +20 -13
  42. package/dist/cli.js +12 -7
  43. package/dist/commands/build.js +0 -2
  44. package/dist/commands/deploy.js +116 -44
  45. package/dist/commands/finalize-release.js +5 -4
  46. package/dist/commands/launch.js +12 -7
  47. package/dist/commands/lib/deploy-precheck.js +66 -34
  48. package/dist/commands/lib/ensure-target.js +71 -11
  49. package/dist/commands/package.js +0 -1
  50. package/dist/commands/publish.js +11 -4
  51. package/dist/commands/release.js +99 -252
  52. package/dist/commands/runner.js +42 -5
  53. package/dist/commands/sign-windows.js +46 -15
  54. package/dist/commands/test.js +4 -3
  55. package/dist/commands/validate-certs.js +291 -115
  56. package/dist/config/page-template.html +4 -0
  57. package/dist/defaults/.github/workflows/build.yml +144 -64
  58. package/dist/defaults/AGENTS.md +3 -2
  59. package/dist/defaults/_.gitignore +4 -2
  60. package/dist/defaults/config/certs/README.md +25 -45
  61. package/dist/defaults/config/omega.json5 +66 -32
  62. package/dist/defaults/hooks/deploy/pre.js +10 -0
  63. package/dist/defaults/src/assets/scss/main.scss +12 -2
  64. package/dist/defaults/src/integrations/tray/index.js +1 -1
  65. package/dist/gulp/main.js +13 -25
  66. package/dist/gulp/tasks/audit.js +18 -6
  67. package/dist/gulp/tasks/build-config.js +181 -60
  68. package/dist/gulp/tasks/bundle.js +108 -36
  69. package/dist/gulp/tasks/release.js +86 -4
  70. package/dist/gulp/tasks/sass.js +11 -0
  71. package/dist/hooks/lib/notarize-tools.js +137 -0
  72. package/dist/hooks/notarize-artifacts.js +57 -0
  73. package/dist/hooks/notarize.js +59 -8
  74. package/dist/lib/auth-persistence.js +25 -0
  75. package/dist/lib/client-bridge.js +11 -8
  76. package/dist/lib/deep-link.js +15 -8
  77. package/dist/lib/protocol.js +7 -1
  78. package/dist/lib/restart-manager/install.js +6 -3
  79. package/dist/lib/sign-helpers/auto-unlock.js +65 -27
  80. package/dist/lib/sign-helpers/console-lock.js +34 -0
  81. package/dist/lib/sign-helpers/exec-with-limit.js +68 -0
  82. package/dist/lib/sign-helpers/resolve-icons.js +6 -4
  83. package/dist/lib/tray.js +7 -6
  84. package/dist/main.js +16 -0
  85. package/dist/preload.js +8 -0
  86. package/dist/renderer.js +16 -4
  87. package/dist/runner/job-started.js +104 -0
  88. package/dist/test/fixtures/consumer-app/config/omega.json5 +7 -0
  89. package/dist/test/fixtures/consumer-app/package.json +1 -1
  90. package/dist/test/fixtures/consumer-app/src/assets/js/components/main/index.js +7 -1
  91. package/dist/test/harness/main-entry.js +2 -1
  92. package/dist/test/harness/renderer-preload.js +12 -3
  93. package/dist/test/runners/boot.js +101 -11
  94. package/dist/test/runners/electron.js +1 -1
  95. package/dist/test/suites/boot/consumer-app-boots.test.js +54 -0
  96. package/dist/test/suites/build/audit.test.js +45 -6
  97. package/dist/test/suites/build/auth-persistence-resolve.test.js +119 -0
  98. package/dist/test/suites/build/auto-unlock.test.js +105 -0
  99. package/dist/test/suites/build/boot-runner-timeout.test.js +253 -0
  100. package/dist/test/suites/build/brand-scss.test.js +106 -0
  101. package/dist/test/suites/build/build-config.test.js +146 -36
  102. package/dist/test/suites/build/build-json-bake.test.js +245 -0
  103. package/dist/test/suites/build/build-verbs.test.js +48 -15
  104. package/dist/test/suites/build/build-workflow-jobs.test.js +190 -0
  105. package/dist/test/suites/build/cli.test.js +32 -10
  106. package/dist/test/suites/build/config-schema.test.js +4 -4
  107. package/dist/test/suites/build/console-lock.test.js +51 -0
  108. package/dist/test/suites/build/defaults-scaffold.test.js +71 -2
  109. package/dist/test/suites/build/deploy-direct.test.js +241 -0
  110. package/dist/test/suites/build/deploy-dispatch.test.js +287 -0
  111. package/dist/test/suites/build/deploy-hook.test.js +169 -0
  112. package/dist/test/suites/build/ensure-target.test.js +14 -2
  113. package/dist/test/suites/build/env-delivery.test.js +19 -10
  114. package/dist/test/suites/build/env-watch.test.js +18 -7
  115. package/dist/test/suites/build/esm-only-dependency.test.js +127 -0
  116. package/dist/test/suites/build/exec-with-limit.test.js +53 -0
  117. package/dist/test/suites/build/finalize-release.test.js +2 -2
  118. package/dist/test/suites/build/get-config.test.js +120 -8
  119. package/dist/test/suites/build/github-utils.test.js +12 -6
  120. package/dist/test/suites/build/license-stamp.test.js +6 -4
  121. package/dist/test/suites/build/manager.test.js +88 -68
  122. package/dist/test/suites/build/manifest-deps.test.js +116 -0
  123. package/dist/test/suites/build/merge-line-files.test.js +27 -4
  124. package/dist/test/suites/build/notarize-artifacts.test.js +135 -0
  125. package/dist/test/suites/build/notarize-tools.test.js +38 -0
  126. package/dist/test/suites/build/notarize.test.js +207 -0
  127. package/dist/test/suites/build/release-pipeline.test.js +38 -60
  128. package/dist/test/suites/build/release-skipped-upload.test.js +107 -0
  129. package/dist/test/suites/build/resolve-icons.test.js +35 -35
  130. package/dist/test/suites/build/runner-job-guard.test.js +182 -0
  131. package/dist/test/suites/build/runner.test.js +25 -2
  132. package/dist/test/suites/build/sentry.test.js +8 -3
  133. package/dist/test/suites/build/setup-scripts.test.js +3 -0
  134. package/dist/test/suites/build/sign-windows.test.js +92 -8
  135. package/dist/test/suites/build/test-stealth.test.js +17 -11
  136. package/dist/test/suites/build/url-helpers.test.js +37 -17
  137. package/dist/test/suites/build/validate-certs.test.js +428 -55
  138. package/dist/test/suites/build/validate-config.test.js +3 -3
  139. package/dist/test/suites/main/auth-flow.test.js +12 -0
  140. package/dist/test/suites/main/auth-persistence.test.js +14 -17
  141. package/dist/test/suites/main/auto-updater.test.js +2 -2
  142. package/dist/test/suites/main/boot-sequence.test.js +1 -1
  143. package/dist/test/suites/main/client-bridge.integration.test.js +5 -82
  144. package/dist/test/suites/main/client-bridge.test.js +19 -6
  145. package/dist/test/suites/main/deep-link.test.js +54 -0
  146. package/dist/test/suites/main/startup-paths-and-ua.test.js +1 -1
  147. package/dist/test/suites/main/url-helpers.test.js +81 -72
  148. package/dist/test/suites/renderer/cross-context-helpers.test.js +19 -16
  149. package/dist/utils/build-pipeline.js +10 -10
  150. package/dist/utils/github.js +12 -51
  151. package/dist/utils/load-env.js +66 -0
  152. package/dist/utils/mode-helpers.js +43 -111
  153. package/dist/utils/platform.js +37 -0
  154. package/dist/utils/runner-env.js +2 -1
  155. package/dist/utils/runner-job-guard.js +149 -0
  156. package/dist/utils/ship-keys.js +52 -0
  157. package/dist/utils/test-stealth.js +5 -3
  158. package/dist/utils/url-helpers.js +33 -17
  159. package/dist/vendor/config/bundle-id.js +53 -0
  160. package/dist/vendor/config/client-config.js +141 -0
  161. package/dist/vendor/config/company.js +334 -15
  162. package/dist/vendor/config/dev-facts.js +48 -0
  163. package/dist/vendor/config/env-delivery.js +231 -9
  164. package/dist/vendor/config/env-retired.js +137 -0
  165. package/dist/vendor/config/env-rules.js +22 -3
  166. package/dist/vendor/config/env-schema.js +234 -117
  167. package/dist/vendor/config/env.js +55 -26
  168. package/dist/vendor/config/environment.js +189 -0
  169. package/dist/vendor/config/hooks.js +13 -11
  170. package/dist/vendor/config/index.js +121 -44
  171. package/dist/vendor/config/load.js +366 -115
  172. package/dist/vendor/config/merge.js +2 -2
  173. package/dist/vendor/config/order.js +3 -3
  174. package/dist/vendor/config/platforms.js +276 -0
  175. package/dist/vendor/config/repo.js +226 -104
  176. package/dist/vendor/config/retired-keys.js +232 -27
  177. package/dist/vendor/config/schema.js +525 -99
  178. package/dist/vendor/config/site-global.js +63 -53
  179. package/dist/vendor/config/targets.js +187 -0
  180. package/dist/vendor/config/validate.js +119 -59
  181. package/dist/vendor/devkit/argv.js +118 -0
  182. package/dist/vendor/devkit/attach-log-file.js +21 -13
  183. package/dist/vendor/devkit/brand-tokens.js +278 -0
  184. package/dist/vendor/devkit/brand-version.js +264 -0
  185. package/dist/vendor/devkit/build-json.js +91 -0
  186. package/dist/vendor/devkit/bundle.js +48 -0
  187. package/dist/vendor/devkit/certificate-expiry.js +108 -0
  188. package/dist/vendor/devkit/certs.js +16 -194
  189. package/dist/vendor/devkit/ci-workflows.js +124 -8
  190. package/dist/vendor/devkit/cli-router.js +3 -3
  191. package/dist/vendor/devkit/defaults-engine.js +69 -7
  192. package/dist/vendor/devkit/deploy-follow.js +297 -0
  193. package/dist/vendor/devkit/deploy-precheck.js +23 -8
  194. package/dist/vendor/devkit/deploy-record.js +11 -27
  195. package/dist/vendor/devkit/deploy-snapshot.js +661 -0
  196. package/dist/vendor/devkit/deploy.js +445 -75
  197. package/dist/vendor/devkit/git-auth.js +73 -0
  198. package/dist/vendor/devkit/git-remote.js +95 -0
  199. package/dist/vendor/devkit/github-repo.js +290 -0
  200. package/dist/vendor/devkit/local.js +47 -0
  201. package/dist/vendor/devkit/merge-line-files.js +23 -16
  202. package/dist/vendor/devkit/omega-bin.js +18 -3
  203. package/dist/vendor/devkit/pack-local.js +391 -0
  204. package/dist/vendor/devkit/preludes/index.js +120 -0
  205. package/dist/vendor/devkit/preludes/origin-heal.js +156 -0
  206. package/dist/vendor/devkit/service-account.js +43 -0
  207. package/dist/vendor/devkit/ship-plan.js +112 -0
  208. package/dist/vendor/devkit/signing-env.js +180 -0
  209. package/dist/vendor/devkit/signing-tree.js +92 -0
  210. package/dist/vendor/devkit/target-seams.js +142 -0
  211. package/dist/vendor/devkit/target-secrets.js +235 -50
  212. package/dist/vendor/devkit/test/esm-only-fixture.js +48 -0
  213. package/dist/vendor/devkit/test/fixtures/esm-only-package/browser.js +19 -0
  214. package/dist/vendor/devkit/test/fixtures/esm-only-package/index.js +20 -0
  215. package/dist/vendor/devkit/test/fixtures/esm-only-package/package.json +13 -0
  216. package/dist/vendor/monitoring/env.js +20 -10
  217. package/dist/vendor/monitoring/main.js +1 -1
  218. package/dist/vendor/monitoring/preload.js +1 -1
  219. package/dist/vendor/monitoring/renderer.js +1 -1
  220. package/docs/analytics.md +1 -1
  221. package/docs/auto-updater.md +5 -5
  222. package/docs/boot-sequence.md +1 -1
  223. package/docs/build-system.md +15 -7
  224. package/docs/client-bridge.md +9 -7
  225. package/docs/config-schema.md +4 -4
  226. package/docs/css.md +8 -2
  227. package/docs/deep-link.md +12 -4
  228. package/docs/environment-detection.md +32 -24
  229. package/docs/hooks.md +3 -1
  230. package/docs/icons.md +7 -7
  231. package/docs/index.md +61 -23
  232. package/docs/installer-options.md +24 -21
  233. package/docs/logging.md +5 -5
  234. package/docs/releasing.md +25 -17
  235. package/docs/runner.md +40 -5
  236. package/docs/shared/brands.md +12 -6
  237. package/docs/shared/breaking-changes.md +375 -21
  238. package/docs/shared/config.md +757 -199
  239. package/docs/shared/deploys.md +194 -91
  240. package/docs/shared/icons.md +18 -0
  241. package/docs/shared/local-dev.md +24 -6
  242. package/docs/shared/logging.md +9 -6
  243. package/docs/shared/monitoring.md +27 -13
  244. package/docs/shared/publishing.md +3 -3
  245. package/docs/shared/rulings.md +2 -2
  246. package/docs/shared/testing.md +1 -1
  247. package/docs/shared/theming.md +26 -1
  248. package/docs/shared/translation.md +49 -7
  249. package/docs/shared/updates.md +1 -1
  250. package/docs/signing.md +59 -33
  251. package/docs/test-framework.md +10 -5
  252. package/docs/themes.md +15 -1
  253. package/package.json +18 -12
  254. package/bin/omega-desktop +0 -2
  255. package/dist/commands/push-secrets.js +0 -141
  256. package/dist/test/suites/build/deliver-certs.test.js +0 -95
  257. package/dist/test/suites/build/derive-signing-env.test.js +0 -122
  258. package/dist/test/suites/build/push-secrets.test.js +0 -226
  259. package/dist/test/suites/build/resolve-signing-cert.test.js +0 -342
  260. package/dist/utils/deliver-certs.js +0 -69
  261. package/dist/utils/derive-signing-env.js +0 -56
  262. package/dist/utils/resolve-signing-cert.js +0 -175
  263. package/dist/vendor/config/desktop-artifacts.js +0 -110
  264. package/dist/vendor/config/instances.js +0 -208
  265. /package/dist/defaults/config/icons/{macos → mac}/dmg.png +0 -0
  266. /package/dist/defaults/config/icons/{macos → mac}/icon.png +0 -0
  267. /package/dist/defaults/config/icons/{macos → mac}/tray.png +0 -0
@@ -39,7 +39,7 @@ runs the container's full width. {% endcomment -%}
39
39
  <span class="omega-micro omega-fragment__label">{{ args.feed_label }}</span>
40
40
  {% for item in args.feed_items %}
41
41
  <div class="omega-fragment__msg">
42
- <span class="omega-fragment__msg-mark"><i class="fa-solid fa-{{ item.icon }} fa-xs"></i></span>
42
+ <span class="omega-fragment__msg-mark"><i class="{{ item.icon }} fa-xs" aria-hidden="true"></i></span>
43
43
  <span>{{ item.text }}</span>
44
44
  </div>
45
45
  {% endfor %}
@@ -4,7 +4,7 @@
4
4
  args: {
5
5
  aside_label: 'string',
6
6
  feed_label: 'string',
7
- feed_items: 'array', // [{ icon, text }] — the ops feed's messages; text carries markup. Empty = no feed, and no aside unless a photo holds it
7
+ feed_items: 'array', // [{ icon, text }] — the ops feed's messages; icon is the full Font Awesome class string, text carries markup. Empty = no feed, and no aside unless a photo holds it
8
8
  feed_status: 'string', // the chip riding the foot of the feed
9
9
  mission: 'object', // { title, description }
10
10
  vision: 'object', // { title, description }
@@ -19,9 +19,9 @@
19
19
  // Placeholder copy, the photo-band way: the demo feed ships so the aside
20
20
  // reads as a living one, and a brand's own items REPLACE it wholesale.
21
21
  feed_items: [
22
- { icon: 'rocket', text: '<strong>v2.4</strong> shipped to production' },
23
- { icon: 'user-plus', text: 'Two new faces on support' },
24
- { icon: 'quote-left', text: '"Best tool we\'ve adopted this year"' },
22
+ { icon: 'fa-solid fa-rocket', text: '<strong>v2.4</strong> shipped to production' },
23
+ { icon: 'fa-solid fa-user-plus', text: 'Two new faces on support' },
24
+ { icon: 'fa-solid fa-quote-left', text: '"Best tool we\'ve adopted this year"' },
25
25
  ],
26
26
  feed_status: 'All systems go',
27
27
  mission: {
@@ -27,7 +27,7 @@
27
27
  <span class="omega-tile__ordinal">{{ forloop.index }}</span>
28
28
  {% endiftruthy %}
29
29
  {% iftruthy item.icon %}
30
- <span class="omega-icon-chip"><i class="fa-solid fa-{{ item.icon }} fa-sm"></i></span>
30
+ <span class="omega-icon-chip"><i class="{{ item.icon }} fa-sm" aria-hidden="true"></i></span>
31
31
  {% endiftruthy %}
32
32
  <span class="omega-tile__title">{{ item.title }}</span>
33
33
  </div>
@@ -23,32 +23,32 @@
23
23
  {
24
24
  type: 'code',
25
25
  span: 'big',
26
- icon: 'sliders',
26
+ icon: 'fa-solid fa-sliders',
27
27
  title: 'One config, every surface',
28
28
  description: 'A single file drives your brand, targets, and integrations. Change it once and every page follows.',
29
29
  },
30
30
  {
31
31
  type: 'split',
32
32
  span: 'tall',
33
- icon: 'circle-half-stroke',
33
+ icon: 'fa-solid fa-circle-half-stroke',
34
34
  title: 'Light & dark, born together',
35
35
  description: 'Every component ships in both modes from day one, with no bolted-on dark theme.',
36
36
  },
37
37
  {
38
38
  type: 'terminal',
39
- icon: 'terminal',
39
+ icon: 'fa-solid fa-terminal',
40
40
  title: 'Deploy in one verb',
41
41
  description: 'Build, verify, and publish from a single command.',
42
42
  },
43
43
  {
44
44
  type: 'brand',
45
- icon: 'palette',
45
+ icon: 'fa-solid fa-palette',
46
46
  title: 'Your brand, everywhere',
47
47
  description: 'One brand color recolors every accent surface: buttons, links, focus rings, charts.',
48
48
  },
49
49
  {
50
50
  type: 'default',
51
- icon: 'shield-halved',
51
+ icon: 'fa-solid fa-shield-halved',
52
52
  title: 'Auth & accounts built in',
53
53
  description: 'Sign-in, subscriptions, and billing flows ready on day one.',
54
54
  },
@@ -85,19 +85,19 @@
85
85
  subheadline: 'Each tile is the link: the whole card clicks through.',
86
86
  items: [
87
87
  {
88
- icon: 'tag',
88
+ icon: 'fa-solid fa-tag',
89
89
  title: 'What it costs',
90
90
  description: 'Every plan, and what each one includes.',
91
91
  href: '/pricing',
92
92
  },
93
93
  {
94
- icon: 'users',
94
+ icon: 'fa-solid fa-users',
95
95
  title: 'Who we are',
96
96
  description: 'The people behind the product.',
97
97
  href: '/about',
98
98
  },
99
99
  {
100
- icon: 'envelope',
100
+ icon: 'fa-solid fa-envelope',
101
101
  title: 'Talk to us',
102
102
  description: 'Questions, demos, and anything else.',
103
103
  href: '/contact',
@@ -112,10 +112,10 @@
112
112
  headline: 'Four steps, start to live',
113
113
  numbered: true,
114
114
  items: [
115
- { icon: 'comments', title: 'Discover', description: 'We listen before we draw anything.' },
116
- { icon: 'pen-ruler', title: 'Design', description: 'The shape of the thing, agreed up front.' },
117
- { icon: 'hammer', title: 'Build', description: 'Shipped in weekly slices you can see.' },
118
- { icon: 'rocket', title: 'Launch', description: 'Live, measured, and handed over.' },
115
+ { icon: 'fa-solid fa-comments', title: 'Discover', description: 'We listen before we draw anything.' },
116
+ { icon: 'fa-solid fa-pen-ruler', title: 'Design', description: 'The shape of the thing, agreed up front.' },
117
+ { icon: 'fa-solid fa-hammer', title: 'Build', description: 'Shipped in weekly slices you can see.' },
118
+ { icon: 'fa-solid fa-rocket', title: 'Launch', description: 'Live, measured, and handed over.' },
119
119
  ],
120
120
  },
121
121
  },
@@ -129,19 +129,19 @@
129
129
  items: [
130
130
  {
131
131
  type: 'terminal',
132
- icon: 'terminal',
132
+ icon: 'fa-solid fa-terminal',
133
133
  title: 'One-verb deploys',
134
134
  description: 'Build, verify, and publish from a single command.',
135
135
  },
136
136
  {
137
137
  type: 'default',
138
- icon: 'bolt',
138
+ icon: 'fa-solid fa-bolt',
139
139
  title: 'Fast by default',
140
140
  description: 'Static output, tuned assets, nothing to babysit.',
141
141
  },
142
142
  {
143
143
  type: 'default',
144
- icon: 'lock',
144
+ icon: 'fa-solid fa-lock',
145
145
  title: 'Secure sessions',
146
146
  description: 'Auth and account flows ready on day one.',
147
147
  },
@@ -31,7 +31,7 @@
31
31
  headline: 'Ready to ship',
32
32
  headline_accent: 'something great?',
33
33
  subheadline: 'Start free and grow into every surface your product needs.',
34
- primary_button: { text: 'Start free', href: '/signup', icon: 'rocket' },
34
+ primary_button: { text: 'Start free', href: '/signup', icon: 'fa-solid fa-rocket' },
35
35
  command: 'npx acme setup',
36
36
  secondary_button: { text: 'Talk to sales', href: '/contact', nudge: true },
37
37
  },
@@ -25,7 +25,7 @@ centred product frame never stacks under one either. {% endcomment %}
25
25
  {% assign demo_btn_class = demo.options.button.class | default: "btn-adaptive" %}
26
26
  <button type="submit" class="btn {{ demo_btn_class }} btn-lg text-nowrap flex-shrink-0">
27
27
  {% iftruthy demo.options.button.icon %}
28
- <i class="fa-solid fa-{{ demo.options.button.icon }} me-2"></i>
28
+ <i class="{{ demo.options.button.icon }} me-2" aria-hidden="true"></i>
29
29
  {% endiftruthy %}
30
30
  {{ demo.options.button.text }}
31
31
  </button>
@@ -42,7 +42,7 @@ centred product frame never stacks under one either. {% endcomment %}
42
42
  <div class="col-12 {% if field_size == 'half' %}col-sm-6{% endif %}">
43
43
  <label for="hero-demo-{{ field.name }}" class="form-label d-flex align-items-center mb-2">
44
44
  {% iftruthy field.icon %}
45
- <i class="fa-solid fa-{{ field.icon }} me-2"></i>
45
+ <i class="{{ field.icon }} me-2" aria-hidden="true"></i>
46
46
  {% endiftruthy %}
47
47
  {{ field.label | default: field.placeholder | default: field.name }}
48
48
  {% iftruthy field.required %}<span class="text-danger ms-1" aria-hidden="true">*</span>{% endiftruthy %}
@@ -84,7 +84,7 @@ centred product frame never stacks under one either. {% endcomment %}
84
84
  <div class="col-12 {% unless demo.options.button.full_width %}col-sm-auto{% endunless %}">
85
85
  <button type="submit" class="btn {{ form_btn_class }} btn-lg w-100">
86
86
  {% iftruthy demo.options.button.icon %}
87
- <i class="fa-solid fa-{{ demo.options.button.icon }} me-2"></i>
87
+ <i class="{{ demo.options.button.icon }} me-2" aria-hidden="true"></i>
88
88
  {% endiftruthy %}
89
89
  {{ demo.options.button.text }}
90
90
  </button>
@@ -208,7 +208,7 @@ in place, unchanged. {% endcomment %}
208
208
  <div class="omega-hero__ctas" data-omega-reveal>
209
209
  {% if args.primary_button.enabled != false and args.primary_button.text %}
210
210
  <a href="{{ args.primary_button.href }}" class="btn {{ primary_btn_class }} btn-lg{% iffalsy args.primary_button.icon %} omega-hover-nudge{% endiffalsy %}">
211
- {% iftruthy args.primary_button.icon %}<i class="fa-solid fa-{{ args.primary_button.icon }} me-2"></i>{% endiftruthy %}
211
+ {% iftruthy args.primary_button.icon %}<i class="{{ args.primary_button.icon }} me-2" aria-hidden="true"></i>{% endiftruthy %}
212
212
  {{ args.primary_button.text }}
213
213
  {% iffalsy args.primary_button.icon %}<span class="omega-nudge ms-2"><i class="fa-solid fa-arrow-right fa-sm"></i></span>{% endiffalsy %}
214
214
  </a>
@@ -220,7 +220,7 @@ in place, unchanged. {% endcomment %}
220
220
  {% endiftruthy %}
221
221
  {% if args.secondary_button.enabled != false and args.secondary_button.text %}
222
222
  <a href="{{ args.secondary_button.href }}" class="btn {{ secondary_btn_class }} btn-lg{% iffalsy args.secondary_button.icon %} omega-hover-nudge{% endiffalsy %}">
223
- {% iftruthy args.secondary_button.icon %}<i class="fa-solid fa-{{ args.secondary_button.icon }} me-2"></i>{% endiftruthy %}
223
+ {% iftruthy args.secondary_button.icon %}<i class="{{ args.secondary_button.icon }} me-2" aria-hidden="true"></i>{% endiftruthy %}
224
224
  {{ args.secondary_button.text }}
225
225
  {% iffalsy args.secondary_button.icon %}<span class="omega-nudge ms-2"><i class="fa-solid fa-arrow-right fa-sm"></i></span>{% endiffalsy %}
226
226
  </a>
@@ -272,7 +272,7 @@ consumer authors. {% endcomment %}
272
272
  {% for card in args.cards %}
273
273
  <div class="omega-hero__card">
274
274
  {% iftruthy card.icon %}
275
- <span class="omega-hero__card-ico"><i class="fa-solid fa-{{ card.icon }}"></i></span>
275
+ <span class="omega-hero__card-ico"><i class="{{ card.icon }}" aria-hidden="true"></i></span>
276
276
  {% endiftruthy %}
277
277
  {%- comment %} A value is TEXT, never markup (#580). {% endcomment -%}
278
278
  <span class="omega-hero__card-num">{{ card.number | escape_once }}</span>
@@ -11,7 +11,7 @@
11
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
12
  rotating: 'array',
13
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
14
+ primary_button: 'object', // { text, href, enabled, icon?, class? } — an authored class replaces btn-adaptive; an authored icon (the full Font Awesome class string) leads the label INSTEAD of the arrow nudge
15
15
  command: 'string',
16
16
  command_href: 'string',
17
17
  secondary_button: 'object', // { text, href, enabled, icon?, class? } — same contract over btn-outline-adaptive
@@ -126,7 +126,7 @@
126
126
  subtext: 'No credit card required - 5 free logos',
127
127
  button: {
128
128
  text: 'Generate logo',
129
- icon: 'wand-magic-sparkles',
129
+ icon: 'fa-solid fa-wand-magic-sparkles',
130
130
  class: 'btn-adaptive-inverse',
131
131
  },
132
132
  },
@@ -135,13 +135,13 @@
135
135
  // btn-adaptive and an authored icon takes the arrow nudge's place.
136
136
  primary_button: {
137
137
  text: 'Get started free',
138
- icon: 'rocket',
138
+ icon: 'fa-solid fa-rocket',
139
139
  href: '/dashboard',
140
140
  class: 'btn-light',
141
141
  },
142
142
  secondary_button: {
143
143
  text: 'Explore solutions',
144
- icon: 'book-open',
144
+ icon: 'fa-solid fa-book-open',
145
145
  href: '/pricing',
146
146
  class: 'btn-outline-light',
147
147
  },
@@ -164,7 +164,7 @@
164
164
  {
165
165
  name: 'industry',
166
166
  label: 'Industry',
167
- icon: 'building',
167
+ icon: 'fa-solid fa-building',
168
168
  type: 'select',
169
169
  size: 'half',
170
170
  placeholder: 'Select industry',
@@ -178,7 +178,7 @@
178
178
  {
179
179
  name: 'company_size',
180
180
  label: 'Company size',
181
- icon: 'users',
181
+ icon: 'fa-solid fa-users',
182
182
  type: 'select',
183
183
  size: 'half',
184
184
  placeholder: 'Select size',
@@ -192,7 +192,7 @@
192
192
  {
193
193
  name: 'message',
194
194
  label: 'Tell us about your project',
195
- icon: 'comment',
195
+ icon: 'fa-solid fa-comment',
196
196
  type: 'textarea',
197
197
  size: 'full',
198
198
  placeholder: 'Describe your goals, challenges, or questions...',
@@ -202,7 +202,7 @@
202
202
  ],
203
203
  button: {
204
204
  text: 'Get quote',
205
- icon: 'paper-plane',
205
+ icon: 'fa-solid fa-paper-plane',
206
206
  full_width: true,
207
207
  class: 'btn-adaptive-inverse',
208
208
  },
@@ -325,8 +325,8 @@
325
325
  label: 'Stat cards',
326
326
  args: {
327
327
  cards: [
328
- { number: '99%', label: 'Uptime', icon: 'shield-halved' },
329
- { number: '500K+', label: 'Builds shipped', icon: 'rocket' },
328
+ { number: '99%', label: 'Uptime', icon: 'fa-solid fa-shield-halved' },
329
+ { number: '500K+', label: 'Builds shipped', icon: 'fa-solid fa-rocket' },
330
330
  { number: '30+', label: 'Integrations' },
331
331
  ],
332
332
  },
@@ -20,7 +20,7 @@
20
20
  aria-selected="{% if forloop.first %}true{% else %}false{% endif %}"
21
21
  >
22
22
  {% iftruthy tab.icon %}
23
- <i class="fa-solid fa-{{ tab.icon }} fa-sm me-2"></i>
23
+ <i class="{{ tab.icon }} fa-sm me-2" aria-hidden="true"></i>
24
24
  {% endiftruthy %}
25
25
  {{ tab.label }}
26
26
  </button>
@@ -24,14 +24,14 @@
24
24
  {
25
25
  id: 'dashboard',
26
26
  label: 'Dashboard',
27
- icon: 'gauge-high',
27
+ icon: 'fa-solid fa-gauge-high',
28
28
  video: 'https://cdn.itwcreativeworks.com/assets/sample/videos/demos/16x9/sample-demo-1.webm',
29
29
  features: ['Easy setup', 'Powerful tools', 'Real-time updates'],
30
30
  },
31
31
  {
32
32
  id: 'analytics',
33
33
  label: 'Analytics',
34
- icon: 'chart-line',
34
+ icon: 'fa-solid fa-chart-line',
35
35
  video: 'https://cdn.itwcreativeworks.com/assets/sample/videos/demos/16x9/sample-demo-2.webm',
36
36
  features: ['Advanced analytics', 'Custom reports', 'Data insights'],
37
37
  },
@@ -11,7 +11,7 @@
11
11
  {% capture stat_class %}omega-stat{% if tone_slots contains stat.color %} omega-{{ stat.color }}{% endif %}{% endcapture %}
12
12
  <div class="{{ stat_class }}" data-omega-reveal>
13
13
  {% iftruthy stat.icon %}
14
- <span class="omega-icon-chip omega-stat__icon"><i class="fa-solid fa-{{ stat.icon }} fa-sm"></i></span>
14
+ <span class="omega-icon-chip omega-stat__icon"><i class="{{ stat.icon }} fa-sm" aria-hidden="true"></i></span>
15
15
  {% endiftruthy %}
16
16
  {%- comment %} A value is TEXT, never markup (#580): a stat like
17
17
  `<200ms` opened a tag the minifier then ate, printing a visible
@@ -2,7 +2,7 @@
2
2
  description: 'Stats band — serif numbers with count-up on reveal. Callers with a bare frontmatter array pass it as the items named arg ({% section "marketing/stats", items: resolved.stats %}); empty items suppresses the band.',
3
3
 
4
4
  args: {
5
- items: 'array', // [{ number, label, sublabel, icon, color }] — icon names a Font Awesome glyph; color names a tone slot (tone-1…tone-6), never a hex
5
+ items: 'array', // [{ number, label, sublabel, icon, color }] — icon is the full Font Awesome class string ('fa-brands fa-figma'); color names a tone slot (tone-1…tone-6), never a hex
6
6
 
7
7
  after: 'html', // finished markup rendered inside the band container after the grid ({% slot after %}) — e.g. a trailing CTA button
8
8
  },
@@ -23,10 +23,10 @@
23
23
  label: 'Icons and tones',
24
24
  args: {
25
25
  items: [
26
- { number: '2017', label: 'Founded', sublabel: 'Still shipping', icon: 'calendar', color: 'tone-1' },
27
- { number: '50+', label: 'Team members', sublabel: 'Across 9 time zones', icon: 'users', color: 'tone-2' },
28
- { number: '1M+', label: 'Happy customers', sublabel: 'And counting', icon: 'smile', color: 'tone-3' },
29
- { number: '120+', label: 'Countries', sublabel: 'Served from the edge', icon: 'globe', color: 'tone-4' },
26
+ { number: '2017', label: 'Founded', sublabel: 'Still shipping', icon: 'fa-solid fa-calendar', color: 'tone-1' },
27
+ { number: '50+', label: 'Team members', sublabel: 'Across 9 time zones', icon: 'fa-solid fa-users', color: 'tone-2' },
28
+ { number: '1M+', label: 'Happy customers', sublabel: 'And counting', icon: 'fa-solid fa-smile', color: 'tone-3' },
29
+ { number: '120+', label: 'Countries', sublabel: 'Served from the edge', icon: 'fa-solid fa-globe', color: 'tone-4' },
30
30
  ],
31
31
  },
32
32
  },
@@ -15,7 +15,7 @@
15
15
  </span>
16
16
  {% elsif logo.icon %}
17
17
  <span class="omega-logos__lockup">
18
- <i class="fa-solid fa-{{ logo.icon }}"></i>
18
+ <i class="{{ logo.icon }}" aria-hidden="true"></i>
19
19
  <span>{{ logo.name }}</span>
20
20
  </span>
21
21
  {% else %}
@@ -1,5 +1,5 @@
1
1
  {
2
- description: 'Logo marquee — the "trusted by" wall. Per logo: `logo` = combomark slug (core/logos, the REAL wordmark lockups); `icon` = FA brands slug (mark + name lockup); `src` = custom image; name-only falls back to the typographic word. Empty logos suppresses the band.',
2
+ description: 'Logo marquee — the "trusted by" wall. Per logo: `logo` = combomark slug (core/logos, the REAL wordmark lockups); `icon` = the full Font Awesome class string (mark + name lockup), e.g. `fa-brands fa-github`; `src` = custom image; name-only falls back to the typographic word. Empty logos suppresses the band.',
3
3
 
4
4
  args: {
5
5
  headline: 'string',
@@ -29,7 +29,7 @@
29
29
  headline: 'Backed by',
30
30
  logos: [
31
31
  { name: 'Google', logo: 'google' },
32
- { name: 'GitHub', icon: 'github' },
32
+ { name: 'GitHub', icon: 'fa-brands fa-github' },
33
33
  { name: 'Initech' },
34
34
  ],
35
35
  },
@@ -10,11 +10,11 @@ hero:
10
10
  description: "AI automation for modern businesses made simple"
11
11
  primary_button:
12
12
  text: "Get started free"
13
- icon: "rocket"
13
+ icon: "fa-solid fa-rocket"
14
14
  href: "/dashboard"
15
15
  secondary_button:
16
16
  text: "See pricing"
17
- icon: "book-open"
17
+ icon: "fa-solid fa-book-open"
18
18
  href: "/pricing"
19
19
 
20
20
  # Trusted By Section (base marketing/trusted-by, restyled)
@@ -61,18 +61,18 @@ highlights:
61
61
  subheadline: "Get unlimited design requests delivered fast with our streamlined process."
62
62
  cta_button:
63
63
  text: "Get started"
64
- icon: "rocket"
64
+ icon: "fa-solid fa-rocket"
65
65
  href: "/dashboard"
66
66
  items:
67
67
  - title: "Subscribe"
68
68
  description: "Choose your plan and submit unlimited design requests."
69
- icon: "rotate"
69
+ icon: "fa-solid fa-rotate"
70
70
  - title: "Receive"
71
71
  description: "Get your designs delivered in as fast as two business days."
72
- icon: "bolt"
72
+ icon: "fa-solid fa-bolt"
73
73
  - title: "Revise"
74
74
  description: "Request unlimited revisions until it's perfect."
75
- icon: "thumbs-up"
75
+ icon: "fa-solid fa-thumbs-up"
76
76
 
77
77
  # Testimonials Section
78
78
  testimonials:
@@ -163,10 +163,10 @@ config:
163
163
  <div class="col-lg-5">
164
164
  <div class="d-grid gap-3 neo-hero__actions">
165
165
  <a href="{{ resolved.hero.primary_button.href }}" class="btn btn-dark btn-lg">
166
- <i class="fa-solid fa-{{ resolved.hero.primary_button.icon }} me-2"></i>{{ resolved.hero.primary_button.text }}
166
+ <i class="{{ resolved.hero.primary_button.icon }} me-2" aria-hidden="true"></i>{{ resolved.hero.primary_button.text }}
167
167
  </a>
168
168
  <a href="{{ resolved.hero.secondary_button.href }}" class="btn btn-light btn-lg">
169
- <i class="fa-solid fa-{{ resolved.hero.secondary_button.icon }} me-2"></i>{{ resolved.hero.secondary_button.text }}
169
+ <i class="{{ resolved.hero.secondary_button.icon }} me-2" aria-hidden="true"></i>{{ resolved.hero.secondary_button.text }}
170
170
  </a>
171
171
  </div>
172
172
  </div>
@@ -240,7 +240,7 @@ config:
240
240
  <div class="card-body">
241
241
  <div class="neo-step-card__top">
242
242
  <span class="neo-step-card__num">{{ forloop.index }}</span>
243
- <span class="neo-step-card__icon"><i class="fa-solid fa-{{ feature.icon }}"></i></span>
243
+ <span class="neo-step-card__icon"><i class="{{ feature.icon }}" aria-hidden="true"></i></span>
244
244
  </div>
245
245
  <h3 class="neo-step-card__title">{{ feature.title }}</h3>
246
246
  <p class="neo-step-card__desc">{{ feature.description }}</p>
@@ -253,7 +253,7 @@ config:
253
253
  {% iftruthy resolved.highlights.cta_button %}
254
254
  <div class="text-center mt-5">
255
255
  <a href="{{ resolved.highlights.cta_button.href }}" class="btn btn-warning btn-lg">
256
- <i class="fa-solid fa-{{ resolved.highlights.cta_button.icon }} me-2"></i>{{ resolved.highlights.cta_button.text }}
256
+ <i class="{{ resolved.highlights.cta_button.icon }} me-2" aria-hidden="true"></i>{{ resolved.highlights.cta_button.text }}
257
257
  </a>
258
258
  </div>
259
259
  {% endiftruthy %}
@@ -9,11 +9,11 @@ hero:
9
9
  description: "Sharp reporting and zero noise: the stories that matter, delivered before your coffee gets cold."
10
10
  primary_button:
11
11
  text: "Read the latest"
12
- icon: "bolt"
12
+ icon: "fa-solid fa-bolt"
13
13
  href: "/blog"
14
14
  secondary_button:
15
15
  text: "Get the newsletter"
16
- icon: "envelope"
16
+ icon: "fa-solid fa-envelope"
17
17
  href: "#signup"
18
18
 
19
19
  # The Latest — the front-page feed (posts-driven; newsflash-specific section)
@@ -63,20 +63,20 @@ desks:
63
63
  subheadline: "Three desks, one standard: report it right, write it sharp."
64
64
  cta_button:
65
65
  text: "Browse all stories"
66
- icon: "arrow-right"
66
+ icon: "fa-solid fa-arrow-right"
67
67
  href: "/blog"
68
68
  items:
69
69
  - title: "Tech"
70
70
  description: "The machines, the makers, and the money rewiring how we live and work."
71
- icon: "microchip"
71
+ icon: "fa-solid fa-microchip"
72
72
  href: "/blog/categories/tech"
73
73
  - title: "Culture"
74
74
  description: "What we watch, wear, and argue about, and why it matters more than you think."
75
- icon: "masks-theater"
75
+ icon: "fa-solid fa-masks-theater"
76
76
  href: "/blog/categories/culture"
77
77
  - title: "Money"
78
78
  description: "Markets, paychecks, and the economics hiding inside everyday decisions."
79
- icon: "chart-line"
79
+ icon: "fa-solid fa-chart-line"
80
80
  href: "/blog/categories/money"
81
81
 
82
82
  # Stats Section — the masthead numbers
@@ -103,11 +103,11 @@ cta:
103
103
  subheadline: "Join the readers who start their day with {{ resolved.config.brand.name }}: reporting with teeth, context with heart, and zero filler."
104
104
  primary_button:
105
105
  text: "Start reading"
106
- icon: "bolt"
106
+ icon: "fa-solid fa-bolt"
107
107
  href: "/blog"
108
108
  secondary_button:
109
109
  text: "Get the newsletter"
110
- icon: "envelope"
110
+ icon: "fa-solid fa-envelope"
111
111
  href: "#signup"
112
112
  ---
113
113
 
@@ -156,12 +156,12 @@ cta:
156
156
  <div class="d-flex flex-wrap gap-3">
157
157
  {% iftruthy resolved.hero.primary_button %}
158
158
  <a href="{{ resolved.hero.primary_button.href }}" class="btn btn-primary btn-lg">
159
- <i class="fa-solid fa-{{ resolved.hero.primary_button.icon }} me-2"></i>{{ resolved.hero.primary_button.text }}
159
+ <i class="{{ resolved.hero.primary_button.icon }} me-2" aria-hidden="true"></i>{{ resolved.hero.primary_button.text }}
160
160
  </a>
161
161
  {% endiftruthy %}
162
162
  {% iftruthy resolved.hero.secondary_button %}
163
163
  <a href="{{ resolved.hero.secondary_button.href }}" class="btn btn-outline-dark btn-lg">
164
- <i class="fa-solid fa-{{ resolved.hero.secondary_button.icon }} me-2"></i>{{ resolved.hero.secondary_button.text }}
164
+ <i class="{{ resolved.hero.secondary_button.icon }} me-2" aria-hidden="true"></i>{{ resolved.hero.secondary_button.text }}
165
165
  </a>
166
166
  {% endiftruthy %}
167
167
  </div>
@@ -18,7 +18,7 @@
18
18
  <div class="col-md-4" data-lazy="@class animation-slide-up">
19
19
  <a href="{{ desk_href }}" class="card newsflash-story-card h-100 p-4 text-decoration-none">
20
20
  <span class="newsflash-desks__icon d-inline-flex align-items-center justify-content-center rounded-circle text-bg-primary mb-3">
21
- <i class="fa-solid fa-{{ desk.icon }}"></i>
21
+ <i class="{{ desk.icon }}" aria-hidden="true"></i>
22
22
  </span>
23
23
  <h3 class="h4 mb-2">{{ desk.title }}</h3>
24
24
  <p class="text-body-secondary mb-0">{{ desk.description }}</p>
@@ -31,7 +31,7 @@
31
31
  {% iftruthy args.cta_button %}
32
32
  <div class="text-center mt-5" data-lazy="@class animation-slide-up">
33
33
  <a href="{{ args.cta_button.href }}" class="btn btn-primary btn-lg">
34
- <i class="fa-solid fa-{{ args.cta_button.icon }} me-2"></i>{{ args.cta_button.text }}
34
+ <i class="{{ args.cta_button.icon }} me-2" aria-hidden="true"></i>{{ args.cta_button.text }}
35
35
  </a>
36
36
  </div>
37
37
  {% endiftruthy %}
@@ -24,25 +24,25 @@
24
24
  subheadline: 'Three beats, one standard.',
25
25
  items: [
26
26
  {
27
- icon: 'microchip',
27
+ icon: 'fa-solid fa-microchip',
28
28
  title: 'Technology',
29
29
  description: 'Chips, code, and the people shipping both.',
30
30
  href: '/blog',
31
31
  },
32
32
  {
33
- icon: 'chart-line',
33
+ icon: 'fa-solid fa-chart-line',
34
34
  title: 'Markets',
35
35
  description: 'What moved, why it moved, who moved it.',
36
36
  href: '/blog',
37
37
  },
38
38
  {
39
- icon: 'landmark',
39
+ icon: 'fa-solid fa-landmark',
40
40
  title: 'Policy',
41
41
  description: 'The rules being written while you read this.',
42
42
  href: '/blog',
43
43
  },
44
44
  ],
45
- cta_button: { icon: 'rss', text: 'Browse all coverage', href: '/blog' },
45
+ cta_button: { icon: 'fa-solid fa-rss', text: 'Browse all coverage', href: '/blog' },
46
46
  },
47
47
  },
48
48
  ],