srcdev-nuxt-components 9.1.49 → 9.1.51

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 (220) hide show
  1. package/.claude/settings.json +2 -4
  2. package/.claude/settings.local.json +22 -2
  3. package/.claude/skills/components/card-core.md +205 -0
  4. package/.claude/skills/components/display-dialog.md +128 -0
  5. package/.claude/skills/components/page-hero-highlights.md +1 -1
  6. package/.claude/skills/components/page-row.md +157 -0
  7. package/.claude/skills/components/services-card-grid.md +4 -4
  8. package/.claude/skills/components/services-section-grid.md +4 -4
  9. package/.claude/skills/components/tab-navigation.md +222 -0
  10. package/.claude/skills/composable-dialog-controls.md +55 -43
  11. package/.claude/skills/index.md +5 -2
  12. package/app/components/01.atoms/card/CONSUMER-STYLING.md +175 -0
  13. package/app/components/01.atoms/card/CardCore.vue +48 -21
  14. package/app/components/01.atoms/display-dialog/CONSUMER-STYLING.md +163 -0
  15. package/app/components/01.atoms/display-dialog/DisplayDialog.vue +277 -0
  16. package/app/components/01.atoms/display-dialog/stories/DisplayDialog.stories.ts +177 -0
  17. package/app/components/01.atoms/display-dialog/tests/DisplayDialog.spec.ts +264 -0
  18. package/app/components/01.atoms/display-dialog/tests/__snapshots__/DisplayDialog.spec.ts.snap +18 -0
  19. package/app/components/01.atoms/page-row/CONSUMER-STYLING.md +90 -0
  20. package/app/components/01.atoms/page-row/PageRow.vue +115 -0
  21. package/app/components/01.atoms/page-row/stories/PageRow.stories.ts +311 -0
  22. package/app/components/01.atoms/page-row/tests/PageRow.spec.ts +191 -0
  23. package/app/components/02.molecules/navigation/tab-navigation/CONSUMER-STYLING.md +145 -0
  24. package/app/components/02.molecules/navigation/tab-navigation/TabNavigation.vue +20 -9
  25. package/app/components/02.molecules/navigation/tab-navigation/tests/__snapshots__/TabNavigation.spec.ts.snap +12 -6
  26. package/app/components/{forms/ui → 05.forms/form-field}/FormField.vue +12 -19
  27. package/app/components/{forms/ui → 05.forms/form-wrapper}/FormWrapper.vue +6 -6
  28. package/app/components/{forms → 05.forms}/input-button/InputButtonCore.vue +2 -0
  29. package/app/components/{forms → 05.forms}/input-button/stories/InputButtonCore.stories.ts +1 -1
  30. package/app/components/{forms → 05.forms}/input-text/InputTextCore.vue +73 -73
  31. package/app/components/{forms → 05.forms}/input-text/variants/InputTextAsNumberWithLabel.vue +29 -29
  32. package/app/components/carousels/CarouselBasic.vue +99 -99
  33. package/app/components/carousels/CarouselInfinite.vue +150 -150
  34. package/app/components/deep-expanding-menu/DeepExpandingMenu.vue +111 -111
  35. package/app/components/responsive-header/ResponsiveHeader.vue +250 -282
  36. package/app/components/test-storybook/TestStorybook.vue +16 -16
  37. package/app/composables/tests/useDialogControls.spec.ts +34 -64
  38. package/app/composables/useDialogControls.ts +19 -33
  39. package/app/composables/useFormControl.ts +0 -2
  40. package/app/layouts/default.vue +9 -7
  41. package/app/pages/auto-grid.vue +37 -20
  42. package/app/pages/banner-video.vue +2 -2
  43. package/app/pages/forms/examples/buttons/index.vue +189 -215
  44. package/app/pages/forms/examples/material/text-fields.vue +2 -2
  45. package/app/pages/grid-stack.vue +10 -10
  46. package/app/pages/index.vue +20 -20
  47. package/app/pages/samaritan.vue +4 -4
  48. package/app/pages/typography/hero-text.vue +6 -6
  49. package/app/pages/typography/index.vue +4 -4
  50. package/app/pages/typography/page-body.vue +4 -4
  51. package/app/pages/typography/page-heading.vue +4 -4
  52. package/app/pages/typography/page-link.vue +4 -4
  53. package/app/pages/ui/accordian.vue +4 -4
  54. package/app/pages/ui/anchor-scroll-tab-navigation.vue +77 -66
  55. package/app/pages/ui/anchor-scroll.vue +94 -70
  56. package/app/pages/ui/animated-svg-text.vue +4 -4
  57. package/app/pages/ui/block-decorators.vue +11 -11
  58. package/app/pages/ui/card-core.vue +9 -9
  59. package/app/pages/ui/carousel-basic.vue +4 -4
  60. package/app/pages/ui/carousel-flip.vue +2 -2
  61. package/app/pages/ui/carousel-infinite.vue +4 -4
  62. package/app/pages/ui/clipped-panels.vue +10 -10
  63. package/app/pages/ui/contact-section.vue +4 -4
  64. package/app/pages/ui/container-glow.vue +2 -3
  65. package/app/pages/ui/deep-expanding-menu.vue +138 -0
  66. package/app/pages/ui/display-avatar.vue +2 -2
  67. package/app/pages/ui/display-banner.vue +2 -2
  68. package/app/pages/ui/display-chip.vue +32 -25
  69. package/app/pages/ui/display-details.vue +6 -10
  70. package/app/pages/ui/display-dialog.vue +96 -131
  71. package/app/pages/ui/display-pill.vue +27 -33
  72. package/app/pages/ui/display-prompt.vue +4 -4
  73. package/app/pages/ui/display-toast.vue +2 -2
  74. package/app/pages/ui/expanding-panel.vue +12 -16
  75. package/app/pages/ui/glowing-border.vue +12 -12
  76. package/app/pages/ui/layout-grid-a.vue +6 -6
  77. package/app/pages/ui/layout-grid-b.vue +4 -4
  78. package/app/pages/ui/magnetic-navigation.vue +6 -6
  79. package/app/pages/ui/marquee-scroller.vue +2 -2
  80. package/app/pages/ui/mask-element.vue +2 -2
  81. package/app/pages/ui/masonry-columns.vue +4 -4
  82. package/app/pages/ui/masonry-grid-ordered-experiment.vue +4 -4
  83. package/app/pages/ui/masonry-grid-ordered.vue +4 -4
  84. package/app/pages/ui/masonry-grid-sorted.vue +4 -4
  85. package/app/pages/ui/masonry-grid.vue +4 -4
  86. package/app/pages/ui/navigation/navigation-horizontal.vue +12 -12
  87. package/app/pages/ui/navigation/tab-navigation.vue +493 -0
  88. package/app/pages/ui/page-row.vue +127 -0
  89. package/app/pages/ui/price-list.vue +4 -4
  90. package/app/pages/ui/profile-section.vue +4 -4
  91. package/app/pages/ui/qr-code/[componentName].vue +6 -6
  92. package/app/pages/ui/rotating-carousel.vue +16 -16
  93. package/app/pages/ui/scroll-reveal-image.vue +20 -20
  94. package/app/pages/ui/section-parallax.vue +7 -7
  95. package/app/pages/ui/services/colour-finder.vue +4 -4
  96. package/app/pages/ui/services/services-cards.vue +4 -4
  97. package/app/pages/ui/services/services-section/[slug].vue +4 -4
  98. package/app/pages/ui/services/services-sections-compact.vue +6 -6
  99. package/app/pages/ui/settings.vue +10 -10
  100. package/app/pages/ui/simple-grid.vue +2 -2
  101. package/app/pages/ui/slider-gallery.vue +5 -5
  102. package/app/pages/ui/tabs-y.vue +2 -3
  103. package/app/pages/ui/tabs.vue +6 -9
  104. package/app/pages/ui/tooltips.vue +9 -9
  105. package/app/pages/ui/wipe-away-vertical.vue +14 -14
  106. package/package.json +1 -1
  107. package/.claude/skills/components/layout-row.md +0 -239
  108. package/app/components/display-dialog/DisplayDialogCore.vue +0 -276
  109. package/app/components/display-dialog/variants/DisplayDialogConfirm.vue +0 -47
  110. package/app/components/display-dialog/variants/DisplayDialogScrollableContent.vue +0 -51
  111. package/app/components/forms/c12/utils.ts +0 -14
  112. package/app/components/layout-row/LayoutRow.vue +0 -171
  113. package/app/components/layout-row/stories/LayoutRow.stories.ts +0 -528
  114. package/app/pages/ui/layout-row.vue +0 -139
  115. /package/app/components/{forms → 05.forms}/form-errors/InputError.vue +0 -0
  116. /package/app/components/{forms → 05.forms}/form-errors/tests/InputError.spec.ts +0 -0
  117. /package/app/components/{forms → 05.forms}/form-fieldset/FormFieldset.vue +0 -0
  118. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts +0 -0
  119. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-icons-secondary-chromium-darwin.png +0 -0
  120. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-icons-secondary-firefox-darwin.png +0 -0
  121. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-icons-secondary-webkit-darwin.png +0 -0
  122. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-icons-tertiary-chromium-darwin.png +0 -0
  123. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-icons-tertiary-firefox-darwin.png +0 -0
  124. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-icons-tertiary-webkit-darwin.png +0 -0
  125. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-primary-pending-chromium-darwin.png +0 -0
  126. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-primary-pending-firefox-darwin.png +0 -0
  127. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-primary-pending-webkit-darwin.png +0 -0
  128. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-secondary-pill-chromium-darwin.png +0 -0
  129. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-secondary-pill-firefox-darwin.png +0 -0
  130. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-secondary-pill-webkit-darwin.png +0 -0
  131. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-tertiary-readonly-chromium-darwin.png +0 -0
  132. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-tertiary-readonly-firefox-darwin.png +0 -0
  133. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-tertiary-readonly-webkit-darwin.png +0 -0
  134. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-chromium-darwin.png +0 -0
  135. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-firefox-darwin.png +0 -0
  136. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-default-chromium-darwin.png +0 -0
  137. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-default-firefox-darwin.png +0 -0
  138. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-default-webkit-darwin.png +0 -0
  139. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-error-chromium-darwin.png +0 -0
  140. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-error-firefox-darwin.png +0 -0
  141. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-error-webkit-darwin.png +0 -0
  142. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-success-chromium-darwin.png +0 -0
  143. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-success-firefox-darwin.png +0 -0
  144. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-success-webkit-darwin.png +0 -0
  145. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-warning-chromium-darwin.png +0 -0
  146. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-warning-firefox-darwin.png +0 -0
  147. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-warning-webkit-darwin.png +0 -0
  148. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-primary-chromium-darwin.png +0 -0
  149. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-primary-firefox-darwin.png +0 -0
  150. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-primary-webkit-darwin.png +0 -0
  151. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-secondary-chromium-darwin.png +0 -0
  152. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-secondary-firefox-darwin.png +0 -0
  153. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-secondary-webkit-darwin.png +0 -0
  154. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-tertiary-chromium-darwin.png +0 -0
  155. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-tertiary-firefox-darwin.png +0 -0
  156. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-tertiary-webkit-darwin.png +0 -0
  157. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-webkit-darwin.png +0 -0
  158. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/nuxt-icon-only-component-chromium-darwin.png +0 -0
  159. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/nuxt-icon-only-component-firefox-darwin.png +0 -0
  160. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/nuxt-icon-only-component-webkit-darwin.png +0 -0
  161. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/state-pending-chromium-darwin.png +0 -0
  162. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/state-pending-firefox-darwin.png +0 -0
  163. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/state-pending-webkit-darwin.png +0 -0
  164. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/state-pill-chromium-darwin.png +0 -0
  165. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/state-pill-firefox-darwin.png +0 -0
  166. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/state-pill-webkit-darwin.png +0 -0
  167. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/state-readonly-chromium-darwin.png +0 -0
  168. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/state-readonly-firefox-darwin.png +0 -0
  169. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/state-readonly-webkit-darwin.png +0 -0
  170. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/with-both-nuxt-icon-components-chromium-darwin.png +0 -0
  171. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/with-both-nuxt-icon-components-firefox-darwin.png +0 -0
  172. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/with-both-nuxt-icon-components-webkit-darwin.png +0 -0
  173. /package/app/components/{forms → 05.forms}/input-button/tests/InputButtonCore.spec.ts +0 -0
  174. /package/app/components/{forms → 05.forms}/input-button/tests/__snapshots__/InputButtonCore.spec.ts.snap +0 -0
  175. /package/app/components/{forms → 05.forms}/input-checkbox/MultipleCheckboxes.vue +0 -0
  176. /package/app/components/{forms → 05.forms}/input-checkbox/SingleCheckbox.vue +0 -0
  177. /package/app/components/{forms → 05.forms}/input-checkbox/tests/MultipleCheckboxes.spec.ts +0 -0
  178. /package/app/components/{forms → 05.forms}/input-checkbox/tests/data/tags.json +0 -0
  179. /package/app/components/{forms → 05.forms}/input-checkbox-radio/InputCheckboxRadioButton.vue +0 -0
  180. /package/app/components/{forms → 05.forms}/input-checkbox-radio/InputCheckboxRadioCore.vue +0 -0
  181. /package/app/components/{forms → 05.forms}/input-checkbox-radio/InputCheckboxRadioWithLabel.vue +0 -0
  182. /package/app/components/{forms → 05.forms}/input-checkbox-radio/tests/InputCheckboxRadioCore.spec.ts +0 -0
  183. /package/app/components/{forms → 05.forms}/input-copy/InputCopyCore.vue +0 -0
  184. /package/app/components/{forms → 05.forms}/input-copy/stories/InputCopyCore.stories.ts +0 -0
  185. /package/app/components/{forms → 05.forms}/input-copy/tests/InputCopyCore.spec.ts +0 -0
  186. /package/app/components/{forms → 05.forms}/input-copy/tests/__snapshots__/InputCopyCore.spec.ts.snap +0 -0
  187. /package/app/components/{forms → 05.forms}/input-description/InputDescription.vue +0 -0
  188. /package/app/components/{forms → 05.forms}/input-description/tests/InputDescription.spec.ts +0 -0
  189. /package/app/components/{forms → 05.forms}/input-label/InputLabel.vue +0 -0
  190. /package/app/components/{forms → 05.forms}/input-label/tests/InputLabel.spec.ts +0 -0
  191. /package/app/components/{forms → 05.forms}/input-number/InputNumberCore.vue +0 -0
  192. /package/app/components/{forms → 05.forms}/input-number/variants/InputNumberDefault.vue +0 -0
  193. /package/app/components/{forms → 05.forms}/input-radio/MultipleRadiobuttons.vue +0 -0
  194. /package/app/components/{forms → 05.forms}/input-radio/tests/MultipleRadioButtons.spec.ts +0 -0
  195. /package/app/components/{forms → 05.forms}/input-radio/tests/data/tags.json +0 -0
  196. /package/app/components/{forms → 05.forms}/input-range/InputRangeCore.vue +0 -0
  197. /package/app/components/{forms → 05.forms}/input-range/variants/InputRangeDefault.vue +0 -0
  198. /package/app/components/{forms → 05.forms}/input-range-fancy/InputRangeFancyCore.vue +0 -0
  199. /package/app/components/{forms → 05.forms}/input-range-fancy/InputRangeFancyWithLabel.vue +0 -0
  200. /package/app/components/{forms → 05.forms}/input-select/InputSelectCore.vue +0 -0
  201. /package/app/components/{forms → 05.forms}/input-select/variants/InputSelectWithLabel.vue +0 -0
  202. /package/app/components/{forms → 05.forms}/input-text/stories/InputPasswordWithLabel.stories.ts +0 -0
  203. /package/app/components/{forms → 05.forms}/input-text/stories/InputTextAsNumberWithLabel.stories.ts +0 -0
  204. /package/app/components/{forms → 05.forms}/input-text/stories/InputTextCore.stories.ts +0 -0
  205. /package/app/components/{forms → 05.forms}/input-text/stories/InputTextWithLabel.stories.ts +0 -0
  206. /package/app/components/{forms → 05.forms}/input-text/variants/InputPasswordWithLabel.vue +0 -0
  207. /package/app/components/{forms → 05.forms}/input-text/variants/InputTextWithLabel.vue +0 -0
  208. /package/app/components/{forms → 05.forms}/input-textarea/InputTextareaCore.vue +0 -0
  209. /package/app/components/{forms → 05.forms}/input-textarea/stories/InputTextareaCore.stories.ts +0 -0
  210. /package/app/components/{forms → 05.forms}/input-textarea/stories/InputTextareaWithLabel.stories.ts +0 -0
  211. /package/app/components/{forms → 05.forms}/input-textarea/variants/InputTextareaWithLabel.vue +0 -0
  212. /package/app/components/{forms → 05.forms}/pending-effect/PendingEffect.vue +0 -0
  213. /package/app/components/{forms → 05.forms}/toggle-switch/ToggleSwitchCore.vue +0 -0
  214. /package/app/components/{forms → 05.forms}/toggle-switch/stories/ToggleSwitchCore.stories.ts +0 -0
  215. /package/app/components/{forms → 05.forms}/toggle-switch/stories/ToggleSwitchWithLabel.stories.ts +0 -0
  216. /package/app/components/{forms → 05.forms}/toggle-switch/stories/ToggleSwitchWithLabelInline.stories.ts +0 -0
  217. /package/app/components/{forms → 05.forms}/toggle-switch/variants/ToggleSwitchWithLabel.vue +0 -0
  218. /package/app/components/{forms → 05.forms}/toggle-switch/variants/ToggleSwitchWithLabelInline.vue +0 -0
  219. /package/app/components/{forms → 05.forms}/triple-toggle-switch/TripleToggleSwitchCore.vue +0 -0
  220. /package/app/{components/forms/c12/prop-validators/index.ts → utils/prop-validators.ts} +0 -0
