@ulu/frontend-vue 0.1.0-beta.9 → 0.1.1-beta.10

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 (285) hide show
  1. package/dist/{breakpoints-BbkGNxxt.js → breakpoints-BYSYcx8V.js} +1 -1
  2. package/dist/frontend-vue.css +1 -1
  3. package/dist/frontend-vue.js +82 -70
  4. package/dist/index-A7weElM_.js +7766 -0
  5. package/lib/components/collapsible/UluAccordion.vue +71 -53
  6. package/lib/components/collapsible/UluAccordionGroup.vue +54 -0
  7. package/lib/components/collapsible/UluCollapsible.vue +144 -0
  8. package/lib/components/collapsible/UluDropdown.vue +29 -29
  9. package/lib/components/collapsible/UluOverflowPopover.vue +1 -1
  10. package/lib/components/elements/UluBadge.vue +51 -28
  11. package/lib/components/elements/UluBadgeStack.vue +8 -13
  12. package/lib/components/elements/UluButtonVerbose.vue +119 -0
  13. package/lib/components/elements/UluCard.vue +1 -1
  14. package/lib/components/elements/UluDefinitionList.vue +14 -17
  15. package/lib/components/elements/UluExternalLink.vue +21 -27
  16. package/lib/components/elements/UluIcon.vue +11 -1
  17. package/lib/components/elements/UluList.vue +53 -55
  18. package/lib/components/elements/UluSpokeSpinner.vue +12 -18
  19. package/lib/components/elements/UluTag.vue +35 -35
  20. package/lib/components/forms/UluFileDisplay.vue +49 -31
  21. package/lib/components/forms/UluFormFile.vue +37 -24
  22. package/lib/components/forms/UluFormMessage.vue +13 -10
  23. package/lib/components/forms/UluFormSelect.vue +28 -16
  24. package/lib/components/forms/UluFormText.vue +24 -15
  25. package/lib/components/forms/UluSearchForm.vue +11 -10
  26. package/lib/components/forms/UluSelectableMenu.vue +106 -0
  27. package/lib/components/index.js +4 -3
  28. package/lib/components/layout/UluTitleRail.vue +18 -0
  29. package/lib/components/layout/UluWhenBreakpoint.vue +9 -0
  30. package/lib/components/navigation/UluBreadcrumb.vue +9 -2
  31. package/lib/components/navigation/UluMenu.vue +13 -6
  32. package/lib/components/navigation/UluMenuStack.vue +50 -31
  33. package/lib/components/navigation/UluPager.vue +102 -0
  34. package/lib/components/systems/facets/ExampleFacetsWithPagination.vue +119 -0
  35. package/lib/components/systems/facets/UluFacetsActiveFilters.vue +84 -0
  36. package/lib/components/systems/facets/UluFacetsFilterLists.vue +97 -0
  37. package/lib/components/systems/facets/UluFacetsFilterPopovers.vue +125 -0
  38. package/lib/components/systems/facets/UluFacetsFilterSelects.vue +71 -0
  39. package/lib/components/systems/facets/UluFacetsHeaderLayout.vue +24 -0
  40. package/lib/components/systems/facets/UluFacetsList.vue +64 -34
  41. package/lib/components/systems/facets/UluFacetsResults.vue +63 -0
  42. package/lib/components/systems/facets/UluFacetsSearch.vue +27 -50
  43. package/lib/components/systems/facets/UluFacetsSidebarLayout.vue +90 -0
  44. package/lib/components/systems/facets/UluFacetsSort.vue +45 -0
  45. package/lib/components/systems/facets/_facets.scss +2 -3
  46. package/lib/components/systems/facets/_mock-data.js +40 -0
  47. package/lib/components/systems/facets/useFacets.js +394 -0
  48. package/lib/components/systems/index.js +14 -2
  49. package/lib/components/systems/scroll-anchors/UluScrollAnchors.vue +2 -1
  50. package/lib/components/systems/skeleton/UluShowSkeleton.vue +9 -8
  51. package/lib/components/systems/skeleton/UluSkeletonContent.vue +39 -43
  52. package/lib/components/systems/skeleton/UluSkeletonMedia.vue +4 -6
  53. package/lib/components/systems/skeleton/UluSkeletonText.vue +27 -0
  54. package/lib/components/systems/slider/UluImageSlideShow.vue +1 -1
  55. package/lib/components/systems/slider/UluSlideShow.vue +8 -3
  56. package/lib/components/systems/table-sticky/UluTableSticky.vue +7 -7
  57. package/lib/components/systems/table-sticky/UluTableStickyTable.vue +3 -3
  58. package/lib/components/visualizations/UluAnimateNumber.vue +7 -1
  59. package/lib/components/visualizations/UluProgressBar.vue +148 -74
  60. package/lib/components/visualizations/UluProgressCircle.vue +159 -0
  61. package/lib/composables/index.js +3 -1
  62. package/lib/composables/useDocumentTitle.js +61 -0
  63. package/lib/composables/usePagination.js +122 -0
  64. package/lib/index.js +1 -0
  65. package/lib/plugins/core/index.js +6 -1
  66. package/lib/plugins/popovers/UluPopover.vue +8 -3
  67. package/lib/plugins/toast/UluToast.vue +1 -1
  68. package/lib/plugins/toast/UluToastDisplay.vue +19 -2
  69. package/lib/utils/dom.js +12 -0
  70. package/lib/utils/index.js +2 -0
  71. package/lib/utils/{vue-router.js → router.js} +114 -30
  72. package/package.json +22 -12
  73. package/types/components/collapsible/UluAccordion.vue.d.ts +42 -0
  74. package/types/components/collapsible/UluAccordion.vue.d.ts.map +1 -0
  75. package/types/components/collapsible/UluAccordionGroup.vue.d.ts +19 -0
  76. package/types/components/collapsible/UluAccordionGroup.vue.d.ts.map +1 -0
  77. package/types/components/collapsible/UluCollapsible.vue.d.ts +40 -0
  78. package/types/components/collapsible/UluCollapsible.vue.d.ts.map +1 -0
  79. package/types/components/collapsible/UluDropdown.vue.d.ts +22 -0
  80. package/types/components/collapsible/UluDropdown.vue.d.ts.map +1 -0
  81. package/types/components/collapsible/UluModal.vue.d.ts +253 -0
  82. package/types/components/collapsible/UluModal.vue.d.ts.map +1 -0
  83. package/types/components/collapsible/UluOverflowPopover.vue.d.ts +18 -0
  84. package/types/components/collapsible/UluOverflowPopover.vue.d.ts.map +1 -0
  85. package/types/components/collapsible/UluTab.vue.d.ts +10 -0
  86. package/types/components/collapsible/UluTab.vue.d.ts.map +1 -0
  87. package/types/components/collapsible/UluTabGroup.vue.d.ts +18 -0
  88. package/types/components/collapsible/UluTabGroup.vue.d.ts.map +1 -0
  89. package/types/components/collapsible/UluTabList.vue.d.ts +10 -0
  90. package/types/components/collapsible/UluTabList.vue.d.ts.map +1 -0
  91. package/types/components/collapsible/UluTabPanel.vue.d.ts +10 -0
  92. package/types/components/collapsible/UluTabPanel.vue.d.ts.map +1 -0
  93. package/types/components/collapsible/UluTabPanels.vue.d.ts +10 -0
  94. package/types/components/collapsible/UluTabPanels.vue.d.ts.map +1 -0
  95. package/types/components/elements/UluAlert.vue.d.ts +147 -0
  96. package/types/components/elements/UluAlert.vue.d.ts.map +1 -0
  97. package/types/components/elements/UluBadge.vue.d.ts +30 -0
  98. package/types/components/elements/UluBadge.vue.d.ts.map +1 -0
  99. package/types/components/elements/UluBadgeStack.vue.d.ts +9 -0
  100. package/types/components/elements/UluBadgeStack.vue.d.ts.map +1 -0
  101. package/types/components/elements/UluButton.vue.d.ts +186 -0
  102. package/types/components/elements/UluButton.vue.d.ts.map +1 -0
  103. package/types/components/elements/UluButtonVerbose.vue.d.ts +126 -0
  104. package/types/components/elements/UluButtonVerbose.vue.d.ts.map +1 -0
  105. package/types/components/elements/UluCallout.vue.d.ts +27 -0
  106. package/types/components/elements/UluCallout.vue.d.ts.map +1 -0
  107. package/types/components/elements/UluCard.vue.d.ts +238 -0
  108. package/types/components/elements/UluCard.vue.d.ts.map +1 -0
  109. package/types/components/elements/UluDefinitionList.vue.d.ts +26 -0
  110. package/types/components/elements/UluDefinitionList.vue.d.ts.map +1 -0
  111. package/types/components/elements/UluExternalLink.vue.d.ts +25 -0
  112. package/types/components/elements/UluExternalLink.vue.d.ts.map +1 -0
  113. package/types/components/elements/UluIcon.vue.d.ts +11 -0
  114. package/types/components/elements/UluIcon.vue.d.ts.map +1 -0
  115. package/types/components/elements/UluList.vue.d.ts +37 -0
  116. package/types/components/elements/UluList.vue.d.ts.map +1 -0
  117. package/types/components/elements/UluMain.vue.d.ts +13 -0
  118. package/types/components/elements/UluMain.vue.d.ts.map +1 -0
  119. package/types/components/elements/UluSpokeSpinner.vue.d.ts +9 -0
  120. package/types/components/elements/UluSpokeSpinner.vue.d.ts.map +1 -0
  121. package/types/components/elements/UluTag.vue.d.ts +26 -0
  122. package/types/components/elements/UluTag.vue.d.ts.map +1 -0
  123. package/types/components/forms/UluFileDisplay.vue.d.ts +23 -0
  124. package/types/components/forms/UluFileDisplay.vue.d.ts.map +1 -0
  125. package/types/components/forms/UluFormFile.vue.d.ts +26 -0
  126. package/types/components/forms/UluFormFile.vue.d.ts.map +1 -0
  127. package/types/components/forms/UluFormMessage.vue.d.ts +18 -0
  128. package/types/components/forms/UluFormMessage.vue.d.ts.map +1 -0
  129. package/types/components/forms/UluFormSelect.vue.d.ts +24 -0
  130. package/types/components/forms/UluFormSelect.vue.d.ts.map +1 -0
  131. package/types/components/forms/UluFormText.vue.d.ts +22 -0
  132. package/types/components/forms/UluFormText.vue.d.ts.map +1 -0
  133. package/types/components/forms/UluSearchForm.vue.d.ts +9 -0
  134. package/types/components/forms/UluSearchForm.vue.d.ts.map +1 -0
  135. package/types/components/forms/UluSelectableMenu.vue.d.ts +30 -0
  136. package/types/components/forms/UluSelectableMenu.vue.d.ts.map +1 -0
  137. package/types/components/index.d.ts +48 -0
  138. package/types/components/layout/UluAdaptiveLayout.vue.d.ts +12 -0
  139. package/types/components/layout/UluAdaptiveLayout.vue.d.ts.map +1 -0
  140. package/types/components/layout/UluDataGrid.vue.d.ts +3 -0
  141. package/types/components/layout/UluDataGrid.vue.d.ts.map +1 -0
  142. package/types/components/layout/UluTitleRail.vue.d.ts +91 -0
  143. package/types/components/layout/UluTitleRail.vue.d.ts.map +1 -0
  144. package/types/components/layout/UluWhenBreakpoint.vue.d.ts +20 -0
  145. package/types/components/layout/UluWhenBreakpoint.vue.d.ts.map +1 -0
  146. package/types/components/navigation/UluBreadcrumb.vue.d.ts +71 -0
  147. package/types/components/navigation/UluBreadcrumb.vue.d.ts.map +1 -0
  148. package/types/components/navigation/UluMenu.vue.d.ts +142 -0
  149. package/types/components/navigation/UluMenu.vue.d.ts.map +1 -0
  150. package/types/components/navigation/UluMenuStack.vue.d.ts +19 -0
  151. package/types/components/navigation/UluMenuStack.vue.d.ts.map +1 -0
  152. package/types/components/navigation/UluNavStrip.vue.d.ts +138 -0
  153. package/types/components/navigation/UluNavStrip.vue.d.ts.map +1 -0
  154. package/types/components/navigation/UluPager.vue.d.ts +15 -0
  155. package/types/components/navigation/UluPager.vue.d.ts.map +1 -0
  156. package/types/components/navigation/UluSkipLink.vue.d.ts +3 -0
  157. package/types/components/navigation/UluSkipLink.vue.d.ts.map +1 -0
  158. package/types/components/systems/facets/ExampleFacetsWithPagination.vue.d.ts +3 -0
  159. package/types/components/systems/facets/ExampleFacetsWithPagination.vue.d.ts.map +1 -0
  160. package/types/components/systems/facets/UluFacetsActiveFilters.vue.d.ts +18 -0
  161. package/types/components/systems/facets/UluFacetsActiveFilters.vue.d.ts.map +1 -0
  162. package/types/components/systems/facets/UluFacetsFilterLists.vue.d.ts +27 -0
  163. package/types/components/systems/facets/UluFacetsFilterLists.vue.d.ts.map +1 -0
  164. package/types/components/systems/facets/UluFacetsFilterPopovers.vue.d.ts +25 -0
  165. package/types/components/systems/facets/UluFacetsFilterPopovers.vue.d.ts.map +1 -0
  166. package/types/components/systems/facets/UluFacetsFilterSelects.vue.d.ts +11 -0
  167. package/types/components/systems/facets/UluFacetsFilterSelects.vue.d.ts.map +1 -0
  168. package/types/components/systems/facets/UluFacetsHeaderLayout.vue.d.ts +12 -0
  169. package/types/components/systems/facets/UluFacetsHeaderLayout.vue.d.ts.map +1 -0
  170. package/types/components/systems/facets/UluFacetsList.vue.d.ts +21 -0
  171. package/types/components/systems/facets/UluFacetsList.vue.d.ts.map +1 -0
  172. package/types/components/systems/facets/UluFacetsResults.vue.d.ts +27 -0
  173. package/types/components/systems/facets/UluFacetsResults.vue.d.ts.map +1 -0
  174. package/types/components/systems/facets/UluFacetsSearch.vue.d.ts +15 -0
  175. package/types/components/systems/facets/UluFacetsSearch.vue.d.ts.map +1 -0
  176. package/types/components/systems/facets/UluFacetsSidebarLayout.vue.d.ts +22 -0
  177. package/types/components/systems/facets/UluFacetsSidebarLayout.vue.d.ts.map +1 -0
  178. package/types/components/systems/facets/UluFacetsSort.vue.d.ts +22 -0
  179. package/types/components/systems/facets/UluFacetsSort.vue.d.ts.map +1 -0
  180. package/types/components/systems/facets/_mock-data.d.ts +18 -0
  181. package/types/components/systems/facets/_mock-data.d.ts.map +1 -0
  182. package/types/components/systems/facets/useFacets.d.ts +57 -0
  183. package/types/components/systems/facets/useFacets.d.ts.map +1 -0
  184. package/types/components/systems/index.d.ts +25 -1
  185. package/types/components/systems/scroll-anchors/UluScrollAnchors.vue.d.ts +60 -0
  186. package/types/components/systems/scroll-anchors/UluScrollAnchors.vue.d.ts.map +1 -0
  187. package/types/components/systems/scroll-anchors/UluScrollAnchorsNav.vue.d.ts +15 -0
  188. package/types/components/systems/scroll-anchors/UluScrollAnchorsNav.vue.d.ts.map +1 -0
  189. package/types/components/systems/scroll-anchors/UluScrollAnchorsNavAnimated.vue.d.ts +32 -0
  190. package/types/components/systems/scroll-anchors/UluScrollAnchorsNavAnimated.vue.d.ts.map +1 -0
  191. package/types/components/systems/scroll-anchors/UluScrollAnchorsSection.vue.d.ts +50 -0
  192. package/types/components/systems/scroll-anchors/UluScrollAnchorsSection.vue.d.ts.map +1 -0
  193. package/types/components/systems/scroll-anchors/symbols.d.ts +3 -3
  194. package/types/components/systems/scroll-anchors/symbols.d.ts.map +1 -1
  195. package/types/components/systems/skeleton/UluShowSkeleton.vue.d.ts +16 -0
  196. package/types/components/systems/skeleton/UluShowSkeleton.vue.d.ts.map +1 -0
  197. package/types/components/systems/skeleton/UluSkeletonContent.vue.d.ts +9 -0
  198. package/types/components/systems/skeleton/UluSkeletonContent.vue.d.ts.map +1 -0
  199. package/types/components/systems/skeleton/UluSkeletonMedia.vue.d.ts +3 -0
  200. package/types/components/systems/skeleton/UluSkeletonMedia.vue.d.ts.map +1 -0
  201. package/types/components/systems/skeleton/UluSkeletonText.vue.d.ts +13 -0
  202. package/types/components/systems/skeleton/UluSkeletonText.vue.d.ts.map +1 -0
  203. package/types/components/systems/slider/UluImageSlideShow.vue.d.ts +130 -0
  204. package/types/components/systems/slider/UluImageSlideShow.vue.d.ts.map +1 -0
  205. package/types/components/systems/slider/UluSlideShow.vue.d.ts +205 -0
  206. package/types/components/systems/slider/UluSlideShow.vue.d.ts.map +1 -0
  207. package/types/components/systems/slider/UluSlideShowSlide.vue.d.ts +17 -0
  208. package/types/components/systems/slider/UluSlideShowSlide.vue.d.ts.map +1 -0
  209. package/types/components/systems/table-sticky/UluTableSticky.vue.d.ts +455 -0
  210. package/types/components/systems/table-sticky/UluTableSticky.vue.d.ts.map +1 -0
  211. package/types/components/systems/table-sticky/UluTableStickyRows.vue.d.ts +34 -0
  212. package/types/components/systems/table-sticky/UluTableStickyRows.vue.d.ts.map +1 -0
  213. package/types/components/systems/table-sticky/UluTableStickyTable.vue.d.ts +151 -0
  214. package/types/components/systems/table-sticky/UluTableStickyTable.vue.d.ts.map +1 -0
  215. package/types/components/utils/UluCondText.vue.d.ts +29 -0
  216. package/types/components/utils/UluCondText.vue.d.ts.map +1 -0
  217. package/types/components/utils/UluEmpty.vue.d.ts +3 -0
  218. package/types/components/utils/UluEmpty.vue.d.ts.map +1 -0
  219. package/types/components/utils/UluEmptyView.vue.d.ts +3 -0
  220. package/types/components/utils/UluEmptyView.vue.d.ts.map +1 -0
  221. package/types/components/utils/UluPlaceholderImage.vue.d.ts +61 -0
  222. package/types/components/utils/UluPlaceholderImage.vue.d.ts.map +1 -0
  223. package/types/components/utils/UluPlaceholderText.vue.d.ts +24 -0
  224. package/types/components/utils/UluPlaceholderText.vue.d.ts.map +1 -0
  225. package/types/components/utils/UluRouteAnnouncer.vue.d.ts +63 -0
  226. package/types/components/utils/UluRouteAnnouncer.vue.d.ts.map +1 -0
  227. package/types/components/visualizations/UluAnimateNumber.vue.d.ts +16 -0
  228. package/types/components/visualizations/UluAnimateNumber.vue.d.ts.map +1 -0
  229. package/types/components/visualizations/UluProgressBar.vue.d.ts +66 -0
  230. package/types/components/visualizations/UluProgressBar.vue.d.ts.map +1 -0
  231. package/types/components/visualizations/UluProgressCircle.vue.d.ts +48 -0
  232. package/types/components/visualizations/UluProgressCircle.vue.d.ts.map +1 -0
  233. package/types/composables/index.d.ts +2 -0
  234. package/types/composables/useBreakpointManager.d.ts +1 -1
  235. package/types/composables/useBreakpointManager.d.ts.map +1 -1
  236. package/types/composables/useDocumentTitle.d.ts +22 -0
  237. package/types/composables/useDocumentTitle.d.ts.map +1 -0
  238. package/types/composables/useIcon.d.ts +1 -1
  239. package/types/composables/useIcon.d.ts.map +1 -1
  240. package/types/composables/useModifiers.d.ts +1 -1
  241. package/types/composables/useModifiers.d.ts.map +1 -1
  242. package/types/composables/usePageTitle.d.ts +19 -0
  243. package/types/composables/usePageTitle.d.ts.map +1 -0
  244. package/types/composables/usePagination.d.ts +25 -0
  245. package/types/composables/usePagination.d.ts.map +1 -0
  246. package/types/composables/useWindowResize.d.ts +1 -1
  247. package/types/composables/useWindowResize.d.ts.map +1 -1
  248. package/types/index.d.ts +1 -0
  249. package/types/plugins/core/index.d.ts.map +1 -1
  250. package/types/plugins/modals/UluModalsDisplay.vue.d.ts +14 -0
  251. package/types/plugins/modals/UluModalsDisplay.vue.d.ts.map +1 -0
  252. package/types/plugins/modals/api.d.ts +7 -4
  253. package/types/plugins/modals/api.d.ts.map +1 -1
  254. package/types/plugins/popovers/UluPopover.vue.d.ts +54 -0
  255. package/types/plugins/popovers/UluPopover.vue.d.ts.map +1 -0
  256. package/types/plugins/popovers/UluTooltipDisplay.vue.d.ts +3 -0
  257. package/types/plugins/popovers/UluTooltipDisplay.vue.d.ts.map +1 -0
  258. package/types/plugins/popovers/UluTooltipPopover.vue.d.ts +3 -0
  259. package/types/plugins/popovers/UluTooltipPopover.vue.d.ts.map +1 -0
  260. package/types/plugins/popovers/defaults.d.ts +2 -2
  261. package/types/plugins/popovers/defaults.d.ts.map +1 -1
  262. package/types/plugins/popovers/manager.d.ts +50 -6
  263. package/types/plugins/popovers/manager.d.ts.map +1 -1
  264. package/types/plugins/popovers/useFollow.d.ts +4 -4
  265. package/types/plugins/popovers/useFollow.d.ts.map +1 -1
  266. package/types/plugins/toast/UluToast.vue.d.ts +52 -0
  267. package/types/plugins/toast/UluToast.vue.d.ts.map +1 -0
  268. package/types/plugins/toast/UluToastDisplay.vue.d.ts +13 -0
  269. package/types/plugins/toast/UluToastDisplay.vue.d.ts.map +1 -0
  270. package/types/plugins/toast/defaults.d.ts +39 -2
  271. package/types/plugins/toast/store.d.ts +65 -2
  272. package/types/plugins/toast/store.d.ts.map +1 -1
  273. package/types/utils/dom.d.ts +2 -1
  274. package/types/utils/dom.d.ts.map +1 -1
  275. package/types/utils/index.d.ts +3 -0
  276. package/types/utils/index.d.ts.map +1 -0
  277. package/types/utils/router.d.ts +144 -0
  278. package/types/utils/router.d.ts.map +1 -0
  279. package/dist/index-D3Uc6T5M.js +0 -6469
  280. package/lib/components/collapsible/UluCollapsibleRegion.vue +0 -278
  281. package/lib/components/forms/UluCheckboxMenu.vue +0 -36
  282. package/lib/components/systems/facets/UluFacets.vue +0 -380
  283. package/lib/components/systems/skeleton/UluSkeletonTextInline.vue +0 -9
  284. package/lib/components/visualizations/UluProgressDonut.vue +0 -97
  285. package/lib/utils/placeholder.js +0 -6
