srcdev-nuxt-components 9.1.48 → 9.1.50

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 (223) 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-anchor-scroll.md +110 -28
  11. package/.claude/skills/composable-dialog-controls.md +55 -43
  12. package/.claude/skills/index.md +5 -2
  13. package/app/components/01.atoms/card/CONSUMER-STYLING.md +175 -0
  14. package/app/components/01.atoms/card/CardCore.vue +48 -21
  15. package/app/components/01.atoms/display-dialog/CONSUMER-STYLING.md +163 -0
  16. package/app/components/01.atoms/display-dialog/DisplayDialog.vue +277 -0
  17. package/app/components/01.atoms/display-dialog/stories/DisplayDialog.stories.ts +177 -0
  18. package/app/components/01.atoms/display-dialog/tests/DisplayDialog.spec.ts +264 -0
  19. package/app/components/01.atoms/display-dialog/tests/__snapshots__/DisplayDialog.spec.ts.snap +18 -0
  20. package/app/components/01.atoms/page-row/CONSUMER-STYLING.md +90 -0
  21. package/app/components/01.atoms/page-row/PageRow.vue +115 -0
  22. package/app/components/01.atoms/page-row/stories/PageRow.stories.ts +311 -0
  23. package/app/components/01.atoms/page-row/tests/PageRow.spec.ts +191 -0
  24. package/app/components/02.molecules/navigation/tab-navigation/CONSUMER-STYLING.md +145 -0
  25. package/app/components/02.molecules/navigation/tab-navigation/TabNavigation.vue +52 -11
  26. package/app/components/02.molecules/navigation/tab-navigation/tests/__snapshots__/TabNavigation.spec.ts.snap +12 -6
  27. package/app/components/{forms/ui → 05.forms/form-field}/FormField.vue +12 -19
  28. package/app/components/{forms/ui → 05.forms/form-wrapper}/FormWrapper.vue +6 -6
  29. package/app/components/{forms → 05.forms}/input-button/InputButtonCore.vue +2 -0
  30. package/app/components/{forms → 05.forms}/input-button/stories/InputButtonCore.stories.ts +1 -1
  31. package/app/components/{forms → 05.forms}/input-text/InputTextCore.vue +73 -73
  32. package/app/components/{forms → 05.forms}/input-text/variants/InputTextAsNumberWithLabel.vue +29 -29
  33. package/app/components/carousels/CarouselBasic.vue +99 -99
  34. package/app/components/carousels/CarouselInfinite.vue +150 -150
  35. package/app/components/deep-expanding-menu/DeepExpandingMenu.vue +111 -111
  36. package/app/components/responsive-header/ResponsiveHeader.vue +250 -282
  37. package/app/components/test-storybook/TestStorybook.vue +16 -16
  38. package/app/composables/tests/useDialogControls.spec.ts +34 -64
  39. package/app/composables/useAnchorScroll.ts +16 -3
  40. package/app/composables/useDialogControls.ts +19 -33
  41. package/app/composables/useFormControl.ts +0 -2
  42. package/app/composables/useNavCollapse.ts +5 -1
  43. package/app/layouts/default.vue +10 -7
  44. package/app/pages/auto-grid.vue +37 -20
  45. package/app/pages/banner-video.vue +2 -2
  46. package/app/pages/forms/examples/buttons/index.vue +189 -215
  47. package/app/pages/forms/examples/material/text-fields.vue +2 -2
  48. package/app/pages/grid-stack.vue +10 -10
  49. package/app/pages/index.vue +20 -20
  50. package/app/pages/samaritan.vue +4 -4
  51. package/app/pages/typography/hero-text.vue +6 -6
  52. package/app/pages/typography/index.vue +4 -4
  53. package/app/pages/typography/page-body.vue +4 -4
  54. package/app/pages/typography/page-heading.vue +4 -4
  55. package/app/pages/typography/page-link.vue +4 -4
  56. package/app/pages/ui/accordian.vue +4 -4
  57. package/app/pages/ui/anchor-scroll-tab-navigation.vue +191 -0
  58. package/app/pages/ui/anchor-scroll.vue +105 -71
  59. package/app/pages/ui/animated-svg-text.vue +4 -4
  60. package/app/pages/ui/block-decorators.vue +11 -11
  61. package/app/pages/ui/card-core.vue +9 -9
  62. package/app/pages/ui/carousel-basic.vue +4 -4
  63. package/app/pages/ui/carousel-flip.vue +2 -2
  64. package/app/pages/ui/carousel-infinite.vue +4 -4
  65. package/app/pages/ui/clipped-panels.vue +10 -10
  66. package/app/pages/ui/contact-section.vue +4 -4
  67. package/app/pages/ui/container-glow.vue +2 -3
  68. package/app/pages/ui/deep-expanding-menu.vue +138 -0
  69. package/app/pages/ui/display-avatar.vue +2 -2
  70. package/app/pages/ui/display-banner.vue +2 -2
  71. package/app/pages/ui/display-chip.vue +32 -25
  72. package/app/pages/ui/display-details.vue +6 -10
  73. package/app/pages/ui/display-dialog.vue +96 -131
  74. package/app/pages/ui/display-pill.vue +27 -33
  75. package/app/pages/ui/display-prompt.vue +4 -4
  76. package/app/pages/ui/display-toast.vue +2 -2
  77. package/app/pages/ui/expanding-panel.vue +12 -16
  78. package/app/pages/ui/glowing-border.vue +12 -12
  79. package/app/pages/ui/layout-grid-a.vue +6 -6
  80. package/app/pages/ui/layout-grid-b.vue +4 -4
  81. package/app/pages/ui/magnetic-navigation.vue +6 -6
  82. package/app/pages/ui/marquee-scroller.vue +2 -2
  83. package/app/pages/ui/mask-element.vue +2 -2
  84. package/app/pages/ui/masonry-columns.vue +4 -4
  85. package/app/pages/ui/masonry-grid-ordered-experiment.vue +4 -4
  86. package/app/pages/ui/masonry-grid-ordered.vue +4 -4
  87. package/app/pages/ui/masonry-grid-sorted.vue +4 -4
  88. package/app/pages/ui/masonry-grid.vue +4 -4
  89. package/app/pages/ui/navigation/navigation-horizontal.vue +12 -12
  90. package/app/pages/ui/navigation/tab-navigation.vue +493 -0
  91. package/app/pages/ui/page-row.vue +127 -0
  92. package/app/pages/ui/price-list.vue +4 -4
  93. package/app/pages/ui/profile-section.vue +4 -4
  94. package/app/pages/ui/qr-code/[componentName].vue +6 -6
  95. package/app/pages/ui/rotating-carousel.vue +16 -16
  96. package/app/pages/ui/scroll-reveal-image.vue +20 -20
  97. package/app/pages/ui/section-parallax.vue +7 -7
  98. package/app/pages/ui/services/colour-finder.vue +4 -4
  99. package/app/pages/ui/services/services-cards.vue +4 -4
  100. package/app/pages/ui/services/services-section/[slug].vue +4 -4
  101. package/app/pages/ui/services/services-sections-compact.vue +6 -6
  102. package/app/pages/ui/settings.vue +10 -10
  103. package/app/pages/ui/simple-grid.vue +2 -2
  104. package/app/pages/ui/slider-gallery.vue +5 -5
  105. package/app/pages/ui/tabs-y.vue +2 -3
  106. package/app/pages/ui/tabs.vue +6 -9
  107. package/app/pages/ui/tooltips.vue +9 -9
  108. package/app/pages/ui/wipe-away-vertical.vue +14 -14
  109. package/package.json +1 -1
  110. package/.claude/skills/components/layout-row.md +0 -239
  111. package/app/components/display-dialog/DisplayDialogCore.vue +0 -276
  112. package/app/components/display-dialog/variants/DisplayDialogConfirm.vue +0 -47
  113. package/app/components/display-dialog/variants/DisplayDialogScrollableContent.vue +0 -51
  114. package/app/components/forms/c12/utils.ts +0 -14
  115. package/app/components/layout-row/LayoutRow.vue +0 -171
  116. package/app/components/layout-row/stories/LayoutRow.stories.ts +0 -528
  117. package/app/pages/ui/layout-row.vue +0 -139
  118. /package/app/components/{forms → 05.forms}/form-errors/InputError.vue +0 -0
  119. /package/app/components/{forms → 05.forms}/form-errors/tests/InputError.spec.ts +0 -0
  120. /package/app/components/{forms → 05.forms}/form-fieldset/FormFieldset.vue +0 -0
  121. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts +0 -0
  122. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-icons-secondary-chromium-darwin.png +0 -0
  123. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-icons-secondary-firefox-darwin.png +0 -0
  124. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-icons-secondary-webkit-darwin.png +0 -0
  125. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-icons-tertiary-chromium-darwin.png +0 -0
  126. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-icons-tertiary-firefox-darwin.png +0 -0
  127. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-icons-tertiary-webkit-darwin.png +0 -0
  128. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-primary-pending-chromium-darwin.png +0 -0
  129. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-primary-pending-firefox-darwin.png +0 -0
  130. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-primary-pending-webkit-darwin.png +0 -0
  131. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-secondary-pill-chromium-darwin.png +0 -0
  132. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-secondary-pill-firefox-darwin.png +0 -0
  133. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-secondary-pill-webkit-darwin.png +0 -0
  134. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-tertiary-readonly-chromium-darwin.png +0 -0
  135. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-tertiary-readonly-firefox-darwin.png +0 -0
  136. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/combo-tertiary-readonly-webkit-darwin.png +0 -0
  137. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-chromium-darwin.png +0 -0
  138. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-firefox-darwin.png +0 -0
  139. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-default-chromium-darwin.png +0 -0
  140. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-default-firefox-darwin.png +0 -0
  141. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-default-webkit-darwin.png +0 -0
  142. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-error-chromium-darwin.png +0 -0
  143. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-error-firefox-darwin.png +0 -0
  144. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-error-webkit-darwin.png +0 -0
  145. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-success-chromium-darwin.png +0 -0
  146. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-success-firefox-darwin.png +0 -0
  147. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-success-webkit-darwin.png +0 -0
  148. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-warning-chromium-darwin.png +0 -0
  149. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-warning-firefox-darwin.png +0 -0
  150. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-theme-warning-webkit-darwin.png +0 -0
  151. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-primary-chromium-darwin.png +0 -0
  152. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-primary-firefox-darwin.png +0 -0
  153. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-primary-webkit-darwin.png +0 -0
  154. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-secondary-chromium-darwin.png +0 -0
  155. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-secondary-firefox-darwin.png +0 -0
  156. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-secondary-webkit-darwin.png +0 -0
  157. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-tertiary-chromium-darwin.png +0 -0
  158. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-tertiary-firefox-darwin.png +0 -0
  159. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-variant-tertiary-webkit-darwin.png +0 -0
  160. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/default-webkit-darwin.png +0 -0
  161. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/nuxt-icon-only-component-chromium-darwin.png +0 -0
  162. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/nuxt-icon-only-component-firefox-darwin.png +0 -0
  163. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/nuxt-icon-only-component-webkit-darwin.png +0 -0
  164. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/state-pending-chromium-darwin.png +0 -0
  165. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/state-pending-firefox-darwin.png +0 -0
  166. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/state-pending-webkit-darwin.png +0 -0
  167. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/state-pill-chromium-darwin.png +0 -0
  168. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/state-pill-firefox-darwin.png +0 -0
  169. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/state-pill-webkit-darwin.png +0 -0
  170. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/state-readonly-chromium-darwin.png +0 -0
  171. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/state-readonly-firefox-darwin.png +0 -0
  172. /package/app/components/{forms → 05.forms}/input-button/playwright/input-button-core.playwright.ts-snapshots/state-readonly-webkit-darwin.png +0 -0
  173. /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
  174. /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
  175. /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
  176. /package/app/components/{forms → 05.forms}/input-button/tests/InputButtonCore.spec.ts +0 -0
  177. /package/app/components/{forms → 05.forms}/input-button/tests/__snapshots__/InputButtonCore.spec.ts.snap +0 -0
  178. /package/app/components/{forms → 05.forms}/input-checkbox/MultipleCheckboxes.vue +0 -0
  179. /package/app/components/{forms → 05.forms}/input-checkbox/SingleCheckbox.vue +0 -0
  180. /package/app/components/{forms → 05.forms}/input-checkbox/tests/MultipleCheckboxes.spec.ts +0 -0
  181. /package/app/components/{forms → 05.forms}/input-checkbox/tests/data/tags.json +0 -0
  182. /package/app/components/{forms → 05.forms}/input-checkbox-radio/InputCheckboxRadioButton.vue +0 -0
  183. /package/app/components/{forms → 05.forms}/input-checkbox-radio/InputCheckboxRadioCore.vue +0 -0
  184. /package/app/components/{forms → 05.forms}/input-checkbox-radio/InputCheckboxRadioWithLabel.vue +0 -0
  185. /package/app/components/{forms → 05.forms}/input-checkbox-radio/tests/InputCheckboxRadioCore.spec.ts +0 -0
  186. /package/app/components/{forms → 05.forms}/input-copy/InputCopyCore.vue +0 -0
  187. /package/app/components/{forms → 05.forms}/input-copy/stories/InputCopyCore.stories.ts +0 -0
  188. /package/app/components/{forms → 05.forms}/input-copy/tests/InputCopyCore.spec.ts +0 -0
  189. /package/app/components/{forms → 05.forms}/input-copy/tests/__snapshots__/InputCopyCore.spec.ts.snap +0 -0
  190. /package/app/components/{forms → 05.forms}/input-description/InputDescription.vue +0 -0
  191. /package/app/components/{forms → 05.forms}/input-description/tests/InputDescription.spec.ts +0 -0
  192. /package/app/components/{forms → 05.forms}/input-label/InputLabel.vue +0 -0
  193. /package/app/components/{forms → 05.forms}/input-label/tests/InputLabel.spec.ts +0 -0
  194. /package/app/components/{forms → 05.forms}/input-number/InputNumberCore.vue +0 -0
  195. /package/app/components/{forms → 05.forms}/input-number/variants/InputNumberDefault.vue +0 -0
  196. /package/app/components/{forms → 05.forms}/input-radio/MultipleRadiobuttons.vue +0 -0
  197. /package/app/components/{forms → 05.forms}/input-radio/tests/MultipleRadioButtons.spec.ts +0 -0
  198. /package/app/components/{forms → 05.forms}/input-radio/tests/data/tags.json +0 -0
  199. /package/app/components/{forms → 05.forms}/input-range/InputRangeCore.vue +0 -0
  200. /package/app/components/{forms → 05.forms}/input-range/variants/InputRangeDefault.vue +0 -0
  201. /package/app/components/{forms → 05.forms}/input-range-fancy/InputRangeFancyCore.vue +0 -0
  202. /package/app/components/{forms → 05.forms}/input-range-fancy/InputRangeFancyWithLabel.vue +0 -0
  203. /package/app/components/{forms → 05.forms}/input-select/InputSelectCore.vue +0 -0
  204. /package/app/components/{forms → 05.forms}/input-select/variants/InputSelectWithLabel.vue +0 -0
  205. /package/app/components/{forms → 05.forms}/input-text/stories/InputPasswordWithLabel.stories.ts +0 -0
  206. /package/app/components/{forms → 05.forms}/input-text/stories/InputTextAsNumberWithLabel.stories.ts +0 -0
  207. /package/app/components/{forms → 05.forms}/input-text/stories/InputTextCore.stories.ts +0 -0
  208. /package/app/components/{forms → 05.forms}/input-text/stories/InputTextWithLabel.stories.ts +0 -0
  209. /package/app/components/{forms → 05.forms}/input-text/variants/InputPasswordWithLabel.vue +0 -0
  210. /package/app/components/{forms → 05.forms}/input-text/variants/InputTextWithLabel.vue +0 -0
  211. /package/app/components/{forms → 05.forms}/input-textarea/InputTextareaCore.vue +0 -0
  212. /package/app/components/{forms → 05.forms}/input-textarea/stories/InputTextareaCore.stories.ts +0 -0
  213. /package/app/components/{forms → 05.forms}/input-textarea/stories/InputTextareaWithLabel.stories.ts +0 -0
  214. /package/app/components/{forms → 05.forms}/input-textarea/variants/InputTextareaWithLabel.vue +0 -0
  215. /package/app/components/{forms → 05.forms}/pending-effect/PendingEffect.vue +0 -0
  216. /package/app/components/{forms → 05.forms}/toggle-switch/ToggleSwitchCore.vue +0 -0
  217. /package/app/components/{forms → 05.forms}/toggle-switch/stories/ToggleSwitchCore.stories.ts +0 -0
  218. /package/app/components/{forms → 05.forms}/toggle-switch/stories/ToggleSwitchWithLabel.stories.ts +0 -0
  219. /package/app/components/{forms → 05.forms}/toggle-switch/stories/ToggleSwitchWithLabelInline.stories.ts +0 -0
  220. /package/app/components/{forms → 05.forms}/toggle-switch/variants/ToggleSwitchWithLabel.vue +0 -0
  221. /package/app/components/{forms → 05.forms}/toggle-switch/variants/ToggleSwitchWithLabelInline.vue +0 -0
  222. /package/app/components/{forms → 05.forms}/triple-toggle-switch/TripleToggleSwitchCore.vue +0 -0
  223. /package/app/{components/forms/c12/prop-validators/index.ts → utils/prop-validators.ts} +0 -0