@@ -0,0 +1,138 @@
1
+ <template>
2
+ <div>
3
+ <NuxtLayout name="default">
4
+ <template #layout-content>
5
+ <PageRow tag="div" variant="popout" :style-class-passthrough="['mbs-32']">
6
+ <h1 class="page-heading-2">Deep Expanding Menu</h1>
7
+ <p>
8
+ A horizontal navigation menu using the CSS Popover API. Top-level items can be direct links or toggle a
9
+ panel of child links below them.
10
+ </p>
11
+ </PageRow>
12
+
13
+ <PageRow tag="div" variant="popout" :style-class-passthrough="['mbs-32']">
14
+ <h2 class="page-heading-3 mbe-16">Basic example</h2>
15
+ <div class="demo-surface">
16
+ <DeepExpandingMenu :nav-links="basicLinks" />
17
+ </div>
18
+ </PageRow>
19
+
20
+ <PageRow tag="div" variant="popout" :style-class-passthrough="['mbs-32']">
21
+ <h2 class="page-heading-3 mbe-16">Mixed links and groups</h2>
22
+ <div class="demo-surface">
23
+ <DeepExpandingMenu :nav-links="mixedLinks" />
24
+ </div>
25
+ </PageRow>
26
+
27
+ <PageRow tag="div" variant="popout" :style-class-passthrough="['mbs-32', 'mbe-64']">
28
+ <h2 class="page-heading-3 mbe-16">Many child links</h2>
29
+ <div class="demo-surface">
30
+ <DeepExpandingMenu :nav-links="richLinks" />
31
+ </div>
32
+ </PageRow>
33
+ </template>
34
+ </NuxtLayout>
35
+ </div>
36
+ </template>
37
+
38
+ <script setup lang="ts">
39
+ import type { ResponsiveHeaderNavItem } from "~/types/components";
40
+
41
+ definePageMeta({
42
+ layout: false,
43
+ });
44
+
45
+ useHead({
46
+ title: "Deep Expanding Menu",
47
+ meta: [{ name: "description", content: "Examples of Deep Expanding Menu UI Component" }],
48
+ bodyAttrs: {
49
+ class: "deep-expanding-menu-page",
50
+ },
51
+ });
52
+
53
+ const basicLinks: ResponsiveHeaderNavItem[] = [
54
+ { name: "Home", path: "/" },
55
+ { name: "About", path: "#about" },
56
+ {
57
+ name: "Services",
58
+ childLinksTitle: "Our Services",
59
+ childLinks: [
60
+ { name: "Consulting", path: "#consulting" },
61
+ { name: "Design", path: "#design" },
62
+ { name: "Development", path: "#development" },
63
+ ],
64
+ },
65
+ { name: "Contact", path: "#contact" },
66
+ ];
67
+
68
+ const mixedLinks: ResponsiveHeaderNavItem[] = [
69
+ { name: "Home", path: "/" },
70
+ {
71
+ name: "Products",
72
+ childLinksTitle: "Browse Products",
73
+ childLinks: [
74
+ { name: "Electronics", path: "#electronics" },
75
+ { name: "Clothing", path: "#clothing" },
76
+ { name: "Books", path: "#books" },
77
+ { name: "Accessories", path: "#accessories" },
78
+ ],
79
+ },
80
+ {
81
+ name: "Company",
82
+ childLinksTitle: "About Us",
83
+ childLinks: [
84
+ { name: "Our Story", path: "#story" },
85
+ { name: "Team", path: "#team" },
86
+ { name: "Careers", path: "#careers" },
87
+ ],
88
+ },
89
+ { name: "Blog", path: "#blog" },
90
+ { name: "Contact", path: "#contact" },
91
+ ];
92
+
93
+ const richLinks: ResponsiveHeaderNavItem[] = [
94
+ {
95
+ name: "Components",
96
+ childLinksTitle: "UI Components",
97
+ childLinks: [
98
+ { name: "Carousel", path: "/ui/carousel-basic" },
99
+ { name: "Accordian", path: "/ui/accordian" },
100
+ { name: "Tabs", path: "/ui/tabs" },
101
+ { name: "Dialogs", path: "/ui/display-dialog" },
102
+ { name: "Tooltips", path: "/ui/tooltips" },
103
+ { name: "Display Toast", path: "/ui/display-toast" },
104
+ { name: "Card Core", path: "/ui/card-core" },
105
+ { name: "Glowing Border", path: "/ui/glowing-border" },
106
+ ],
107
+ },
108
+ {
109
+ name: "Layouts",
110
+ childLinksTitle: "Layout Components",
111
+ childLinks: [
112
+ { name: "Simple Grid", path: "/ui/simple-grid" },
113
+ { name: "Masonry Grid", path: "/ui/masonry-grid" },
114
+ { name: "Block Decorators", path: "/ui/block-decorators" },
115
+ ],
116
+ },
117
+ {
118
+ name: "Navigation",
119
+ childLinksTitle: "Navigation Components",
120
+ childLinks: [
121
+ { name: "Site Navigation", path: "/ui/navigation/site-navigation" },
122
+ { name: "Nav Horizontal", path: "/ui/navigation/navigation-horizontal" },
123
+ { name: "Deep Expanding Menu", path: "/ui/deep-expanding-menu" },
124
+ { name: "Magnetic Navigation", path: "/ui/magnetic-navigation" },
125
+ ],
126
+ },
127
+ ];
128
+ </script>
129
+
130
+ <style lang="css">
131
+ .demo-surface {
132
+ /* background-color: light-dark(var(--slate-01), var(--slate-09)); */
133
+ /* border: 1px solid light-dark(var(--slate-03), var(--slate-07)); */
134
+ border-radius: 1.2rem;
135
+ padding: 2.4rem;
136
+ overflow: visible;
137
+ }
138
+ </style>
@@ -2,7 +2,7 @@
2
2
  <div>
