srcdev-nuxt-components 9.1.28 → 9.1.30

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 (82) hide show
  1. package/.claude/settings.json +7 -2
  2. package/.claude/settings.local.json +2 -1
  3. package/.claude/skills/components/banner-video.md +178 -0
  4. package/.claude/skills/components/grid-stack.md +133 -0
  5. package/.claude/skills/components/scroll-reveal-frame.md +136 -0
  6. package/.claude/skills/components/scroll-reveal-image.md +161 -0
  7. package/.claude/skills/index.md +9 -1
  8. package/.claude/skills/new-app-scaffold.md +301 -0
  9. package/.claude/skills/setup-postinstall.md +45 -0
  10. package/.claude/skills/theming-override-default.md +6 -0
  11. package/.claude/skills/theming-partial-override.md +131 -0
  12. package/.claude/skills/vue-video-autoplay.md +74 -0
  13. package/README.md +30 -5
  14. package/app/components/01.atoms/banner-video/BannerVideo.vue +207 -0
  15. package/app/components/01.atoms/banner-video/stories/BannerVideo.stories.ts +180 -0
  16. package/app/components/01.atoms/banner-video/tests/BannerVideo.spec.ts +350 -0
  17. package/app/components/01.atoms/banner-video/tests/__snapshots__/BannerVideo.spec.ts.snap +13 -0
  18. package/app/components/01.atoms/grid-stack/GridStack.vue +34 -0
  19. package/app/components/01.atoms/grid-stack/stories/GridStack.stories.ts +162 -0
  20. package/app/components/01.atoms/grid-stack/tests/GridStack.spec.ts +66 -0
  21. package/app/components/01.atoms/scroll-reveal-frame/ScrollRevealFrame.vue +125 -0
  22. package/app/components/01.atoms/scroll-reveal-frame/stories/ScrollRevealFrame.stories.ts +166 -0
  23. package/app/components/01.atoms/scroll-reveal-frame/tests/ScrollRevealFrame.spec.ts +148 -0
  24. package/app/components/01.atoms/scroll-reveal-frame/tests/__snapshots__/ScrollRevealFrame.spec.ts.snap +13 -0
  25. package/app/components/01.atoms/scroll-reveal-image/ScrollRevealImage.vue +96 -0
  26. package/app/components/01.atoms/scroll-reveal-image/stories/ScrollRevealImage.stories.ts +181 -0
  27. package/app/components/01.atoms/scroll-reveal-image/tests/ScrollRevealImage.spec.ts +235 -0
  28. package/app/components/01.atoms/scroll-reveal-image/tests/__snapshots__/ScrollRevealImage.spec.ts.snap +13 -0
  29. package/app/components/03.organisms/services/services-card/stories/ServicesCard.stories.ts +1 -0
  30. package/app/components/03.organisms/services/services-card/tests/ServicesCard.spec.ts +1 -0
  31. package/app/components/03.organisms/services/services-grids/stories/ServicesCardGrid.stories.ts +1 -0
  32. package/app/components/03.organisms/services/services-grids/stories/ServicesSectionGrid.stories.ts +1 -0
  33. package/app/components/03.organisms/services/services-grids/tests/ServicesCardGrid.spec.ts +1 -0
  34. package/app/components/03.organisms/services/services-grids/tests/ServicesSectionGrid.spec.ts +1 -0
  35. package/app/components/03.organisms/services/services-grids/tests/__snapshots__/ServicesSectionGrid.spec.ts.snap +3 -3
  36. package/app/components/03.organisms/services/services-section/stories/ServicesSection.stories.ts +1 -0
  37. package/app/components/03.organisms/services/services-section/tests/ServicesSection.spec.ts +1 -0
  38. package/app/components/03.organisms/services/services-section/tests/__snapshots__/ServicesSection.spec.ts.snap +1 -1
  39. package/app/layouts/default.vue +2 -0
  40. package/app/pages/banner-video.vue +238 -0
  41. package/app/pages/grid-stack.vue +252 -0
  42. package/app/pages/index.vue +5 -0
  43. package/app/pages/ui/scroll-reveal-image.vue +483 -0
  44. package/app/types/types.services.ts +1 -0
  45. package/package.json +1 -1
  46. package/app/assets/styles/extends-layer/srcdev-components/components/_display-prompt-core.css +0 -94
  47. package/app/assets/styles/extends-layer/srcdev-components/components/_display-toast.css +0 -5
  48. package/app/assets/styles/extends-layer/srcdev-components/components/_expanding-panel.css +0 -37
  49. package/app/assets/styles/extends-layer/srcdev-components/components/index.css +0 -3
  50. package/app/assets/styles/extends-layer/srcdev-components/index.css +0 -1
  51. package/app/assets/styles/extends-layer/srcdev-forms/components/_form-fieldset.css +0 -38
  52. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-button.css +0 -67
  53. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-checkbox-radio-core.css +0 -87
  54. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-checkbox-radio-options-button.css +0 -74
  55. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-checkbox-radio-with-label.css +0 -14
  56. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-description.css +0 -13
  57. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-error.css +0 -54
  58. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-label.css +0 -21
  59. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-select.css +0 -143
  60. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-text.css +0 -190
  61. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-textarea.css +0 -96
  62. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-toggle-switch.css +0 -68
  63. package/app/assets/styles/extends-layer/srcdev-forms/components/index.css +0 -12
  64. package/app/assets/styles/extends-layer/srcdev-forms/index.css +0 -2
  65. package/app/assets/styles/extends-layer/srcdev-forms/setup/_generic.css +0 -21
  66. package/app/assets/styles/extends-layer/srcdev-forms/setup/index.css +0 -3
  67. package/app/assets/styles/extends-layer/srcdev-forms/setup/sizes/_default.css +0 -13
  68. package/app/assets/styles/extends-layer/srcdev-forms/setup/sizes/_large.css +0 -12
  69. package/app/assets/styles/extends-layer/srcdev-forms/setup/sizes/_medium.css +0 -12
  70. package/app/assets/styles/extends-layer/srcdev-forms/setup/sizes/_small.css +0 -12
  71. package/app/assets/styles/extends-layer/srcdev-forms/setup/sizes/_x-small.css +0 -11
  72. package/app/assets/styles/extends-layer/srcdev-forms/setup/sizes/index.css +0 -23
  73. package/app/assets/styles/extends-layer/srcdev-forms/setup/themes/_default.css +0 -62
  74. package/app/assets/styles/extends-layer/srcdev-forms/setup/themes/_error.css +0 -63
  75. package/app/assets/styles/extends-layer/srcdev-forms/setup/themes/_ghost.css +0 -63
  76. package/app/assets/styles/extends-layer/srcdev-forms/setup/themes/_info.css +0 -63
  77. package/app/assets/styles/extends-layer/srcdev-forms/setup/themes/_primary.css +0 -66
  78. package/app/assets/styles/extends-layer/srcdev-forms/setup/themes/_secondary.css +0 -64
  79. package/app/assets/styles/extends-layer/srcdev-forms/setup/themes/_success.css +0 -63
  80. package/app/assets/styles/extends-layer/srcdev-forms/setup/themes/_tertiary.css +0 -63
  81. package/app/assets/styles/extends-layer/srcdev-forms/setup/themes/_warning.css +0 -63
  82. package/app/assets/styles/extends-layer/srcdev-forms/setup/themes/index.css +0 -7
