@ulu/frontend-vue 0.6.8 → 0.6.9

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.
@@ -1 +1 @@
1
- {"version":3,"file":"UluTab.vue.d.ts","sourceRoot":"","sources":["../../../lib/components/collapsible/UluTab.vue"],"names":[],"mappings":"AAKA;wBAsEqB,uBAAuB,CAAC,OAAO,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;;6BAEtE,CAAC,EAAE,CAAC;;;AATjC,6SAMG"}
1
+ {"version":3,"file":"UluTab.vue.d.ts","sourceRoot":"","sources":["../../../lib/components/collapsible/UluTab.vue"],"names":[],"mappings":"AAKA;wBAyEqB,uBAAuB,CAAC,OAAO,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;;6BAEtE,CAAC,EAAE,CAAC;;;AATjC,6SAMG"}
@@ -1,11 +1,11 @@
1
- import { createBlock as t, openBlock as o, unref as a, withCtx as l, renderSlot as n, normalizeProps as u, guardReactiveProps as p } from "vue";
2
- import { Tab as s } from "@headlessui/vue";
1
+ import { createBlock as t, openBlock as a, unref as o, withCtx as s, renderSlot as l, normalizeProps as _, guardReactiveProps as c } from "vue";
2
+ import { Tab as n } from "@headlessui/vue";
3
3
  const i = {
4
4
  __name: "UluTab",
5
- setup(c) {
6
- return (e, _) => (o(), t(a(s), null, {
7
- default: l((r) => [
8
- n(e.$slots, "default", u(p(r)))
5
+ setup(p) {
6
+ return (e, u) => (a(), t(o(n), { class: "tabs__tab" }, {
7
+ default: s((r) => [
8
+ l(e.$slots, "default", _(c(r)))
9
9
  ]),
10
10
  _: 3
11
11
  }));
@@ -5,10 +5,14 @@ type __VLS_WithTemplateSlots<T, S> = T & (new () => {
5
5
  });
6
6
  declare const __VLS_component: import('vue').DefineComponent<{}, {
7
7
  vertical: boolean;
8
+ sticky: boolean;
9
+ transparent: boolean;
8
10
  modifiers?: string | unknown[] | undefined;
9
11
  defaultIndex?: number | undefined;
10
12
  $props: {
11
13
  readonly vertical?: boolean | undefined;
14
+ readonly sticky?: boolean | undefined;
15
+ readonly transparent?: boolean | undefined;
12
16
  readonly modifiers?: string | unknown[] | undefined;
13
17
  readonly defaultIndex?: number | undefined;
14
18
  };
@@ -1 +1 @@
1
- {"version":3,"file":"UluTabGroup.vue.d.ts","sourceRoot":"","sources":["../../../lib/components/collapsible/UluTabGroup.vue"],"names":[],"mappings":"AAoBA;wBAmJqB,uBAAuB,CAAC,OAAO,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;;6BAEtE,CAAC,EAAE,CAAC;;;AAVjC;;;;;;;;;2OAOG"}
1
+ {"version":3,"file":"UluTabGroup.vue.d.ts","sourceRoot":"","sources":["../../../lib/components/collapsible/UluTabGroup.vue"],"names":[],"mappings":"AAeA;wBA2KqB,uBAAuB,CAAC,OAAO,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;;6BAEtE,CAAC,EAAE,CAAC;;;AAVjC;;;;;;;;;;;;;2OAOG"}
@@ -1,7 +1,7 @@
1
- import { createBlock as l, openBlock as i, unref as t, withCtx as n, createElementVNode as d, mergeProps as c, renderSlot as u, normalizeProps as f, guardReactiveProps as m } from "vue";
2
- import { TabGroup as p } from "@headlessui/vue";
3
- import { useModifiers as v } from "../../composables/useModifiers.js";
4
- const h = /* @__PURE__ */ Object.assign({
1
+ import { computed as n, createBlock as i, openBlock as l, unref as a, withCtx as c, createElementVNode as d, mergeProps as u, renderSlot as f, normalizeProps as p, guardReactiveProps as m } from "vue";
2
+ import { TabGroup as v } from "@headlessui/vue";
3
+ import { useModifiers as b } from "../../composables/useModifiers.js";
4
+ const y = /* @__PURE__ */ Object.assign({
5
5
  inheritAttrs: !1
6
6
  }, {
7
7
  __name: "UluTabGroup",
@@ -14,27 +14,38 @@ const h = /* @__PURE__ */ Object.assign({
14
14
  * Whether or not to use vertical layout
15
15
  */
16
16
  vertical: Boolean,
17
+ /**
18
+ * Whether or not to use sticky modifier (tablist)
19
+ */
20
+ sticky: Boolean,
21
+ /**
22
+ * Whether or not to use transparent modifier (tab panels)
23
+ */
24
+ transparent: Boolean,
17
25
  /**
18
26
  * Class modifiers (ie. 'transparent', 'secondary', etc)
19
27
  */
20
28
  modifiers: [String, Array]
21
29
  },
22
- setup(e) {
23
- const a = e, { resolvedModifiers: s } = v({ props: a, baseClass: "tabs" });
24
- return (r, b) => (i(), l(t(p), {
25
- defaultIndex: e.defaultIndex,
26
- vertical: e.vertical
30
+ setup(t) {
31
+ const e = t, { resolvedModifiers: s } = b({
32
+ props: e,
33
+ baseClass: "tabs",
34
+ internal: n(() => ({
35
+ vertical: e.vertical,
36
+ sticky: e.sticky,
37
+ transparent: e.transparent
38
+ }))
39
+ });
40
+ return (r, k) => (l(), i(a(v), {
41
+ defaultIndex: t.defaultIndex,
42
+ vertical: t.vertical
27
43
  }, {
28
- default: n((o) => [
29
- d("div", c(r.$attrs, {
30
- class: ["tabs", [
31
- t(s),
32
- {
33
- "tabs--vertical": e.vertical
34
- }
35
- ]]
44
+ default: c((o) => [
45
+ d("div", u(r.$attrs, {
46
+ class: ["tabs", a(s)]
36
47
  }), [
37
- u(r.$slots, "default", f(m(o)))
48
+ f(r.$slots, "default", p(m(o)))
38
49
  ], 16)
39
50
  ]),
40
51
  _: 3
@@ -42,5 +53,5 @@ const h = /* @__PURE__ */ Object.assign({
42
53
  }
43
54
  });
44
55
  export {
45
- h as default
56
+ y as default
46
57
  };
@@ -1 +1 @@
1
- {"version":3,"file":"UluTabPanel.vue.d.ts","sourceRoot":"","sources":["../../../lib/components/collapsible/UluTabPanel.vue"],"names":[],"mappings":"AAKA;wBAsEqB,uBAAuB,CAAC,OAAO,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;;6BAEtE,CAAC,EAAE,CAAC;;;AATjC,6SAMG"}
1
+ {"version":3,"file":"UluTabPanel.vue.d.ts","sourceRoot":"","sources":["../../../lib/components/collapsible/UluTabPanel.vue"],"names":[],"mappings":"AAKA;wBAyEqB,uBAAuB,CAAC,OAAO,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;;6BAEtE,CAAC,EAAE,CAAC;;;AATjC,6SAMG"}
@@ -1,11 +1,11 @@
1
- import { createBlock as t, openBlock as a, unref as o, withCtx as l, renderSlot as n, normalizeProps as u, guardReactiveProps as p } from "vue";
2
- import { TabPanel as s } from "@headlessui/vue";
1
+ import { createBlock as r, openBlock as t, unref as o, withCtx as l, renderSlot as n, normalizeProps as s, guardReactiveProps as p } from "vue";
2
+ import { TabPanel as _ } from "@headlessui/vue";
3
3
  const i = {
4
4
  __name: "UluTabPanel",
5
5
  setup(c) {
6
- return (e, _) => (a(), t(o(s), null, {
7
- default: l((r) => [
8
- n(e.$slots, "default", u(p(r)))
6
+ return (e, u) => (t(), r(o(_), { class: "tabs__tabpanel" }, {
7
+ default: l((a) => [
8
+ n(e.$slots, "default", s(p(a)))
9
9
  ]),
10
10
  _: 3
11
11
  }));
@@ -5,13 +5,13 @@ type __VLS_WithTemplateSlots<T, S> = T & (new () => {
5
5
  });
6
6
  declare const __VLS_component: import('vue').DefineComponent<{}, {
7
7
  iconOnly: boolean;
8
+ transparent: boolean;
8
9
  iconBefore: boolean;
9
10
  primary: boolean;
10
11
  secondary: boolean;
11
12
  small: boolean;
12
13
  large: boolean;
13
14
  outline: boolean;
14
- transparent: boolean;
15
15
  noMargin: boolean;
16
16
  type?: string | undefined;
17
17
  size?: string | undefined;
@@ -26,13 +26,13 @@ declare const __VLS_component: import('vue').DefineComponent<{}, {
26
26
  ariaLabel?: string | undefined;
27
27
  $props: {
28
28
  readonly iconOnly?: boolean | undefined;
29
+ readonly transparent?: boolean | undefined;
29
30
  readonly iconBefore?: boolean | undefined;
30
31
  readonly primary?: boolean | undefined;
31
32
  readonly secondary?: boolean | undefined;
32
33
  readonly small?: boolean | undefined;
33
34
  readonly large?: boolean | undefined;
34
35
  readonly outline?: boolean | undefined;
35
- readonly transparent?: boolean | undefined;
36
36
  readonly noMargin?: boolean | undefined;
37
37
  readonly type?: string | undefined;
38
38
  readonly size?: string | undefined;
@@ -211,34 +211,6 @@
211
211
  "UluFormActions": [],
212
212
  "UluForm": [],
213
213
  "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
214
  "UluTag": [],
243
215
  "UluTable": [
244
216
  {
@@ -462,6 +434,34 @@
462
434
  }
463
435
  ],
464
436
  "UluAlert": [],
437
+ "UluTabGroup": [
438
+ {
439
+ "title": "Default",
440
+ "description": "Default variation",
441
+ "code": "<UluTabGroup>Content</UluTabGroup>"
442
+ },
443
+ {
444
+ "title": "Vertical",
445
+ "description": "Vertical variation",
446
+ "code": "<UluTabGroup vertical>Content</UluTabGroup>"
447
+ },
448
+ {
449
+ "title": "DefaultIndex",
450
+ "description": "DefaultIndex variation",
451
+ "code": "<UluTabGroup :defaultIndex=\"2\">Content</UluTabGroup>"
452
+ },
453
+ {
454
+ "title": "FullWidth",
455
+ "description": "FullWidth variation",
456
+ "code": "<UluTabGroup modifiers=\"{...}\">Content</UluTabGroup>"
457
+ }
458
+ ],
459
+ "UluOverflowPopover": [],
460
+ "UluModal": [],
461
+ "UluDropdown": [],
462
+ "UluCollapsible": [],
463
+ "UluAccordionGroup": [],
464
+ "UluAccordion": [],
465
465
  "UluTableSticky": [
466
466
  {
467
467
  "title": "Default",
@@ -3444,6 +3444,16 @@
3444
3444
  "type": "boolean",
3445
3445
  "description": "Whether or not to use vertical layout"
3446
3446
  },
3447
+ {
3448
+ "name": "sticky",
3449
+ "type": "boolean",
3450
+ "description": "Whether or not to use sticky modifier (tablist)"
3451
+ },
3452
+ {
3453
+ "name": "transparent",
3454
+ "type": "boolean",
3455
+ "description": "Whether or not to use transparent modifier (tab panels)"
3456
+ },
3447
3457
  {
3448
3458
  "name": "modifiers",
3449
3459
  "type": "string|array",
@@ -9565,6 +9575,20 @@
9565
9575
  "name": "boolean"
9566
9576
  }
9567
9577
  },
9578
+ {
9579
+ "name": "sticky",
9580
+ "description": "Whether or not to use sticky modifier (tablist)",
9581
+ "type": {
9582
+ "name": "boolean"
9583
+ }
9584
+ },
9585
+ {
9586
+ "name": "transparent",
9587
+ "description": "Whether or not to use transparent modifier (tab panels)",
9588
+ "type": {
9589
+ "name": "boolean"
9590
+ }
9591
+ },
9568
9592
  {
9569
9593
  "name": "modifiers",
9570
9594
  "description": "Class modifiers (ie. 'transparent', 'secondary', etc)",
@@ -12204,12 +12228,12 @@
12204
12228
  "useBreakpointManager": {
12205
12229
  "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```"
12206
12230
  },
12207
- "core": {
12208
- "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"
12209
- },
12210
12231
  "modals": {
12211
12232
  "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} />"
12212
12233
  },
12234
+ "core": {
12235
+ "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"
12236
+ },
12213
12237
  "breakpoints": {
12214
12238
  "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"
12215
12239
  },
@@ -12282,6 +12306,19 @@
12282
12306
  "order": 5,
12283
12307
  "level": 0
12284
12308
  },
12309
+ {
12310
+ "id": "plugins\nResponsible for exporting all plugins\n- Used in bundle exportsmodule:",
12311
+ "longname": "plugins\nResponsible for exporting all plugins\n- Used in bundle exportsmodule:",
12312
+ "name": "plugins\nResponsible for exporting all plugins\n- Used in bundle exports",
12313
+ "kind": "module",
12314
+ "meta": {
12315
+ "lineno": 1,
12316
+ "filename": "index.js",
12317
+ "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins"
12318
+ },
12319
+ "order": 6,
12320
+ "level": 0
12321
+ },
12285
12322
  {
12286
12323
  "id": "utils.module:router",
12287
12324
  "longname": "utils.module:router",
@@ -12292,7 +12329,7 @@
12292
12329
  "filename": "router.js",
12293
12330
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/utils"
12294
12331
  },
12295
- "order": 6,
12332
+ "order": 7,
12296
12333
  "level": 0
12297
12334
  },
12298
12335
  {
@@ -12305,7 +12342,7 @@
12305
12342
  "filename": "props.js",
12306
12343
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/utils"
12307
12344
  },
12308
- "order": 21,
12345
+ "order": 22,
12309
12346
  "level": 0
12310
12347
  },
12311
12348
  {
@@ -12318,7 +12355,7 @@
12318
12355
  "filename": "index.js",
12319
12356
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/utils"
12320
12357
  },
12321
- "order": 24,
12358
+ "order": 25,
12322
12359
  "level": 0
12323
12360
  },
12324
12361
  {
@@ -12331,20 +12368,7 @@
12331
12368
  "filename": "dom.js",
12332
12369
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/utils"
12333
12370
  },
12334
- "order": 25,
12335
- "level": 0
12336
- },
12337
- {
12338
- "id": "plugins\nResponsible for exporting all plugins\n- Used in bundle exportsmodule:",
12339
- "longname": "plugins\nResponsible for exporting all plugins\n- Used in bundle exportsmodule:",
12340
- "name": "plugins\nResponsible for exporting all plugins\n- Used in bundle exports",
12341
- "kind": "module",
12342
- "meta": {
12343
- "lineno": 1,
12344
- "filename": "index.js",
12345
- "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/plugins"
12346
- },
12347
- "order": 28,
12371
+ "order": 26,
12348
12372
  "level": 0
12349
12373
  },
12350
12374
  {
@@ -13810,7 +13834,7 @@
13810
13834
  "filename": "router.js",
13811
13835
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/utils"
13812
13836
  },
13813
- "order": 7,
13837
+ "order": 8,
13814
13838
  "level": 0
13815
13839
  },
13816
13840
  {
@@ -13874,7 +13898,7 @@
13874
13898
  "filename": "router.js",
13875
13899
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/utils"
13876
13900
  },
13877
- "order": 9,
13901
+ "order": 10,
13878
13902
  "level": 0
13879
13903
  },
13880
13904
  {
@@ -13911,7 +13935,7 @@
13911
13935
  "filename": "router.js",
13912
13936
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/utils"
13913
13937
  },
13914
- "order": 10,
13938
+ "order": 11,
13915
13939
  "level": 0
13916
13940
  },
13917
13941
  {
@@ -13984,7 +14008,7 @@
13984
14008
  "filename": "router.js",
13985
14009
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/utils"
13986
14010
  },
13987
- "order": 11,
14011
+ "order": 12,
13988
14012
  "level": 0
13989
14013
  },
13990
14014
  {
@@ -14021,7 +14045,7 @@
14021
14045
  "filename": "router.js",
14022
14046
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/utils"
14023
14047
  },
14024
- "order": 12,
14048
+ "order": 13,
14025
14049
  "level": 0
14026
14050
  },
14027
14051
  {
@@ -14094,7 +14118,7 @@
14094
14118
  "filename": "router.js",
14095
14119
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/utils"
14096
14120
  },
14097
- "order": 13,
14121
+ "order": 14,
14098
14122
  "level": 0
14099
14123
  },
14100
14124
  {
@@ -14131,7 +14155,7 @@
14131
14155
  "filename": "router.js",
14132
14156
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/utils"
14133
14157
  },
14134
- "order": 14,
14158
+ "order": 15,
14135
14159
  "level": 0
14136
14160
  },
14137
14161
  {
@@ -14167,7 +14191,7 @@
14167
14191
  "filename": "router.js",
14168
14192
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/utils"
14169
14193
  },
14170
- "order": 15,
14194
+ "order": 16,
14171
14195
  "level": 0
14172
14196
  },
14173
14197
  {
@@ -14203,7 +14227,7 @@
14203
14227
  "filename": "router.js",
14204
14228
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/utils"
14205
14229
  },
14206
- "order": 16,
14230
+ "order": 17,
14207
14231
  "level": 0
14208
14232
  },
14209
14233
  {
@@ -14241,7 +14265,7 @@
14241
14265
  "filename": "router.js",
14242
14266
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/utils"
14243
14267
  },
14244
- "order": 17,
14268
+ "order": 18,
14245
14269
  "level": 0
14246
14270
  },
14247
14271
  {
@@ -14288,7 +14312,7 @@
14288
14312
  "filename": "router.js",
14289
14313
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/utils"
14290
14314
  },
14291
- "order": 18,
14315
+ "order": 19,
14292
14316
  "level": 0
14293
14317
  },
14294
14318
  {
@@ -14361,7 +14385,7 @@
14361
14385
  "filename": "router.js",
14362
14386
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/utils"
14363
14387
  },
14364
- "order": 19,
14388
+ "order": 20,
14365
14389
  "level": 0
14366
14390
  },
14367
14391
  {
@@ -14398,7 +14422,7 @@
14398
14422
  "filename": "router.js",
14399
14423
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/utils"
14400
14424
  },
14401
- "order": 20,
14425
+ "order": 21,
14402
14426
  "level": 0
14403
14427
  },
14404
14428
  {
@@ -14435,7 +14459,7 @@
14435
14459
  "filename": "props.js",
14436
14460
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/utils"
14437
14461
  },
14438
- "order": 22,
14462
+ "order": 23,
14439
14463
  "level": 0
14440
14464
  },
14441
14465
  {
@@ -14480,7 +14504,7 @@
14480
14504
  "filename": "props.js",
14481
14505
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/utils"
14482
14506
  },
14483
- "order": 23,
14507
+ "order": 24,
14484
14508
  "level": 0
14485
14509
  },
14486
14510
  {
@@ -14518,7 +14542,7 @@
14518
14542
  "filename": "dom.js",
14519
14543
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/utils"
14520
14544
  },
14521
- "order": 26,
14545
+ "order": 27,
14522
14546
  "level": 0
14523
14547
  },
14524
14548
  {
@@ -14557,7 +14581,7 @@
14557
14581
  "filename": "dom.js",
14558
14582
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/utils"
14559
14583
  },
14560
- "order": 27,
14584
+ "order": 28,
14561
14585
  "level": 0
14562
14586
  },
14563
14587
  {
@@ -16099,7 +16123,7 @@
16099
16123
  "filename": "router.js",
16100
16124
  "path": "/Users/joescherben/Personal/Projects/ULU/frontend-vue/lib/utils"
16101
16125
  },
16102
- "order": 8,
16126
+ "order": 9,
16103
16127
  "level": 0
16104
16128
  },
16105
16129
  {
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <Tab v-slot="slotProps">
2
+ <Tab class="tabs__tab" v-slot="slotProps">
3
3
  <slot v-bind="slotProps"/>
4
4
  </Tab>
5
5
  </template>
@@ -7,12 +7,7 @@
7
7
  <div
8
8
  v-bind="$attrs"
9
9
  class="tabs"
10
- :class="[
11
- resolvedModifiers,
12
- {
13
- 'tabs--vertical' : vertical
14
- }
15
- ]"
10
+ :class="resolvedModifiers"
16
11
  >
17
12
  <slot v-bind="slotProps"/>
18
13
  </div>
@@ -20,6 +15,7 @@
20
15
  </template>
21
16
 
22
17
  <script setup>
18
+ import { computed } from "vue";
23
19
  import { TabGroup } from "@headlessui/vue";
24
20
  import { useModifiers } from "../../composables/useModifiers.js";
25
21
 
@@ -36,11 +32,27 @@
36
32
  * Whether or not to use vertical layout
37
33
  */
38
34
  vertical: Boolean,
35
+ /**
36
+ * Whether or not to use sticky modifier (tablist)
37
+ */
38
+ sticky: Boolean,
39
+ /**
40
+ * Whether or not to use transparent modifier (tab panels)
41
+ */
42
+ transparent: Boolean,
39
43
  /**
40
44
  * Class modifiers (ie. 'transparent', 'secondary', etc)
41
45
  */
42
46
  modifiers: [String, Array]
43
47
  });
44
48
 
45
- const { resolvedModifiers } = useModifiers({ props, baseClass: "tabs" });
49
+ const { resolvedModifiers } = useModifiers({
50
+ props,
51
+ baseClass: "tabs",
52
+ internal: computed(() => ({
53
+ "vertical" : props.vertical,
54
+ "sticky" : props.sticky,
55
+ "transparent" : props.transparent
56
+ }))
57
+ });
46
58
  </script>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <TabPanel v-slot="slotProps">
2
+ <TabPanel v-slot="slotProps" class="tabs__tabpanel">
3
3
  <slot v-bind="slotProps"/>
4
4
  </TabPanel>
5
5
  </template>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ulu/frontend-vue",
3
- "version": "0.6.8",
3
+ "version": "0.6.9",
4
4
  "description": "A modular, tree-shakeable Vue 3 component library for the Ulu Frontend theming system, plus general utilities for Vue development",
5
5
  "type": "module",
6
6
  "files": [