@@ -0,0 +1,90 @@
1
+ <template>
2
+ <div
3
+ class="facets-sidebar"
4
+ :class="{ 'facets-sidebar--filters-hidden' : isMobile }"
5
+ >
6
+ <div class="facets-sidebar__header">
7
+ <slot name="header"></slot>
8
+ </div>
9
+
10
+ <div v-show="isMobile" class="facets-sidebar__mobile-controls">
11
+ <button :class="classes.mobileButton" @click="showMobileFilters = true">
12
+ {{ mobileButtonText }}
13
+ </button>
14
+ </div>
15
+
16
+ <div class="facets-sidebar__body">
17
+ <!-- Desktop container for the sidebar -->
18
+ <div v-show="!isMobile" class="facets-sidebar__sidebar" ref="desktopTarget"></div>
19
+
20
+ <div class="facets-sidebar__main">
21
+ <slot name="main"></slot>
22
+ </div>
23
+ </div>
24
+
25
+ <UluModal
26
+ v-if="isMobile"
27
+ v-model="showMobileFilters"
28
+ position="right"
29
+ title="Filters & Sort"
30
+ allowResize
31
+ >
32
+ <!-- Mobile container for the sidebar -->
33
+ <div class="facets-sidebar__sidebar" ref="mobileTarget"></div>
34
+ </UluModal>
35
+
36
+ <teleport :to="teleportTarget" v-if="teleportTarget">
37
+ <slot name="sidebar"></slot>
38
+ </teleport>
39
+ </div>
40
+ </template>
41
+
42
+ <script setup>
43
+ import { ref, inject, computed } from 'vue';
44
+ import UluModal from '../../collapsible/UluModal.vue';
45
+
46
+ defineProps({
47
+ mobileButtonText: {
48
+ type: String,
49
+ default: "Filters & Sort"
50
+ },
51
+ /**
52
+ * Classes for elements. See UluCollapsible for all available class keys (toggle, content, etc).
53
+ * The 'icon' key is also available for the icon span.
54
+ * - Any valid class binding value per element
55
+ */
56
+ classes: {
57
+ type: Object,
58
+ default: () => ({
59
+ mobileButton: 'button'
60
+ })
61
+ }
62
+ })
63
+
64
+ const showMobileFilters = ref(false);
65
+ const isMobile = inject("uluIsMobile");
66
+
67
+ const desktopTarget = ref(null);
68
+ const mobileTarget = ref(null);
69
+
70
+ const teleportTarget = computed(() => {
71
+ if (isMobile.value) {
72
+ return mobileTarget.value;
73
+ } else {
74
+ return desktopTarget.value;
75
+ }
76
+ });
77
+ </script>
78
+
79
+ <style lang="scss">
80
+ .facets-sidebar__body {
81
+ display: grid;
82
+ grid-template-columns: 250px 1fr;
83
+ gap: 2rem;
84
+ }
85
+ .facets-sidebar--filters-hidden {
86
+ .facets-sidebar__body {
87
+ grid-template-columns: 1fr;
88
+ }
89
+ }
90
+ </style>
@@ -0,0 +1,45 @@
1
+ <template>
2
+ <div class="facets-sort" :class="classes.sortForm">
3
+ <label
4
+ :for="sortId"
5
+ :class="classes.sortFormLabel"
6
+ >
7
+ <slot>Sort:</slot>
8
+ </label>
9
+ <select
10
+ :value="modelValue"
11
+ @change="emit('update:modelValue', $event.target.value)"
12
+ :id="sortId"
13
+ :class="classes.sortFormSelect"
14
+ >
15
+ <option v-for="(item, key) in sortTypes" :value="key" :key="key">
16
+ {{ item.text }}
17
+ </option>
18
+ </select>
19
+ </div>
20
+ </template>
21
+
22
+ <script setup>
23
+ import { ref } from 'vue';
24
+
25
+ let idCounter = 0;
26
+
27
+ defineProps({
28
+ classes: {
29
+ type: Object,
30
+ default: () => ({})
31
+ },
32
+ sortTypes: {
33
+ type: Object,
34
+ default: () => ({})
35
+ },
36
+ modelValue: {
37
+ type: String,
38
+ default: ''
39
+ }
40
+ });
41
+
42
+ const emit = defineEmits(['update:modelValue']);
43
+
44
+ const sortId = ref(`ulu-facet-sort-${++idCounter}`);
45
+ </script>
@@ -54,9 +54,8 @@ $config: (
54
54
  $prefix: selector.class("facets");
55
55
 
56
56
  #{ $prefix }__body {
57
- .FacetView__body {
58
- display: flex
59
- ;
57
+ .FacetView__body {
58
+ display: flex;
60
59
  }
61
60
  }
62
61
  }