@@ -9,20 +9,33 @@
9
9
  ]"
10
10
  aria-label="Site navigation"
11
11
  >
12
- <ul
13
- v-if="!isCollapsed || !isLoaded"
14
- ref="navListRef"
15
- class="tab-nav-list"
16
- @mouseleave="hoveredItemHref = null"
17
- >
12
+ <ul v-if="!isCollapsed || !isLoaded" ref="navListRef" class="tab-nav-list" @mouseleave="hoveredItemHref = null">
18
13
  <li
19
14
  v-for="item in navItemData.main"
20
15
  :key="item.href"
21
16
  :data-href="item.href"
22
- :class="[item.cssName, { 'is-active': isActiveItem(item.href), 'is-hovered': hoveredItemHref === item.href }]"
17
+ :class="[
18
+ item.cssName,
19
+ {
20
+ 'is-active': item.href?.startsWith('#') ? item.href === activeHash : isActiveItem(item.href),
21
+ 'is-hovered': hoveredItemHref === item.href,
22
+ },
23
+ ]"
23
24
  @mouseenter="hoveredItemHref = item.href ?? null"
24
25
  >
26
+ <!-- Plain <a> for hash links — keeps Vue Router out of the smooth-scroll path -->
27
+ <a
28
+ v-if="item.href?.startsWith('#')"
29
+ :href="item.href"
30
+ class="tab-nav-link"
31
+ data-nav-item
32
+ @click="(e) => item.href && handleNavClick(e, item.href)"
33
+ >
34
+ <Icon v-if="item.iconName" :name="item.iconName" aria-hidden="true" />
35
+ {{ item.text }}
36
+ </a>
25
37
  <NuxtLink