3
3
  <NuxtLayout name="default">
4
4
  <template #layout-content>
5
- <LayoutRow tag="div" variant="popout">
5
+ <PageRow tag="div" variant="popout">
6
6
  <h1 class="page-heading-2">Display Avatar</h1>
7
7
 
8
8
  <form>
@@ -136,7 +136,7 @@
136
136
  </div>
137
137
  </div>
138
138
  </section>
139
- </LayoutRow>
139
+ </PageRow>
140
140
  </template>
141
141
  </NuxtLayout>
142
142
  </div>
@@ -2,9 +2,9 @@
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']">
5
+ <PageRow tag="div" variant="full" :style-class-passthrough="['mbe-20']">
6
6
  <h1 class="page-heading-2">DisplayBanner</h1>
7
- </LayoutRow>
7
+ </PageRow>
8
8
 
9
9
  <DisplayBanner tag="div" :style-class-passthrough="['mbe-20']">
10
10
  <template #canvas>
@@ -2,7 +2,7 @@
2
2
  <div>
3
3
  <NuxtLayout name="default">
4
4
  <template #layout-content>
5
- <LayoutRow tag="div" variant="popout">
5
+ <PageRow tag="div" variant="popout">
6
6
  <h1 class="page-heading-2">Display Chip</h1>