@@ -0,0 +1,40 @@
1
+ export const initialMockFacets = [
2
+ {
3
+ name: 'Category',
4
+ uid: 'category',
5
+ open: true,
6
+ children: [
7
+ { uid: 'cat1', label: 'Design' },
8
+ { uid: 'cat2', label: 'Development' },
9
+ { uid: 'cat3', label: 'Marketing' },
10
+ { uid: 'cat4', label: 'Business' },
11
+ { uid: 'cat5', label: 'Lifestyle' },
12
+ { uid: 'cat6', label: 'Technology' },
13
+ ]
14
+ },
15
+ {
16
+ name: 'Author',
17
+ uid: 'author',
18
+ open: true,
19
+ children: [
20
+ { uid: 'jane-doe', label: 'Jane Doe' },
21
+ { uid: 'john-smith', label: 'John Smith' },
22
+ { uid: 'peter-jones', label: 'Peter Jones' },
23
+ ]
24
+ }
25
+ ];
26
+
27
+ export const mockItems = [
28
+ { id: 1, title: 'The Art of UI Design', description: 'A deep dive into creating beautiful user interfaces.', category: ['cat1', 'cat2'], author: ['jane-doe'], date: new Date(2023, 5, 15) },
29
+ { id: 2, title: 'Vue.js for Beginners', description: 'Getting started with the popular JavaScript framework.', category: ['cat2', 'cat6'], author: ['john-smith'], date: new Date(2023, 8, 22) },
30
+ { id: 3, title: 'Content Marketing Strategies', description: 'How to attract and retain customers with great content.', category: ['cat3'], author: ['peter-jones'], date: new Date(2022, 11, 10) },
31
+ { id: 4, title: 'Startup Funding 101', description: 'A guide to raising capital for your new venture.', category: ['cat4'], author: ['jane-doe'], date: new Date(2024, 1, 5) },
32
+ { id: 5, title: 'Minimalist Living', description: 'Declutter your life and find more happiness.', category: ['cat5'], author: ['john-smith'], date: new Date(2023, 3, 30) },
33
+ { id: 6, title: 'The Future of AI', description: 'Exploring the impact of artificial intelligence on society.', category: ['cat6'], author: ['peter-jones'], date: new Date(2024, 0, 1) },
34
+ { id: 7, title: 'Advanced CSS Techniques', description: 'Take your styling skills to the next level.', category: ['cat1', 'cat2'], author: ['jane-doe'], date: new Date(2023, 10, 18) },
35
+ { id: 8, title: 'Building a Scalable API', description: 'Best practices for designing and implementing APIs.', category: ['cat2', 'cat6'], author: ['john-smith'], date: new Date(2023, 7, 3) },
36
+ { id: 9, title: 'Social Media for Business', description: 'Leveraging social platforms for growth.', category: ['cat3'], author: ['peter-jones'], date: new Date(2022, 9, 14) },
37
+ { id: 10, title: 'Negotiation and Deal Making', description: 'Master the art of getting what you want.', category: ['cat4'], author: ['jane-doe'], date: new Date(2023, 6, 25) },
38
+ { id: 11, title: 'Healthy Eating Habits', description: 'A guide to a balanced and nutritious diet.', category: ['cat5'], author: ['john-smith'], date: new Date(2024, 2, 12) },
39
+ { id: 12, title: 'Quantum Computing Explained', description: 'A simple introduction to a complex topic.', category: ['cat6'], author: ['peter-jones'], date: new Date(2023, 9, 9) },
40
+ ];
@@ -0,0 +1,394 @@
1
+ import { ref, computed, watch } from 'vue';
2
+ import Fuse from 'fuse.js';
3
+
4
+ /**
5
+ * Helper function to create a union of multiple Sets.
6
+ * @param {Array<Set>} sets - An array of sets to unify.
7
+ * @returns {Set} A new set containing all unique items from the input sets.
8
+ */
9
+ function unionSets(sets) {
10
+ const union = new Set();
11
+ for (const set of sets) {
12
+ for (const item of set) {
13
+ union.add(item);
14
+ }
15
+ }
16
+ return union;
17
+ }
18
+
19
+ /**
20
+ * Helper function to create an intersection of multiple Sets.
21
+ * @param {Array<Set>} sets - An array of sets to intersect.
22
+ * @returns {Set} A new set containing only the items present in all input sets.
23
+ */
24
+ function intersectSets(sets) {
25
+ if (!sets || sets.length === 0) return new Set();
26
+ // Start with a copy of the first set, which is an optimization if it's the smallest.
27
+ // For better performance, sort sets by size and start with the smallest.
28
+ const sortedSets = sets.sort((a, b) => a.size - b.size);
29
+ const intersection = new Set(sortedSets[0]);
30
+ for (let i = 1; i < sortedSets.length; i++) {
31
+ for (const item of intersection) {
32
+ if (!sortedSets[i].has(item)) {
33
+ intersection.delete(item);
34
+ }
35
+ }
36
+ // If intersection becomes empty, no need to continue.
37
+ if (intersection.size === 0) break;
38
+ }
39
+ return intersection;
40
+ }
41
+
42
+ /**
43
+ * Calculates the final set of item indices based on selected facets using the pre-built index.
44
+ * @param {Array<Object>} selected - The array of selected facet groups.
45
+ * @param {Map<String, Set>} index - The inverted index.
46
+ * @param {Set<number>} allItemsSet - A set of all possible item indices.
47
+ * @returns {Set} A set of indices for the items that match the filters.
48
+ */
49
+ function getFilteredSetFromIndex(selected, index, allItemsSet) {
50
+ if (!selected || selected.length === 0) {
51
+ return allItemsSet;
52
+ }
53
+
54
+ const groupSets = selected.map(group => {
55
+ const childSets = group.children.map(child => {
56
+ const key = `${group.uid}:${child.uid}`;
57
+ return index.get(key) || new Set();
58
+ });
59
+
60
+ // For 'all' (AND), intersect the sets within the group.
61
+ if (group.match === 'all') {
62
+ return intersectSets(childSets);
63
+ }
64
+ // For 'some' (OR), union the sets within the group.
65
+ return unionSets(childSets);
66
+ });
67
+
68
+ // Intersect the results from each group.
69
+ return intersectSets(groupSets);
70
+ }
71
+
72
+ /**
73
+ * Generates facet groups and their possible values from a list of items.
74
+ * @param {Array<Object>} allItems - The full list of items.
75
+ * @param {Array<Object>} facetFields - Configuration for which fields to create facets from.
76
+ * @returns {Array<Object>} The generated facet structure.
77
+ */
78
+ function generateInitialFacets(allItems, facetFields) {
79
+ if (!facetFields || !Array.isArray(facetFields)) return [];
80
+ return facetFields.map(group => {
81
+ const allValues = new Set();
82
+ const getValue = group.getValue || (item => item[group.uid]);
83
+
84
+ allItems.forEach(item => {
85
+ const value = getValue(item);
86
+ if (Array.isArray(value)) {
87
+ value.forEach(v => v && allValues.add(v));
88
+ } else if (value) {
89
+ allValues.add(value);
90
+ }
91
+ });
92
+
93
+ const getLabel = group.getLabel || (value => value);
94
+
95
+ const children = [...allValues].map(value => ({
96
+ uid: value,
97
+ label: getLabel(value),
98
+ selected: false
99
+ }));
100
+
101
+ // Sort by label, alphabetically
102
+ children.sort((a, b) => String(a.label).localeCompare(String(b.label)));
103
+
104
+ return {
105
+ ...group,
106
+ children
107
+ };
108
+ });
109
+ }
110
+
111
+
112
+ /**
113
+ * A composable for handling client-side faceted search, filtering, and sorting.
114
+ * @param {import('vue').Ref<Array<Object>>} allItems - A Vue ref containing the full list of items to be processed.
115
+ * @param {Object} options - Configuration options for the composable.
116
+ * @param {Array} [options.initialFacets] - The initial configuration for the facets. Can be generated automatically if `facetFields` is provided.
117
+ * @param {Array} [options.facetFields] - A simpler configuration to automatically generate facets from items. Each item can have `uid`, `name`, `open`, `getValue` and `getLabel`.
118
+ * @param {String} [options.initialSearchValue=''] - The initial value for the search input.
119
+ * @param {String} [options.initialSortType='az'] - The initial sort type.
120
+ * @param {Boolean} [options.noDefaultSorts=false] - If true, the default 'A-Z' and 'Z-A' sorts will not be included.
121
+ * @param {Object} [options.extraSortTypes={}] - Additional sort types to be merged with the default ones.
122
+ * @param {Object} [options.searchOptions={}] - Configuration options for Fuse.js.
123
+ * @param {Function} [options.getItemFacet] - A function to retrieve facet information from an item. Should always return an array of values.
124
+ * @param {Function} [options.getSortValue] - A function to get the value to sort by from an item.
125
+ * @param {String} [options.countMode='none'] - The mode for calculating facet counts. Can be 'none', 'simple', or 'intuitive'.
126
+ */
127
+ export function useFacets(allItems, options = {}) {
128
+ const defaultGetItemFacet = (item, uid) => {
129
+ const value = item[uid];
130
+ if (value === null || typeof value === 'undefined') return [];
131
+ return Array.isArray(value) ? value : [value];
132
+ };
133
+
134
+ const {
135
+ initialFacets,
136
+ facetFields,
137
+ initialSearchValue = '',
138
+ initialSortType = 'az',
139
+ noDefaultSorts = false,
140
+ extraSortTypes = {},
141
+ searchOptions: initialSearchOptions = {},
142
+ getItemFacet = defaultGetItemFacet,
143
+ getSortValue = item => (item.title || item.label || ""),
144
+ countMode = 'none' // 'none', 'simple', 'intuitive'
145
+ } = options;
146
+
147
+ const sortAlpha = items => {
148
+ return items.sort((a, b) => {
149
+ const va = getSortValue(a);
150
+ const vb = getSortValue(b);
151
+ if (va && vb) {
152
+ return String(va).localeCompare(String(vb));
153
+ } else {
154
+ return va ? -1 : vb ? 1 : 0;
155
+ }
156
+ });
157
+ }
158
+ const defaultSorts = {
159
+ az: { text: "A-Z", sort: sortAlpha },
160
+ za: { text: "Z-A", sort: items => sortAlpha(items).reverse() },
161
+ };
162
+
163
+ // --- Helpers ---
164
+ function createFacets(initial) {
165
+ return (initial || []).map(group => ({
166
+ ...group,
167
+ open: group.open || false,
168
+ children: group.children.map(facet => ({
169
+ ...facet,
170
+ selected: facet.selected || false
171
+ })),
172
+ selectedCount: 0
173
+ }));
174
+ }
175
+
176
+ // --- State ---
177
+ const facets = ref([]);
178
+ const searchValue = ref(initialSearchValue);
179
+ const selectedSort = ref(initialSortType);
180
+
181
+ // --- Computed ---
182
+ const generatedFacets = computed(() => {
183
+ if (!facetFields || !allItems.value?.length) return null;
184
+ return generateInitialFacets(allItems.value, facetFields);
185
+ });
186
+
187
+ const sortTypes = computed(() => ({
188
+ ...(noDefaultSorts ? {} : defaultSorts),
189
+ ...extraSortTypes
190
+ }));
191
+
192
+ const facetIndex = computed(() => {
193
+ const index = new Map();
194
+ // Depend on searchedItems to re-build when search changes.
195
+ const items = searchedItems.value;
196
+ if (!items || !facetFields) return index;
197
+
198
+ // Create a map of getters for efficiency inside the loop.
199
+ const getters = new Map(facetFields.map(group => {
200
+ const getValue = group.getValue || (item => item[group.uid]);
201
+ return [group.uid, getValue];
202
+ }));
203
+
204
+ for (let i = 0; i < items.length; i++) {
205
+ const item = items[i];
206
+ for (const group of facetFields) {
207
+ const getValue = getters.get(group.uid);
208
+ const value = getValue(item);
209
+ const values = Array.isArray(value) ? value : (value ? [value] : []);
210
+
211
+ for (const v of values) {
212
+ const key = `${group.uid}:${v}`;
213
+ if (!index.has(key)) {
214
+ index.set(key, new Set());
215
+ }
216
+ index.get(key).add(i);
217
+ }
218
+ }
219
+ }
220
+ return index;
221
+ });
222
+
223
+ const searchOptions = computed(() => ({
224
+ shouldSort: true,
225
+ keys: ["title", "label", "description", "author"],
226
+ ...initialSearchOptions
227
+ }));
228
+
229
+ const searchedItems = computed(() => {
230
+ if (!searchValue.value?.length) {
231
+ return allItems.value;
232
+ }
233
+ const fuse = new Fuse(allItems.value, searchOptions.value);
234
+ return fuse.search(searchValue.value).map(result => result.item);
235
+ });
236
+
237
+ const selectedFacets = computed(() => {
238
+ const selected = [];
239
+ facets.value.forEach((group) => {
240
+ const selectedChildren = group.children.filter(child => child.selected);
241
+ if (selectedChildren.length > 0) {
242
+ selected.push({ ...group, children: selectedChildren });
243
+ }
244
+ });
245
+ return selected;
246
+ });
247
+
248
+ const filteredItems = computed(() => {
249
+ if (!selectedFacets.value.length) {
250
+ return searchedItems.value;
251
+ }
252
+ const index = facetIndex.value;
253
+ // This check is important because the index might not be ready on the first render.
254
+ if (index.size === 0 && searchedItems.value.length > 0 && facetFields?.length > 0) {
255
+ return [];
256
+ }
257
+ const allItemsSet = new Set(searchedItems.value.map((_, i) => i));
258
+ const filteredIndexSet = getFilteredSetFromIndex(selectedFacets.value, index, allItemsSet);
259
+
260
+ const result = [];
261
+ // Using a direct loop for performance.
262
+ for (const i of filteredIndexSet) {
263
+ result.push(searchedItems.value[i]);
264
+ }
265
+ return result;
266
+ });
267
+
268
+ const displayItems = computed(() => {
269
+ const sortFn = sortTypes.value[selectedSort.value]?.sort;
270
+ if (typeof sortFn !== 'function') {
271
+ return filteredItems.value;
272
+ }
273
+ return sortFn([...filteredItems.value]);
274
+ });
275
+
276
+ // --- Methods ---
277
+ function clearFilters() {
278
+ facets.value.forEach(group => {
279
+ if (group.children) {
280
+ group.children.forEach(child => child.selected = false);
281
+ }
282
+ group.selectedCount = 0;
283
+ });
284
+ }
285
+
286
+ function handleFacetChange({ groupUid, facetUid, selected }) {
287
+ const group = facets.value.find(g => g.uid === groupUid);
288
+ if (group) {
289
+ if (!group.multiple && selected) {
290
+ group.children.forEach(f => {
291
+ if (f.uid !== facetUid) {
292
+ f.selected = false;
293
+ }
294
+ });
295
+ }
296
+ const facet = group.children.find(f => f.uid === facetUid);
297
+ if (facet) {
298
+ facet.selected = selected;
299
+ }
300
+ // Recalculate selectedCount for the group
301
+ group.selectedCount = group.children.filter(c => c.selected).length;
302
+ }
303
+ }
304
+
305
+ // --- Watchers ---
306
+ watch(generatedFacets, (newGeneratedFacets) => {
307
+ const newFacets = createFacets(initialFacets || newGeneratedFacets);
308
+ // Calculate initial counts
309
+ newFacets.forEach(group => {
310
+ group.selectedCount = group.children.filter(c => c.selected).length;
311
+ });
312
+ facets.value = newFacets;
313
+ }, { immediate: true });
314
+
315
+ watch([selectedFacets, searchedItems], ([currentSelected, currentSearchedItems], [prevSelected, prevSearchedItems]) => {
316
+ if (countMode === 'none' || !facets.value.length) return;
317
+
318
+ // A simple optimization to prevent re-calculating counts if the actual data hasn't changed.
319
+ if (currentSelected === prevSelected && currentSearchedItems === prevSearchedItems) return;
320
+
321
+ if (countMode === 'simple') {
322
+ facets.value.forEach(group => {
323
+ const otherSelected = currentSelected.filter(g => g.uid !== group.uid);
324
+ const itemsToCount = getFilteredItems(currentSearchedItems, otherSelected);
325
+ group.children.forEach(child => {
326
+ child.count = itemsToCount.filter(item => {
327
+ const itemValues = getItemFacet(item, group.uid);
328
+ return itemValues.includes(child.uid);
329
+ }).length;
330
+ });
331
+ });
332
+ } else if (countMode === 'intuitive') {
333
+ const index = facetIndex.value;
334
+ if (index.size === 0 && searchedItems.value.length > 0 && facetFields?.length > 0) {
335
+ // Index might not be ready yet.
336
+ return;
337
+ }
338
+ const allItemsSet = new Set(searchedItems.value.map((_, i) => i));
339
+ const currentFilteredSet = getFilteredSetFromIndex(currentSelected, index, allItemsSet);
340
+
341
+ facets.value.forEach(group => {
342
+ group.children.forEach(child => {
343
+ const key = `${group.uid}:${child.uid}`;
344
+ const childSet = index.get(key) || new Set();
345
+
346
+ if (child.selected) {
347
+ // --- Logic for already-selected facets (now performant) ---
348
+ if (group.multiple) {
349
+ // This is the intersection of currently filtered items and items with this facet value.
350
+ const intersection = intersectSets([currentFilteredSet, childSet]);
351
+ child.count = intersection.size;
352
+ } else {
353
+ // For single-select, the count is just the total number of filtered items.
354
+ child.count = currentFilteredSet.size;
355
+ }
356
+ } else {
357
+ // --- Logic for un-selected facets (now without deep clone) ---
358
+ const tempSelected = [];
359
+ for (const g of currentSelected) {
360
+ tempSelected.push({ ...g, children: [...g.children] });
361
+ }
362
+
363
+ let groupInTemp = tempSelected.find(g => g.uid === group.uid);
364
+
365
+ if (!groupInTemp) {
366
+ groupInTemp = { ...group, children: [] };
367
+ tempSelected.push(groupInTemp);
368
+ }
369
+
370
+ if (group.multiple) {
371
+ groupInTemp.children.push(child);
372
+ } else {
373
+ groupInTemp.children = [child];
374
+ }
375
+
376
+ const finalSet = getFilteredSetFromIndex(tempSelected, index, allItemsSet);
377
+ child.count = finalSet.size;
378
+ }
379
+ });
380
+ });
381
+ }
382
+ }, { deep: true, immediate: true });
383
+
384
+ return {
385
+ facets,
386
+ searchValue,
387
+ selectedSort,
388
+ sortTypes,
389
+ displayItems,
390
+ selectedFacets,
391
+ clearFilters,
392
+ handleFacetChange
393
+ };
394
+ }
@@ -1,17 +1,29 @@
1
- export { default as UluFacets } from './facets/UluFacets.vue';
1
+ export { useFacets } from './facets/useFacets.js';
2
+ export { default as UluFacetsActiveFilters } from './facets/UluFacetsActiveFilters.vue';
3
+ export { default as UluFacetsFilterLists } from './facets/UluFacetsFilterLists.vue';
4
+ export { default as UluFacetsFilterPopovers } from './facets/UluFacetsFilterPopovers.vue';
5
+ export { default as UluFacetsFilterSelects } from './facets/UluFacetsFilterSelects.vue';
6
+ export { default as UluFacetsHeaderLayout } from './facets/UluFacetsHeaderLayout.vue';
7
+ export { default as UluFacetsResults } from './facets/UluFacetsResults.vue';
2
8
  export { default as UluFacetsSearch } from './facets/UluFacetsSearch.vue';