38
+ v-else
26
39
  :href="item.href"
27
40
  :external="item.isExternal || undefined"
28
41
  class="tab-nav-link"
@@ -74,11 +87,31 @@
74
87
  <div class="tab-nav-panel-inner">
75
88
  <ul class="tab-nav-panel-list">
76
89
  <li v-for="item in navItemData.main" :key="item.href" :class="item.cssName">
90
+ <a
91
+ v-if="item.href?.startsWith('#')"
92
+ :href="item.href"
93
+ class="tab-nav-panel-link"
94
+ @click="
95
+ (e) => {
96
+ item.href && handleNavClick(e, item.href);
97
+ closeMenu();
98
+ }
99
+ "
100
+ >
101
+ <Icon v-if="item.iconName" :name="item.iconName" aria-hidden="true" />
102
+ {{ item.text }}
103
+ </a>
77
104
  <NuxtLink
105
+ v-else
78
106
  :href="item.href"
79
107
  :external="item.isExternal || undefined"
80
108
  class="tab-nav-panel-link"
81
- @click="(e) => { item.href && handleNavClick(e, item.href); closeMenu(); }"
109
+ @click="
110
+ (e) => {
111
+ item.href && handleNavClick(e, item.href);
112
+ closeMenu();
113
+ }
114
+ "
82
115
  >
