srcdev-nuxt-components 9.3.6 → 9.3.8

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 (126) hide show
  1. package/.claude/hooks/check-component-update.sh +30 -1
  2. package/.claude/skills/components/accordian-core.md +7 -7
  3. package/.claude/skills/components/breadcrumb.md +49 -0
  4. package/.claude/skills/components/content-docs.md +2 -1
  5. package/.claude/skills/components/expanding-panel.md +5 -5
  6. package/.claude/skills/components/navigation-items.md +1 -0
  7. package/.claude/skills/components/responsive-header.md +1 -0
  8. package/.claude/skills/components/service-detail.md +156 -0
  9. package/.claude/skills/components/services-card-grid.md +9 -9
  10. package/.claude/skills/components/services-card.md +82 -30
  11. package/.claude/skills/index.md +3 -1
  12. package/.claude/skills/qa-panel.md +2 -2
  13. package/.vscode/srcdev-component-breadcrumb.code-snippets +14 -0
  14. package/.vscode/srcdev-component-service-detail.code-snippets +49 -0
  15. package/.vscode/srcdev-component-services-card.code-snippets +108 -0
  16. package/app/components/01.atoms/content-wrappers/docs-pages/ContentDocs.vue +22 -16
  17. package/app/components/01.atoms/navigation/breadcrumb/Breadcrumb.vue +94 -0
  18. package/app/components/01.atoms/navigation/breadcrumb/CONSUMER-STYLING.md +32 -0
  19. package/app/components/01.atoms/navigation/breadcrumb/stories/Breadcrumb.stories.ts +87 -0
  20. package/app/components/01.atoms/navigation/breadcrumb/tests/Breadcrumb.spec.ts +87 -0
  21. package/app/components/01.atoms/navigation/breadcrumb/tests/__snapshots__/Breadcrumb.spec.ts.snap +13 -0
  22. package/app/components/02.molecules/expandable/accordian/AccordianCore.vue +5 -1
  23. package/app/components/02.molecules/expandable/accordian/tests/AccordianCore.spec.ts +22 -14
  24. package/app/components/02.molecules/expandable/accordian/tests/__snapshots__/AccordianCore.spec.ts.snap +42 -28
  25. package/app/components/02.molecules/expandable/expanding-panel/CONSUMER-STYLING.md +8 -10
  26. package/app/components/02.molecules/expandable/expanding-panel/ExpandingPanel.vue +15 -47
  27. package/app/components/02.molecules/expandable/expanding-panel/tests/__snapshots__/ExpandingPanel.spec.ts.snap +4 -12
  28. package/app/components/03.organisms/responsive-header/NavigationItems.vue +91 -4
  29. package/app/components/03.organisms/responsive-header/ResponsiveHeader.vue +5 -1
  30. package/app/components/03.organisms/responsive-header/tests/NavigationItems.spec.ts +2 -2
  31. package/app/components/03.organisms/responsive-header/tests/__snapshots__/NavigationItems.spec.ts.snap +13 -13
  32. package/app/components/03.organisms/responsive-header/tests/__snapshots__/ResponsiveHeader.spec.ts.snap +13 -13
  33. package/app/components/03.organisms/services/service-detail/CONSUMER-STYLING.md +181 -0
  34. package/app/components/03.organisms/services/service-detail/ServiceDetail.vue +480 -0
  35. package/app/components/03.organisms/services/service-detail/stories/ServiceDetail.stories.ts +282 -0
  36. package/app/components/03.organisms/services/service-detail/tests/ServiceDetail.spec.ts +270 -0
  37. package/app/components/03.organisms/services/service-detail/tests/__snapshots__/ServiceDetail.spec.ts.snap +99 -0
  38. package/app/components/03.organisms/services/services-card/CONSUMER-STYLING.md +129 -0
  39. package/app/components/03.organisms/services/services-card/ServicesCard.vue +153 -39
  40. package/app/components/03.organisms/services/services-card/stories/ServicesCard.stories.ts +65 -0
  41. package/app/components/03.organisms/services/services-card/tests/ServicesCard.spec.ts +82 -0
  42. package/app/components/03.organisms/services/services-card/tests/__snapshots__/ServicesCard.spec.ts.snap +13 -5
  43. package/app/components/03.organisms/services/services-grids/ServicesCardGrid.vue +3 -7
  44. package/app/components/03.organisms/services/services-grids/stories/ServicesCardGrid.stories.ts +126 -2
  45. package/app/components/03.organisms/services/services-grids/stories/ServicesSectionGrid.stories.ts +6 -0
  46. package/app/components/03.organisms/services/services-grids/tests/__snapshots__/ServicesCardGrid.spec.ts.snap +51 -27
  47. package/app/components/03.organisms/services/services-section/ServicesSection.vue +19 -0
  48. package/app/components/03.organisms/services/services-section/tests/__snapshots__/ServicesSection.spec.ts.snap +8 -8
  49. package/app/types/components/breadcrumb.ts +4 -0
  50. package/app/types/components/index.ts +1 -0
  51. package/package.json +2 -2
  52. package/app/pages/auto-grid.vue +0 -328
  53. package/app/pages/banner-video.vue +0 -238
  54. package/app/pages/forms/examples/buttons/index.vue +0 -259
  55. package/app/pages/forms/examples/material/checkbox-radio-panels.vue +0 -244
  56. package/app/pages/forms/examples/material/cssbattle.vue +0 -60
  57. package/app/pages/forms/examples/material/text-fields.vue +0 -910
  58. package/app/pages/grid-stack.vue +0 -252
  59. package/app/pages/index.vue +0 -127
  60. package/app/pages/page-hero-highlights.vue +0 -204
  61. package/app/pages/samaritan.vue +0 -327
  62. package/app/pages/typography/hero-text.vue +0 -97
  63. package/app/pages/typography/index.vue +0 -39
  64. package/app/pages/typography/page-body.vue +0 -171
  65. package/app/pages/typography/page-heading.vue +0 -76
  66. package/app/pages/typography/page-link.vue +0 -103
  67. package/app/pages/ui/accordian.vue +0 -211
  68. package/app/pages/ui/anchor-scroll-tab-navigation.vue +0 -191
  69. package/app/pages/ui/anchor-scroll.vue +0 -367
  70. package/app/pages/ui/animated-svg-text.vue +0 -85
  71. package/app/pages/ui/block-decorators.vue +0 -142
  72. package/app/pages/ui/card-core.vue +0 -82
  73. package/app/pages/ui/carousel-basic.vue +0 -292
  74. package/app/pages/ui/carousel-flip.vue +0 -449
  75. package/app/pages/ui/carousel-infinite.vue +0 -260
  76. package/app/pages/ui/clipped-panels.vue +0 -101
  77. package/app/pages/ui/contact-section.vue +0 -323
  78. package/app/pages/ui/container-glow.vue +0 -106
  79. package/app/pages/ui/content-width.vue +0 -126
  80. package/app/pages/ui/deep-expanding-menu.vue +0 -138
  81. package/app/pages/ui/display-avatar.vue +0 -253
  82. package/app/pages/ui/display-banner.vue +0 -78
  83. package/app/pages/ui/display-chip.vue +0 -367
  84. package/app/pages/ui/display-details.vue +0 -171
  85. package/app/pages/ui/display-dialog.vue +0 -344
  86. package/app/pages/ui/display-pill.vue +0 -396
  87. package/app/pages/ui/display-prompt.vue +0 -284
  88. package/app/pages/ui/display-toast.vue +0 -311
  89. package/app/pages/ui/expanding-panel.vue +0 -326
  90. package/app/pages/ui/glowing-border.vue +0 -111
  91. package/app/pages/ui/layout-content-docs.vue +0 -72
  92. package/app/pages/ui/layout-grid-a.vue +0 -96
  93. package/app/pages/ui/layout-grid-b.vue +0 -132
  94. package/app/pages/ui/magnetic-navigation.vue +0 -50
  95. package/app/pages/ui/marquee-scroller.vue +0 -99
  96. package/app/pages/ui/mask-element.vue +0 -104
  97. package/app/pages/ui/masonry-columns.vue +0 -55
  98. package/app/pages/ui/masonry-grid-ordered-experiment.vue +0 -79
  99. package/app/pages/ui/masonry-grid-ordered.vue +0 -56
  100. package/app/pages/ui/masonry-grid-sorted.vue +0 -55
  101. package/app/pages/ui/masonry-grid.vue +0 -55
  102. package/app/pages/ui/navigation/navigation-horizontal.vue +0 -484
  103. package/app/pages/ui/navigation/site-navigation/about.vue +0 -36
  104. package/app/pages/ui/navigation/site-navigation/contact.vue +0 -39
  105. package/app/pages/ui/navigation/site-navigation/index.vue +0 -38
  106. package/app/pages/ui/navigation/site-navigation/portfolio.vue +0 -43
  107. package/app/pages/ui/navigation/site-navigation/services.vue +0 -42
  108. package/app/pages/ui/navigation/tab-navigation.vue +0 -493
  109. package/app/pages/ui/page-row.vue +0 -127
  110. package/app/pages/ui/price-list.vue +0 -65
  111. package/app/pages/ui/profile-section.vue +0 -142
  112. package/app/pages/ui/qr-code/[componentName].vue +0 -218
  113. package/app/pages/ui/rotating-carousel.vue +0 -154
  114. package/app/pages/ui/scroll-reveal-image.vue +0 -483
  115. package/app/pages/ui/section-parallax.vue +0 -54
  116. package/app/pages/ui/services/colour-finder.vue +0 -43
  117. package/app/pages/ui/services/services-cards.vue +0 -57
  118. package/app/pages/ui/services/services-section/[slug].vue +0 -61
  119. package/app/pages/ui/services/services-sections-compact.vue +0 -64
  120. package/app/pages/ui/settings.vue +0 -54
  121. package/app/pages/ui/simple-grid.vue +0 -55
  122. package/app/pages/ui/slider-gallery.vue +0 -261
  123. package/app/pages/ui/tabs-y.vue +0 -107
  124. package/app/pages/ui/tabs.vue +0 -189
  125. package/app/pages/ui/tooltips.vue +0 -104
  126. package/app/pages/ui/wipe-away-vertical.vue +0 -129
