@designcrowd/library.brand-page 6.2.0 → 6.2.1

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 (121) hide show
  1. package/lib/src/{CreatedOnBrandCrowd-de-de-VQCQvlMg.js → CreatedOnBrandCrowd-de-de-CtvPtYF6.js} +1 -1
  2. package/lib/src/{CreatedOnBrandCrowd-en-us-DSf3BjCG.js → CreatedOnBrandCrowd-en-us-eGF-EjAX.js} +1 -1
  3. package/lib/src/{CreatedOnBrandCrowd-es-es-DGcdM9Ec.js → CreatedOnBrandCrowd-es-es-CSemsOtT.js} +1 -1
  4. package/lib/src/{CreatedOnBrandCrowd-fr-fr-C9g1fc39.js → CreatedOnBrandCrowd-fr-ca-DzylX-AT.js} +1 -1
  5. package/lib/src/{CreatedOnBrandCrowd-fr-ca-C9g1fc39.js → CreatedOnBrandCrowd-fr-fr-DzylX-AT.js} +1 -1
  6. package/lib/src/{CreatedOnBrandCrowd-pt-pt-DSXr7Bxl.js → CreatedOnBrandCrowd-pt-br-QMUxXQsE.js} +1 -1
  7. package/lib/src/{CreatedOnBrandCrowd-pt-br-DSXr7Bxl.js → CreatedOnBrandCrowd-pt-pt-QMUxXQsE.js} +1 -1
  8. package/lib/src/{CreatedOnDcom-de-de-BPdCL6wS.js → CreatedOnDcom-de-de-M7OoJt-1.js} +1 -1
  9. package/lib/src/{CreatedOnDcom-en-us-CLkSTQRu.js → CreatedOnDcom-en-us-D7hMM0AI.js} +1 -1
  10. package/lib/src/{CreatedOnDcom-es-es-CRknMAGv.js → CreatedOnDcom-es-es-CLw-BLp2.js} +1 -1
  11. package/lib/src/{CreatedOnDcom-fr-ca-ClAY_dHI.js → CreatedOnDcom-fr-ca-BRu_kmeu.js} +1 -1
  12. package/lib/src/{CreatedOnDcom-fr-fr-DQtv9rR-.js → CreatedOnDcom-fr-fr-IMnEv_yM.js} +1 -1
  13. package/lib/src/{CreatedOnDcom-pt-br-BbIxvmxv.js → CreatedOnDcom-pt-br-Bt6v1p27.js} +1 -1
  14. package/lib/src/{CreatedOnDcom-pt-pt-BOfOesBj.js → CreatedOnDcom-pt-pt-BVsFJIJg.js} +1 -1
  15. package/lib/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.mixin.d.ts +16 -2
  16. package/lib/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.mixin.js +17 -0
  17. package/lib/src/brand-page/components/page/Page.mixin.d.ts +2 -1
  18. package/lib/src/brand-page/components/page/Page.mixin.js +12 -7
  19. package/lib/src/brand-page/components/page-header/HeaderLayout.stories.d.ts +1 -0
  20. package/lib/src/brand-page/components/page-header/HeaderLayout.stories.js +9 -0
  21. package/lib/src/brand-page/components/page-header/PageHeader.mixin.d.ts +3 -1
  22. package/lib/src/brand-page/components/page-header/PageHeader.mixin.js +10 -4
  23. package/lib/src/brand-page/constants/sections/header-display.constants.d.ts +3 -0
  24. package/lib/src/brand-page/constants/sections/header-display.constants.js +15 -0
  25. package/lib/src/brand-page/models/index.d.ts +12 -0
  26. package/lib/src/brand-page/models/index.js +4 -0
  27. package/lib/src/brand-page/utils/context.util.d.ts +1 -0
  28. package/lib/src/brand-page/utils/context.util.js +9 -0
  29. package/lib/src/brand-page/utils/route.util.d.ts +1 -0
  30. package/lib/src/brand-page/utils/route.util.js +9 -0
  31. package/lib/src/brand-page/utils/view-model.util.js +53 -1
  32. package/lib/src/brand-page/view-models.d.ts +3 -1
  33. package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.d.ts +2 -1
  34. package/lib/src/brand-page-maker/components/brandpage-maker-page/BrandPageMakerPage.mixin.d.ts +2 -1
  35. package/lib/src/brand-page-maker/stores/ai-checkpoint/ai-checkpoint-store.d.ts +1626 -0
  36. package/lib/src/brand-page-maker/validators/section-button.validator.d.ts +5 -2
  37. package/lib/src/brand-page-maker/validators/section-button.validator.js +11 -15
  38. package/lib/src/{bundled-translations-B2q5GWTQ.js → bundled-translations-KY0aSmMp.js} +9 -9
  39. package/lib/src/{bundled-translations.de-DE-FhH2H_rd.js → bundled-translations.de-DE-BIFi4bYj.js} +9 -9
  40. package/lib/src/{bundled-translations.es-ES-_ZExxMi7.js → bundled-translations.es-ES-CHlKuPLO.js} +5 -5
  41. package/lib/src/{bundled-translations.fr-CA-Tg-ODIiC.js → bundled-translations.fr-CA-DR1fvm8e.js} +1 -1
  42. package/lib/src/{bundled-translations.fr-FR-C0sU51Mz.js → bundled-translations.fr-FR-DnpWVIQg.js} +9 -9
  43. package/lib/src/{bundled-translations.pt-BR-MYFIhA4u.js → bundled-translations.pt-BR-p8szTOiT.js} +17 -17
  44. package/lib/src/{bundled-translations.pt-PT-DeUBSzCB.js → bundled-translations.pt-PT-DEk39NhW.js} +22 -22
  45. package/lib/src/bundles/bundled-translations.de-DE.json +6 -1
  46. package/lib/src/bundles/bundled-translations.es-ES.json +6 -1
  47. package/lib/src/bundles/bundled-translations.fr-CA.json +6 -1
  48. package/lib/src/bundles/bundled-translations.fr-FR.json +6 -1
  49. package/lib/src/bundles/bundled-translations.json +6 -1
  50. package/lib/src/bundles/bundled-translations.pt-BR.json +6 -1
  51. package/lib/src/bundles/bundled-translations.pt-PT.json +6 -1
  52. package/lib/src/css/library.brand-page-brandCrowd.min.css +573 -135
  53. package/lib/src/css/library.brand-page-brandPage.min.css +573 -135
  54. package/lib/src/css/library.brand-page-designCom.min.css +573 -135
  55. package/lib/src/css/library.brand-page-preview.min.css +573 -135
  56. package/lib/src/index.mjs +1 -1
  57. package/lib/src/{lib-BMVF4uNy.js → lib-B38VVCSw.js} +20304 -19843
  58. package/lib/src/shared/content-settings/components/content-settings/ContentSettings.mixin.d.ts +2 -1
  59. package/lib/src/shared/content-settings/components/content-settings/ReplaceImageSettingsForContent.mixin.d.ts +1 -1
  60. package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.d.ts +1 -1
  61. package/lib/src/shared/content-settings/components/payment-config-field/PaymentConfigField.mixin.d.ts +1 -1
  62. package/lib/src/shared/content-settings/components/text-field/TextField.mixin.d.ts +14 -2
  63. package/lib/src/shared/content-settings/components/text-field/TextField.mixin.js +14 -0
  64. package/lib/src/shared/logo-settings/components/LogoSettings.mixin.d.ts +1 -1
  65. package/lib/src/shared/page-navigation/store/page-navigation-store.d.ts +1 -0
  66. package/lib/src/shared/page-navigation/store/page-navigation-store.js +12 -0
  67. package/lib/src/shared/page-settings/components/delete-page-modal/DeletePageModal.mixin.d.ts +1 -1
  68. package/lib/src/shared/page-settings/components/new-page-modal/NewPageModal.mixin.d.ts +2 -1
  69. package/lib/src/shared/page-settings/components/page-settings/PageSettings.mixin.d.ts +190 -1
  70. package/lib/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.d.ts +184 -2
  71. package/lib/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.js +34 -2
  72. package/lib/src/shared/page-settings/store/page-settings-store.d.ts +2 -2
  73. package/lib/src/shared/style-settings/components/StyleSettings.mixin.d.ts +3 -0
  74. package/package.json +2 -2
  75. package/src/brand-page/components/navigation/hamburger/HamburgerNavigation.vue +1 -0
  76. package/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.mixin.ts +18 -1
  77. package/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.vue +73 -3
  78. package/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.vue.test.ts +181 -0
  79. package/src/brand-page/components/page/Page.mixin.ts +21 -11
  80. package/src/brand-page/components/page/Page.vue +2 -0
  81. package/src/brand-page/components/page-header/HeaderLayout.stories.ts +10 -0
  82. package/src/brand-page/components/page-header/HeaderLayout.vue +415 -71
  83. package/src/brand-page/components/page-header/PageHeader.mixin.ts +14 -10
  84. package/src/brand-page/components/page-header/PageHeader.vue +16 -1
  85. package/src/brand-page/components/page-header/PageHeader.vue.test.ts +339 -0
  86. package/src/brand-page/constants/sections/header-display.constants.test.ts +44 -0
  87. package/src/brand-page/constants/sections/header-display.constants.ts +35 -0
  88. package/src/brand-page/models/header-button.model.test.ts +85 -0
  89. package/src/brand-page/models/index.ts +19 -0
  90. package/src/brand-page/utils/context.util.ts +15 -0
  91. package/src/brand-page/utils/route.util.ts +13 -0
  92. package/src/brand-page/utils/view-model.util.test.ts +151 -1
  93. package/src/brand-page/utils/view-model.util.ts +73 -1
  94. package/src/brand-page/view-models.ts +3 -0
  95. package/src/brand-page-maker/validators/section-button.validator.ts +23 -19
  96. package/src/bundles/bundled-translations.de-DE.json +6 -1
  97. package/src/bundles/bundled-translations.es-ES.json +6 -1
  98. package/src/bundles/bundled-translations.fr-CA.json +6 -1
  99. package/src/bundles/bundled-translations.fr-FR.json +6 -1
  100. package/src/bundles/bundled-translations.json +6 -1
  101. package/src/bundles/bundled-translations.pt-BR.json +6 -1
  102. package/src/bundles/bundled-translations.pt-PT.json +6 -1
  103. package/src/shared/content-settings/components/text-field/TextField.mixin.ts +15 -0
  104. package/src/shared/content-settings/components/url-field/UrlField.vue +1 -0
  105. package/src/shared/page-navigation/store/page-navigation-store.ts +16 -0
  106. package/src/shared/page-settings/components/header-settings-panel/HeaderSettingsPanel.button-section.test.ts +131 -0
  107. package/src/shared/page-settings/components/header-settings-panel/HeaderSettingsPanel.vue +65 -10
  108. package/src/shared/page-settings/components/page-settings-section-styles/HeaderButtonSettings.test.ts +305 -0
  109. package/src/shared/page-settings/components/page-settings-section-styles/HeaderButtonSettings.vue +265 -0
  110. package/src/shared/page-settings/components/page-settings-section-styles/HeaderDisplayStyle.test.ts +354 -0
  111. package/src/shared/page-settings/components/page-settings-section-styles/HeaderDisplayStyle.vue +48 -9
  112. package/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.header-button.test.ts +114 -0
  113. package/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.ts +38 -1
  114. package/src/shared/page-settings/components/page-settings-section-styles/i18n/page-settings-section.de-DE.json +6 -1
  115. package/src/shared/page-settings/components/page-settings-section-styles/i18n/page-settings-section.es-ES.json +6 -1
  116. package/src/shared/page-settings/components/page-settings-section-styles/i18n/page-settings-section.fr-CA.json +6 -1
  117. package/src/shared/page-settings/components/page-settings-section-styles/i18n/page-settings-section.fr-FR.json +6 -1
  118. package/src/shared/page-settings/components/page-settings-section-styles/i18n/page-settings-section.json +6 -1
  119. package/src/shared/page-settings/components/page-settings-section-styles/i18n/page-settings-section.pt-BR.json +6 -1
  120. package/src/shared/page-settings/components/page-settings-section-styles/i18n/page-settings-section.pt-PT.json +6 -1
  121. package/src/shared/page-settings/store/page-settings-store.ts +2 -0