9
+ export { default as UluFacetsSidebarLayout } from './facets/UluFacetsSidebarLayout.vue';
10
+ export { default as UluFacetsSort } from './facets/UluFacetsSort.vue';
3
11
  export { default as UluFacetsList } from './facets/UluFacetsList.vue';
12
+
4
13
  export { default as UluScrollAnchors } from './scroll-anchors/UluScrollAnchors.vue';
5
14
  export { default as UluScrollAnchorsNav } from './scroll-anchors/UluScrollAnchorsNav.vue';
6
15
  export { default as UluScrollAnchorsNavAnimated } from './scroll-anchors/UluScrollAnchorsNavAnimated.vue';
7
16
  export { default as UluScrollAnchorsSection } from './scroll-anchors/UluScrollAnchorsSection.vue';
17
+
8
18
  export { default as UluShowSkeleton } from './skeleton/UluShowSkeleton.vue';
9
19
  export { default as UluSkeletonContent } from './skeleton/UluSkeletonContent.vue';
10
20
  export { default as UluSkeletonMedia } from './skeleton/UluSkeletonMedia.vue';
11
- export { default as UluSkeletonTextInline } from './skeleton/UluSkeletonTextInline.vue';
21
+ export { default as UluSkeletonText } from './skeleton/UluSkeletonText.vue';
22
+
12
23
  export { default as UluImageSlideShow } from './slider/UluImageSlideShow.vue';
