@baklavue/mcp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/README.md +72 -0
  2. package/dist/data/component-categories.d.ts +7 -0
  3. package/dist/data/component-categories.js +48 -0
  4. package/dist/data/loaders.d.ts +22 -0
  5. package/dist/data/loaders.js +346 -0
  6. package/dist/docs/components/accordion.md +601 -0
  7. package/dist/docs/components/alert.md +233 -0
  8. package/dist/docs/components/badge.md +100 -0
  9. package/dist/docs/components/banner.md +231 -0
  10. package/dist/docs/components/button.md +324 -0
  11. package/dist/docs/components/checkbox.md +343 -0
  12. package/dist/docs/components/chip.md +199 -0
  13. package/dist/docs/components/datepicker.md +243 -0
  14. package/dist/docs/components/dialog.md +224 -0
  15. package/dist/docs/components/drawer.md +188 -0
  16. package/dist/docs/components/dropdown.md +291 -0
  17. package/dist/docs/components/file-upload.md +248 -0
  18. package/dist/docs/components/icon.md +142 -0
  19. package/dist/docs/components/image.md +161 -0
  20. package/dist/docs/components/index.md +151 -0
  21. package/dist/docs/components/input.md +407 -0
  22. package/dist/docs/components/link.md +249 -0
  23. package/dist/docs/components/notification.md +179 -0
  24. package/dist/docs/components/pagination.md +168 -0
  25. package/dist/docs/components/radio.md +221 -0
  26. package/dist/docs/components/scroll-to-top.md +90 -0
  27. package/dist/docs/components/select.md +239 -0
  28. package/dist/docs/components/skeleton.md +79 -0
  29. package/dist/docs/components/spinner.md +93 -0
  30. package/dist/docs/components/split-button.md +165 -0
  31. package/dist/docs/components/stepper.md +337 -0
  32. package/dist/docs/components/switch.md +144 -0
  33. package/dist/docs/components/tab.md +140 -0
  34. package/dist/docs/components/table.md +362 -0
  35. package/dist/docs/components/tag.md +243 -0
  36. package/dist/docs/components/textarea.md +190 -0
  37. package/dist/docs/components/tooltip.md +155 -0
  38. package/dist/docs/composables/alert.md +87 -0
  39. package/dist/docs/composables/asyncState.md +74 -0
  40. package/dist/docs/composables/base64.md +72 -0
  41. package/dist/docs/composables/breakpoints.md +129 -0
  42. package/dist/docs/composables/clipboard.md +108 -0
  43. package/dist/docs/composables/colorScheme.md +110 -0
  44. package/dist/docs/composables/confirmDialog.md +105 -0
  45. package/dist/docs/composables/containerScroll.md +89 -0
  46. package/dist/docs/composables/cookie.md +137 -0
  47. package/dist/docs/composables/debounce.md +69 -0
  48. package/dist/docs/composables/disclosure.md +69 -0
  49. package/dist/docs/composables/elementSize.md +84 -0
  50. package/dist/docs/composables/fetch.md +257 -0
  51. package/dist/docs/composables/fieldArray.md +104 -0
  52. package/dist/docs/composables/file.md +343 -0
  53. package/dist/docs/composables/focusTrap.md +87 -0
  54. package/dist/docs/composables/formPersistence.md +69 -0
  55. package/dist/docs/composables/formState.md +71 -0
  56. package/dist/docs/composables/formValidation.md +355 -0
  57. package/dist/docs/composables/format.md +107 -0
  58. package/dist/docs/composables/id.md +54 -0
  59. package/dist/docs/composables/index.md +112 -0
  60. package/dist/docs/composables/infiniteQuery.md +104 -0
  61. package/dist/docs/composables/intersectionObserver.md +64 -0
  62. package/dist/docs/composables/lazyQuery.md +68 -0
  63. package/dist/docs/composables/loading.md +91 -0
  64. package/dist/docs/composables/mutation.md +83 -0
  65. package/dist/docs/composables/notification.md +169 -0
  66. package/dist/docs/composables/pagination.md +109 -0
  67. package/dist/docs/composables/polling.md +76 -0
  68. package/dist/docs/composables/previous.md +58 -0
  69. package/dist/docs/composables/query.md +248 -0
  70. package/dist/docs/composables/raf.md +78 -0
  71. package/dist/docs/composables/scrollLock.md +46 -0
  72. package/dist/docs/composables/scrollToError.md +291 -0
  73. package/dist/docs/composables/scrollVisibility.md +60 -0
  74. package/dist/docs/composables/share.md +78 -0
  75. package/dist/docs/composables/slug.md +58 -0
  76. package/dist/docs/composables/stepper.md +117 -0
  77. package/dist/docs/composables/stepperForm.md +74 -0
  78. package/dist/docs/composables/sticky.md +91 -0
  79. package/dist/docs/composables/storage.md +193 -0
  80. package/dist/docs/composables/theme.md +252 -0
  81. package/dist/docs/composables/themePreset.md +62 -0
  82. package/dist/docs/composables/throttle.md +76 -0
  83. package/dist/docs/composables/timer.md +78 -0
  84. package/dist/docs/composables/toggle.md +55 -0
  85. package/dist/docs/guide/contributing.md +364 -0
  86. package/dist/docs/guide/design-tokens.md +29 -0
  87. package/dist/docs/guide/getting-started.md +181 -0
  88. package/dist/docs/guide/installation.md +287 -0
  89. package/dist/docs/guide/localization.md +132 -0
  90. package/dist/docs/guide/mcp.md +141 -0
  91. package/dist/index.d.ts +2 -0
  92. package/dist/index.js +177 -0
  93. package/package.json +48 -0
