@ulu/frontend-vue 0.6.16 → 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.
@@ -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
- "useModals": [],
31
- "modals": [
32
- {
33
- "title": "GlobalApiTest",
34
- "description": "GlobalApiTest variation",
35
- "code": "<modals>Content</modals>"
36
- },
37
- {
38
- "title": "modals Example 1",
39
- "description": "Code example extracted from markdown.",
40
- "code": "<template>\n <UluModal>\n User setting modal…\n </UluModal>\n</template>"
41
- },
42
- {
43
- "title": "modals Example 2",
44
- "description": "Code example extracted from markdown.",
45
- "code": "import { defineAsyncComponent } from \"vue\";\n\nexport default [\n {\n name: \"settings\",\n component: defineAsyncComponent(() => import('./components/modals/UserSettingsModal.vue')),\n }\n]"
46
- },
47
- {
48
- "title": "modals Example 3",
49
- "description": "Code example extracted from markdown.",
50
- "code": "import UluModals from \"@ulu/frontend-vue/plugins/modals/index.js\";\nimport modals from \"./src/modals.js\";\n\n//...\n\napp.use(UluModals, { modals });"
51
- },
52
- {
53
- "title": "modals Example 4",
54
- "description": "Code example extracted from markdown.",
55
- "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\""
56
- },
57
- {
58
- "title": "modals Example 5",
59
- "description": "Code example extracted from markdown.",
60
- "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>"
61
- }
62
- ],
63
- "useTooltipFollow": [
64
- {
65
- "title": "Default",
66
- "description": "Default variation",
67
- "code": "<useTooltipFollow>Content</useTooltipFollow>"
68
- }
69
- ],
70
- "useTooltip": [],
71
- "tooltip": [
72
- {
73
- "title": "Basic",
74
- "description": "Basic variation",
75
- "code": "<tooltip>This is a basic tooltip!</tooltip>"
76
- }
77
- ],
78
- "UluPopover": [],
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",
@@ -620,7 +620,6 @@
620
620
  "code": "<script setup>\n import { ref, computed, provide } from \"vue\";\n import { useBreakpointManager } from \"./useBreakpointManager.js\";\n\n const isMobile = ref(false);\n\n // Example using the onReady callback to set reactive value isMobile\n // - In this situation isMobile is being used as a primary change in \n // the applications layout \n const options = { \n onReady(manager) {\n manager.at(\"small\").max(() => isMobile.value = true);\n manager.at(\"large\").min(() => isMobile.value = false);\n }\n };\n\n // Composable returns the following\n const { \n /**\n * Reference to underlying BreakpointManager class\n */\n breakpointManager, \n /**\n * Active breakpoint name\n */\n breakpointActive, \n /**\n * Current resizeDirection (\"up\"|\"down\"|null)\n */\n breakpointDirection \n } = useBreakpointManager(options);\n\n\n // Allowing all components to access these values\n provide(\"uluBreakpointActive\", computed(() => breakpointActive));\n provide(\"uluBreakpointDirection\", computed(() => breakpointDirection));\n provide(\"uluBreakpointManager\", computed(() => breakpointManager));\n provide(\"uluIsMobile\", computed(() => isMobile));\n\n</script>"
621
621
  }
622
622
  ],
623
- "forms": [],
624
623
  "core": [
625
624
  {
626
625
  "title": "core Example 1",
@@ -645,6 +644,14 @@
645
644
  "code": "<script>\nexport default {\n inject: ['uluIsMobile', 'uluBreakpointActive'],\n mounted() {\n console.log('Is mobile?', this.uluIsMobile);\n }\n}\n</script>"
646
645
  }
647
646
  ],
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>"
@@ -12262,18 +12262,21 @@
12262
12262
  "useBreakpointManager": {
12263
12263
  "raw_markdown": "# useBreakpointManager\n\nComposable for adding breakpoint manager and related breakpoint info (via breakpoint manager from `@ulu/frontend/js/ui/breakpoints.js > BreakpointManager`).\n\n**Note:** Using the composable is only necessary for unique situations. For basic breakpoint setup use the `breakpointsPlugin`. Which uses this composable.\n\n## Options for this composable\n\n```js\nconst defaults = {\n /**\n * Set an initial value (value in mounted, SSR)\n */\n initialValue: null,\n /**\n * Function called after init (passed manager)\n */\n onReady: null,\n /**\n * Options sent to CssBreakpoints library (ulu/frontend/js/breakpoints <BreakpointManager>)\n */\n plugin: {\n customProperty: \"--breakpoint\"\n }\n}\n```\n\n## Example Usage\n\n```html\n<script setup>\n import { ref, computed, provide } from \"vue\";\n import { useBreakpointManager } from \"./useBreakpointManager.js\";\n\n const isMobile = ref(false);\n\n // Example using the onReady callback to set reactive value isMobile\n // - In this situation isMobile is being used as a primary change in \n // the applications layout \n const options = { \n onReady(manager) {\n manager.at(\"small\").max(() => isMobile.value = true);\n manager.at(\"large\").min(() => isMobile.value = false);\n }\n };\n\n // Composable returns the following\n const { \n /**\n * Reference to underlying BreakpointManager class\n */\n breakpointManager, \n /**\n * Active breakpoint name\n */\n breakpointActive, \n /**\n * Current resizeDirection (\"up\"|\"down\"|null)\n */\n breakpointDirection \n } = useBreakpointManager(options);\n\n\n // Allowing all components to access these values\n provide(\"uluBreakpointActive\", computed(() => breakpointActive));\n provide(\"uluBreakpointDirection\", computed(() => breakpointDirection));\n provide(\"uluBreakpointManager\", computed(() => breakpointManager));\n provide(\"uluIsMobile\", computed(() => isMobile));\n\n</script>\n```"
12264
12264
  },