7
7
 
8
8
  <!-- ── QA Panel (dev only) ───────────────────────────────── -->
@@ -15,7 +15,6 @@
15
15
  </code>
16
16
  </summary>
17
17
  <div class="qa-panel__body">
18
-
19
18
  <div class="qa-panel__group">
20
19
  <span class="qa-panel__label">Size</span>
21
20
  <div class="qa-panel__chips">
@@ -25,7 +24,9 @@
25
24
  class="qa-panel__chip"
26
25
  :class="{ 'is-active': qaSize === preset }"
27
26
  @click="qaSize = preset"
28
- >{{ preset }}px</button>
27
+ >
28
+ {{ preset }}px
29
+ </button>
29
30
  </div>
30
31
  </div>
31
32
 
@@ -38,7 +39,9 @@
38
39
  class="qa-panel__chip"
39
40
  :class="{ 'is-active': qaMaskWidth === preset }"
40
41
  @click="qaMaskWidth = preset"
41
- >{{ preset }}px</button>
42
+ >
43
+ {{ preset }}px
44
+ </button>
42
45
  </div>
43
46
  </div>
44
47
 
@@ -51,22 +54,16 @@
51
54
  class="qa-panel__chip"
52
55
  :class="{ 'is-active': qaOffset === preset }"
53
56
  @click="qaOffset = preset"