@@ -1,7 +1,13 @@
1
1
  <template>
2
2
  <header
3
3
  data-component="header-layout"
4
- :class="['root', 'layout', displayStyle, showNav ? 'show-nav' : 'no-nav']"
4
+ :class="[
5
+ 'root',
6
+ 'tw-items-center',
7
+ displayStyle,
8
+ showNav ? 'show-nav' : 'no-nav',
9
+ { 'has-header-cta': showCta },
10
+ ]"
5
11
  >
6
12
  <div class="logo-container">
7
13
  <slot name="logo" />
@@ -11,23 +17,66 @@
11
17
  <slot name="nav" />
12
18
  </div>
13
19
  </div>
20
+ <div v-if="showCta" data-test-header-layout-cta class="cta-container">
21
+ <slot name="cta" />
22
+ </div>
23
+ <!-- Invisible size-peer of the CTA: sits in the mirror track of the four centred-logo grids
24
+ so the logo stays centred from the first paint (SSR included) with no measurement and no
25
+ layout shift. Rendered after the real CTA so first-match test locators resolve to the
26
+ visible one. -->
27
+ <div v-if="showCtaMirror" aria-hidden="true" class="cta-mirror">
28
+ <slot name="cta" />
29
+ </div>
14
30
  </header>
15
31
  </template>