83
116
  <Icon v-if="item.iconName" :name="item.iconName" aria-hidden="true" />
84
117
  {{ item.text }}
@@ -97,17 +130,25 @@ interface Props {
97
130
  navItemData: NavItemData;
98
131
  navAlign?: "left" | "center" | "right";
99
132
  styleClassPassthrough?: string | string[];
133
+ anchorScrollOffset?: number | (() => number);
100
134
  }
101
135
 
102
136
  const props = withDefaults(defineProps<Props>(), {
103
137
  navAlign: "left",
104
138
  styleClassPassthrough: () => [],
139
+ anchorScrollOffset: undefined,
105
140
  });
106
141
 
107
- const { navRef, navListRef, isCollapsed, isLoaded, isMenuOpen, isActiveItem, toggleMenu, closeMenu } =
108
- useNavCollapse("tab-nav-loaded");
142
+ const { isCollapsed, isLoaded, isMenuOpen, isActiveItem, toggleMenu, closeMenu } = useNavCollapse("tab-nav-loaded");
143
+
144
+ const { handleNavClick, activeHash } = useAnchorScroll({ offset: props.anchorScrollOffset });
109
145
 
110
- const { handleNavClick } = useAnchorScroll();
146
+ onMounted(() => {
147
+ if (!activeHash.value) {
148
+ const firstHashItem = props.navItemData.main?.find((item) => item.href?.startsWith("#"));
149
+ if (firstHashItem?.href) activeHash.value = firstHashItem.href;
150
+ }
151
+ });
111
152
 