54
- >{{ preset }}px</button>
57
+ >
58
+ {{ preset }}px
59
+ </button>
55
60
  </div>
56
61
  </div>
57
62
 
58
63
  <div class="qa-panel__group">
59
64
  <span class="qa-panel__label">Angle — {{ qaAngle }}deg</span>
60
- <input
61
- v-model.number="qaAngle"
62
- type="range"
63
- min="0"
64
- max="360"
65
- step="1"
66
- class="qa-panel__range"
67
- />
65
+ <input v-model.number="qaAngle" type="range" min="0" max="360" step="1" class="qa-panel__range" />
68
66
  </div>
69
-
70
67
  </div>
71
68
  </details>
72
69
  </div>
@@ -144,7 +141,7 @@
144
141
  </div>
145
142
  </div>
146
143
  </section>
147
- </LayoutRow>
144
+ </PageRow>
148
145
  </template>
149
146
  </NuxtLayout>
150
147
  </div>
@@ -177,12 +174,14 @@ const sizePresets = [8, 10, 12, 16, 20, 24];
177
174
  const maskWidthPresets = [0, 2, 4, 6, 8];
178
175
  const offsetPresets = [-4, 0, 2, 4, 8];
179
176
 
180
- const chipConfig = computed((): DisplayChipConfig => ({
181
- size: `${qaSize.value}px`,
182
- maskWidth: `${qaMaskWidth.value}px`,
183
- offset: `${qaOffset.value}px`,
184
- angle: `${qaAngle.value}deg`,
185
- }));
177
+ const chipConfig = computed(
178
+ (): DisplayChipConfig => ({
179
+ size: `${qaSize.value}px`,
180
+ maskWidth: `${qaMaskWidth.value}px`,
181
+ offset: `${qaOffset.value}px`,
182
+ angle: `${qaAngle.value}deg`,
183
+ })
184
+ );
186
185
  </script>
