@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
package/README.md CHANGED
@@ -82,7 +82,7 @@ Five logs in `<projectRoot>/logs/`, each with its own purpose:
82
82
  | `dev.log` | Gulp pipeline output — sass, bundle, html, electron child stdout from `npm start` | Truncated each `npm start` |
83
83
  | `build.log` | Gulp pipeline output for production builds/packages (`npm run build` / `package` / `publish`, i.e. `OMEGA_BUILD_MODE=true`) | Truncated each build |
84
84
  | `test.log` | `npx omega test` runner output (suite names, pass/fail, harness boot lines) | Truncated each test run |
85
- | `ci.log` | `npm run release` — streamed GH Actions output during a CI release | Truncated each release |
85
+ | `deploy.log` | `omega deploy` and `npm run release`, the whole deploy: the scaffold, the precheck, the dispatch, then the streamed GH Actions run | Truncated each deploy |
86
86
 
87
87
  ```bash
88
88
  npx omega logs # tail last 50 of runtime.log
@@ -10,7 +10,7 @@
10
10
  //
11
11
  // The accent family is a BUILD-TIME override surface: when `brand.color`
12
12
  // is set, head.html emits inline `:root` ramps from composeBrandTokens
13
- // (src/brand-tokens.js) — a light ramp AND a dark-variant ramp stamped with
13
+ // (@omega.js/devkit/brand-tokens): a light ramp AND a dark-variant ramp stamped with
14
14
  // this same plumbing — that win the cascade over these placeholders.
15
15
  //
16
16
  // Theme attribute: `data-bs-theme` is what core/js/core/appearance.js
@@ -2,10 +2,13 @@
2
2
  Account section header — the admin page-header anatomy (icon chip + page
3
3
  title + hairline) stamped INSIDE each hash-driven section, so the visible
4
4
  page title tracks the active section with zero JS. Params: title, icon.
5
+
6
+ `icon` carries its OWN Font Awesome classes (#619, #850, #903):
7
+ `icon="fa-brands fa-github"`, emitted verbatim with only the size added.
5
8
  {% endcomment %}
6
9
  <header class="page-header pb-3 mb-4 hairline-bottom">
7
10
  <h2 class="page-title mb-0 d-flex align-items-center">
8
- <span class="omega-icon-chip omega-icon-chip--neutral me-2"><i class="fa-solid fa-{{ include.icon }} fa-sm"></i></span>
11
+ <span class="omega-icon-chip omega-icon-chip--neutral me-2"><i class="{{ include.icon }} fa-sm" aria-hidden="true"></i></span>
9
12
  {{ include.title }}
10
13
  </h2>
11
14
  </header>
@@ -46,7 +46,11 @@
46
46
  {% capture social_href %}{% omega_social platform %}{% endcapture %}
47
47
  {% iftruthy social_href %}
48
48
  <a href="{{ social_href }}" class="omega-footer__social-link" aria-label="{{ platform | capitalize }}">
49
- <i class="fa-solid fa-{{ platform }} fa-sm"></i>
49
+ {% comment %} The key names a PLATFORM, not an icon (#929): a social
50
+ profile is always a brand mark, so the family is derived at the one
51
+ site that knows it, never typed by a brand that only named the
52
+ platform. {% endcomment %}
53
+ <i class="fa-brands fa-{{ platform }} fa-sm" aria-hidden="true"></i>
50
54
  </a>
51
55
  {% endiftruthy %}
52
56
  {% endfor %}
@@ -71,7 +75,9 @@
71
75
  {% for link in link_group.links %}
72
76
  {% capture link_classes %}omega-footer__link{% if link.classes %} {{ link.classes | join: ' ' }}{% endif %}{% endcapture %}
73
77
  {% capture link_attributes %}{% if link.attributes %}{% for attr in link.attributes %} {{ attr[0] }}="{{ attr[1] }}"{% endfor %}{% endif %}{% endcapture %}
74
- {% capture link_icon %}{% if link.icon %}{{ resolved.config.icons[link.icon] }}{% endif %}{% endcapture %}
78
+ {% comment %} A link carries its OWN Font Awesome classes (#619, #850): `icon: 'fa-brands fa-github'`.
79
+ The name-to-markup `icons` map this used to look the name up in is a retired config key. {% endcomment %}
80
+ {% capture link_icon %}{% if link.icon %}<i class="{{ link.icon }}" aria-hidden="true"></i>{% endif %}{% endcapture %}
75
81
  {% capture link_href %}{% if link.href and link.href != '' and link.href != 'null' %}{{ link.href }}{% else %}javascript:void(0){% endif %}{% endcapture %}
76
82
  <li>
77
83
  <a class="{{ link_classes }}" href="{{ link_href }}"{{ link_attributes }}>
@@ -94,10 +100,11 @@
94
100
  {% if data.copyright.text %}
95
101
  {{ data.copyright.text | omega_liquify }}
96
102
  {% else %}
97
- {% comment %} A sub-brand credits its parent (brand.company), linked
98
- when company.url names one — no parent configured (or a company that
99
- IS the brand) keeps the plain line {% endcomment %}
100
- {% assign parent_company = resolved.config.brand.company %}
103
+ {% comment %} A sub-brand credits its parent, linked when the
104
+ resolved company.url names one (#677). A standalone brand resolves
105
+ its company to ITSELF, so the name check below keeps the plain line
106
+ with no fallback of its own {% endcomment %}
107
+ {% assign parent_company = resolved.config.company.name %}
101
108
  {% if parent_company and parent_company != '' and parent_company != 'null' and parent_company != resolved.config.brand.name %}
102
109
  {% if resolved.config.company.url %}
103
110
  {% capture parent_mark %}<a href="{{ resolved.config.company.url }}">{{ parent_company }}</a>{% endcapture %}
@@ -1,4 +1,6 @@
1
1
  {% comment %} Section data: json-in-_includes (a consumer src/_includes/frontend/sections/nav.json overrides the packaged one) — same binding pattern as admin/sections/sidebar {% endcomment %}
2
+ {% comment %} A link's `icon` carries its OWN Font Awesome classes (#619, #850, #903): `icon: 'fa-brands fa-github'`.
3
+ Every icon site below emits that string verbatim and adds only its size and spacing. {% endcomment %}
2
4
  {% assign data = site.data._includes.frontend.sections.nav %}
3
5
 
4
6
  <!-- Shared base marketing nav: transparent over the hero, glassy after scroll.
@@ -60,7 +62,7 @@
60
62
  <button class="{{ link_class }}" type="button" data-bs-toggle="dropdown" {{ link_attributes }}>
61
63
  <span class="d-inline-flex align-items-center">
62
64
  {% if link.icon %}
63
- <i class="fa-solid fa-{{ link.icon }} fa-sm me-2"></i>
65
+ <i class="{{ link.icon }} fa-sm me-2" aria-hidden="true"></i>
64
66
  {% endif %}
65
67
  <span>{{ link.label }}</span>
66
68
  </span>
@@ -73,7 +75,7 @@
73
75
  {% capture child_content %}
74
76
  <span class="d-inline-flex align-items-center">
75
77
  {% if child.icon %}
76
- <i class="fa-solid fa-{{ child.icon }} fa-sm me-2"></i>
78
+ <i class="{{ child.icon }} fa-sm me-2" aria-hidden="true"></i>
77
79
  {% endif %}
78
80
  <span>{{ child.label }}</span>
79
81
  </span>
@@ -105,7 +107,7 @@
105
107
  {% capture link_content %}
106
108
  <span class="d-inline-flex align-items-center">
107
109
  {% if link.icon %}
108
- <i class="fa-solid fa-{{ link.icon }} fa-sm me-2"></i>
110
+ <i class="{{ link.icon }} fa-sm me-2" aria-hidden="true"></i>
109
111
  {% endif %}
110
112
  <span>{{ link.label }}</span>
111
113
  </span>
@@ -140,7 +142,7 @@
140
142
  <button class="{{ action_class }}" type="button" data-bs-toggle="dropdown" {{ action_attributes }}>
141
143
  <span class="d-inline-flex align-items-center">
142
144
  {% if action.icon %}
143
- <i class="fa-solid fa-{{ action.icon }} fa-sm me-2"></i>
145
+ <i class="{{ action.icon }} fa-sm me-2" aria-hidden="true"></i>
144
146
  {% endif %}
145
147
  <span>{{ action.label }}</span>
146
148
  </span>
@@ -153,7 +155,7 @@
153
155
  {% capture child_content %}
154
156
  <span class="d-inline-flex align-items-center">
155
157
  {% if child.icon %}
156
- <i class="fa-solid fa-{{ child.icon }} fa-sm me-2"></i>
158
+ <i class="{{ child.icon }} fa-sm me-2" aria-hidden="true"></i>
157
159
  {% endif %}
158
160
  <span>{{ child.label }}</span>
159
161
  </span>
@@ -184,7 +186,7 @@
184
186
  {% capture action_content %}
185
187
  <span class="d-inline-flex align-items-center">
186
188
  {% if action.icon %}
187
- <i class="fa-solid fa-{{ action.icon }} fa-sm me-2"></i>
189
+ <i class="{{ action.icon }} fa-sm me-2" aria-hidden="true"></i>
188
190
  {% endif %}
189
191
  <span>{{ action.label }}</span>
190
192
  </span>
@@ -212,7 +214,7 @@
212
214
  {% capture action_content %}
213
215
  <span class="d-inline-flex align-items-center">
214
216
  {% if action.icon %}
215
- <i class="fa-solid fa-{{ action.icon }} fa-sm me-2"></i>
217
+ <i class="{{ action.icon }} fa-sm me-2" aria-hidden="true"></i>
216
218
  {% endif %}
217
219
  <span>{{ action.label }}</span>
218
220
  </span>
@@ -230,7 +232,7 @@
230
232
  {% capture child_content %}
231
233
  <span class="d-inline-flex align-items-center">
232
234
  {% if child.icon %}
233
- <i class="fa-solid fa-{{ child.icon }} fa-sm me-2"></i>
235
+ <i class="{{ child.icon }} fa-sm me-2" aria-hidden="true"></i>
234
236
  {% endif %}
235
237
  <span>{{ child.label }}</span>
236
238
  </span>
@@ -1,4 +1,6 @@
1
1
  <!-- Account Dropdown (shared across frontend nav, backend topbar, admin topbar) -->
2
+ {% comment %} A dropdown item's `icon` carries its OWN Font Awesome classes (#619, #850, #903):
3
+ `icon: 'fa-brands fa-github'`, emitted verbatim with only the size and spacing added. {% endcomment %}
2
4
  {% assign account_data = site.data._includes.global.sections.account %}
3
5
  {% assign avatar_size = include.size | default: "md" %}
4
6
 
@@ -46,7 +48,7 @@
46
48
  {% capture child_class %}dropdown-item d-flex align-items-center text-body {{ child_active }} {% if child.class %}{{ child.class }}{% endif %}{% endcapture %}
47
49
  {% capture child_content %}
48
50
  {% if child.icon %}
49
- <i class="fa-solid fa-{{ child.icon }} fa-md me-3"></i>
51
+ <i class="{{ child.icon }} fa-md me-3" aria-hidden="true"></i>
50
52
  {% endif %}
51
53
  <span>{{ child.label }}</span>
52
54
  {% endcapture %}
@@ -12,6 +12,10 @@
12
12
  | { label, icon, dropdown: [ …links, nested dropdowns… ] }]
13
13
  bottom: { vert: { enabled } } (optional)
14
14
 
15
+ An `icon` carries its OWN Font Awesome classes (#619, #850, #903):
16
+ `icon: 'fa-brands fa-github'`. Every icon site below emits that string
17
+ verbatim and adds only its size.
18
+
15
19
  Anything textual wears .omega-shell__label so the rail collapse hides it
16
20
  (core/css/shell). Active detection via urlmatches, including nested groups.
17
21
 
@@ -62,7 +66,7 @@
62
66
  {% else %}
63
67
  <li>
64
68
  <a class="dropdown-item" href="{{ item.href | default: '#' }}">
65
- {% if item.icon %}<i class="fa-solid fa-{{ item.icon }} fa-sm me-2"></i>{% endif %}
69
+ {% if item.icon %}<i class="{{ item.icon }} fa-sm me-2" aria-hidden="true"></i>{% endif %}
66
70
  {{ item.label | omega_liquify }}
67
71
  </a>
68
72
  </li>
@@ -104,7 +108,7 @@
104
108
  <li>
105
109
  <button class="omega-side__item {% if dropdown_has_active %}active{% endif %}" type="button" data-bs-toggle="collapse" data-bs-target="#{{ link_id }}" aria-expanded="{{ dropdown_has_active }}">
106
110
  {% if link.icon %}
107
- <span class="omega-side__icon"><i class="fa-solid fa-{{ link.icon }} fa-sm"></i></span>
111
+ <span class="omega-side__icon"><i class="{{ link.icon }} fa-sm" aria-hidden="true"></i></span>
108
112
  {% endif %}
109
113
  <span class="omega-shell__label">{{ link.label }}</span>
110
114
  <span class="omega-side__chevron"><i class="fa-solid fa-chevron-right fa-xs"></i></span>
@@ -127,7 +131,7 @@
127
131
  <li>
128
132
  <button class="omega-side__item {% if nested_has_active %}active{% endif %}" type="button" data-bs-toggle="collapse" data-bs-target="#{{ nested_id }}" aria-expanded="{{ nested_has_active }}">
129
133
  {% if child.icon %}
130
- <span class="omega-side__icon"><i class="fa-solid fa-{{ child.icon }} fa-sm"></i></span>
134
+ <span class="omega-side__icon"><i class="{{ child.icon }} fa-sm" aria-hidden="true"></i></span>
131
135
  {% endif %}
132
136
  <span class="omega-shell__label">{{ child.label }}</span>
133
137
  <span class="omega-side__chevron"><i class="fa-solid fa-chevron-right fa-xs"></i></span>
@@ -142,7 +146,7 @@
142
146
  <li>
143
147
  <a href="{{ grandchild.href }}" class="omega-side__item {{ grandchild_active }}">
144
148
  {% if grandchild.icon %}
145
- <span class="omega-side__icon"><i class="fa-solid fa-{{ grandchild.icon }} fa-sm"></i></span>
149
+ <span class="omega-side__icon"><i class="{{ grandchild.icon }} fa-sm" aria-hidden="true"></i></span>
146
150
  {% endif %}
147
151
  <span class="omega-shell__label">{{ grandchild.label }}</span>
148
152
  </a>
@@ -159,7 +163,7 @@
159
163
  {% iftruthy child.href %}
160
164
  <a href="{{ child.href }}" class="omega-side__item {{ child_active }}" {{ child_attributes }}>
161
165
  {% if child.icon %}
162
- <span class="omega-side__icon"><i class="fa-solid fa-{{ child.icon }} fa-sm"></i></span>
166
+ <span class="omega-side__icon"><i class="{{ child.icon }} fa-sm" aria-hidden="true"></i></span>
163
167
  {% endif %}
164
168
  <span class="omega-shell__label">{{ child.label }}</span>
165
169
  {% if child.badge %}
@@ -170,7 +174,7 @@
170
174
  {% iffalsy child.href %}
171
175
  <button type="button" class="omega-side__item {% if child.class %}{{ child.class }}{% endif %}" {{ child_attributes }}>
172
176
  {% if child.icon %}
173
- <span class="omega-side__icon"><i class="fa-solid fa-{{ child.icon }} fa-sm"></i></span>
177
+ <span class="omega-side__icon"><i class="{{ child.icon }} fa-sm" aria-hidden="true"></i></span>
174
178
  {% endif %}
175
179
  <span class="omega-shell__label">{{ child.label }}</span>
176
180
  </button>
@@ -189,7 +193,7 @@
189
193
  {% iftruthy link.href %}
190
194
  <a href="{{ link.href }}" class="omega-side__item {{ link_active }}" {{ link_attributes }}>
191
195
  {% if link.icon %}
192
- <span class="omega-side__icon"><i class="fa-solid fa-{{ link.icon }} fa-sm"></i></span>
196
+ <span class="omega-side__icon"><i class="{{ link.icon }} fa-sm" aria-hidden="true"></i></span>
193
197
  {% endif %}
194
198
  <span class="omega-shell__label">{{ link.label }}</span>
195
199
  {% if link.badge %}
@@ -200,7 +204,7 @@
200
204
  {% iffalsy link.href %}
201
205
  <button type="button" class="omega-side__item" {{ link_attributes }}>
202
206
  {% if link.icon %}
203
- <span class="omega-side__icon"><i class="fa-solid fa-{{ link.icon }} fa-sm"></i></span>
207
+ <span class="omega-side__icon"><i class="{{ link.icon }} fa-sm" aria-hidden="true"></i></span>
204
208
  {% endif %}
205
209
  <span class="omega-shell__label">{{ link.label }}</span>
206
210
  </button>
@@ -8,6 +8,10 @@
8
8
  actions: [{ type: 'account' } | { type: 'notifications', icon, badge, dropdown }
9
9
  | { label, href, icon, class, size, dropdown }]
10
10
 
11
+ An `icon` carries its OWN Font Awesome classes (#619, #850, #903):
12
+ `icon: 'fa-brands fa-github'`. Every icon site below emits that string
13
+ verbatim and adds only its size and spacing.
14
+
11
15
  action.size is 'sm' | 'lg' (Bootstrap's button sizes) — anything else
12
16
  renders no size class. NEVER test it for truthiness: Liquid answers `.size`
13
17
  on a hash with its KEY COUNT, so every action would "have" a size (#43).
@@ -84,9 +88,9 @@
84
88
  <!-- Notifications Dropdown -->
85
89
  {% capture action_attributes %}{% if action.attributes %}{% for attr in action.attributes %} {{ attr[0] }}="{{ attr[1] }}"{% endfor %}{% endif %}{% endcapture %}
86
90
  <div class="dropdown">
87
- {% capture notif_icon %}{{ action.icon | default: "bell" }}{% endcapture %}
91
+ {% capture notif_icon %}{{ action.icon | default: "fa-solid fa-bell" }}{% endcapture %}
88
92
  <button class="btn-icon position-relative" type="button" data-bs-toggle="dropdown" {{ action_attributes }} aria-expanded="false" aria-label="{{ action.label | default: 'Notifications' }}">
89
- <i class="fa-solid fa-{{ notif_icon }} fa-sm"></i>
93
+ <i class="{{ notif_icon }} fa-sm" aria-hidden="true"></i>
90
94
  {% if action.badge %}
91
95
  <span class="position-absolute top-0 start-100 translate-middle badge rounded-pill {{ action.badge.class | default: 'bg-danger' }}">
92
96
  {{ action.badge.text }}
@@ -116,7 +120,7 @@
116
120
  <div class="d-flex">
117
121
  {% if notification.icon %}
118
122
  <span class="omega-icon-chip omega-icon-chip--neutral me-3 flex-shrink-0">
119
- <i class="fa-solid fa-{{ notification.icon }} fa-sm"></i>
123
+ <i class="{{ notification.icon }} fa-sm" aria-hidden="true"></i>
120
124
  </span>
121
125
  {% endif %}
122
126
  <div class="flex-fill">
@@ -165,7 +169,7 @@
165
169
  <div class="dropdown">
166
170
  <button class="{{ action_class }} dropdown-toggle" type="button" data-bs-toggle="dropdown" {{ action_attributes }}>
167
171
  {% if action.icon %}
168
- <i class="fa-solid fa-{{ action.icon }} fa-sm me-2"></i>
172
+ <i class="{{ action.icon }} fa-sm me-2" aria-hidden="true"></i>
169
173
  {% endif %}
170
174
  <span>{{ action.label }}</span>
171
175
  </button>
@@ -176,7 +180,7 @@
176
180
  {% capture child_class %}dropdown-item {{ child_active }} {% if child.class %}{{ child.class }}{% endif %}{% endcapture %}
177
181
  {% capture child_content %}
178
182
  {% if child.icon %}
179
- <i class="fa-solid fa-{{ child.icon }} fa-sm me-2"></i>
183
+ <i class="{{ child.icon }} fa-sm me-2" aria-hidden="true"></i>
180
184
  {% endif %}
181
185
  <span>{{ child.label }}</span>
182
186
  {% endcapture %}
@@ -208,7 +212,7 @@
208
212
  {% capture action_attributes %}{% if action.attributes %}{% for attr in action.attributes %} {{ attr[0] }}="{{ attr[1] }}"{% endfor %}{% endif %}{% endcapture %}
209
213
  {% capture action_content %}
210
214
  {% if action.icon %}
211
- <i class="fa-solid fa-{{ action.icon }} fa-sm me-2"></i>
215
+ <i class="{{ action.icon }} fa-sm me-2" aria-hidden="true"></i>
212
216
  {% endif %}
213
217
  <span>{{ action.label }}</span>
214
218
  {% endcapture %}
@@ -3,6 +3,10 @@
3
3
  app topbar (global/sections/app-topbar.html) but keep their frontmatter API:
4
4
  resolved.config.theme.header.{title, actions} render here.
5
5
 
6
+ An `icon` (the title's, an action's, a dropdown item's) carries its OWN Font
7
+ Awesome classes (#619, #850, #903): `icon: 'fa-brands fa-github'`. Every icon
8
+ site below emits that string verbatim and adds only its size and spacing.
9
+
6
10
  action.size is 'sm' | 'lg' (Bootstrap's button sizes) — anything else renders
7
11
  no size class. NEVER test it for truthiness: Liquid answers `.size` on a hash
8
12
  with its KEY COUNT, so every action would "have" a size (#43).
@@ -15,7 +19,7 @@
15
19
  {% unless resolved.config.theme.header.title.enabled == false %}
16
20
  <h1 class="page-title mb-0 d-flex align-items-center {{ resolved.config.theme.header.title.class }}">
17
21
  {% if resolved.config.theme.header.title.icon %}
18
- <span class="omega-icon-chip omega-icon-chip--neutral me-2"><i class="fa-solid fa-{{ resolved.config.theme.header.title.icon }} fa-sm"></i></span>
22
+ <span class="omega-icon-chip omega-icon-chip--neutral me-2"><i class="{{ resolved.config.theme.header.title.icon }} fa-sm" aria-hidden="true"></i></span>
19
23
  {% endif %}
20
24
  {{- resolved.config.theme.header.title.content | default: resolved.meta.title | omega_liquify -}}
21
25
  </h1>
@@ -46,7 +50,7 @@
46
50
  data-bs-toggle="dropdown"
47
51
  aria-expanded="false">
48
52
  {% if action.icon %}
49
- <i class="fa-solid fa-{{ action.icon }} fa-sm me-2"></i>
53
+ <i class="{{ action.icon }} fa-sm me-2" aria-hidden="true"></i>
50
54
  {% endif %}
51
55
  {{ action.label }}
52
56
  </button>
@@ -58,7 +62,7 @@
58
62
  <li>
59
63
  <a class="dropdown-item" href="{{ item.href | default: '#' }}">
60
64
  {% if item.icon %}
61
- <i class="fa-solid fa-{{ item.icon }} fa-sm me-2"></i>
65
+ <i class="{{ item.icon }} fa-sm me-2" aria-hidden="true"></i>
62
66
  {% endif %}
63
67
  {{ item.label }}
64
68
  </a>
@@ -73,7 +77,7 @@
73
77
  {% capture action_attributes %}{% if action.attributes %}{% for attr in action.attributes %} {{ attr[0] }}="{{ attr[1] }}"{% endfor %}{% endif %}{% endcapture %}
74
78
  {% capture action_content %}
75
79
  {% if action.icon %}
76
- <i class="fa-solid fa-{{ action.icon }} fa-sm me-2"></i>
80
+ <i class="{{ action.icon }} fa-sm me-2" aria-hidden="true"></i>
77
81
  {% endif %}
78
82
  {{ action.label }}
79
83
  {% endcapture %}
@@ -10,86 +10,86 @@ stats_cards:
10
10
  value: "$24,300"
11
11
  change: "+12.5%"
12
12
  change_type: "success"
13
- icon: "dollar-sign"
13
+ icon: "fa-solid fa-dollar-sign"
14
14
 
15
15
  - id: "new_users"
16
16
  title: "New users"
17
17
  value: "1,423"
18
18
  change: "+5.8%"
19
19
  change_type: "success"
20
- icon: "users"
20
+ icon: "fa-solid fa-users"
21
21
 
22
22
  - id: "active_projects"
23
23
  title: "Active projects"
24
24
  value: "14"
25
25
  change: "2 pending"
26
26
  change_type: "warning"
27
- icon: "folder-open"
27
+ icon: "fa-solid fa-folder-open"
28
28
 
29
29
  - id: "performance"
30
30
  title: "Performance"
31
31
  value: "89%"
32
32
  change: "Good"
33
33
  change_type: "info"
34
- icon: "chart-line"
34
+ icon: "fa-solid fa-chart-line"
35
35
 
36
36
  recent_activity:
37
37
  - id: "new_document"
38
38
  title: "New document created"
39
39
  description: "Project proposal for Q2 2024"
40
40
  time: "2 hours ago"
41
- icon: "file-alt"
41
+ icon: "fa-solid fa-file-alt"
42
42
  icon_color: "primary"
43
43
 
44
44
  - id: "task_completed"
45
45
  title: "Task completed"
46
46
  description: "Website redesign approved"
47
47
  time: "5 hours ago"
48
- icon: "check-circle"
48
+ icon: "fa-solid fa-check-circle"
49
49
  icon_color: "success"
50
50
 
51
51
  - id: "new_member"
52
52
  title: "New team member"
53
53
  description: "Sarah Johnson joined the team"
54
54
  time: "1 day ago"
55
- icon: "user-plus"
55
+ icon: "fa-solid fa-user-plus"
56
56
  icon_color: "warning"
57
57
 
58
58
  - id: "code_deployed"
59
59
  title: "Code deployed"
60
60
  description: "Version 2.4.1 released to production"
61
61
  time: "2 days ago"
62
- icon: "code-branch"
62
+ icon: "fa-solid fa-code-branch"
63
63
  icon_color: "info"
64
64
 
65
65
  quick_actions:
66
66
  - id: "create_project"
67
67
  label: "Create new project"
68
- icon: "plus"
68
+ icon: "fa-solid fa-plus"
69
69
  style: "primary"
70
70
  href: "#"
71
71
 
72
72
  - id: "upload_files"
73
73
  label: "Upload files"
74
- icon: "upload"
74
+ icon: "fa-solid fa-upload"
75
75
  style: "outline-adaptive"
76
76
  href: "#"
77
77
 
78
78
  - id: "invite_members"
79
79
  label: "Invite team members"
80
- icon: "users"
80
+ icon: "fa-solid fa-users"
81
81
  style: "outline-adaptive"
82
82
  href: "#"
83
83
 
84
84
  - id: "view_analytics"
85
85
  label: "View analytics"
86
- icon: "chart-bar"
86
+ icon: "fa-solid fa-chart-bar"
87
87
  style: "outline-adaptive"
88
88
  href: "/analytics"
89
89
 
90
90
  - id: "settings"
91
91
  label: "Settings"
92
- icon: "cog"
92
+ icon: "fa-solid fa-cog"
93
93
  style: "outline-adaptive"
94
94
  href: "/settings"
95
95
 
@@ -113,31 +113,31 @@ config:
113
113
  header:
114
114
  title:
115
115
  content: "Dashboard"
116
- icon: "gauge-high"
116
+ icon: "fa-solid fa-gauge-high"
117
117
  breadcrumbs:
118
118
  items:
119
119
  - label: Home
120
120
  href: /
121
- icon: house
121
+ icon: 'fa-solid fa-house'
122
122
  - label: Dashboard
123
123
  actions:
124
124
  items:
125
125
  - label: New project
126
- icon: plus
126
+ icon: "fa-solid fa-plus"
127
127
  color: primary
128
128
  - label: Reports
129
- icon: chart-line
129
+ icon: "fa-solid fa-chart-line"
130
130
  color: adaptive
131
131
  dropdown:
132
132
  - label: Sales report
133
- icon: dollar-sign
133
+ icon: "fa-solid fa-dollar-sign"
134
134
  href: /reports/sales
135
135
  - label: Analytics report
136
- icon: chart-bar
136
+ icon: "fa-solid fa-chart-bar"
137
137
  href: /reports/analytics
138
138
  - divider: true
139
139
  - label: Export all
140
- icon: download
140
+ icon: "fa-solid fa-download"
141
141
  href: /reports/export
142
142
  ---
143
143
 
@@ -149,7 +149,7 @@ config:
149
149
  <div class="omega-statgrid__cell">
150
150
  <div class="omega-statgrid__label">
151
151
  <span class="omega-micro">{{ card.title }}</span>
152
- <i class="fa-solid fa-{{ card.icon }} fa-sm"></i>
152
+ <i class="{{ card.icon }} fa-sm" aria-hidden="true"></i>
153
153
  </div>
154
154
  <div class="omega-statgrid__value">{{ card.value }}</div>
155
155
  <span class="badge bg-{{ card.change_type }}-subtle text-{{ card.change_type }}">{{ card.change }}</span>
@@ -168,7 +168,7 @@ config:
168
168
  {% for activity in resolved.recent_activity %}
169
169
  <div class="omega-activity__row">
170
170
  <span class="omega-icon-chip omega-icon-chip--neutral">
171
- <i class="fa-solid fa-{{ activity.icon }} fa-sm"></i>
171
+ <i class="{{ activity.icon }} fa-sm" aria-hidden="true"></i>
172
172
  </span>
173
173
  <div class="omega-activity__body">
174
174
  <div class="omega-activity__title">{{ activity.title }}</div>
@@ -193,12 +193,12 @@ config:
193
193
  {% if _style == 'primary' %}{% assign _style = 'adaptive' %}{% endif %}
194
194
  {% if action.href %}
195
195
  <a href="{{ action.href }}" class="btn btn-{{ _style }}">
196
- <i class="fa-solid fa-{{ action.icon }} fa-sm me-2"></i>
196
+ <i class="{{ action.icon }} fa-sm me-2" aria-hidden="true"></i>
197
197
  {{ action.label }}
198
198
  </a>
199
199
  {% else %}
200
200
  <button class="btn btn-{{ _style }}">
201
- <i class="fa-solid fa-{{ action.icon }} fa-sm me-2"></i>
201
+ <i class="{{ action.icon }} fa-sm me-2" aria-hidden="true"></i>
202
202
  {{ action.label }}
203
203
  </button>
204
204
  {% endif %}
@@ -16,12 +16,12 @@ hero:
16
16
  mission:
17
17
  title: "Our mission"
18
18
  description: "To empower individuals and businesses with technology that <em>simplifies</em> complex challenges and unlocks new possibilities for growth."
19
- icon: "bullseye"
19
+ icon: "fa-solid fa-bullseye"
20
20
 
21
21
  vision:
22
22
  title: "Our vision"
23
23
  description: "A world where powerful tools feel effortless, where anyone can build, launch, and grow without wrestling the machinery. That's the product we <em>refuse to stop</em> working toward."
24
- icon: "lightbulb"
24
+ icon: "fa-solid fa-lightbulb"
25
25
 
26
26
  # The letter band — mission & vision as editorial statements (letter: false
27
27
  # kills it). Point image at your own picture and it sits at the head of the
@@ -84,16 +84,16 @@ stats:
84
84
  items:
85
85
  - number: "2017"
86
86
  label: "Founded"
87
- icon: "calendar"
87
+ icon: "fa-solid fa-calendar"
88
88
  - number: "50+"
89
89
  label: "Team members"
90
- icon: "users"
90
+ icon: "fa-solid fa-users"
91
91
  - number: "1M+"
92
92
  label: "Happy customers"
93
- icon: "smile"
93
+ icon: "fa-solid fa-smile"
94
94
  - number: "120+"
95
95
  label: "Countries"
96
- icon: "globe"
96
+ icon: "fa-solid fa-globe"
97
97
 
98
98
  # Company Values Section — rendered as the numbered principles list
99
99
  values:
@@ -104,16 +104,16 @@ values:
104
104
  items:
105
105
  - title: "Innovation first"
106
106
  description: "Push boundaries; challenge the status quo."
107
- icon: "rocket"
107
+ icon: "fa-solid fa-rocket"
108
108
  - title: "Customer obsessed"
109
109
  description: "Their success is our success. Full stop."
110
- icon: "heart"
110
+ icon: "fa-solid fa-heart"
111
111
  - title: "Team excellence"
112
112
  description: "Hire the best, then get out of their way."
113
- icon: "users"
113
+ icon: "fa-solid fa-users"
114
114
  - title: "Transparent culture"
115
115
  description: "Open communication, honest feedback, shared decisions."
116
- icon: "magnifying-glass"
116
+ icon: "fa-solid fa-magnifying-glass"
117
117
 
118
118
  # Team CTA Section
119
119
  team_cta: