@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,362 @@
1
+ # Table
2
+
3
+ A Vue UI kit component for Baklava's `bl-table` component for displaying tabular data. Supports columns, data, sorting, row selection, loading/empty states, pagination, title/header actions, and per-column custom slots.
4
+
5
+ ## Basic Usage
6
+
7
+ Provide `columns` and `data` to render a table. Rows should include an `id` when using `selectable`; otherwise the row index is used.
8
+
9
+ <div class="component-demo">
10
+
11
+ <TableBasicDemo />
12
+
13
+ </div>
14
+
15
+ ```vue
16
+ <template>
17
+ <BvTable :columns="columns" :data="tableData" />
18
+ </template>
19
+
20
+ <script setup>
21
+ import { BvTable } from "@baklavue/ui";
22
+
23
+ const columns = [
24
+ { key: "name", label: "Name" },
25
+ { key: "age", label: "Age" },
26
+ { key: "email", label: "Email" },
27
+ ];
28
+
29
+ const tableData = [
30
+ { id: 1, name: "John Doe", age: 30, email: "john@example.com" },
31
+ { id: 2, name: "Jane Smith", age: 25, email: "jane@example.com" },
32
+ { id: 3, name: "Bob Wilson", age: 35, email: "bob@example.com" },
33
+ ];
34
+ </script>
35
+ ```
36
+
37
+ ## Sortable
38
+
39
+ Enable column sorting with the `sortable` prop. Set `sortable: true` on individual columns to allow sorting by that column.
40
+
41
+ <div class="component-demo">
42
+
43
+ <TableSortableDemo />
44
+
45
+ </div>
46
+
47
+ ```vue
48
+ <template>
49
+ <BvTable :columns="columns" :data="tableData" :sortable="true" />
50
+ </template>
51
+
52
+ <script setup>
53
+ import { BvTable } from "@baklavue/ui";
54
+
55
+ const columns = [
56
+ { key: "name", label: "Name", sortable: true },
57
+ { key: "age", label: "Age", sortable: true },
58
+ { key: "email", label: "Email" },
59
+ ];
60
+
61
+ const tableData = [
62
+ { id: 1, name: "John Doe", age: 30, email: "john@example.com" },
63
+ { id: 2, name: "Jane Smith", age: 25, email: "jane@example.com" },
64
+ { id: 3, name: "Bob Wilson", age: 35, email: "bob@example.com" },
65
+ ];
66
+ </script>
67
+ ```
68
+
69
+ ## Loading State
70
+
71
+ Use `isLoading` to show a loading state with a spinner and custom text.
72
+
73
+ <div class="component-demo">
74
+
75
+ <TableLoadingDemo />
76
+
77
+ </div>
78
+
79
+ ```vue
80
+ <template>
81
+ <BvTable
82
+ :columns="columns"
83
+ :data="tableData"
84
+ :is-loading="isLoading"
85
+ loading-text="Loading data..."
86
+ />
87
+ </template>
88
+
89
+ <script setup>
90
+ import { ref } from "vue";
91
+ import { BvTable } from "@baklavue/ui";
92
+
93
+ const isLoading = ref(true);
94
+ const columns = [...];
95
+ const tableData = [...];
96
+ </script>
97
+ ```
98
+
99
+ ## Empty State
100
+
101
+ When `data` is empty, use the `empty-state` slot to customize the content shown.
102
+
103
+ <div class="component-demo">
104
+
105
+ <TableEmptyDemo />
106
+
107
+ </div>
108
+
109
+ ```vue
110
+ <template>
111
+ <BvTable :columns="columns" :data="tableData">
112
+ <template #empty-state>
113
+ <span>No data found</span>
114
+ </template>
115
+ </BvTable>
116
+ </template>
117
+
118
+ <script setup>
119
+ import { BvTable } from "@baklavue/ui";
120
+
121
+ const columns = [...];
122
+ const tableData = [];
123
+ </script>
124
+ ```
125
+
126
+ ## Pagination
127
+
128
+ Pass a `pagination` object to enable pagination. Listen to `@change` for page or items-per-page changes.
129
+
130
+ <div class="component-demo">
131
+
132
+ <TablePaginationDemo />
133
+
134
+ </div>
135
+
136
+ ```vue
137
+ <template>
138
+ <BvTable
139
+ :columns="columns"
140
+ :data="tableData"
141
+ title="Users"
142
+ :pagination="pagination"
143
+ @change="onPageChange"
144
+ />
145
+ </template>
146
+
147
+ <script setup>
148
+ import { ref, computed } from "vue";
149
+ import { BvTable } from "@baklavue/ui";
150
+
151
+ const currentPage = ref(1);
152
+ const itemsPerPage = ref(10);
153
+
154
+ const pagination = computed(() => ({
155
+ currentPage: currentPage.value,
156
+ totalItems: 50,
157
+ itemsPerPage: itemsPerPage.value,
158
+ hasJumper: true,
159
+ jumperLabel: "Go to page",
160
+ hasSelect: true,
161
+ selectLabel: "Items per page",
162
+ itemsPerPageOptions: [
163
+ { text: "5 Items", value: 5 },
164
+ { text: "10 Items", value: 10 },
165
+ { text: "25 Items", value: 25 },
166
+ ],
167
+ }));
168
+
169
+ const onPageChange = (event) => {
170
+ const { selectedPage, itemsPerPage: newItemsPerPage } = event.detail;
171
+ currentPage.value = selectedPage;
172
+ itemsPerPage.value = newItemsPerPage;
173
+ };
174
+ </script>
175
+ ```
176
+
177
+ ## Column Slots
178
+
179
+ Use scoped slots named by column `key` to customize cell content. Each slot receives `{ row, value }`.
180
+
181
+ <div class="component-demo">
182
+
183
+ <TableColumnSlotsDemo />
184
+
185
+ </div>
186
+
187
+ ```vue
188
+ <template>
189
+ <BvTable :columns="columns" :data="tableData">
190
+ <template #status="{ value }">
191
+ <span
192
+ :style="{
193
+ color: value === 'active' ? 'var(--bl-color-success)' : 'var(--bl-color-neutral-600)',
194
+ fontWeight: 500,
195
+ }"
196
+ >
197
+ {{ value }}
198
+ </span>
199
+ </template>
200
+ </BvTable>
201
+ </template>
202
+
203
+ <script setup>
204
+ import { BvTable } from "@baklavue/ui";
205
+
206
+ const columns = [
207
+ { key: "name", label: "Name" },
208
+ { key: "status", label: "Status" },
209
+ { key: "email", label: "Email" },
210
+ ];
211
+
212
+ const tableData = [
213
+ { id: 1, name: "John Doe", status: "active", email: "john@example.com" },
214
+ { id: 2, name: "Jane Smith", status: "inactive", email: "jane@example.com" },
215
+ ];
216
+ </script>
217
+ ```
218
+
219
+ ## Selectable
220
+
221
+ Enable row selection with the `selectable` prop. Use `@select` to handle selection changes. When `selectable` is true, rows should have an `id` for reliable selection keys.
222
+
223
+ ```vue
224
+ <template>
225
+ <BvTable
226
+ :columns="columns"
227
+ :data="tableData"
228
+ :selectable="true"
229
+ :multiple="true"
230
+ v-model:selected="selectedIds"
231
+ @select="onSelect"
232
+ />
233
+ </template>
234
+
235
+ <script setup>
236
+ import { ref } from "vue";
237
+ import { BvTable } from "@baklavue/ui";
238
+
239
+ const columns = [
240
+ { key: "name", label: "Name" },
241
+ { key: "age", label: "Age" },
242
+ ];
243
+
244
+ const tableData = [
245
+ { id: 1, name: "John", age: 30 },
246
+ { id: 2, name: "Jane", age: 25 },
247
+ ];
248
+
249
+ const selectedIds = ref([]);
250
+
251
+ const onSelect = (event) => {
252
+ console.log("Selected:", event.detail);
253
+ };
254
+ </script>
255
+ ```
256
+
257
+ ## Title and Header Actions
258
+
259
+ Use the `title` prop and `header-actions` slot for a header bar above the table.
260
+
261
+ ```vue
262
+ <template>
263
+ <BvTable title="Users" :columns="columns" :data="tableData">
264
+ <template #header-actions>
265
+ <BvButton>Add User</BvButton>
266
+ </template>
267
+ </BvTable>
268
+ </template>
269
+ ```
270
+
271
+ ## Props
272
+
273
+ | Prop | Type | Default | Description |
274
+ | ------------------- | ---------------------- | ----------- | ------------------------------------------ |
275
+ | `title` | `string` | `undefined` | Optional title above the table |
276
+ | `headerOptions` | `object` | `undefined` | `{ sticky?: boolean; minCellWidth?: string }` |
277
+ | `data` | `TableRow[]` | `[]` | Table data rows |
278
+ | `columns` | `TableColumn[]` | `undefined` | Column definitions |
279
+ | `sortable` | `boolean` | `undefined` | Enable column sorting |
280
+ | `selectable` | `boolean` | `undefined` | Enable row selection |
281
+ | `multiple` | `boolean` | `undefined` | Enable multiple row selection |
282
+ | `selected` | `(string \| number)[]` | `undefined` | Selected row keys (v-model:selected) |
283
+ | `sortKey` | `string` | `undefined` | Sort key for sorted column |
284
+ | `sortDirection` | `string` | `undefined` | Sort direction: '' \| 'asc' \| 'desc' |
285
+ | `stickyFirstColumn` | `boolean` | `undefined` | Make first column sticky |
286
+ | `stickyLastColumn` | `boolean` | `undefined` | Make last column sticky |
287
+ | `isLoading` | `boolean` | `undefined` | Show loading state |
288
+ | `pagination` | `TablePaginationProps` | `undefined` | Pagination configuration |
289
+ | `loadingText` | `string` | `"Loading..."` | Text shown in loading state |
290
+
291
+ ## Events
292
+
293
+ | Event | Payload | Description |
294
+ | ----------- | -------------------------- | --------------------------------- |
295
+ | `row-click` | `CustomEvent` | Emitted when a row is clicked |
296
+ | `sort` | `CustomEvent` | Emitted when sort options change |
297
+ | `select` | `CustomEvent<string[]>` | Emitted when selected rows change |
298
+ | `change` | `CustomEvent<PaginationDetail>` | Emitted when pagination changes (selectedPage, prevPage, itemsPerPage) |
299
+
300
+ ## Slots
301
+
302
+ | Slot | Props | Description |
303
+ | ---------------- | ---------------- | ----------------------------------------- |
304
+ | `header-actions` | - | Right side of title bar |
305
+ | `empty-state` | - | Content when `data.length === 0` |
306
+ | `[column.key]` | `{ row, value }` | Per-column cell content (scoped) |
307
+
308
+ ## Types
309
+
310
+ ```typescript
311
+ import type {
312
+ TableProps,
313
+ TableColumn,
314
+ TableRow,
315
+ TablePaginationProps,
316
+ } from "@baklavue/ui";
317
+
318
+ interface TableColumn {
319
+ key: string;
320
+ label?: string;
321
+ name?: string;
322
+ sortable?: boolean;
323
+ }
324
+
325
+ type TableRow = Record<string, unknown> & { id?: string | number };
326
+
327
+ interface TablePaginationProps {
328
+ currentPage: number;
329
+ totalItems: number;
330
+ itemsPerPage: number;
331
+ hasJumper?: boolean;
332
+ jumperLabel?: string;
333
+ hasSelect?: boolean;
334
+ selectLabel?: string;
335
+ itemsPerPageOptions?: { text: string; value: number }[];
336
+ }
337
+
338
+ interface TableProps {
339
+ title?: string;
340
+ headerOptions?: { sticky?: boolean; minCellWidth?: string };
341
+ data?: TableRow[];
342
+ columns?: TableColumn[];
343
+ sortable?: boolean;
344
+ selectable?: boolean;
345
+ multiple?: boolean;
346
+ selected?: (string | number)[];
347
+ sortKey?: string;
348
+ sortDirection?: string;
349
+ stickyFirstColumn?: boolean;
350
+ stickyLastColumn?: boolean;
351
+ isLoading?: boolean;
352
+ pagination?: TablePaginationProps;
353
+ loadingText?: string;
354
+ }
355
+ ```
356
+
357
+ ## Usage Notes
358
+
359
+ - **Column keys**: Each column's `key` must match a property in the data rows. Use `label` or `name` for header text.
360
+ - **Row ids**: When `selectable` is true, rows should have an `id` (string or number) for reliable selection. Falls back to row index if absent.
361
+ - **Sortable columns**: Set `sortable: true` on the table and optionally on individual columns.
362
+ - **Empty state**: Provide custom content via the `empty-state` slot (e.g., icon, message, action button).
@@ -0,0 +1,243 @@
1
+ # Tag
2
+
3
+ A Vue UI kit component for Baklava's `bl-tag` component for displaying tags or labels. Supports selectable and removable (closable) variants, sizes, and icons.
4
+
5
+ ## Basic Usage
6
+
7
+ Use the default slot for tag content.
8
+
9
+ <div class="component-demo">
10
+
11
+ <TagBasicDemo />
12
+
13
+ </div>
14
+
15
+ ```vue
16
+ <template>
17
+ <div style="display: flex; gap: 0.5rem; flex-wrap: wrap">
18
+ <BvTag>Vue</BvTag>
19
+ <BvTag>Baklava</BvTag>
20
+ <BvTag>Design System</BvTag>
21
+ </div>
22
+ </template>
23
+
24
+ <script setup>
25
+ import { BvTag } from "@baklavue/ui";
26
+ </script>
27
+ ```
28
+
29
+ ## Closable
30
+
31
+ Use the `closable` prop to show a close button. Listen to the `close` event to handle removal.
32
+
33
+ <div class="component-demo">
34
+
35
+ <TagClosableDemo />
36
+
37
+ </div>
38
+
39
+ ```vue
40
+ <template>
41
+ <BvTag v-if="visible" closable @close="visible = false">
42
+ Removable tag (click X to remove)
43
+ </BvTag>
44
+ </template>
45
+
46
+ <script setup>
47
+ import { ref } from "vue";
48
+ import { BvTag } from "@baklavue/ui";
49
+
50
+ const visible = ref(true);
51
+ </script>
52
+ ```
53
+
54
+ ## Sizes
55
+
56
+ Control the tag size with the `size` prop.
57
+
58
+ <div class="component-demo">
59
+
60
+ <TagSizesDemo />
61
+
62
+ </div>
63
+
64
+ ```vue
65
+ <template>
66
+ <div style="display: flex; gap: 0.5rem; align-items: center; flex-wrap: wrap">
67
+ <BvTag size="small">Small</BvTag>
68
+ <BvTag size="medium">Medium</BvTag>
69
+ <BvTag size="large">Large</BvTag>
70
+ </div>
71
+ </template>
72
+
73
+ <script setup>
74
+ import { BvTag } from "@baklavue/ui";
75
+ </script>
76
+ ```
77
+
78
+ ## With Icon
79
+
80
+ Add an icon using the `icon` prop with a Baklava icon name.
81
+
82
+ <div class="component-demo">
83
+
84
+ <TagWithIconDemo />
85
+
86
+ </div>
87
+
88
+ ```vue
89
+ <template>
90
+ <div style="display: flex; gap: 0.5rem; flex-wrap: wrap">
91
+ <BvTag icon="info">Info</BvTag>
92
+ <BvTag icon="settings">Settings</BvTag>
93
+ <BvTag icon="check">Success</BvTag>
94
+ </div>
95
+ </template>
96
+
97
+ <script setup>
98
+ import { BvTag } from "@baklavue/ui";
99
+ </script>
100
+ ```
101
+
102
+ ## Custom Icon Slot
103
+
104
+ Use the `#icon` slot to render a custom icon (e.g. `BvIcon` or SVG).
105
+
106
+ <div class="component-demo">
107
+
108
+ <TagCustomIconDemo />
109
+
110
+ </div>
111
+
112
+ ```vue
113
+ <template>
114
+ <BvTag>
115
+ <template #icon>
116
+ <BvIcon name="check" />
117
+ </template>
118
+ Verified
119
+ </BvTag>
120
+ </template>
121
+
122
+ <script setup>
123
+ import { BvTag, BvIcon } from "@baklavue/ui";
124
+ </script>
125
+ ```
126
+
127
+ ## Selectable
128
+
129
+ Use `variant="selectable"` for tags that can be toggled (e.g. filter chips). Bind `selected` and listen to `@update:selected` to control state.
130
+
131
+ <div class="component-demo">
132
+
133
+ <TagSelectableDemo />
134
+
135
+ </div>
136
+
137
+ ```vue
138
+ <template>
139
+ <div style="display: flex; gap: 0.5rem; flex-wrap: wrap">
140
+ <BvTag
141
+ v-for="filter in filters"
142
+ :key="filter"
143
+ variant="selectable"
144
+ :selected="selected.includes(filter)"
145
+ :value="filter"
146
+ @update:selected="(v) => toggleFilter(filter, v)"
147
+ >
148
+ {{ filter }}
149
+ </BvTag>
150
+ </div>
151
+ </template>
152
+
153
+ <script setup>
154
+ import { ref } from "vue";
155
+ import { BvTag } from "@baklavue/ui";
156
+
157
+ const filters = ref(["Vue", "React", "Svelte"]);
158
+ const selected = ref(["Vue"]);
159
+
160
+ function toggleFilter(filter, value) {
161
+ if (value) {
162
+ if (!selected.value.includes(filter)) selected.value.push(filter);
163
+ } else {
164
+ selected.value = selected.value.filter((s) => s !== filter);
165
+ }
166
+ }
167
+ </script>
168
+ ```
169
+
170
+ ## Disabled
171
+
172
+ Use the `disabled` prop to prevent interaction with the tag.
173
+
174
+ <div class="component-demo">
175
+
176
+ <TagDisabledDemo />
177
+
178
+ </div>
179
+
180
+ ```vue
181
+ <template>
182
+ <div style="display: flex; gap: 0.5rem; flex-wrap: wrap">
183
+ <BvTag disabled>Disabled</BvTag>
184
+ <BvTag disabled closable>Disabled closable</BvTag>
185
+ <BvTag variant="selectable" disabled>Disabled selectable</BvTag>
186
+ </div>
187
+ </template>
188
+
189
+ <script setup>
190
+ import { BvTag } from "@baklavue/ui";
191
+ </script>
192
+ ```
193
+
194
+ ## Props
195
+
196
+ | Prop | Type | Default | Description |
197
+ | ---------- | ------------ | ----------- | ------------------------------------------------ |
198
+ | `variant` | `TagVariant` | `undefined` | Tag variant: `selectable` or `removable` |
199
+ | `size` | `TagSize` | `undefined` | Tag size: `small`, `medium`, `large` |
200
+ | `closable` | `boolean` | `undefined` | When true, shows close button (removable variant) |
201
+ | `icon` | `BaklavaIcon`| `undefined` | Icon name from Baklava icons |
202
+ | `selected` | `boolean` | `undefined` | Selected state (for selectable variant) |
203
+ | `disabled` | `boolean` | `undefined` | Disabled state |
204
+ | `value` | `string \| null` | `undefined` | Value for form/selection |
205
+
206
+ ## Events
207
+
208
+ | Event | Payload | Description |
209
+ | ------------------- | -------- | -------------------------------------------------------- |
210
+ | `close` | - | Emitted when close button is clicked (closable) |
211
+ | `update:selected` | `boolean`| Emitted when a selectable tag is clicked (new `selected` state) |
212
+
213
+ ## Slots
214
+
215
+ | Slot | Description |
216
+ | --------- | ------------------------------ |
217
+ | `default` | Tag content (label/text) |
218
+ | `icon` | Custom icon content |
219
+
220
+ ## Types
221
+
222
+ ```typescript
223
+ import type { TagProps, TagVariant, TagSize } from "@baklavue/ui";
224
+
225
+ type TagVariant = "selectable" | "removable";
226
+ type TagSize = "small" | "medium" | "large";
227
+
228
+ interface TagProps {
229
+ variant?: TagVariant;
230
+ size?: TagSize;
231
+ closable?: boolean;
232
+ icon?: BaklavaIcon;
233
+ selected?: boolean;
234
+ disabled?: boolean;
235
+ value?: string | null;
236
+ }
237
+ ```
238
+
239
+ ## Usage Notes
240
+
241
+ - **Closable vs variant**: Use `closable` for a simple removable tag; it maps to the `removable` variant under the hood.
242
+ - **Selectable**: Use `variant="selectable"` for tags that can be toggled (e.g. in filter chips).
243
+ - **Accessibility**: The component follows Baklava's accessibility guidelines.