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.
- package/.claude/hooks/check-component-update.sh +30 -1
- package/.claude/skills/components/accordian-core.md +7 -7
- package/.claude/skills/components/breadcrumb.md +49 -0
- package/.claude/skills/components/content-docs.md +2 -1
- package/.claude/skills/components/expanding-panel.md +5 -5
- package/.claude/skills/components/navigation-items.md +1 -0
- package/.claude/skills/components/responsive-header.md +1 -0
- package/.claude/skills/components/service-detail.md +156 -0
- package/.claude/skills/components/services-card-grid.md +9 -9
- package/.claude/skills/components/services-card.md +82 -30
- package/.claude/skills/index.md +3 -1
- package/.claude/skills/qa-panel.md +2 -2
- package/.vscode/srcdev-component-breadcrumb.code-snippets +14 -0
- package/.vscode/srcdev-component-service-detail.code-snippets +49 -0
- package/.vscode/srcdev-component-services-card.code-snippets +108 -0
- package/app/components/01.atoms/content-wrappers/docs-pages/ContentDocs.vue +22 -16
- package/app/components/01.atoms/navigation/breadcrumb/Breadcrumb.vue +94 -0
- package/app/components/01.atoms/navigation/breadcrumb/CONSUMER-STYLING.md +32 -0
- package/app/components/01.atoms/navigation/breadcrumb/stories/Breadcrumb.stories.ts +87 -0
- package/app/components/01.atoms/navigation/breadcrumb/tests/Breadcrumb.spec.ts +87 -0
- package/app/components/01.atoms/navigation/breadcrumb/tests/__snapshots__/Breadcrumb.spec.ts.snap +13 -0
- package/app/components/02.molecules/expandable/accordian/AccordianCore.vue +5 -1
- package/app/components/02.molecules/expandable/accordian/tests/AccordianCore.spec.ts +22 -14
- package/app/components/02.molecules/expandable/accordian/tests/__snapshots__/AccordianCore.spec.ts.snap +42 -28
- package/app/components/02.molecules/expandable/expanding-panel/CONSUMER-STYLING.md +8 -10
- package/app/components/02.molecules/expandable/expanding-panel/ExpandingPanel.vue +15 -47
- package/app/components/02.molecules/expandable/expanding-panel/tests/__snapshots__/ExpandingPanel.spec.ts.snap +4 -12
- package/app/components/03.organisms/responsive-header/NavigationItems.vue +91 -4
- package/app/components/03.organisms/responsive-header/ResponsiveHeader.vue +5 -1
- package/app/components/03.organisms/responsive-header/tests/NavigationItems.spec.ts +2 -2
- package/app/components/03.organisms/responsive-header/tests/__snapshots__/NavigationItems.spec.ts.snap +13 -13
- package/app/components/03.organisms/responsive-header/tests/__snapshots__/ResponsiveHeader.spec.ts.snap +13 -13
- package/app/components/03.organisms/services/service-detail/CONSUMER-STYLING.md +181 -0
- package/app/components/03.organisms/services/service-detail/ServiceDetail.vue +480 -0
- package/app/components/03.organisms/services/service-detail/stories/ServiceDetail.stories.ts +282 -0
- package/app/components/03.organisms/services/service-detail/tests/ServiceDetail.spec.ts +270 -0
- package/app/components/03.organisms/services/service-detail/tests/__snapshots__/ServiceDetail.spec.ts.snap +99 -0
- package/app/components/03.organisms/services/services-card/CONSUMER-STYLING.md +129 -0
- package/app/components/03.organisms/services/services-card/ServicesCard.vue +153 -39
- package/app/components/03.organisms/services/services-card/stories/ServicesCard.stories.ts +65 -0
- package/app/components/03.organisms/services/services-card/tests/ServicesCard.spec.ts +82 -0
- package/app/components/03.organisms/services/services-card/tests/__snapshots__/ServicesCard.spec.ts.snap +13 -5
- package/app/components/03.organisms/services/services-grids/ServicesCardGrid.vue +3 -7
- package/app/components/03.organisms/services/services-grids/stories/ServicesCardGrid.stories.ts +126 -2
- package/app/components/03.organisms/services/services-grids/stories/ServicesSectionGrid.stories.ts +6 -0
- package/app/components/03.organisms/services/services-grids/tests/__snapshots__/ServicesCardGrid.spec.ts.snap +51 -27
- package/app/components/03.organisms/services/services-section/ServicesSection.vue +19 -0
- package/app/components/03.organisms/services/services-section/tests/__snapshots__/ServicesSection.spec.ts.snap +8 -8
- package/app/types/components/breadcrumb.ts +4 -0
- package/app/types/components/index.ts +1 -0
- package/package.json +2 -2
- package/app/pages/auto-grid.vue +0 -328
- package/app/pages/banner-video.vue +0 -238
- package/app/pages/forms/examples/buttons/index.vue +0 -259
- package/app/pages/forms/examples/material/checkbox-radio-panels.vue +0 -244
- package/app/pages/forms/examples/material/cssbattle.vue +0 -60
- package/app/pages/forms/examples/material/text-fields.vue +0 -910
- package/app/pages/grid-stack.vue +0 -252
- package/app/pages/index.vue +0 -127
- package/app/pages/page-hero-highlights.vue +0 -204
- package/app/pages/samaritan.vue +0 -327
- package/app/pages/typography/hero-text.vue +0 -97
- package/app/pages/typography/index.vue +0 -39
- package/app/pages/typography/page-body.vue +0 -171
- package/app/pages/typography/page-heading.vue +0 -76
- package/app/pages/typography/page-link.vue +0 -103
- package/app/pages/ui/accordian.vue +0 -211
- package/app/pages/ui/anchor-scroll-tab-navigation.vue +0 -191
- package/app/pages/ui/anchor-scroll.vue +0 -367
- package/app/pages/ui/animated-svg-text.vue +0 -85
- package/app/pages/ui/block-decorators.vue +0 -142
- package/app/pages/ui/card-core.vue +0 -82
- package/app/pages/ui/carousel-basic.vue +0 -292
- package/app/pages/ui/carousel-flip.vue +0 -449
- package/app/pages/ui/carousel-infinite.vue +0 -260
- package/app/pages/ui/clipped-panels.vue +0 -101
- package/app/pages/ui/contact-section.vue +0 -323
- package/app/pages/ui/container-glow.vue +0 -106
- package/app/pages/ui/content-width.vue +0 -126
- package/app/pages/ui/deep-expanding-menu.vue +0 -138
- package/app/pages/ui/display-avatar.vue +0 -253
- package/app/pages/ui/display-banner.vue +0 -78
- package/app/pages/ui/display-chip.vue +0 -367
- package/app/pages/ui/display-details.vue +0 -171
- package/app/pages/ui/display-dialog.vue +0 -344
- package/app/pages/ui/display-pill.vue +0 -396
- package/app/pages/ui/display-prompt.vue +0 -284
- package/app/pages/ui/display-toast.vue +0 -311
- package/app/pages/ui/expanding-panel.vue +0 -326
- package/app/pages/ui/glowing-border.vue +0 -111
- package/app/pages/ui/layout-content-docs.vue +0 -72
- package/app/pages/ui/layout-grid-a.vue +0 -96
- package/app/pages/ui/layout-grid-b.vue +0 -132
- package/app/pages/ui/magnetic-navigation.vue +0 -50
- package/app/pages/ui/marquee-scroller.vue +0 -99
- package/app/pages/ui/mask-element.vue +0 -104
- package/app/pages/ui/masonry-columns.vue +0 -55
- package/app/pages/ui/masonry-grid-ordered-experiment.vue +0 -79
- package/app/pages/ui/masonry-grid-ordered.vue +0 -56
- package/app/pages/ui/masonry-grid-sorted.vue +0 -55
- package/app/pages/ui/masonry-grid.vue +0 -55
- package/app/pages/ui/navigation/navigation-horizontal.vue +0 -484
- package/app/pages/ui/navigation/site-navigation/about.vue +0 -36
- package/app/pages/ui/navigation/site-navigation/contact.vue +0 -39
- package/app/pages/ui/navigation/site-navigation/index.vue +0 -38
- package/app/pages/ui/navigation/site-navigation/portfolio.vue +0 -43
- package/app/pages/ui/navigation/site-navigation/services.vue +0 -42
- package/app/pages/ui/navigation/tab-navigation.vue +0 -493
- package/app/pages/ui/page-row.vue +0 -127
- package/app/pages/ui/price-list.vue +0 -65
- package/app/pages/ui/profile-section.vue +0 -142
- package/app/pages/ui/qr-code/[componentName].vue +0 -218
- package/app/pages/ui/rotating-carousel.vue +0 -154
- package/app/pages/ui/scroll-reveal-image.vue +0 -483
- package/app/pages/ui/section-parallax.vue +0 -54
- package/app/pages/ui/services/colour-finder.vue +0 -43
- package/app/pages/ui/services/services-cards.vue +0 -57
- package/app/pages/ui/services/services-section/[slug].vue +0 -61
- package/app/pages/ui/services/services-sections-compact.vue +0 -64
- package/app/pages/ui/settings.vue +0 -54
- package/app/pages/ui/simple-grid.vue +0 -55
- package/app/pages/ui/slider-gallery.vue +0 -261
- package/app/pages/ui/tabs-y.vue +0 -107
- package/app/pages/ui/tabs.vue +0 -189
- package/app/pages/ui/tooltips.vue +0 -104
- 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
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
</
|
|
55
|
-
|
|
56
|
-
|
|
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
|
-
</
|
|
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`).
|