srcdev-nuxt-components 6.0.0 → 6.0.1

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 (81) hide show
  1. package/README.md +2 -2
  2. package/app/assets/styles/extends-layer/srcdev-components/components/_display-prompt-core.css +72 -0
  3. package/app/assets/styles/extends-layer/srcdev-components/components/index.css +1 -0
  4. package/app/assets/styles/extends-layer/srcdev-components/index.css +2 -0
  5. package/app/assets/styles/extends-layer/srcdev-components/setup/index.css +1 -0
  6. package/app/assets/styles/extends-layer/srcdev-components/setup/themes/_error.css +15 -0
  7. package/app/assets/styles/extends-layer/srcdev-components/setup/themes/_info.css +15 -0
  8. package/app/assets/styles/extends-layer/srcdev-components/setup/themes/_secondary.css +15 -0
  9. package/app/assets/styles/extends-layer/srcdev-components/setup/themes/_success.css +15 -0
  10. package/app/assets/styles/extends-layer/srcdev-components/setup/themes/_warning.css +15 -0
  11. package/app/assets/styles/extends-layer/srcdev-components/setup/themes/index.css +5 -0
  12. package/app/assets/styles/main.css +2 -0
  13. package/app/assets/styles/setup/_head.css +36 -0
  14. package/app/assets/styles/setup/a11y/_utils.css +20 -0
  15. package/app/assets/styles/setup/a11y/_variables.css +8 -0
  16. package/app/assets/styles/setup/a11y/index.css +2 -0
  17. package/app/assets/styles/setup/index.css +5 -0
  18. package/app/assets/styles/setup/typography/index.css +2 -0
  19. package/app/assets/styles/setup/typography/utility-classes/_generic-font-classes.css +217 -0
  20. package/app/assets/styles/setup/typography/utility-classes/_generic-font-variation-settings.css +29 -0
  21. package/app/assets/styles/setup/typography/utility-classes/_generic-font-weights.css +39 -0
  22. package/app/assets/styles/setup/typography/utility-classes/index.css +3 -0
  23. package/app/assets/styles/setup/typography/vars/_colors.css +14 -0
  24. package/app/assets/styles/setup/typography/vars/_reponsive-font-sizes.css +12 -0
  25. package/app/assets/styles/setup/typography/vars/index.css +2 -0
  26. package/app/assets/styles/setup/utility-classes/_fluid-spacing.css +13 -0
  27. package/app/assets/styles/setup/utility-classes/animations/_auto-rotate.css +13 -0
  28. package/app/assets/styles/setup/utility-classes/animations/_entry-exit-blur.css +16 -0
  29. package/app/assets/styles/setup/utility-classes/animations/_entry-slide-in.css +15 -0
  30. package/app/assets/styles/setup/utility-classes/animations/_entry-zoom-reveal.css +15 -0
  31. package/app/assets/styles/setup/utility-classes/animations/index.css +4 -0
  32. package/app/assets/styles/setup/utility-classes/index.css +2 -0
  33. package/app/assets/styles/setup/variables/colors/_blue.css +15 -0
  34. package/app/assets/styles/setup/variables/colors/_gray.css +16 -0
  35. package/app/assets/styles/setup/variables/colors/_green.css +15 -0
  36. package/app/assets/styles/setup/variables/colors/_orange.css +15 -0
  37. package/app/assets/styles/setup/variables/colors/_red.css +15 -0
  38. package/app/assets/styles/setup/variables/colors/_yellow.css +15 -0
  39. package/app/assets/styles/setup/variables/colors/index.css +6 -0
  40. package/app/assets/styles/setup/variables/index.css +1 -0
  41. package/app/components/accordian/AccordianCore.vue +46 -0
  42. package/app/components/animated-svg-text/AnimatedSvgText.vue +87 -0
  43. package/app/components/canvas-switcher/CanvasSwitcher.vue +77 -0
  44. package/app/components/carousel-basic/CarouselBasic.vue +291 -0
  45. package/app/components/carousel-basic/CarouselFlip.vue +461 -0
  46. package/app/components/carousel-basic/CarouselInfinite.vue +325 -0
  47. package/app/components/clip-element/ClipElement.vue +73 -0
  48. package/app/components/clipped-panels/ClippedPanel.vue +73 -0
  49. package/app/components/container-glow/ContainerGlowCore.vue +211 -0
  50. package/app/components/content-grid/ContentGrid.vue +85 -0
  51. package/app/components/deep-expanding-menu/DeepExpandingMenu.vue +214 -0
  52. package/app/components/deep-expanding-menu/DeepExpandingMenuOld.vue +218 -0
  53. package/app/components/display-banner/DisplayBanner.vue +63 -0
  54. package/app/components/display-details/DisplayDetailsCore.vue +301 -0
  55. package/app/components/display-dialog/DisplayDialogCore.vue +255 -0
  56. package/app/components/display-dialog/variants/DisplayDialogConfirm.vue +45 -0
  57. package/app/components/display-dialog/variants/DisplayDialogScrollableContent.vue +49 -0
  58. package/app/components/display-grid/DisplayGridCore.vue +22 -0
  59. package/app/components/display-prompt/DisplayPromptCore.vue +187 -0
  60. package/app/components/display-prompt/variants/DisplayPromptError.vue +53 -0
  61. package/app/components/expanding-panel/ExpandingPanel.vue +124 -0
  62. package/app/components/image-galleries/SliderGallery.vue +784 -0
  63. package/app/components/layout-grids/LayoutGridA.vue +103 -0
  64. package/app/components/layout-grids/LayoutGridB.vue +132 -0
  65. package/app/components/layout-row/LayoutRow.vue +165 -0
  66. package/app/components/masonry-grid/MasonryGrid.vue +62 -0
  67. package/app/components/masonry-grid-ordered/MasonryGridOrdered.vue +158 -0
  68. package/app/components/masonry-grid-sorted/MasonryGridSorted.vue +115 -0
  69. package/app/components/pop-over/PopOver.vue +88 -0
  70. package/app/components/responsive-header/NavigationItems.vue +169 -0
  71. package/app/components/responsive-header/ResponsiveHeader.vue +686 -0
  72. package/app/components/rotating-carousel/RotatingCarouselImage.vue +200 -0
  73. package/app/components/skip-links/SkipLinks.vue +92 -0
  74. package/app/components/tabs/TabsCore.vue +277 -0
  75. package/app/composables/useDialogControls.ts +44 -0
  76. package/app/composables/useStyleClassPassthrough.ts +35 -0
  77. package/app/composables/useTabs.ts +201 -0
  78. package/app/types/gallery-data.ts +13 -0
  79. package/app/types/responsiveHeader.ts +38 -0
  80. package/app/types/types.carousel-basic.ts +19 -0
  81. package/package.json +3 -6