12265
- "forms": {
12266
- "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"
12265
+ "core": {
12266
+ "raw_markdown": "# Core Plugin\n\n## Purpose\n\nThe Core Plugin is the central, **required** plugin for the `@ulu/frontend-vue` library. Its primary purpose is to establish a single, reactive source of truth for configuration settings that are shared across multiple components. \n\nBy using Vue's `provide`/`inject` system, this plugin ensures that all components within your application access the same configuration, preventing inconsistencies that can arise from separate module imports.\n\n## Installation\n\nTo use this library, you must register the `corePlugin` on your Vue app instance. You can also pass an options object to override the default settings.\n\n```javascript\n// src/main.js\nimport { createApp } from 'vue';\nimport App from './App.vue';\nimport { corePlugin } from '@ulu/frontend-vue';\n\nconst app = createApp(App);\n\n// Register the core plugin\napp.use(corePlugin, {\n // Optional: override general settings\n fontAwesomeStatic: true,\n\n // Optional: override specific icons safely\n iconsByType: {\n danger: 'my-custom-danger-icon',\n close: 'my-custom-close-icon'\n }\n});\n\napp.mount('#app');\n```\n\n## API Reference\n\nThe plugin provides its API to your application in two ways:\n\n- **Composition API:** `inject('uluCore')`\n- **Options API:** `this.$uluCore`\n\nThe API object contains the following methods:\n\n- `getSettings()`: Returns the full reactive settings object.\n- `getSetting(key)`: Retrieves a single setting by its key (e.g., `'fontAwesomeStatic'`).\n- `updateSetting(key, value)`: Updates a single setting.\n- `updateSettings(changes)`: Merges an object of changes into the settings.\n- `getDefaultSettings()`: Returns a non-reactive copy of the original default settings.\n- `getIcon(type)`: Retrieves a specific icon class string by its semantic type (e.g., `'danger'`, `'close'`).\n- `setIcon(type, definition)`: Safely sets or overrides a single icon definition.\n\n### Example Usage\n\n**Composition API (`<script setup>`)**\n```vue\n<script setup>\nimport { inject, onMounted } from 'vue';\n\nconst uluCore = inject('uluCore');\n\nonMounted(() => {\n const icons = uluCore.getSetting('iconsByType');\n console.log('Danger Icon:', icons.danger);\n\n // Example of updating a single icon dynamically\n uluCore.setIcon('success', 'my-awesome-success-icon');\n});\n</script>\n```\n\n**Options API**\n```vue\n<script>\nexport default {\n mounted() {\n const icons = this.$uluCore.getSetting('icons');\n console.log('Danger Icon:', icons.danger);\n }\n}\n</script>\n```\n\n"
12267
12267
  },
12268
12268
  "modals": {
12269
12269
  "raw_markdown": "import { Canvas } from '@storybook/addon-docs/blocks';\nimport * as ModalStories from '../../components/collapsible/UluModal.stories.js';\n\n# Modals\n\nModals plugin allows configuring app-wide modals that are triggered by the global API. Register your modals when you install the plugin then interact with them using the global API.\n\n## Registering your app-wide modals\n\nCreate the modal component file like:\n\n```html\n<template>\n <UluModal>\n User setting modal…\n </UluModal>\n</template>\n```\n\n\nExample ./scr/modals.js\n\n```js\nimport { defineAsyncComponent } from \"vue\";\n\nexport default [\n {\n name: \"settings\",\n component: defineAsyncComponent(() => import('./components/modals/UserSettingsModal.vue')),\n }\n]\n```\n\n## Installing the plugin\n\nExample ./src/main.js\n\n```js\nimport UluModals from \"@ulu/frontend-vue/plugins/modals/index.js\";\nimport modals from \"./src/modals.js\";\n\n//...\n\napp.use(UluModals, { modals });\n\n```\n\n## Using Global API\n\n```js\n\n// 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\"\n```\n\n## Using Composition API (via composable)\n\nComposable is used get access to modals API (through inject)\n\n```html\n\n<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>\n\n```\n\n## Standalone Modal Component\n\nThe `UluModal` **component is independent of this plugin.** The plugin is simply a convenient way to manage global modals (for things like a settings dialog) that need to be opened from anywhere in your application.\n\nYou can use `UluModal` as the component that the plugin displays, or you can use it on its own for any case where you are managing the state locally within a component and don't need a global API.\n\nHere is a demonstration of the standalone `UluModal` component:\n\n<Canvas of={ModalStories.Default} />"
12270
12270
  },
12271
- "core": {
12272
- "raw_markdown": "# Core Plugin\n\n## Purpose\n\nThe Core Plugin is the central, **required** plugin for the `@ulu/frontend-vue` library. Its primary purpose is to establish a single, reactive source of truth for configuration settings that are shared across multiple components. \n\nBy using Vue's `provide`/`inject` system, this plugin ensures that all components within your application access the same configuration, preventing inconsistencies that can arise from separate module imports.\n\n## Installation\n\nTo use this library, you must register the `corePlugin` on your Vue app instance. You can also pass an options object to override the default settings.\n\n```javascript\n// src/main.js\nimport { createApp } from 'vue';\nimport App from './App.vue';\nimport { corePlugin } from '@ulu/frontend-vue';\n\nconst app = createApp(App);\n\n// Register the core plugin\napp.use(corePlugin, {\n // Optional: override general settings\n fontAwesomeStatic: true,\n\n // Optional: override specific icons safely\n iconsByType: {\n danger: 'my-custom-danger-icon',\n close: 'my-custom-close-icon'\n }\n});\n\napp.mount('#app');\n```\n\n## API Reference\n\nThe plugin provides its API to your application in two ways:\n\n- **Composition API:** `inject('uluCore')`\n- **Options API:** `this.$uluCore`\n\nThe API object contains the following methods:\n\n- `getSettings()`: Returns the full reactive settings object.\n- `getSetting(key)`: Retrieves a single setting by its key (e.g., `'fontAwesomeStatic'`).\n- `updateSetting(key, value)`: Updates a single setting.\n- `updateSettings(changes)`: Merges an object of changes into the settings.\n- `getDefaultSettings()`: Returns a non-reactive copy of the original default settings.\n- `getIcon(type)`: Retrieves a specific icon class string by its semantic type (e.g., `'danger'`, `'close'`).\n- `setIcon(type, definition)`: Safely sets or overrides a single icon definition.\n\n### Example Usage\n\n**Composition API (`<script setup>`)**\n```vue\n<script setup>\nimport { inject, onMounted } from 'vue';\n\nconst uluCore = inject('uluCore');\n\nonMounted(() => {\n const icons = uluCore.getSetting('iconsByType');\n console.log('Danger Icon:', icons.danger);\n\n // Example of updating a single icon dynamically\n uluCore.setIcon('success', 'my-awesome-success-icon');\n});\n</script>\n```\n\n**Options API**\n```vue\n<script>\nexport default {\n mounted() {\n const icons = this.$uluCore.getSetting('icons');\n console.log('Danger Icon:', icons.danger);\n }\n}\n</script>\n```\n\n"
12273
- },
12274
12271
  "breakpoints": {
12275
12272
  "raw_markdown": "# Breakpoints Plugin\n\n## Purpose\n\nThe Breakpoints Plugin provides app-wide, reactive breakpoint information to your Vue components. It is a lightweight wrapper around the `useBreakpointManager` composable, ensuring that resize events and active breakpoint states are tracked centrally and distributed efficiently via Vue's `provide`/`inject` system.\n\nBy installing this plugin, any component in your application can instantly know the current breakpoint, whether the device is considered \"mobile,\" and the direction the window was just resized.\n\n## Installation\n\nRegister the `breakpointsPlugin` on your Vue app instance.\n\n```javascript\n// src/main.js\nimport { createApp } from 'vue';\nimport App from './App.vue';\nimport { breakpointsPlugin } from '@ulu/frontend-vue';\n\nconst app = createApp(App);\n\n// Register the breakpoints plugin\napp.use(breakpointsPlugin, {\n // Optional: Change which breakpoint triggers the 'isMobile' flag (default is 'small')\n breakpointMobile: 'small',\n \n // Optional: Pass options directly to the underlying useBreakpointManager\n managerOptions: {\n // onReady(manager) { ... }\n }\n});\n\napp.mount('#app');\n```\n\n## Provided Injections\n\nThe plugin does not attach methods to the Vue instance. Instead, it provides reactive `computed` refs that you can inject into any component.\n\n- **`uluIsMobile`**: `ComputedRef<Boolean>` - True if the current active breakpoint is less than or equal to the configured `breakpointMobile` (defaults to `'small'`).\n- **`uluBreakpointActive`**: `ComputedRef<String>` - The name of the currently active breakpoint (e.g., `'small'`, `'medium'`, `'large'`).\n- **`uluBreakpointDirection`**: `ComputedRef<Number>` - Indicates the resize direction (`1` for growing larger, `-1` for shrinking smaller, `0` for initialization).\n- **`uluBreakpointManager`**: `ComputedRef<Object>` - The underlying vanilla JS BreakpointManager instance, allowing advanced programmatic subscriptions if needed.\n\n## Example Usage\n\n**Composition API (`<script setup>`)**\n```vue\n<script setup>\n import { inject } from 'vue';\n\n const isMobile = inject('uluIsMobile');\n const currentBreakpoint = inject('uluBreakpointActive');\n</script>\n\n<template>\n <div>\n <p v-if=\"isMobile\">You are on a mobile device!</p>\n <p>Current Breakpoint: {{ currentBreakpoint }}</p>\n </div>\n</template>\n```\n\n**Options API**\n```vue\n<script>\nexport default {\n inject: ['uluIsMobile', 'uluBreakpointActive'],\n mounted() {\n console.log('Is mobile?', this.uluIsMobile);\n }\n}\n</script>\n```\n\n## Why use the Plugin vs the Composable?\n\nWhile you can import and use `useBreakpointManager()` directly in individual components, registering the Breakpoints Plugin ensures that the vanilla JS `BreakpointManager` is only instantiated once. This centralizes the resize event listeners, significantly improving performance across large applications with many responsive components.\n"
12276
12273
  },
12274
+ "forms": {
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
+ },
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&#39;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>&#39;some&#39;</code></td>\n <td>Only applies when <code>multiple: true</code>. If set to <code>&#39;all&#39;</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 =&gt; 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 =&gt; 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 =&gt; 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&#39;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>&#39;some&#39;</code></td>\n <td>Only applies when <code>multiple: true</code>. If set to <code>&#39;all&#39;</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 =&gt; 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 =&gt; 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 =&gt; 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,19 +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
12395
  {
12409
12396
  "id": "module:useWindowResize",
12410
12397
  "longname": "module:useWindowResize",
@@ -12415,7 +12402,7 @@
12415
12402
  "filename": "useWindowResize.js",
12416
12403
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
12417
12404
  },
12418
- "order": 29,
12405
+ "order": 28,
12419
12406
  "level": 0
12420
12407
  },
