@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.
- package/README.md +72 -0
- package/dist/data/component-categories.d.ts +7 -0
- package/dist/data/component-categories.js +48 -0
- package/dist/data/loaders.d.ts +22 -0
- package/dist/data/loaders.js +346 -0
- package/dist/docs/components/accordion.md +601 -0
- package/dist/docs/components/alert.md +233 -0
- package/dist/docs/components/badge.md +100 -0
- package/dist/docs/components/banner.md +231 -0
- package/dist/docs/components/button.md +324 -0
- package/dist/docs/components/checkbox.md +343 -0
- package/dist/docs/components/chip.md +199 -0
- package/dist/docs/components/datepicker.md +243 -0
- package/dist/docs/components/dialog.md +224 -0
- package/dist/docs/components/drawer.md +188 -0
- package/dist/docs/components/dropdown.md +291 -0
- package/dist/docs/components/file-upload.md +248 -0
- package/dist/docs/components/icon.md +142 -0
- package/dist/docs/components/image.md +161 -0
- package/dist/docs/components/index.md +151 -0
- package/dist/docs/components/input.md +407 -0
- package/dist/docs/components/link.md +249 -0
- package/dist/docs/components/notification.md +179 -0
- package/dist/docs/components/pagination.md +168 -0
- package/dist/docs/components/radio.md +221 -0
- package/dist/docs/components/scroll-to-top.md +90 -0
- package/dist/docs/components/select.md +239 -0
- package/dist/docs/components/skeleton.md +79 -0
- package/dist/docs/components/spinner.md +93 -0
- package/dist/docs/components/split-button.md +165 -0
- package/dist/docs/components/stepper.md +337 -0
- package/dist/docs/components/switch.md +144 -0
- package/dist/docs/components/tab.md +140 -0
- package/dist/docs/components/table.md +362 -0
- package/dist/docs/components/tag.md +243 -0
- package/dist/docs/components/textarea.md +190 -0
- package/dist/docs/components/tooltip.md +155 -0
- package/dist/docs/composables/alert.md +87 -0
- package/dist/docs/composables/asyncState.md +74 -0
- package/dist/docs/composables/base64.md +72 -0
- package/dist/docs/composables/breakpoints.md +129 -0
- package/dist/docs/composables/clipboard.md +108 -0
- package/dist/docs/composables/colorScheme.md +110 -0
- package/dist/docs/composables/confirmDialog.md +105 -0
- package/dist/docs/composables/containerScroll.md +89 -0
- package/dist/docs/composables/cookie.md +137 -0
- package/dist/docs/composables/debounce.md +69 -0
- package/dist/docs/composables/disclosure.md +69 -0
- package/dist/docs/composables/elementSize.md +84 -0
- package/dist/docs/composables/fetch.md +257 -0
- package/dist/docs/composables/fieldArray.md +104 -0
- package/dist/docs/composables/file.md +343 -0
- package/dist/docs/composables/focusTrap.md +87 -0
- package/dist/docs/composables/formPersistence.md +69 -0
- package/dist/docs/composables/formState.md +71 -0
- package/dist/docs/composables/formValidation.md +355 -0
- package/dist/docs/composables/format.md +107 -0
- package/dist/docs/composables/id.md +54 -0
- package/dist/docs/composables/index.md +112 -0
- package/dist/docs/composables/infiniteQuery.md +104 -0
- package/dist/docs/composables/intersectionObserver.md +64 -0
- package/dist/docs/composables/lazyQuery.md +68 -0
- package/dist/docs/composables/loading.md +91 -0
- package/dist/docs/composables/mutation.md +83 -0
- package/dist/docs/composables/notification.md +169 -0
- package/dist/docs/composables/pagination.md +109 -0
- package/dist/docs/composables/polling.md +76 -0
- package/dist/docs/composables/previous.md +58 -0
- package/dist/docs/composables/query.md +248 -0
- package/dist/docs/composables/raf.md +78 -0
- package/dist/docs/composables/scrollLock.md +46 -0
- package/dist/docs/composables/scrollToError.md +291 -0
- package/dist/docs/composables/scrollVisibility.md +60 -0
- package/dist/docs/composables/share.md +78 -0
- package/dist/docs/composables/slug.md +58 -0
- package/dist/docs/composables/stepper.md +117 -0
- package/dist/docs/composables/stepperForm.md +74 -0
- package/dist/docs/composables/sticky.md +91 -0
- package/dist/docs/composables/storage.md +193 -0
- package/dist/docs/composables/theme.md +252 -0
- package/dist/docs/composables/themePreset.md +62 -0
- package/dist/docs/composables/throttle.md +76 -0
- package/dist/docs/composables/timer.md +78 -0
- package/dist/docs/composables/toggle.md +55 -0
- package/dist/docs/guide/contributing.md +364 -0
- package/dist/docs/guide/design-tokens.md +29 -0
- package/dist/docs/guide/getting-started.md +181 -0
- package/dist/docs/guide/installation.md +287 -0
- package/dist/docs/guide/localization.md +132 -0
- package/dist/docs/guide/mcp.md +141 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +177 -0
- 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.
|