@baklavue/ui 1.0.0 → 1.0.1

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 (327) hide show
  1. package/dist/accordion/Accordion.vue.d.ts +51 -0
  2. package/dist/accordion/Accordion.vue.d.ts.map +1 -0
  3. package/dist/accordion/accordion.types.d.ts +97 -0
  4. package/dist/accordion/accordion.types.d.ts.map +1 -0
  5. package/dist/accordion/index.d.ts +3 -0
  6. package/dist/accordion/index.d.ts.map +1 -0
  7. package/dist/alert/Alert.vue.d.ts +49 -0
  8. package/dist/alert/Alert.vue.d.ts.map +1 -0
  9. package/dist/alert/alert.types.d.ts +52 -0
  10. package/dist/alert/alert.types.d.ts.map +1 -0
  11. package/dist/alert/index.d.ts +3 -0
  12. package/dist/alert/index.d.ts.map +1 -0
  13. package/dist/badge/Badge.vue.d.ts +22 -0
  14. package/dist/badge/Badge.vue.d.ts.map +1 -0
  15. package/dist/badge/badge.types.d.ts +7 -0
  16. package/dist/badge/badge.types.d.ts.map +1 -0
  17. package/dist/badge/index.d.ts +3 -0
  18. package/dist/badge/index.d.ts.map +1 -0
  19. package/dist/banner/Banner.vue.d.ts +36 -0
  20. package/dist/banner/Banner.vue.d.ts.map +1 -0
  21. package/dist/banner/banner.types.d.ts +70 -0
  22. package/dist/banner/banner.types.d.ts.map +1 -0
  23. package/dist/banner/index.d.ts +3 -0
  24. package/dist/banner/index.d.ts.map +1 -0
  25. package/dist/button/Button.vue.d.ts +36 -0
  26. package/dist/button/Button.vue.d.ts.map +1 -0
  27. package/dist/button/button.types.d.ts +24 -0
  28. package/dist/button/button.types.d.ts.map +1 -0
  29. package/dist/button/index.d.ts +3 -0
  30. package/dist/button/index.d.ts.map +1 -0
  31. package/dist/checkbox/Checkbox.vue.d.ts +39 -0
  32. package/dist/checkbox/Checkbox.vue.d.ts.map +1 -0
  33. package/dist/checkbox/checkbox.types.d.ts +95 -0
  34. package/dist/checkbox/checkbox.types.d.ts.map +1 -0
  35. package/dist/checkbox/index.d.ts +3 -0
  36. package/dist/checkbox/index.d.ts.map +1 -0
  37. package/dist/chip/Chip.vue.d.ts +29 -0
  38. package/dist/chip/Chip.vue.d.ts.map +1 -0
  39. package/dist/chip/chip.types.d.ts +59 -0
  40. package/dist/chip/chip.types.d.ts.map +1 -0
  41. package/dist/chip/index.d.ts +3 -0
  42. package/dist/chip/index.d.ts.map +1 -0
  43. package/dist/datepicker/Datepicker.vue.d.ts +41 -0
  44. package/dist/datepicker/Datepicker.vue.d.ts.map +1 -0
  45. package/dist/datepicker/datepicker.types.d.ts +38 -0
  46. package/dist/datepicker/datepicker.types.d.ts.map +1 -0
  47. package/dist/datepicker/index.d.ts +3 -0
  48. package/dist/datepicker/index.d.ts.map +1 -0
  49. package/dist/dialog/Dialog.vue.d.ts +44 -0
  50. package/dist/dialog/Dialog.vue.d.ts.map +1 -0
  51. package/dist/dialog/dialog.types.d.ts +18 -0
  52. package/dist/dialog/dialog.types.d.ts.map +1 -0
  53. package/dist/dialog/index.d.ts +3 -0
  54. package/dist/dialog/index.d.ts.map +1 -0
  55. package/dist/drawer/Drawer.vue.d.ts +42 -0
  56. package/dist/drawer/Drawer.vue.d.ts.map +1 -0
  57. package/dist/drawer/drawer.types.d.ts +18 -0
  58. package/dist/drawer/drawer.types.d.ts.map +1 -0
  59. package/dist/drawer/index.d.ts +3 -0
  60. package/dist/drawer/index.d.ts.map +1 -0
  61. package/dist/dropdown/Dropdown.vue.d.ts +59 -0
  62. package/dist/dropdown/Dropdown.vue.d.ts.map +1 -0
  63. package/dist/dropdown/dropdown.types.d.ts +92 -0
  64. package/dist/dropdown/dropdown.types.d.ts.map +1 -0
  65. package/dist/dropdown/index.d.ts +3 -0
  66. package/dist/dropdown/index.d.ts.map +1 -0
  67. package/dist/file-upload/FileUpload.vue.d.ts +44 -0
  68. package/dist/file-upload/FileUpload.vue.d.ts.map +1 -0
  69. package/dist/file-upload/file-upload.types.d.ts +76 -0
  70. package/dist/file-upload/file-upload.types.d.ts.map +1 -0
  71. package/dist/file-upload/index.d.ts +3 -0
  72. package/dist/file-upload/index.d.ts.map +1 -0
  73. package/dist/icon/Icon.vue.d.ts +29 -0
  74. package/dist/icon/Icon.vue.d.ts.map +1 -0
  75. package/dist/icon/icon.types.d.ts +23 -0
  76. package/dist/icon/icon.types.d.ts.map +1 -0
  77. package/dist/icon/index.d.ts +3 -0
  78. package/dist/icon/index.d.ts.map +1 -0
  79. package/dist/image/Image.vue.d.ts +30 -0
  80. package/dist/image/Image.vue.d.ts.map +1 -0
  81. package/dist/image/image.types.d.ts +48 -0
  82. package/dist/image/image.types.d.ts.map +1 -0
  83. package/dist/image/index.d.ts +3 -0
  84. package/dist/image/index.d.ts.map +1 -0
  85. package/dist/index.css +474 -0
  86. package/dist/index.d.ts +42 -0
  87. package/dist/index.d.ts.map +1 -0
  88. package/dist/index.js +2404 -0
  89. package/dist/index.js.map +1 -0
  90. package/dist/input/Input.vue.d.ts +39 -0
  91. package/dist/input/Input.vue.d.ts.map +1 -0
  92. package/dist/input/index.d.ts +3 -0
  93. package/dist/input/index.d.ts.map +1 -0
  94. package/dist/input/input.types.d.ts +122 -0
  95. package/dist/input/input.types.d.ts.map +1 -0
  96. package/dist/link/Link.vue.d.ts +38 -0
  97. package/dist/link/Link.vue.d.ts.map +1 -0
  98. package/dist/link/index.d.ts +3 -0
  99. package/dist/link/index.d.ts.map +1 -0
  100. package/dist/link/link.types.d.ts +40 -0
  101. package/dist/link/link.types.d.ts.map +1 -0
  102. package/dist/notification/Notification.vue.d.ts +7 -0
  103. package/dist/notification/Notification.vue.d.ts.map +1 -0
  104. package/dist/notification/index.d.ts +3 -0
  105. package/dist/notification/index.d.ts.map +1 -0
  106. package/dist/notification/notification.types.d.ts +25 -0
  107. package/dist/notification/notification.types.d.ts.map +1 -0
  108. package/dist/pagination/Pagination.vue.d.ts +34 -0
  109. package/dist/pagination/Pagination.vue.d.ts.map +1 -0
  110. package/dist/pagination/index.d.ts +3 -0
  111. package/dist/pagination/index.d.ts.map +1 -0
  112. package/dist/pagination/pagination.types.d.ts +54 -0
  113. package/dist/pagination/pagination.types.d.ts.map +1 -0
  114. package/dist/radio/Radio.vue.d.ts +42 -0
  115. package/dist/radio/Radio.vue.d.ts.map +1 -0
  116. package/dist/radio/index.d.ts +3 -0
  117. package/dist/radio/index.d.ts.map +1 -0
  118. package/dist/radio/radio.types.d.ts +84 -0
  119. package/dist/radio/radio.types.d.ts.map +1 -0
  120. package/dist/scroll-to-top/ScrollToTop.vue.d.ts +14 -0
  121. package/dist/scroll-to-top/ScrollToTop.vue.d.ts.map +1 -0
  122. package/dist/scroll-to-top/index.d.ts +3 -0
  123. package/dist/scroll-to-top/index.d.ts.map +1 -0
  124. package/dist/scroll-to-top/scroll-to-top.types.d.ts +33 -0
  125. package/dist/scroll-to-top/scroll-to-top.types.d.ts.map +1 -0
  126. package/dist/select/Select.vue.d.ts +42 -0
  127. package/dist/select/Select.vue.d.ts.map +1 -0
  128. package/dist/select/index.d.ts +3 -0
  129. package/dist/select/index.d.ts.map +1 -0
  130. package/dist/select/select.types.d.ts +52 -0
  131. package/dist/select/select.types.d.ts.map +1 -0
  132. package/dist/skeleton/Skeleton.vue.d.ts +9 -0
  133. package/dist/skeleton/Skeleton.vue.d.ts.map +1 -0
  134. package/dist/skeleton/index.d.ts +3 -0
  135. package/dist/skeleton/index.d.ts.map +1 -0
  136. package/dist/skeleton/skeleton.types.d.ts +30 -0
  137. package/dist/skeleton/skeleton.types.d.ts.map +1 -0
  138. package/dist/spinner/Spinner.vue.d.ts +8 -0
  139. package/dist/spinner/Spinner.vue.d.ts.map +1 -0
  140. package/dist/spinner/index.d.ts +3 -0
  141. package/dist/spinner/index.d.ts.map +1 -0
  142. package/dist/spinner/spinner.types.d.ts +12 -0
  143. package/dist/spinner/spinner.types.d.ts.map +1 -0
  144. package/dist/split-button/SplitButton.vue.d.ts +25 -0
  145. package/dist/split-button/SplitButton.vue.d.ts.map +1 -0
  146. package/dist/split-button/index.d.ts +3 -0
  147. package/dist/split-button/index.d.ts.map +1 -0
  148. package/dist/split-button/split-button.types.d.ts +19 -0
  149. package/dist/split-button/split-button.types.d.ts.map +1 -0
  150. package/dist/stepper/Stepper.vue.d.ts +30 -0
  151. package/dist/stepper/Stepper.vue.d.ts.map +1 -0
  152. package/dist/stepper/index.d.ts +3 -0
  153. package/dist/stepper/index.d.ts.map +1 -0
  154. package/dist/stepper/stepper.types.d.ts +29 -0
  155. package/dist/stepper/stepper.types.d.ts.map +1 -0
  156. package/dist/switch/Switch.vue.d.ts +32 -0
  157. package/dist/switch/Switch.vue.d.ts.map +1 -0
  158. package/dist/switch/index.d.ts +3 -0
  159. package/dist/switch/index.d.ts.map +1 -0
  160. package/dist/switch/switch.types.d.ts +14 -0
  161. package/dist/switch/switch.types.d.ts.map +1 -0
  162. package/dist/tab/Tab.vue.d.ts +31 -0
  163. package/dist/tab/Tab.vue.d.ts.map +1 -0
  164. package/dist/tab/index.d.ts +3 -0
  165. package/dist/tab/index.d.ts.map +1 -0
  166. package/dist/tab/tab.types.d.ts +17 -0
  167. package/dist/tab/tab.types.d.ts.map +1 -0
  168. package/dist/table/Table.vue.d.ts +181 -0
  169. package/dist/table/Table.vue.d.ts.map +1 -0
  170. package/dist/table/index.d.ts +3 -0
  171. package/dist/table/index.d.ts.map +1 -0
  172. package/dist/table/table.types.d.ts +61 -0
  173. package/dist/table/table.types.d.ts.map +1 -0
  174. package/dist/tag/Tag.vue.d.ts +31 -0
  175. package/dist/tag/Tag.vue.d.ts.map +1 -0
  176. package/dist/tag/index.d.ts +3 -0
  177. package/dist/tag/index.d.ts.map +1 -0
  178. package/dist/tag/tag.types.d.ts +22 -0
  179. package/dist/tag/tag.types.d.ts.map +1 -0
  180. package/dist/textarea/Textarea.vue.d.ts +35 -0
  181. package/dist/textarea/Textarea.vue.d.ts.map +1 -0
  182. package/dist/textarea/index.d.ts +3 -0
  183. package/dist/textarea/index.d.ts.map +1 -0
  184. package/dist/textarea/textarea.types.d.ts +37 -0
  185. package/dist/textarea/textarea.types.d.ts.map +1 -0
  186. package/dist/tooltip/Tooltip.vue.d.ts +33 -0
  187. package/dist/tooltip/Tooltip.vue.d.ts.map +1 -0
  188. package/dist/tooltip/index.d.ts +3 -0
  189. package/dist/tooltip/index.d.ts.map +1 -0
  190. package/dist/tooltip/tooltip.types.d.ts +17 -0
  191. package/dist/tooltip/tooltip.types.d.ts.map +1 -0
  192. package/dist/utils/loadBaklavaResources.d.ts +2 -0
  193. package/dist/utils/loadBaklavaResources.d.ts.map +1 -0
  194. package/package.json +18 -2
  195. package/.releaserc.json +0 -14
  196. package/CHANGELOG.md +0 -88
  197. package/env.d.ts +0 -5
  198. package/index.ts +0 -1
  199. package/src/accordion/Accordion.spec.ts +0 -75
  200. package/src/accordion/Accordion.vue +0 -206
  201. package/src/accordion/accordion.types.ts +0 -109
  202. package/src/accordion/index.ts +0 -3
  203. package/src/alert/Alert.spec.ts +0 -38
  204. package/src/alert/Alert.vue +0 -199
  205. package/src/alert/alert.types.ts +0 -58
  206. package/src/alert/index.ts +0 -2
  207. package/src/badge/Badge.spec.ts +0 -28
  208. package/src/badge/Badge.vue +0 -20
  209. package/src/badge/badge.types.ts +0 -7
  210. package/src/badge/index.ts +0 -2
  211. package/src/banner/Banner.spec.ts +0 -111
  212. package/src/banner/Banner.vue +0 -265
  213. package/src/banner/banner.types.ts +0 -86
  214. package/src/banner/index.ts +0 -2
  215. package/src/button/Button.spec.ts +0 -51
  216. package/src/button/Button.vue +0 -45
  217. package/src/button/button.types.ts +0 -30
  218. package/src/button/index.ts +0 -3
  219. package/src/checkbox/Checkbox.spec.ts +0 -216
  220. package/src/checkbox/Checkbox.vue +0 -148
  221. package/src/checkbox/checkbox.types.ts +0 -108
  222. package/src/checkbox/index.ts +0 -2
  223. package/src/chip/Chip.spec.ts +0 -49
  224. package/src/chip/Chip.vue +0 -237
  225. package/src/chip/chip.types.ts +0 -77
  226. package/src/chip/index.ts +0 -2
  227. package/src/datepicker/Datepicker.spec.ts +0 -129
  228. package/src/datepicker/Datepicker.vue +0 -172
  229. package/src/datepicker/datepicker.types.ts +0 -39
  230. package/src/datepicker/index.ts +0 -2
  231. package/src/dialog/Dialog.spec.ts +0 -111
  232. package/src/dialog/Dialog.vue +0 -178
  233. package/src/dialog/dialog.types.ts +0 -17
  234. package/src/dialog/index.ts +0 -2
  235. package/src/drawer/Drawer.spec.ts +0 -102
  236. package/src/drawer/Drawer.vue +0 -162
  237. package/src/drawer/drawer.types.ts +0 -17
  238. package/src/drawer/index.ts +0 -2
  239. package/src/dropdown/Dropdown.spec.ts +0 -207
  240. package/src/dropdown/Dropdown.vue +0 -231
  241. package/src/dropdown/dropdown.types.ts +0 -110
  242. package/src/dropdown/index.ts +0 -2
  243. package/src/file-upload/FileUpload.spec.ts +0 -359
  244. package/src/file-upload/FileUpload.vue +0 -440
  245. package/src/file-upload/file-upload.types.ts +0 -89
  246. package/src/file-upload/index.ts +0 -7
  247. package/src/icon/Icon.spec.ts +0 -40
  248. package/src/icon/Icon.vue +0 -102
  249. package/src/icon/icon.types.ts +0 -25
  250. package/src/icon/index.ts +0 -2
  251. package/src/image/Image.spec.ts +0 -23
  252. package/src/image/Image.vue +0 -144
  253. package/src/image/image.types.ts +0 -57
  254. package/src/image/index.ts +0 -3
  255. package/src/index.ts +0 -43
  256. package/src/input/Input.spec.ts +0 -69
  257. package/src/input/Input.vue +0 -148
  258. package/src/input/index.ts +0 -3
  259. package/src/input/input.types.ts +0 -156
  260. package/src/link/Link.spec.ts +0 -69
  261. package/src/link/Link.vue +0 -133
  262. package/src/link/index.ts +0 -2
  263. package/src/link/link.types.ts +0 -42
  264. package/src/notification/Notification.spec.ts +0 -18
  265. package/src/notification/Notification.vue +0 -57
  266. package/src/notification/index.ts +0 -2
  267. package/src/notification/notification.types.ts +0 -25
  268. package/src/pagination/Pagination.spec.ts +0 -39
  269. package/src/pagination/Pagination.vue +0 -137
  270. package/src/pagination/index.ts +0 -2
  271. package/src/pagination/pagination.types.ts +0 -61
  272. package/src/radio/Radio.spec.ts +0 -149
  273. package/src/radio/Radio.vue +0 -205
  274. package/src/radio/index.ts +0 -2
  275. package/src/radio/radio.types.ts +0 -95
  276. package/src/scroll-to-top/ScrollToTop.spec.ts +0 -119
  277. package/src/scroll-to-top/ScrollToTop.vue +0 -130
  278. package/src/scroll-to-top/index.ts +0 -2
  279. package/src/scroll-to-top/scroll-to-top.types.ts +0 -42
  280. package/src/select/Select.spec.ts +0 -47
  281. package/src/select/Select.vue +0 -147
  282. package/src/select/index.ts +0 -2
  283. package/src/select/select.types.ts +0 -53
  284. package/src/skeleton/Skeleton.spec.ts +0 -28
  285. package/src/skeleton/Skeleton.vue +0 -115
  286. package/src/skeleton/index.ts +0 -2
  287. package/src/skeleton/skeleton.types.ts +0 -33
  288. package/src/spinner/Spinner.spec.ts +0 -28
  289. package/src/spinner/Spinner.vue +0 -49
  290. package/src/spinner/index.ts +0 -2
  291. package/src/spinner/spinner.types.ts +0 -11
  292. package/src/split-button/SplitButton.spec.ts +0 -24
  293. package/src/split-button/SplitButton.vue +0 -73
  294. package/src/split-button/index.ts +0 -2
  295. package/src/split-button/split-button.types.ts +0 -19
  296. package/src/stepper/Stepper.spec.ts +0 -37
  297. package/src/stepper/Stepper.vue +0 -100
  298. package/src/stepper/index.ts +0 -2
  299. package/src/stepper/stepper.types.ts +0 -29
  300. package/src/switch/Switch.spec.ts +0 -30
  301. package/src/switch/Switch.vue +0 -80
  302. package/src/switch/index.ts +0 -2
  303. package/src/switch/switch.types.ts +0 -13
  304. package/src/tab/Tab.spec.ts +0 -87
  305. package/src/tab/Tab.vue +0 -99
  306. package/src/tab/index.ts +0 -2
  307. package/src/tab/tab.types.ts +0 -17
  308. package/src/table/Table.spec.ts +0 -185
  309. package/src/table/Table.vue +0 -264
  310. package/src/table/index.ts +0 -7
  311. package/src/table/table.types.ts +0 -62
  312. package/src/tag/Tag.spec.ts +0 -84
  313. package/src/tag/Tag.vue +0 -83
  314. package/src/tag/index.ts +0 -2
  315. package/src/tag/tag.types.ts +0 -24
  316. package/src/textarea/Textarea.spec.ts +0 -105
  317. package/src/textarea/Textarea.vue +0 -84
  318. package/src/textarea/index.ts +0 -2
  319. package/src/textarea/textarea.types.ts +0 -37
  320. package/src/tooltip/Tooltip.spec.ts +0 -46
  321. package/src/tooltip/Tooltip.vue +0 -81
  322. package/src/tooltip/index.ts +0 -3
  323. package/src/tooltip/tooltip.types.ts +0 -29
  324. package/src/utils/loadBaklavaResources.ts +0 -24
  325. package/tests/setup.ts +0 -352
  326. package/tsconfig.json +0 -29
  327. package/vitest.config.ts +0 -32