@@ -0,0 +1,483 @@
1
+ <template>
2
+ <div>
3
+ <NuxtLayout name="default">
4
+ <template #layout-content>
5
+ <!-- ── Page header ──────────────────────────────────────────────── -->
6
+ <LayoutRow tag="div" variant="content" :style-class-passthrough="['mbe-48']">
7
+ <h1 class="page-heading-1">ScrollRevealImage / ScrollRevealFrame</h1>
8
+ <p class="page-body-normal">
9
+ A pure-CSS parallax reveal. No scroll listeners, no JS animation — driven entirely by
10
+ <code>animation-timeline: view()</code>
11
+ . Scroll down to see each variant in action.
12
+ </p>
13
+ <p class="page-body-normal">
14
+ <code>ScrollRevealFrame</code>
15
+ is the generic primitive — it accepts any slot content (images, grids, video).
16
+ <code>ScrollRevealImage</code>
17
+ is a convenience wrapper that adds
18
+ <code>NuxtImg</code>
19
+ optimisation and a horizontal focal-point prop.
20
+ </p>
21
+ </LayoutRow>
22
+
23
+ <!-- ── Interactive demo ──────────────────────────────────────────── -->
24
+ <LayoutRow tag="div" variant="content" :style-class-passthrough="['mbe-48']">
25
+ <h2 class="page-heading-2 mbe-8">Interactive demo</h2>
26
+ <p class="page-body-normal mbe-16">Adjust the props then scroll through the image on the right.</p>
27
+ <div class="demo-controls">
28
+ <p class="demo-controls__heading">Props</p>
29
+ <div class="demo-controls__fields">
30
+ <MultipleRadiobuttons
31
+ v-model="frameHeight"
32
+ v-model:field-data="frameHeightData"
33
+ name="frameHeight"
34
+ legend="frameHeight"
35
+ label="frameHeight"
36
+ error-message=""
37
+ :is-button="true"
38
+ :is-pill="true"
39
+ :field-has-error="false"
40
+ options-layout="inline"
41
+ />
42
+ <MultipleRadiobuttons
43
+ v-model="parallaxOffset"
44
+ v-model:field-data="parallaxOffsetData"
45
+ name="parallaxOffset"
46
+ legend="parallaxOffset"
47
+ label="parallaxOffset"
48
+ error-message=""
49
+ :is-button="true"
50
+ :is-pill="true"
51
+ :field-has-error="false"
52
+ options-layout="inline"
53
+ />
54
+ <MultipleRadiobuttons
55
+ v-model="focalX"
56
+ v-model:field-data="focalXData"
57
+ name="focalX"
58
+ legend="focalX"
59
+ label="focalX"
60
+ error-message=""
61
+ :is-button="true"
62
+ :is-pill="true"
63
+ :field-has-error="false"
64
+ options-layout="inline"
65
+ />
66
+ <MultipleRadiobuttons
67
+ v-model="radius"
68
+ v-model:field-data="radiusData"
69
+ name="radius"
70
+ legend="radius"
71
+ label="radius"
72
+ error-message=""
73
+ :is-button="true"
74
+ :is-pill="true"
75
+ :field-has-error="false"
76
+ options-layout="inline"
77
+ />
78
+ </div>
79
+ </div>
80
+ </LayoutRow>
81
+
82
+ <!-- ── Variants ──────────────────────────────────────────────────── -->
83
+ <LayoutRow tag="div" variant="content" :style-class-passthrough="['mbe-24']">
84
+ <h2 class="page-heading-2">Variants</h2>
85
+ </LayoutRow>
86
+
87
+ <!-- Default -->
88
+ <LayoutRow tag="div" variant="content" :style-class-passthrough="['mbe-32']">
89
+ <div class="sri-demo-row">
90
+ <div class="sri-demo-row__info">
91
+ <h3 class="page-heading-3 mbe-8">Default</h3>
92
+ <p class="page-body-normal mbe-12">
93
+ All props at their default values. A portrait image with a generous parallax offset panning from top to
94
+ bottom as the frame crosses the viewport.
95
+ </p>
96
+ <dl class="sri-props">
97
+ <dt>frameHeight</dt>
98
+ <dd>540px</dd>
99
+ <dt>parallaxOffset</dt>
100
+ <dd>36rem</dd>
101
+ <dt>focalX</dt>
102
+ <dd>50%</dd>
103
+ </dl>
104
+ </div>
105
+ <ScrollRevealImage
106
+ src="/images/page/hero/hero-blonde.jpg"
107
+ alt="Blonde hair portrait"
108
+ :img-width="1280"
109
+ :img-height="1920"
110
+ />
111
+ </div>
112
+ </LayoutRow>
113
+
114
+ <!-- Short frame / banner -->
115
+ <LayoutRow tag="div" variant="content" :style-class-passthrough="['mbe-32']">
116
+ <div class="sri-demo-row">
117
+ <div class="sri-demo-row__info">
118
+ <h3 class="page-heading-3 mbe-8">Short frame — landscape image</h3>
119
+ <p class="page-body-normal mbe-12">
120
+ A shallow frame with a wide banner image. The reduced
121
+ <code>parallaxOffset</code>
122
+ is proportional to the shorter frame height.
123
+ </p>
124
+ <dl class="sri-props">
125
+ <dt>frameHeight</dt>
126
+ <dd>320px</dd>
127
+ <dt>parallaxOffset</dt>
128
+ <dd>24rem</dd>
129
+ </dl>
130
+ </div>
131
+ <ScrollRevealImage
132
+ src="/images/banners/banner-mid-brown.webp"
133
+ alt="Mid brown hair banner"
134
+ :img-width="1920"
135
+ :img-height="800"
136
+ frame-height="320px"
137
+ parallax-offset="24rem"
138
+ />
139
+ </div>
140
+ </LayoutRow>
141
+
142
+ <!-- Rounded corners -->
143
+ <LayoutRow tag="div" variant="content" :style-class-passthrough="['mbe-32']">
144
+ <div class="sri-demo-row">
145
+ <div class="sri-demo-row__info">
146
+ <h3 class="page-heading-3 mbe-8">Rounded corners</h3>
147
+ <p class="page-body-normal mbe-12">
148
+ The
149
+ <code>radius</code>
150
+ prop applies
151
+ <code>border-radius</code>
152
+ to the clipping frame, so the image reveal stays contained within the rounded shape.
153
+ </p>
154
+ <dl class="sri-props">
155
+ <dt>frameHeight</dt>
156
+ <dd>480px</dd>
157
+ <dt>parallaxOffset</dt>
158
+ <dd>36rem</dd>
159
+ <dt>radius</dt>
160
+ <dd>2.4rem</dd>
161
+ </dl>
162
+ </div>
163
+ <ScrollRevealImage
164
+ src="/images/banners/banner-ginger.webp"
165
+ alt="Ginger hair banner"
166
+ :img-width="1920"
167
+ :img-height="800"
168
+ frame-height="480px"
169
+ radius="2.4rem"
170
+ />
171
+ </div>
172
+ </LayoutRow>
173
+
174
+ <!-- Focal point -->
175
+ <LayoutRow tag="div" variant="content" :style-class-passthrough="['mbe-32']">
176
+ <div class="sri-demo-row">
177
+ <div class="sri-demo-row__info">
178
+ <h3 class="page-heading-3 mbe-8">Horizontal focal point</h3>
179
+ <p class="page-body-normal mbe-12">
180
+ <code>focalX</code>
181
+ pins the horizontal crop axis. Here it is pushed right so the subject stays centred in the narrower
182
+ right-hand column.
183
+ </p>
184
+ <dl class="sri-props">
185
+ <dt>frameHeight</dt>
186
+ <dd>540px</dd>
187
+ <dt>parallaxOffset</dt>
188
+ <dd>36rem</dd>
189
+ <dt>focalX</dt>
190
+ <dd>75%</dd>
191
+ </dl>
192
+ </div>
193
+ <ScrollRevealImage
194
+ src="/images/page/hero/hero-red.jpg"
195
+ alt="Red hair portrait"
196
+ :img-width="1280"
197
+ :img-height="1920"
198
+ focal-x="75%"
199
+ />
200
+ </div>
201
+ </LayoutRow>
202
+
203
+ <!-- Tall frame -->
204
+ <LayoutRow tag="div" variant="content" :style-class-passthrough="['mbe-32']">
205
+ <div class="sri-demo-row">
206
+ <div class="sri-demo-row__info">
207
+ <h3 class="page-heading-3 mbe-8">Tall frame — maximum travel</h3>
208
+ <p class="page-body-normal mbe-12">
209
+ A tall frame combined with a large
210
+ <code>parallaxOffset</code>
211
+ creates the most dramatic reveal — nearly the full image height is traversed as you scroll.
212
+ </p>
213
+ <dl class="sri-props">
214
+ <dt>frameHeight</dt>
215
+ <dd>70vh</dd>
216
+ <dt>parallaxOffset</dt>
217
+ <dd>60rem</dd>
218
+ </dl>
219
+ </div>
220
+ <ScrollRevealImage
221
+ src="/images/page/hero/hero-hair.jpg"
222
+ alt="Hair portrait"
223
+ :img-width="1280"
224
+ :img-height="1920"
225
+ frame-height="70vh"
226
+ parallax-offset="60rem"
227
+ />
228
+ </div>
229
+ </LayoutRow>
230
+
231
+ <!-- ScrollRevealFrame: image grid -->
232
+ <LayoutRow tag="div" variant="content" :style-class-passthrough="['mbe-48']">
233
+ <div class="sri-demo-row">
234
+ <div class="sri-demo-row__info">
235
+ <h3 class="page-heading-3 mbe-8">Image grid — ScrollRevealFrame</h3>
236
+ <p class="page-body-normal mbe-12">
237
+ <code>ScrollRevealFrame</code>
238
+ accepts arbitrary slot content. Here a six-image CSS grid scrolls as a single unit inside the
239
+ clipping frame — no
240
+ <code>focalX</code>
241
+ or
242
+ <code>NuxtImg</code>
243
+ wiring needed.
244
+ </p>
245
+ <dl class="sri-props">
246
+ <dt>component</dt>
247
+ <dd>ScrollRevealFrame</dd>
248
+ <dt>frameHeight</dt>
249
+ <dd>480px</dd>
250
+ <dt>parallaxOffset</dt>
251
+ <dd>36rem</dd>
252
+ </dl>
253
+ </div>
254
+ <ScrollRevealFrame frame-height="480px" parallax-offset="36rem">
255
+ <div class="sri-image-grid">
256
+ <div class="sri-image-grid__cell">
257
+ <NuxtImg
258
+ src="/images/services/service-balayage.jpg"
259
+ alt="Balayage service"
260
+ :width="800"
261
+ :height="800"
262
+ loading="lazy"
263
+ decoding="async"
264
+ class="sri-image-grid__img"
265
+ />
266
+ </div>
267
+ <div class="sri-image-grid__cell">
268
+ <NuxtImg
269
+ src="/images/services/service-colour.jpg"
270
+ alt="Colour service"
271
+ :width="800"
272
+ :height="800"
273
+ loading="lazy"
274
+ decoding="async"
275
+ class="sri-image-grid__img"
276
+ />
277
+ </div>
278
+ <div class="sri-image-grid__cell">
279
+ <NuxtImg
280
+ src="/images/services/service-cut.jpg"
281
+ alt="Cut service"
282
+ :width="800"
283
+ :height="800"
284
+ loading="lazy"
285
+ decoding="async"
286
+ class="sri-image-grid__img"
287
+ />
288
+ </div>
289
+ <div class="sri-image-grid__cell">
290
+ <NuxtImg
291
+ src="/images/services/service-highlights.jpg"
292
+ alt="Highlights service"
293
+ :width="800"
294
+ :height="800"
295
+ loading="lazy"
296
+ decoding="async"
297
+ class="sri-image-grid__img"
298
+ />
299
+ </div>
300
+ <div class="sri-image-grid__cell">
301
+ <NuxtImg
302
+ src="/images/services/service-lowlights.jpg"
303
+ alt="Lowlights service"
304
+ :width="800"
305
+ :height="800"
306
+ loading="lazy"
307
+ decoding="async"
308
+ class="sri-image-grid__img"
309
+ />
310
+ </div>
311
+ <div class="sri-image-grid__cell">
312
+ <NuxtImg
313
+ src="/images/services/service-toner.jpg"
314
+ alt="Toner service"
315
+ :width="800"
316
+ :height="800"
317
+ loading="lazy"
318
+ decoding="async"
319
+ class="sri-image-grid__img"
320
+ />
321
+ </div>
322
+ </div>
323
+ </ScrollRevealFrame>
324
+ </div>
325
+ </LayoutRow>
326
+ </template>
327
+ </NuxtLayout>
328
+ </div>
329
+ </template>
330
+
331
+ <script setup lang="ts">
332
+ import type { IFormMultipleOptions } from "~/types/forms/types.forms";
333
+
334
+ definePageMeta({
335
+ layout: false,
336
+ });
337
+
338
+ useHead({
339
+ title: "ScrollRevealImage / ScrollRevealFrame",
340
+ meta: [
341
+ {
342
+ name: "description",
343
+ content: "ScrollRevealImage and ScrollRevealFrame — pure-CSS parallax scroll reveal effect demo",
344
+ },
345
+ ],
346
+ bodyAttrs: {
347
+ class: "scroll-reveal-image-page",
348
+ },
349
+ });
350
+
351
+ const frameHeight = ref("540px");
352
+ const parallaxOffset = ref("36rem");
353
+ const focalX = ref("50%");
354
+ const radius = ref("0px");
355
+
356
+ const frameHeightData = ref<IFormMultipleOptions>({
357
+ data: [
358
+ { id: "fh-320", name: "frameHeight", value: "320px", label: "320px" },
359
+ { id: "fh-540", name: "frameHeight", value: "540px", label: "540px" },
360
+ { id: "fh-60vh", name: "frameHeight", value: "60vh", label: "60vh" },
361
+ { id: "fh-80vh", name: "frameHeight", value: "80vh", label: "80vh" },
362
+ ],
363
+ total: 4,
364
+ skip: 0,
365
+ limit: 4,
366
+ });
367
+
368
+ const parallaxOffsetData = ref<IFormMultipleOptions>({
369
+ data: [
370
+ { id: "po-20", name: "parallaxOffset", value: "20rem", label: "20rem" },
371
+ { id: "po-36", name: "parallaxOffset", value: "36rem", label: "36rem" },
372
+ { id: "po-48", name: "parallaxOffset", value: "48rem", label: "48rem" },
373
+ { id: "po-60", name: "parallaxOffset", value: "60rem", label: "60rem" },
374
+ ],
375
+ total: 4,
376
+ skip: 0,
377
+ limit: 4,
378
+ });
379
+
380
+ const focalXData = ref<IFormMultipleOptions>({
381
+ data: [
382
+ { id: "fx-left", name: "focalX", value: "20%", label: "left" },
383
+ { id: "fx-center", name: "focalX", value: "50%", label: "center" },
384
+ { id: "fx-right", name: "focalX", value: "80%", label: "right" },
385
+ ],
386
+ total: 3,
387
+ skip: 0,
388
+ limit: 3,
389
+ });
390
+
391
+ const radiusData = ref<IFormMultipleOptions>({
392
+ data: [
393
+ { id: "r-0", name: "radius", value: "0px", label: "none" },
394
+ { id: "r-8", name: "radius", value: "0.8rem", label: "0.8rem" },
395
+ { id: "r-16", name: "radius", value: "1.6rem", label: "1.6rem" },
396
+ { id: "r-24", name: "radius", value: "2.4rem", label: "2.4rem" },
397
+ ],
398
+ total: 4,
399
+ skip: 0,
400
+ limit: 4,
401
+ });
402
+ </script>
403
+
404
+ <style lang="css">
405
+ .scroll-reveal-image-page {
406
+ .sri-demo-row {
407
+ display: grid;
408
+ grid-template-columns: 1fr;
409
+ gap: 3.2rem;
410
+ align-items: start;
411
+
412
+ @media (width >= 768px) {
413
+ grid-template-columns: 1fr 2fr;
414
+ }
415
+
416
+ &__info {
417
+ position: sticky;
418
+ top: 2.4rem;
419
+ }
420
+ }
421
+
422
+ .sri-props {
423
+ display: grid;
424
+ grid-template-columns: auto 1fr;
425
+ gap: 0.4rem 1.2rem;
426
+ font-size: 1.3rem;
427
+ margin: 0;
428
+
429
+ dt {
430
+ color: var(--slate-07);
431
+ font-family: monospace;
432
+ }
433
+
434
+ dd {
435
+ margin: 0;
436
+ font-family: monospace;
437
+ color: var(--slate-10);
438
+ }
439
+ }
440
+
441
+ .sri-image-grid {
442
+ display: grid;
443
+ grid-template-columns: repeat(3, 1fr);
444
+ grid-template-rows: repeat(2, 1fr);
445
+ gap: 0.4rem;
446
+ height: 100%;
447
+ }
448
+
449
+ .sri-image-grid__cell {
450
+ overflow: hidden;
451
+ min-height: 0;
452
+ }
453
+
454
+ .sri-image-grid__img {
455
+ display: block;
456
+ width: 100%;
457
+ height: 100%;
458
+ object-fit: cover;
459
+ }
460
+
461
+ .demo-controls {
462
+ padding: 1.6rem;
463
+ border: 1px solid var(--slate-06);
464
+ border-radius: 0.8rem;
465
+ margin-block: 2.4rem;
466
+
467
+ &__heading {
468
+ font-size: 1.1rem;
469
+ font-weight: 600;
470
+ text-transform: uppercase;
471
+ letter-spacing: 0.08em;
472
+ color: var(--slate-08);
473
+ margin-block-end: 1.2rem;
474
+ }
475
+
476
+ &__fields {
477
+ display: flex;
478
+ flex-direction: column;
479
+ gap: 1.2rem;
480
+ }
481
+ }
482
+ }
483
+ </style>
@@ -2,6 +2,7 @@ import type { TextConfig } from "~/types/components/hero-text";
2
2
 