@@ -39,24 +39,24 @@ exports[`ResponsiveHeader > renders correct HTML structure with default props 1`
39
39
  <li class="overflow-navigation-item visible is-active" style="--_main-navigation-item-width: 0px;" data-group-key="firstNav" data-local-index="0" role="none"><a href="/" class="overflow-navigation-link" role="menuitem"><span class="overflow-navigation-text">Home</span></a></li>
40
40
  <li class="overflow-navigation-item visible" style="--_main-navigation-item-width: 0px;" data-group-key="firstNav" data-local-index="1" role="none"><a href="/about" class="overflow-navigation-link" role="menuitem"><span class="overflow-navigation-text">About</span></a></li>
41
41
  <li class="overflow-navigation-item visible" style="--_main-navigation-item-width: 0px;" data-group-key="firstNav" data-local-index="2" role="none">
42
- <div class="expanding-panel overflow-navigation-details">
43
- <details class="expanding-panel-details" name="overflow-navigation-group">
44
- <summary id="id-overflow-navigation-group-trigger" class="expanding-panel-summary" aria-controls="id-overflow-navigation-group-content" aria-expanded="false">
42
+ <div class="expanding-panel-classic overflow-navigation-details">
43
+ <details class="expanding-panel-classic-details" name="overflow-navigation-group">
44
+ <summary id="id-overflow-navigation-group-trigger" class="expanding-panel-classic-summary" aria-controls="id-overflow-navigation-group-content" aria-expanded="false">
45
45
  <div class="label-wrapper"><span class="overflow-navigation-text" aria-label="UI Components submenu" role="menuitem" aria-haspopup="true">UI Components</span></div>
46
46
  <div class="icon-wrapper"><span class="iconify i-mdi:chevron-down icon" aria-hidden="true"></span></div>
47
47
  </summary>
48
- <div id="id-overflow-navigation-group-content" class="expanding-panel-content" aria-labelledby="id-overflow-navigation-group-trigger" role="region">
49
- <div class="inner">
50
- <div class="overflow-navigation-sub-nav-inner">
51
- <ul class="overflow-navigation-sub-nav-list">
52
- <li class="overflow-navigation-sub-nav-item"><a href="/forms/examples/buttons" class="overflow-navigation-sub-nav-link" role="menuitem"><span class="overflow-navigation-sub-nav-text">Buttons</span></a></li>
53
- <li class="overflow-navigation-sub-nav-item"><a href="/ui/tabs" class="overflow-navigation-sub-nav-link" role="menuitem"><span class="overflow-navigation-sub-nav-text">Tabs</span></a></li>
54
- </ul>
55
- <div aria-hidden="true" class="overflow-sub-nav-indicator-hovered"></div>
56
- </div>
48
+ </details>
49
+ <div id="id-overflow-navigation-group-content" class="expanding-panel-classic-content" aria-labelledby="id-overflow-navigation-group-trigger" role="region">
50
+ <div class="inner">
51
+ <div class="overflow-navigation-sub-nav-inner">
52
+ <ul class="overflow-navigation-sub-nav-list">
53
+ <li class="overflow-navigation-sub-nav-item"><a href="/forms/examples/buttons" class="overflow-navigation-sub-nav-link" role="menuitem"><span class="overflow-navigation-sub-nav-text">Buttons</span></a></li>
54
+ <li class="overflow-navigation-sub-nav-item"><a href="/ui/tabs" class="overflow-navigation-sub-nav-link" role="menuitem"><span class="overflow-navigation-sub-nav-text">Tabs</span></a></li>
55
+ </ul>
56
+ <div aria-hidden="true" class="overflow-sub-nav-indicator-hovered"></div>
57
57
  </div>
58
58
  </div>
59
- </details>
59
+ </div>
60
60
  </div>
61
61
  </li>
62
62
  </ul>
@@ -0,0 +1,181 @@
1
+ # ServiceDetail — Consumer Styling Guide
2
+
3
+ ## Public token API
4
+
5
+ ### Hero banner
6
+
7
+ | Token | Default | Controls |
8
+ |---|---|---|
9
+ | `--service-detail-hero-border-radius` | `0.8rem` | Corner rounding on the hero image |
10
+ | `--service-detail-hero-min-height` | `32rem` | Minimum height of the hero banner |
11
+ | `--service-detail-hero-padding` | `2.4rem` | Padding around the breadcrumb/title/pills content |
12
+ | `--service-detail-hero-scrim` | `linear-gradient(0deg, rgb(0 0 0 / 70%) 0%, rgb(0 0 0 / 10%) 60%, transparent 100%)` | Overlay gradient behind the hero text, for legibility over the image |
13
+ | `--service-detail-hero-text-colour` | `white` | Colour of the breadcrumb, eyebrow, and title over the hero image |
14
+ | `--service-detail-breadcrumb-margin-block-end` | `0.8rem` | Space below the breadcrumb |
15
+ | `--service-detail-hero-pills-gap` | `0.8rem` | Gap between the duration and price pills |
16
+ | `--service-detail-hero-pill-bg` | `transparent` | Background of the price/duration pills (via `DisplayPill`'s `--theme-pill-bg`) |
17
+ | `--service-detail-hero-pill-border-colour` | `currentColor` | Border colour of the price/duration pills |
18
+
19
+ ### Body layout
20
+
21
+ | Token | Default | Controls |
22
+ |---|---|---|
23
+ | `--service-detail-body-gap` | `3rem` | Gap between the main column and sidebar |
24
+ | `--service-detail-body-margin-block-start` | `3rem` | Space above the two-column body |
25
+ | `--service-detail-main-section-gap` | `2.4rem` | Gap between stacked sections in the main column |
26
+
27
+ The body becomes two columns at a **900px container width** (`@container`, not viewport) — the
28
+ main column is flexible, the sidebar is `minmax(28rem, 34rem)`.
29
+
30
+ ### Process / Ideal For / FAQs
31
+
32
+ The process list is rendered with `StepperList` (`indicator-variant="circle"`, connectors on) —
33
+ these tokens are `ServiceDetail`'s own names, mapped internally onto the matching
34
+ `--stepper-list-*` tokens scoped to `.service-detail__process`:
35
+
36
+ | Token | Default | Controls |
37
+ |---|---|---|
38
+ | `--service-detail-process-step-gap` | `1.6rem` | Gap between the number circle and its text (`--stepper-list-gap`) |
39
+ | `--service-detail-process-step-padding-block` | `1.6rem` | Vertical padding per process step (`--stepper-list-padding-block`) |
40
+ | `--service-detail-process-divider-colour` | `currentColor` | Connector line between process steps (`--stepper-list-connector-color`) |
41
+ | `--service-detail-process-index-colour` | `var(--colour-text-accent)` | Colour and border of the step number circles (`--stepper-list-counter-circle-text`/`-border`) |
42
+ | `--service-detail-process-index-font-size` | `1.4rem` | Font size of the step numbers (`--stepper-list-counter-font-size`) |
43
+
44
+ For anything not covered by these (e.g. the circle's own size, `--stepper-list-counter-size`),
45
+ target `--stepper-list-*` directly under `.service-detail__process` — see
46
+ [stepper-list.md](../../../../../.claude/skills/components/stepper-list.md) for the full token API.
47
+
48
+ | Token | Default | Controls |
49
+ |---|---|---|
50
+ | `--service-detail-ideal-for-gap` | `1.2rem` | Gap between ideal-for cards |
51
+ | `--service-detail-ideal-for-item-gap` | `1rem` | Gap between icon and text within a card |
52
+ | `--service-detail-ideal-for-item-padding` | `1.6rem` | Padding inside a card |
53
+ | `--service-detail-ideal-for-item-background` | `var(--slate-09)` | Card background colour |
54
+ | `--service-detail-ideal-for-item-border-colour` | `var(--slate-06)` | Card border colour |
55
+ | `--service-detail-ideal-for-item-border-radius` | `0.4rem` | Card corner rounding |
56
+ | `--service-detail-ideal-for-icon-size` | `1.6rem` | Icon size |
57
+ | `--service-detail-ideal-for-icon-colour` | `var(--colour-text-accent)` | Icon colour |
58
+ | `--service-detail-faq-padding-block` | `1.6rem` | Vertical padding per FAQ entry |
59
+ | `--service-detail-faq-divider-colour` | `currentColor` | Divider line between FAQ entries |
60
+ | `--service-detail-faq-question-font-size` | `1.6rem` | FAQ question font size |
61
+ | `--service-detail-faq-question-margin-block-end` | `0.8rem` | Space between an FAQ question and its answer |
62
+
63
+ The ideal-for grid becomes 2 columns at a **500px container width**.
64
+
65
+ ### Sidebar
66
+
67
+ | Token | Default | Controls |
68
+ |---|---|---|
69
+ | `--service-detail-sidebar-gap` | `2rem` | Gap between the booking card and related-services block |
70
+ | `--service-detail-sidebar-sticky-offset` | `2rem` | `top` offset while the sidebar is stuck |
71
+ | `--service-detail-sidebar-label-font-size` | `1.2rem` | Font size of "Book This Service" / "You May Also Like" labels |
72
+ | `--service-detail-sidebar-label-margin-block-end` | `1.6rem` | Space below a sidebar label |
73
+ | `--service-detail-sidebar-label-letter-spacing` | `0.05em` | Letter spacing of a sidebar label |
74
+ | `--service-detail-booking-card-padding` | `2.4rem` | Padding inside the booking `GlassPanel` |
75
+ | `--service-detail-sidebar-row-gap` | `1rem` | Gap between a row's label and value |
76
+ | `--service-detail-sidebar-row-padding-block` | `1rem` | Vertical padding per price/duration/location row |
77
+ | `--service-detail-sidebar-row-divider-colour` | `currentColor` | Divider line above each price/duration/location row |
78
+ | `--service-detail-sidebar-row-label-font-size` | `1.2rem` | Font size of a row's label (e.g. "Price") |
79
+ | `--service-detail-sidebar-note-font-size` | `1.2rem` | Font size of the `sidebar-note` slot content |
80
+ | `--service-detail-sidebar-note-margin-block-start` | `1.2rem` | Space above the `sidebar-note` slot content |
81
+ | `--service-detail-related-items-gap` | `1rem` | Gap between related-service item cards |
82
+ | `--service-detail-related-item-background` | `var(--slate-09)` | Background colour of a related-service item's card |
83
+ | `--service-detail-related-item-padding` | `1rem` | Padding inside a related-service item's card |
84
+ | `--service-detail-related-item-border-colour` | `var(--slate-06)` | Border colour of a related-service item's card |
85
+ | `--service-detail-related-item-border-radius` | `0.4rem` | Corner rounding of a related-service item's card |
86
+ | `--service-detail-related-item-gap` | `1.2rem` | Gap between a related item's thumbnail and its text |
87
+ | `--service-detail-related-image-size` | `5.6rem` | Width/height of a related-service thumbnail |
88
+ | `--service-detail-related-image-border-radius` | `0.4rem` | Corner rounding of a related-service thumbnail |
89
+ | `--service-detail-related-price-font-size` | `1.2rem` | Font size of a related item's price |
90
+ | `--service-detail-muted-opacity` | `0.7` | Opacity shared by every secondary/muted text element (sidebar label, sidebar note, related price, final CTA body) |
91
+
92
+ The booking card is a `GlassPanel` — its own `--glass-panel-*` tokens also apply.
93
+
94
+ ### Final CTA banner
95
+
96
+ | Token | Default | Controls |
97
+ |---|---|---|
98
+ | `--service-detail-final-cta-gap` | `1.6rem` | Gap between the copy and the `final-cta` slot content |
99
+ | `--service-detail-final-cta-margin-block-start` | `4rem` | Space above the banner |
100
+ | `--service-detail-final-cta-padding-block-start` | `3.2rem` | Padding above the banner content, below its divider |
101
+ | `--service-detail-final-cta-divider-colour` | `currentColor` | Divider line above the banner |
102
+
103
+ The banner becomes a single row (copy left, CTA right) at a **700px container width**.
104
+
105
+ ---
106
+
107
+ ## Text content — props, not CSS
108
+
109
+ Section headings, sidebar labels, and CTA copy are **props**, not hardcoded strings:
110
+
111
+ | Prop | Default |
112
+ |---|---|
113
+ | `processHeading` | `"The Process"` |
114
+ | `idealForHeading` | `"Ideal For"` |
115
+ | `maintenanceHeading` | `"Aftercare & Maintenance"` |
116
+ | `faqsHeading` | `"Frequently Asked Questions"` |
117
+ | `bookingHeading` | `"Book This Service"` |
118
+ | `priceLabel` | `"Price"` |
119
+ | `durationLabel` | `"Duration"` |
120
+ | `locationLabel` | `"Location"` |
121
+ | `relatedServicesHeading` | `"You May Also Like"` |
122
+ | `finalCtaHeading` | `"Ready to book your appointment?"` |
123
+ | `finalCtaBody` | `"Get in touch to book your appointment."` |
124
+
125
+ ```vue
126
+ <ServiceDetail
127
+ :service-data="service"
128
+ final-cta-heading="Ready to book your colour appointment?"
129
+ final-cta-body="Mobile service across Bath — I come to you."
130
+ />
131
+ ```
132
+
133
+ ---
134
+
135
+ ## Global theming — recommended approach
136
+
137
+ ```css
138
+ /* assets/styles/setup/07.components/service-detail.css */
139
+ :root {
140
+ --service-detail-hero-border-radius: 1.2rem;
141
+ --service-detail-process-index-colour: var(--brand-accent);
142
+ --service-detail-ideal-for-icon-colour: var(--brand-accent);
143
+ }
144
+ ```
145
+
146
+ ## Page-scoped overrides
147
+
148
+ ```css
149
+ .our-services-page {
150
+ .service-detail {
151
+ --service-detail-body-gap: 4rem;
152
+ --service-detail-sidebar-sticky-offset: 8rem; /* clear a fixed site header */
153
+ }
154
+ }
155
+ ```
156
+
157
+ ---
158
+
159
+ ## Notes
160
+
161
+ - Routing is entirely delegated to the consumer via slots: `book-cta` (scoped `serviceData`),
162
+ `final-cta` (scoped `serviceData`), and `related-service` (scoped `service`, `index`) — same
163
+ pattern as `ServicesSection`'s `cta`/`summary-link` slots. Only `sidebar-note` has no scoped
164
+ data (it's plain content, e.g. patch-test wording).
165
+ - `related-service`'s fallback content is a non-clickable thumbnail + title + price — pass the
166
+ slot yourself to wrap it in a real link once you have a routing convention.
167
+ - The `location` row and the entire "You May Also Like" block only render when `location` /
168
+ `relatedServices` are actually passed — neither exists on the shared `Service` type, so nothing
169
+ breaks for consumer apps that don't have this data.
170
+ - `breadcrumbItems` defaults to a plain, non-linked `[category, title]` trail built from
171
+ `serviceData` — pass real `to` routes once your app's URL structure is known.
172
+ - `headerTag` (default `"h1"`) controls only the hero title; `subheadingTag` (default `"h2"`)
173
+ controls every other heading in the component (What Is It, Process, Ideal For, Aftercare, FAQs,
174
+ final CTA) — unlike `ServicesSection`, which uses one `headerTag` prop for all of them. This
175
+ component is meant to be the whole page's `<h1>`, so its subheadings need their own level.
176
+ - The FAQ question is a hardcoded `<h3>` — if you set `subheadingTag="h3"`, the FAQ questions will
177
+ sit at the same level as their own section heading rather than one below it.
178
+ - Two-/three-column breakpoints (900px body, 500px ideal-for grid, 700px final CTA) use
179
+ `@container` queries against the component's own width, not the viewport — they are not tokens
180
+ since resizing them would need corresponding `minmax()`/`grid-template-columns` changes too, not
181
+ just spacing (same rationale as `ServicesSection`'s `--services-section-grid-gap-desktop`).