@@ -1,185 +0,0 @@
1
- import { mount } from "@vue/test-utils";
2
- import { describe, expect, it } from "vitest";
3
- import BvTable from "./Table.vue";
4
-
5
- describe("BvTable", () => {
6
- const columns = [
7
- { key: "name", label: "Name" },
8
- { key: "age", label: "Age" },
9
- ];
10
- const data = [
11
- { id: 1, name: "Alice", age: 30 },
12
- { id: 2, name: "Bob", age: 25 },
13
- ];
14
-
15
- it("renders table with columns and data", () => {
16
- const wrapper = mount(BvTable, {
17
- props: { columns, data },
18
- });
19
- expect(wrapper.find("bl-table").exists()).toBe(true);
20
- expect(wrapper.text()).toContain("Alice");
21
- expect(wrapper.text()).toContain("Bob");
22
- });
23
-
24
- it("shows loading state when isLoading is true", () => {
25
- const wrapper = mount(BvTable, {
26
- props: { columns, data, isLoading: true },
27
- });
28
- expect(wrapper.find("bl-table").exists()).toBe(true);
29
- expect(wrapper.text()).toContain("Loading");
30
- });
31
-
32
- it("shows empty state when data is empty", () => {
33
- const wrapper = mount(BvTable, {
34
- props: { columns, data: [] },
35
- slots: { "empty-state": "No data found" },
36
- });
37
- expect(wrapper.text()).toContain("No data found");
38
- });
39
-
40
- it("renders title and header-actions slot", () => {
41
- const wrapper = mount(BvTable, {
42
- props: { columns, data, title: "My Table" },
43
- slots: { "header-actions": "<button>Action</button>" },
44
- });
45
- expect(wrapper.find(".header").exists()).toBe(true);
46
- expect(wrapper.find(".--title").text()).toBe("My Table");
47
- expect(wrapper.text()).toContain("Action");
48
- });
49
-
50
- it("shows custom loadingText", () => {
51
- const wrapper = mount(BvTable, {
52
- props: { columns, data, isLoading: true, loadingText: "Please wait" },
53
- });
54
- expect(wrapper.text()).toContain("Please wait");
55
- });
56
-
57
- it("selectable with selected array maps ids to strings", () => {
58
- const wrapper = mount(BvTable, {
59
- props: { columns, data, selectable: true, selected: [1, 2] },
60
- });
61
- const blTable = wrapper.find("bl-table");
62
- expect(blTable.exists()).toBe(true);
63
- // selectable attribute should be set
64
- expect(blTable.attributes("selectable")).toBeDefined();
65
- });
66
-
67
- it("selectable without selected prop returns empty (s == null branch)", () => {
68
- const wrapper = mount(BvTable, {
69
- props: { columns, data, selectable: true },
70
- });
71
- const blTable = wrapper.find("bl-table");
72
- expect(blTable.exists()).toBe(true);
73
- expect(blTable.attributes("selectable")).toBeDefined();
74
- });
75
-
76
- it("emits sort on bl-sort event", async () => {
77
- const wrapper = mount(BvTable, {
78
- props: { columns, data, sortable: true },
79
- });
80
- wrapper.find("bl-table").element.dispatchEvent(
81
- new CustomEvent("bl-sort", { bubbles: true, detail: { sortKey: "name", sortDirection: "asc" } }),
82
- );
83
- await wrapper.vm.$nextTick();
84
- expect(wrapper.emitted("sort")).toHaveLength(1);
85
- });
86
-
87
- it("emits select on bl-row-select event", async () => {
88
- const wrapper = mount(BvTable, {
89
- props: { columns, data, selectable: true, selected: [1] },
90
- });
91
- wrapper.find("bl-table").element.dispatchEvent(
92
- new CustomEvent("bl-row-select", { bubbles: true, detail: { selectedRows: [1, 2] } }),
93
- );
94
- await wrapper.vm.$nextTick();
95
- expect(wrapper.emitted("select")).toHaveLength(1);
96
- });
97
-
98
- it("renders pagination and emits change on bl-change", async () => {
99
- const wrapper = mount(BvTable, {
100
- props: {
101
- columns,
102
- data,
103
- pagination: {
104
- currentPage: 1,
105
- totalItems: 50,
106
- itemsPerPage: 10,
107
- hasJumper: true,
108
- jumperLabel: "Jump",
109
- hasSelect: true,
110
- selectLabel: "Per page",
111
- },
112
- },
113
- });
114
- expect(wrapper.find(".pagination-wrapper").exists()).toBe(true);
115
- const blPagination = wrapper.find("bl-pagination");
116
- expect(blPagination.exists()).toBe(true);
117
- blPagination.element.dispatchEvent(
118
- new CustomEvent("bl-change", { bubbles: true, detail: { selectedPage: 2 } }),
119
- );
120
- await wrapper.vm.$nextTick();
121
- expect(wrapper.emitted("change")).toHaveLength(1);
122
- });
123
-
124
- it("uses getColumnLabel fallbacks: name > label > key", () => {
125
- const mixedColumns = [
126
- { key: "a", name: "ColName" },
127
- { key: "b", label: "ColLabel" },
128
- { key: "c" },
129
- ];
130
- const mixedData = [{ id: 1, a: "v1", b: "v2", c: "v3" }];
131
- const wrapper = mount(BvTable, {
132
- props: { columns: mixedColumns, data: mixedData },
133
- });
134
- expect(wrapper.text()).toContain("ColName");
135
- expect(wrapper.text()).toContain("ColLabel");
136
- expect(wrapper.text()).toContain("c");
137
- });
138
-
139
- it("uses index as row key when row has no id", () => {
140
- const noIdData = [
141
- { name: "NoId1", age: 20 },
142
- { name: "NoId2", age: 22 },
143
- ];
144
- const wrapper = mount(BvTable, {
145
- props: { columns, data: noIdData },
146
- });
147
- expect(wrapper.text()).toContain("NoId1");
148
- expect(wrapper.text()).toContain("NoId2");
149
- });
150
-
151
- it("sortable table with column.sortable false omits sort-key", () => {
152
- const sortColumns = [
153
- { key: "name", label: "Name", sortable: true },
154
- { key: "age", label: "Age", sortable: false },
155
- ];
156
- const wrapper = mount(BvTable, {
157
- props: { columns: sortColumns, data, sortable: true },
158
- });
159
- const headerCells = wrapper.findAll("bl-table-header-cell");
160
- expect(headerCells[0].attributes("sort-key")).toBe("name");
161
- expect(headerCells[1].attributes("sort-key")).toBeUndefined();
162
- });
163
-
164
- it("applies headerOptions sticky and minCellWidth", () => {
165
- const wrapper = mount(BvTable, {
166
- props: {
167
- columns,
168
- data,
169
- headerOptions: { sticky: true, minCellWidth: "150px" },
170
- },
171
- });
172
- const header = wrapper.find("bl-table-header");
173
- expect(header.attributes("sticky")).toBeDefined();
174
- const cell = wrapper.find("bl-table-header-cell");
175
- expect(cell.attributes("style")).toContain("150px");
176
- });
177
-
178
- it("renders with multiple prop", () => {
179
- const wrapper = mount(BvTable, {
180
- props: { columns, data, selectable: true, multiple: true, selected: [1] },
181
- });
182
- const blTable = wrapper.find("bl-table");
183
- expect(blTable.attributes("multiple")).toBeDefined();
184
- });
185
- });
@@ -1,264 +0,0 @@
1
- <script setup lang="ts">
2
- /**
3
- * Table Component
4
- *
5
- * A Vue UI kit component for Baklava's `bl-table` web component for displaying tabular data.
6
- * Supports columns, data, sorting, row selection, loading/empty states, pagination,
7
- * and custom slots for header actions, empty state, and per-column cell content.
8
- *
9
- * @component
10
- * @example
11
- * ```vue
12
- * <!-- Basic usage -->
13
- * <template>
14
- * <BvTable :columns="columns" :data="tableData" />
15
- * </template>
16
- * ```
17
- *
18
- * @example
19
- * ```vue
20
- * <!-- With loading and empty states -->
21
- * <template>
22
- * <BvTable
23
- * :columns="columns"
24
- * :data="tableData"
25
- * :is-loading="isLoading"
26
- * >
27
- * <template #empty-state>
28
- * <span>No data found</span>
29
- * </template>
30
- * </BvTable>
31
- * </template>
32
- * ```
33
- */
34
- import { computed, onMounted, type PropType } from "vue";
35
- import { loadBaklavaResources } from "../utils/loadBaklavaResources";
36
- import BvSpinner from "../spinner/Spinner.vue";
37
- import type {
38
- TableColumn,
39
- TableRow,
40
- TablePaginationProps,
41
- } from "./table.types";
42
-
43
- defineOptions({ inheritAttrs: false });
44
-
45
- const props = defineProps({
46
- title: { type: String, default: undefined },
47
- headerOptions: {
48
- type: Object as PropType<{ sticky?: boolean; minCellWidth?: string }>,
49
- default: undefined,
50
- },
51
- data: { type: Array as PropType<TableRow[]>, default: () => [] },
52
- columns: { type: Array as PropType<TableColumn[]>, default: undefined },
53
- sortable: { type: Boolean, default: undefined },
54
- selectable: { type: Boolean, default: undefined },
55
- multiple: { type: Boolean, default: undefined },
56
- selected: {
57
- type: Array as PropType<(string | number)[]>,
58
- default: undefined,
59
- },
60
- sortKey: { type: String, default: undefined },
61
- sortDirection: { type: String, default: undefined },
62
- stickyFirstColumn: { type: Boolean, default: undefined },
63
- stickyLastColumn: { type: Boolean, default: undefined },
64
- isLoading: { type: Boolean, default: undefined },
65
- pagination: {
66
- type: Object as PropType<TablePaginationProps>,
67
- default: undefined,
68
- },
69
- loadingText: { type: String, default: "Loading..." },
70
- });
71
-
72
- const emit = defineEmits<{
73
- /**
74
- * Emitted when a row is clicked.
75
- * @param {CustomEvent} event - The bl-row-click event.
76
- */
77
- "row-click": [event: CustomEvent];
78
- /**
79
- * Emitted when table sort options change.
80
- * @param {CustomEvent} event - The bl-sort event.
81
- */
82
- sort: [event: CustomEvent];
83
- /**
84
- * Emitted when selected rows change.
85
- * @param {CustomEvent} event - The bl-row-select event.
86
- */
87
- select: [event: CustomEvent];
88
- /**
89
- * Emitted when pagination changes.
90
- * @param {CustomEvent} event - The bl-change event with selectedPage, prevPage, itemsPerPage.
91
- */
92
- change: [event: CustomEvent];
93
- }>();
94
-
95
- /**
96
- * Baklava table expects selected IDs to always be strings,
97
- * even when the actual data IDs might be numbers.
98
- */
99
- const selectedIdsAsStrings = computed(() => {
100
- const s = props.selected;
101
- if (s == null || !Array.isArray(s)) return [];
102
- return s.map((id) => String(id));
103
- });
104
-
105
- /** Column header text: prefer name, then label, then key */
106
- const getColumnLabel = (col: { key: string; label?: string; name?: string }) =>
107
- col.name ?? col.label ?? col.key;
108
-
109
- /** Row key for :key and selection-key: prefer row.id, fallback to index */
110
- const getRowKey = (row: Record<string, unknown> & { id?: string | number }, index: number) =>
111
- row.id != null ? String(row.id) : String(index);
112
-
113
- onMounted(() => {
114
- loadBaklavaResources();
115
- });
116
- </script>
117
-
118
- <template>
119
- <div class="table">
120
- <div v-if="props.title" class="header">
121
- <span class="--title">{{ props.title }}</span>
122
- <slot name="header-actions" />
123
- </div>
124
-
125
- <div class="table-content">
126
- <!-- Loading state -->
127
- <bl-table v-if="props.isLoading">
128
- <div class="loading-state">
129
- <BvSpinner />
130
- <span>{{ props.loadingText }}</span>
131
- </div>
132
- </bl-table>
133
-
134
- <!-- Empty state -->
135
- <bl-table v-else-if="!props.data?.length">
136
- <div class="empty-state">
137
- <slot name="empty-state" />
138
- </div>
139
- </bl-table>
140
-
141
- <!-- Data table -->
142
- <bl-table
143
- v-else
144
- v-bind="{
145
- sortable: props.sortable === true ? true : undefined,
146
- selectable: props.selectable === true ? true : undefined,
147
- multiple: props.multiple === true ? true : undefined,
148
- ...(props.selectable && { selected: selectedIdsAsStrings }),
149
- sortKey: props.sortKey,
150
- sortDirection: props.sortDirection,
151
- stickyFirstColumn: props.stickyFirstColumn,
152
- stickyLastColumn: props.stickyLastColumn,
153
- }"
154
- @bl-sort="emit('sort', $event)"
155
- @bl-row-select="emit('select', $event)"
156
- >
157
- <bl-table-header :sticky="props.headerOptions?.sticky">
158
- <bl-table-row>
159
- <bl-table-header-cell
160
- v-for="column in props.columns"
161
- :key="column.key"
162
- :sort-key="
163
- props.sortable && column.sortable !== false ? column.key : undefined
164
- "
165
- :style="{
166
- '--bl-table-header-cell-min-width':
167
- props.headerOptions?.minCellWidth || '100px',
168
- }"
169
- >
170
- {{ getColumnLabel(column) }}
171
- </bl-table-header-cell>
172
- </bl-table-row>
173
- </bl-table-header>
174
-
175
- <bl-table-body>
176
- <bl-table-row
177
- v-for="(row, index) in props.data"
178
- :key="getRowKey(row, index)"
179
- :selection-key="props.selectable ? getRowKey(row, index) : undefined"
180
- >
181
- <bl-table-cell v-for="column in props.columns" :key="column.key">
182
- <slot
183
- :name="column.key"
184
- :row="row"
185
- :value="row[column.key]"
186
- >
187
- {{ row[column.key] }}
188
- </slot>
189
- </bl-table-cell>
190
- </bl-table-row>
191
- </bl-table-body>
192
- </bl-table>
193
- </div>
194
-
195
- <div v-if="props.pagination" class="pagination-wrapper">
196
- <bl-pagination
197
- :current-page="props.pagination!.currentPage"
198
- :total-items="props.pagination!.totalItems"
199
- :items-per-page="props.pagination!.itemsPerPage"
200
- :has-jumper="props.pagination!.hasJumper ?? undefined"
201
- :has-select="props.pagination!.hasSelect ?? undefined"
202
- :jumper-label="props.pagination!.jumperLabel ?? 'Go to page'"
203
- :select-label="props.pagination!.selectLabel ?? 'Items per page'"
204
- :items-per-page-options="props.pagination!.itemsPerPageOptions"
205
- @bl-change="emit('change', $event)"
206
- />
207
- </div>
208
- </div>
209
- </template>
210
-
211
- <style lang="css" scoped>
212
- .table {
213
- display: flex;
214
- flex-direction: column;
215
- gap: 24px;
216
- }
217
-
218
- .header {
219
- display: flex;
220
- align-items: center;
221
- justify-content: space-between;
222
- }
223
-
224
- .--title {
225
- font: var(--bl-font-title-1-medium);
226
- }
227
-
228
- .table-content {
229
- width: 100%;
230
- overflow-x: auto;
231
- }
232
-
233
- .table-content > bl-table {
234
- min-width: max-content;
235
- }
236
-
237
- .loading-state {
238
- display: flex;
239
- flex-direction: column;
240
- align-items: center;
241
- justify-content: center;
242
- padding: 48px;
243
- gap: 16px;
244
- }
245
-
246
- .loading-state span {
247
- font: var(--bl-font-body-2-regular);
248
- color: var(--bl-color-primary);
249
- }
250
-
251
- .empty-state {
252
- display: flex;
253
- flex-direction: column;
254
- align-items: center;
255
- justify-content: center;
256
- padding: 48px;
257
- gap: 12px;
258
- }
259
-
260
- .pagination-wrapper {
261
- display: flex;
262
- justify-content: flex-end;
263
- }
264
- </style>
@@ -1,7 +0,0 @@
1
- export { default as BvTable } from "./Table.vue";
2
- export type {
3
- TableProps,
4
- TableColumn,
5
- TableRow,
6
- TablePaginationProps,
7
- } from "./table.types";
@@ -1,62 +0,0 @@
1
- import type { ItemsPerPageOption } from "../pagination/pagination.types";
2
-
3
- /** Table column definition */
4
- export interface TableColumn {
5
- key: string;
6
- /** Column header text (alias: use `name` or `label`) */
7
- label?: string;
8
- /** Column header text (alias: use `name` or `label`) */
9
- name?: string;
10
- sortable?: boolean;
11
- }
12
-
13
- /** Table row data (record of column keys to values). When selectable, rows should have `id`. */
14
- export type TableRow = Record<string, unknown> & { id?: string | number };
15
-
16
- /** Pagination props for table integration */
17
- export interface TablePaginationProps {
18
- currentPage: number;
19
- totalItems: number;
20
- itemsPerPage: number;
21
- hasJumper?: boolean;
22
- jumperLabel?: string;
23
- hasSelect?: boolean;
24
- selectLabel?: string;
25
- itemsPerPageOptions?: ItemsPerPageOption[];
26
- }
27
-
28
- export interface TableProps {
29
- /** Optional title displayed above the table */
30
- title?: string;
31
- /** Header options: sticky, minCellWidth */
32
- headerOptions?: {
33
- sticky?: boolean;
34
- minCellWidth?: string;
35
- };
36
- /** Table data rows */
37
- data?: TableRow[];
38
- /** Column definitions */
39
- columns?: TableColumn[];
40
- /** Enable column sorting */
41
- sortable?: boolean;
42
- /** Enable row selection */
43
- selectable?: boolean;
44
- /** Enable multiple row selection */
45
- multiple?: boolean;
46
- /** Selected row selection keys (use with v-model:selected when selectable). Accepts string or number ids. */
47
- selected?: (string | number)[];
48
- /** Sort key for the sorted column */
49
- sortKey?: string;
50
- /** Sort direction: '' | 'asc' | 'desc' */
51
- sortDirection?: string;
52
- /** Make first column sticky */
53
- stickyFirstColumn?: boolean;
54
- /** Make last column sticky */
55
- stickyLastColumn?: boolean;
56
- /** Show loading state */
57
- isLoading?: boolean;
58
- /** Pagination configuration */
59
- pagination?: TablePaginationProps;
60
- /** Text shown in loading state */
61
- loadingText?: string;
62
- }
@@ -1,84 +0,0 @@
1
- import { mount } from "@vue/test-utils";
2
- import { describe, expect, it } from "vitest";
3
- import BvTag from "./Tag.vue";
4
-
5
- describe("BvTag", () => {
6
- it("renders with default props", () => {
7
- const wrapper = mount(BvTag);
8
- expect(wrapper.find("bl-tag").exists()).toBe(true);
9
- });
10
-
11
- it("passes variant and size to bl-tag", () => {
12
- const wrapper = mount(BvTag, {
13
- props: { variant: "selectable", size: "small" },
14
- });
15
- const el = wrapper.find("bl-tag").element;
16
- expect(el.getAttribute("variant")).toBe("selectable");
17
- expect(el.getAttribute("size")).toBe("small");
18
- });
19
-
20
- it("emits close when closable tag receives bl-tag-click", async () => {
21
- const wrapper = mount(BvTag, { props: { closable: true } });
22
- wrapper.find("bl-tag").element.dispatchEvent(
23
- new CustomEvent("bl-tag-click", {
24
- bubbles: true,
25
- detail: { value: null, selected: false },
26
- }),
27
- );
28
- await wrapper.vm.$nextTick();
29
- expect(wrapper.emitted("close")).toHaveLength(1);
30
- });
31
-
32
- it("renders slot content", () => {
33
- const wrapper = mount(BvTag, { slots: { default: "Tag label" } });
34
- expect(wrapper.text()).toContain("Tag label");
35
- });
36
-
37
- it("maps closable prop to variant='removable' on bl-tag", () => {
38
- const wrapper = mount(BvTag, { props: { closable: true } });
39
- const el = wrapper.find("bl-tag").element;
40
- expect(el.getAttribute("variant")).toBe("removable");
41
- });
42
-
43
- it("emits update:selected when selectable tag receives bl-tag-click", async () => {
44
- const wrapper = mount(BvTag, { props: { variant: "selectable" } });
45
- wrapper.find("bl-tag").element.dispatchEvent(
46
- new CustomEvent("bl-tag-click", {
47
- bubbles: true,
48
- detail: { value: "tag1", selected: true },
49
- }),
50
- );
51
- await wrapper.vm.$nextTick();
52
- expect(wrapper.emitted("update:selected")).toEqual([[true]]);
53
- });
54
-
55
- it("does not emit close or update:selected for non-closable non-selectable tag click", async () => {
56
- const wrapper = mount(BvTag);
57
- wrapper.find("bl-tag").element.dispatchEvent(
58
- new CustomEvent("bl-tag-click", {
59
- bubbles: true,
60
- detail: { value: null, selected: false },
61
- }),
62
- );
63
- await wrapper.vm.$nextTick();
64
- expect(wrapper.emitted("close")).toBeUndefined();
65
- expect(wrapper.emitted("update:selected")).toBeUndefined();
66
- });
67
-
68
- it("renders icon slot when provided", () => {
69
- const wrapper = mount(BvTag, {
70
- slots: { icon: "<span class=\"test-icon\">icon</span>", default: "Label" },
71
- });
72
- expect(wrapper.find(".test-icon").exists()).toBe(true);
73
- });
74
-
75
- it("passes disabled, selected, and value props through to bl-tag", () => {
76
- const wrapper = mount(BvTag, {
77
- props: { disabled: true, selected: true, value: "my-val" },
78
- });
79
- const el = wrapper.find("bl-tag").element;
80
- expect(el.getAttribute("disabled")).toBe("true");
81
- expect(el.getAttribute("selected")).toBe("true");
82
- expect(el.getAttribute("value")).toBe("my-val");
83
- });
84
- });
package/src/tag/Tag.vue DELETED
@@ -1,83 +0,0 @@
1
- <script setup lang="ts">
2
- /**
3
- * Tag Component
4
- *
5
- * A Vue UI kit component for Baklava's `bl-tag` web component for displaying tags or labels.
6
- * Supports selectable and removable (closable) variants, sizes, and icons.
7
- *
8
- * @component
9
- * @example
10
- * ```vue
11
- * <!-- Basic usage -->
12
- * <template>
13
- * <BvTag>Label</BvTag>
14
- * </template>
15
- * ```
16
- *
17
- * @example
18
- * ```vue
19
- * <!-- Closable tag -->
20
- * <template>
21
- * <BvTag closable @close="removeTag">Removable</BvTag>
22
- * </template>
23
- * ```
24
- *
25
- * @example
26
- * ```vue
27
- * <!-- With icon -->
28
- * <template>
29
- * <BvTag icon="info">With icon</BvTag>
30
- * </template>
31
- * ```
32
- */
33
- import { onMounted } from "vue";
34
- import { loadBaklavaResources } from "../utils/loadBaklavaResources";
35
- import type { TagProps } from "./tag.types";
36
-
37
- const props = withDefaults(defineProps<TagProps>(), {
38
- variant: undefined,
39
- size: undefined,
40
- closable: undefined,
41
- icon: undefined,
42
- });
43
-
44
- const emit = defineEmits<{
45
- /**
46
- * Emitted when the close button is clicked (removable/closable variant only).
47
- */
48
- close: [];
49
- /**
50
- * Emitted when a selectable tag is clicked. Payload contains the new selected state.
51
- */
52
- "update:selected": [selected: boolean];
53
- }>();
54
-
55
- /**
56
- * Handles bl-tag-click. For removable variant, emit 'close'. For selectable, emit 'update:selected'.
57
- */
58
- const handleTagClick = (event: CustomEvent<{ value: string | null; selected: boolean }>) => {
59
- if (props.closable) {
60
- emit("close");
61
- } else if (props.variant === "selectable" && event.detail) {
62
- emit("update:selected", event.detail.selected);
63
- }
64
- };
65
-
66
- onMounted(() => {
67
- loadBaklavaResources();
68
- });
69
- </script>
70
-
71
- <template>
72
- <bl-tag
73
- v-bind="{
74
- ...props,
75
- variant: props.closable ? 'removable' : props.variant,
76
- closable: undefined,
77
- }"
78
- @bl-tag-click="handleTagClick"
79
- >
80
- <slot v-if="$slots['icon']" name="icon" />
81
- <slot />
82
- </bl-tag>
83
- </template>
package/src/tag/index.ts DELETED
@@ -1,2 +0,0 @@
1
- export { default as BvTag } from "./Tag.vue";
2
- export type { TagProps, TagVariant, TagSize } from "./tag.types";