srcdev-nuxt-components 3.0.0 → 4.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 (90) hide show
  1. package/assets/styles/a11y/_utils.css +20 -0
  2. package/assets/styles/a11y/_variables.css +8 -0
  3. package/assets/styles/a11y/index.css +2 -0
  4. package/assets/styles/forms/index.css +2 -0
  5. package/assets/styles/forms/themes/_error.css +77 -0
  6. package/assets/styles/forms/themes/_ghost.css +77 -0
  7. package/assets/styles/forms/themes/_input-action.css +20 -0
  8. package/assets/styles/forms/themes/_primary.css +82 -0
  9. package/assets/styles/forms/themes/_secondary.css +77 -0
  10. package/assets/styles/forms/themes/_success.css +77 -0
  11. package/assets/styles/forms/themes/_tertiary.css +77 -0
  12. package/assets/styles/forms/themes/_warning.css +77 -0
  13. package/assets/styles/forms/themes/index.css +8 -0
  14. package/assets/styles/forms/variables/_sizes.css +82 -0
  15. package/assets/styles/forms/variables/_theme.css +11 -0
  16. package/assets/styles/forms/variables/index.css +2 -0
  17. package/assets/styles/main.css +5 -0
  18. package/assets/styles/typography/index.css +2 -0
  19. package/assets/styles/typography/utils/_font-classes.css +160 -0
  20. package/assets/styles/typography/utils/_weights.css +69 -0
  21. package/assets/styles/typography/utils/index.css +2 -0
  22. package/assets/styles/typography/variables/_colors.css +14 -0
  23. package/assets/styles/typography/variables/_reponsive-font-size.css +10 -0
  24. package/assets/styles/typography/variables/index.css +2 -0
  25. package/assets/styles/utils/_animations.css +42 -0
  26. package/assets/styles/utils/_canvasWidths.css +18 -0
  27. package/assets/styles/utils/_display.css +7 -0
  28. package/assets/styles/utils/_margin-helpers.css +334 -0
  29. package/assets/styles/utils/_padding-helpers.css +308 -0
  30. package/assets/styles/utils/_page.css +24 -0
  31. package/assets/styles/utils/_placement.css +73 -0
  32. package/assets/styles/utils/index.css +7 -0
  33. package/assets/styles/variables/colors/_blue.css +15 -0
  34. package/assets/styles/variables/colors/_gray.css +16 -0
  35. package/assets/styles/variables/colors/_green.css +15 -0
  36. package/assets/styles/variables/colors/_orange.css +15 -0
  37. package/assets/styles/variables/colors/_red.css +15 -0
  38. package/assets/styles/variables/colors/_yellow.css +15 -0
  39. package/assets/styles/variables/colors/colors.css +6 -0
  40. package/assets/styles/variables/components/_accordian.css +7 -0
  41. package/assets/styles/variables/components/_container-glow-core.css +16 -0
  42. package/assets/styles/variables/components/_display-dialog-core.css +35 -0
  43. package/assets/styles/variables/components/_tabs.css +18 -0
  44. package/assets/styles/variables/components/display-prompt-core/_scaffolding.css +57 -0
  45. package/assets/styles/variables/components/display-prompt-core/index.css +2 -0
  46. package/assets/styles/variables/components/display-prompt-core/themes/_error.css +39 -0
  47. package/assets/styles/variables/components/display-prompt-core/themes/_info.css +39 -0
  48. package/assets/styles/variables/components/display-prompt-core/themes/_success.css +39 -0
  49. package/assets/styles/variables/components/display-prompt-core/themes/_warning.css +39 -0
  50. package/assets/styles/variables/components/display-prompt-core/themes/index.css +4 -0
  51. package/assets/styles/variables/components/index.css +5 -0
  52. package/assets/styles/variables/index.css +2 -0
  53. package/components/animated-svg-text/AnimatedSvgText.vue +87 -0
  54. package/components/canvas-switcher/CanvasSwitcher.vue +77 -0
  55. package/components/carousel-basic/CarouselBasic.vue +241 -0
  56. package/components/carousel-basic/CarouselFlip.vue +378 -0
  57. package/components/clip-element/ClipElement.vue +73 -0
  58. package/components/clipped-panels/ClippedPanel.vue +73 -0
  59. package/components/deep-expanding-menu/DeepExpandingMenu.vue +214 -0
  60. package/components/deep-expanding-menu/DeepExpandingMenuOld.vue +218 -0
  61. package/components/display-banner/DisplayBanner.vue +63 -0
  62. package/components/display-details/DisplayDetailsCore.vue +312 -0
  63. package/components/functional/accordian/AccordianCore.vue +138 -0
  64. package/components/functional/display-dialog/DisplayDialogCore.vue +244 -0
  65. package/components/functional/display-dialog/variants/DisplayDialogConfirm.vue +45 -0
  66. package/components/functional/display-dialog/variants/DisplayDialogScrollableContent.vue +49 -0
  67. package/components/functional/pop-over/PopOver.vue +88 -0
  68. package/components/image-galleries/SliderGallery.vue +784 -0
  69. package/components/masonry-grid-ordered/MasonryGridOrdered.vue +158 -0
  70. package/components/presentation/container-glow/ContainerGlowCore.vue +211 -0
  71. package/components/presentation/display-grid/DisplayGridCore.vue +22 -0
  72. package/components/presentation/display-prompt/DisplayPromptCore.vue +150 -0
  73. package/components/presentation/display-prompt/variants/DisplayPromptError.vue +53 -0
  74. package/components/presentation/layout-grids/LayoutGridA.vue +103 -0
  75. package/components/presentation/layout-grids/LayoutGridB.vue +132 -0
  76. package/components/presentation/layout-row/LayoutRow.vue +157 -0
  77. package/components/presentation/masonry-grid/MasonryGrid.vue +62 -0
  78. package/components/presentation/masonry-grid-sorted/MasonryGridSorted.vue +115 -0
  79. package/components/presentation/tabs/TabsCore.vue +308 -0
  80. package/components/responsive-header/NavigationItems.vue +164 -0
  81. package/components/responsive-header/ResponsiveHeader.vue +586 -0
  82. package/components/rotating-carousel/RotatingCarouselImage.vue +200 -0
  83. package/composables/useDialogControls.ts +23 -0
  84. package/composables/useStyleClassPassthrough.ts +35 -0
  85. package/composables/useTabs.ts +201 -0
  86. package/nuxt.config.ts +0 -3
  87. package/package.json +7 -7
  88. package/types/gallery-data.ts +13 -0
  89. package/types/responsiveHeader.ts +38 -0
  90. package/types/types.carousel-basic.ts +19 -0
