srcdev-nuxt-components 9.3.6 → 9.3.8

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 (126) hide show
  1. package/.claude/hooks/check-component-update.sh +30 -1
  2. package/.claude/skills/components/accordian-core.md +7 -7
  3. package/.claude/skills/components/breadcrumb.md +49 -0
  4. package/.claude/skills/components/content-docs.md +2 -1
  5. package/.claude/skills/components/expanding-panel.md +5 -5
  6. package/.claude/skills/components/navigation-items.md +1 -0
  7. package/.claude/skills/components/responsive-header.md +1 -0
  8. package/.claude/skills/components/service-detail.md +156 -0
  9. package/.claude/skills/components/services-card-grid.md +9 -9
  10. package/.claude/skills/components/services-card.md +82 -30
  11. package/.claude/skills/index.md +3 -1
  12. package/.claude/skills/qa-panel.md +2 -2
  13. package/.vscode/srcdev-component-breadcrumb.code-snippets +14 -0
  14. package/.vscode/srcdev-component-service-detail.code-snippets +49 -0
  15. package/.vscode/srcdev-component-services-card.code-snippets +108 -0
  16. package/app/components/01.atoms/content-wrappers/docs-pages/ContentDocs.vue +22 -16
  17. package/app/components/01.atoms/navigation/breadcrumb/Breadcrumb.vue +94 -0
  18. package/app/components/01.atoms/navigation/breadcrumb/CONSUMER-STYLING.md +32 -0
  19. package/app/components/01.atoms/navigation/breadcrumb/stories/Breadcrumb.stories.ts +87 -0
  20. package/app/components/01.atoms/navigation/breadcrumb/tests/Breadcrumb.spec.ts +87 -0
  21. package/app/components/01.atoms/navigation/breadcrumb/tests/__snapshots__/Breadcrumb.spec.ts.snap +13 -0
  22. package/app/components/02.molecules/expandable/accordian/AccordianCore.vue +5 -1
  23. package/app/components/02.molecules/expandable/accordian/tests/AccordianCore.spec.ts +22 -14
  24. package/app/components/02.molecules/expandable/accordian/tests/__snapshots__/AccordianCore.spec.ts.snap +42 -28
  25. package/app/components/02.molecules/expandable/expanding-panel/CONSUMER-STYLING.md +8 -10
  26. package/app/components/02.molecules/expandable/expanding-panel/ExpandingPanel.vue +15 -47
  27. package/app/components/02.molecules/expandable/expanding-panel/tests/__snapshots__/ExpandingPanel.spec.ts.snap +4 -12
  28. package/app/components/03.organisms/responsive-header/NavigationItems.vue +91 -4
  29. package/app/components/03.organisms/responsive-header/ResponsiveHeader.vue +5 -1
  30. package/app/components/03.organisms/responsive-header/tests/NavigationItems.spec.ts +2 -2
  31. package/app/components/03.organisms/responsive-header/tests/__snapshots__/NavigationItems.spec.ts.snap +13 -13
  32. package/app/components/03.organisms/responsive-header/tests/__snapshots__/ResponsiveHeader.spec.ts.snap +13 -13
  33. package/app/components/03.organisms/services/service-detail/CONSUMER-STYLING.md +181 -0
  34. package/app/components/03.organisms/services/service-detail/ServiceDetail.vue +480 -0
  35. package/app/components/03.organisms/services/service-detail/stories/ServiceDetail.stories.ts +282 -0
  36. package/app/components/03.organisms/services/service-detail/tests/ServiceDetail.spec.ts +270 -0
  37. package/app/components/03.organisms/services/service-detail/tests/__snapshots__/ServiceDetail.spec.ts.snap +99 -0
  38. package/app/components/03.organisms/services/services-card/CONSUMER-STYLING.md +129 -0
  39. package/app/components/03.organisms/services/services-card/ServicesCard.vue +153 -39
  40. package/app/components/03.organisms/services/services-card/stories/ServicesCard.stories.ts +65 -0
  41. package/app/components/03.organisms/services/services-card/tests/ServicesCard.spec.ts +82 -0
  42. package/app/components/03.organisms/services/services-card/tests/__snapshots__/ServicesCard.spec.ts.snap +13 -5
  43. package/app/components/03.organisms/services/services-grids/ServicesCardGrid.vue +3 -7
  44. package/app/components/03.organisms/services/services-grids/stories/ServicesCardGrid.stories.ts +126 -2
  45. package/app/components/03.organisms/services/services-grids/stories/ServicesSectionGrid.stories.ts +6 -0
  46. package/app/components/03.organisms/services/services-grids/tests/__snapshots__/ServicesCardGrid.spec.ts.snap +51 -27
  47. package/app/components/03.organisms/services/services-section/ServicesSection.vue +19 -0
  48. package/app/components/03.organisms/services/services-section/tests/__snapshots__/ServicesSection.spec.ts.snap +8 -8
  49. package/app/types/components/breadcrumb.ts +4 -0
  50. package/app/types/components/index.ts +1 -0
  51. package/package.json +2 -2
  52. package/app/pages/auto-grid.vue +0 -328
  53. package/app/pages/banner-video.vue +0 -238
  54. package/app/pages/forms/examples/buttons/index.vue +0 -259
  55. package/app/pages/forms/examples/material/checkbox-radio-panels.vue +0 -244
  56. package/app/pages/forms/examples/material/cssbattle.vue +0 -60
  57. package/app/pages/forms/examples/material/text-fields.vue +0 -910
  58. package/app/pages/grid-stack.vue +0 -252
  59. package/app/pages/index.vue +0 -127
  60. package/app/pages/page-hero-highlights.vue +0 -204
  61. package/app/pages/samaritan.vue +0 -327
  62. package/app/pages/typography/hero-text.vue +0 -97
  63. package/app/pages/typography/index.vue +0 -39
  64. package/app/pages/typography/page-body.vue +0 -171
  65. package/app/pages/typography/page-heading.vue +0 -76
  66. package/app/pages/typography/page-link.vue +0 -103
  67. package/app/pages/ui/accordian.vue +0 -211
  68. package/app/pages/ui/anchor-scroll-tab-navigation.vue +0 -191
  69. package/app/pages/ui/anchor-scroll.vue +0 -367
  70. package/app/pages/ui/animated-svg-text.vue +0 -85
  71. package/app/pages/ui/block-decorators.vue +0 -142
  72. package/app/pages/ui/card-core.vue +0 -82
  73. package/app/pages/ui/carousel-basic.vue +0 -292
  74. package/app/pages/ui/carousel-flip.vue +0 -449
  75. package/app/pages/ui/carousel-infinite.vue +0 -260
  76. package/app/pages/ui/clipped-panels.vue +0 -101
  77. package/app/pages/ui/contact-section.vue +0 -323
  78. package/app/pages/ui/container-glow.vue +0 -106
  79. package/app/pages/ui/content-width.vue +0 -126
  80. package/app/pages/ui/deep-expanding-menu.vue +0 -138
  81. package/app/pages/ui/display-avatar.vue +0 -253
  82. package/app/pages/ui/display-banner.vue +0 -78
  83. package/app/pages/ui/display-chip.vue +0 -367
  84. package/app/pages/ui/display-details.vue +0 -171
  85. package/app/pages/ui/display-dialog.vue +0 -344
  86. package/app/pages/ui/display-pill.vue +0 -396
  87. package/app/pages/ui/display-prompt.vue +0 -284
  88. package/app/pages/ui/display-toast.vue +0 -311
  89. package/app/pages/ui/expanding-panel.vue +0 -326
  90. package/app/pages/ui/glowing-border.vue +0 -111
  91. package/app/pages/ui/layout-content-docs.vue +0 -72
  92. package/app/pages/ui/layout-grid-a.vue +0 -96
  93. package/app/pages/ui/layout-grid-b.vue +0 -132
  94. package/app/pages/ui/magnetic-navigation.vue +0 -50
  95. package/app/pages/ui/marquee-scroller.vue +0 -99
  96. package/app/pages/ui/mask-element.vue +0 -104
  97. package/app/pages/ui/masonry-columns.vue +0 -55
  98. package/app/pages/ui/masonry-grid-ordered-experiment.vue +0 -79
  99. package/app/pages/ui/masonry-grid-ordered.vue +0 -56
  100. package/app/pages/ui/masonry-grid-sorted.vue +0 -55
  101. package/app/pages/ui/masonry-grid.vue +0 -55
  102. package/app/pages/ui/navigation/navigation-horizontal.vue +0 -484
  103. package/app/pages/ui/navigation/site-navigation/about.vue +0 -36
  104. package/app/pages/ui/navigation/site-navigation/contact.vue +0 -39
  105. package/app/pages/ui/navigation/site-navigation/index.vue +0 -38
  106. package/app/pages/ui/navigation/site-navigation/portfolio.vue +0 -43
  107. package/app/pages/ui/navigation/site-navigation/services.vue +0 -42
  108. package/app/pages/ui/navigation/tab-navigation.vue +0 -493
  109. package/app/pages/ui/page-row.vue +0 -127
  110. package/app/pages/ui/price-list.vue +0 -65
  111. package/app/pages/ui/profile-section.vue +0 -142
  112. package/app/pages/ui/qr-code/[componentName].vue +0 -218
  113. package/app/pages/ui/rotating-carousel.vue +0 -154
  114. package/app/pages/ui/scroll-reveal-image.vue +0 -483
  115. package/app/pages/ui/section-parallax.vue +0 -54
  116. package/app/pages/ui/services/colour-finder.vue +0 -43
  117. package/app/pages/ui/services/services-cards.vue +0 -57
  118. package/app/pages/ui/services/services-section/[slug].vue +0 -61
  119. package/app/pages/ui/services/services-sections-compact.vue +0 -64
  120. package/app/pages/ui/settings.vue +0 -54
  121. package/app/pages/ui/simple-grid.vue +0 -55
  122. package/app/pages/ui/slider-gallery.vue +0 -261
  123. package/app/pages/ui/tabs-y.vue +0 -107
  124. package/app/pages/ui/tabs.vue +0 -189
  125. package/app/pages/ui/tooltips.vue +0 -104
  126. package/app/pages/ui/wipe-away-vertical.vue +0 -129