12421
12408
  {
@@ -12428,7 +12415,7 @@
12428
12415
  "filename": "useUluFloating.js",
12429
12416
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
12430
12417
  },
12431
- "order": 32,
12418
+ "order": 31,
12432
12419
  "level": 0
12433
12420
  },
12434
12421
  {
@@ -12441,7 +12428,7 @@
12441
12428
  "filename": "useTableData.js",
12442
12429
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
12443
12430
  },
12444
- "order": 36,
12431
+ "order": 35,
12445
12432
  "level": 0
12446
12433
  },
12447
12434
  {
@@ -12454,7 +12441,7 @@
12454
12441
  "filename": "useRequiredInject.js",
12455
12442
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
12456
12443
  },
12457
- "order": 44,
12444
+ "order": 43,
12458
12445
  "level": 0
12459
12446
  },
12460
12447
  {
@@ -12467,7 +12454,7 @@
12467
12454
  "filename": "usePagination.js",
12468
12455
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
12469
12456
  },
12470
- "order": 46,
12457
+ "order": 45,
12471
12458
  "level": 0
12472
12459
  },
12473
12460
  {
@@ -12480,7 +12467,7 @@
12480
12467
  "filename": "useModifiers.js",
12481
12468
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
12482
12469
  },
12483
- "order": 48,
12470
+ "order": 47,
12484
12471
  "level": 0