@@ -0,0 +1,308 @@
1
+ <template>
2
+ <div class="tabs-core" :class="`axis-${axis}`">
3
+ <ul role="tablist" aria-labelledby="channel-name" ref="tabsNavRef" @mouseleave="resetHoverToActivePosition()" class="tabs-list" :class="[elementClasses]">
4
+ <li v-for="(index, key) in navItems" :key="key">
5
+ <button
6
+ @click.prevent="navItemClicked($event)"
7
+ @mouseover="navItemHovered($event)"
8
+ :id="`tab-${key}-trigger`"
9
+ :data-tab-index="key"
10
+ data-nav-item
11
+ role="tab"
12
+ aria-selected="false"
13
+ class="tabs-list-item"
14
+ >
15
+ <slot :name="`tab-${key}-trigger`"></slot>
16
+ </button>
17
+ </li>
18
+ </ul>
19
+ <div class="tab-content-wrapper">
20
+ <div v-for="(item, key) in navItems" :key="key" class="tab-content" :aria-labelledby="`tab-${key}-trigger`" :id="`tab-${key}-content`" role="region" aria-hidden="true" ref="tabsContentRefs">
21
+ <slot :name="`tab-${key}-content`"></slot>
22
+ </div>
23
+ </div>
24
+ </div>
25
+ </template>
26
+
27
+ <script setup lang="ts">
28
+ import type { ITabNav } from '@/types/types.tabs';
29
+
30
+ const props = defineProps({
31
+ tag: {
32
+ type: String as PropType<string>,
33
+ default: 'button',
34
+ },
35
+ axis: {
36
+ type: String as PropType<'x' | 'y'>,
37
+ default: 'x',
38
+ },
39
+ transitionDuration: {
40
+ type: Number as PropType<number>,
41
+ default: 200,
42
+ },
43
+ navItems: {
44
+ type: Array as PropType<ITabNav[]>,
45
+ required: true,
46
+ },
47
+ trackHover: {
48
+ type: Boolean as PropType<boolean>,
49
+ default: true,
50
+ },
51
+ trackActive: {
52
+ type: Boolean as PropType<boolean>,
53
+ default: true,
54
+ },
55
+ trackIndicator: {
56
+ type: Boolean as PropType<boolean>,
57
+ default: true,
58
+ },
59
+ styleClassPassthrough: {
60
+ type: Array as PropType<string[]>,
61
+ default: () => [],
62
+ },
63
+ });
64
+
65
+ const { elementClasses } = useStyleClassPassthrough(props.styleClassPassthrough);
66
+
67
+ const tabsNavRef = ref<HTMLElement | null>(null);
68
+ const tabsContentRefs = ref<HTMLElement[] | null>(null);
69
+
70
+ const { initNavDecorators, navItemClicked, navItemHovered, resetHoverToActivePosition } = useTabs(props.axis, tabsNavRef, tabsContentRefs, props.transitionDuration);
71
+
72
+ onMounted(() => {
73
+ initNavDecorators();
74
+ });
75
+ </script>
76
+
77
+ <style lang="css">
78
+ .tabs-core {
79
+ /*
80
+ * CSS var within /assets/styles/components/tabs.css
81
+ */
82
+ --_tabs-default-text: var(--tabs-default-text, light-dark(var(--gray-12), var(--gray-0)));
83
+ --_tabs-active-bg: var(--tabs-active-bg, light-dark(var(--gray-12), var(--gray-0)));
84
+ --_tabs-active-text: var(--tabs-active-text, light-dark(var(--gray-0), var(--gray-12)));
85
+ --_tabs-active-indicator: var(--tabs-active-indicator, light-dark(var(--gray-12), var(--gray-0)));
86
+ --_tabs-hovered-bg: var(--tabs-hovered-bg, light-dark(var(--gray-7), var(--gray-3)));
87
+ --_tabs-hovered-text: var(--tabs-hovered-text, light-dark(var(--gray-0), var(--gray-12)));
88
+ --_tabs-border-bottom: var(--tabs-border-bottom, 0.1rem solid var(--gray-6));
89
+ --_tabs-content-border: var(--tabs-content-border, 0.1rem solid var(--gray-6));
90
+ --_tabs-content-outline: var(--tabs-content-outline, 0.1rem solid var(--gray-6));
91
+ --_tabs-content-bg: var(--tabs-content-bg, light-dark(var(--gray-12), var(--gray-0)));
92
+ --_tabs-content-start-start-radius: var(--tabs-content-start-start-radius, 0);
93
+ --_tabs-content-start-end-radius: var(--tabs-content-start-end-radius, 0);
94
+ --_tabs-content-end-start-radius: var(--tabs-content-end-start-radius, 0);
95
+ --_tabs-content-end-end-radius: var(--tabs-content-end-end-radius, 0);
96
+
97
+ .tabs-list {
98
+ position: relative;
99
+ display: flex;
100
+ width: fit-content;
101
+ z-index: 1;
102
+
103
+ list-style-type: none;
104
+ margin: 0;
105
+ padding: 0;
106
+
107
+ .nav__hovered {
108
+ content: '';
109
+ position: absolute;
110
+ left: 0;
111
+ right: 0;
112
+ bottom: 0;
113
+ top: 0;
114
+ scale: var(--_width-hovered, 0.125) 1;
115
+ translate: var(--_x-hovered, 0) 0;
116
+ transform-origin: left;
117
+ transition: scale var(--_transition-duration), translate var(--_transition-duration);
118
+ z-index: 1;
119
+ }
120
+
121
+ .nav__active {
122
+ content: '';
123
+ position: absolute;
124
+ left: 0;
125
+ right: 0;
126
+ bottom: 0;
127
+ top: 0;
128
+ scale: var(--_width-active, 0.125) 1;
129
+ translate: var(--_x-active, 0) 0;
130
+ transform-origin: left;
131
+ transition: scale var(--_transition-duration), translate var(--_transition-duration);
132
+ z-index: 2;
133
+ }
134
+
135
+ .nav__active-indicator {
136
+ content: '';
137
+ position: absolute;
138
+ left: 0;
139
+ right: 0;
140
+ bottom: 0;
141
+ scale: var(--_width-active, 0.125) 1;
142
+ translate: var(--_x-active, 0) 0;
143
+ transform-origin: left;
144
+ transition: scale var(--_transition-duration), translate var(--_transition-duration);
145
+ z-index: 3;
146
+ }
147
+
148
+ .tabs-list-item {
149
+ opacity: 0.7;
150
+ position: relative;
151
+ transition: color 100ms;
152
+ z-index: 4;
153
+
154
+ &:hover {
155
+ opacity: 1;
156
+ }
157
+
158
+ &[aria-selected='true'] {
159
+ opacity: 1;
160
+ }
161
+ }
162
+
163
+ border-bottom: var(--_tabs-border-bottom);
164
+
165
+ .nav__hovered {
166
+ background: var(--_tabs-hovered-bg);
167
+ color: var(--_tabs-hovered-text);
168
+ }
169
+
170
+ .nav__active {
171
+ background: var(--_tabs-active-bg);
172
+ color: var(--_tabs-active-text);
173
+ }
174
+
175
+ .nav__active-indicator {
176
+ background: var(--_tabs-active-indicator);
177
+ height: 0.4rem;
178
+ }
179
+
180
+ .tabs-list-item {
181
+ background: transparent;
182
+ border: 0;
183
+ color: var(--_tabs-default-text);
184
+ cursor: pointer;
185
+ font: inherit;
186
+ text-transform: uppercase;
187
+ font-weight: 500;
188
+ margin: 0;
189
+ padding: 1em 2em;
190
+
191
+ &:hover {
192
+ /* background: var(--_tabs-hovered-bg); */
193
+ color: var(--_tabs-hovered-text);
194
+ }
195
+
196
+ &[aria-selected='true'] {
197
+ color: var(--_tabs-active-text);
198
+ }
199
+
200
+ &.transitioning {
201
+ color: var(--_tabs-hovered-text);
202
+ }
203
+ }
204
+ }
205
+
206
+ .tab-content-wrapper {
207
+ display: grid;
208
+ grid-template-areas: 'element-stack';
209
+
210
+ .tab-content {
211
+ grid-area: element-stack;
212
+ display: none;
213
+ }
214
+ }
215
+
216
+ /*
217
+ * User configurable variables
218
+ */
219
+
220
+ .tab-content-wrapper {
221
+ background: var(--_tabs-content-bg);
222
+ border: var(--_tabs-content-border);
223
+ border-start-start-radius: var(--_tabs-content-start-start-radius);
224
+ border-start-end-radius: var(--_tabs-content-start-end-radius);
225
+ border-end-start-radius: var(--_tabs-content-end-start-radius);
226
+ border-end-end-radius: var(--_tabs-content-end-end-radius);
227
+
228
+ outline: var(--_tabs-content-outline);
229
+
230
+ /* .tab-content {
231
+ } */
232
+ }
233
+ }
234
+
235
+ /*
236
+ * Deal with axis-y
237
+ **/
238
+
239
+ .tabs-core {
240
+ &.axis-y {
241
+ display: flex;
242
+ flex-direction: row;
243
+ gap: 2em;
244
+
245
+ .tabs-list {
246
+ flex-direction: column;
247
+
248
+ border-bottom: initial;
249
+ border-left: var(--_tabs-border-bottom);
250
+ position: relative;
251
+
252
+ .tabs-list-item {
253
+ text-align: left;
254
+ width: 100%;
255
+
256
+ /* &:hover {
257
+ color: var(--_tabs-hovered-text);
258
+ }
259
+
260
+ &[aria-selected='true'] {
261
+ color: var(--_tabs-active-text);
262
+ }
263
+
264
+ &.transitioning {
265
+ color: var(--_tabs-hovered-text);
266
+ } */
267
+ }
268
+
269
+ .nav__hovered {
270
+ left: 0;
271
+ right: initial;
272
+ bottom: initial;
273
+ top: 0;
274
+ height: var(--_y-height);
275
+ translate: 0 var(--_y-hovered, 0);
276
+ transform-origin: top;
277
+ width: var(--_y-width);
278
+ }
279
+
280
+ .nav__active {
281
+ left: 0;
282
+ right: initial;
283
+ bottom: initial;
284
+ top: 0;
285
+ height: var(--_y-height);
286
+ translate: 0 var(--_y-active, 0);
287
+ transform-origin: top;
288
+ width: var(--_y-width);
289
+ }
290
+
291
+ .nav__active-indicator {
292
+ left: 0;
293
+ right: initial;
294
+ bottom: initial;
295
+ top: 0;
296
+ height: var(--_y-height);
297
+ scale: var(--_width-active, 0.125) 1;
298
+ translate: 0 var(--_y-active, 0);
299
+ transform-origin: top;
300
+ width: 0.4em;
301
+ }
302
+ }
303
+ .tab-content-wrapper {
304
+ flex-grow: 1;
305
+ }
306
+ }
307
+ }
308
+ </style>
@@ -0,0 +1,164 @@
1
+ <template>
2
+ <div class="overflow-navigation-wrapper" :class="elementClasses">
3
+ <ul
4
+ v-for="(navGroup, groupKey) in mainNavigationState.clonedNavLinks"
5
+ :key="groupKey"
6
+ class="overflow-navigation-list"
7
+ :class="[{visible: !mainNavigationState.navListVisibility[groupKey]}]"
8
+ :style="{ '--_overflow-navigation-list-min-width': widestNavLinkWidthInMainNavigationState + 'px' }"
9
+ >
10
+ <template v-for="(link, localIndex) in navGroup" :key="localIndex">
11
+ <li
12
+ v-if="link.path"
13
+ class="overflow-navigation-item"
14
+ :class="{ 'visible': !mainNavigationState.clonedNavLinks?.[groupKey]?.[localIndex]?.config?.visible }"
15
+ :style="{ '--_main-navigation-item-width': mainNavigationState.clonedNavLinks?.[groupKey]?.[localIndex]?.config?.width + 'px' }"
16
+ :data-group-key="groupKey"
17
+ :data-local-index="localIndex"
18
+ >
19
+ <NuxtLink class="overflow-navigation-link" :to="link.path"><span class="overflow-navigation-text">{{ link.name }}</span></NuxtLink>
20
+ </li>
21
+ <li
22
+ v-else
23
+ class="overflow-navigation-item"
24
+ :class="{ 'visible': !mainNavigationState.clonedNavLinks?.[groupKey]?.[localIndex]?.config?.visible }"
25
+ :style="{ '--_main-navigation-item-width': mainNavigationState.clonedNavLinks?.[groupKey]?.[localIndex]?.config?.width + 'px' }"
26
+ :data-group-key="groupKey"
27
+ :data-local-index="localIndex"
28
+ >
29
+ <DisplayDetailsCore :id="useId()" name="overflow-navigation-group" :animation-duration="detailsAanimationDuration" icon-size="medium" :style-class-passthrough="['overflow-navigation-details']">
30
+ <template #summary>
31
+ <span class="overflow-navigation-text">{{ link.childLinksTitle }}</span>
32
+ </template>
33
+ <template #summaryIcon>
34
+ <Icon name="mdi:chevron-down" class="icon" />
35
+ </template>
36
+ <template #content>
37
+ <div class="overflow-navigation-sub-nav-inner">
38
+ <ul class="overflow-navigation-sub-nav-list">
39
+ <li v-for="childLink in link.childLinks" :key="childLink.name" class="overflow-navigation-sub-nav-item">
40
+ <NuxtLink :to="childLink.path" class="overflow-navigation-sub-nav-link"><span class="overflow-navigation-sub-nav-text">{{ childLink.name }}</span></NuxtLink>
41
+ </li>
42
+ </ul>
43
+ </div>
44
+ </template>
45
+ </DisplayDetailsCore>
46
+ </li>
47
+ </template>
48
+ </ul>
49
+ </div>
50
+ </template>
51
+
52
+ <script setup lang="ts">
53
+ import type { ResponsiveHeaderState } from '@/types/responsiveHeader';
54
+
55
+ const props = defineProps({
56
+ mainNavigationState: {
57
+ type: Object as PropType<ResponsiveHeaderState>,
58
+ default: () => [],
59
+ },
60
+ styleClassPassthrough: {
61
+ type: Array as PropType<string[]>,
62
+ default: () => [],
63
+ },
64
+ });
65
+
66
+ const detailsAanimationDuration = 200;
67
+ const detailsAanimationDurationString = `${detailsAanimationDuration}ms`;
68
+
69
+ const widestNavLinkWidthInMainNavigationState = computed(() => {
70
+ return Object.values(props.mainNavigationState.clonedNavLinks || {}).reduce((maxWidth, group) => {
71
+ return Math.max(
72
+ maxWidth,
73
+ ...group.map(link => link.config?.width || 0)
74
+ );
75
+ }, 0);
76
+ });
77
+
78
+ const { elementClasses, resetElementClasses } = useStyleClassPassthrough(props.styleClassPassthrough);
79
+
80
+ watch(
81
+ () => props.styleClassPassthrough,
82
+ () => {
83
+ resetElementClasses(props.styleClassPassthrough);
84
+ }
85
+ );
86
+ </script>
87
+
88
+ <style lang="css">
89
+
90
+ .overflow-navigation-wrapper {
91
+ display: flex;
92
+ flex-direction: column;
93
+ gap: 12px;
94
+
95
+ .overflow-navigation-list {
96
+
97
+ display: none;
98
+
99
+ &.visible {
100
+ display: flex;
101
+ flex-direction: column;
102
+ gap: 12px;
103
+ min-width: var(--_overflow-navigation-list-min-width, auto);
104
+ }
105
+
106
+ .overflow-navigation-item {
107
+
108
+ display: none;
109
+
110
+ &.visible {
111
+ display: block;
112
+ }
113
+
114
+ .overflow-navigation-link {
115
+ text-decoration: none;
116
+ color: inherit;
117
+ }
118
+
119
+ .overflow-navigation-details {
120
+ --_overflow-navigation-sub-nav-list-margin-block-start: 0;
121
+
122
+ &[open] {
123
+ --_overflow-navigation-sub-nav-list-margin-block-start: 12px;
124
+ }
125
+
126
+ &.display-details {
127
+ margin-block-end: 0;
128
+
129
+ .display-details-summary {
130
+ .label {
131
+ .overflow-navigation-text {
132
+ text-wrap: nowrap;
133
+ }
134
+ }
135
+ /* .icon {} */
136
+ }
137
+ .display-details-content {
138
+ .overflow-navigation-sub-nav-inner {
139
+ .overflow-navigation-sub-nav-list {
140
+
141
+ display: flex;
142
+ flex-direction: column;
143
+ gap: 12px;
144
+ margin-block-start: var(--_overflow-navigation-sub-nav-list-margin-block-start);
145
+ transition: margin-block-start v-bind(detailsAanimationDurationString) ease;
146
+
147
+ .overflow-navigation-sub-nav-item {
148
+
149
+ .overflow-navigation-sub-nav-link {
150
+ text-decoration: none;
151
+ color: inherit;
152
+
153
+ /* .overflow-navigation-sub-nav-text {} */
154
+ }
155
+ }
156
+ }
157
+ }
158
+ }
159
+ }
160
+ }
161
+ }
162
+ }
163
+ }
164
+ </style>