@@ -0,0 +1,85 @@
1
+ <template>
2
+ <div class="ui-content-grid" :class="[applyClasses]" :data-testid="dataTestid">
3
+ <div v-if="hasSlot1" class="col-1">
4
+ <slot name="slot1"></slot>
5
+ </div>
6
+ <div v-if="hasSlot2" class="col-2">
7
+ <slot name="slot2"></slot>
8
+ </div>
9
+ </div>
10
+ </template>
11
+
12
+ <script setup lang="ts">
13
+ const props = defineProps({
14
+ dataTestid: {
15
+ type: String,
16
+ default: 'ui-content-grid',
17
+ },
18
+ applyClasses: {
19
+ type: String,
20
+ default: '',
21
+ },
22
+ });
23
+
24
+ const slots = useSlots();
25
+ const hasSlot1 = ref(slots.slot1 !== undefined);
26
+ const hasSlot2 = ref(slots.slot2 !== undefined);
27
+ </script>
28
+
29
+ <style lang="css">
30
+ .ui-content-grid {
31
+ --_margin-inline: 0;
32
+ --_grid-template-columns: repeat(4, 1fr);
33
+ --_grid-template-rows: repeat(2, auto);
34
+ --_grid-gap: 1.6rem;
35
+
36
+ display: grid;
37
+ gap: var(--_grid-gap);
38
+ grid-template-columns: var(--_grid-template-columns);
39
+ grid-template-rows: var(--_grid-template-rows);
40
+ margin-inline: var(--_margin-inline);
41
+
42
+ @container content (min-width: 768px) {
43
+ --_margin-inline: 0;
44
+ --_grid-template-columns: repeat(6, 1fr);
45
+ --_grid-gap: 3.2rem;
46
+ }
47
+
48
+ @container content (min-width: 1024px) {
49
+ --_margin-inline: 0;
50
+ --_grid-template-columns: repeat(12, 1fr);
51
+ --_grid-template-rows: initial;
52
+ }
53
+
54
+ .col-1 {
55
+ --_grid-column: 1 / span 4;
56
+ --_grid-row: 1;
57
+ grid-column: var(--_grid-column);
58
+ grid-row: var(--_grid-row);
59
+
60
+ @container content (min-width: 768px) {
61
+ --_grid-column: 1 / span 6;
62
+ }
63
+
64
+ @container content (min-width: 1024px) {
65
+ --_grid-column: 1 / span 6;
66
+ }
67
+ }
68
+
69
+ .col-2 {
70
+ --_grid-column: 1 / span 4;
71
+ --_grid-row: 2;
72
+ grid-column: var(--_grid-column);
73
+ grid-row: var(--_grid-row);
74
+
75
+ @container content (min-width: 768px) {
76
+ --_grid-column: 1 / span 6;
77
+ }
78
+
79
+ @container content (min-width: 1024px) {
80
+ --_grid-column: 7 / span 6;
81
+ --_grid-row: 1;
82
+ }
83
+ }
84
+ }
85
+ </style>
@@ -0,0 +1,214 @@
1
+ <template>
2
+ <component :is="tag" class="deep-expanding-menu" :class="[elementClasses]">
3
+ <div class="inner">
4
+ <template v-for="(link, key) in navLinks" :key="key">
5
+ <NuxtLink v-if="link.path" :to="link.path" class="navigation-link">{{ link.name }}</NuxtLink>
6
+
7
+ <div v-else class="navigation-group" :style="`--_anchor-name: --anchor-nav-1-${key};`" ref="detailsRef">
8
+ <button :popovertarget="`popovertarget-nav-1-${key}`" class="navigation-group-toggle">
9
+ <span>{{ link.name }}</span>
10
+ <Icon name="bi:caret-down-fill" class="icon" />
11
+ </button>
12
+
13
+ <div class="navigation-group-panel" popover role="menu" :id="`popovertarget-nav-1-${key}`">
14
+ <h4 class="heading-4 mb-6">{{ link.childLinksTitle }}</h4>
15
+ <ul class="navigation-group-list">
16
+ <li class="navigation-group-item" v-for="childLink in link.childLinks" :key="childLink.name">
17
+ <NuxtLink :to="childLink.path" class="navigation-group-link">{{ childLink.name }}</NuxtLink>
18
+ </li>
19
+ </ul>
20
+ </div>
21
+ </div>
22
+ </template>
23
+ </div>
24
+ </component>
25
+ </template>
26
+
27
+ <script lang="ts">
28
+ const TAGS_ALLOWED = <string[]>['div', 'section', 'nav', 'ul', 'ol'];
29
+
30
+ interface ResponsiveHeaderNavItem {
31
+ name: string;
32
+ path?: string;
33
+ isExternal?: boolean;
34
+ childLinks?: ResponsiveHeaderNavItem[];
35
+ childLinksTitle?: string;
36
+ }
37
+ </script>
38
+
39
+ <script setup lang="ts">
40
+ const props = defineProps({
41
+ tag: {
42
+ type: String,
43
+ default: 'nav',
44
+ validator(value: string) {
45
+ return TAGS_ALLOWED.includes(value);
46
+ },
47
+ },
48
+ navLinks: {
49
+ type: Array as PropType<ResponsiveHeaderNavItem[]>,
50
+ default: () => [],
51
+ },
52
+ styleClassPassthrough: {
53
+ type: Array as PropType<string[]>,
54
+ default: () => [],
55
+ },
56
+ });
57
+
58
+ const { elementClasses, resetElementClasses } = useStyleClassPassthrough(props.styleClassPassthrough);
59
+ // const detailsRef = useTemplateRef('detailsRef');
60
+
61
+ watch(
62
+ () => props.styleClassPassthrough,
63
+ () => {
64
+ resetElementClasses(props.styleClassPassthrough);
65
+ }
66
+ );
67
+ </script>
68
+
69
+ <style lang="css">
70
+ @layer deep-expanding-menu-setup {
71
+ @position-try --anchor-left {
72
+ inset: auto;
73
+ top: calc(anchor(bottom) + 10px);
74
+ left: calc(anchor(left) + 10px);
75
+ }
76
+
77
+ @position-try-fallbacks --anchor-right {
78
+ inset: auto;
79
+ top: calc(anchor(bottom) + 10px);
80
+ right: calc(anchor(right) + 10px);
81
+ }
82
+
83
+ .deep-expanding-menu {
84
+ --_gap-between-top-level-items: 24px;
85
+
86
+ container-type: inline-size;
87
+ display: grid;
88
+ grid-template-areas: 'element-stack';
89
+
90
+ .inner {
91
+ grid-area: element-stack;
92
+ display: flex;
93
+ gap: var(--_gap-between-top-level-items);
94
+ align-items: center;
95
+
96
+ .navigation-link,
97
+ .navigation-group-toggle {
98
+ all: unset;
99
+ border-bottom: 2px solid transparent;
100
+ padding-block: 8px;
101
+
102
+ transition: border-color 200ms;
103
+
104
+ &:hover {
105
+ cursor: pointer;
106
+ border-color: light-dark(var(--blue-12), var(--gray-0));
107
+ }
108
+
109
+ &:focus {
110
+ border-color: light-dark(var(--blue-12), var(--gray-0));
111
+ }
112
+
113
+ &:focus-visible {
114
+ border-color: light-dark(var(--blue-12), var(--gray-0));
115
+ }
116
+ }
117
+
118
+ .navigation-group {
119
+ --_icon-transform: scaleY(1);
120
+ position: relative;
121
+
122
+ .navigation-group-toggle {
123
+ anchor-name: var(--_anchor-name);
124
+
125
+ display: flex;
126
+ align-items: center;
127
+ gap: 12px;
128
+
129
+ .icon {
130
+ display: block;
131
+ font-size: 1.2rem;
132
+
133
+ transform: var(--_icon-transform);
134
+ transition: transform 200ms;
135
+ }
136
+ }
137
+
138
+ .navigation-group-panel {
139
+ display: none;
140
+ position: absolute;
141
+ position-anchor: var(--_anchor-name);
142
+ margin: 0;
143
+ /* inset: auto; */
144
+ top: calc(anchor(bottom) + 10px);
145
+ left: calc(anchor(left) + 0px);
146
+
147
+ opacity: 0;
148
+ transition: opacity 200ms, display 200ms, overlay 200ms;
149
+ transition-behavior: allow-discrete;
150
+
151
+ width: min(100%, 50vw);
152
+
153
+ background-color: white;
154
+ border: 1px solid black;
155
+ border-radius: 12px;
156
+ box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
157
+ padding: 12px;
158
+ overflow: clip;
159
+
160
+ &:popover-open {
161
+ display: block;
162
+ opacity: 1;
163
+
164
+ @starting-style {
165
+ display: block;
166
+ opacity: 0;
167
+ }
168
+ }
169
+
170
+ h4 {
171
+ color: var(--gray-12);
172
+ }
173
+
174
+ .navigation-group-list {
175
+ display: grid;
176
+ grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
177
+ gap: 12px;
178
+ padding-inline-start: 0;
179
+ margin-block-end: 8px;
180
+
181
+ .navigation-group-item {
182
+ display: block;
183
+
184
+ a.navigation-group-link {
185
+ display: inline-block;
186
+ color: var(--gray-12);
187
+ text-decoration: none;
188
+ padding-block: 8px;
189
+
190
+ border-bottom: 2px solid transparent;
191
+
192
+ transition: border-color 200ms;
193
+
194
+ &:hover {
195
+ cursor: pointer;
196
+ border-color: var(--gray-12);
197
+ }
198
+
199
+ &:focus-visible {
200
+ border-color: var(--gray-12);
201
+ }
202
+ }
203
+ }
204
+ }
205
+ }
206
+
207
+ &:has(.navigation-group-panel:popover-open) {
208
+ --_icon-transform: scaleY(-1);
209
+ }
210
+ }
211
+ }
212
+ }
213
+ }
214
+ </style>
@@ -0,0 +1,218 @@
1
+ <template>
2
+ <component :is="tag" class="deep-expanding-menu-old" :class="[elementClasses]">
3
+ <div class="inner">
4
+ <template v-for="(link, key) in navLinks" :key="key">
5
+ <NuxtLink v-if="link.path" :to="link.path" class="navigation-link">{{ link.name }}</NuxtLink>
6
+ <details v-else class="navigation-group" name="navigation-group" ref="navigationGroupRef">
7
+ <summary class="navigation-group-toggle">
8
+ <span>{{ link.name }}</span>
9
+ <Icon name="bi:caret-down-fill" class="icon" />
10
+ </summary>
11
+ <div class="navigation-group-panel" :id="`popovertarget-nav-1-${key}`">
12
+ <h4 class="heading-4 mb-6">{{ link.childLinksTitle }}</h4>
13
+ <ul class="navigation-group-list">
14
+ <li class="navigation-group-item" v-for="childLink in link.childLinks" :key="childLink.name">
15
+ <NuxtLink :to="childLink.path" class="navigation-group-link">{{ childLink.name }}</NuxtLink>
16
+ </li>
17
+ </ul>
18
+ </div>
19
+ </details>
20
+ </template>
21
+ </div>
22
+ </component>
23
+ </template>
24
+
25
+ <script setup lang="ts">
26
+ import { onClickOutside } from '@vueuse/core';
27
+
28
+ const props = defineProps({
29
+ tag: {
30
+ type: String,
31
+ default: 'nav',
32
+ validator(value: string) {
33
+ return TAGS_ALLOWED.includes(value);
34
+ },
35
+ },
36
+ navLinks: {
37
+ type: Array as PropType<ResponsiveHeaderNavItem[]>,
38
+ default: () => [],
39
+ },
40
+ styleClassPassthrough: {
41
+ type: Array as PropType<string[]>,
42
+ default: () => [],
43
+ },
44
+ });
45
+
46
+ const { elementClasses, resetElementClasses } = useStyleClassPassthrough(props.styleClassPassthrough);
47
+
48
+ const navigationGroupRef = useTemplateRef<HTMLElement[]>('navigationGroupRef');
49
+
50
+ watch(
51
+ () => props.styleClassPassthrough,
52
+ () => {
53
+ resetElementClasses(props.styleClassPassthrough);
54
+ }
55
+ );
56
+
57
+ onMounted(() => {
58
+ navigationGroupRef.value?.forEach((element, index) => {
59
+ onClickOutside(element, () => {
60
+ navigationGroupRef.value?.[index]?.removeAttribute('open');
61
+ });
62
+ });
63
+ });
64
+ </script>
65
+
66
+ <script lang="ts">
67
+ const TAGS_ALLOWED = <string[]>['div', 'section', 'nav', 'ul', 'ol'];
68
+
69
+ interface ResponsiveHeaderNavItem {
70
+ name: string;
71
+ path?: string;
72
+ isExternal?: boolean;
73
+ childLinksTitle?: string;
74
+ childLinks?: ResponsiveHeaderNavItem[];
75
+ }
76
+ </script>
77
+
78
+ <style lang="css">
79
+ @layer popover-setup {
80
+ .deep-expanding-menu-old {
81
+ container-type: inline-size;
82
+ display: grid;
83
+ grid-template-areas: 'element-stack';
84
+ align-items: center;
85
+ gap: 12px;
86
+
87
+ .inner {
88
+ grid-area: element-stack;
89
+ display: flex;
90
+ gap: 24px;
91
+ align-items: center;
92
+ z-index: 1;
93
+
94
+ .navigation-link,
95
+ .navigation-group-toggle {
96
+ all: unset;
97
+ border-bottom: 2px solid transparent;
98
+ padding-block: 8px;
99
+
100
+ transition: border-color 200ms;
101
+
102
+ &:hover {
103
+ cursor: pointer;
104
+ border-color: light-dark(var(--blue-12), var(--gray-0));
105
+ }
106
+
107
+ &:focus {
108
+ border-color: light-dark(var(--blue-12), var(--gray-0));
109
+ }
110
+
111
+ &:focus-visible {
112
+ border-color: light-dark(var(--blue-12), var(--gray-0));
113
+ }
114
+ }
115
+
116
+ .navigation-group {
117
+ --_icon-transform: scaleY(1);
118
+
119
+ display: grid;
120
+ grid-template-areas: 'details-stack';
121
+ z-index: 1;
122
+ position: relative;
123
+
124
+ summary::-webkit-details-marker,
125
+ summary::marker {
126
+ display: none;
127
+ }
128
+
129
+ &[open] {
130
+ --_icon-transform: scaleY(-1);
131
+ }
132
+
133
+ .navigation-group-toggle {
134
+ grid-area: details-stack;
135
+
136
+ display: flex !important;
137
+ align-items: center;
138
+ gap: 12px;
139
+ list-style: none;
140
+
141
+ .icon {
142
+ display: block;
143
+ font-size: 1.2rem;
144
+
145
+ transform: var(--_icon-transform);
146
+ transition: transform 200ms;
147
+ }
148
+ }
149
+
150
+ .navigation-group-panel {
151
+ background-color: black;
152
+ display: grid;
153
+ grid-area: details-stack;
154
+ z-index: 2;
155
+ position: absolute;
156
+ inset: auto;
157
+ top: 40px;
158
+ left: 0px;
159
+ gap: 12px;
160
+
161
+ width: 200px;
162
+
163
+ @media screen and (min-width: 768px) {
164
+ width: 400px;
165
+ }
166
+
167
+ @media screen and (min-width: 1024px) {
168
+ width: 600px;
169
+ }
170
+
171
+ background-color: white;
172
+ border: 1px solid black;
173
+ border-radius: 12px;
174
+ box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
175
+ padding: 12px;
176
+ overflow: clip;
177
+
178
+ h4 {
179
+ color: var(--gray-12);
180
+ }
181
+
182
+ .navigation-group-list {
183
+ display: grid;
184
+ grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
185
+ gap: 12px;
186
+ padding-inline-start: 0;
187
+ margin-block-end: 8px;
188
+
189
+ .navigation-group-item {
190
+ display: block;
191
+
192
+ a.navigation-group-link {
193
+ display: inline-block;
194
+ color: var(--gray-12);
195
+ text-decoration: none;
196
+ padding-block: 8px;
197
+
198
+ border-bottom: 2px solid transparent;
199
+
200
+ transition: border-color 200ms;
201
+
202
+ &:hover {
203
+ cursor: pointer;
204
+ border-color: var(--gray-12);
205
+ }
206
+
207
+ &:focus-visible {
208
+ border-color: var(--gray-12);
209
+ }
210
+ }
211
+ }
212
+ }
213
+ }
214
+ }
215
+ }
216
+ }
217
+ }
218
+ </style>
@@ -0,0 +1,63 @@
1
+ <template>
2
+ <component :is="tag" class="display-banner" :class="[elementClasses]">
3
+ <div v-if="$slots.canvas" class="canvas">
4
+ <slot name="canvas"></slot>
5
+ </div>
6
+ <div v-if="$slots.content" class="content">
7
+ <slot name="content"></slot>
8
+ </div>
9
+ </component>
10
+ </template>
11
+
12
+ <script lang="ts">
13
+ const TAGS_ALLOWED = <string[]>['div', 'p', 'span', 'section', 'article', 'aside', 'header', 'footer', 'main', 'nav', 'ul', 'ol'];
14
+ </script>
15
+
16
+ <script setup lang="ts">
17
+
18
+ const props = defineProps({
19
+ tag: {
20
+ type: String,
21
+ default: 'div',
22
+ validator(value: string) {
23
+ return TAGS_ALLOWED.includes(value);
24
+ },
25
+ },
26
+ styleClassPassthrough: {
27
+ type: Array as PropType<string[]>,
28
+ default: () => [],
29
+ },
30
+ });
31
+
32
+ const { elementClasses, resetElementClasses } = useStyleClassPassthrough(props.styleClassPassthrough);
33
+
34
+ watch(
35
+ () => props.styleClassPassthrough,
36
+ () => {
37
+ resetElementClasses(props.styleClassPassthrough);
38
+ }
39
+ );
40
+ </script>
41
+
42
+ <style lang="css">
43
+ .display-banner {
44
+ display: grid;
45
+ grid-template-areas: 'banner';
46
+ container-type: inline-size;
47
+ overflow: hidden;
48
+
49
+ .canvas {
50
+ grid-area: banner;
51
+
52
+ .image {
53
+ object-fit: cover;
54
+ width: 100%;
55
+ height: 100%;
56
+ }
57
+ }
58
+
59
+ .content {
60
+ grid-area: banner;
61
+ }
62
+ }
63
+ </style>