12485
12472
  },
12486
12473
  {
@@ -12493,7 +12480,7 @@
12493
12480
  "filename": "useIcon.js",
12494
12481
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
12495
12482
  },
12496
- "order": 50,
12483
+ "order": 49,
12497
12484
  "level": 0
12498
12485
  },
12499
12486
  {
@@ -12506,7 +12493,7 @@
12506
12493
  "filename": "useDocumentTitle.js",
12507
12494
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
12508
12495
  },
12509
- "order": 53,
12496
+ "order": 52,
12510
12497
  "level": 0
12511
12498
  },
12512
12499
  {
@@ -12519,7 +12506,7 @@
12519
12506
  "filename": "useBreakpointManager.js",
12520
12507
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
12521
12508
  },
12522
- "order": 55,
12509
+ "order": 54,
12523
12510
  "level": 0
12524
12511
  },
12525
12512
  {
@@ -12532,6 +12519,19 @@
12532
12519
  "filename": "index.js",
12533
12520
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/composables"
12534
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
12535
  "order": 60,
12536
12536
  "level": 0
12537
12537
  },
@@ -12614,121 +12614,121 @@
12614
12614
  "level": 0
12615
12615
  },
12616
12616
  {
12617
- "id": "module:useTooltipFollow",
12618
- "longname": "module:useTooltipFollow",
12619
- "name": "useTooltipFollow",
12620
- "kind": "module",
12621
- "meta": {
12617
+ "id": "module:useModals",
12618
+ "longname": "module:useModals",
12619
+ "name": "useModals",
12620
+ "kind": "module",
12621
+ "meta": {
12622
12622
  "lineno": 1,
12623
- "filename": "useTooltipFollow.js",
12624
- "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/popovers"
12623
+ "filename": "useModals.js",
12624
+ "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/modals"
12625
12625
  },
12626
12626
  "order": 80,
12627
12627
  "level": 0
12628
12628
  },
12629
12629
  {
12630
- "id": "module:useTooltip",
12631
- "longname": "module:useTooltip",
12632
- "name": "useTooltip",
12630
+ "id": "module:modalsPlugin",
12631
+ "longname": "module:modalsPlugin",
12632
+ "name": "modalsPlugin",
12633
12633
  "kind": "module",
12634
+ "description": "Modals plugin (adds components, global registry, etc)\n- Updated version handles both independent and global registered/triggered modals",
12634
12635
  "meta": {
12635
12636
  "lineno": 1,
12636
- "filename": "useTooltip.js",
12637
- "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/popovers"
12637
+ "filename": "index.js",
12638
+ "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/modals"
12638
12639
  },
12639
- "order": 81,
12640
+ "order": 82,
12640
12641
  "level": 0
12641
12642
  },
12642
12643
  {
12643
- "id": "module:popoversPlugin",
12644
- "longname": "module:popoversPlugin",
12645
- "name": "popoversPlugin",
12644
+ "id": "modals.module:api",
12645
+ "longname": "modals.module:api",
12646
+ "name": "api",
12646
12647
  "kind": "module",
12647
12648
  "meta": {
12648
12649
  "lineno": 1,
12649
- "filename": "index.js",
12650
- "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/popovers"
12650
+ "filename": "api.js",
12651
+ "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/modals"
12651
12652
  },
12652
- "order": 83,
12653
+ "order": 85,
12653
12654
  "level": 0
12654
12655
  },
12655
12656
  {
12656
- "id": "popovers.module:defaults",
12657
- "longname": "popovers.module:defaults",
12658
- "name": "defaults",
12657
+ "id": "module:useTooltipFollow",
12658
+ "longname": "module:useTooltipFollow",
12659
+ "name": "useTooltipFollow",
12659
12660
  "kind": "module",
12660
12661
  "meta": {
12661
12662
  "lineno": 1,
12662
- "filename": "defaults.js",
12663
+ "filename": "useTooltipFollow.js",
12663
12664
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/popovers"
12664
12665
  },
12665
- "order": 89
12666
+ "order": 94,
12667
+ "level": 0
12666
12668
  },
12667
12669
  {
12668
- "id": "module:useModals",
12669
- "longname": "module:useModals",
12670
- "name": "useModals",
12670
+ "id": "module:useTooltip",
12671
+ "longname": "module:useTooltip",
12672
+ "name": "useTooltip",
12671
12673
  "kind": "module",
12672
12674
  "meta": {
12673
12675
  "lineno": 1,
12674
- "filename": "useModals.js",
12675
- "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/modals"
12676
+ "filename": "useTooltip.js",
12677
+ "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/popovers"
12676
12678
  },
12677
- "order": 111,
12679
+ "order": 95,
12678
12680
  "level": 0
12679
12681
  },
12680
12682
  {
12681
- "id": "module:modalsPlugin",
12682
- "longname": "module:modalsPlugin",
12683
- "name": "modalsPlugin",
12683
+ "id": "module:popoversPlugin",
12684
+ "longname": "module:popoversPlugin",
12685
+ "name": "popoversPlugin",
12684
12686
  "kind": "module",
12685
- "description": "Modals plugin (adds components, global registry, etc)\n- Updated version handles both independent and global registered/triggered modals",
12686
12687
  "meta": {
12687
12688
  "lineno": 1,
12688
12689
  "filename": "index.js",
12689
- "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/modals"
12690
+ "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/popovers"
12690
12691
  },
12691
- "order": 113,
12692
+ "order": 97,
12692
12693
  "level": 0
12693
12694
  },
12694
12695
  {
12695
- "id": "modals.module:api",
12696
- "longname": "modals.module:api",
12697
- "name": "api",
12696
+ "id": "popovers.module:defaults",
12697
+ "longname": "popovers.module:defaults",
12698
+ "name": "defaults",
12698
12699
  "kind": "module",
12699
12700
  "meta": {
12700
12701
  "lineno": 1,
12701
- "filename": "api.js",
12702
- "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/modals"
12702
+ "filename": "defaults.js",
12703
+ "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/popovers"
12703
12704
  },
12704
- "order": 116,
12705
- "level": 0
12705
+ "order": 103
12706
12706
  },
12707
12707
  {
12708
- "id": "module:breakpointsPlugin",
12709
- "longname": "module:breakpointsPlugin",
12710
- "name": "breakpointsPlugin",
12708
+ "id": "module:corePlugin",
12709
+ "longname": "module:corePlugin",
12710
+ "name": "corePlugin",
12711
12711
  "kind": "module",
12712
+ "description": "Core plugin for managing shared configuration for the library.",
12712
12713
  "meta": {
12713
12714
  "lineno": 1,
12714
12715
  "filename": "index.js",
12715
- "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/breakpoints"
12716
+ "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/core"
12716
12717
  },
12717
12718
  "order": 125,
12718
12719
  "level": 0
12719
12720
  },
12720
12721
  {
12721
- "id": "module:corePlugin",
12722
- "longname": "module:corePlugin",
12723
- "name": "corePlugin",
12722
+ "id": "module:breakpointsPlugin",
12723
+ "longname": "module:breakpointsPlugin",
12724
+ "name": "breakpointsPlugin",
12724
12725
  "kind": "module",
12725
- "description": "Core plugin for managing shared configuration for the library.",
12726
12726
  "meta": {
12727
12727
  "lineno": 1,
12728
12728
  "filename": "index.js",
12729
- "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/core"
12729
+ "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/breakpoints"
12730
12730
  },
12731
- "order": 130,
12731
+ "order": 127,
12732
12732
  "level": 0
12733
12733
  },
12734
12734
  {
@@ -12812,42 +12812,6 @@
12812
12812
  "order": 73,
12813
12813
  "level": 0
12814
12814
  },
12815
- {
12816
- "id": "module:popoversPlugin--module.exports",
12817
- "longname": "module:popoversPlugin",
12818
- "name": "module.exports",
12819
- "kind": "function",
12820
- "isExported": true,
12821
- "description": "Install the UluPopovers plugin.",
12822
- "memberof": "module:popoversPlugin",
12823
- "params": [
12824
- {
12825
- "type": {
12826
- "names": [
12827
- "object"
12828
- ]
12829
- },
12830
- "description": "The Vue app instance.",
12831
- "name": "app"
12832
- },
12833
- {
12834
- "type": {
12835
- "names": [
12836
- "object"
12837
- ]
12838
- },
12839
- "description": "User-defined options to override defaults.",
12840
- "name": "userOptions"
12841
- }
12842
- ],
12843
- "meta": {
12844
- "lineno": 58,
12845
- "filename": "index.js",
12846
- "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/popovers"
12847
- },
12848
- "order": 88,
12849
- "level": 0
12850
- },
12851
12815
  {
12852
12816
  "id": "module:modalsPlugin--module.exports",
12853
12817
  "longname": "module:modalsPlugin",
@@ -12881,17 +12845,17 @@
12881
12845
  "filename": "index.js",
12882
12846
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/modals"
12883
12847
  },
12884
- "order": 115,
12848
+ "order": 84,
12885
12849
  "level": 0
12886
12850
  },