13
24
  export { default as UluSlideShow } from './slider/UluSlideShow.vue';
14
25
  export { default as UluSlideShowSlide } from './slider/UluSlideShowSlide.vue';
26
+
15
27
  export { default as UluTableSticky } from './table-sticky/UluTableSticky.vue';
16
28
  export { default as UluTableStickyRows } from './table-sticky/UluTableStickyRows.vue';
17
29
  export { default as UluTableStickyTable } from './table-sticky/UluTableStickyTable.vue';
@@ -10,6 +10,7 @@
10
10
  import { SECTIONS, REGISTER, UNREGISTER } from "./symbols.js";
11
11
  export default {
12
12
  name: "ScrollAnchors",
13
+ emits: ["section-change"],
13
14
  props: {
14
15
  firstItemActive: Boolean,
15
16
  /**
@@ -97,7 +98,7 @@
97
98
  } else if (lastExiting && section.active) {
98
99
  removeActive();
99
100
  }
100
- this.$emit("sectionChange", {
101
+ this.$emit("section-change", {
101
102
  section,
102
103
  sections,
103
104
  active: isIntersecting
@@ -1,13 +1,14 @@
1
1
  <template>
2
2
  <slot v-if="!when"/>
3
- <SkeletonTextInline class="skeleton" v-else/>
3
+ <UluSkeletonText v-else inline/>
4
4
  </template>
5
5
 
6
- <script>
7
- export default {
8
- name: "ShowSkeleton",
9
- props: {
10
- when: Boolean,
11
- },
12
- };
6
+ <script setup>
7
+ import UluSkeletonText from "./UluSkeletonText.vue";
8
+ defineProps({
9
+ /**
10
+ * If true will show whatever is passed to slot, else skeleton text
11
+ */
12
+ when: Boolean,
13
+ });
13
14
  </script>