112
153
  // ─── Animation gate — disables indicator transitions during route changes ────
113
154
  // Starts true: CSS anchor positioning resolves before first paint so there is
@@ -3,15 +3,21 @@
3
3
  exports[`TabNavigation > renders correct HTML structure 1`] = `
4
4
  "<nav class="tab-navigation tab-navigation--left is-loaded is-animated" aria-label="Site navigation">
5
5
  <ul class="tab-nav-list">
6
- <li data-href="/" class="is-active"><a href="/" class="tab-nav-link" data-nav-item="">
6
+ <li data-href="/" class="is-active">
7
+ <!-- Plain <a> for hash links — keeps Vue Router out of the smooth-scroll path --><a href="/" class="tab-nav-link" data-nav-item="">
7
8
  <!--v-if--> Home
8
- </a></li>
9
- <li data-href="/about" class=""><a href="/about" class="tab-nav-link" data-nav-item="">
9
+ </a>
10
+ </li>
11
+ <li data-href="/about" class="">
12
+ <!-- Plain <a> for hash links — keeps Vue Router out of the smooth-scroll path --><a href="/about" class="tab-nav-link" data-nav-item="">
10
13
  <!--v-if--> About
11
- </a></li>
12
- <li data-href="/contact" class=""><a href="/contact" class="tab-nav-link" data-nav-item="">
14
+ </a>
15
+ </li>
16
+ <li data-href="/contact" class="">
17
+ <!-- Plain <a> for hash links — keeps Vue Router out of the smooth-scroll path --><a href="/contact" class="tab-nav-link" data-nav-item="">
13
18
  <!--v-if--> Contact
14
- </a></li>
19
+ </a>
20
+ </li>
15
21
  <li aria-hidden="true" role="none" class="nav-indicator-li">
16
22
  <div class="nav__hovered"></div>
17
23
  </li>
@@ -11,24 +11,18 @@
11
11
  </template>
12
12
 
13
13
  <script setup lang="ts">
14
- defineProps({
15
- width: {
16
- type: String as PropType<string>,
17
- default: "narrow",
18
- validator: (val: string) => ["narrow", "medium", "wide"].includes(val),
19
- },
20
- fieldHasError: {
21
- type: Boolean as PropType<boolean>,
22
- default: false,
23
- },
24
- hasGutter: {
25
- type: Boolean as PropType<boolean>,
26
- default: true,
27
- },
28
- styleClassPassthrough: {
29
- type: String,
30
- default: "",
31
- },
14
+ interface Props {
15
+ width?: "narrow" | "medium" | "wide";
16
+ fieldHasError?: boolean;
17
+ hasGutter?: boolean;
18
+ styleClassPassthrough?: string;
19
+ }
20
+
21
+ const props = withDefaults(defineProps<Props>(), {
22
+ width: "narrow",
23
+ fieldHasError: false,
24
+ hasGutter: true,
25
+ styleClassPassthrough: "",
32
26
  });
33
27
  </script>
34
28
 
@@ -47,7 +41,6 @@ defineProps({
47
41
 
48
42
  width: min(100% - calc(2 * var(--_gutter-width)), var(--_max-width));
49
43
  outline: 0rem solid var(--slate-05);
50
- /* overflow-block: hidden; */
51
44
 
52
45
  &:has(.underline) {
53
46
  --_background-color: var(--theme-form-input-bg-underlined);
@@ -5,12 +5,12 @@
5
5
  </template>
6
6
 
7
7
  <script setup lang="ts">
8
- defineProps({
9
- width: {
10
- type: String as PropType<string>,
11
- default: "narrow",
12
- validator: (val: string) => ["narrow", "medium", "wide"].includes(val),
13
- },
8
+ interface Props {
9
+ width?: "narrow" | "medium" | "wide";
10
+ }
11
+
12
+ const props = withDefaults(defineProps<Props>(), {
13
+ width: "narrow",
14
14
  });
15
15
  </script>
16
16
 
@@ -87,6 +87,8 @@ const { elementClasses } = useStyleClassPassthrough(props.styleClassPassthrough)
87
87
  <style lang="css">
88
88
  @layer components {
89
89
  .input-button-core {
90
+ all: unset;
91
+
90
92
  display: grid;
91
93
  grid-auto-flow: column;
92
94
  gap: var(--button-icon-gap);
@@ -239,7 +239,7 @@ const Template: StoryFn<InputButtonCoreStoryArgs> = (args) => ({
239
239
  };
240
240
  },
241
241
  template: `