@@ -0,0 +1,76 @@
1
+ # usePolling
2
+
3
+ Composable for polling with fetch state. Combines `useAsyncState` with `useIntervalFn` for non-query polling scenarios (e.g. when you don't need `useQuery` caching).
4
+
5
+ ## Basic Usage
6
+
7
+ ```vue
8
+ <script setup>
9
+ import { usePolling } from "@baklavue/composables";
10
+
11
+ const { data, isLoading, pause, resume } = usePolling(
12
+ () => fetch("/api/status").then((r) => r.json()),
13
+ { interval: 5000 }
14
+ );
15
+ </script>
16
+
17
+ <template>
18
+ <div>
19
+ <div v-if="data">Status: {{ data.status }}</div>
20
+ <button @click="pause">Pause</button>
21
+ <button @click="resume">Resume</button>
22
+ </div>
23
+ </template>
24
+ ```
25
+
26
+ ## Pause in Background
27
+
28
+ By default, polling pauses when the tab is hidden:
29
+
30
+ ```vue
31
+ <script setup>
32
+ import { usePolling } from "@baklavue/composables";
33
+
34
+ const { data } = usePolling(
35
+ () => fetch("/api/live").then((r) => r.json()),
36
+ { interval: 3000, pauseInBackground: true }
37
+ );
38
+ </script>
39
+ ```
40
+
41
+ ## API
42
+
43
+ ### usePolling
44
+
45
+ ```typescript
46
+ usePolling<T>(fetchFn: () => Promise<T>, options): UsePollingReturn<T>
47
+ ```
48
+
49
+ #### Options
50
+
51
+ | Property | Type | Default | Description |
52
+ | --- | --- | --- | --- |
53
+ | `interval` | `number` | required | Polling interval in ms |
54
+ | `immediate` | `boolean` | `true` | Run first fetch immediately |
55
+ | `initialData` | `T` | - | Initial data before first fetch |
56
+ | `pauseInBackground` | `boolean` | `true` | Pause when tab is hidden |
57
+ | `onSuccess` | `(data: T) => void` | - | Callback on success |
58
+ | `onError` | `(error: Error) => void` | - | Callback on error |
59
+
60
+ #### Return Value
61
+
62
+ | Property | Type | Description |
63
+ | --- | --- | --- |
64
+ | `data` | `Ref<T \| undefined>` | Fetched data |
65
+ | `error` | `Ref<Error \| null>` | Error if fetch failed |
66
+ | `isLoading` | `Ref<boolean>` | True while fetch is in flight |
67
+ | `pause` | `() => void` | Pause polling |
68
+ | `resume` | `() => void` | Resume polling |
69
+ | `isActive` | `Ref<boolean>` | True when polling is active |
70
+
71
+ ## usePolling vs useQuery refetchInterval
72
+
73
+ | | usePolling | useQuery refetchInterval |
74
+ | --- | --- | --- |
75
+ | Caching | No | Yes |
76
+ | Use case | Simple polling, non-cached data | Cached API data that needs periodic refresh |
@@ -0,0 +1,58 @@
1
+ # usePrevious
2
+
3
+ A composable that tracks the previous value of a ref. Useful for diffing, dirty detection, undo logic, or "save changes" only when different.
4
+
5
+ ## Basic Usage
6
+
7
+ ```vue
8
+ <script setup>
9
+ import { usePrevious } from "@baklavue/composables";
10
+
11
+ const count = ref(0);
12
+ const previousCount = usePrevious(count);
13
+
14
+ watch(count, (newVal) => {
15
+ console.log(`Was ${previousCount.value}, now ${newVal}`);
16
+ });
17
+ </script>
18
+ ```
19
+
20
+ ## Dirty Detection
21
+
22
+ ```vue
23
+ <script setup>
24
+ import { computed } from "vue";
25
+ import { usePrevious } from "@baklavue/composables";
26
+
27
+ const formData = ref({ name: "" });
28
+ const initial = usePrevious(formData);
29
+
30
+ const isDirty = computed(() =>
31
+ JSON.stringify(formData.value) !== JSON.stringify(initial.value),
32
+ );
33
+ </script>
34
+ ```
35
+
36
+ ## API
37
+
38
+ ### Arguments
39
+
40
+ | Argument | Type | Description |
41
+ | --- | --- | --- |
42
+ | `value` | `Ref<T>` | Ref to track |
43
+
44
+ ### Return Value
45
+
46
+ | Property | Type | Description |
47
+ | --- | --- | --- |
48
+ | (return) | `Ref<T \| undefined>` | Ref holding the previous value (undefined on first render) |
49
+
50
+ ## TypeScript Support
51
+
52
+ ```typescript
53
+ import { usePrevious } from "@baklavue/composables";
54
+
55
+ const count = ref(0);
56
+ const previous = usePrevious(count);
57
+ // previous: Ref<number | undefined>
58
+ ```
@@ -0,0 +1,248 @@
1
+ # useQuery
2
+
3
+ Data fetching with caching, stale-while-revalidate, retries, and refetch triggers. Inspired by TanStack Query. Use for API data that benefits from caching and invalidation.
4
+
5
+ ## Basic Usage
6
+
7
+ ```vue
8
+ <script setup>
9
+ import { useQuery } from "@baklavue/composables";
10
+
11
+ const { data, error, isFetching, isLoading, refetch } = useQuery({
12
+ queryKey: ["users"],
13
+ queryFn: () => fetch("/api/users").then((r) => r.json()),
14
+ });
15
+ </script>
16
+
17
+ <template>
18
+ <div v-if="isLoading">Loading...</div>
19
+ <div v-else-if="error">Error: {{ error.message }}</div>
20
+ <div v-else-if="data">
21
+ <ul>
22
+ <li v-for="user in data" :key="user.id">{{ user.name }}</li>
23
+ </ul>
24
+ </div>
25
+ <button @click="refetch">Refresh</button>
26
+ </template>
27
+ ```
28
+
29
+ ## Reactive Query Key
30
+
31
+ Use a `computed` or getter for reactive query keys (e.g. when key depends on route params):
32
+
33
+ ```vue
34
+ <script setup>
35
+ import { useQuery } from "@baklavue/composables";
36
+
37
+ const userId = ref("1");
38
+ const { data } = useQuery({
39
+ queryKey: () => ["users", userId.value],
40
+ queryFn: ({ queryKey }) =>
41
+ fetch(`/api/users/${queryKey[1]}`).then((r) => r.json()),
42
+ });
43
+
44
+ // Refetches automatically when userId changes
45
+ </script>
46
+ ```
47
+
48
+ ## Stale Time
49
+
50
+ Set `staleTime` to avoid refetching while data is fresh:
51
+
52
+ ```vue
53
+ <script setup>
54
+ import { useQuery } from "@baklavue/composables";
55
+
56
+ const { data } = useQuery({
57
+ queryKey: ["users"],
58
+ queryFn: () => fetch("/api/users").then((r) => r.json()),
59
+ staleTime: 60_000, // Data stays fresh for 1 minute
60
+ });
61
+ </script>
62
+ ```
63
+
64
+ ## Dependent Queries
65
+
66
+ Use `enabled` to run a query only when dependencies are ready:
67
+
68
+ ```vue
69
+ <script setup>
70
+ import { useQuery } from "@baklavue/composables";
71
+
72
+ const userId = ref(null);
73
+ const { data } = useQuery({
74
+ queryKey: () => ["users", userId.value],
75
+ queryFn: ({ queryKey }) =>
76
+ fetch(`/api/users/${queryKey[1]}`).then((r) => r.json()),
77
+ enabled: () => userId.value != null,
78
+ });
79
+ </script>
80
+ ```
81
+
82
+ ## Cache Invalidation
83
+
84
+ Use `useQueryClient` to invalidate or update cached data:
85
+
86
+ ```vue
87
+ <script setup>
88
+ import { useQuery, useQueryClient } from "@baklavue/composables";
89
+
90
+ const queryClient = useQueryClient();
91
+
92
+ // Invalidate all queries matching ["users"]
93
+ const invalidateUsers = () => {
94
+ queryClient.invalidateQueries({ queryKey: ["users"] });
95
+ };
96
+
97
+ // Manually set cache data
98
+ const setUser = (id, user) => {
99
+ queryClient.setQueryData(["users", id], user);
100
+ };
101
+
102
+ // Read cached data
103
+ const cachedUser = queryClient.getQueryData(["users", 1]);
104
+ </script>
105
+ ```
106
+
107
+ ## Polling (refetchInterval)
108
+
109
+ Poll data at a fixed interval:
110
+
111
+ ```vue
112
+ <script setup>
113
+ import { useQuery } from "@baklavue/composables";
114
+
115
+ const { data } = useQuery({
116
+ queryKey: ["live-status"],
117
+ queryFn: () => fetch("/api/status").then((r) => r.json()),
118
+ refetchInterval: 5000,
119
+ refetchIntervalInBackground: false, // Pause when tab is hidden
120
+ });
121
+ </script>
122
+ ```
123
+
124
+ ## Prefetch
125
+
126
+ Preload data before navigation (e.g. on link hover):
127
+
128
+ ```vue
129
+ <script setup>
130
+ import { useQueryClient } from "@baklavue/composables";
131
+
132
+ const queryClient = useQueryClient();
133
+
134
+ const prefetchUser = (id) => {
135
+ queryClient.prefetchQuery({
136
+ queryKey: ["users", id],
137
+ queryFn: () => fetch(`/api/users/${id}`).then((r) => r.json()),
138
+ });
139
+ };
140
+ </script>
141
+
142
+ <template>
143
+ <a href="/user/1" @mouseenter="prefetchUser(1)">User 1</a>
144
+ </template>
145
+ ```
146
+
147
+ ## Refetch Triggers
148
+
149
+ By default, queries refetch when the window regains focus or when the network reconnects. Disable with options:
150
+
151
+ ```vue
152
+ <script setup>
153
+ import { useQuery } from "@baklavue/composables";
154
+
155
+ const { data } = useQuery({
156
+ queryKey: ["users"],
157
+ queryFn: () => fetch("/api/users").then((r) => r.json()),
158
+ refetchOnWindowFocus: false,
159
+ refetchOnReconnect: false,
160
+ });
161
+ </script>
162
+ ```
163
+
164
+ ## Retries
165
+
166
+ Configure retry behavior:
167
+
168
+ ```vue
169
+ <script setup>
170
+ import { useQuery } from "@baklavue/composables";
171
+
172
+ // Retry 3 times with exponential backoff (default)
173
+ const { data } = useQuery({
174
+ queryKey: ["users"],
175
+ queryFn: () => fetch("/api/users").then((r) => r.json()),
176
+ retry: 3,
177
+ });
178
+
179
+ // No retries
180
+ const { data: data2 } = useQuery({
181
+ queryKey: ["config"],
182
+ queryFn: () => fetch("/api/config").then((r) => r.json()),
183
+ retry: false,
184
+ });
185
+ </script>
186
+ ```
187
+
188
+ ## API
189
+
190
+ ### useQuery
191
+
192
+ ```typescript
193
+ useQuery<T>(options: UseQueryOptions<T>): UseQueryReturn<T>
194
+ ```
195
+
196
+ #### Options
197
+
198
+ | Property | Type | Default | Description |
199
+ | --- | --- | --- | --- |
200
+ | `queryKey` | `MaybeRefOrGetter<QueryKey>` | required | Unique key for caching (array of values) |
201
+ | `queryFn` | `(context: { queryKey }) => Promise<T>` | required | Async function that fetches data |
202
+ | `staleTime` | `number` | `0` | ms until data is stale (0 = always stale) |
203
+ | `retry` | `number \| boolean` | `3` | Retries on error (`false` = none) |
204
+ | `retryDelay` | `number \| (attempt, error) => number` | exponential backoff | Delay between retries in ms |
205
+ | `enabled` | `MaybeRefOrGetter<boolean>` | `true` | If false, query won't run |
206
+ | `refetchOnWindowFocus` | `boolean` | `true` | Refetch when window regains focus |
207
+ | `refetchOnReconnect` | `boolean` | `true` | Refetch when network reconnects |
208
+ | `refetchInterval` | `number` | `0` | Polling interval in ms (0 = no polling) |
209
+ | `refetchIntervalInBackground` | `boolean` | `false` | Continue polling when tab is hidden |
210
+ | `initialData` | `T \| (() => T)` | - | Initial data before first fetch |
211
+
212
+ #### Return Value
213
+
214
+ | Property | Type | Description |
215
+ | --- | --- | --- |
216
+ | `data` | `Ref<T \| null>` | Fetched data |
217
+ | `error` | `Ref<Error \| null>` | Error if request failed |
218
+ | `isFetching` | `Ref<boolean>` | True while request is in flight |
219
+ | `isLoading` | `Ref<boolean>` | True when no data yet and fetching |
220
+ | `isSuccess` | `Ref<boolean>` | True when data is available |
221
+ | `isError` | `Ref<boolean>` | True when error occurred |
222
+ | `refetch` | `() => Promise<void>` | Manual refetch |
223
+
224
+ ### useQueryClient
225
+
226
+ ```typescript
227
+ useQueryClient(): QueryClient
228
+ ```
229
+
230
+ #### QueryClient Methods
231
+
232
+ | Method | Description |
233
+ | --- | --- |
234
+ | `invalidateQueries(options?)` | Remove matching entries from cache. `{ queryKey: ["users"] }` invalidates all keys starting with `["users"]` |
235
+ | `getQueryData<T>(queryKey)` | Get cached data for a key |
236
+ | `setQueryData<T>(queryKey, data)` | Manually set cache for a key |
237
+ | `prefetchQuery(options)` | Prefetch and cache data. `{ queryKey, queryFn }` |
238
+
239
+ ## useQuery vs useFetch
240
+
241
+ | | useQuery | useFetch |
242
+ | --- | --- | --- |
243
+ | Caching | Yes, by query key | No |
244
+ | Stale / refetch | Yes | No |
245
+ | Retries | Configurable | Configurable (opt-in) |
246
+ | Refetch triggers | Window focus, reconnect (default on) | Window focus, reconnect, URL change (opt-in) |
247
+ | Invalidation | Via useQueryClient | N/A |
248
+ | Use case | Cached API data | One-off or non-cached requests |
@@ -0,0 +1,78 @@
1
+ # useRafFn
2
+
3
+ Calls a function on every requestAnimationFrame. Returns pause and resume controls. Useful for animation loops and smooth updates.
4
+
5
+ ## Basic Usage
6
+
7
+ ```vue
8
+ <script setup>
9
+ import { ref, onMounted } from "vue";
10
+ import { useRafFn } from "@baklavue/composables";
11
+
12
+ const position = ref(0);
13
+ const velocity = 100;
14
+
15
+ const { pause, resume } = useRafFn(({ delta }) => {
16
+ position.value += velocity * (delta / 1000);
17
+ });
18
+
19
+ // Pause when tab is hidden
20
+ onMounted(() => {
21
+ document.addEventListener("visibilitychange", () => {
22
+ document.hidden ? pause() : resume();
23
+ });
24
+ });
25
+ </script>
26
+
27
+ <template>
28
+ <div :style="{ transform: `translateX(${position}px)` }">
29
+ Animated content
30
+ </div>
31
+ </template>
32
+ ```
33
+
34
+ ## With FPS Limit
35
+
36
+ Limit the frame rate to reduce CPU usage:
37
+
38
+ ```vue
39
+ <script setup>
40
+ import { useRafFn } from "@baklavue/composables";
41
+
42
+ const { pause, resume } = useRafFn(
43
+ ({ delta }) => {
44
+ // Update animation
45
+ },
46
+ { fpsLimit: 60 }
47
+ );
48
+ </script>
49
+ ```
50
+
51
+ ## API
52
+
53
+ ```typescript
54
+ useRafFn(
55
+ callback: (args: RafCallbackArgs) => void,
56
+ options?: UseRafFnOptions
57
+ ): { pause: () => void; resume: () => void; isActive: Ref<boolean> }
58
+ ```
59
+
60
+ ### Callback Args
61
+
62
+ - `delta` — Time elapsed since last frame in milliseconds
63
+ - `timestamp` — High-resolution timestamp
64
+
65
+ ### Options
66
+
67
+ | Property | Type | Default | Description |
68
+ | --- | --- | --- | --- |
69
+ | `immediate` | `boolean` | `true` | Start the loop immediately |
70
+ | `fpsLimit` | `number` | `undefined` | Max FPS (no limit if undefined) |
71
+
72
+ ### Return Value
73
+
74
+ | Property | Type | Description |
75
+ | --- | --- | --- |
76
+ | `pause` | `() => void` | Pause the animation loop |
77
+ | `resume` | `() => void` | Resume the animation loop |
78
+ | `isActive` | `Ref<boolean>` | True when the loop is running |
@@ -0,0 +1,46 @@
1
+ # useScrollLock
2
+
3
+ A composable for locking body scroll when modals or drawers are open. Supports stacking: multiple `lock()` calls require matching `unlock()` calls. Use with `useDisclosure` for BvDialog and BvDrawer.
4
+
5
+ ## Basic Usage
6
+
7
+ ```vue
8
+ <template>
9
+ <BvButton @click="open">Open Dialog</BvButton>
10
+ <BvDialog v-model:open="isOpen" caption="Dialog">
11
+ <p>Content. Body scroll is locked when open.</p>
12
+ </BvDialog>
13
+ </template>
14
+
15
+ <script setup>
16
+ import { BvButton, BvDialog } from "@baklavue/ui";
17
+ import { useDisclosure, useScrollLock } from "@baklavue/composables";
18
+
19
+ const { isOpen, open, close } = useDisclosure();
20
+ const { lock, unlock } = useScrollLock();
21
+
22
+ watch(isOpen, (opened) => {
23
+ if (opened) lock();
24
+ else unlock();
25
+ });
26
+ </script>
27
+ ```
28
+
29
+ ## API
30
+
31
+ ### Return Value
32
+
33
+ | Property | Type | Description |
34
+ | --- | --- | --- |
35
+ | `isLocked` | `Ref<boolean>` | True when body scroll is locked |
36
+ | `lock` | `() => void` | Lock body scroll |
37
+ | `unlock` | `() => void` | Unlock body scroll |
38
+ | `toggleLock` | `() => void` | Toggle lock state |
39
+
40
+ ## TypeScript Support
41
+
42
+ ```typescript
43
+ import { useScrollLock } from "@baklavue/composables";
44
+
45
+ const { lock, unlock } = useScrollLock();
46
+ ```