3
3
  export interface Service {
4
4
  slug: string;
5
+ category: string;
5
6
  title: string;
6
7
  subtitle: string;
7
8
  price: string;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "srcdev-nuxt-components",
3
3
  "type": "module",
4
- "version": "9.1.28",
4
+ "version": "9.1.30",
5
5
  "main": "nuxt.config.ts",
6
6
  "types": "types.d.ts",
7
7
  "license": "MIT",
@@ -1,94 +0,0 @@
1
- .srcdev-components-extended {
2
- .display-prompt-core {
3
- .display-prompt-wrapper {
4
- background-color: var(--colour-theme-8);
5
- border: 0px solid transparent;
6
- border-radius: 4px;
7
- border-start-start-radius: 8px;
8
- border-end-start-radius: 8px;
9
- padding-inline-start: 8px;
10
-
11
- &:not(.dark) {
12
- &.outlined {
13
- border: 1px solid var(--colour-theme-8);
14
- }
15
- }
16
-
17
- &.dark {
18
- border-width: 0;
19
-
20
- .display-prompt-inner {
21
- background-color: var(--slate-10);
22
- }
23
-
24
- &.outlined {
25
- border: 1px solid var(--colour-theme-8);
26
- }
27
- }
28
-
29
- .display-prompt-inner {
30
- align-items: center;
31
- gap: 12px;
32
- padding-block: 1rem;
33
- padding-inline: 1.5rem;
34
-
35
- border-start-start-radius: 8px;
36
- border-end-start-radius: 8px;
37
- background-color: var(--colour-theme-10);
38
-
39
- .display-prompt-icon {
40
- .icon {
41
- color: var(--colour-theme-0);
42
- font-size: 3rem;
43
- font-style: normal;
44
- font-weight: normal;
45
- }
46
- }
47
-
48
- .display-prompt-content {
49
- gap: 1rem;
50
- margin: 0;
51
- padding: 0.2rem;
52
-
53
- .title {
54
- font-size: var(--step-5);
55
- font-weight: bold;
56
- line-height: 1.3;
57
- color: var(--colour-theme-0);
58
- margin: 0;
59
- padding: 0;
60
- }
61
-
62
- .text {
63
- font-size: var(--step-4);
64
- font-weight: normal;
65
- line-height: 1.3;
66
- color: var(--colour-theme-0);
67
- margin: 0;
68
- padding: 0;
69
- }
70
- }
71
- .display-prompt-action {
72
- background-color: transparent;
73
- align-items: center;
74
- margin: 1rem;
75
- padding: 0.5rem;
76
- border: 0.1rem solid var(--colour-theme-8);
77
- border-radius: 50%;
78
- outline: 1px solid var(--colour-theme-3);
79
-
80
- &:hover {
81
- cursor: pointer;
82
- }
83
-
84
- .icon {
85
- color: var(--colour-theme-0);
86
- font-size: var(--step-5);
87
- border: 1px solid green;
88
- padding: 1rem;
89
- }
90
- }
91
- }
92
- }
93
- }
94
- }
@@ -1,5 +0,0 @@
1
- .srcdev-components-extended {
2
- .display-toast {
3
- /* Extend styles for the display toast component */
4
- }
5
- }
@@ -1,37 +0,0 @@
1
- .srcdev-components-extended {
2
- .expanding-panel {
3
- .expanding-panel-details {
4
- .expanding-panel-summary {
5
- &::-webkit-details-marker,
6
- &::marker {
7
- display: none;
8
- }
9
-
10
- .label-wrapper {
11
- }
12
- .icon-wrapper {
13
- .icon {
14
- }
15
- }
16
- }
17
-
18
- &[open] {
19
- .expanding-panel-summary {
20
- .icon-wrapper {
21
- .icon {
22
- }
23
- }
24
- }
25
- + .expanding-panel-content {
26
- .inner {
27
- }
28
- }
29
- }
30
- }
31
-
32
- .expanding-panel-content {
33
- .inner {
34
- }
35
- }
36
- }
37
- }
@@ -1,3 +0,0 @@
1
- @import "./_display-prompt-core";
2
- @import "./_expanding-panel";
3
- @import "./_display-toast";
@@ -1 +0,0 @@
1
- @import "./components";
@@ -1,38 +0,0 @@
1
- .srcdev-forms-extended {
2
- .form-fieldset {
3
- margin: 0;
4
- padding: 0;
5
- border: 0;
6
-
7
- &.single-checkbox-fieldset {
8
- }
9
-
10
- &.multiple-checkboxes-fieldset {
11
- }
12
-
13
- &.multiple-radiobuttons-fieldset {
14
- }
15
-
16
- .form-fieldset-legend {
17
- color: var(--form-fieldset-legend-color);
18
- margin-block: 0.8rem;
19
- font-size: var(--step-5);
20
- font-weight: normal;
21
- line-height: 1.5;
22
-
23
- &.has-description {
24
- margin-bottom: 0;
25
- }
26
- }
27
-
28
- .form-fieldset-description {
29
- font-size: 1.6rem;
30
- margin-top: 1.2rem;
31
- }
32
-
33
- .form-fieldset-content {
34
- margin-block-start: 0;
35
- margin-block-end: 0;
36
- }
37
- }
38
- }