12887
12851
  {
12888
- "id": "module:breakpointsPlugin--module.exports",
12889
- "longname": "module:breakpointsPlugin",
12852
+ "id": "module:popoversPlugin--module.exports",
12853
+ "longname": "module:popoversPlugin",
12890
12854
  "name": "module.exports",
12891
12855
  "kind": "function",
12892
12856
  "isExported": true,
12893
- "description": "Installs the breakpoints plugin, providing app-wide reactive breakpoint information.\nIt uses `useBreakpointManager` internally and provides `uluIsMobile`,\n`uluBreakpointActive`, `uluBreakpointDirection`, and `uluBreakpointManager` to all components.",
12894
- "memberof": "module:breakpointsPlugin",
12857
+ "description": "Install the UluPopovers plugin.",
12858
+ "memberof": "module:popoversPlugin",
12895
12859
  "params": [
12896
12860
  {
12897
12861
  "type": {
@@ -12908,37 +12872,16 @@
12908
12872
  "object"
12909
12873
  ]
12910
12874
  },
12911
- "description": "User-defined options.",
12875
+ "description": "User-defined options to override defaults.",
12912
12876
  "name": "userOptions"
12913
- },
12914
- {
12915
- "type": {
12916
- "names": [
12917
- "string"
12918
- ]
12919
- },
12920
- "optional": true,
12921
- "defaultvalue": "\"small\"",
12922
- "description": "The breakpoint name to use for `isMobile` detection.",
12923
- "name": "userOptions.breakpointMobile"
12924
- },
12925
- {
12926
- "type": {
12927
- "names": [
12928
- "object"
12929
- ]
12930
- },
12931
- "optional": true,
12932
- "description": "Options to pass to the underlying `useBreakpointManager`.",
12933
- "name": "userOptions.managerOptions"
12934
12877
  }
12935
12878
  ],