@@ -1,344 +0,0 @@
1
- <template>
2
- <div>
3
- <NuxtLayout name="default">
4
- <template #layout-content>
5
- <PageRow tag="div" variant="content" :style-class-passthrough="['mbe-20']">
6
- <h1 class="page-heading-2">Display Dialog</h1>
7
-
8
- <div v-if="isDev" class="qa-panel">
9
- <details class="qa-panel__details">
10
- <summary class="qa-panel__summary">
11
- <span class="qa-panel__title">QA — DisplayDialog</span>
12
- <code class="qa-panel__status">
13
- {{ qaVariant }} · {{ qaTheme ?? "no theme" }}
14
- </code>
15
- </summary>
16
- <div class="qa-panel__body">
17
- <div class="qa-panel__group">
18
- <span class="qa-panel__label">Variant</span>
19
- <div class="qa-panel__chips">
20
- <button
21
- v-for="opt in variants"
22
- :key="opt"
23
- class="qa-panel__chip"
24
- :class="{ 'is-active': qaVariant === opt }"
25
- @click="qaVariant = opt"
26
- >
27
- {{ opt }}
28
- </button>
29
- </div>
30
- </div>
31
-
32
- <div class="qa-panel__group">
33
- <span class="qa-panel__label">Theme</span>
34
- <div class="qa-panel__chips">
35
- <button
36
- v-for="opt in themes"
37
- :key="String(opt)"
38
- class="qa-panel__chip"
39
- :class="{ 'is-active': qaTheme === opt }"
40
- @click="qaTheme = opt"
41
- >
42
- {{ opt ?? "none" }}
43
- </button>
44
- </div>
45
- </div>
46
- </div>
47
- </details>
48
- </div>
49
-
50
- <p>
51
- <button type="button" @click.prevent="openDialog('demo')">Open Dialog</button>
52
- </p>
53
-
54
- <DisplayDialog
55
- v-if="dialogsConfig['demo']"
56
- v-model="dialogsConfig['demo']"
57
- :variant="qaVariant"
58
- :theme="qaTheme"
59
- :allow-content-scroll="qaVariant === 'dialog'"
60
- data-dialog-id="demo"
61
- >
62
- <template #dialogTitle>
63
- <p class="text-normal wght-700 m-0">{{ dialogTitle }}</p>
64
- </template>
65
-
66
- <template #dialogContent>
67
- <div class="pt-12 pb-12">
68
- <p class="text-normal">{{ dialogBody }}</p>
69
- <template v-if="qaVariant === 'dialog'">
70
- <p class="text-normal">
71
- Justo molestie felis tellus tellus taciti? Ullamcorper viverra quis felis donec aliquam torquent
72
- imperdiet. Curabitur vitae quis malesuada imperdiet hendrerit felis quam dictum. Aptent curabitur
73
- lacus dapibus; nunc enim vestibulum finibus. Lorem commodo tortor blandit nisl curabitur interdum
74
- ultricies magnis.
75
- </p>
76
- <p class="text-normal">
77
- Lobortis efficitur enim litora dictum montes. Sagittis eget etiam curae suspendisse cubilia. Ante
78
- aliquam orci mus ultricies nostra. Ad augue quam egestas ipsum sem lacus tempus. Magnis enim posuere
79
- eros montes fermentum velit.
80
- </p>
81
- <p class="text-normal">
82
- Venenatis adipiscing integer eget donec ridiculus risus. Nulla quis sollicitudin sem nam bibendum
83
- ligula. Curabitur malesuada platea egestas venenatis in torquent. Eget eros euismod vehicula consequat
84
- at, efficitur ullamcorper.
85
- </p>
86
- </template>
87
- </div>
88
- </template>
89
-
90
- <template #actionButtonLeft>
91
- <button type="button" @click.prevent="closeDialog('demo', 'cancel')">Cancel</button>
92
- </template>
93
- <template #actionButtonRight>
94
- <button type="button" @click.prevent="closeDialog('demo', 'confirm')">{{ confirmLabel }}</button>
95
- </template>
96
- </DisplayDialog>
97
- </PageRow>
98
-
99
- <PageRow tag="div" variant="content" :style-class-passthrough="['mbe-20']">
100
- <h2 class="page-heading-2">Nested dialog pattern</h2>
101
- <p class="text-normal">
102
- A dialog managing its own internal confirm sub-dialog via a local
103
- <code>useDialogControls</code> instance. Tick "Simulate unsaved changes" before
104
- clicking Cancel to trigger the nested confirm.
105
- </p>
106
- <p>
107
- <button type="button" @click.prevent="openNestedDialog('editProfile')">Open nested dialog demo</button>
108
- </p>
109
-
110
- <DisplayDialog
111
- v-if="nestedDialogsConfig['editProfile']"
112
- v-model="nestedDialogsConfig['editProfile']"
113
- variant="dialog"
114
- data-dialog-id="nested-edit"
115
- >
116
- <template #dialogTitle>
117
- <p class="text-normal wght-700 m-0">Edit profile</p>
118
- </template>
119
- <template #dialogContent>
120
- <div class="pt-12 pb-12 nested-demo-content">
121
- <p class="text-normal">Make some changes below, then click Cancel to trigger the nested confirm dialog.</p>
122
- <label class="nested-demo-label">
123
- <input v-model="nestedHasChanges" type="checkbox" />
124
- Simulate unsaved changes
125
- </label>
126
- </div>
127
- </template>
128
- <template #actionButtonLeft>
129
- <button type="button" @click="handleNestedCancel">Cancel</button>
130
- </template>
131
- <template #actionButtonRight>
132
- <button type="button" @click="closeNestedDialog('editProfile', 'confirm')">Save</button>
133
- </template>
134
- </DisplayDialog>
135
-
136
- <DisplayDialog
137
- v-if="nestedDialogsConfig['confirmDiscard']"
138
- v-model="nestedDialogsConfig['confirmDiscard']"
139
- variant="confirm"
140
- theme="warning"
141
- :lock-viewport="false"
142
- data-dialog-id="nested-confirm"
143
- >
144
- <template #dialogTitle>
145
- <p class="text-normal wght-700 m-0">Discard changes?</p>
146
- </template>
147
- <template #dialogContent>
148
- <div class="m-0">
149
- <p class="text-normal">Your unsaved changes will be lost.</p>
150
- </div>
151
- </template>
152
- <template #actionButtonLeft>
153
- <button type="button" @click="closeNestedDialog('confirmDiscard', 'cancel')">Keep editing</button>
154
- </template>
155
- <template #actionButtonRight>
156
- <button type="button" @click="closeNestedDialog('confirmDiscard', 'confirm')">Discard</button>
157
- </template>
158
- </DisplayDialog>
159
- </PageRow>
160
- </template>
161
- </NuxtLayout>
162
- </div>
163
- </template>
164
-
165
- <script setup lang="ts">
166
- import type { SemanticTheme } from "~/types/components";
167
-
168
- definePageMeta({ layout: false });
169
-
170
- useHead({
171
- title: "UI Dialogs",
172
- meta: [{ name: "description", content: "Examples of Dialogs" }],
173
- bodyAttrs: { class: "displayDialog-page" },
174
- });
175
-
176
- const isDev = import.meta.dev;
177
-
178
- const variants = ["dialog", "modal", "confirm", "alert", "fullscreen"] as const;
179
- type DialogVariant = (typeof variants)[number];
180
-
181
- const themes = [undefined, "info", "success", "warning", "error"] as const;
182
-
183
- const qaVariant = ref<DialogVariant>("confirm");
184
- const qaTheme = ref<SemanticTheme | undefined>(undefined);
185
-
186
- const dialogTitle = computed(() => {
187
- if (qaTheme.value === "error") return "Delete account?";
188
- if (qaTheme.value === "warning") return "Confirm action";
189
- if (qaVariant.value === "dialog") return "Dialog with scrollable content";
190
- if (qaVariant.value === "confirm") return "Confirm logout?";
191
- if (qaVariant.value === "alert") return "Alert — action required";
192
- if (qaVariant.value === "fullscreen") return "Fullscreen dialog";
193
- return "Dialog";
194
- });
195
-
196
- const dialogBody = computed(() => {
197
- if (qaTheme.value === "error")
198
- return "This action is permanent and cannot be undone. All your data will be removed.";
199
- if (qaVariant.value === "alert")
200
- return "Cannot be dismissed by clicking outside or pressing Escape — an explicit action is required.";
201
- if (qaVariant.value === "fullscreen")
202
- return "This dialog fills the entire viewport. Useful for immersive flows such as onboarding, image editors, or multi-step wizards.";
203
- if (qaVariant.value === "dialog")
204
- return "Lorem ipsum odor amet, consectetuer adipiscing elit. Scelerisque tincidunt vestibulum litora torquent aliquam a. Sem litora tellus mattis nisi vehicula sodales arcu egestas.";
205
- return "Are you sure you want to continue? This will apply the selected action.";
206
- });
207
-
208
- const confirmLabel = computed(() => {
209
- if (qaTheme.value === "error") return "Delete account";
210
- if (qaVariant.value === "confirm") return "Log out";
211
- return "Confirm";
212
- });
213
-
214
- const { dialogsConfig, openDialog, closeDialog } = useDialogControls({
215
- demo: {
216
- onConfirm: () => {},
217
- onCancel: () => {},
218
- },
219
- });
220
-
221
- const nestedHasChanges = ref(false);
222
-
223
- const { dialogsConfig: nestedDialogsConfig, openDialog: openNestedDialog, closeDialog: closeNestedDialog } = useDialogControls({
224
- editProfile: { onConfirm: () => {}, onCancel: () => {} },
225
- confirmDiscard: {
226
- onConfirm: () => { nestedDialogsConfig.editProfile = false; },
227
- onCancel: () => {},
228
- },
229
- });
230
-
231
- const handleNestedCancel = () => {
232
- if (nestedHasChanges.value) {
233
- openNestedDialog("confirmDiscard");
234
- } else {
235
- closeNestedDialog("editProfile", "cancel");
236
- }
237
- };
238
- </script>
239
-
240
- <style lang="css">
241
- .displayDialog-page {
242
- .qa-panel {
243
- background: oklch(15% 0 0);
244
- color: white;
245
- font-size: 1.3rem;
246
- margin-block: 1.2rem;
247
- }
248
-
249
- .qa-panel__details {
250
- padding: 1rem 2rem;
251
- }
252
-
253
- .qa-panel__summary {
254
- cursor: pointer;
255
- display: flex;
256
- align-items: center;
257
- gap: 1.6rem;
258
- list-style: none;
259
- user-select: none;
260
-
261
- &::-webkit-details-marker {
262
- display: none;
263
- }
264
- }
265
-
266
- .qa-panel__title {
267
- font-weight: 600;
268
- font-size: 1.1rem;
269
- text-transform: uppercase;
270
- letter-spacing: 0.08em;
271
- }
272
-
273
- .qa-panel__status {
274
- font-family: monospace;
275
- font-size: 1.2rem;
276
- background: oklch(0% 0 0 / 0.3);
277
- padding: 0.2rem 0.8rem;
278
- border-radius: 0.4rem;
279
- user-select: text;
280
- cursor: text;
281
- }
282
-
283
- .qa-panel__body {
284
- display: flex;
285
- flex-wrap: wrap;
286
- gap: 2.4rem;
287
- padding-block: 1.2rem 0.4rem;
288
- }
289
-
290
- .qa-panel__group {
291
- display: flex;
292
- flex-direction: column;
293
- gap: 0.6rem;
294
- }
295
-
296
- .qa-panel__label {
297
- font-size: 1.1rem;
298
- text-transform: uppercase;
299
- letter-spacing: 0.08em;
300
- opacity: 0.55;
301
- }
302
-
303
- .qa-panel__chips {
304
- display: flex;
305
- flex-wrap: wrap;
306
- gap: 0.4rem;
307
- }
308
-
309
- .nested-demo-content {
310
- display: flex;
311
- flex-direction: column;
312
- gap: 1.6rem;
313
- }
314
-
315
- .nested-demo-label {
316
- display: flex;
317
- align-items: center;
318
- gap: 0.8rem;
319
- cursor: pointer;
320
- font-size: 1.4rem;
321
- }
322
-
323
- .qa-panel__chip {
324
- font-family: monospace;
325
- font-size: 1.2rem;
326
- color: white;
327
- background: oklch(0% 0 0 / 0.25);
328
- border: 1px solid oklch(100% 0 0 / 0.18);
329
- padding: 0.3rem 1rem;
330
- border-radius: 0.4rem;
331
- cursor: pointer;
332
- transition: background 0.15s;
333
-
334
- &:hover {
335
- background: oklch(0% 0 0 / 0.4);
336
- }
337
-
338
- &.is-active {
339
- background: oklch(55% 0.18 240);
340
- border-color: oklch(55% 0.18 240);
341
- }
342
- }
343
- }
344
- </style>