srcdev-nuxt-components 9.3.7 → 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 (108) hide show
  1. package/.claude/hooks/check-component-update.sh +30 -1
  2. package/.claude/skills/components/breadcrumb.md +49 -0
  3. package/.claude/skills/components/content-docs.md +1 -1
  4. package/.claude/skills/components/service-detail.md +156 -0
  5. package/.claude/skills/components/services-card-grid.md +9 -9
  6. package/.claude/skills/components/services-card.md +82 -30
  7. package/.claude/skills/index.md +3 -1
  8. package/.claude/skills/qa-panel.md +2 -2
  9. package/.vscode/srcdev-component-breadcrumb.code-snippets +14 -0
  10. package/.vscode/srcdev-component-service-detail.code-snippets +49 -0
  11. package/.vscode/srcdev-component-services-card.code-snippets +108 -0
  12. package/app/components/01.atoms/navigation/breadcrumb/Breadcrumb.vue +94 -0
  13. package/app/components/01.atoms/navigation/breadcrumb/CONSUMER-STYLING.md +32 -0
  14. package/app/components/01.atoms/navigation/breadcrumb/stories/Breadcrumb.stories.ts +87 -0
  15. package/app/components/01.atoms/navigation/breadcrumb/tests/Breadcrumb.spec.ts +87 -0
  16. package/app/components/01.atoms/navigation/breadcrumb/tests/__snapshots__/Breadcrumb.spec.ts.snap +13 -0
  17. package/app/components/03.organisms/services/service-detail/CONSUMER-STYLING.md +181 -0
  18. package/app/components/03.organisms/services/service-detail/ServiceDetail.vue +480 -0
  19. package/app/components/03.organisms/services/service-detail/stories/ServiceDetail.stories.ts +282 -0
  20. package/app/components/03.organisms/services/service-detail/tests/ServiceDetail.spec.ts +270 -0
  21. package/app/components/03.organisms/services/service-detail/tests/__snapshots__/ServiceDetail.spec.ts.snap +99 -0
  22. package/app/components/03.organisms/services/services-card/CONSUMER-STYLING.md +129 -0
  23. package/app/components/03.organisms/services/services-card/ServicesCard.vue +153 -39
  24. package/app/components/03.organisms/services/services-card/stories/ServicesCard.stories.ts +65 -0
  25. package/app/components/03.organisms/services/services-card/tests/ServicesCard.spec.ts +82 -0
  26. package/app/components/03.organisms/services/services-card/tests/__snapshots__/ServicesCard.spec.ts.snap +13 -5
  27. package/app/components/03.organisms/services/services-grids/ServicesCardGrid.vue +3 -7
  28. package/app/components/03.organisms/services/services-grids/stories/ServicesCardGrid.stories.ts +126 -2
  29. package/app/components/03.organisms/services/services-grids/stories/ServicesSectionGrid.stories.ts +6 -0
  30. package/app/components/03.organisms/services/services-grids/tests/__snapshots__/ServicesCardGrid.spec.ts.snap +51 -27
  31. package/app/types/components/breadcrumb.ts +4 -0
  32. package/app/types/components/index.ts +1 -0
  33. package/package.json +2 -2
  34. package/app/pages/auto-grid.vue +0 -328
  35. package/app/pages/banner-video.vue +0 -238
  36. package/app/pages/forms/examples/buttons/index.vue +0 -259
  37. package/app/pages/forms/examples/material/checkbox-radio-panels.vue +0 -244
  38. package/app/pages/forms/examples/material/cssbattle.vue +0 -60
  39. package/app/pages/forms/examples/material/text-fields.vue +0 -910
  40. package/app/pages/grid-stack.vue +0 -252
  41. package/app/pages/index.vue +0 -127
  42. package/app/pages/page-hero-highlights.vue +0 -204
  43. package/app/pages/samaritan.vue +0 -327
  44. package/app/pages/typography/hero-text.vue +0 -97
  45. package/app/pages/typography/index.vue +0 -39
  46. package/app/pages/typography/page-body.vue +0 -171
  47. package/app/pages/typography/page-heading.vue +0 -76
  48. package/app/pages/typography/page-link.vue +0 -103
  49. package/app/pages/ui/accordian.vue +0 -211
  50. package/app/pages/ui/anchor-scroll-tab-navigation.vue +0 -191
  51. package/app/pages/ui/anchor-scroll.vue +0 -367
  52. package/app/pages/ui/animated-svg-text.vue +0 -85
  53. package/app/pages/ui/block-decorators.vue +0 -142
  54. package/app/pages/ui/card-core.vue +0 -82
  55. package/app/pages/ui/carousel-basic.vue +0 -292
  56. package/app/pages/ui/carousel-flip.vue +0 -449
  57. package/app/pages/ui/carousel-infinite.vue +0 -260
  58. package/app/pages/ui/clipped-panels.vue +0 -101
  59. package/app/pages/ui/contact-section.vue +0 -323
  60. package/app/pages/ui/container-glow.vue +0 -106
  61. package/app/pages/ui/content-width.vue +0 -126
  62. package/app/pages/ui/deep-expanding-menu.vue +0 -138
  63. package/app/pages/ui/display-avatar.vue +0 -253
  64. package/app/pages/ui/display-banner.vue +0 -78
  65. package/app/pages/ui/display-chip.vue +0 -367
  66. package/app/pages/ui/display-details.vue +0 -171
  67. package/app/pages/ui/display-dialog.vue +0 -344
  68. package/app/pages/ui/display-pill.vue +0 -396
  69. package/app/pages/ui/display-prompt.vue +0 -284
  70. package/app/pages/ui/display-toast.vue +0 -311
  71. package/app/pages/ui/expanding-panel.vue +0 -326
  72. package/app/pages/ui/glowing-border.vue +0 -111
  73. package/app/pages/ui/layout-content-docs.vue +0 -72
  74. package/app/pages/ui/layout-grid-a.vue +0 -96
  75. package/app/pages/ui/layout-grid-b.vue +0 -132
  76. package/app/pages/ui/magnetic-navigation.vue +0 -50
  77. package/app/pages/ui/marquee-scroller.vue +0 -99
  78. package/app/pages/ui/mask-element.vue +0 -104
  79. package/app/pages/ui/masonry-columns.vue +0 -55
  80. package/app/pages/ui/masonry-grid-ordered-experiment.vue +0 -79
  81. package/app/pages/ui/masonry-grid-ordered.vue +0 -56
  82. package/app/pages/ui/masonry-grid-sorted.vue +0 -55
  83. package/app/pages/ui/masonry-grid.vue +0 -55
  84. package/app/pages/ui/navigation/navigation-horizontal.vue +0 -484
  85. package/app/pages/ui/navigation/site-navigation/about.vue +0 -36
  86. package/app/pages/ui/navigation/site-navigation/contact.vue +0 -39
  87. package/app/pages/ui/navigation/site-navigation/index.vue +0 -38
  88. package/app/pages/ui/navigation/site-navigation/portfolio.vue +0 -43
  89. package/app/pages/ui/navigation/site-navigation/services.vue +0 -42
  90. package/app/pages/ui/navigation/tab-navigation.vue +0 -493
  91. package/app/pages/ui/page-row.vue +0 -127
  92. package/app/pages/ui/price-list.vue +0 -65
  93. package/app/pages/ui/profile-section.vue +0 -142
  94. package/app/pages/ui/qr-code/[componentName].vue +0 -218
  95. package/app/pages/ui/rotating-carousel.vue +0 -154
  96. package/app/pages/ui/scroll-reveal-image.vue +0 -483
  97. package/app/pages/ui/section-parallax.vue +0 -54
  98. package/app/pages/ui/services/colour-finder.vue +0 -43
  99. package/app/pages/ui/services/services-cards.vue +0 -57
  100. package/app/pages/ui/services/services-section/[slug].vue +0 -61
  101. package/app/pages/ui/services/services-sections-compact.vue +0 -64
  102. package/app/pages/ui/settings.vue +0 -54
  103. package/app/pages/ui/simple-grid.vue +0 -55
  104. package/app/pages/ui/slider-gallery.vue +0 -261
  105. package/app/pages/ui/tabs-y.vue +0 -107
  106. package/app/pages/ui/tabs.vue +0 -189
  107. package/app/pages/ui/tooltips.vue +0 -104
  108. 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>