12936
12879
  "meta": {
12937
- "lineno": 31,
12880
+ "lineno": 58,
12938
12881
  "filename": "index.js",
12939
- "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/breakpoints"
12882
+ "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/popovers"
12940
12883
  },
12941
- "order": 129,
12884
+ "order": 102,
12942
12885
  "level": 0
12943
12886
  },
12944
12887
  {
@@ -13015,6 +12958,63 @@
13015
12958
  "filename": "index.js",
13016
12959
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/core"
13017
12960
  },
12961
+ "order": 126,
12962
+ "level": 0
12963
+ },
12964
+ {
12965
+ "id": "module:breakpointsPlugin--module.exports",
12966
+ "longname": "module:breakpointsPlugin",
12967
+ "name": "module.exports",
12968
+ "kind": "function",
12969
+ "isExported": true,
12970
+ "description": "Installs the breakpoints plugin, providing app-wide reactive breakpoint information.\nIt uses `useBreakpointManager` internally and provides `uluIsMobile`,\n`uluBreakpointActive`, `uluBreakpointDirection`, and `uluBreakpointManager` to all components.",
12971
+ "memberof": "module:breakpointsPlugin",
12972
+ "params": [
12973
+ {
12974
+ "type": {
12975
+ "names": [
12976
+ "object"
12977
+ ]
12978
+ },
12979
+ "description": "The Vue app instance.",
12980
+ "name": "app"
12981
+ },
12982
+ {
12983
+ "type": {
12984
+ "names": [
12985
+ "object"
12986
+ ]
12987
+ },
12988
+ "description": "User-defined options.",
12989
+ "name": "userOptions"
12990
+ },
12991
+ {
12992
+ "type": {
12993
+ "names": [
12994
+ "string"
12995
+ ]
12996
+ },
12997
+ "optional": true,
12998
+ "defaultvalue": "\"small\"",
12999
+ "description": "The breakpoint name to use for `isMobile` detection.",
13000
+ "name": "userOptions.breakpointMobile"
13001
+ },
13002
+ {
13003
+ "type": {
13004
+ "names": [
13005
+ "object"
13006
+ ]
13007
+ },
13008
+ "optional": true,
13009
+ "description": "Options to pass to the underlying `useBreakpointManager`.",
13010
+ "name": "userOptions.managerOptions"
13011
+ }
13012
+ ],
13013
+ "meta": {
13014
+ "lineno": 31,
13015
+ "filename": "index.js",
13016
+ "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/breakpoints"
13017
+ },
13018
13018
  "order": 131,
13019
13019
  "level": 0
13020
13020
  },
@@ -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": 56
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": 57
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": 58
13064
+ "order": 57
13065
13065
  },
13066
13066
  {
13067
13067
  "id": "toast.module:defaults--module.exports",
@@ -13158,7 +13158,7 @@
13158
13158
  "filename": "defaults.js",
13159
13159
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/popovers"
13160
13160
  },
13161
- "order": 90
13161
+ "order": 104
13162
13162
  },
13163
13163
  {
13164
13164
  "id": "popovers.module:defaults.plugin.directiveName",
@@ -13178,7 +13178,7 @@
13178
13178
  "filename": "defaults.js",
13179
13179
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/popovers"
13180
13180
  },
13181
- "order": 91
13181
+ "order": 105
13182
13182
  },
13183
13183
  {
13184
13184
  "id": "popovers.module:defaults.popover",
@@ -13193,7 +13193,7 @@
13193
13193
  "filename": "defaults.js",
13194
13194
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/popovers"
13195
13195
  },
13196
- "order": 92
13196
+ "order": 106
13197
13197
  },
13198
13198
  {
13199
13199
  "id": "popovers.module:defaults.popover.inline",
@@ -13213,7 +13213,7 @@
13213
13213
  "filename": "defaults.js",
13214
13214
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/popovers"
13215
13215
  },
13216
- "order": 93
13216
+ "order": 107
13217
13217
  },
13218
13218
  {
13219
13219
  "id": "popovers.module:defaults.popover.delay",
@@ -13233,7 +13233,7 @@
13233
13233
  "filename": "defaults.js",
13234
13234
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/popovers"
13235
13235
  },
13236
- "order": 94
13236
+ "order": 108
13237
13237
  },
13238
13238
  {
13239
13239
  "id": "popovers.module:defaults.popover.placement",
@@ -13253,7 +13253,7 @@
13253
13253
  "filename": "defaults.js",
13254
13254
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/popovers"
13255
13255
  },
13256
- "order": 95
13256
+ "order": 109
13257
13257
  },
13258
13258
  {
13259
13259
  "id": "popovers.module:defaults.popover.strategy",
@@ -13273,7 +13273,7 @@
13273
13273
  "filename": "defaults.js",
13274
13274
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/popovers"
13275
13275
  },
13276
- "order": 96
13276
+ "order": 110
13277
13277
  },
13278
13278
  {
13279
13279
  "id": "popovers.module:defaults.popover.offset",
@@ -13293,7 +13293,7 @@
13293
13293
  "filename": "defaults.js",
13294
13294
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/popovers"
13295
13295
  },
13296
- "order": 97
13296
+ "order": 111
13297
13297
  },
13298
13298
  {
13299
13299
  "id": "popovers.module:defaults.popover.arrow",
@@ -13313,7 +13313,7 @@
13313
13313
  "filename": "defaults.js",
13314
13314
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/popovers"
13315
13315
  },
13316
- "order": 98
13316
+ "order": 112
13317
13317
  },
13318
13318
  {
13319
13319
  "id": "popovers.module:defaults.tooltip",
@@ -13333,7 +13333,7 @@
13333
13333
  "filename": "defaults.js",
13334
13334
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/popovers"
13335
13335
  },
13336
- "order": 99
13336
+ "order": 113
13337
13337
  },