187
186
 
188
187
  <style lang="css">
@@ -207,7 +206,9 @@ const chipConfig = computed((): DisplayChipConfig => ({
207
206
  list-style: none;
208
207
  user-select: none;
209
208
 
210
- &::-webkit-details-marker { display: none; }
209
+ &::-webkit-details-marker {
210
+ display: none;
211
+ }
211
212
  }
212
213
 
213
214
  .qa-panel__title {
@@ -264,7 +265,9 @@ const chipConfig = computed((): DisplayChipConfig => ({
264
265
  cursor: pointer;
265
266
  transition: background 0.15s;
266
267
 
267
- &:hover { background: oklch(0% 0 0 / 0.4); }
268
+ &:hover {
269
+ background: oklch(0% 0 0 / 0.4);
270
+ }
268
271
 
269
272
  &.is-active {
270
273
  background: oklch(55% 0.18 240);
@@ -301,8 +304,12 @@ const chipConfig = computed((): DisplayChipConfig => ({
301
304
  transition: background 0.15s;
302
305
  }
303
306
 
304
- &:hover::-webkit-slider-thumb { background: oklch(62% 0.18 240); }
305
- &:hover::-moz-range-thumb { background: oklch(62% 0.18 240); }
307
+ &:hover::-webkit-slider-thumb {
308
+ background: oklch(62% 0.18 240);
309
+ }
310
+ &:hover::-moz-range-thumb {
311
+ background: oklch(62% 0.18 240);
312
+ }
306
313
  }
307
314
 
308
315
  /* ── Demo grid ─────────────────────────────────────────────────── */
@@ -2,7 +2,7 @@
2
2
  <div>
3
3
  <NuxtLayout name="default">
4
4
  <template #layout-content>
5
- <LayoutRow tag="div" variant="full-width" :style-class-passthrough="['display-details-section', 'mbe-20']">
5
+ <PageRow tag="div" variant="full" :style-class-passthrough="['display-details-section', 'mbe-20']">
6
6
  <h1 class="page-heading-2">Details element - Unlinked</h1>
7
7
  <p class="mbe-12">Following 2 details block behave independantly.</p>
8
8
 
@@ -53,13 +53,9 @@
53
53
  </div>
54
54
  </template>
55
55
  </DisplayDetailsCore>
56
- </LayoutRow>
56
+ </PageRow>
57
57
 
58
- <LayoutRow
59
- tag="div"
60
- variant="full-width"
61
- :style-class-passthrough="['display-details-section', 'mbe-20', 'hidden']"
62
- >
58
+ <PageRow tag="div" variant="full" :style-class-passthrough="['display-details-section', 'mbe-20', 'hidden']">
63
59
  <h2 class="page-heading-2">Details element - Linked</h2>
64
60
  <p class="mbe-12">Details panels are linked, only 1 can be open at a time.</p>
65
61
 
@@ -108,7 +104,7 @@
108
104
  </div>
109
105
  </template>
110
106
  </DisplayDetailsCore>
111
- </LayoutRow>
107
+ </PageRow>
112
108
  </template>
113
109
  </NuxtLayout>
114
110
  </div>
@@ -117,7 +113,7 @@
117
113
  <script setup lang="ts">
118
114
  definePageMeta({
119
115
  layout: false,
120
- })
116
+ });
121
117
 
122
118
  useHead({
123
119
  title: "Browser title tag",
@@ -127,7 +123,7 @@ useHead({
127
123
  content: "Meta description content",
128
124
  },
129
125
  ],
130
- })
126
+ });
131
127
  </script>
132
128
 
133
129
  <style lang="css">
@@ -2,19 +2,20 @@
2
2
  <div>
3
3
  <NuxtLayout name="default">
4
4
  <template #layout-content>
5
- <LayoutRow tag="div" variant="popout" :styleClassPassthrough="['mbe-20']">
6
- <h1 class="page-heading-2">Dialog withscrollable content</h1>
7
- <p><button @click.prevent="controlDialogs('sample1', true)" type="button">Show Dialog</button></p>
5
+ <PageRow tag="div" variant="popout" :style-class-passthrough="['mbe-20']">
6
+ <h1 class="page-heading-2">Dialog with scrollable content</h1>
7
+ <p><button type="button" @click.prevent="openDialog('sample1')">Show Dialog</button></p>
8
8
 
9
- <DisplayDialogScrollableContent
9
+ <DisplayDialog
10
10
  v-if="dialogsConfig['sample1']"
11
11
  v-model="dialogsConfig['sample1']"
12
+ variant="dialog"
12
13
  :style-class-passthrough="['your-modifier-class']"
13
- :allowContentScroll="true"
14
+ :allow-content-scroll="true"
14
15
  data-dialog-id="sample1"
15
16
  >
16
17
  <template #dialogTitle>
17
- <p class="text-normal wght-700 m-0">Confirm logout?</p>
18
+ <p class="text-normal wght-700 m-0">Dialog with scrollable content</p>
18
19
  </template>
19
20
 
20
21
  <template #dialogContent>
@@ -57,36 +58,25 @@
57
58
  Praesent proin sem nulla mauris justo mi morbi. Neque diam sodales nam nascetur commodo risus. Ornare
58
59
  at sit, mattis erat aenean ipsum. Dictum integer ipsum suspendisse sagittis nisl sollicitudin.
59
60
  </p>
60
- <p class="text-normal">
61
- Curae maximus nam tortor porta sodales at, feugiat iaculis integer. Lacus habitasse odio fames natoque
62
- neque varius nostra. Imperdiet tellus libero ornare lobortis maximus rutrum parturient litora viverra.
63
- Praesent proin sem nulla mauris justo mi morbi. Neque diam sodales nam nascetur commodo risus. Ornare
64
- at sit, mattis erat aenean ipsum. Dictum integer ipsum suspendisse sagittis nisl sollicitudin.
65
- </p>
66
- <p class="text-normal">
67
- Curae maximus nam tortor porta sodales at, feugiat iaculis integer. Lacus habitasse odio fames natoque
68
- neque varius nostra. Imperdiet tellus libero ornare lobortis maximus rutrum parturient litora viverra.
69
- Praesent proin sem nulla mauris justo mi morbi. Neque diam sodales nam nascetur commodo risus. Ornare
70
- at sit, mattis erat aenean ipsum. Dictum integer ipsum suspendisse sagittis nisl sollicitudin.
71
- </p>
72
61
  </div>
73
62
  </template>
74
63
  <template #actionButtonLeft>
75
- <button @click.prevent="controlDialogs('sample1', false, 'cancel')" type="submit">Cancel</button>
64
+ <button type="submit" @click.prevent="closeDialog('sample1', 'cancel')">Cancel</button>
76
65
  </template>
77
66
  <template #actionButtonRight>
78
- <button @click.prevent="controlDialogs('sample1', false, 'confirm')" type="submit">Confirm</button>
67
+ <button type="submit" @click.prevent="closeDialog('sample1', 'confirm')">Confirm</button>
79
68
  </template>
80
- </DisplayDialogScrollableContent>
81
- </LayoutRow>
69
+ </DisplayDialog>
70
+ </PageRow>
82
71
 
83
- <LayoutRow tag="div" variant="popout" :styleClassPassthrough="['mbe-20']">
72
+ <PageRow tag="div" variant="popout" :style-class-passthrough="['mbe-20']">
84
73
  <h2 class="page-heading-2">Confirm Dialog</h2>
85
- <p><button @click.prevent="controlDialogs('logout', true)" type="button">Show Dialog Prompt</button></p>
74
+ <p><button type="button" @click.prevent="openDialog('logout')">Show Confirm Dialog</button></p>
86
75
 
87
- <DisplayDialogConfirm
76
+ <DisplayDialog
88
77
  v-if="dialogsConfig['logout']"
89
78
  v-model="dialogsConfig['logout']"
79
+ variant="confirm"
90
80
  :style-class-passthrough="['your-modifier-class']"
91
81
  data-dialog-id="logout"
92
82
  >
@@ -100,13 +90,72 @@
100
90
  </div>
101
91
  </template>
102
92
  <template #actionButtonLeft>
103
- <button @click.prevent="controlDialogs('logout', false, 'cancel')" type="submit">Cancel</button>
93
+ <button type="submit" @click.prevent="closeDialog('logout', 'cancel')">Cancel</button>
94
+ </template>
95
+ <template #actionButtonRight>
96
+ <button type="submit" @click.prevent="closeDialog('logout', 'confirm')">Confirm</button>
97
+ </template>
98
+ </DisplayDialog>
99
+ </PageRow>
100
+
101
+ <PageRow tag="div" variant="popout" :style-class-passthrough="['mbe-20']">
102
+ <h2 class="page-heading-2">Alert Dialog</h2>
103
+ <p class="text-normal">Cannot be dismissed by clicking outside or pressing Escape — requires explicit action.</p>
104
+ <p><button type="button" @click.prevent="openDialog('deleteAccount')">Show Alert Dialog</button></p>
105
+
106
+ <DisplayDialog
107
+ v-if="dialogsConfig['deleteAccount']"
108
+ v-model="dialogsConfig['deleteAccount']"
109
+ variant="alert"
110
+ :style-class-passthrough="['your-modifier-class']"
111
+ data-dialog-id="deleteAccount"
112
+ >
113
+ <template #dialogTitle>
114
+ <p class="text-normal wght-700 m-0">Delete account?</p>
115
+ </template>
116
+
117
+ <template #dialogContent>
118
+ <div class="m-0">
119
+ <p class="text-normal">This action is permanent and cannot be undone. All your data will be removed.</p>
120
+ </div>
121
+ </template>
122
+ <template #actionButtonLeft>
123
+ <button type="button" @click.prevent="closeDialog('deleteAccount', 'cancel')">Cancel</button>
124
+ </template>
125
+ <template #actionButtonRight>
126
+ <button type="button" @click.prevent="closeDialog('deleteAccount', 'confirm')">Delete account</button>
127
+ </template>
128
+ </DisplayDialog>
129
+ </PageRow>
130
+
131
+ <PageRow tag="div" variant="popout" :style-class-passthrough="['mbe-20']">
132
+ <h2 class="page-heading-2">Fullscreen Dialog</h2>
133
+ <p><button type="button" @click.prevent="openDialog('fullscreen')">Show Fullscreen Dialog</button></p>
134
+
135
+ <DisplayDialog
136
+ v-if="dialogsConfig['fullscreen']"
137
+ v-model="dialogsConfig['fullscreen']"
138
+ variant="fullscreen"
139
+ :style-class-passthrough="['your-modifier-class']"
140
+ data-dialog-id="fullscreen"
141
+ >
142
+ <template #dialogTitle>
143
+ <p class="text-normal wght-700 m-0">Fullscreen dialog</p>
144
+ </template>
145
+
146
+ <template #dialogContent>
147
+ <div class="pt-12 pb-12">
148
+ <p class="text-normal">This dialog fills the entire viewport. Useful for immersive flows such as onboarding, image editors, or multi-step wizards.</p>
149
+ </div>
150
+ </template>
151
+ <template #actionButtonLeft>
152
+ <button type="button" @click.prevent="closeDialog('fullscreen', 'cancel')">Cancel</button>
104
153
  </template>
105
154
  <template #actionButtonRight>
106
- <button @click.prevent="controlDialogs('logout', false, 'confirm')" type="submit">Confirm</button>
155
+ <button type="button" @click.prevent="closeDialog('fullscreen', 'confirm')">Done</button>
107
156
  </template>
108
- </DisplayDialogConfirm>
109
- </LayoutRow>
157
+ </DisplayDialog>
158
+ </PageRow>
110
159
  </template>
111
160
  </NuxtLayout>
112
161
  </div>
@@ -115,7 +164,7 @@
115
164
  <script setup lang="ts">
116
165
  definePageMeta({
117
166
  layout: false,
118
- })
167
+ });
119
168
 
120
169
  useHead({
121
170
  title: "UI Dialogs",
@@ -123,109 +172,25 @@ useHead({
123
172
  bodyAttrs: {
124
173
  class: "home",
125
174
  },
126
- })
127
-
128
- const dialogBtnSampleAction = () => {
129
- console.log("Dialog button action clicked")
130
- }
175
+ });
131
176
 
132
- const { dialogsConfig, controlDialogs, initialiseDialogs, registerDialogCallbacks } = useDialogControls()
133
-
134
- onMounted(() => {
135
- const dialogIds = ["logout", "sample1"]
136
- initialiseDialogs(dialogIds)
137
-
138
- // Register callbacks for each dialog
139
- registerDialogCallbacks("sample1", {
140
- onConfirm: dialogBtnSampleAction,
177
+ const { dialogsConfig, openDialog, closeDialog } = useDialogControls({
178
+ sample1: {
179
+ onConfirm: () => console.log("Sample1 dialog confirmed"),
141
180
  onCancel: () => console.log("Sample1 dialog cancelled"),
142
- })
143
-
144
- registerDialogCallbacks("logout", {
145
- onConfirm: () => {
146
- dialogBtnSampleAction()
147
- console.log("User logged out")
148
- },
181
+ },
182
+ logout: {
183
+ onConfirm: () => console.log("User logged out"),
149
184
  onCancel: () => console.log("Logout cancelled"),
150
- })
151
- })
185
+ },
186
+ deleteAccount: {
187
+ onConfirm: () => console.log("Account deleted"),
188
+ onCancel: () => console.log("Delete account cancelled"),
189
+ },
190
+ fullscreen: {
191
+ onConfirm: () => console.log("Fullscreen dialog confirmed"),
192
+ onCancel: () => console.log("Fullscreen dialog cancelled"),
193
+ },
194
+ });
152
195
  </script>
153
196
 
154
- <style lang="css">
155
- .your-modifier-class {
156
- &.display-dialog-core {
157
- /* Dialog core styles */
158
- /* Delete or add styles as needed */
159
-
160
- &[open] {
161
- @starting-style {
162
- }
163
- }
164
-
165
- /* * Positioning the dialog */
166
- &[justify-dialog="start"] {
167
- }
168
-
169
- &[justify-dialog="center"] {
170
- }
171
-
172
- &[justify-dialog="end"] {
173
- }
174
-
175
- &[align-dialog="start"] {
176
- }
177
-
178
- &[align-dialog="center"] {
179
- }
180
- &[align-dialog="end"] {
181
- }
182
-
183
- .inner {
184
- &.confirm {
185
- }
186
-
187
- &.dialog {
188
- }
189
-
190
- &.form {
191
- }
192
-
193
- &.fullscreen {
194
- }
195
-
196
- &.modal {
197
- }
198
-
199
- .header {
200
- .col-left {
201
- }
202
-
203
- .col-center {
204
- }
205
-
206
- .col-right {
207
- .display-prompt-action {
208
- &:hover {
209
- }
210
- &:focus-visible {
211
- }
212
-
213
- .icon {
214
- }
215
- }
216
- }
217
- }
218
-
219
- .dialog-content {
220
- &.allow-content-scroll {
221
- &::-webkit-scrollbar {
222
- }
223
- }
224
- }
225
-
226
- .footer {
227
- }
228
- }
229
- }
230
- }
231
- </style>