242
- <div class="space-y-4">
242
+ <div style="display: flex; flex-direction: column; gap: 1rem; align-items: flex-start;margin: 36px;">
243
243
  <StorybookComponent
244
244
  v-bind="args"
245
245
  @click="handleClick"
@@ -126,97 +126,97 @@ onMounted(() => {
126
126
 
127
127
  <style lang="css">
128
128
  @layer components {
129
- .input-text-wrapper {
130
- display: flex;
131
- align-items: center;
132
- gap: var(--input-icon-slot-gap);
133
- background-color: var(--theme-input-surface);
134
- overflow: hidden;
135
- transition: all var(--theme-form-transition-duration) ease-in-out;
136
-
137
- z-index: 2;
138
- position: relative;
139
-
140
- &.normal {
141
- border: var(--form-element-border-width) solid var(--theme-input-border);
142
- border-radius: var(--form-input-border-radius);
143
- outline: var(--form-element-outline-width) solid var(--theme-input-outline);
144
-
145
- padding-inline: var(--input-padding-inline);
146
-
147
- &:has(input:is(:hover)) {
148
- outline: var(--form-element-outline-width-focus) solid var(--theme-input-outline-focus);
149
- outline-offset: var(--form-element-outline-offset-focus);
150
- }
151
-
152
- &:has(input:focus-visible) {
153
- outline: var(--form-element-outline-width-focus) solid var(--theme-input-outline-focus);
154
- outline-offset: var(--form-element-outline-offset-focus);
155
- }
156
- }
157
-
158
- &.underlined {
159
- border-bottom: var(--form-element-border-bottom-width-underlined) solid var(--theme-input-border);
160
- padding-inline: var(--input-padding-inline);
161
- }
162
-
163
- &.has-right-slot:has(.input-button-core) {
164
- padding-inline-end: 0;
165
- }
166
-
167
- .slot {
129
+ .input-text-wrapper {
168
130
  display: flex;
169
131
  align-items: center;
170
- justify-content: center;
171
- box-sizing: content-box;
132
+ gap: var(--input-icon-slot-gap);
133
+ background-color: var(--theme-input-surface);
134
+ overflow: hidden;
135
+ transition: all var(--theme-form-transition-duration) ease-in-out;
136
+
137
+ z-index: 2;
138
+ position: relative;
172
139
 
173
- .input-button-core {
174
- background-color: var(--theme-input-surface);
175
- aspect-ratio: 1;
176
- border-radius: 0;
177
- width: var(--input-min-height);
140
+ &.normal {
141
+ border: var(--form-element-border-width) solid var(--theme-input-border);
142
+ border-radius: var(--form-input-border-radius);
143
+ outline: var(--form-element-outline-width) solid var(--theme-input-outline);
178
144
 
179
- &:hover {
180
- background-color: var(--theme-input-surface-hover);
145
+ padding-inline: var(--input-padding-inline);
146
+
147
+ &:has(input:is(:hover), button:is(:hover)) {
148
+ outline: var(--form-element-outline-width-focus) solid var(--theme-input-outline-focus);
149
+ outline-offset: var(--form-element-outline-offset-focus);
181
150
  }
182
151
 
183
- &:is(:focus-visible) {
152
+ &:has(input:focus-visible, button:focus-visible) {
184
153
  outline: var(--form-element-outline-width-focus) solid var(--theme-input-outline-focus);
185
- outline-offset: -4px;
154
+ outline-offset: var(--form-element-outline-offset-focus);
186
155
  }
156
+ }
187
157
 
188
- &.icon-only {
189
- .btn-icon {
190
- margin: 0;
158
+ &.underlined {
159
+ border-bottom: var(--form-element-border-bottom-width-underlined) solid var(--theme-input-border);
160
+ padding-inline: var(--input-padding-inline);
161
+ }
162
+
163
+ &.has-right-slot:has(.input-button-core) {
164
+ padding-inline-end: 0;
165
+ }
166
+
167
+ .slot {
168
+ display: flex;
169
+ align-items: center;
170
+ justify-content: center;
171
+ box-sizing: content-box;
172
+
173
+ .input-button-core {
174
+ background-color: var(--theme-input-surface);
175
+ aspect-ratio: 1;
176
+ border-radius: 0;
177
+ width: var(--input-min-height);
178
+
179
+ &:hover {
180
+ background-color: var(--theme-input-surface-hover);
181
+ }
182
+
183
+ &:is(:focus-visible) {
184
+ outline: var(--form-element-outline-width-focus) solid var(--theme-input-outline-focus);
185
+ outline-offset: -4px;
186
+ }
187
+
188
+ &.icon-only {
189
+ .btn-icon {
190
+ margin: 0;
191
+ }
191
192
  }
192
193
  }
193
194
  }
194
- }
195
195
 
196
- .input-text-core {
197
- all: unset;
198
- touch-action: manipulation;
199
- flex-grow: 1;
196
+ .input-text-core {
197
+ all: unset;
198
+ touch-action: manipulation;
199
+ flex-grow: 1;
200
200
 
201
- color: var(--theme-input-text-color-normal);
202
- font-family: var(--font-family);
203
- font-size: var(--input-font-size);
201
+ color: var(--theme-input-text-color-normal);
202
+ font-family: var(--font-family);
203
+ font-size: var(--input-font-size);
204
204
 
205
- /* line-height: var(--input-element-line-height); */
205
+ /* line-height: var(--input-element-line-height); */
206
206
 
207
- padding-block: var(--input-padding-block);
208
- padding-inline: var(--input-padding-inline);
209
- /* height: stretch; */
210
- min-height: var(--input-min-height);
207
+ padding-block: var(--input-padding-block);
208
+ padding-inline: var(--input-padding-inline);
209
+ /* height: stretch; */
210
+ min-height: var(--input-min-height);
211
211
 
212
- &::placeholder {
213
- color: var(--theme-input-placeholder);
214
- font-size: var(--theme-input-placeholder-font-size);
215
- font-style: italic;
216
- line-height: 1;
217
- font-weight: normal;
212
+ &::placeholder {
213
+ color: var(--theme-input-placeholder);
214
+ font-size: var(--theme-input-placeholder-font-size);
215
+ font-style: italic;
216
+ line-height: 1;
217
+ font-weight: normal;
218
+ }
218
219
  }
219
220
  }
220
221
  }
221
- }
222
222
  </style>
@@ -155,49 +155,49 @@ updateElementClasses(["input-text-as-number", "has-left-button", "has-right-butt
155
155
 
156
156
  <style lang="css">
157
157
  @layer components {
158
- .input-text-as-number {
159
- .input-text-wrapper {
160
- width: fit-content;
161
- padding-inline: 0;
158
+ .input-text-as-number {
159
+ .input-text-wrapper {
160
+ width: fit-content;
161
+ padding-inline: 0;
162
162
 
163
- &:has(.input-text-as-number) {
164
- .slot {
165
- margin-inline: 0;
163
+ &:has(.input-text-as-number) {
164
+ .slot {
165
+ margin-inline: 0;
166
166
 
167
- .input-button-core {
168
- background-color: var(--theme-input-surface);
167
+ .input-button-core {
168
+ background-color: var(--theme-input-surface);
169
169
 
170
- &:hover {
171
- background-color: var(--theme-input-surface-hover);
172
- }
170
+ &:hover {
171
+ background-color: var(--theme-input-surface-hover);
172
+ }
173
173
 
174
- &.icon-only {
175
- .btn-icon {
176
- margin: 0;
174
+ &.icon-only {
175
+ .btn-icon {
176
+ margin: 0;
177
+ }
177
178
  }
178
179
  }
179
- }
180
180
 
181
- &.left-slot {
182
- .input-button-core {
183
- border-right: var(--form-element-border-width) solid var(--theme-input-border);
181
+ &.left-slot {
182
+ .input-button-core {
183
+ border-right: var(--form-element-border-width) solid var(--theme-input-border);
184
+ }
184
185
  }
185
- }
186
186
 
187
- &.right-slot {
188
- .input-button-core {
189
- border-left: var(--form-element-border-width) solid var(--theme-input-border);
187
+ &.right-slot {
188
+ .input-button-core {
189
+ border-left: var(--form-element-border-width) solid var(--theme-input-border);
190
+ }
190
191
  }
191
192
  }
192
193
  }
193
- }
194
194
 
195
- .input-text-core.input-text-as-number {
196
- flex-grow: initial;
197
- text-align: center;
198
- width: v-bind(minLength);
195
+ .input-text-core.input-text-as-number {
196
+ flex-grow: initial;
197
+ text-align: center;
198
+ width: v-bind(minLength);
199
+ }
199
200
  }
200
201
  }
201
202
  }
202
- }
203
203
  </style>