13338
13338
  {
13339
13339
  "id": "popovers.module:defaults.tooltip.teleportTo",
@@ -13353,7 +13353,7 @@
13353
13353
  "filename": "defaults.js",
13354
13354
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/popovers"
13355
13355
  },
13356
- "order": 100
13356
+ "order": 114
13357
13357
  },
13358
13358
  {
13359
13359
  "id": "popovers.module:defaults.tooltip.class",
@@ -13375,7 +13375,7 @@
13375
13375
  "filename": "defaults.js",
13376
13376
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/popovers"
13377
13377
  },
13378
- "order": 101
13378
+ "order": 115
13379
13379
  },
13380
13380
  {
13381
13381
  "id": "popovers.module:defaults.tooltip.showEvents",
@@ -13395,7 +13395,7 @@
13395
13395
  "filename": "defaults.js",
13396
13396
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/popovers"
13397
13397
  },
13398
- "order": 102
13398
+ "order": 116
13399
13399
  },
13400
13400
  {
13401
13401
  "id": "popovers.module:defaults.tooltip.hideEvents",
@@ -13415,7 +13415,7 @@
13415
13415
  "filename": "defaults.js",
13416
13416
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/popovers"
13417
13417
  },
13418
- "order": 103
13418
+ "order": 117
13419
13419
  },
13420
13420
  {
13421
13421
  "id": "popovers.module:defaults.tooltip.isHtml",
@@ -13435,7 +13435,7 @@
13435
13435
  "filename": "defaults.js",
13436
13436
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/popovers"
13437
13437
  },
13438
- "order": 104
13438
+ "order": 118
13439
13439
  },
13440
13440
  {
13441
13441
  "id": "popovers.module:defaults.tooltip.trigger",
@@ -13456,7 +13456,7 @@
13456
13456
  "filename": "defaults.js",
13457
13457
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/popovers"
13458
13458
  },
13459
- "order": 105
13459
+ "order": 119
13460
13460
  },
13461
13461
  {
13462
13462
  "id": "popovers.module:defaults.tooltip.content",
@@ -13477,7 +13477,7 @@
13477
13477
  "filename": "defaults.js",
13478
13478
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/popovers"
13479
13479
  },
13480
- "order": 106
13480
+ "order": 120
13481
13481
  },
13482
13482
  {
13483
13483
  "id": "popovers.module:defaults.tooltip.delay",
@@ -13497,7 +13497,7 @@
13497
13497
  "filename": "defaults.js",
13498
13498
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/popovers"
13499
13499
  },
13500
- "order": 107
13500
+ "order": 121
13501
13501
  },
13502
13502
  {
13503
13503
  "id": "popovers.module:defaults.tooltip.onReady",
@@ -13512,7 +13512,7 @@
13512
13512
  "filename": "defaults.js",
13513
13513
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/popovers"
13514
13514
  },
13515
- "order": 108
13515
+ "order": 122
13516
13516
  },
13517
13517
  {
13518
13518
  "id": "popovers.module:defaults.tooltip.component",
@@ -13527,7 +13527,7 @@
13527
13527
  "filename": "defaults.js",
13528
13528
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/popovers"
13529
13529
  },
13530
- "order": 109
13530
+ "order": 123
13531
13531
  },
13532
13532
  {
13533
13533
  "id": "popovers.module:defaults.tooltip.componentProps",
@@ -13542,7 +13542,7 @@
13542
13542
  "filename": "defaults.js",
13543
13543
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/popovers"
13544
13544
  },
13545
- "order": 110
13545
+ "order": 124
13546
13546
  },
13547
13547
  {
13548
13548
  "id": "module:breakpointsPlugin--module.exports~defaults.breakpointMobile",
@@ -13557,7 +13557,7 @@
13557
13557
  "filename": "index.js",
13558
13558
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/breakpoints"
13559
13559
  },
13560
- "order": 127,
13560
+ "order": 129,
13561
13561
  "level": 0
13562
13562
  },
13563
13563
  {
@@ -13573,7 +13573,7 @@
13573
13573
  "filename": "index.js",
13574
13574
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/breakpoints"
13575
13575
  },
13576
- "order": 128,
13576
+ "order": 130,
13577
13577
  "level": 0
13578
13578
  },
13579
13579
  {
@@ -13647,6 +13647,42 @@
13647
13647
  "order": 68,
13648
13648
  "level": 0
13649
13649
  },
13650
+ {
13651
+ "id": "module:useModals.useModals",
13652
+ "longname": "module:useModals.useModals",
13653
+ "name": "useModals",
13654
+ "kind": "constant",
13655
+ "scope": "static",
13656
+ "description": "A composable to access the global modals API.\nThis is a simple wrapper around `inject('uluModals')` and throws an error if the plugin is not installed.",
13657
+ "memberof": "module:useModals",
13658
+ "returns": [
13659
+ {
13660
+ "type": {
13661
+ "names": [
13662
+ "object"
13663
+ ]
13664
+ },
13665
+ "description": "The modals API with methods like `open`, `close`, `add`, `remove`, and `get`."
13666
+ }
13667
+ ],
13668
+ "exceptions": [
13669
+ {
13670
+ "type": {
13671
+ "names": [
13672
+ "Error"
13673
+ ]
13674
+ },
13675
+ "description": "If the modals plugin is not installed."
13676
+ }
13677
+ ],
13678
+ "meta": {
13679
+ "lineno": 13,
13680
+ "filename": "useModals.js",
13681
+ "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/modals"
13682
+ },
13683
+ "order": 81,
13684
+ "level": 0
13685
+ },
13650
13686
  {
13651
13687
  "id": "module:popoversPlugin--module.exports.POPOVER_OPTIONS_KEY",
13652
13688
  "longname": "module:popoversPlugin.POPOVER_OPTIONS_KEY",
@@ -13660,7 +13696,7 @@
13660
13696
  "filename": "index.js",
13661
13697
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/popovers"
13662
13698
  },
