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,238 @@
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
+ :depth="depth"
10
+ :aspect-ratio="aspectRatio"
11
+ :tag="tag"
12
+ :object-fit="objectFit"
13
+ :vertical-position="verticalPosition"
14
+ :horizontal-position="horizontalPosition"
15
+ :style-class-passthrough="['mbe-32']"
16
+ />
17
+
18
+ <LayoutRow tag="div" variant="full-width">
19
+ <div class="banner-video-demo-controls">
20
+ <p class="demo-controls__heading">Props</p>
21
+
22
+ <div class="demo-controls__row">
23
+ <MultipleRadiobuttons
24
+ v-model="depth"
25
+ v-model:field-data="depthData"
26
+ name="depth"
27
+ label="depth"
28
+ legend="depth"
29
+ error-message=""
30
+ :is-button="true"
31
+ :is-pill="true"
32
+ :field-has-error="false"
33
+ options-layout="inline"
34
+ />
35
+ </div>
36
+
37
+ <div class="demo-controls__row">
38
+ <MultipleRadiobuttons
39
+ v-model="aspectRatio"
40
+ v-model:field-data="aspectRatioData"
41
+ name="aspectRatio"
42
+ label="aspectRatio"
43
+ legend="aspectRatio"
44
+ error-message=""
45
+ :is-button="true"
46
+ :is-pill="true"
47
+ :field-has-error="false"
48
+ options-layout="inline"
49
+ />
50
+ </div>
51
+
52
+ <div class="demo-controls__row">
53
+ <MultipleRadiobuttons
54
+ v-model="objectFit"
55
+ v-model:field-data="objectFitData"
56
+ name="objectFit"
57
+ label="objectFit"
58
+ legend="objectFit"
59
+ error-message=""
60
+ :is-button="true"
61
+ :is-pill="true"
62
+ :field-has-error="false"
63
+ options-layout="inline"
64
+ />
65
+ </div>
66
+
67
+ <div class="demo-controls__row">
68
+ <MultipleRadiobuttons
69
+ v-model="verticalPosition"
70
+ v-model:field-data="verticalPositionData"
71
+ name="verticalPosition"
72
+ label="verticalPosition"
73
+ legend="verticalPosition"
74
+ error-message=""
75
+ :is-button="true"
76
+ :is-pill="true"
77
+ :field-has-error="false"
78
+ options-layout="inline"
79
+ />
80
+ </div>
81
+
82
+ <div class="demo-controls__row">
83
+ <MultipleRadiobuttons
84
+ v-model="horizontalPosition"
85
+ v-model:field-data="horizontalPositionData"
86
+ name="horizontalPosition"
87
+ label="horizontalPosition"
88
+ legend="horizontalPosition"
89
+ error-message=""
90
+ :is-button="true"
91
+ :is-pill="true"
92
+ :field-has-error="false"
93
+ options-layout="inline"
94
+ />
95
+ </div>
96
+
97
+ <div class="demo-controls__row">
98
+ <MultipleRadiobuttons
99
+ v-model="tag"
100
+ v-model:field-data="tagData"
101
+ name="tag"
102
+ label="tag"
103
+ legend="tag"
104
+ error-message=""
105
+ :is-button="true"
106
+ :is-pill="true"
107
+ :field-has-error="false"
108
+ options-layout="inline"
109
+ />
110
+ </div>
111
+ </div>
112
+ </LayoutRow>
113
+ </template>
114
+ </NuxtLayout>
115
+ </div>
116
+ </template>
117
+
118
+ <script setup lang="ts">
119
+ import type { IFormMultipleOptions } from "~/types/forms/types.forms";
120
+
121
+ definePageMeta({
122
+ layout: false,
123
+ });
124
+
125
+ useHead({
126
+ title: "BannerVideo",
127
+ meta: [{ name: "description", content: "BannerVideo component demo" }],
128
+ bodyAttrs: { class: "banner-video-page" },
129
+ });
130
+
131
+ const depth = ref<"xs" | "sm" | "md" | "lg" | "xl">("md");
132
+ const aspectRatio = ref("21/9");
133
+ const tag = ref<"section" | "div" | "header" | "main" | "article">("section");
134
+ const objectFit = ref<"cover" | "contain" | "fill" | "none" | "scale-down">("cover");
135
+ const verticalPosition = ref<"start" | "center" | "end">("center");
136
+ const horizontalPosition = ref<"start" | "center" | "end">("center");
137
+
138
+ const depthData = ref<IFormMultipleOptions>({
139
+ data: [
140
+ { id: "depth-xs", name: "depth", value: "xs", label: "xs" },
141
+ { id: "depth-sm", name: "depth", value: "sm", label: "sm" },
142
+ { id: "depth-md", name: "depth", value: "md", label: "md" },
143
+ { id: "depth-lg", name: "depth", value: "lg", label: "lg" },
144
+ { id: "depth-xl", name: "depth", value: "xl", label: "xl" },
145
+ ],
146
+ total: 5,
147
+ skip: 0,
148
+ limit: 5,
149
+ });
150
+
151
+ const aspectRatioData = ref<IFormMultipleOptions>({
152
+ data: [
153
+ { id: "ar-16-9", name: "aspectRatio", value: "16/9", label: "16/9" },
154
+ { id: "ar-21-9", name: "aspectRatio", value: "21/9", label: "21/9" },
155
+ { id: "ar-4-3", name: "aspectRatio", value: "4/3", label: "4/3" },
156
+ { id: "ar-1-1", name: "aspectRatio", value: "1/1", label: "1/1" },
157
+ ],
158
+ total: 4,
159
+ skip: 0,
160
+ limit: 4,
161
+ });
162
+
163
+ const tagData = ref<IFormMultipleOptions>({
164
+ data: [
165
+ { id: "tag-section", name: "tag", value: "section", label: "section" },
166
+ { id: "tag-div", name: "tag", value: "div", label: "div" },
167
+ { id: "tag-header", name: "tag", value: "header", label: "header" },
168
+ { id: "tag-main", name: "tag", value: "main", label: "main" },
169
+ { id: "tag-article", name: "tag", value: "article", label: "article" },
170
+ ],
171
+ total: 5,
172
+ skip: 0,
173
+ limit: 5,
174
+ });
175
+
176
+ const objectFitData = ref<IFormMultipleOptions>({
177
+ data: [
178
+ { id: "fit-cover", name: "objectFit", value: "cover", label: "cover" },
179
+ { id: "fit-contain", name: "objectFit", value: "contain", label: "contain" },
180
+ { id: "fit-fill", name: "objectFit", value: "fill", label: "fill" },
181
+ { id: "fit-none", name: "objectFit", value: "none", label: "none" },
182
+ { id: "fit-scale-down", name: "objectFit", value: "scale-down", label: "scale-down" },
183
+ ],
184
+ total: 5,
185
+ skip: 0,
186
+ limit: 5,
187
+ });
188
+
189
+ const verticalPositionData = ref<IFormMultipleOptions>({
190
+ data: [
191
+ { id: "vp-start", name: "verticalPosition", value: "start", label: "start (top)" },
192
+ { id: "vp-center", name: "verticalPosition", value: "center", label: "center" },
193
+ { id: "vp-end", name: "verticalPosition", value: "end", label: "end (bottom)" },
194
+ ],
195
+ total: 3,
196
+ skip: 0,
197
+ limit: 3,
198
+ });
199
+
200
+ const horizontalPositionData = ref<IFormMultipleOptions>({
201
+ data: [
202
+ { id: "hp-start", name: "horizontalPosition", value: "start", label: "start (left)" },
203
+ { id: "hp-center", name: "horizontalPosition", value: "center", label: "center" },
204
+ { id: "hp-end", name: "horizontalPosition", value: "end", label: "end (right)" },
205
+ ],
206
+ total: 3,
207
+ skip: 0,
208
+ limit: 3,
209
+ });
210
+ </script>
211
+
212
+ <style lang="css">
213
+ .banner-video-page {
214
+ .banner-video-demo-controls {
215
+ padding: 1.6rem;
216
+ border: 1px solid var(--slate-06);
217
+ border-radius: 0.8rem;
218
+ /* background: var(--slate-01); */
219
+
220
+ .demo-controls__heading {
221
+ font-size: 1.1rem;
222
+ font-weight: 600;
223
+ text-transform: uppercase;
224
+ letter-spacing: 0.08em;
225
+ color: var(--slate-08);
226
+ margin-block-end: 1.2rem;
227
+ }
228
+
229
+ .demo-controls__row {
230
+ margin-block-end: 1.2rem;
231
+
232
+ &:last-child {
233
+ margin-block-end: 0;
234
+ }
235
+ }
236
+ }
237
+ }
238
+ </style>
@@ -0,0 +1,252 @@
1
+ <template>
2
+ <div>
3
+ <NuxtLayout name="default">
4
+ <template #layout-content>
5
+ <!-- Demo 3: BannerVideo + overlay -->
6
+ <LayoutRow tag="div" variant="full-width" :style-class-passthrough="['mbe-48']">
7
+ <GridStack :tag="tag" class="grid-stack-video-demo">
8
+ <template #layer-1>
9
+ <BannerVideo
10
+ src="/images/banners/video/lake-banner.mp4"
11
+ poster="/images/banners/video/lake-banner.jpg"
12
+ alt="A serene lake landscape"
13
+ aspect-ratio="4/3"
14
+ object-fit="cover"
15
+ vertical-position="center"
16
+ horizontal-position="center"
17
+ />
18
+ </template>
19
+ <template #layer-2>
20
+ <div class="video-overlay">
21
+ <div class="video-overlay__content">
22
+ <p class="video-overlay__eyebrow">GridStack layer-2</p>
23
+ <h2 class="video-overlay__heading">Content over video</h2>
24
+ <p class="video-overlay__body">
25
+ This layer sits on top of the BannerVideo without
26
+ <code>position: absolute</code>
27
+ .
28
+ </p>
29
+ </div>
30
+ </div>
31
+ </template>
32
+ </GridStack>
33
+ </LayoutRow>
34
+
35
+ <LayoutRow tag="div" variant="full-width" :style-class-passthrough="['mbe-32']">
36
+ <h1 class="page-heading-1">GridStack</h1>
37
+ <p class="page-body-normal">
38
+ Stacks slot content in the z-axis using
39
+ <code>grid-template-areas</code>
40
+ — no
41
+ <code>position: absolute</code>
42
+ . Layers share a single grid area; DOM order determines z-order (last slot is on top).
43
+ </p>
44
+ </LayoutRow>
45
+
46
+ <!-- Demo 1: Two layers -->
47
+ <LayoutRow tag="div" variant="full-width" :style-class-passthrough="['mbe-48']">
48
+ <h2 class="page-heading-2 mbe-16">Two layers</h2>
49
+ <GridStack class="grid-stack-demo">
50
+ <template #layer-1>
51
+ <div class="demo-layer demo-layer--base">layer-1 (base)</div>
52
+ </template>
53
+ <template #layer-2>
54
+ <div class="demo-layer demo-layer--overlay">layer-2 (overlay)</div>
55
+ </template>
56
+ </GridStack>
57
+ </LayoutRow>
58
+
59
+ <!-- Demo 2: Three layers -->
60
+ <LayoutRow tag="div" variant="full-width" :style-class-passthrough="['mbe-48']">
61
+ <h2 class="page-heading-2 mbe-16">Three layers</h2>
62
+ <GridStack class="grid-stack-demo">
63
+ <template #layer-1>
64
+ <div class="demo-layer demo-layer--base">layer-1 (base)</div>
65
+ </template>
66
+ <template #layer-2>
67
+ <div class="demo-layer demo-layer--mid">layer-2 (mid)</div>
68
+ </template>
69
+ <template #layer-3>
70
+ <div class="demo-layer demo-layer--overlay">layer-3 (overlay)</div>
71
+ </template>
72
+ </GridStack>
73
+ </LayoutRow>
74
+
75
+ <!-- Controls -->
76
+ <LayoutRow tag="div" variant="full-width">
77
+ <div class="grid-stack-demo-controls">
78
+ <p class="demo-controls__heading">Props (video demo)</p>
79
+ <div class="demo-controls__row">
80
+ <MultipleRadiobuttons
81
+ v-model="tag"
82
+ v-model:field-data="tagData"
83
+ name="tag"
84
+ label="tag"
85
+ legend="tag"
86
+ error-message=""
87
+ :is-button="true"
88
+ :is-pill="true"
89
+ :field-has-error="false"
90
+ options-layout="inline"
91
+ />
92
+ </div>
93
+ </div>
94
+ </LayoutRow>
95
+ </template>
96
+ </NuxtLayout>
97
+ </div>
98
+ </template>
99
+
100
+ <script setup lang="ts">
101
+ import type { IFormMultipleOptions } from "~/types/forms/types.forms";
102
+
103
+ definePageMeta({
104
+ layout: false,
105
+ });
106
+
107
+ useHead({
108
+ title: "GridStack",
109
+ meta: [{ name: "description", content: "GridStack component demo" }],
110
+ bodyAttrs: { class: "grid-stack-page" },
111
+ });
112
+
113
+ const tag = ref<"div" | "section" | "article" | "main">("div");
114
+
115
+ const tagData = ref<IFormMultipleOptions>({
116
+ data: [
117
+ { id: "tag-div", name: "tag", value: "div", label: "div" },
118
+ { id: "tag-section", name: "tag", value: "section", label: "section" },
119
+ { id: "tag-article", name: "tag", value: "article", label: "article" },
120
+ { id: "tag-main", name: "tag", value: "main", label: "main" },
121
+ ],
122
+ total: 4,
123
+ skip: 0,
124
+ limit: 4,
125
+ });
126
+ </script>
127
+
128
+ <style lang="css">
129
+ .grid-stack-page {
130
+ code {
131
+ font-family: monospace;
132
+ font-size: 0.9em;
133
+ background: var(--slate-02);
134
+ padding: 0.1em 0.4em;
135
+ border-radius: 0.3rem;
136
+ }
137
+
138
+ .mbe-16 {
139
+ margin-block-end: 1.6rem;
140
+ }
141
+ .mbe-48 {
142
+ margin-block-end: 4.8rem;
143
+ }
144
+
145
+ /* Colored layer demos */
146
+ .grid-stack-demo {
147
+ border-radius: 0.8rem;
148
+ overflow: hidden;
149
+ }
150
+
151
+ .demo-layer {
152
+ display: flex;
153
+ align-items: center;
154
+ justify-content: center;
155
+ min-block-size: 20rem;
156
+ font-size: 1.4rem;
157
+ font-weight: 600;
158
+ border-radius: 0.8rem;
159
+ }
160
+
161
+ .demo-layer--base {
162
+ background: var(--slate-03);
163
+ color: var(--slate-09);
164
+ }
165
+
166
+ .demo-layer--mid {
167
+ background: color-mix(in srgb, var(--orange-06) 40%, transparent);
168
+ color: var(--orange-10);
169
+ margin: 2rem;
170
+ border-radius: 0.6rem;
171
+ border: 2px dashed var(--orange-07);
172
+ }
173
+
174
+ .demo-layer--overlay {
175
+ display: flex;
176
+ align-items: flex-end;
177
+ justify-content: flex-start;
178
+ padding: 1.6rem;
179
+ background: linear-gradient(to top, color-mix(in srgb, var(--slate-10) 60%, transparent) 0%, transparent 60%);
180
+ color: white;
181
+ border-radius: 0.8rem;
182
+ pointer-events: none;
183
+ }
184
+
185
+ /* Video overlay demo */
186
+ .video-overlay {
187
+ display: grid;
188
+ place-items: center;
189
+ pointer-events: none;
190
+ }
191
+
192
+ .video-overlay__content {
193
+ text-align: center;
194
+ padding: 2.4rem;
195
+ pointer-events: auto;
196
+ }
197
+
198
+ .video-overlay__eyebrow {
199
+ font-size: 1.1rem;
200
+ font-weight: 700;
201
+ text-transform: uppercase;
202
+ letter-spacing: 0.12em;
203
+ color: white;
204
+ margin-block-end: 0.8rem;
205
+ opacity: 0.8;
206
+ }
207
+
208
+ .video-overlay__heading {
209
+ font-size: 4rem;
210
+ font-weight: 700;
211
+ color: white;
212
+ margin-block-end: 1.2rem;
213
+ text-shadow: 0 2px 12px rgba(0 0 0 / 0.5);
214
+ }
215
+
216
+ .video-overlay__body {
217
+ font-size: 1.6rem;
218
+ color: white;
219
+ opacity: 0.9;
220
+ text-shadow: 0 1px 6px rgba(0 0 0 / 0.4);
221
+ }
222
+
223
+ .video-overlay__body code {
224
+ background: rgba(0 0 0 / 0.3);
225
+ color: white;
226
+ }
227
+
228
+ /* Controls */
229
+ .grid-stack-demo-controls {
230
+ padding: 1.6rem;
231
+ border: 1px solid var(--slate-06);
232
+ border-radius: 0.8rem;
233
+
234
+ .demo-controls__heading {
235
+ font-size: 1.1rem;
236
+ font-weight: 600;
237
+ text-transform: uppercase;
238
+ letter-spacing: 0.08em;
239
+ color: var(--slate-08);
240
+ margin-block-end: 1.2rem;
241
+ }
242
+
243
+ .demo-controls__row {
244
+ margin-block-end: 1.2rem;
245
+
246
+ &:last-child {
247
+ margin-block-end: 0;
248
+ }
249
+ }
250
+ }
251
+ }
252
+ </style>
@@ -2,6 +2,11 @@
2
2
  <div>
3
3
  <NuxtLayout name="default">
4
4
  <template #layout-content>
5
+ <LayoutRow tag="div" variant="full-width" :style-class-passthrough="['mbe-20']">
6
+ <h2 class="page-heading-2">GridStack</h2>
7
+ <NuxtLink class="page-body-normal" to="/grid-stack">GridStack</NuxtLink>
8
+ </LayoutRow>
9
+
5
10
  <LayoutRow tag="div" variant="full-width" :style-class-passthrough="['mbe-20']">
6
11
  <h1 class="page-heading-1">Nuxt3 Components Layer</h1>
7
12
  <p>