16
32
  <script setup lang="ts">
17
- import { withDefaults } from 'vue';
18
- import type { HeaderDisplayStyle } from '../../constants';
33
+ import { computed, withDefaults } from 'vue';
34
+ import {
35
+ HEADER_DISPLAY,
36
+ headerRowRendersCta,
37
+ type HeaderDisplayStyle,
38
+ } from '../../constants';
19
39
 
20
- withDefaults(
40
+ const props = withDefaults(
21
41
  defineProps<{
22
42
  navId: string;
23
43
  showNav?: boolean;
24
44
  displayStyle: HeaderDisplayStyle;
25
45
  logoWidth: string | number;
46
+ hasCta?: boolean;
26
47
  }>(),
27
48
  {
28
49
  showNav: true,
50
+ hasCta: false,
29
51
  },
30
52
  );
53
+
54
+ const showCta = computed(
55
+ (): boolean =>
56
+ props.hasCta && headerRowRendersCta(props.displayStyle, props.showNav),
57
+ );
58
+
59
+ // The centered-logo grids keep the logo centred by carrying a leading "mirror" track the same
60
+ // width as the trailing button. A hidden copy of the button (see template) sizes that track, so
61
+ // the layout is right on the first paint — no measurement, no shift. Only these four styles need
62
+ // it: TAB_6 / TAB_NO_LOGO_2 pin the button absolutely when their nav is hidden (no mirror then),
63
+ // while TAB_4 and HAMBURGER_2 mirror in both nav states.
64
+ const showCtaMirror = computed((): boolean => {
65
+ if (!showCta.value) {
66
+ return false;
67
+ }
68
+
69
+ switch (props.displayStyle) {
70
+ case HEADER_DISPLAY.DESKTOP_TAB_4:
71
+ case HEADER_DISPLAY.DESKTOP_HAMBURGER_2:
72
+ return true;
73
+ case HEADER_DISPLAY.DESKTOP_TAB_6:
74
+ case HEADER_DISPLAY.DESKTOP_TAB_NO_LOGO_2:
75
+ return props.showNav;
76
+ default:
77
+ return false;
78
+ }
79
+ });
31
80
  </script>
32
81
  <style scoped>
33
82
  .root {
@@ -37,28 +86,28 @@ withDefaults(
37
86
  --hamburger-nav-height: 32px;
38
87
  --hamburger-nav-width: 32px;
39
88
  }
40
- .layout {
41
- align-items: center;
42
- }
89
+
43
90
  .nav-container {
44
- @apply tw-max-w-full;
45
- overflow: hidden;
91
+ @apply tw-max-w-full tw-overflow-hidden;
46
92
  }
47
93
  .logo-container {
48
94
  }
95
+ /* The rules below position this box; the button just fills whatever box it gets.
96
+ Never shrinks below its label: in the flex placements a wide nav compresses into its
97
+ carousel instead of wrapping the button's text (the grid placements floor it likewise). */
98
+ .cta-container {
99
+ @apply tw-min-w-0 tw-shrink-0;
100
+ }
49
101
 
50
102
  /* DESKTOP_TAB_1 */
51
103
  .desktop-tab-horizontal-stack-left-logo-right-menu {
52
104
  @apply tw-flex;
53
105
  }
54
106
  .desktop-tab-horizontal-stack-left-logo-right-menu .nav-container {
55
- flex: 1;
56
- margin-left: 1rem;
107
+ @apply tw-flex-1 tw-ml-4;
57
108
  }
58
109
  .desktop-tab-horizontal-stack-left-logo-right-menu .nav-container__inner {
59
- display: inline-block;
60
- float: right;
61
- max-width: 100%;
110
+ @apply tw-inline-block tw-float-right tw-max-w-full;
62
111
  }
63
112
 
64
113
  /* DESKTOP_TAB_2 */
@@ -66,12 +115,10 @@ withDefaults(
66
115
  @apply tw-flex;
67
116
  }
68
117
  .desktop-tab-horizontal-stack-left-logo-left-menu .nav-container {
69
- flex: 1;
70
- margin-left: 1rem;
118
+ @apply tw-flex-1 tw-ml-4;
71
119
  }
72
120
  .desktop-tab-horizontal-stack-left-logo-left-menu .nav-container__inner {
73
- display: inline-block;
74
- max-width: 100%;
121
+ @apply tw-inline-block tw-max-w-full;
75
122
  }
76
123
 
77
124
  /* DESKTOP_TAB_3 */
@@ -82,30 +129,25 @@ withDefaults(
82
129
  --logo-max-width
83
130
  )
84
131
  [cols-end];
85
- @apply tw-gap-x-4;
86
- margin-top: 1rem;
87
- margin-bottom: 1rem;
132
+ @apply tw-gap-x-4 tw-mt-4 tw-mb-4;
88
133
  }
89
134
  .desktop-tab-horizontal-stack-left-logo-centered-menu .logo-container {
90
135
  grid-column: logo-start / logo-end;
91
- justify-self: start;
136
+ @apply tw-justify-self-start;
92
137
  }
93
138
  .desktop-tab-horizontal-stack-left-logo-centered-menu .nav-container {
94
139
  grid-column: nav-start / nav-end;
95
140
  }
96
141
  .desktop-tab-horizontal-stack-left-logo-centered-menu .nav-container__inner {
97
142
  /* start - center content */
98
- display: inline-block;
143
+ @apply tw-inline-block;
99
144
  transform: translateX(-50%);
100
- left: 50%;
101
- position: relative;
102
- max-width: 100%;
145
+ @apply tw-left-1/2 tw-relative tw-max-w-full;
103
146
  /* end - center content */
104
147
  }
105
148
  /* DESKTOP_TAB_4 */
106
149
  .desktop-tab-horizontal-stack-centered-logo-right-menu {
107
- @apply tw-grid;
108
- @apply tw-gap-x-4;
150
+ @apply tw-grid tw-gap-x-4;
109
151
  grid-template-columns:
110
152
  [col-start] 1fr [logo-start] var(--logo-max-width)
111
153
  [logo-end nav-start] 1fr [nav-end];
@@ -118,18 +160,15 @@ withDefaults(
118
160
  }
119
161
  .desktop-tab-horizontal-stack-centered-logo-right-menu .nav-container__inner {
120
162
  /* start - align right content */
121
- float: right;
122
- max-width: 100%;
163
+ @apply tw-float-right tw-max-w-full;
123
164
  /* end - align right content */
124
165
  }
125
166
  /* DESKTOP_TAB_5 */
126
167
  .desktop-tab-vertical-stack-centered-logo-centered-menu {
127
- align-items: center;
128
- justify-items: center;
168
+ @apply tw-items-center tw-justify-items-center;
129
169
  }
130
170
  .desktop-tab-vertical-stack-centered-logo-centered-menu.show-nav {
131
- @apply tw-grid tw-grid-rows-2;
132
- @apply tw-gap-y-4;
171
+ @apply tw-grid tw-grid-rows-2 tw-gap-y-4;
133
172
  grid-template-rows:
134
173
  [row1-start] 1fr [row1-end row2-start] var(--tab-nav-height)
135
174
  [row2-end];
@@ -141,31 +180,25 @@ withDefaults(
141
180
  .desktop-tab-vertical-stack-centered-logo-centered-menu.show-nav
142
181
  .nav-container {
143
182
  grid-row: row2-start / row2-end;
144
- width: 100%;
183
+ @apply tw-w-full;
145
184
  }
146
185
  .desktop-tab-vertical-stack-centered-logo-centered-menu.show-nav
147
186
  .nav-container__inner {
148
- display: inline-block;
187
+ @apply tw-inline-block;
149
188
  transform: translateX(-50%);
150
- left: 50%;
151
- position: relative;
152
- max-width: 100%;
189
+ @apply tw-left-1/2 tw-relative tw-max-w-full;
153
190
  }
154
191
 
155
192
  .desktop-tab-vertical-stack-centered-logo-centered-menu.no-nav {
156
- @apply tw-flex;
157
- justify-content: center;
193
+ @apply tw-flex tw-justify-center;
158
194
  }
159
195
 
160
196
  /* MOBILE_TAB_1 */
161
197
  .mobile-tab-vertical-stack-centered-logo-centered-menu {
162
- align-items: center;
163
- justify-items: center;
164
- width: 100%;
198
+ @apply tw-items-center tw-justify-items-center tw-w-full;
165
199
  }
166
200
  .mobile-tab-vertical-stack-centered-logo-centered-menu.show-nav {
167
- @apply tw-grid;
168
- @apply tw-gap-y-4;
201
+ @apply tw-grid tw-gap-y-4;
169
202
  grid-template-rows:
170
203
  [row1-start] 1fr [row1-end row2-start] var(--tab-nav-height)
171
204
  [row2-end];
@@ -176,7 +209,7 @@ withDefaults(
176
209
  }
177
210
  .mobile-tab-vertical-stack-centered-logo-centered-menu.show-nav .nav-container {
178
211
  grid-row: row2-start / row2-end;
179
- width: 100%;
212
+ @apply tw-w-full;
180
213
  }
181
214
 
182
215
  .mobile-tab-vertical-stack-centered-logo-centered-menu.no-nav {
@@ -189,35 +222,30 @@ withDefaults(
189
222
  grid-template-rows:
190
223
  [row1-start] var(--tab-nav-height)
191
224
  [row1-end row2-start] 1fr [row2-end];
192
- @apply tw-gap-y-4;
193
- justify-content: center;
194
- justify-items: center;
225
+ @apply tw-gap-y-4 tw-justify-center tw-justify-items-center;
195
226
  }
196
227
  .desktop-tab-vertical-stack-centered-menu-centered-logo.show-nav
197
228
  .logo-container {
198
229
  grid-row: row2-start / row2-end;
199
- text-align: center;
230
+ @apply tw-text-center;
200
231
  }
201
232
  .desktop-tab-vertical-stack-centered-menu-centered-logo.show-nav
202
233
  .nav-container {
203
234
  grid-row: row1-start / row1-end;
204
235
  }
205
- .layout desktop-tab-vertical-stack-centered-menu-centered-logo.no-nav {
206
- @apply tw-flex;
236
+ .desktop-tab-vertical-stack-centered-menu-centered-logo.no-nav {
237
+ @apply tw-flex tw-justify-center;
207
238
  }
208
239
  /* MOBILE_TAB_2 */
209
240
  .mobile-tab-vertical-stack-centered-menu-centered-logo {
210
- align-items: center;
211
- justify-items: center;
212
- width: 100%;
241
+ @apply tw-items-center tw-justify-items-center tw-w-full;
213
242
  }
214
243
  .mobile-tab-vertical-stack-centered-menu-centered-logo.show-nav {
215
244
  @apply tw-grid;
216
245
  grid-template-rows:
217
246
  [row1-start] var(--tab-nav-height)
218
247
  [row1-end row2-start] 1fr [row2-end];
219
- @apply tw-gap-y-4;
220
- margin-top: 1rem;
248
+ @apply tw-gap-y-4 tw-mt-4;
221
249
  }
222
250
  .mobile-tab-vertical-stack-centered-menu-centered-logo.show-nav
223
251
  .logo-container {
@@ -225,7 +253,7 @@ withDefaults(
225
253
  }
226
254
  .mobile-tab-vertical-stack-centered-menu-centered-logo.show-nav .nav-container {
227
255
  grid-row: row1-start / row1-end;
228
- width: 100%;
256
+ @apply tw-w-full;
229
257
  }
230
258
  .mobile-tab-vertical-stack-centered-menu-centered-logo.no-nav {
231
259
  @apply tw-flex;
@@ -234,8 +262,7 @@ withDefaults(
234
262
  /* DESKTOP_TAB_NO_LOGO_1, DESKTOP_HAMBURGER_NO_LOGO_1 */
235
263
  .desktop-tab-left-menu-no-logo,
236
264
  .desktop-hamburger-no-logo-left-menu {
237
- @apply tw-flex;
238
- justify-content: flex-start;
265
+ @apply tw-flex tw-justify-start;
239
266
  }
240
267
  .desktop-tab-left-menu-no-logo .logo-container,
241
268
  .desktop-hamburger-no-logo-left-menu .logo-container {
@@ -271,7 +298,7 @@ withDefaults(
271
298
  grid-template-columns: [logo-start] auto [nav-start] var(
272
299
  --hamburger-nav-width
273
300
  );
274
- align-items: start;
301
+ @apply tw-items-start;
275
302
  }
276
303
  .desktop-hamburger-horizontal-stack-left-logo-right-menu .logo-container,
277
304
  .mobile-hamburger-horizontal-stack-left-logo-right-menu .logo-container {
@@ -281,7 +308,8 @@ withDefaults(
281
308
  .desktop-hamburger-horizontal-stack-left-logo-right-menu .nav-container,
282
309
  .mobile-hamburger-horizontal-stack-left-logo-right-menu .nav-container {
283
310
  grid-column: nav-start;
284
- margin: var(--page-padding) 0;
311
+ /* The icon centres on the row's height (the logo is usually the tallest thing in it). */
312
+ @apply tw-self-center;
285
313
  }
286
314
 
287
315
  /* DESKTOP_HAMBURGER_2, MOBILE_HAMBURGER_2 */
@@ -291,7 +319,7 @@ withDefaults(
291
319
  grid-template-columns:
292
320
  [start] var(--hamburger-nav-width)
293
321
  [logo-start] auto [nav-start] var(--hamburger-nav-width);
294
- align-items: start;
322
+ @apply tw-items-start;
295
323
  }
296
324
  .desktop-hamburger-horizontal-stack-centered-logo-right-menu .logo-container,
297
325
  .mobile-hamburger-horizontal-stack-centered-logo-right-menu .logo-container {
@@ -301,7 +329,7 @@ withDefaults(
301
329
  .desktop-hamburger-horizontal-stack-centered-logo-right-menu .nav-container,
302
330
  .mobile-hamburger-horizontal-stack-centered-logo-right-menu .nav-container {
303
331
  grid-column: nav-start;
304
- margin: var(--page-padding) 0;
332
+ @apply tw-self-center;
305
333
  }
306
334
 
307
335
  /* MOBILE_HAMBURGER_3 */
@@ -311,7 +339,7 @@ withDefaults(
311
339
  --hamburger-nav-width
312
340
  );
313
341
  grid-template-areas: 'a b c';
314
- align-items: start;
342
+ @apply tw-items-start;
315
343
  }
316
344
  .mobile-hamburger-horizontal-stack-left-menu-centered-logo .logo-container {
317
345
  @apply tw-mx-4 tw-flex tw-justify-center;
@@ -319,12 +347,12 @@ withDefaults(
319
347
  }
320
348
  .mobile-hamburger-horizontal-stack-left-menu-centered-logo .nav-container {
321
349
  grid-area: a;
322
- margin: var(--page-padding) 0;
350
+ @apply tw-self-center;
323
351
  }
324
352
  .mobile-hamburger-horizontal-stack-left-menu-centered-logo
325
353
  .nav-container__inner {
326
354
  float: left;
327
- max-width: 100%;
355
+ @apply tw-max-w-full;
328
356
  }
329
357
 
330
358
  /* MOBILE_HAMBURGER_4 */
@@ -332,7 +360,7 @@ withDefaults(
332
360
  @apply tw-grid;
333
361
  grid-template-columns: var(--hamburger-nav-width) auto;
334
362
  grid-template-areas: 'a b';
335
- align-items: start;
363
+ @apply tw-items-start;
336
364
  }
337
365
  .mobile-hamburger-horizontal-stack-left-menu-left-logo .logo-container {
338
366
  @apply tw-ml-4 tw-flex tw-justify-start;
@@ -340,11 +368,11 @@ withDefaults(
340
368
  }
341
369
  .mobile-hamburger-horizontal-stack-left-menu-left-logo .nav-container {
342
370
  grid-area: a;
343
- margin: var(--page-padding) 0;
371
+ @apply tw-self-center;
344
372
  }
345
373
  .mobile-hamburger-horizontal-stack-left-menu-left-logo .nav-container__inner {
346
374
  float: left;
347
- max-width: 100%;
375
+ @apply tw-max-w-full;
348
376
  }
349
377
 
350
378
  /* MOBILE_HAMBURGER_NO_LOGO_1 */
@@ -369,6 +397,322 @@ withDefaults(
369
397
  .mobile-hamburger-no-logo-right-menu .logo-container {
370
398
  @apply tw-hidden;
371
399
  }
400
+
401
+ /* Button placement — all rules only apply while the button is on (.has-header-cta), so headers without it look exactly as before. */
402
+
403
+ /* The generic Button ships section spacing; the header row, as the caller, strips it here:
404
+ no stack margin, no maker height floor, no icon spacer/label offset (icon room it never uses). */
405
+ .cta-container :deep(.bp-button),
406
+ .cta-mirror :deep(.bp-button) {
407
+ margin-bottom: 0;
408
+ min-height: 0;
409
+ }
410
+ .cta-container :deep(.c-button__no-icon),
411
+ .cta-mirror :deep(.c-button__no-icon) {
412
+ display: none;
413
+ }
414
+ /* Target the base label class, not a specific --offset-* variant, so the icon-gutter shift is
415
+ neutralised for whichever offset the button carries — a future offset swap can't slide the label. */
416
+ .cta-container :deep(.c-button__label),
417
+ .cta-mirror :deep(.c-button__label) {
418
+ transform: none;
419
+ }
420
+ /* Decorative styles (arrow/brush/paper) size by percentage, which collapses to zero inside the
421
+ header's content-sized tracks — hug the label instead. Full-width rows re-stretch below. */
422
+ .cta-container :deep(.bp-style-wrapper),
423
+ .cta-mirror :deep(.bp-style-wrapper) {
424
+ width: fit-content;
425
+ }
426
+
427
+ /* Invisible size-peer of the CTA (see template). Sized exactly like .cta-container — same
428
+ button-normalising :deep rules above, same max-width cap — so the leading mirror track it
429
+ occupies matches the trailing button track. Per-style placement is defined below. */
430
+ .cta-mirror {
431
+ visibility: hidden;
432
+ pointer-events: none;
433
+ @apply tw-min-w-0 tw-shrink-0;
434
+ max-width: var(--logo-max-width);
435
+ }
436
+
437
+ /* DESKTOP_TAB_1/2, TAB_NO_LOGO_3: extra flex child one gap after the nav — beside the links, or at the right edge when the nav is right-aligned. */
438
+ .desktop-tab-horizontal-stack-left-logo-right-menu .cta-container,
439
+ .desktop-tab-horizontal-stack-left-logo-left-menu .cta-container,
440
+ .desktop-tab-right-menu-no-logo .cta-container {
441
+ @apply tw-ml-4;
442
+ }
443
+
444
+ /* TAB_NO_LOGO_1: the nav sits left, so the button pins to the right edge — the same spot
445
+ whether the nav is shown or not (BP-6120). */
446
+ .desktop-tab-left-menu-no-logo .cta-container {
447
+ @apply tw-ml-auto;
448
+ }
449
+
450
+ /* Same styles with the nav hidden (single page): no nav to sit beside — button takes the right edge. */
451
+ .desktop-tab-horizontal-stack-left-logo-right-menu.no-nav .cta-container,
452
+ .desktop-tab-horizontal-stack-left-logo-left-menu.no-nav .cta-container {
453
+ @apply tw-ml-auto;
454
+ }
455
+
456
+ /* DESKTOP_TAB_3: button uses the existing spare right column, nothing else moves. */
457
+ .desktop-tab-horizontal-stack-left-logo-centered-menu .cta-container {
458
+ grid-column: nav-end / cols-end;
459
+ justify-self: end;
460
+ }
461
+
462
+ /* DESKTOP_TAB_4: adds a column for the button after the nav links, mirrored by a leading
463
+ track sized by the hidden button copy so the logo keeps the header's true centre. */
464
+ .desktop-tab-horizontal-stack-centered-logo-right-menu.has-header-cta {
465
+ grid-template-columns:
466
+ [mirror-start] minmax(max-content, auto) [col-start] 1fr
467
+ [logo-start] var(--logo-max-width)
468
+ /* The button's track never shrinks below its label, so a wide nav compresses instead. */
469
+ [logo-end nav-start] 1fr [nav-end cta-start] minmax(max-content, auto)
470
+ [cta-end];
471
+ }
472
+ .desktop-tab-horizontal-stack-centered-logo-right-menu .cta-container {
473
+ grid-column: cta-start / cta-end;
474
+ }
475
+ .desktop-tab-horizontal-stack-centered-logo-right-menu .cta-mirror {
476
+ grid-column: mirror-start / col-start;
477
+ /* Pinned to row 1: the mirror follows the real CTA in the DOM, so auto-placement — whose
478
+ cursor never moves backwards along a row — would drop it onto a second row and grow the
479
+ header band by the button's height. */
480
+ grid-row: 1;
481
+ }
482
+
483
+ /* DESKTOP_TAB_6, TAB_NO_LOGO_2: nav and button share the top row, so the button takes a
484
+ trailing column mirrored by the leading one — the nav pays for the collision it would
485
+ otherwise have. */
486
+ .desktop-tab-vertical-stack-centered-menu-centered-logo.show-nav.has-header-cta,
487
+ .desktop-tab-centered-menu-no-logo.show-nav.has-header-cta {
488
+ @apply tw-grid;
489
+ /* The trailing track never shrinks below the button, so a wide nav compresses (its carousel
490
+ scrolls) rather than running under it; the leading track floors at the hidden button copy
491
+ so nav and logo hold the header's true centre even at full compression. */
492
+ grid-template-columns:
493
+ minmax(max-content, 1fr) [nav-start] auto
494
+ [nav-end cta-start] minmax(max-content, 1fr) [cta-end];
495
+ }
496
+ .desktop-tab-vertical-stack-centered-menu-centered-logo.show-nav.has-header-cta
497
+ .nav-container,
498
+ .desktop-tab-centered-menu-no-logo.show-nav.has-header-cta .nav-container {
499
+ grid-column: nav-start / nav-end;
500
+ }
501
+
502
+ /* The logo shares the nav's track: that track widens to whichever is bigger, so both stay centered. */
503
+ .desktop-tab-vertical-stack-centered-menu-centered-logo.show-nav.has-header-cta
504
+ .logo-container {
505
+ grid-column: nav-start / nav-end;
506
+ }
507
+ .desktop-tab-vertical-stack-centered-menu-centered-logo.show-nav.has-header-cta
508
+ .cta-container,
509
+ .desktop-tab-centered-menu-no-logo.show-nav.has-header-cta .cta-container {
510
+ grid-column: cta-start / cta-end;
511
+ /* Top row, right edge — the shipped corner position. */
512
+ grid-row: 1;
513
+ justify-self: end;
514
+ align-self: start;
515
+ }
516
+ .desktop-tab-vertical-stack-centered-menu-centered-logo.show-nav.has-header-cta
517
+ .cta-mirror,
518
+ .desktop-tab-centered-menu-no-logo.show-nav.has-header-cta .cta-mirror {
519
+ grid-column: 1 / nav-start;
520
+ grid-row: 1;
521
+ }
522
+
523
+ /* DESKTOP_TAB_5: the button shares the TOP row with the logo — the nav lives on its own
524
+ full-width row below — so an absolute corner pin collides with nothing and, unlike a
525
+ column, costs the nav no width. */
526
+ .desktop-tab-vertical-stack-centered-logo-centered-menu.has-header-cta {
527
+ @apply tw-relative;
528
+ }
529
+ .desktop-tab-vertical-stack-centered-logo-centered-menu .cta-container {
530
+ @apply tw-absolute tw-top-0 tw-right-0;
531
+ }
532
+
533
+ /* TAB_6 with the nav hidden: no nav to collide with, so the button keeps its corner pin
534
+ (absolute, so it never pushes the logo off-centre; the logo keeps the band's height). */
535
+ .desktop-tab-vertical-stack-centered-menu-centered-logo.no-nav.has-header-cta {
536
+ @apply tw-relative;
537
+ }
538
+ .desktop-tab-vertical-stack-centered-menu-centered-logo.no-nav .cta-container {
539
+ @apply tw-absolute tw-top-0 tw-right-0;
540
+ }
541
+
542
+ /* TAB_NO_LOGO_2 with the nav hidden: the button is the band's only content, so it stays in
543
+ flow (an absolute pin would collapse the header to zero height) at the same right edge. */
544
+ .desktop-tab-centered-menu-no-logo.no-nav .cta-container {
545
+ @apply tw-ml-auto;
546
+ }
547
+
548
+ /* MOBILE_TAB_1/2: full-width button row in the centered stack. */
549
+ .mobile-tab-vertical-stack-centered-logo-centered-menu .cta-container,
550
+ .mobile-tab-vertical-stack-centered-menu-centered-logo .cta-container {
551
+ @apply tw-w-full tw-justify-self-stretch;
552
+ }
553
+ /* The row is definite-width, so the decorated button can span it like a section's. */
554
+ .mobile-tab-vertical-stack-centered-logo-centered-menu
555
+ .cta-container
556
+ :deep(.bp-style-wrapper),
557
+ .mobile-tab-vertical-stack-centered-menu-centered-logo
558
+ .cta-container
559
+ :deep(.bp-style-wrapper),
560
+ .mobile-tab-centered-menu-no-logo .cta-container :deep(.bp-style-wrapper),
561
+ .mobile-hamburger-no-logo-left-menu.no-nav
562
+ .cta-container
563
+ :deep(.bp-style-wrapper),
564
+ .mobile-hamburger-no-logo-centered-menu.no-nav
565
+ .cta-container
566
+ :deep(.bp-style-wrapper),
567
+ .mobile-hamburger-no-logo-right-menu.no-nav
568
+ .cta-container
569
+ :deep(.bp-style-wrapper),
570
+ .mobile-hamburger-horizontal-stack-left-logo-right-menu.no-nav
571
+ .cta-container
572
+ :deep(.bp-style-wrapper),
573
+ .mobile-hamburger-horizontal-stack-centered-logo-right-menu.no-nav
574
+ .cta-container
575
+ :deep(.bp-style-wrapper),
576
+ .mobile-hamburger-horizontal-stack-left-menu-centered-logo.no-nav
577
+ .cta-container
578
+ :deep(.bp-style-wrapper),
579
+ .mobile-hamburger-horizontal-stack-left-menu-left-logo.no-nav
580
+ .cta-container
581
+ :deep(.bp-style-wrapper) {
582
+ width: 100%;
583
+ }
584
+
585
+ /* MOBILE_TAB_1/2 with the nav hidden: the stack is a plain flex row, so the button wraps below it. */
586
+ .mobile-tab-vertical-stack-centered-logo-centered-menu.no-nav.has-header-cta,
587
+ .mobile-tab-vertical-stack-centered-menu-centered-logo.no-nav.has-header-cta {
588
+ @apply tw-flex-wrap tw-justify-center;
589
+ }
590
+
591
+ /* MOBILE_TAB_NO_LOGO_1 (nav shown or not — its flex-centre stack wraps the button either way)
592
+ and MOBILE_HAMBURGER_NO_LOGO_1..3 with the nav hidden: button wraps onto its own full-width
593
+ line below the nav, one row gap apart (the same gap the with-logo stacks use). */
594
+ .mobile-tab-centered-menu-no-logo.has-header-cta,
595
+ .mobile-hamburger-no-logo-left-menu.no-nav.has-header-cta,
596
+ .mobile-hamburger-no-logo-centered-menu.no-nav.has-header-cta,
597
+ .mobile-hamburger-no-logo-right-menu.no-nav.has-header-cta {
598
+ @apply tw-flex-wrap tw-gap-y-4;
599
+ }
600
+ .mobile-tab-centered-menu-no-logo .cta-container,
601
+ .mobile-hamburger-no-logo-left-menu.no-nav .cta-container,
602
+ .mobile-hamburger-no-logo-centered-menu.no-nav .cta-container,
603
+ .mobile-hamburger-no-logo-right-menu.no-nav .cta-container {
604
+ @apply tw-w-full;
605
+ }
606
+
607
+ /* DESKTOP_HAMBURGER_1: button gets its own column just before the hamburger icon. */
608
+ .desktop-hamburger-horizontal-stack-left-logo-right-menu.has-header-cta {
609
+ grid-template-columns: [logo-start] 1fr [cta-start] auto [nav-start] var(
610
+ --hamburger-nav-width
611
+ );
612
+ }
613
+ .desktop-hamburger-horizontal-stack-left-logo-right-menu .cta-container {
614
+ grid-column: cta-start;
615
+ /* Without an explicit row the button wraps onto a second row. */
616
+ grid-row: 1;
617
+ @apply tw-self-center;
618
+ /* Same gap the nav-bar styles keep between links and button. */
619
+ @apply tw-mr-4;
620
+ }
621
+
622
+ /* DESKTOP_HAMBURGER_2: button and icon share the trailing track (the button's right margin
623
+ reserves the icon's spot), mirrored by a leading 1fr so the logo stays truly centered.
624
+ The track's max-content floor means a tight header shifts the logo instead of overlapping. */
625
+ .desktop-hamburger-horizontal-stack-centered-logo-right-menu.has-header-cta {
626
+ grid-template-columns:
627
+ minmax(max-content, 1fr)
628
+ [logo-start] auto [right-start] minmax(max-content, 1fr);
629
+ }
630
+ .desktop-hamburger-horizontal-stack-centered-logo-right-menu.has-header-cta
631
+ .logo-container {
632
+ grid-column: logo-start;
633
+ }
634
+ .desktop-hamburger-horizontal-stack-centered-logo-right-menu.has-header-cta
635
+ .nav-container {
636
+ grid-column: right-start;
637
+ grid-row: 1;
638
+ justify-self: end;
639
+ }
640
+ .desktop-hamburger-horizontal-stack-centered-logo-right-menu .cta-container {
641
+ grid-column: right-start;
642
+ grid-row: 1;
643
+ justify-self: end;
644
+ @apply tw-self-center;
645
+ /* Sits left of the icon: the old icon column's width plus the usual 1rem gap. */
646
+ margin-right: calc(var(--hamburger-nav-width) + 1rem);
647
+ }
648
+ /* The mirror reserves the icon's spot the same way the real button does (margin-right), so the
649
+ leading track equals button + icon + gap and the logo stays centred. */
650
+ .desktop-hamburger-horizontal-stack-centered-logo-right-menu.has-header-cta
651
+ .cta-mirror {
652
+ grid-column: 1;
653
+ grid-row: 1;
654
+ margin-right: calc(var(--hamburger-nav-width) + 1rem);
655
+ }
656
+
657
+ /* Single page: no nav means no icon, so the button takes the right edge and the
658
+ leading mirror shrinks to just the button's width. */
659
+ .desktop-hamburger-horizontal-stack-centered-logo-right-menu.no-nav.has-header-cta {
660
+ grid-template-columns:
661
+ minmax(max-content, 1fr)
662
+ [logo-start] auto [right-start] minmax(max-content, 1fr);
663
+ }
664
+ .desktop-hamburger-horizontal-stack-centered-logo-right-menu.no-nav
665
+ .cta-container,
666
+ .desktop-hamburger-horizontal-stack-centered-logo-right-menu.no-nav
667
+ .cta-mirror {
668
+ /* Single page: no icon to reserve. */
669
+ margin-right: 0;
670
+ }
671
+
672
+ /* DESKTOP_HAMBURGER_NO_LOGO_1..3: button shows before the icon. */
673
+ .desktop-hamburger-no-logo-left-menu .cta-container,
674
+ .desktop-hamburger-no-logo-centered-menu .cta-container,
675
+ .desktop-hamburger-no-logo-right-menu .cta-container {
676
+ order: -1;
677
+ @apply tw-self-center tw-mr-4;
678
+ }
679
+
680
+ /* With the button on, icon + button always sit at the right whatever alignment the stored
681
+ style carries — the display-style picker is hidden in this state (HeaderDisplayStyle.vue). */
682
+ .desktop-hamburger-no-logo-left-menu.has-header-cta,
683
+ .desktop-hamburger-no-logo-centered-menu.has-header-cta {
684
+ @apply tw-justify-end;
685
+ }
686
+
687
+ /* MOBILE_HAMBURGER_1..4 with the nav hidden (single page): no side menu exists, so the button gets a full-width row below the logo. */
688
+ .mobile-hamburger-horizontal-stack-left-logo-right-menu.no-nav .cta-container,
689
+ .mobile-hamburger-horizontal-stack-centered-logo-right-menu.no-nav
690
+ .cta-container,
691
+ .mobile-hamburger-horizontal-stack-left-menu-centered-logo.no-nav
692
+ .cta-container,
693
+ .mobile-hamburger-horizontal-stack-left-menu-left-logo.no-nav .cta-container {
694
+ grid-column: 1 / -1;
695
+ @apply tw-w-full tw-mt-4;
696
+ }
697
+
698
+ /* Desktop placements: cap the button so a long label wraps to the next line (like the
699
+ banner's button) instead of stretching across the header. Mobile rows stay full-width. */
700
+ .desktop-tab-horizontal-stack-left-logo-right-menu .cta-container,
701
+ .desktop-tab-horizontal-stack-left-logo-left-menu .cta-container,
702
+ .desktop-tab-horizontal-stack-left-logo-centered-menu .cta-container,
703
+ .desktop-tab-horizontal-stack-centered-logo-right-menu .cta-container,
704
+ .desktop-tab-vertical-stack-centered-logo-centered-menu .cta-container,
705
+ .desktop-tab-vertical-stack-centered-menu-centered-logo .cta-container,
706
+ .desktop-tab-left-menu-no-logo .cta-container,
707
+ .desktop-tab-centered-menu-no-logo .cta-container,
708
+ .desktop-tab-right-menu-no-logo .cta-container,
709
+ .desktop-hamburger-horizontal-stack-left-logo-right-menu .cta-container,
710
+ .desktop-hamburger-horizontal-stack-centered-logo-right-menu .cta-container,
711
+ .desktop-hamburger-no-logo-left-menu .cta-container,
712
+ .desktop-hamburger-no-logo-centered-menu .cta-container,
713
+ .desktop-hamburger-no-logo-right-menu .cta-container {
714
+ max-width: var(--logo-max-width);
715
+ }
372
716
  </style>
373
717
 
374
718
  <style>