srcdev-nuxt-components 9.1.28 → 9.1.29

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 (75) 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 +186 -0
  4. package/.claude/skills/components/scroll-reveal-frame.md +136 -0
  5. package/.claude/skills/components/scroll-reveal-image.md +161 -0
  6. package/.claude/skills/index.md +7 -1
  7. package/.claude/skills/setup-postinstall.md +45 -0
  8. package/.claude/skills/theming-override-default.md +6 -0
  9. package/.claude/skills/theming-partial-override.md +131 -0
  10. package/.claude/skills/vue-video-autoplay.md +74 -0
  11. package/README.md +15 -5
  12. package/app/components/01.atoms/banner-video/BannerVideo.vue +201 -0
  13. package/app/components/01.atoms/banner-video/stories/BannerVideo.stories.ts +191 -0
  14. package/app/components/01.atoms/banner-video/tests/BannerVideo.spec.ts +374 -0
  15. package/app/components/01.atoms/banner-video/tests/__snapshots__/BannerVideo.spec.ts.snap +13 -0
  16. package/app/components/01.atoms/scroll-reveal-frame/ScrollRevealFrame.vue +125 -0
  17. package/app/components/01.atoms/scroll-reveal-frame/stories/ScrollRevealFrame.stories.ts +166 -0
  18. package/app/components/01.atoms/scroll-reveal-frame/tests/ScrollRevealFrame.spec.ts +148 -0
  19. package/app/components/01.atoms/scroll-reveal-frame/tests/__snapshots__/ScrollRevealFrame.spec.ts.snap +13 -0
  20. package/app/components/01.atoms/scroll-reveal-image/ScrollRevealImage.vue +96 -0
  21. package/app/components/01.atoms/scroll-reveal-image/stories/ScrollRevealImage.stories.ts +181 -0
  22. package/app/components/01.atoms/scroll-reveal-image/tests/ScrollRevealImage.spec.ts +235 -0
  23. package/app/components/01.atoms/scroll-reveal-image/tests/__snapshots__/ScrollRevealImage.spec.ts.snap +13 -0
  24. package/app/components/03.organisms/services/services-card/stories/ServicesCard.stories.ts +1 -0
  25. package/app/components/03.organisms/services/services-card/tests/ServicesCard.spec.ts +1 -0
  26. package/app/components/03.organisms/services/services-grids/stories/ServicesCardGrid.stories.ts +1 -0
  27. package/app/components/03.organisms/services/services-grids/stories/ServicesSectionGrid.stories.ts +1 -0
  28. package/app/components/03.organisms/services/services-grids/tests/ServicesCardGrid.spec.ts +1 -0
  29. package/app/components/03.organisms/services/services-grids/tests/ServicesSectionGrid.spec.ts +1 -0
  30. package/app/components/03.organisms/services/services-grids/tests/__snapshots__/ServicesSectionGrid.spec.ts.snap +3 -3
  31. package/app/components/03.organisms/services/services-section/stories/ServicesSection.stories.ts +1 -0
  32. package/app/components/03.organisms/services/services-section/tests/ServicesSection.spec.ts +1 -0
  33. package/app/components/03.organisms/services/services-section/tests/__snapshots__/ServicesSection.spec.ts.snap +1 -1
  34. package/app/layouts/default.vue +2 -0
  35. package/app/pages/banner-video.vue +296 -0
  36. package/app/pages/ui/scroll-reveal-image.vue +483 -0
  37. package/app/types/types.services.ts +1 -0
  38. package/package.json +1 -1
  39. package/app/assets/styles/extends-layer/srcdev-components/components/_display-prompt-core.css +0 -94
  40. package/app/assets/styles/extends-layer/srcdev-components/components/_display-toast.css +0 -5
  41. package/app/assets/styles/extends-layer/srcdev-components/components/_expanding-panel.css +0 -37
  42. package/app/assets/styles/extends-layer/srcdev-components/components/index.css +0 -3
  43. package/app/assets/styles/extends-layer/srcdev-components/index.css +0 -1
  44. package/app/assets/styles/extends-layer/srcdev-forms/components/_form-fieldset.css +0 -38
  45. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-button.css +0 -67
  46. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-checkbox-radio-core.css +0 -87
  47. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-checkbox-radio-options-button.css +0 -74
  48. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-checkbox-radio-with-label.css +0 -14
  49. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-description.css +0 -13
  50. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-error.css +0 -54
  51. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-label.css +0 -21
  52. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-select.css +0 -143
  53. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-text.css +0 -190
  54. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-textarea.css +0 -96
  55. package/app/assets/styles/extends-layer/srcdev-forms/components/_input-toggle-switch.css +0 -68
  56. package/app/assets/styles/extends-layer/srcdev-forms/components/index.css +0 -12
  57. package/app/assets/styles/extends-layer/srcdev-forms/index.css +0 -2
  58. package/app/assets/styles/extends-layer/srcdev-forms/setup/_generic.css +0 -21
  59. package/app/assets/styles/extends-layer/srcdev-forms/setup/index.css +0 -3
  60. package/app/assets/styles/extends-layer/srcdev-forms/setup/sizes/_default.css +0 -13
  61. package/app/assets/styles/extends-layer/srcdev-forms/setup/sizes/_large.css +0 -12
  62. package/app/assets/styles/extends-layer/srcdev-forms/setup/sizes/_medium.css +0 -12
  63. package/app/assets/styles/extends-layer/srcdev-forms/setup/sizes/_small.css +0 -12
  64. package/app/assets/styles/extends-layer/srcdev-forms/setup/sizes/_x-small.css +0 -11
  65. package/app/assets/styles/extends-layer/srcdev-forms/setup/sizes/index.css +0 -23
  66. package/app/assets/styles/extends-layer/srcdev-forms/setup/themes/_default.css +0 -62
  67. package/app/assets/styles/extends-layer/srcdev-forms/setup/themes/_error.css +0 -63
  68. package/app/assets/styles/extends-layer/srcdev-forms/setup/themes/_ghost.css +0 -63
  69. package/app/assets/styles/extends-layer/srcdev-forms/setup/themes/_info.css +0 -63
  70. package/app/assets/styles/extends-layer/srcdev-forms/setup/themes/_primary.css +0 -66
  71. package/app/assets/styles/extends-layer/srcdev-forms/setup/themes/_secondary.css +0 -64
  72. package/app/assets/styles/extends-layer/srcdev-forms/setup/themes/_success.css +0 -63
  73. package/app/assets/styles/extends-layer/srcdev-forms/setup/themes/_tertiary.css +0 -63
  74. package/app/assets/styles/extends-layer/srcdev-forms/setup/themes/_warning.css +0 -63
  75. package/app/assets/styles/extends-layer/srcdev-forms/setup/themes/index.css +0 -7
