@ulu/frontend-vue 0.6.15 → 0.6.17
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.
- package/dist/components/collapsible/UluModal.vue.js +1 -1
- package/dist/index.js +236 -232
- package/dist/mcp-data.json +169 -169
- package/dist/plugins/index.d.ts +1 -1
- package/dist/plugins/toast/index.d.ts +3 -1
- package/dist/plugins/toast/index.d.ts.map +1 -1
- package/dist/plugins/toast/index.js +7 -5
- package/lib/components/collapsible/UluModal.vue +1 -1
- package/lib/plugins/index.js +1 -1
- package/lib/plugins/toast/index.js +1 -1
- package/package.json +1 -1
package/dist/mcp-data.json
CHANGED
|
@@ -20,62 +20,6 @@
|
|
|
20
20
|
}
|
|
21
21
|
],
|
|
22
22
|
"useDocumentTitle": [],
|
|
23
|
-
"toast": [
|
|
24
|
-
{
|
|
25
|
-
"title": "Default",
|
|
26
|
-
"description": "Default variation",
|
|
27
|
-
"code": "<toast>Content</toast>"
|
|
28
|
-
}
|
|
29
|
-
],
|
|
30
|
-
"useTooltipFollow": [
|
|
31
|
-
{
|
|
32
|
-
"title": "Default",
|
|
33
|
-
"description": "Default variation",
|
|
34
|
-
"code": "<useTooltipFollow>Content</useTooltipFollow>"
|
|
35
|
-
}
|
|
36
|
-
],
|
|
37
|
-
"useTooltip": [],
|
|
38
|
-
"tooltip": [
|
|
39
|
-
{
|
|
40
|
-
"title": "Basic",
|
|
41
|
-
"description": "Basic variation",
|
|
42
|
-
"code": "<tooltip>This is a basic tooltip!</tooltip>"
|
|
43
|
-
}
|
|
44
|
-
],
|
|
45
|
-
"UluPopover": [],
|
|
46
|
-
"useModals": [],
|
|
47
|
-
"modals": [
|
|
48
|
-
{
|
|
49
|
-
"title": "GlobalApiTest",
|
|
50
|
-
"description": "GlobalApiTest variation",
|
|
51
|
-
"code": "<modals>Content</modals>"
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
"title": "modals Example 1",
|
|
55
|
-
"description": "Code example extracted from markdown.",
|
|
56
|
-
"code": "<template>\n <UluModal>\n User setting modal…\n </UluModal>\n</template>"
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
"title": "modals Example 2",
|
|
60
|
-
"description": "Code example extracted from markdown.",
|
|
61
|
-
"code": "import { defineAsyncComponent } from \"vue\";\n\nexport default [\n {\n name: \"settings\",\n component: defineAsyncComponent(() => import('./components/modals/UserSettingsModal.vue')),\n }\n]"
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
"title": "modals Example 3",
|
|
65
|
-
"description": "Code example extracted from markdown.",
|
|
66
|
-
"code": "import UluModals from \"@ulu/frontend-vue/plugins/modals/index.js\";\nimport modals from \"./src/modals.js\";\n\n//...\n\napp.use(UluModals, { modals });"
|
|
67
|
-
},
|
|
68
|
-
{
|
|
69
|
-
"title": "modals Example 4",
|
|
70
|
-
"description": "Code example extracted from markdown.",
|
|
71
|
-
"code": "// Open a app-wide modal\nthis.$uluModals.open({ exampleProp: value });\n\n// Close app-wide modal \nthis.$uluModals.close();\n\n// Add modals after post-install\nthis.$uluModals.add({\n name: \"settings\",\n component: defineAsyncComponent(() => import('./components/modals/UserSettingsModal.vue')),\n});\n\n// Remove a modal from the registry\nthis.$uluModals.remove(\"settings\");\n\n// Get Modal from registry (not usually needed)\nconst settingsModal = this.$uluModals.get(\"settings\");\n// console.log(settingsModal.name) ==> \"settings\""
|
|
72
|
-
},
|
|
73
|
-
{
|
|
74
|
-
"title": "modals Example 5",
|
|
75
|
-
"description": "Code example extracted from markdown.",
|
|
76
|
-
"code": "<template>\n <button @click=\"showSettingsModal\">My Settings</button>\n</template>\n\n<script setup>\n import { useModals } from \"./useModals\";\n\n const modals = useModals();\n const showSettingsModal = () => {\n console.log(\"This is opening via uluModals composable\");\n modals.open(\"settings\");\n };\n</script>"
|
|
77
|
-
}
|
|
78
|
-
],
|
|
79
23
|
"UluProgressCircle": [],
|
|
80
24
|
"UluProgressBar": [],
|
|
81
25
|
"UluAnimateNumber": [],
|
|
@@ -119,6 +63,10 @@
|
|
|
119
63
|
"code": "<UluAction href=\"{...}\" download>Content</UluAction>"
|
|
120
64
|
}
|
|
121
65
|
],
|
|
66
|
+
"UluWhenBreakpoint": [],
|
|
67
|
+
"UluTitleRail": [],
|
|
68
|
+
"UluDataGrid": [],
|
|
69
|
+
"UluAdaptiveLayout": [],
|
|
122
70
|
"UluSkipLink": [
|
|
123
71
|
{
|
|
124
72
|
"title": "Default",
|
|
@@ -191,10 +139,6 @@
|
|
|
191
139
|
"code": "<UluBreadcrumb items=\"{...}\">Content</UluBreadcrumb>"
|
|
192
140
|
}
|
|
193
141
|
],
|
|
194
|
-
"UluWhenBreakpoint": [],
|
|
195
|
-
"UluTitleRail": [],
|
|
196
|
-
"UluDataGrid": [],
|
|
197
|
-
"UluAdaptiveLayout": [],
|
|
198
142
|
"UluSelectableMenu": [],
|
|
199
143
|
"UluSearchForm": [],
|
|
200
144
|
"UluFormTextarea": [],
|
|
@@ -211,34 +155,6 @@
|
|
|
211
155
|
"UluFormActions": [],
|
|
212
156
|
"UluForm": [],
|
|
213
157
|
"UluFileDisplay": [],
|
|
214
|
-
"UluTabGroup": [
|
|
215
|
-
{
|
|
216
|
-
"title": "Default",
|
|
217
|
-
"description": "Default variation",
|
|
218
|
-
"code": "<UluTabGroup>Content</UluTabGroup>"
|
|
219
|
-
},
|
|
220
|
-
{
|
|
221
|
-
"title": "Vertical",
|
|
222
|
-
"description": "Vertical variation",
|
|
223
|
-
"code": "<UluTabGroup vertical>Content</UluTabGroup>"
|
|
224
|
-
},
|
|
225
|
-
{
|
|
226
|
-
"title": "DefaultIndex",
|
|
227
|
-
"description": "DefaultIndex variation",
|
|
228
|
-
"code": "<UluTabGroup :defaultIndex=\"2\">Content</UluTabGroup>"
|
|
229
|
-
},
|
|
230
|
-
{
|
|
231
|
-
"title": "FullWidth",
|
|
232
|
-
"description": "FullWidth variation",
|
|
233
|
-
"code": "<UluTabGroup modifiers=\"{...}\">Content</UluTabGroup>"
|
|
234
|
-
}
|
|
235
|
-
],
|
|
236
|
-
"UluOverflowPopover": [],
|
|
237
|
-
"UluModal": [],
|
|
238
|
-
"UluDropdown": [],
|
|
239
|
-
"UluCollapsible": [],
|
|
240
|
-
"UluAccordionGroup": [],
|
|
241
|
-
"UluAccordion": [],
|
|
242
158
|
"UluTag": [],
|
|
243
159
|
"UluTable": [
|
|
244
160
|
{
|
|
@@ -462,6 +378,90 @@
|
|
|
462
378
|
}
|
|
463
379
|
],
|
|
464
380
|
"UluAlert": [],
|
|
381
|
+
"UluTabGroup": [
|
|
382
|
+
{
|
|
383
|
+
"title": "Default",
|
|
384
|
+
"description": "Default variation",
|
|
385
|
+
"code": "<UluTabGroup>Content</UluTabGroup>"
|
|
386
|
+
},
|
|
387
|
+
{
|
|
388
|
+
"title": "Vertical",
|
|
389
|
+
"description": "Vertical variation",
|
|
390
|
+
"code": "<UluTabGroup vertical>Content</UluTabGroup>"
|
|
391
|
+
},
|
|
392
|
+
{
|
|
393
|
+
"title": "DefaultIndex",
|
|
394
|
+
"description": "DefaultIndex variation",
|
|
395
|
+
"code": "<UluTabGroup :defaultIndex=\"2\">Content</UluTabGroup>"
|
|
396
|
+
},
|
|
397
|
+
{
|
|
398
|
+
"title": "FullWidth",
|
|
399
|
+
"description": "FullWidth variation",
|
|
400
|
+
"code": "<UluTabGroup modifiers=\"{...}\">Content</UluTabGroup>"
|
|
401
|
+
}
|
|
402
|
+
],
|
|
403
|
+
"UluOverflowPopover": [],
|
|
404
|
+
"UluModal": [],
|
|
405
|
+
"UluDropdown": [],
|
|
406
|
+
"UluCollapsible": [],
|
|
407
|
+
"UluAccordionGroup": [],
|
|
408
|
+
"UluAccordion": [],
|
|
409
|
+
"toast": [
|
|
410
|
+
{
|
|
411
|
+
"title": "Default",
|
|
412
|
+
"description": "Default variation",
|
|
413
|
+
"code": "<toast>Content</toast>"
|
|
414
|
+
}
|
|
415
|
+
],
|
|
416
|
+
"useModals": [],
|
|
417
|
+
"modals": [
|
|
418
|
+
{
|
|
419
|
+
"title": "GlobalApiTest",
|
|
420
|
+
"description": "GlobalApiTest variation",
|
|
421
|
+
"code": "<modals>Content</modals>"
|
|
422
|
+
},
|
|
423
|
+
{
|
|
424
|
+
"title": "modals Example 1",
|
|
425
|
+
"description": "Code example extracted from markdown.",
|
|
426
|
+
"code": "<template>\n <UluModal>\n User setting modal…\n </UluModal>\n</template>"
|
|
427
|
+
},
|
|
428
|
+
{
|
|
429
|
+
"title": "modals Example 2",
|
|
430
|
+
"description": "Code example extracted from markdown.",
|
|
431
|
+
"code": "import { defineAsyncComponent } from \"vue\";\n\nexport default [\n {\n name: \"settings\",\n component: defineAsyncComponent(() => import('./components/modals/UserSettingsModal.vue')),\n }\n]"
|
|
432
|
+
},
|
|
433
|
+
{
|
|
434
|
+
"title": "modals Example 3",
|
|
435
|
+
"description": "Code example extracted from markdown.",
|
|
436
|
+
"code": "import UluModals from \"@ulu/frontend-vue/plugins/modals/index.js\";\nimport modals from \"./src/modals.js\";\n\n//...\n\napp.use(UluModals, { modals });"
|
|
437
|
+
},
|
|
438
|
+
{
|
|
439
|
+
"title": "modals Example 4",
|
|
440
|
+
"description": "Code example extracted from markdown.",
|
|
441
|
+
"code": "// Open a app-wide modal\nthis.$uluModals.open({ exampleProp: value });\n\n// Close app-wide modal \nthis.$uluModals.close();\n\n// Add modals after post-install\nthis.$uluModals.add({\n name: \"settings\",\n component: defineAsyncComponent(() => import('./components/modals/UserSettingsModal.vue')),\n});\n\n// Remove a modal from the registry\nthis.$uluModals.remove(\"settings\");\n\n// Get Modal from registry (not usually needed)\nconst settingsModal = this.$uluModals.get(\"settings\");\n// console.log(settingsModal.name) ==> \"settings\""
|
|
442
|
+
},
|
|
443
|
+
{
|
|
444
|
+
"title": "modals Example 5",
|
|
445
|
+
"description": "Code example extracted from markdown.",
|
|
446
|
+
"code": "<template>\n <button @click=\"showSettingsModal\">My Settings</button>\n</template>\n\n<script setup>\n import { useModals } from \"./useModals\";\n\n const modals = useModals();\n const showSettingsModal = () => {\n console.log(\"This is opening via uluModals composable\");\n modals.open(\"settings\");\n };\n</script>"
|
|
447
|
+
}
|
|
448
|
+
],
|
|
449
|
+
"useTooltipFollow": [
|
|
450
|
+
{
|
|
451
|
+
"title": "Default",
|
|
452
|
+
"description": "Default variation",
|
|
453
|
+
"code": "<useTooltipFollow>Content</useTooltipFollow>"
|
|
454
|
+
}
|
|
455
|
+
],
|
|
456
|
+
"useTooltip": [],
|
|
457
|
+
"tooltip": [
|
|
458
|
+
{
|
|
459
|
+
"title": "Basic",
|
|
460
|
+
"description": "Basic variation",
|
|
461
|
+
"code": "<tooltip>This is a basic tooltip!</tooltip>"
|
|
462
|
+
}
|
|
463
|
+
],
|
|
464
|
+
"UluPopover": [],
|
|
465
465
|
"UluTableSticky": [
|
|
466
466
|
{
|
|
467
467
|
"title": "Default",
|
|
@@ -645,6 +645,13 @@
|
|
|
645
645
|
}
|
|
646
646
|
],
|
|
647
647
|
"forms": [],
|
|
648
|
+
"facets": [
|
|
649
|
+
{
|
|
650
|
+
"title": "facets Example 1",
|
|
651
|
+
"description": "Code example extracted from markdown.",
|
|
652
|
+
"code": "<script setup>\n import { ref } from 'vue';\n import { useFacets } from './useFacets.js';\n import UluFacetsFilterAccordions from './UluFacetsFilterAccordions.vue';\n import UluFacetsResults from './UluFacetsResults.vue';\n import UluFacetsSearch from './UluFacetsSearch.vue';\n import UluFacetsSort from './UluFacetsSort.vue';\n import UluFacetsSidebarLayout from './UluFacetsSidebarLayout.vue';\n import { mockItems } from './_mock-data';\n\n const allItems = ref(mockItems);\n\n // 1. Define fields for automatic facet generation\n const facetFields = [\n { name: 'Category', uid: 'category', open: true, multiple: true },\n { name: 'Author', uid: 'author', open: true },\n { name: 'Year', uid: 'date', open: true, getValue: item => item.date.getFullYear() }\n ];\n\n // 2. Define any extra sort types\n const extraSortTypes = {\n newest: { text: 'Date (Newest)', sort: (items) => [...items].sort((a, b) => b.date - a.date) },\n oldest: { text: 'Date (Oldest)', sort: (items) => [...items].sort((a, b) => a.date - b.date) }\n };\n\n // 3. Initialize the composable\n const {\n facets,\n searchValue,\n selectedSort,\n sortTypes,\n displayItems,\n selectedFacets, // Use this to check if filters are active\n handleFacetChange,\n clearFilters\n } = useFacets(allItems, {\n facetFields,\n extraSortTypes,\n initialSortType: 'newest',\n countMode: 'intuitive', // Show counts next to facet values\n searchOptions: { keys: ['title', 'description', 'author'] }\n });\n</script>\n\n<template>\n <UluFacetsSidebarLayout>\n <template #header>\n <div style=\"display: flex; justify-content: space-between; align-items: center; margin-bottom: 1rem; padding-bottom: 1rem; border-bottom: 1px solid #eee;\">\n <h2>Found {{ displayItems.length }} items</h2>\n <UluFacetsSort v-model=\"selectedSort\" :sort-types=\"sortTypes\" />\n </div>\n </template>\n <template #sidebar>\n <UluFacetsSearch v-model=\"searchValue\" placeholder=\"Search articles...\" />\n <hr/>\n <div style=\"display: flex; justify-content: space-between; align-items: center;\">\n <h3>Filters</h3>\n <button v-if=\"selectedFacets.length > 0\" @click=\"clearFilters\" style=\"border: none; background: none; color: blue; cursor: pointer;\">Clear</button>\n </div>\n <UluFacetsFilterAccordions :facets=\"facets\" @facet-change=\"handleFacetChange\" :max-visible=\"5\" />\n </template>\n <template #main>\n <UluFacetsResults :items=\"displayItems\">\n <template #item=\"{ item }\">\n <div style=\"border: 1px solid #eee; padding: 1rem; margin-bottom: 1rem; border-radius: 4px;\">\n <h3>{{ item.title }}</h3>\n <p>{{ item.description }}</p>\n <p><small><strong>Author:</strong> {{ Array.isArray(item.author) ? item.author.join(', ') : item.author }}</small></p>\n <p><small><strong>Published on:</strong> {{ item.date.toLocaleDateString() }}</small></p>\n </div>\n </template>\n <template #empty>\n <div style=\"padding: 2rem; text-align: center;\">\n <p>No matching items found. Try clearing some filters.</p>\n </div>\n </template>\n </UluFacetsResults>\n </template>\n </UluFacetsSidebarLayout>\n</template>"
|
|
653
|
+
}
|
|
654
|
+
],
|
|
648
655
|
"useScrollAnchors": [
|
|
649
656
|
{
|
|
650
657
|
"title": "useScrollAnchors Example 1",
|
|
@@ -665,13 +672,6 @@
|
|
|
665
672
|
"description": "Code example extracted from markdown.",
|
|
666
673
|
"code": "<script setup>\nimport { useScrollAnchorSection } from './useScrollAnchorSection';\n\nconst props = defineProps({\n title: {\n type: String,\n required: true\n },\n customTitleId: String,\n});\n\nconst { sectionRef, titleId, isActive, section } = useScrollAnchorSection(props);\n</script>\n\n<template>\n <section :class=\"['my-custom-section', { 'is-active': isActive }]\" :ref=\"sectionRef\">\n <h2 :id=\"titleId\">{{ title }}</h2>\n <p>This section is {{ isActive ? 'active' : 'inactive' }}.</p>\n <!-- More content here -->\n <slot />\n </section>\n</template>"
|
|
667
674
|
}
|
|
668
|
-
],
|
|
669
|
-
"facets": [
|
|
670
|
-
{
|
|
671
|
-
"title": "facets Example 1",
|
|
672
|
-
"description": "Code example extracted from markdown.",
|
|
673
|
-
"code": "<script setup>\n import { ref } from 'vue';\n import { useFacets } from './useFacets.js';\n import UluFacetsFilterAccordions from './UluFacetsFilterAccordions.vue';\n import UluFacetsResults from './UluFacetsResults.vue';\n import UluFacetsSearch from './UluFacetsSearch.vue';\n import UluFacetsSort from './UluFacetsSort.vue';\n import UluFacetsSidebarLayout from './UluFacetsSidebarLayout.vue';\n import { mockItems } from './_mock-data';\n\n const allItems = ref(mockItems);\n\n // 1. Define fields for automatic facet generation\n const facetFields = [\n { name: 'Category', uid: 'category', open: true, multiple: true },\n { name: 'Author', uid: 'author', open: true },\n { name: 'Year', uid: 'date', open: true, getValue: item => item.date.getFullYear() }\n ];\n\n // 2. Define any extra sort types\n const extraSortTypes = {\n newest: { text: 'Date (Newest)', sort: (items) => [...items].sort((a, b) => b.date - a.date) },\n oldest: { text: 'Date (Oldest)', sort: (items) => [...items].sort((a, b) => a.date - b.date) }\n };\n\n // 3. Initialize the composable\n const {\n facets,\n searchValue,\n selectedSort,\n sortTypes,\n displayItems,\n selectedFacets, // Use this to check if filters are active\n handleFacetChange,\n clearFilters\n } = useFacets(allItems, {\n facetFields,\n extraSortTypes,\n initialSortType: 'newest',\n countMode: 'intuitive', // Show counts next to facet values\n searchOptions: { keys: ['title', 'description', 'author'] }\n });\n</script>\n\n<template>\n <UluFacetsSidebarLayout>\n <template #header>\n <div style=\"display: flex; justify-content: space-between; align-items: center; margin-bottom: 1rem; padding-bottom: 1rem; border-bottom: 1px solid #eee;\">\n <h2>Found {{ displayItems.length }} items</h2>\n <UluFacetsSort v-model=\"selectedSort\" :sort-types=\"sortTypes\" />\n </div>\n </template>\n <template #sidebar>\n <UluFacetsSearch v-model=\"searchValue\" placeholder=\"Search articles...\" />\n <hr/>\n <div style=\"display: flex; justify-content: space-between; align-items: center;\">\n <h3>Filters</h3>\n <button v-if=\"selectedFacets.length > 0\" @click=\"clearFilters\" style=\"border: none; background: none; color: blue; cursor: pointer;\">Clear</button>\n </div>\n <UluFacetsFilterAccordions :facets=\"facets\" @facet-change=\"handleFacetChange\" :max-visible=\"5\" />\n </template>\n <template #main>\n <UluFacetsResults :items=\"displayItems\">\n <template #item=\"{ item }\">\n <div style=\"border: 1px solid #eee; padding: 1rem; margin-bottom: 1rem; border-radius: 4px;\">\n <h3>{{ item.title }}</h3>\n <p>{{ item.description }}</p>\n <p><small><strong>Author:</strong> {{ Array.isArray(item.author) ? item.author.join(', ') : item.author }}</small></p>\n <p><small><strong>Published on:</strong> {{ item.date.toLocaleDateString() }}</small></p>\n </div>\n </template>\n <template #empty>\n <div style=\"padding: 2rem; text-align: center;\">\n <p>No matching items found. Try clearing some filters.</p>\n </div>\n </template>\n </UluFacetsResults>\n </template>\n </UluFacetsSidebarLayout>\n</template>"
|
|
674
|
-
}
|
|
675
675
|
]
|
|
676
676
|
},
|
|
677
677
|
"configuration": {
|
|
@@ -12239,7 +12239,7 @@
|
|
|
12239
12239
|
"raw_markdown": "\nimport { Meta, Story, Canvas } from '@storybook/addon-docs/blocks';\nimport { version } from '../package.json';\nimport * as ButtonStories from './components/elements/UluButton.stories.js';\nimport * as CardStories from './components/elements/UluCard.stories.js';\n\n<Meta title=\"Overview/Introduction\" />\n\n# Ulu Frontend Vue\n\nWelcome to the living style guide for the Ulu Vue component library. This library provides a comprehensive set of accessible, reusable, and composable Vue 3 components, composables, and plugins to build modern web applications.\n\nThis documentation provides interactive examples and detailed API documentation for each part of the library.\n\n---\n\n## Core Concepts\n\nThe Ulu ecosystem is built on two main packages:\n\n- **`@ulu/frontend`**: The framework-agnostic core. It contains the foundational SCSS for styling, vanilla JavaScript utilities, and base components. It knows nothing about Vue. \n- **`@ulu/frontend-vue`** (This Library): The Vue 3 implementation. It provides wrapper components, composables, and plugins that build upon and integrate seamlessly with the `@ulu/frontend` core.\n\nThis separation allows for a consistent design system that can be applied to any web technology, while providing a rich, idiomatic experience for Vue developers.\n\n**Note:** For `@ulu/frontend` (components) that you are using from this Vue library. You need to output the component stylesheets like you would normally (create global stylesheet). The components in this library do not at the frontend scss modules. While they could be included in each component this would make it so that you can't build your own implementations (local app component / etc) with the class structures since the styles would only be available if that component is used. \n\nExample global stylesheet outputting all \"included\" components and base styles. Note you can configure whats output with ulu.component-set-includes for example. Note there are many ways to assemble the stylesheet (manual per component mixins, etc), this example shows the convenience modules which output each modules stylesheet based on includes/excludes.\n\n```sass\n@use \"config\"; // Your config changes for example\n@use \"@ulu/frontend/scss/stylesheets/base-styles.scss\"; // Outputs base styles that are included\n@use \"@ulu/frontend/scss/stylesheets/component-styles.scss\"; // Outputs component styles that are included\n@use \"@ulu/frontend/scss/stylesheets/helper-styles.scss\"; // Outputs helper styles that are included\n```\n\n*Please see `@ulu/frontend` library for full documentation of configuring and outputting stylesheet*\n\n---\n\n## Installation\n\nTo get started, add the library to your project.\n\n```bash\nnpm install @ulu/frontend-vue\n```\n\nNext, you must register the required plugins in your main application entry point (`main.js`). The `corePlugin` is essential, and other plugins like `breakpointsPlugin`, `popoverPlugin` are optional. Some components require plugins. If a required plugin is missing, an error is thrown.\n\n**`src/main.js`**\n```javascript\nimport { createApp } from 'vue';\nimport App from './App.vue';\nimport { \n corePlugin, \n breakpointsPlugin, \n toastPlugin, \n modalsPlugin, \n popoversPlugin \n} from '@ulu/frontend-vue';\nimport router from './router'; // Your vue-router instance\n\n// Import the main SCSS entry point\nimport '@ulu/frontend-vue/lib/_index.scss';\n\nconst app = createApp(App);\n\napp.use(router);\n\n// Register Ulu plugins\napp.use(corePlugin, {\n // Optional: override default icons\n iconsByType: {\n danger: 'fas fa-exclamation-triangle',\n close: 'fas fa-times'\n }\n});\napp.use(breakpointsPlugin);\napp.use(toastPlugin);\napp.use(modalsPlugin, { \n modals: [\n /* your global modals */\n ] \n});\napp.use(popoversPlugin);\n\n\napp.mount('#app');\n```\n\nFinally, you need to add the display components for plugins like `toast` and `modals` to your root `App.vue` file.\n\n**`src/App.vue`**\n```html\n<template>\n <!-- Your App Layout -->\n <router-view />\n\n <!-- Ulu Plugin Display Components -->\n <UluToastDisplay />\n <UluModalsDisplay />\n <UluTooltipDisplay />\n</template>\n```\n\n---\n\n## What's Inside?\n\nThe library is organized into several key areas:\n\n### Components\n\nThese are the reusable building blocks of your UI. They are organized by function into categories like `elements`, `collapsible`, `forms`, `layout`, `navigation`, and `systems`.\n\n**Simple Component Example: `UluButton`**\n\n<Canvas of={ButtonStories.Primary} />\n\n**Complex Component Example: `UluCard`**\n\n<Canvas of={CardStories.Default} />\n\n### Composables\n\nReusable, stateful logic that can be shared across components.\n\n- `useFacets`: A powerful composable for client-side filtering, searching, and sorting of data.\n- `usePagination`: Handles all the logic for paginating a list of items, including integration with Vue Router.\n- `useBreakpointManager`: A reactive interface to CSS breakpoints.\n- `useModifiers`: A utility for creating BEM-style modifier classes.\n- `useWindowResize`: A debounced window resize event listener.\n- `useRequiredInject`: A utility to ensure required dependencies are injected from plugins.\n\n### Plugins\n\nPlugins provide global functionality and APIs that can be accessed from anywhere in your application.\n\n- **`corePlugin` (Required)**: Manages global settings, primarily for the icon system.\n- **`breakpointsPlugin`**: Provides reactive information about the current CSS breakpoint (`uluIsMobile`, `uluBreakpointActive`).\n- **`modalsPlugin`**: A system for registering and triggering global modals (e.g., for settings or confirmation dialogs).\n- **`toastPlugin`**: A global API (`$uluToast`) for showing toast notifications.\n- **`popoversPlugin`**: Enables a simple `v-ulu-tooltip` directive for tooltips and provides the `UluPopover` component.\n\n**Example: Triggering a Toast Notification**\n```javascript\nimport { useToast } from '@ulu/frontend-vue';\n\nconst toast = useToast();\n\ntoast.add({\n title: 'Success!',\n description: 'Your profile has been updated.',\n class: 'is-success'\n});\n```\n\n### Component Systems\n\nSystems are complex, multi-component features that solve a specific problem.\n\n- **Facets**: A complete system for faceted search, built around the `useFacets` composable. Includes components for search, sort, filters, and results display.\n- **Scroll Anchors**: A system for creating navigations that track the user's scroll position within a page.\n- **Skeleton**: A set of components for creating beautiful and effective loading states.\n- **Table Sticky**: A powerful table component with sticky headers and columns.\n- **Slider**: A flexible slideshow/carousel component.\n\n### Resolver\n\nResolver for [`unplugin-vue-components`](https://github.com/unplugin/unplugin-vue-components/tree/main]) is available to use like:\n\n```js\n// vite.config.js\n\nimport { defineConfig } from \"vite\";\nimport Components from \"unplugin-vue-components/vite\";\nimport { UluUnpluginResolver } from \"@ulu/frontend-vue/resolver\";\n\nexport default defineConfig({\n plugins: [\n // ...\n Components({ \n resolvers: [\n UluUnpluginResolver()\n ]\n }),\n // ...\n ],\n // ...\n});\n```\n\n### Vite Asset URLs\n\nWhen using components like `UluImage` and `UluImageSource`, you may want to pass relative asset paths directly as props (e.g. `<UluImage src=\"./assets/img.png\" />`) instead of manually importing them in your setup script. \n\nTo enable Vite to automatically resolve these paths, you can add our custom transform rules to the Vue plugin in your `vite.config.js`:\n\n*Note: this includes the defaults (img, source, video, ...) in addition to the Ulu specific components, since configuring this clears the defaults (it's not merged).*\n\n```js\n// vite.config.js\n\nimport { defineConfig } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\nimport { uluTransformAssetUrls } from \"@ulu/frontend-vue/vite.js\";\n\nexport default defineConfig({\n plugins: [\n vue({\n template: {\n transformAssetUrls: {\n // \n ...uluTransformAssetUrls\n }\n }\n }),\n // ...\n ],\n // ...\n});\n```"
|
|
12240
12240
|
},
|
|
12241
12241
|
"ExportsMap": {
|
|
12242
|
-
"raw_markdown": "\nimport { Meta } from '@storybook/addon-docs/blocks';\n\n<Meta title=\"Overview/API Reference\" />\n\n# API Reference\n\nThis page provides a comprehensive map of all named exports from the `@ulu/frontend-vue` library. Use this as a quick reference to discover available components, composables, plugins, and utilities.\n\n## Components\n\nThese are the building blocks for your UI. They are imported as named exports.\n\n* `UluAccordion`\n* `UluAccordionGroup`\n* `UluAction`\n* `UluAdaptiveLayout`\n* `UluAlert`\n* `UluAnimateNumber`\n* `UluBadge`\n* `UluBadgeStack`\n* `UluBreadcrumb`\n* `UluButton`\n* `UluButtonVerbose`\n* `UluCallout`\n* `UluCard`\n* `UluCollapsible`\n* `UluConditionalText`\n* `UluConditionalWrapper`\n* `UluDataGrid`\n* `UluDataTable`\n* `UluDefinitionList`\n* `UluDefinitionListItem`\n* `UluDropdown`\n* `UluEmpty`\n* `UluEmptyView`\n* `UluExternalLink`\n* `UluFacetsActiveFilters`\n* `UluFacetsFilterAccordions`\n* `UluFacetsFilterLists`\n* `UluFacetsFilterPopovers`\n* `UluFacetsFilterSelects`\n* `UluFacetsHeaderLayout`\n* `UluFacetsList`\n* `UluFacetsResults`\n* `UluFacetsSearch`\n* `UluFacetsSidebarLayout`\n* `UluFacetsSort`\n* `UluFileDisplay`\n* `UluForm`\n* `UluFormActions`\n* `UluFormCheckbox`\n* `UluFormFieldset`\n* `UluFormFile`\n* `UluFormItem`\n* `UluFormItemsInline`\n* `UluFormLabel`\n* `UluFormMessage`\n* `UluFormRadio`\n* `UluFormRequiredChar`\n* `UluFormSelect`\n* `UluFormText`\n* `UluFormTextarea`\n* `UluIcon`\n* `UluImage`\n* `UluImageSource`\n* In Progress - `UluImageSlider`\n* `UluList`\n* `UluListItem`\n* `UluCounterList`\n* `UluMain`\n* `UluMenu`\n* `UluMenuStack`\n* `UluModal`\n* `UluNavStrip`\n* `UluOverflowPopover`\n* `UluPager`\n* `UluPlaceholderImage`\n* `UluPlaceholderText`\n* `UluProgressBar`\n* `UluProgressCircle`\n* `UluRouteAnnouncer`\n* `UluRule`\n* `UluSanityRichText`\n* `UluScrollAnchors`\n* `UluScrollAnchorsHeadlessSection`\n* `UluScrollAnchorsNav`\n* `UluScrollAnchorsNavAnimated`\n* `UluScrollAnchorsSection`\n* `UluScrollSlider`\n* `UluSearchForm`\n* `UluSelectableMenu`\n* `UluShowSkeleton`\n* `UluSkeletonContent`\n* `UluSkeletonMedia`\n* `UluSkeletonText`\n* `UluSkipLink`\n* `UluSlider`\n* `UluSpokeSpinner`\n* `UluTab`\n* `UluTabGroup`\n* `UluTabList`\n* `UluTabPanel`\n* `UluTabPanels`\n* `UluTable`\n* `UluTableSticky`\n* `UluTableStickyRows`\n* `UluTableStickyTable`\n* `UluTag`\n* `UluTitleRail`\n\n---\n\n## Composables\n\nReusable, stateful logic that can be shared across components.\n\n* `useBreakpointManager`\n* `useDocumentTitle`\n* `useFacets`\n* `useIcon`\n* `useModifiers`\n* `usePagination`\n* `useRequiredInject`\n* `useScrollAnchorSection`\n* `useScrollAnchorSections`\n* `useScrollAnchors`\n* `useTableData`\n* `useToast`\n* `useTooltip`\n* `useTooltipFollow`\n* `useUluFloating`\n* `useWindowResize`\n\n---\n\n## Plugins\n\nPlugins provide global functionality and APIs.\n\n* `breakpointsPlugin`\n* `corePlugin`\n* `modalsPlugin`\n* `popoversPlugin`\n* `toastPlugin`\n\n\n\n---\n\n## Utilities\n\nThe `utils` export is a namespace containing helper functions.\n\n* `utils.dom`\n* `utils.router`\n\n`\n* `utils.router`\n"
|
|
12242
|
+
"raw_markdown": "\nimport { Meta } from '@storybook/addon-docs/blocks';\n\n<Meta title=\"Overview/API Reference\" />\n\n# API Reference\n\nThis page provides a comprehensive map of all named exports from the `@ulu/frontend-vue` library. Use this as a quick reference to discover available components, composables, plugins, and utilities.\n\n## Components\n\nThese are the building blocks for your UI. They are imported as named exports.\n\n* `UluAccordion`\n* `UluAccordionGroup`\n* `UluAction`\n* `UluAdaptiveLayout`\n* `UluAlert`\n* `UluAnimateNumber`\n* `UluBadge`\n* `UluBadgeStack`\n* `UluBreadcrumb`\n* `UluButton`\n* `UluButtonVerbose`\n* `UluCallout`\n* `UluCard`\n* `UluCollapsible`\n* `UluConditionalText`\n* `UluConditionalWrapper`\n* `UluDataGrid`\n* `UluDataTable`\n* `UluDefinitionList`\n* `UluDefinitionListItem`\n* `UluDropdown`\n* `UluEmpty`\n* `UluEmptyView`\n* `UluExternalLink`\n* `UluFacetsActiveFilters`\n* `UluFacetsFilterAccordions`\n* `UluFacetsFilterLists`\n* `UluFacetsFilterPopovers`\n* `UluFacetsFilterSelects`\n* `UluFacetsHeaderLayout`\n* `UluFacetsList`\n* `UluFacetsResults`\n* `UluFacetsSearch`\n* `UluFacetsSidebarLayout`\n* `UluFacetsSort`\n* `UluFileDisplay`\n* `UluForm`\n* `UluFormActions`\n* `UluFormCheckbox`\n* `UluFormFieldset`\n* `UluFormFile`\n* `UluFormItem`\n* `UluFormItemsInline`\n* `UluFormLabel`\n* `UluFormMessage`\n* `UluFormRadio`\n* `UluFormRequiredChar`\n* `UluFormSelect`\n* `UluFormText`\n* `UluFormTextarea`\n* `UluIcon`\n* `UluImage`\n* `UluImageSource`\n* In Progress - `UluImageSlider`\n* `UluList`\n* `UluListItem`\n* `UluCounterList`\n* `UluMain`\n* `UluMenu`\n* `UluMenuStack`\n* `UluModal`\n* `UluNavStrip`\n* `UluOverflowPopover`\n* `UluPager`\n* `UluPlaceholderImage`\n* `UluPlaceholderText`\n* `UluProgressBar`\n* `UluProgressCircle`\n* `UluRouteAnnouncer`\n* `UluRule`\n* `UluSanityRichText`\n* `UluScrollAnchors`\n* `UluScrollAnchorsHeadlessSection`\n* `UluScrollAnchorsNav`\n* `UluScrollAnchorsNavAnimated`\n* `UluScrollAnchorsSection`\n* `UluScrollSlider`\n* `UluSearchForm`\n* `UluSelectableMenu`\n* `UluShowSkeleton`\n* `UluSkeletonContent`\n* `UluSkeletonMedia`\n* `UluSkeletonText`\n* `UluSkipLink`\n* `UluSlider`\n* `UluSpokeSpinner`\n* `UluTab`\n* `UluTabGroup`\n* `UluTabList`\n* `UluTabPanel`\n* `UluTabPanels`\n* `UluTable`\n* `UluTableSticky`\n* `UluTableStickyRows`\n* `UluTableStickyTable`\n* `UluTag`\n* `UluTitleRail`\n* `UluToast`\n* `UluToastDisplay`\n\n---\n\n## Composables\n\nReusable, stateful logic that can be shared across components.\n\n* `useBreakpointManager`\n* `useDocumentTitle`\n* `useFacets`\n* `useIcon`\n* `useModifiers`\n* `usePagination`\n* `useRequiredInject`\n* `useScrollAnchorSection`\n* `useScrollAnchorSections`\n* `useScrollAnchors`\n* `useTableData`\n* `useToast`\n* `useTooltip`\n* `useTooltipFollow`\n* `useUluFloating`\n* `useWindowResize`\n\n---\n\n## Plugins\n\nPlugins provide global functionality and APIs.\n\n* `breakpointsPlugin`\n* `corePlugin`\n* `modalsPlugin`\n* `popoversPlugin`\n* `toastPlugin`\n\n\n\n---\n\n## Utilities\n\nThe `utils` export is a namespace containing helper functions.\n\n* `utils.dom`\n* `utils.router`\n\n`\n* `utils.router`\n"
|
|
12243
12243
|
},
|
|
12244
12244
|
"ChangeLog": {
|
|
12245
12245
|
"raw_markdown": "import { Meta, Markdown } from '@storybook/addon-docs/blocks';\nimport CHANGELOG from '../CHANGELOG.md?raw';\n\n<Meta title=\"Overview/Change Log\" />\n\n<Markdown>\n{CHANGELOG}\n</Markdown>"
|
|
@@ -12274,6 +12274,9 @@
|
|
|
12274
12274
|
"forms": {
|
|
12275
12275
|
"raw_markdown": "import { Meta, Canvas, Story } from '@storybook/addon-docs/blocks';\nimport * as FullFormDemoStories from './tests/FullFormDemo.stories.js';\n\n# Forms\n\nThis is a demonstration of a full form built with the `ulu-form` components.\n\n<Canvas of={FullFormDemoStories.Default} />\n"
|
|
12276
12276
|
},
|
|
12277
|
+
"facets": {
|
|
12278
|
+
"raw_markdown": "# Faceted Search\n\nThis story demonstrates the `useFacets` composable and its associated components. It showcases how to set up a faceted search interface with automatic facet generation, searching, sorting, and filtering. For detailed configuration options, see the [`facetFields` API reference](#facetfields-api) below the example.\n\n```html\n<script setup>\n import { ref } from 'vue';\n import { useFacets } from './useFacets.js';\n import UluFacetsFilterAccordions from './UluFacetsFilterAccordions.vue';\n import UluFacetsResults from './UluFacetsResults.vue';\n import UluFacetsSearch from './UluFacetsSearch.vue';\n import UluFacetsSort from './UluFacetsSort.vue';\n import UluFacetsSidebarLayout from './UluFacetsSidebarLayout.vue';\n import { mockItems } from './_mock-data';\n\n const allItems = ref(mockItems);\n\n // 1. Define fields for automatic facet generation\n const facetFields = [\n { name: 'Category', uid: 'category', open: true, multiple: true },\n { name: 'Author', uid: 'author', open: true },\n { name: 'Year', uid: 'date', open: true, getValue: item => item.date.getFullYear() }\n ];\n\n // 2. Define any extra sort types\n const extraSortTypes = {\n newest: { text: 'Date (Newest)', sort: (items) => [...items].sort((a, b) => b.date - a.date) },\n oldest: { text: 'Date (Oldest)', sort: (items) => [...items].sort((a, b) => a.date - b.date) }\n };\n\n // 3. Initialize the composable\n const {\n facets,\n searchValue,\n selectedSort,\n sortTypes,\n displayItems,\n selectedFacets, // Use this to check if filters are active\n handleFacetChange,\n clearFilters\n } = useFacets(allItems, {\n facetFields,\n extraSortTypes,\n initialSortType: 'newest',\n countMode: 'intuitive', // Show counts next to facet values\n searchOptions: { keys: ['title', 'description', 'author'] }\n });\n</script>\n\n<template>\n <UluFacetsSidebarLayout>\n <template #header>\n <div style=\"display: flex; justify-content: space-between; align-items: center; margin-bottom: 1rem; padding-bottom: 1rem; border-bottom: 1px solid #eee;\">\n <h2>Found {{ displayItems.length }} items</h2>\n <UluFacetsSort v-model=\"selectedSort\" :sort-types=\"sortTypes\" />\n </div>\n </template>\n <template #sidebar>\n <UluFacetsSearch v-model=\"searchValue\" placeholder=\"Search articles...\" />\n <hr/>\n <div style=\"display: flex; justify-content: space-between; align-items: center;\">\n <h3>Filters</h3>\n <button v-if=\"selectedFacets.length > 0\" @click=\"clearFilters\" style=\"border: none; background: none; color: blue; cursor: pointer;\">Clear</button>\n </div>\n <UluFacetsFilterAccordions :facets=\"facets\" @facet-change=\"handleFacetChange\" :max-visible=\"5\" />\n </template>\n <template #main>\n <UluFacetsResults :items=\"displayItems\">\n <template #item=\"{ item }\">\n <div style=\"border: 1px solid #eee; padding: 1rem; margin-bottom: 1rem; border-radius: 4px;\">\n <h3>{{ item.title }}</h3>\n <p>{{ item.description }}</p>\n <p><small><strong>Author:</strong> {{ Array.isArray(item.author) ? item.author.join(', ') : item.author }}</small></p>\n <p><small><strong>Published on:</strong> {{ item.date.toLocaleDateString() }}</small></p>\n </div>\n </template>\n <template #empty>\n <div style=\"padding: 2rem; text-align: center;\">\n <p>No matching items found. Try clearing some filters.</p>\n </div>\n </template>\n </UluFacetsResults>\n </template>\n </UluFacetsSidebarLayout>\n</template>\n```\n\n<h3 id=\"facetfields-api\">facetFields API</h3>\n\nThe `useFacets` composable can automatically generate filter groups from a `facetFields` configuration array. Each object in the array defines a facet group and its behavior. Here are the available keys:\n\n<table>\n <thead>\n <tr>\n <th>Key</th>\n <th>Type</th>\n <th>Default</th>\n <th>Description</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td><code>uid</code></td>\n <td><code>String</code></td>\n <td><strong>Required</strong></td>\n <td>The property key on each item in your data array that holds the facet's value.</td>\n </tr>\n <tr>\n <td><code>name</code></td>\n <td><code>String</code></td>\n <td><strong>Required</strong></td>\n <td>The display name for the facet group, shown as a title in the UI.</td>\n </tr>\n <tr>\n <td><code>multiple</code></td>\n <td><code>Boolean</code></td>\n <td><code>false</code></td>\n <td>If <code>true</code>, allows multiple values to be selected (renders as checkboxes). If <code>false</code>,\n only one value can be selected (renders as radio buttons).</td>\n </tr>\n <tr>\n <td><code>open</code></td>\n <td><code>Boolean</code></td>\n <td><code>false</code></td>\n <td>If <code>true</code>, the facet group will be expanded by default in the UI.</td>\n </tr>\n <tr>\n <td><code>match</code></td>\n <td><code>String</code></td>\n <td><code>'some'</code></td>\n <td>Only applies when <code>multiple: true</code>. If set to <code>'all'</code>, items must match\n <strong>all</strong> selected values in the group (AND logic). The default is to match <strong>any</strong>\n value (OR logic).</td>\n </tr>\n <tr>\n <td><code>getValue</code></td>\n <td><code>Function</code></td>\n <td><code>item => item[uid]</code></td>\n <td>A function that receives an item and returns the value for the facet. Useful for derived or nested values\n (e.g., <code>item => item.date.getFullYear()</code>).</td>\n </tr>\n <tr>\n <td><code>getLabel</code></td>\n <td><code>Function</code></td>\n <td><code>value => value</code></td>\n <td>A function that receives a facet value and returns a formatted string for display. Useful for transforming\n values into more readable labels.</td>\n </tr>\n </tbody>\n</table>"
|
|
12279
|
+
},
|
|
12277
12280
|
"useScrollAnchors": {
|
|
12278
12281
|
"raw_markdown": "# useScrollAnchors\n\nThe main composable that contains the core \"engine\" for the Scroll Anchors system.\nIt encapsulates the `IntersectionObserver` logic to track sections and manage their active state.\nThis is intended for advanced use cases where a developer needs to build a custom provider\ncomponent instead of using the default `UluScrollAnchors`.\n\n## Usage\n\nThis composable is used to power a custom provider component. You would use it to provide the context to child components via Vue's `provide` function, using string-based keys.\n\n```html\n<script setup>\n import { ref, computed, provide } from \"vue\";\n import { useScrollAnchors } from './useScrollAnchors.js';\n\n const props = defineProps({\n firstItemActive: Boolean,\n observerOptions: Object\n });\n const emit = defineEmits(['section-change']);\n const componentEl = ref(null);\n const sections = ref([]);\n\n // Use the composable to handle the core logic\n useScrollAnchors({ sections, props, emit, componentElRef: componentEl });\n\n // Provide the state and registration functions to children\n provide('uluScrollAnchorsSections', computed(() => sections.value));\n provide('uluScrollAnchorsRegister', (section) => sections.value.push(section));\n provide('uluScrollAnchorsUnregister', (sectionId) => {\n const index = sections.value.findIndex(r => r.id === sectionId);\n if (index > -1) sections.value.splice(index, 1);\n });\n</script>\n\n<template>\n <!-- Your custom wrapper, or no wrapper at all -->\n <div ref=\"componentEl\">\n <slot/>\n </div>\n</template>\n```\n\n## Parameters\n\nThe `useScrollAnchors` composable accepts a single object with the following properties:\n\n- `sections` (Ref): A `ref` to the array of section objects that will be tracked.\n- `props` (Object): A props object containing `observerOptions` and `firstItemActive`.\n- `emit` (Function): The `emit` function from the host component, used to emit the `section-change` event.\n- `componentElRef` (Ref): A `ref` to an element within the component, used to find the nearest scrollable ancestor. This is not needed if `observerOptions.root` is set.\n\n## Returns\n\nThis composable does not return any values. It manages the observer and mutates the `active` state on the items within the `sections` array directly.\n"
|
|
12279
12282
|
},
|
|
@@ -12283,9 +12286,6 @@
|
|
|
12283
12286
|
"useScrollAnchorSection": {
|
|
12284
12287
|
"raw_markdown": "# useScrollAnchorSection\n\nA composable that provides the core logic for a scroll anchor section, allowing components to register themselves with the `UluScrollAnchors` parent and react to their active state.\n\nThis composable is intended to be used within a Vue component's `<script setup>` block to manage the lifecycle and state of a scrollable section.\n\n## Usage\n\n```html\n<script setup>\nimport { useScrollAnchorSection } from './useScrollAnchorSection';\n\nconst props = defineProps({\n title: {\n type: String,\n required: true\n },\n customTitleId: String,\n});\n\nconst { sectionRef, titleId, isActive, section } = useScrollAnchorSection(props);\n</script>\n\n<template>\n <section :class=\"['my-custom-section', { 'is-active': isActive }]\" :ref=\"sectionRef\">\n <h2 :id=\"titleId\">{{ title }}</h2>\n <p>This section is {{ isActive ? 'active' : 'inactive' }}.</p>\n <!-- More content here -->\n <slot />\n </section>\n</template>\n```\n\n## Parameters\n\nThe `useScrollAnchorSection` composable accepts a `props` object with the following properties:\n\n- `title` (String, required): The title of the section. Used for generating a default `titleId` and for display in navigation.\n- `customTitleId` (String, optional): A custom ID for the section's anchor. If not provided, one will be generated from the `title`.\n\n## Returns\n\nThe composable returns an object with the following reactive properties:\n\n- `sectionRef`: A ref that should be bound to the root HTML element of your section component. This element is observed by `UluScrollAnchors` to determine the section's visibility.\n- `titleId` (ComputedRef): The unique ID for the section's title, used for anchor links.\n- `isActive` (ComputedRef): A boolean indicating whether the section is currently active (in view).\n- `section` (Reactive): The full reactive section object registered with `UluScrollAnchors`, containing `id`, `title`, `titleId`, `element`, and `active` state.\n\n## Integration with `UluScrollAnchors`\n\nThis composable works in conjunction with the `UluScrollAnchors` component. When a component using `useScrollAnchorSection` is mounted within `UluScrollAnchors`, it automatically registers itself. `UluScrollAnchors` then tracks its visibility and updates the `isActive` state.\n"
|
|
12285
12288
|
},
|
|
12286
|
-
"facets": {
|
|
12287
|
-
"raw_markdown": "# Faceted Search\n\nThis story demonstrates the `useFacets` composable and its associated components. It showcases how to set up a faceted search interface with automatic facet generation, searching, sorting, and filtering. For detailed configuration options, see the [`facetFields` API reference](#facetfields-api) below the example.\n\n```html\n<script setup>\n import { ref } from 'vue';\n import { useFacets } from './useFacets.js';\n import UluFacetsFilterAccordions from './UluFacetsFilterAccordions.vue';\n import UluFacetsResults from './UluFacetsResults.vue';\n import UluFacetsSearch from './UluFacetsSearch.vue';\n import UluFacetsSort from './UluFacetsSort.vue';\n import UluFacetsSidebarLayout from './UluFacetsSidebarLayout.vue';\n import { mockItems } from './_mock-data';\n\n const allItems = ref(mockItems);\n\n // 1. Define fields for automatic facet generation\n const facetFields = [\n { name: 'Category', uid: 'category', open: true, multiple: true },\n { name: 'Author', uid: 'author', open: true },\n { name: 'Year', uid: 'date', open: true, getValue: item => item.date.getFullYear() }\n ];\n\n // 2. Define any extra sort types\n const extraSortTypes = {\n newest: { text: 'Date (Newest)', sort: (items) => [...items].sort((a, b) => b.date - a.date) },\n oldest: { text: 'Date (Oldest)', sort: (items) => [...items].sort((a, b) => a.date - b.date) }\n };\n\n // 3. Initialize the composable\n const {\n facets,\n searchValue,\n selectedSort,\n sortTypes,\n displayItems,\n selectedFacets, // Use this to check if filters are active\n handleFacetChange,\n clearFilters\n } = useFacets(allItems, {\n facetFields,\n extraSortTypes,\n initialSortType: 'newest',\n countMode: 'intuitive', // Show counts next to facet values\n searchOptions: { keys: ['title', 'description', 'author'] }\n });\n</script>\n\n<template>\n <UluFacetsSidebarLayout>\n <template #header>\n <div style=\"display: flex; justify-content: space-between; align-items: center; margin-bottom: 1rem; padding-bottom: 1rem; border-bottom: 1px solid #eee;\">\n <h2>Found {{ displayItems.length }} items</h2>\n <UluFacetsSort v-model=\"selectedSort\" :sort-types=\"sortTypes\" />\n </div>\n </template>\n <template #sidebar>\n <UluFacetsSearch v-model=\"searchValue\" placeholder=\"Search articles...\" />\n <hr/>\n <div style=\"display: flex; justify-content: space-between; align-items: center;\">\n <h3>Filters</h3>\n <button v-if=\"selectedFacets.length > 0\" @click=\"clearFilters\" style=\"border: none; background: none; color: blue; cursor: pointer;\">Clear</button>\n </div>\n <UluFacetsFilterAccordions :facets=\"facets\" @facet-change=\"handleFacetChange\" :max-visible=\"5\" />\n </template>\n <template #main>\n <UluFacetsResults :items=\"displayItems\">\n <template #item=\"{ item }\">\n <div style=\"border: 1px solid #eee; padding: 1rem; margin-bottom: 1rem; border-radius: 4px;\">\n <h3>{{ item.title }}</h3>\n <p>{{ item.description }}</p>\n <p><small><strong>Author:</strong> {{ Array.isArray(item.author) ? item.author.join(', ') : item.author }}</small></p>\n <p><small><strong>Published on:</strong> {{ item.date.toLocaleDateString() }}</small></p>\n </div>\n </template>\n <template #empty>\n <div style=\"padding: 2rem; text-align: center;\">\n <p>No matching items found. Try clearing some filters.</p>\n </div>\n </template>\n </UluFacetsResults>\n </template>\n </UluFacetsSidebarLayout>\n</template>\n```\n\n<h3 id=\"facetfields-api\">facetFields API</h3>\n\nThe `useFacets` composable can automatically generate filter groups from a `facetFields` configuration array. Each object in the array defines a facet group and its behavior. Here are the available keys:\n\n<table>\n <thead>\n <tr>\n <th>Key</th>\n <th>Type</th>\n <th>Default</th>\n <th>Description</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td><code>uid</code></td>\n <td><code>String</code></td>\n <td><strong>Required</strong></td>\n <td>The property key on each item in your data array that holds the facet's value.</td>\n </tr>\n <tr>\n <td><code>name</code></td>\n <td><code>String</code></td>\n <td><strong>Required</strong></td>\n <td>The display name for the facet group, shown as a title in the UI.</td>\n </tr>\n <tr>\n <td><code>multiple</code></td>\n <td><code>Boolean</code></td>\n <td><code>false</code></td>\n <td>If <code>true</code>, allows multiple values to be selected (renders as checkboxes). If <code>false</code>,\n only one value can be selected (renders as radio buttons).</td>\n </tr>\n <tr>\n <td><code>open</code></td>\n <td><code>Boolean</code></td>\n <td><code>false</code></td>\n <td>If <code>true</code>, the facet group will be expanded by default in the UI.</td>\n </tr>\n <tr>\n <td><code>match</code></td>\n <td><code>String</code></td>\n <td><code>'some'</code></td>\n <td>Only applies when <code>multiple: true</code>. If set to <code>'all'</code>, items must match\n <strong>all</strong> selected values in the group (AND logic). The default is to match <strong>any</strong>\n value (OR logic).</td>\n </tr>\n <tr>\n <td><code>getValue</code></td>\n <td><code>Function</code></td>\n <td><code>item => item[uid]</code></td>\n <td>A function that receives an item and returns the value for the facet. Useful for derived or nested values\n (e.g., <code>item => item.date.getFullYear()</code>).</td>\n </tr>\n <tr>\n <td><code>getLabel</code></td>\n <td><code>Function</code></td>\n <td><code>value => value</code></td>\n <td>A function that receives a facet value and returns a formatted string for display. Useful for transforming\n values into more readable labels.</td>\n </tr>\n </tbody>\n</table>"
|
|
12288
|
-
},
|
|
12289
12289
|
"jsdoc": [
|
|
12290
12290
|
{
|
|
12291
12291
|
"id": "module:vite",
|
|
@@ -12392,45 +12392,6 @@
|
|
|
12392
12392
|
"order": 25,
|
|
12393
12393
|
"level": 0
|
|
12394
12394
|
},
|
|
12395
|
-
{
|
|
12396
|
-
"id": "plugins\nResponsible for exporting all plugins\n- Used in bundle exportsmodule:",
|
|
12397
|
-
"longname": "plugins\nResponsible for exporting all plugins\n- Used in bundle exportsmodule:",
|
|
12398
|
-
"name": "plugins\nResponsible for exporting all plugins\n- Used in bundle exports",
|
|
12399
|
-
"kind": "module",
|
|
12400
|
-
"meta": {
|
|
12401
|
-
"lineno": 1,
|
|
12402
|
-
"filename": "index.js",
|
|
12403
|
-
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins"
|
|
12404
|
-
},
|
|
12405
|
-
"order": 28,
|
|
12406
|
-
"level": 0
|
|
12407
|
-
},
|
|
12408
|
-
{
|
|
12409
|
-
"id": "module:components",
|
|
12410
|
-
"longname": "module:components",
|
|
12411
|
-
"name": "components",
|
|
12412
|
-
"kind": "module",
|
|
12413
|
-
"meta": {
|
|
12414
|
-
"lineno": 1,
|
|
12415
|
-
"filename": "index.js",
|
|
12416
|
-
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/components"
|
|
12417
|
-
},
|
|
12418
|
-
"order": 29,
|
|
12419
|
-
"level": 0
|
|
12420
|
-
},
|
|
12421
|
-
{
|
|
12422
|
-
"id": "components/index.js\nResponsible for exporting all components\n- Used in main plugin and bundle exportsmodule:",
|
|
12423
|
-
"longname": "components/index.js\nResponsible for exporting all components\n- Used in main plugin and bundle exportsmodule:",
|
|
12424
|
-
"name": "components/index.js\nResponsible for exporting all components\n- Used in main plugin and bundle exports",
|
|
12425
|
-
"kind": "module",
|
|
12426
|
-
"meta": {
|
|
12427
|
-
"lineno": 4,
|
|
12428
|
-
"filename": "index.js",
|
|
12429
|
-
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/components"
|
|
12430
|
-
},
|
|
12431
|
-
"order": 30,
|
|
12432
|
-
"level": 0
|
|
12433
|
-
},
|
|
12434
12395
|
{
|
|
12435
12396
|
"id": "module:useWindowResize",
|
|
12436
12397
|
"longname": "module:useWindowResize",
|
|
@@ -12441,7 +12402,7 @@
|
|
|
12441
12402
|
"filename": "useWindowResize.js",
|
|
12442
12403
|
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
|
|
12443
12404
|
},
|
|
12444
|
-
"order":
|
|
12405
|
+
"order": 28,
|
|
12445
12406
|
"level": 0
|
|
12446
12407
|
},
|
|
12447
12408
|
{
|
|
@@ -12454,7 +12415,7 @@
|
|
|
12454
12415
|
"filename": "useUluFloating.js",
|
|
12455
12416
|
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
|
|
12456
12417
|
},
|
|
12457
|
-
"order":
|
|
12418
|
+
"order": 31,
|
|
12458
12419
|
"level": 0
|
|
12459
12420
|
},
|
|
12460
12421
|
{
|
|
@@ -12467,7 +12428,7 @@
|
|
|
12467
12428
|
"filename": "useTableData.js",
|
|
12468
12429
|
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
|
|
12469
12430
|
},
|
|
12470
|
-
"order":
|
|
12431
|
+
"order": 35,
|
|
12471
12432
|
"level": 0
|
|
12472
12433
|
},
|
|
12473
12434
|
{
|
|
@@ -12480,7 +12441,7 @@
|
|
|
12480
12441
|
"filename": "useRequiredInject.js",
|
|
12481
12442
|
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
|
|
12482
12443
|
},
|
|
12483
|
-
"order":
|
|
12444
|
+
"order": 43,
|
|
12484
12445
|
"level": 0
|
|
12485
12446
|
},
|
|
12486
12447
|
{
|
|
@@ -12493,7 +12454,7 @@
|
|
|
12493
12454
|
"filename": "usePagination.js",
|
|
12494
12455
|
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
|
|
12495
12456
|
},
|
|
12496
|
-
"order":
|
|
12457
|
+
"order": 45,
|
|
12497
12458
|
"level": 0
|
|
12498
12459
|
},
|
|
12499
12460
|
{
|
|
@@ -12506,7 +12467,7 @@
|
|
|
12506
12467
|
"filename": "useModifiers.js",
|
|
12507
12468
|
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
|
|
12508
12469
|
},
|
|
12509
|
-
"order":
|
|
12470
|
+
"order": 47,
|
|
12510
12471
|
"level": 0
|
|
12511
12472
|
},
|
|
12512
12473
|
{
|
|
@@ -12519,7 +12480,7 @@
|
|
|
12519
12480
|
"filename": "useIcon.js",
|
|
12520
12481
|
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
|
|
12521
12482
|
},
|
|
12522
|
-
"order":
|
|
12483
|
+
"order": 49,
|
|
12523
12484
|
"level": 0
|
|
12524
12485
|
},
|
|
12525
12486
|
{
|
|
@@ -12532,7 +12493,7 @@
|
|
|
12532
12493
|
"filename": "useDocumentTitle.js",
|
|
12533
12494
|
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
|
|
12534
12495
|
},
|
|
12535
|
-
"order":
|
|
12496
|
+
"order": 52,
|
|
12536
12497
|
"level": 0
|
|
12537
12498
|
},
|
|
12538
12499
|
{
|
|
@@ -12545,7 +12506,7 @@
|
|
|
12545
12506
|
"filename": "useBreakpointManager.js",
|
|
12546
12507
|
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
|
|
12547
12508
|
},
|
|
12548
|
-
"order":
|
|
12509
|
+
"order": 54,
|
|
12549
12510
|
"level": 0
|
|
12550
12511
|
},
|
|
12551
12512
|
{
|
|
@@ -12558,6 +12519,45 @@
|
|
|
12558
12519
|
"filename": "index.js",
|
|
12559
12520
|
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
|
|
12560
12521
|
},
|
|
12522
|
+
"order": 59,
|
|
12523
|
+
"level": 0
|
|
12524
|
+
},
|
|
12525
|
+
{
|
|
12526
|
+
"id": "plugins\nResponsible for exporting all plugins\n- Used in bundle exportsmodule:",
|
|
12527
|
+
"longname": "plugins\nResponsible for exporting all plugins\n- Used in bundle exportsmodule:",
|
|
12528
|
+
"name": "plugins\nResponsible for exporting all plugins\n- Used in bundle exports",
|
|
12529
|
+
"kind": "module",
|
|
12530
|
+
"meta": {
|
|
12531
|
+
"lineno": 1,
|
|
12532
|
+
"filename": "index.js",
|
|
12533
|
+
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins"
|
|
12534
|
+
},
|
|
12535
|
+
"order": 60,
|
|
12536
|
+
"level": 0
|
|
12537
|
+
},
|
|
12538
|
+
{
|
|
12539
|
+
"id": "module:components",
|
|
12540
|
+
"longname": "module:components",
|
|
12541
|
+
"name": "components",
|
|
12542
|
+
"kind": "module",
|
|
12543
|
+
"meta": {
|
|
12544
|
+
"lineno": 1,
|
|
12545
|
+
"filename": "index.js",
|
|
12546
|
+
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/components"
|
|
12547
|
+
},
|
|
12548
|
+
"order": 61,
|
|
12549
|
+
"level": 0
|
|
12550
|
+
},
|
|
12551
|
+
{
|
|
12552
|
+
"id": "components/index.js\nResponsible for exporting all components\n- Used in main plugin and bundle exportsmodule:",
|
|
12553
|
+
"longname": "components/index.js\nResponsible for exporting all components\n- Used in main plugin and bundle exportsmodule:",
|
|
12554
|
+
"name": "components/index.js\nResponsible for exporting all components\n- Used in main plugin and bundle exports",
|
|
12555
|
+
"kind": "module",
|
|
12556
|
+
"meta": {
|
|
12557
|
+
"lineno": 4,
|
|
12558
|
+
"filename": "index.js",
|
|
12559
|
+
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/components"
|
|
12560
|
+
},
|
|
12561
12561
|
"order": 62,
|
|
12562
12562
|
"level": 0
|
|
12563
12563
|
},
|
|
@@ -13031,7 +13031,7 @@
|
|
|
13031
13031
|
"filename": "useBreakpointManager.js",
|
|
13032
13032
|
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
|
|
13033
13033
|
},
|
|
13034
|
-
"order":
|
|
13034
|
+
"order": 55
|
|
13035
13035
|
},
|
|
13036
13036
|
{
|
|
13037
13037
|
"id": "module:useBreakpointManager~defaults.onReady",
|
|
@@ -13046,7 +13046,7 @@
|
|
|
13046
13046
|
"filename": "useBreakpointManager.js",
|
|
13047
13047
|
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
|
|
13048
13048
|
},
|
|
13049
|
-
"order":
|
|
13049
|
+
"order": 56
|
|
13050
13050
|
},
|
|
13051
13051
|
{
|
|
13052
13052
|
"id": "module:useBreakpointManager~defaults.plugin",
|
|
@@ -13061,7 +13061,7 @@
|
|
|
13061
13061
|
"filename": "useBreakpointManager.js",
|
|
13062
13062
|
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
|
|
13063
13063
|
},
|
|
13064
|
-
"order":
|
|
13064
|
+
"order": 57
|
|
13065
13065
|
},
|
|
13066
13066
|
{
|
|
13067
13067
|
"id": "toast.module:defaults--module.exports",
|
|
@@ -14641,7 +14641,7 @@
|
|
|
14641
14641
|
"filename": "useWindowResize.js",
|
|
14642
14642
|
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
|
|
14643
14643
|
},
|
|
14644
|
-
"order":
|
|
14644
|
+
"order": 30,
|
|
14645
14645
|
"level": 0
|
|
14646
14646
|
},
|
|
14647
14647
|
{
|
|
@@ -14695,7 +14695,7 @@
|
|
|
14695
14695
|
"filename": "useUluFloating.js",
|
|
14696
14696
|
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
|
|
14697
14697
|
},
|
|
14698
|
-
"order":
|
|
14698
|
+
"order": 34,
|
|
14699
14699
|
"level": 0
|
|
14700
14700
|
},
|
|
14701
14701
|
{
|
|
@@ -14732,7 +14732,7 @@
|
|
|
14732
14732
|
"filename": "useTableData.js",
|
|
14733
14733
|
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
|
|
14734
14734
|
},
|
|
14735
|
-
"order":
|
|
14735
|
+
"order": 36,
|
|
14736
14736
|
"level": 0
|
|
14737
14737
|
},
|
|
14738
14738
|
{
|
|
@@ -14764,7 +14764,7 @@
|
|
|
14764
14764
|
"filename": "useRequiredInject.js",
|
|
14765
14765
|
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
|
|
14766
14766
|
},
|
|
14767
|
-
"order":
|
|
14767
|
+
"order": 44,
|
|
14768
14768
|
"level": 0
|
|
14769
14769
|
},
|
|
14770
14770
|
{
|
|
@@ -14810,7 +14810,7 @@
|
|
|
14810
14810
|
"filename": "usePagination.js",
|
|
14811
14811
|
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
|
|
14812
14812
|
},
|
|
14813
|
-
"order":
|
|
14813
|
+
"order": 46,
|
|
14814
14814
|
"level": 0
|
|
14815
14815
|
},
|
|
14816
14816
|
{
|
|
@@ -14883,7 +14883,7 @@
|
|
|
14883
14883
|
"filename": "useModifiers.js",
|
|
14884
14884
|
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
|
|
14885
14885
|
},
|
|
14886
|
-
"order":
|
|
14886
|
+
"order": 48,
|
|
14887
14887
|
"level": 0
|
|
14888
14888
|
},
|
|
14889
14889
|
{
|
|
@@ -14909,7 +14909,7 @@
|
|
|
14909
14909
|
"filename": "useIcon.js",
|
|
14910
14910
|
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
|
|
14911
14911
|
},
|
|
14912
|
-
"order":
|
|
14912
|
+
"order": 50,
|
|
14913
14913
|
"level": 0
|
|
14914
14914
|
},
|
|
14915
14915
|
{
|
|
@@ -14979,7 +14979,7 @@
|
|
|
14979
14979
|
"filename": "useDocumentTitle.js",
|
|
14980
14980
|
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
|
|
14981
14981
|
},
|
|
14982
|
-
"order":
|
|
14982
|
+
"order": 53,
|
|
14983
14983
|
"level": 0
|
|
14984
14984
|
},
|
|
14985
14985
|
{
|
|
@@ -15047,7 +15047,7 @@
|
|
|
15047
15047
|
"filename": "useBreakpointManager.js",
|
|
15048
15048
|
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
|
|
15049
15049
|
},
|
|
15050
|
-
"order":
|
|
15050
|
+
"order": 58,
|
|
15051
15051
|
"level": 0
|
|
15052
15052
|
},
|
|
15053
15053
|
{
|
|
@@ -15485,7 +15485,7 @@
|
|
|
15485
15485
|
"filename": "useTableData.js",
|
|
15486
15486
|
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
|
|
15487
15487
|
},
|
|
15488
|
-
"order":
|
|
15488
|
+
"order": 42,
|
|
15489
15489
|
"level": 0
|
|
15490
15490
|
},
|
|
15491
15491
|
{
|
|
@@ -15598,7 +15598,7 @@
|
|
|
15598
15598
|
"filename": "useWindowResize.js",
|
|
15599
15599
|
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
|
|
15600
15600
|
},
|
|
15601
|
-
"order":
|
|
15601
|
+
"order": 29,
|
|
15602
15602
|
"level": 0
|
|
15603
15603
|
},
|
|
15604
15604
|
{
|
|
@@ -15615,7 +15615,7 @@
|
|
|
15615
15615
|
"filename": "useTableData.js",
|
|
15616
15616
|
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
|
|
15617
15617
|
},
|
|
15618
|
-
"order":
|
|
15618
|
+
"order": 37,
|
|
15619
15619
|
"level": 0
|
|
15620
15620
|
},
|
|
15621
15621
|
{
|
|
@@ -15632,7 +15632,7 @@
|
|
|
15632
15632
|
"filename": "useTableData.js",
|
|
15633
15633
|
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
|
|
15634
15634
|
},
|
|
15635
|
-
"order":
|
|
15635
|
+
"order": 38,
|
|
15636
15636
|
"level": 0
|
|
15637
15637
|
},
|
|
15638
15638
|
{
|
|
@@ -15649,7 +15649,7 @@
|
|
|
15649
15649
|
"filename": "useTableData.js",
|
|
15650
15650
|
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
|
|
15651
15651
|
},
|
|
15652
|
-
"order":
|
|
15652
|
+
"order": 39,
|
|
15653
15653
|
"level": 0
|
|
15654
15654
|
},
|
|
15655
15655
|
{
|
|
@@ -15666,7 +15666,7 @@
|
|
|
15666
15666
|
"filename": "useTableData.js",
|
|
15667
15667
|
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
|
|
15668
15668
|
},
|
|
15669
|
-
"order":
|
|
15669
|
+
"order": 40,
|
|
15670
15670
|
"level": 0
|
|
15671
15671
|
},
|
|
15672
15672
|
{
|
|
@@ -15683,7 +15683,7 @@
|
|
|
15683
15683
|
"filename": "useTableData.js",
|
|
15684
15684
|
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
|
|
15685
15685
|
},
|
|
15686
|
-
"order":
|
|
15686
|
+
"order": 41,
|
|
15687
15687
|
"level": 0
|
|
15688
15688
|
},
|
|
15689
15689
|
{
|
|
@@ -15723,7 +15723,7 @@
|
|
|
15723
15723
|
"filename": "useIcon.js",
|
|
15724
15724
|
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
|
|
15725
15725
|
},
|
|
15726
|
-
"order":
|
|
15726
|
+
"order": 51,
|
|
15727
15727
|
"level": 0
|
|
15728
15728
|
},
|
|
15729
15729
|
{
|
|
@@ -16177,7 +16177,7 @@
|
|
|
16177
16177
|
"filename": "useUluFloating.js",
|
|
16178
16178
|
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
|
|
16179
16179
|
},
|
|
16180
|
-
"order":
|
|
16180
|
+
"order": 32,
|
|
16181
16181
|
"level": 0
|
|
16182
16182
|
},
|
|
16183
16183
|
{
|
|
@@ -16264,7 +16264,7 @@
|
|
|
16264
16264
|
"filename": "useUluFloating.js",
|
|
16265
16265
|
"path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
|
|
16266
16266
|
},
|
|
16267
|
-
"order":
|
|
16267
|
+
"order": 33,
|
|
16268
16268
|
"level": 0
|
|
16269
16269
|
},
|
|
16270
16270
|
{
|