13663
- "order": 84,
13699
+ "order": 98,
13664
13700
  "level": 0
13665
13701
  },
13666
13702
  {
@@ -13676,7 +13712,7 @@
13676
13712
  "filename": "index.js",
13677
13713
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/popovers"
13678
13714
  },
13679
- "order": 85,
13715
+ "order": 99,
13680
13716
  "level": 0
13681
13717
  },
13682
13718
  {
@@ -13692,7 +13728,7 @@
13692
13728
  "filename": "index.js",
13693
13729
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/popovers"
13694
13730
  },
13695
- "order": 86,
13731
+ "order": 100,
13696
13732
  "level": 0
13697
13733
  },
13698
13734
  {
@@ -13739,43 +13775,7 @@
13739
13775
  "filename": "index.js",
13740
13776
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/popovers"
13741
13777
  },
13742
- "order": 87,
13743
- "level": 0
13744
- },
13745
- {
13746
- "id": "module:useModals.useModals",
13747
- "longname": "module:useModals.useModals",
13748
- "name": "useModals",
13749
- "kind": "constant",
13750
- "scope": "static",
13751
- "description": "A composable to access the global modals API.\nThis is a simple wrapper around `inject('uluModals')` and throws an error if the plugin is not installed.",
13752
- "memberof": "module:useModals",
13753
- "returns": [
13754
- {
13755
- "type": {
13756
- "names": [
13757
- "object"
13758
- ]
13759
- },
13760
- "description": "The modals API with methods like `open`, `close`, `add`, `remove`, and `get`."
13761
- }
13762
- ],
13763
- "exceptions": [
13764
- {
13765
- "type": {
13766
- "names": [
13767
- "Error"
13768
- ]
13769
- },
13770
- "description": "If the modals plugin is not installed."
13771
- }
13772
- ],
13773
- "meta": {
13774
- "lineno": 13,
13775
- "filename": "useModals.js",
13776
- "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/modals"
13777
- },
13778
- "order": 112,
13778
+ "order": 101,
13779
13779
  "level": 0
13780
13780
  },
13781
13781
  {
@@ -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": 31,
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": 35,
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": 37,
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": 45,
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": 47,
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": 49,
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": 51,
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": 54,
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": 59,
15050
+ "order": 58,
15051
15051
  "level": 0
15052
15052
  },
15053
15053
  {
@@ -15142,7 +15142,7 @@
15142
15142
  "filename": "useTooltip.js",
15143
15143
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/popovers"
15144
15144
  },
15145
- "order": 82,
15145
+ "order": 96,
15146
15146
  "level": 0
15147
15147
  },
15148
15148
  {
@@ -15435,7 +15435,7 @@
15435
15435
  "filename": "api.js",
15436
15436
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/modals"
15437
15437
  },
15438
- "order": 118,
15438
+ "order": 87,
15439
15439
  "level": 0
15440
15440
  },
15441
15441
  {
@@ -15451,7 +15451,7 @@
15451
15451
  "filename": "api.js",
15452
15452
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/modals"
15453
15453
  },
15454
- "order": 119,
15454
+ "order": 88,
15455
15455
  "level": 0
15456
15456
  },
15457
15457
  {
@@ -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": 43,
15488
+ "order": 42,
15489
15489
  "level": 0
15490
15490
  },
15491
15491
  {
@@ -15502,7 +15502,7 @@
15502
15502
  "filename": "api.js",
15503
15503
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/modals"
15504
15504
  },
15505
- "order": 117,
15505
+ "order": 86,
15506
15506
  "level": 0
15507
15507
  },
15508
15508
  {
@@ -15519,7 +15519,7 @@
15519
15519
  "filename": "api.js",
15520
15520
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/modals"
15521
15521
  },
15522
- "order": 120,
15522
+ "order": 89,
15523
15523
  "level": 0
15524
15524
  },
15525
15525
  {
@@ -15536,7 +15536,7 @@
15536
15536
  "filename": "index.js",
15537
15537
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/breakpoints"
15538
15538
  },
15539
- "order": 126,
15539
+ "order": 128,
15540
15540
  "level": 0
15541
15541
  },
15542
15542
  {
@@ -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": 30,
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": 38,
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": 39,
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": 40,
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": 41,
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": 42,
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": 52,
15726
+ "order": 51,
15727
15727
  "level": 0
15728
15728
  },
15729
15729
  {
@@ -15754,7 +15754,7 @@
15754
15754
  "filename": "api.js",
15755
15755
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/modals"
15756
15756
  },
15757
- "order": 121,
15757
+ "order": 90,
15758
15758
  "level": 0
15759
15759
  },
15760
15760
  {
@@ -15780,7 +15780,7 @@
15780
15780
  "filename": "api.js",
15781
15781
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/modals"
15782
15782
  },
15783
- "order": 122,
15783
+ "order": 91,
15784
15784
  "level": 0
15785
15785
  },
15786
15786
  {
@@ -15796,7 +15796,7 @@
15796
15796
  "filename": "api.js",
15797
15797
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/modals"
15798
15798
  },
15799
- "order": 123,
15799
+ "order": 92,
15800
15800
  "level": 0
15801
15801
  },
15802
15802
  {
@@ -15822,7 +15822,7 @@
15822
15822
  "filename": "api.js",
15823
15823
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/modals"
15824
15824
  },
15825
- "order": 124,
15825
+ "order": 93,
15826
15826
  "level": 0
15827
15827
  },
15828
15828
  {
@@ -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": 33,
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": 34,
16267
+ "order": 33,
16268
16268
  "level": 0
16269
16269
  },
16270
16270
  {
@@ -16305,7 +16305,7 @@
16305
16305
  "filename": "index.js",
16306
16306
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins/modals"
16307
16307
  },
16308
- "order": 114,
16308
+ "order": 83,
16309
16309
  "level": 0
16310
16310
  }
16311
16311
  ],