@@ -47,6 +47,7 @@ type Story = StoryObj<typeof ServicesCard>;
47
47
 
48
48
  const sampleService: Service = {
49
49
  slug: "locs-installation",
50
+ category: "locs",
50
51
  title: "Locs Installation",
51
52
  subtitle: "Start your loc journey",
52
53
  price: "£120",
@@ -7,6 +7,7 @@ import type { Service } from "~/types/types.services";
7
7
 
8
8
  const mockService: Service = {
9
9
  slug: "test-service",
10
+ category: "hair",
10
11
  title: "Test Service",
11
12
  subtitle: "A subtitle",
12
13
  price: "£50",
@@ -57,6 +57,7 @@ type Story = StoryObj<typeof ServicesCardGrid>;
57
57
 
58
58
  const makeService = (slug: string, title: string, subtitle: string, image: string): Service => ({
59
59
  slug,
60
+ category: "locs",
60
61
  title,
61
62
  subtitle,
62
63
  price: "£120",
@@ -48,6 +48,7 @@ type Story = StoryObj<typeof ServicesSectionGrid>;
48
48
 
49
49
  const makeService = (slug: string, title: string, subtitle: string, image: string): Service => ({
50
50
  slug,
51
+ category: "locs",
51
52
  title,
52
53
  subtitle,
53
54
  price: "£120",
@@ -7,6 +7,7 @@ import type { Service } from "~/types/types.services";
7
7
 
8
8
  const makeService = (slug: string, title: string): Service => ({
9
9
  slug,
10
+ category: "hair",
10
11
  title,
11
12
  subtitle: `Subtitle for ${title}`,
12
13
  price: "£50",
@@ -7,6 +7,7 @@ import type { Service } from "~/types/types.services";
7
7
 
8
8
  const makeService = (slug: string, title: string): Service => ({
9
9
  slug,
10
+ category: "hair",
10
11
  title,
11
12
  subtitle: `Subtitle for ${title}`,
12
13
  price: "£50",
@@ -4,7 +4,7 @@ exports[`ServicesSectionGrid > renders correct HTML structure 1`] = `
4
4
  "<div class="services-grid">
5
5
  <div class="services-section">
6
6
  <div class="services-section__grid">
7
- <div class="image-wrapper"><img data-nuxt-img="" srcset="/_ipx/_/images/locs-installation.jpg 1x, /_ipx/_/images/locs-installation.jpg 2x" alt="Locs Installation" loading="eager" class="image" src="/_ipx/_/images/locs-installation.jpg"></div>
7
+ <div class="image-wrapper"><img data-nuxt-img="" srcset="/_ipx/_/images/locs-installation.jpg 1x, /_ipx/_/images/locs-installation.jpg 2x" alt="Locs Installation" loading="eager" fetchpriority="high" class="image" src="/_ipx/_/images/locs-installation.jpg"></div>
8
8
  <div class="info-wrapper is-summary align-center">
9
9
  <div class="eyebrow-text large">Subtitle for Locs Installation</div>
10
10
  <h2 class="hero-text mb-20 title axis-horizontal">
@@ -31,7 +31,7 @@ exports[`ServicesSectionGrid > renders correct HTML structure 1`] = `
31
31
  </div>
32
32
  <div class="services-section">
33
33
  <div class="services-section__grid">
34
- <div class="image-wrapper"><img data-nuxt-img="" srcset="/_ipx/_/images/locs-retwist.jpg 1x, /_ipx/_/images/locs-retwist.jpg 2x" alt="Locs Retwist" loading="eager" class="image" src="/_ipx/_/images/locs-retwist.jpg"></div>
34
+ <div class="image-wrapper"><img data-nuxt-img="" srcset="/_ipx/_/images/locs-retwist.jpg 1x, /_ipx/_/images/locs-retwist.jpg 2x" alt="Locs Retwist" loading="eager" fetchpriority="auto" class="image" src="/_ipx/_/images/locs-retwist.jpg"></div>
35
35
  <div class="info-wrapper is-summary align-center">
36
36
  <div class="eyebrow-text large">Subtitle for Locs Retwist</div>
37
37
  <h2 class="hero-text mb-20 title axis-horizontal">
@@ -58,7 +58,7 @@ exports[`ServicesSectionGrid > renders correct HTML structure 1`] = `
58
58
  </div>
59
59
  <div class="services-section">
60
60
  <div class="services-section__grid">
61
- <div class="image-wrapper"><img data-nuxt-img="" srcset="/_ipx/_/images/colour-treatment.jpg 1x, /_ipx/_/images/colour-treatment.jpg 2x" alt="Colour Treatment" loading="lazy" class="image" src="/_ipx/_/images/colour-treatment.jpg"></div>
61
+ <div class="image-wrapper"><img data-nuxt-img="" srcset="/_ipx/_/images/colour-treatment.jpg 1x, /_ipx/_/images/colour-treatment.jpg 2x" alt="Colour Treatment" loading="lazy" fetchpriority="auto" class="image" src="/_ipx/_/images/colour-treatment.jpg"></div>
62
62
  <div class="info-wrapper is-summary align-center">
63
63
  <div class="eyebrow-text large">Subtitle for Colour Treatment</div>
64
64
  <h2 class="hero-text mb-20 title axis-horizontal">
@@ -69,6 +69,7 @@ type Story = StoryObj<typeof ServicesSection>;
69
69
 
70
70
  const sampleService: Service = {
71
71
  slug: "locs-installation",
72
+ category: "locs",
72
73
  title: "Locs Installation",
73
74
  subtitle: "Start your loc journey",
74
75
  price: "£120",
@@ -7,6 +7,7 @@ import type { Service } from "~/types/types.services";
7
7
 
8
8
  const mockService: Service = {
9
9
  slug: "test-service",
10
+ category: "hair",
10
11
  title: "Test Service",
11
12
  subtitle: "A subtitle",
12
13
  price: "£50",
@@ -3,7 +3,7 @@
3
3
  exports[`ServicesSection > renders correct HTML structure 1`] = `
4
4
  "<div class="services-section">
5
5
  <div class="services-section__grid">
6
- <div class="image-wrapper"><img data-nuxt-img="" srcset="/_ipx/_/images/test.jpg 1x, /_ipx/_/images/test.jpg 2x" alt="Test Service" loading="eager" class="image" src="/_ipx/_/images/test.jpg"></div>
6
+ <div class="image-wrapper"><img data-nuxt-img="" srcset="/_ipx/_/images/test.jpg 1x, /_ipx/_/images/test.jpg 2x" alt="Test Service" loading="eager" fetchpriority="high" class="image" src="/_ipx/_/images/test.jpg"></div>
7
7
  <div class="info-wrapper">
8
8
  <div class="eyebrow-text large">A subtitle</div>
9
9
  <h2 class="hero-text mb-20 title axis-horizontal">
@@ -62,9 +62,11 @@ const responsiveNavLinks = {
62
62
  childLinksTitle: "UI Components",
63
63
  childLinks: [
64
64
  { name: "Wipe Away Vertical", path: "/ui/wipe-away-vertical" },
65
+ { name: "Scroll Reveal Image", path: "/ui/scroll-reveal-image" },
65
66
  { name: "Tooltips", path: "/ui/tooltips" },
66
67
  { name: "Marquee Scroller", path: "/ui/marquee-scroller" },
67
68
  { name: "Banner", path: "/ui/display-banner" },
69
+ { name: "Banner Video", path: "/banner-video" },
68
70
  { name: "Section Parallax", path: "/ui/section-parallax" },
69
71
  { name: "Animated SVG Text", path: "/ui/animated-svg-text" },
70
72
  { name: "Carousel (Basic)", path: "/ui/carousel-basic" },
@@ -0,0 +1,296 @@
1
+ <template>
2
+ <div>
3
+ <NuxtLayout name="default">
4
+ <template #layout-content>
5
+ <BannerVideo
6
+ src="/images/banners/video/lake-banner.mp4"
7
+ poster="/images/banners/video/lake-banner.jpg"
8
+ alt="A serene lake landscape"
9
+ :max-height="maxHeight"
10
+ :max-height-tablet="maxHeightTablet || undefined"
11
+ :max-height-mobile="maxHeightMobile || undefined"
12
+ :aspect-ratio="aspectRatio"
13
+ :tag="tag"
14
+ :object-fit="objectFit"
15
+ :vertical-position="verticalPosition"
16
+ :horizontal-position="horizontalPosition"
17
+ :style-class-passthrough="['mbe-32']"
18
+ />
19
+
20
+ <LayoutRow tag="div" variant="full-width">
21
+ <div class="banner-video-demo-controls">
22
+ <p class="demo-controls__heading">Props</p>
23
+
24
+ <div class="demo-controls__row">
25
+ <MultipleRadiobuttons
26
+ v-model="maxHeight"
27
+ v-model:field-data="maxHeightData"
28
+ name="maxHeight"
29
+ label="maxHeight"
30
+ legend="maxHeight (desktop)"
31
+ error-message=""
32
+ :is-button="true"
33
+ :is-pill="true"
34
+ :field-has-error="false"
35
+ options-layout="inline"
36
+ />
37
+ </div>
38
+
39
+ <div class="demo-controls__row">
40
+ <MultipleRadiobuttons
41
+ v-model="maxHeightTablet"
42
+ v-model:field-data="maxHeightTabletData"
43
+ name="maxHeightTablet"
44
+ label="maxHeightTablet"
45
+ legend="maxHeightTablet (≥768px, falls back to maxHeight)"
46
+ error-message=""
47
+ :is-button="true"
48
+ :is-pill="true"
49
+ :field-has-error="false"
50
+ options-layout="inline"
51
+ />
52
+ </div>
53
+
54
+ <div class="demo-controls__row">
55
+ <MultipleRadiobuttons
56
+ v-model="maxHeightMobile"
57
+ v-model:field-data="maxHeightMobileData"
58
+ name="maxHeightMobile"
59
+ label="maxHeightMobile"
60
+ legend="maxHeightMobile (<768px, falls back through tablet → desktop)"
61
+ error-message=""
62
+ :is-button="true"
63
+ :is-pill="true"
64
+ :field-has-error="false"
65
+ options-layout="inline"
66
+ />
67
+ </div>
68
+
69
+ <div class="demo-controls__row">
70
+ <MultipleRadiobuttons
71
+ v-model="aspectRatio"
72
+ v-model:field-data="aspectRatioData"
73
+ name="aspectRatio"
74
+ label="aspectRatio"
75
+ legend="aspectRatio"
76
+ error-message=""
77
+ :is-button="true"
78
+ :is-pill="true"
79
+ :field-has-error="false"
80
+ options-layout="inline"
81
+ />
82
+ </div>
83
+
84
+ <div class="demo-controls__row">
85
+ <MultipleRadiobuttons
86
+ v-model="objectFit"
87
+ v-model:field-data="objectFitData"
88
+ name="objectFit"
89
+ label="objectFit"
90
+ legend="objectFit"
91
+ error-message=""
92
+ :is-button="true"
93
+ :is-pill="true"
94
+ :field-has-error="false"
95
+ options-layout="inline"
96
+ />
97
+ </div>
98
+
99
+ <div class="demo-controls__row">
100
+ <MultipleRadiobuttons
101
+ v-model="verticalPosition"
102
+ v-model:field-data="verticalPositionData"
103
+ name="verticalPosition"
104
+ label="verticalPosition"
105
+ legend="verticalPosition"
106
+ error-message=""
107
+ :is-button="true"
108
+ :is-pill="true"
109
+ :field-has-error="false"
110
+ options-layout="inline"
111
+ />
112
+ </div>
113
+
114
+ <div class="demo-controls__row">
115
+ <MultipleRadiobuttons
116
+ v-model="horizontalPosition"
117
+ v-model:field-data="horizontalPositionData"
118
+ name="horizontalPosition"
119
+ label="horizontalPosition"
120
+ legend="horizontalPosition"
121
+ error-message=""
122
+ :is-button="true"
123
+ :is-pill="true"
124
+ :field-has-error="false"
125
+ options-layout="inline"
126
+ />
127
+ </div>
128
+
129
+ <div class="demo-controls__row">
130
+ <MultipleRadiobuttons
131
+ v-model="tag"
132
+ v-model:field-data="tagData"
133
+ name="tag"
134
+ label="tag"
135
+ legend="tag"
136
+ error-message=""
137
+ :is-button="true"
138
+ :is-pill="true"
139
+ :field-has-error="false"
140
+ options-layout="inline"
141
+ />
142
+ </div>
143
+ </div>
144
+ </LayoutRow>
145
+ </template>
146
+ </NuxtLayout>
147
+ </div>
148
+ </template>
149
+
150
+ <script setup lang="ts">
151
+ import type { IFormMultipleOptions } from "~/types/forms/types.forms";
152
+
153
+ definePageMeta({
154
+ layout: false,
155
+ });
156
+
157
+ useHead({
158
+ title: "BannerVideo",
159
+ meta: [{ name: "description", content: "BannerVideo component demo" }],
160
+ bodyAttrs: { class: "banner-video-page" },
161
+ });
162
+
163
+ const maxHeight = ref("56rem");
164
+ const maxHeightTablet = ref("");
165
+ const maxHeightMobile = ref("");
166
+ const aspectRatio = ref("21/9");
167
+ const tag = ref<"section" | "div" | "header" | "main" | "article">("section");
168
+ const objectFit = ref<"cover" | "contain" | "fill" | "none" | "scale-down">("cover");
169
+ const verticalPosition = ref<"start" | "center" | "end">("center");
170
+ const horizontalPosition = ref<"start" | "center" | "end">("center");
171
+
172
+ const maxHeightData = ref<IFormMultipleOptions>({
173
+ data: [
174
+ { id: "mh-40rem", name: "maxHeight", value: "40rem", label: "40rem" },
175
+ { id: "mh-56rem", name: "maxHeight", value: "56rem", label: "56rem" },
176
+ { id: "mh-80rem", name: "maxHeight", value: "80rem", label: "80rem" },
177
+ { id: "mh-100vh", name: "maxHeight", value: "100vh", label: "100vh" },
178
+ { id: "mh-none", name: "maxHeight", value: "none", label: "none" },
179
+ ],
180
+ total: 5,
181
+ skip: 0,
182
+ limit: 5,
183
+ });
184
+
185
+ const maxHeightTabletData = ref<IFormMultipleOptions>({
186
+ data: [
187
+ { id: "mht-unset", name: "maxHeightTablet", value: "", label: "unset" },
188
+ { id: "mht-32rem", name: "maxHeightTablet", value: "32rem", label: "32rem" },
189
+ { id: "mht-40rem", name: "maxHeightTablet", value: "40rem", label: "40rem" },
190
+ { id: "mht-56rem", name: "maxHeightTablet", value: "56rem", label: "56rem" },
191
+ ],
192
+ total: 4,
193
+ skip: 0,
194
+ limit: 4,
195
+ });
196
+
197
+ const maxHeightMobileData = ref<IFormMultipleOptions>({
198
+ data: [
199
+ { id: "mhm-unset", name: "maxHeightMobile", value: "", label: "unset" },
200
+ { id: "mhm-24rem", name: "maxHeightMobile", value: "24rem", label: "24rem" },
201
+ { id: "mhm-32rem", name: "maxHeightMobile", value: "32rem", label: "32rem" },
202
+ { id: "mhm-40rem", name: "maxHeightMobile", value: "40rem", label: "40rem" },
203
+ ],
204
+ total: 4,
205
+ skip: 0,
206
+ limit: 4,
207
+ });
208
+
209
+ const aspectRatioData = ref<IFormMultipleOptions>({
210
+ data: [
211
+ { id: "ar-16-9", name: "aspectRatio", value: "16/9", label: "16/9" },
212
+ { id: "ar-21-9", name: "aspectRatio", value: "21/9", label: "21/9" },
213
+ { id: "ar-4-3", name: "aspectRatio", value: "4/3", label: "4/3" },
214
+ { id: "ar-1-1", name: "aspectRatio", value: "1/1", label: "1/1" },
215
+ ],
216
+ total: 4,
217
+ skip: 0,
218
+ limit: 4,
219
+ });
220
+
221
+ const tagData = ref<IFormMultipleOptions>({
222
+ data: [
223
+ { id: "tag-section", name: "tag", value: "section", label: "section" },
224
+ { id: "tag-div", name: "tag", value: "div", label: "div" },
225
+ { id: "tag-header", name: "tag", value: "header", label: "header" },
226
+ { id: "tag-main", name: "tag", value: "main", label: "main" },
227
+ { id: "tag-article", name: "tag", value: "article", label: "article" },
228
+ ],
229
+ total: 5,
230
+ skip: 0,
231
+ limit: 5,
232
+ });
233
+
234
+ const objectFitData = ref<IFormMultipleOptions>({
235
+ data: [
236
+ { id: "fit-cover", name: "objectFit", value: "cover", label: "cover" },
237
+ { id: "fit-contain", name: "objectFit", value: "contain", label: "contain" },
238
+ { id: "fit-fill", name: "objectFit", value: "fill", label: "fill" },
239
+ { id: "fit-none", name: "objectFit", value: "none", label: "none" },
240
+ { id: "fit-scale-down", name: "objectFit", value: "scale-down", label: "scale-down" },
241
+ ],
242
+ total: 5,
243
+ skip: 0,
244
+ limit: 5,
245
+ });
246
+
247
+ const verticalPositionData = ref<IFormMultipleOptions>({
248
+ data: [
249
+ { id: "vp-start", name: "verticalPosition", value: "start", label: "start (top)" },
250
+ { id: "vp-center", name: "verticalPosition", value: "center", label: "center" },
251
+ { id: "vp-end", name: "verticalPosition", value: "end", label: "end (bottom)" },
252
+ ],
253
+ total: 3,
254
+ skip: 0,
255
+ limit: 3,
256
+ });
257
+
258
+ const horizontalPositionData = ref<IFormMultipleOptions>({
259
+ data: [
260
+ { id: "hp-start", name: "horizontalPosition", value: "start", label: "start (left)" },
261
+ { id: "hp-center", name: "horizontalPosition", value: "center", label: "center" },
262
+ { id: "hp-end", name: "horizontalPosition", value: "end", label: "end (right)" },
263
+ ],
264
+ total: 3,
265
+ skip: 0,
266
+ limit: 3,
267
+ });
268
+ </script>
269
+
270
+ <style lang="css">
271
+ .banner-video-page {
272
+ .banner-video-demo-controls {
273
+ padding: 1.6rem;
274
+ border: 1px solid var(--slate-06);
275
+ border-radius: 0.8rem;
276
+ /* background: var(--slate-01); */
277
+
278
+ .demo-controls__heading {
279
+ font-size: 1.1rem;
280
+ font-weight: 600;
281
+ text-transform: uppercase;
282
+ letter-spacing: 0.08em;
283
+ color: var(--slate-08);
284
+ margin-block-end: 1.2rem;
285
+ }
286
+
287
+ .demo-controls__row {
288
+ margin-block-end: 1.2rem;
289
+
290
+ &:last-child {
291
+ margin-block-end: 0;
292
+ }
293
+ }
294
+ }
295
+ }
296
+ </style>