@bigbot-community/bigbot-ui 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 (352) hide show
  1. package/dist/braip-ui.cjs +2 -0
  2. package/dist/braip-ui.cjs.map +1 -0
  3. package/dist/braip-ui.js +2502 -0
  4. package/dist/braip-ui.js.map +1 -0
  5. package/dist/style.css +1 -0
  6. package/dist/types/components/atoms/BrAvatar/BrAvatar.vue.d.ts +9 -0
  7. package/dist/types/components/atoms/BrAvatar/BrAvatar.vue.d.ts.map +1 -0
  8. package/dist/types/components/atoms/BrAvatar/index.d.ts +3 -0
  9. package/dist/types/components/atoms/BrAvatar/index.d.ts.map +1 -0
  10. package/dist/types/components/atoms/BrAvatar/types.d.ts +37 -0
  11. package/dist/types/components/atoms/BrAvatar/types.d.ts.map +1 -0
  12. package/dist/types/components/atoms/BrBadge/BrBadge.test.d.ts +2 -0
  13. package/dist/types/components/atoms/BrBadge/BrBadge.test.d.ts.map +1 -0
  14. package/dist/types/components/atoms/BrBadge/BrBadge.vue.d.ts +18 -0
  15. package/dist/types/components/atoms/BrBadge/BrBadge.vue.d.ts.map +1 -0
  16. package/dist/types/components/atoms/BrBadge/index.d.ts +3 -0
  17. package/dist/types/components/atoms/BrBadge/index.d.ts.map +1 -0
  18. package/dist/types/components/atoms/BrBadge/types.d.ts +20 -0
  19. package/dist/types/components/atoms/BrBadge/types.d.ts.map +1 -0
  20. package/dist/types/components/atoms/BrButton/BrButton.test.d.ts +2 -0
  21. package/dist/types/components/atoms/BrButton/BrButton.test.d.ts.map +1 -0
  22. package/dist/types/components/atoms/BrButton/BrButton.vue.d.ts +25 -0
  23. package/dist/types/components/atoms/BrButton/BrButton.vue.d.ts.map +1 -0
  24. package/dist/types/components/atoms/BrButton/index.d.ts +3 -0
  25. package/dist/types/components/atoms/BrButton/index.d.ts.map +1 -0
  26. package/dist/types/components/atoms/BrButton/types.d.ts +35 -0
  27. package/dist/types/components/atoms/BrButton/types.d.ts.map +1 -0
  28. package/dist/types/components/atoms/BrCheckbox/BrCheckbox.test.d.ts +2 -0
  29. package/dist/types/components/atoms/BrCheckbox/BrCheckbox.test.d.ts.map +1 -0
  30. package/dist/types/components/atoms/BrCheckbox/BrCheckbox.vue.d.ts +29 -0
  31. package/dist/types/components/atoms/BrCheckbox/BrCheckbox.vue.d.ts.map +1 -0
  32. package/dist/types/components/atoms/BrCheckbox/BrCheckboxGroup.vue.d.ts +17 -0
  33. package/dist/types/components/atoms/BrCheckbox/BrCheckboxGroup.vue.d.ts.map +1 -0
  34. package/dist/types/components/atoms/BrCheckbox/index.d.ts +4 -0
  35. package/dist/types/components/atoms/BrCheckbox/index.d.ts.map +1 -0
  36. package/dist/types/components/atoms/BrCheckbox/types.d.ts +86 -0
  37. package/dist/types/components/atoms/BrCheckbox/types.d.ts.map +1 -0
  38. package/dist/types/components/atoms/BrImage/BrImage.vue.d.ts +9 -0
  39. package/dist/types/components/atoms/BrImage/BrImage.vue.d.ts.map +1 -0
  40. package/dist/types/components/atoms/BrImage/index.d.ts +3 -0
  41. package/dist/types/components/atoms/BrImage/index.d.ts.map +1 -0
  42. package/dist/types/components/atoms/BrImage/types.d.ts +43 -0
  43. package/dist/types/components/atoms/BrImage/types.d.ts.map +1 -0
  44. package/dist/types/components/atoms/BrInput/BrInput.test.d.ts +2 -0
  45. package/dist/types/components/atoms/BrInput/BrInput.test.d.ts.map +1 -0
  46. package/dist/types/components/atoms/BrInput/BrInput.vue.d.ts +35 -0
  47. package/dist/types/components/atoms/BrInput/BrInput.vue.d.ts.map +1 -0
  48. package/dist/types/components/atoms/BrInput/index.d.ts +3 -0
  49. package/dist/types/components/atoms/BrInput/index.d.ts.map +1 -0
  50. package/dist/types/components/atoms/BrInput/types.d.ts +55 -0
  51. package/dist/types/components/atoms/BrInput/types.d.ts.map +1 -0
  52. package/dist/types/components/atoms/BrProgressbar/BrProgressbar.vue.d.ts +15 -0
  53. package/dist/types/components/atoms/BrProgressbar/BrProgressbar.vue.d.ts.map +1 -0
  54. package/dist/types/components/atoms/BrProgressbar/index.d.ts +3 -0
  55. package/dist/types/components/atoms/BrProgressbar/index.d.ts.map +1 -0
  56. package/dist/types/components/atoms/BrProgressbar/types.d.ts +55 -0
  57. package/dist/types/components/atoms/BrProgressbar/types.d.ts.map +1 -0
  58. package/dist/types/components/atoms/BrRadio/BrRadio.vue.d.ts +26 -0
  59. package/dist/types/components/atoms/BrRadio/BrRadio.vue.d.ts.map +1 -0
  60. package/dist/types/components/atoms/BrRadio/BrRadioGroup.vue.d.ts +17 -0
  61. package/dist/types/components/atoms/BrRadio/BrRadioGroup.vue.d.ts.map +1 -0
  62. package/dist/types/components/atoms/BrRadio/index.d.ts +4 -0
  63. package/dist/types/components/atoms/BrRadio/index.d.ts.map +1 -0
  64. package/dist/types/components/atoms/BrRadio/types.d.ts +77 -0
  65. package/dist/types/components/atoms/BrRadio/types.d.ts.map +1 -0
  66. package/dist/types/components/atoms/BrRating/BrRating.vue.d.ts +21 -0
  67. package/dist/types/components/atoms/BrRating/BrRating.vue.d.ts.map +1 -0
  68. package/dist/types/components/atoms/BrRating/index.d.ts +3 -0
  69. package/dist/types/components/atoms/BrRating/index.d.ts.map +1 -0
  70. package/dist/types/components/atoms/BrRating/types.d.ts +51 -0
  71. package/dist/types/components/atoms/BrRating/types.d.ts.map +1 -0
  72. package/dist/types/components/atoms/BrSelect/BrSelect.vue.d.ts +27 -0
  73. package/dist/types/components/atoms/BrSelect/BrSelect.vue.d.ts.map +1 -0
  74. package/dist/types/components/atoms/BrSelect/index.d.ts +3 -0
  75. package/dist/types/components/atoms/BrSelect/index.d.ts.map +1 -0
  76. package/dist/types/components/atoms/BrSelect/types.d.ts +52 -0
  77. package/dist/types/components/atoms/BrSelect/types.d.ts.map +1 -0
  78. package/dist/types/components/atoms/BrSpinner/BrSpinner.vue.d.ts +8 -0
  79. package/dist/types/components/atoms/BrSpinner/BrSpinner.vue.d.ts.map +1 -0
  80. package/dist/types/components/atoms/BrSpinner/index.d.ts +3 -0
  81. package/dist/types/components/atoms/BrSpinner/index.d.ts.map +1 -0
  82. package/dist/types/components/atoms/BrSpinner/types.d.ts +20 -0
  83. package/dist/types/components/atoms/BrSpinner/types.d.ts.map +1 -0
  84. package/dist/types/components/atoms/BrSwitch/BrSwitch.test.d.ts +2 -0
  85. package/dist/types/components/atoms/BrSwitch/BrSwitch.test.d.ts.map +1 -0
  86. package/dist/types/components/atoms/BrSwitch/BrSwitch.vue.d.ts +15 -0
  87. package/dist/types/components/atoms/BrSwitch/BrSwitch.vue.d.ts.map +1 -0
  88. package/dist/types/components/atoms/BrSwitch/index.d.ts +3 -0
  89. package/dist/types/components/atoms/BrSwitch/index.d.ts.map +1 -0
  90. package/dist/types/components/atoms/BrSwitch/types.d.ts +14 -0
  91. package/dist/types/components/atoms/BrSwitch/types.d.ts.map +1 -0
  92. package/dist/types/components/atoms/BrTextarea/BrTextarea.vue.d.ts +31 -0
  93. package/dist/types/components/atoms/BrTextarea/BrTextarea.vue.d.ts.map +1 -0
  94. package/dist/types/components/atoms/BrTextarea/index.d.ts +3 -0
  95. package/dist/types/components/atoms/BrTextarea/index.d.ts.map +1 -0
  96. package/dist/types/components/atoms/BrTextarea/types.d.ts +37 -0
  97. package/dist/types/components/atoms/BrTextarea/types.d.ts.map +1 -0
  98. package/dist/types/components/atoms/BrTitle/BrTitle.vue.d.ts +22 -0
  99. package/dist/types/components/atoms/BrTitle/BrTitle.vue.d.ts.map +1 -0
  100. package/dist/types/components/atoms/BrTitle/index.d.ts +3 -0
  101. package/dist/types/components/atoms/BrTitle/index.d.ts.map +1 -0
  102. package/dist/types/components/atoms/BrTitle/types.d.ts +41 -0
  103. package/dist/types/components/atoms/BrTitle/types.d.ts.map +1 -0
  104. package/dist/types/components/atoms/BrVideo/BrVideo.vue.d.ts +39 -0
  105. package/dist/types/components/atoms/BrVideo/BrVideo.vue.d.ts.map +1 -0
  106. package/dist/types/components/atoms/BrVideo/index.d.ts +3 -0
  107. package/dist/types/components/atoms/BrVideo/index.d.ts.map +1 -0
  108. package/dist/types/components/atoms/BrVideo/types.d.ts +48 -0
  109. package/dist/types/components/atoms/BrVideo/types.d.ts.map +1 -0
  110. package/dist/types/components/atoms/index.d.ts +16 -0
  111. package/dist/types/components/atoms/index.d.ts.map +1 -0
  112. package/dist/types/components/index.d.ts +4 -0
  113. package/dist/types/components/index.d.ts.map +1 -0
  114. package/dist/types/components/molecules/BrAccordion/BrAccordion.vue.d.ts +23 -0
  115. package/dist/types/components/molecules/BrAccordion/BrAccordion.vue.d.ts.map +1 -0
  116. package/dist/types/components/molecules/BrAccordion/BrAccordionItem.vue.d.ts +20 -0
  117. package/dist/types/components/molecules/BrAccordion/BrAccordionItem.vue.d.ts.map +1 -0
  118. package/dist/types/components/molecules/BrAccordion/index.d.ts +4 -0
  119. package/dist/types/components/molecules/BrAccordion/index.d.ts.map +1 -0
  120. package/dist/types/components/molecules/BrAccordion/types.d.ts +72 -0
  121. package/dist/types/components/molecules/BrAccordion/types.d.ts.map +1 -0
  122. package/dist/types/components/molecules/BrCalendar/BrCalendar.vue.d.ts +21 -0
  123. package/dist/types/components/molecules/BrCalendar/BrCalendar.vue.d.ts.map +1 -0
  124. package/dist/types/components/molecules/BrCalendar/index.d.ts +3 -0
  125. package/dist/types/components/molecules/BrCalendar/index.d.ts.map +1 -0
  126. package/dist/types/components/molecules/BrCalendar/types.d.ts +68 -0
  127. package/dist/types/components/molecules/BrCalendar/types.d.ts.map +1 -0
  128. package/dist/types/components/molecules/BrCard/BrCard.vue.d.ts +35 -0
  129. package/dist/types/components/molecules/BrCard/BrCard.vue.d.ts.map +1 -0
  130. package/dist/types/components/molecules/BrCard/index.d.ts +3 -0
  131. package/dist/types/components/molecules/BrCard/index.d.ts.map +1 -0
  132. package/dist/types/components/molecules/BrCard/types.d.ts +61 -0
  133. package/dist/types/components/molecules/BrCard/types.d.ts.map +1 -0
  134. package/dist/types/components/molecules/BrFormField/BrFormField.vue.d.ts +24 -0
  135. package/dist/types/components/molecules/BrFormField/BrFormField.vue.d.ts.map +1 -0
  136. package/dist/types/components/molecules/BrFormField/index.d.ts +3 -0
  137. package/dist/types/components/molecules/BrFormField/index.d.ts.map +1 -0
  138. package/dist/types/components/molecules/BrFormField/types.d.ts +55 -0
  139. package/dist/types/components/molecules/BrFormField/types.d.ts.map +1 -0
  140. package/dist/types/components/molecules/BrModal/BrModal.test.d.ts +2 -0
  141. package/dist/types/components/molecules/BrModal/BrModal.test.d.ts.map +1 -0
  142. package/dist/types/components/molecules/BrModal/BrModal.vue.d.ts +43 -0
  143. package/dist/types/components/molecules/BrModal/BrModal.vue.d.ts.map +1 -0
  144. package/dist/types/components/molecules/BrModal/index.d.ts +3 -0
  145. package/dist/types/components/molecules/BrModal/index.d.ts.map +1 -0
  146. package/dist/types/components/molecules/BrModal/types.d.ts +49 -0
  147. package/dist/types/components/molecules/BrModal/types.d.ts.map +1 -0
  148. package/dist/types/components/molecules/BrStepper/BrStepper.vue.d.ts +22 -0
  149. package/dist/types/components/molecules/BrStepper/BrStepper.vue.d.ts.map +1 -0
  150. package/dist/types/components/molecules/BrStepper/index.d.ts +3 -0
  151. package/dist/types/components/molecules/BrStepper/index.d.ts.map +1 -0
  152. package/dist/types/components/molecules/BrStepper/types.d.ts +65 -0
  153. package/dist/types/components/molecules/BrStepper/types.d.ts.map +1 -0
  154. package/dist/types/components/molecules/BrTabs/BrTab.vue.d.ts +23 -0
  155. package/dist/types/components/molecules/BrTabs/BrTab.vue.d.ts.map +1 -0
  156. package/dist/types/components/molecules/BrTabs/BrTabPanel.vue.d.ts +16 -0
  157. package/dist/types/components/molecules/BrTabs/BrTabPanel.vue.d.ts.map +1 -0
  158. package/dist/types/components/molecules/BrTabs/BrTabs.test.d.ts +2 -0
  159. package/dist/types/components/molecules/BrTabs/BrTabs.test.d.ts.map +1 -0
  160. package/dist/types/components/molecules/BrTabs/BrTabs.vue.d.ts +40 -0
  161. package/dist/types/components/molecules/BrTabs/BrTabs.vue.d.ts.map +1 -0
  162. package/dist/types/components/molecules/BrTabs/index.d.ts +5 -0
  163. package/dist/types/components/molecules/BrTabs/index.d.ts.map +1 -0
  164. package/dist/types/components/molecules/BrTabs/types.d.ts +116 -0
  165. package/dist/types/components/molecules/BrTabs/types.d.ts.map +1 -0
  166. package/dist/types/components/molecules/index.d.ts +8 -0
  167. package/dist/types/components/molecules/index.d.ts.map +1 -0
  168. package/dist/types/components/organisms/BrNavbar/BrNavbar.vue.d.ts +28 -0
  169. package/dist/types/components/organisms/BrNavbar/BrNavbar.vue.d.ts.map +1 -0
  170. package/dist/types/components/organisms/BrNavbar/index.d.ts +3 -0
  171. package/dist/types/components/organisms/BrNavbar/index.d.ts.map +1 -0
  172. package/dist/types/components/organisms/BrNavbar/types.d.ts +84 -0
  173. package/dist/types/components/organisms/BrNavbar/types.d.ts.map +1 -0
  174. package/dist/types/components/organisms/BrSidebar/BrSidebar.vue.d.ts +35 -0
  175. package/dist/types/components/organisms/BrSidebar/BrSidebar.vue.d.ts.map +1 -0
  176. package/dist/types/components/organisms/BrSidebar/index.d.ts +3 -0
  177. package/dist/types/components/organisms/BrSidebar/index.d.ts.map +1 -0
  178. package/dist/types/components/organisms/BrSidebar/types.d.ts +100 -0
  179. package/dist/types/components/organisms/BrSidebar/types.d.ts.map +1 -0
  180. package/dist/types/components/organisms/index.d.ts +3 -0
  181. package/dist/types/components/organisms/index.d.ts.map +1 -0
  182. package/dist/types/index.d.ts +5 -0
  183. package/dist/types/index.d.ts.map +1 -0
  184. package/dist/types/plugin.d.ts +9 -0
  185. package/dist/types/plugin.d.ts.map +1 -0
  186. package/dist/types/types/index.d.ts +48 -0
  187. package/dist/types/types/index.d.ts.map +1 -0
  188. package/package.json +77 -0
  189. package/src/assets/icons/airplane.svg +7 -0
  190. package/src/assets/icons/anchor.svg +6 -0
  191. package/src/assets/icons/arrow-bottom-right-o.svg +9 -0
  192. package/src/assets/icons/arrow-bottom-right-r.svg +9 -0
  193. package/src/assets/icons/arrow-bottom-right.svg +7 -0
  194. package/src/assets/icons/arrow-down-o.svg +9 -0
  195. package/src/assets/icons/arrow-down-r.svg +9 -0
  196. package/src/assets/icons/arrow-down.svg +7 -0
  197. package/src/assets/icons/arrow-left-o.svg +9 -0
  198. package/src/assets/icons/arrow-left-r.svg +9 -0
  199. package/src/assets/icons/arrow-left.svg +7 -0
  200. package/src/assets/icons/arrow-long-up.svg +7 -0
  201. package/src/assets/icons/arrow-right-o.svg +9 -0
  202. package/src/assets/icons/arrow-right-r.svg +9 -0
  203. package/src/assets/icons/arrow-right.svg +7 -0
  204. package/src/assets/icons/arrow-top-left-o.svg +9 -0
  205. package/src/assets/icons/arrow-top-left-r.svg +9 -0
  206. package/src/assets/icons/arrow-top-left.svg +7 -0
  207. package/src/assets/icons/arrow-top-right-o.svg +9 -0
  208. package/src/assets/icons/arrow-top-right-r.svg +9 -0
  209. package/src/assets/icons/arrow-top-right.svg +7 -0
  210. package/src/assets/icons/arrow-up-o.svg +9 -0
  211. package/src/assets/icons/arrow-up-r.svg +9 -0
  212. package/src/assets/icons/arrow-up.svg +7 -0
  213. package/src/assets/icons/awards.svg +6 -0
  214. package/src/assets/icons/band-aid.svg +21 -0
  215. package/src/assets/icons/bee.svg +7 -0
  216. package/src/assets/icons/bitbucket.svg +7 -0
  217. package/src/assets/icons/block.svg +11 -0
  218. package/src/assets/icons/bowl.svg +6 -0
  219. package/src/assets/icons/boy.svg +14 -0
  220. package/src/assets/icons/briefcase.svg +9 -0
  221. package/src/assets/icons/browse.svg +13 -0
  222. package/src/assets/icons/brush.svg +6 -0
  223. package/src/assets/icons/calibrate.svg +11 -0
  224. package/src/assets/icons/cap.svg +9 -0
  225. package/src/assets/icons/card-clubs.svg +17 -0
  226. package/src/assets/icons/card-diamonds.svg +9 -0
  227. package/src/assets/icons/card-hearts.svg +11 -0
  228. package/src/assets/icons/card-spades.svg +11 -0
  229. package/src/assets/icons/check-o.svg +9 -0
  230. package/src/assets/icons/check-r.svg +9 -0
  231. package/src/assets/icons/check.svg +3 -0
  232. package/src/assets/icons/chevron-double-down-o.svg +14 -0
  233. package/src/assets/icons/chevron-double-down-r.svg +14 -0
  234. package/src/assets/icons/chevron-double-down.svg +12 -0
  235. package/src/assets/icons/chevron-double-left-o.svg +14 -0
  236. package/src/assets/icons/chevron-double-left-r.svg +14 -0
  237. package/src/assets/icons/chevron-double-left.svg +12 -0
  238. package/src/assets/icons/chevron-double-right-o.svg +14 -0
  239. package/src/assets/icons/chevron-double-right-r.svg +14 -0
  240. package/src/assets/icons/chevron-double-right.svg +12 -0
  241. package/src/assets/icons/pix.svg +7 -0
  242. package/src/assets/icons/push-chevron-left-o.svg +12 -0
  243. package/src/assets/icons/push-chevron-left-r.svg +12 -0
  244. package/src/assets/icons/push-chevron-left.svg +10 -0
  245. package/src/assets/icons/push-chevron-right-o.svg +12 -0
  246. package/src/assets/icons/push-chevron-right-r.svg +12 -0
  247. package/src/assets/icons/push-chevron-right.svg +10 -0
  248. package/src/assets/icons/push-chevron-up-o.svg +6 -0
  249. package/src/assets/icons/push-chevron-up-r.svg +6 -0
  250. package/src/assets/icons/push-chevron-up.svg +10 -0
  251. package/src/assets/icons/sync.svg +12 -0
  252. package/src/assets/icons/trending-down.svg +7 -0
  253. package/src/assets/icons/trending.svg +7 -0
  254. package/src/components/atoms/BrAvatar/BrAvatar.vue +154 -0
  255. package/src/components/atoms/BrAvatar/index.ts +2 -0
  256. package/src/components/atoms/BrAvatar/types.ts +43 -0
  257. package/src/components/atoms/BrBadge/BrBadge.test.ts +61 -0
  258. package/src/components/atoms/BrBadge/BrBadge.vue +125 -0
  259. package/src/components/atoms/BrBadge/index.ts +2 -0
  260. package/src/components/atoms/BrBadge/types.ts +22 -0
  261. package/src/components/atoms/BrButton/BrButton.test.ts +79 -0
  262. package/src/components/atoms/BrButton/BrButton.vue +291 -0
  263. package/src/components/atoms/BrButton/index.ts +2 -0
  264. package/src/components/atoms/BrButton/types.ts +44 -0
  265. package/src/components/atoms/BrCheckbox/BrCheckbox.test.ts +132 -0
  266. package/src/components/atoms/BrCheckbox/BrCheckbox.vue +198 -0
  267. package/src/components/atoms/BrCheckbox/BrCheckboxGroup.vue +92 -0
  268. package/src/components/atoms/BrCheckbox/index.ts +3 -0
  269. package/src/components/atoms/BrCheckbox/types.ts +102 -0
  270. package/src/components/atoms/BrImage/BrImage.vue +134 -0
  271. package/src/components/atoms/BrImage/index.ts +2 -0
  272. package/src/components/atoms/BrImage/types.ts +51 -0
  273. package/src/components/atoms/BrInput/BrInput.test.ts +98 -0
  274. package/src/components/atoms/BrInput/BrInput.vue +215 -0
  275. package/src/components/atoms/BrInput/index.ts +2 -0
  276. package/src/components/atoms/BrInput/types.ts +65 -0
  277. package/src/components/atoms/BrProgressbar/BrProgressbar.vue +204 -0
  278. package/src/components/atoms/BrProgressbar/index.ts +2 -0
  279. package/src/components/atoms/BrProgressbar/types.ts +64 -0
  280. package/src/components/atoms/BrRadio/BrRadio.vue +175 -0
  281. package/src/components/atoms/BrRadio/BrRadioGroup.vue +77 -0
  282. package/src/components/atoms/BrRadio/index.ts +3 -0
  283. package/src/components/atoms/BrRadio/types.ts +91 -0
  284. package/src/components/atoms/BrRating/BrRating.vue +234 -0
  285. package/src/components/atoms/BrRating/index.ts +2 -0
  286. package/src/components/atoms/BrRating/types.ts +60 -0
  287. package/src/components/atoms/BrSelect/BrSelect.vue +408 -0
  288. package/src/components/atoms/BrSelect/index.ts +2 -0
  289. package/src/components/atoms/BrSelect/types.ts +61 -0
  290. package/src/components/atoms/BrSpinner/BrSpinner.vue +125 -0
  291. package/src/components/atoms/BrSpinner/index.ts +2 -0
  292. package/src/components/atoms/BrSpinner/types.ts +22 -0
  293. package/src/components/atoms/BrSwitch/BrSwitch.test.ts +81 -0
  294. package/src/components/atoms/BrSwitch/BrSwitch.vue +181 -0
  295. package/src/components/atoms/BrSwitch/index.ts +2 -0
  296. package/src/components/atoms/BrSwitch/types.ts +15 -0
  297. package/src/components/atoms/BrTextarea/BrTextarea.vue +179 -0
  298. package/src/components/atoms/BrTextarea/index.ts +2 -0
  299. package/src/components/atoms/BrTextarea/types.ts +43 -0
  300. package/src/components/atoms/BrTitle/BrTitle.vue +154 -0
  301. package/src/components/atoms/BrTitle/index.ts +2 -0
  302. package/src/components/atoms/BrTitle/types.ts +47 -0
  303. package/src/components/atoms/BrVideo/BrVideo.vue +135 -0
  304. package/src/components/atoms/BrVideo/index.ts +2 -0
  305. package/src/components/atoms/BrVideo/types.ts +56 -0
  306. package/src/components/atoms/index.ts +20 -0
  307. package/src/components/index.ts +7 -0
  308. package/src/components/molecules/BrAccordion/BrAccordion.vue +112 -0
  309. package/src/components/molecules/BrAccordion/BrAccordionItem.vue +168 -0
  310. package/src/components/molecules/BrAccordion/index.ts +3 -0
  311. package/src/components/molecules/BrAccordion/types.ts +85 -0
  312. package/src/components/molecules/BrCalendar/BrCalendar.vue +553 -0
  313. package/src/components/molecules/BrCalendar/index.ts +2 -0
  314. package/src/components/molecules/BrCalendar/types.ts +80 -0
  315. package/src/components/molecules/BrCard/BrCard.vue +262 -0
  316. package/src/components/molecules/BrCard/index.ts +2 -0
  317. package/src/components/molecules/BrCard/types.ts +72 -0
  318. package/src/components/molecules/BrFormField/BrFormField.vue +241 -0
  319. package/src/components/molecules/BrFormField/index.ts +2 -0
  320. package/src/components/molecules/BrFormField/types.ts +64 -0
  321. package/src/components/molecules/BrModal/BrModal.test.ts +212 -0
  322. package/src/components/molecules/BrModal/BrModal.vue +404 -0
  323. package/src/components/molecules/BrModal/index.ts +2 -0
  324. package/src/components/molecules/BrModal/types.ts +57 -0
  325. package/src/components/molecules/BrStepper/BrStepper.vue +302 -0
  326. package/src/components/molecules/BrStepper/index.ts +2 -0
  327. package/src/components/molecules/BrStepper/types.ts +77 -0
  328. package/src/components/molecules/BrTabs/BrTab.vue +69 -0
  329. package/src/components/molecules/BrTabs/BrTabPanel.vue +36 -0
  330. package/src/components/molecules/BrTabs/BrTabs.test.ts +168 -0
  331. package/src/components/molecules/BrTabs/BrTabs.vue +319 -0
  332. package/src/components/molecules/BrTabs/index.ts +4 -0
  333. package/src/components/molecules/BrTabs/types.ts +139 -0
  334. package/src/components/molecules/index.ts +11 -0
  335. package/src/components/organisms/BrNavbar/BrNavbar.vue +424 -0
  336. package/src/components/organisms/BrNavbar/index.ts +2 -0
  337. package/src/components/organisms/BrNavbar/types.ts +101 -0
  338. package/src/components/organisms/BrSidebar/BrSidebar.vue +382 -0
  339. package/src/components/organisms/BrSidebar/index.ts +2 -0
  340. package/src/components/organisms/BrSidebar/types.ts +121 -0
  341. package/src/components/organisms/index.ts +6 -0
  342. package/src/index.ts +32 -0
  343. package/src/plugin.ts +61 -0
  344. package/src/styles/base/_animations.scss +187 -0
  345. package/src/styles/base/_reset.scss +109 -0
  346. package/src/styles/base/index.scss +6 -0
  347. package/src/styles/main.scss +9 -0
  348. package/src/styles/tokens/_colors.scss +185 -0
  349. package/src/styles/tokens/_spacing.scss +88 -0
  350. package/src/styles/tokens/_typography.scss +77 -0
  351. package/src/styles/tokens/index.scss +7 -0
  352. package/src/types/index.ts +125 -0
@@ -0,0 +1,302 @@
1
+ <script setup lang="ts">
2
+ import { computed } from 'vue'
3
+ import type { StepperProps } from './types'
4
+
5
+ const props = withDefaults(defineProps<StepperProps>(), {
6
+ orientation: 'horizontal',
7
+ variant: 'default',
8
+ clickable: false,
9
+ showNumbers: true,
10
+ linear: true,
11
+ alternativeLabel: false,
12
+ })
13
+
14
+ const model = defineModel<number>({ default: 0 })
15
+
16
+ const emit = defineEmits<{
17
+ (e: 'step-click', step: number): void
18
+ }>()
19
+
20
+ const classes = computed(() => [
21
+ 'br-stepper',
22
+ `br-stepper--${props.orientation}`,
23
+ `br-stepper--${props.variant}`,
24
+ {
25
+ 'br-stepper--clickable': props.clickable,
26
+ 'br-stepper--alternative-label': props.alternativeLabel,
27
+ },
28
+ ])
29
+
30
+ function getStepStatus(index: number) {
31
+ if (index < model.value) return 'completed'
32
+ if (index === model.value) return 'active'
33
+ return 'pending'
34
+ }
35
+
36
+ function canNavigateTo(index: number) {
37
+ if (!props.clickable) return false
38
+ if (props.linear && index > model.value) return false
39
+ return true
40
+ }
41
+
42
+ function handleStepClick(index: number) {
43
+ if (!canNavigateTo(index)) return
44
+ if (props.steps[index].error) return
45
+
46
+ model.value = index
47
+ emit('step-click', index)
48
+ }
49
+ </script>
50
+
51
+ <template>
52
+ <div :class="classes">
53
+ <div
54
+ v-for="(step, index) in steps"
55
+ :key="index"
56
+ class="br-stepper__step"
57
+ :class="{
58
+ 'br-stepper__step--completed': getStepStatus(index) === 'completed',
59
+ 'br-stepper__step--active': getStepStatus(index) === 'active',
60
+ 'br-stepper__step--pending': getStepStatus(index) === 'pending',
61
+ 'br-stepper__step--error': step.error,
62
+ 'br-stepper__step--clickable': canNavigateTo(index),
63
+ }"
64
+ :role="clickable ? 'button' : undefined"
65
+ :tabindex="canNavigateTo(index) ? 0 : undefined"
66
+ @click="handleStepClick(index)"
67
+ @keydown.enter="handleStepClick(index)"
68
+ >
69
+ <div class="br-stepper__indicator">
70
+ <span class="br-stepper__icon">
71
+ <svg v-if="getStepStatus(index) === 'completed' && !step.error" viewBox="0 0 24 24" fill="currentColor">
72
+ <path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z" />
73
+ </svg>
74
+ <svg v-else-if="step.error" viewBox="0 0 24 24" fill="currentColor">
75
+ <path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z" />
76
+ </svg>
77
+ <template v-else-if="showNumbers">
78
+ {{ index + 1 }}
79
+ </template>
80
+ </span>
81
+ <div v-if="index < steps.length - 1" class="br-stepper__connector" />
82
+ </div>
83
+
84
+ <div class="br-stepper__content">
85
+ <span class="br-stepper__title">
86
+ {{ step.title }}
87
+ <span v-if="step.optional" class="br-stepper__optional">(Opcional)</span>
88
+ </span>
89
+ <span v-if="step.description || step.errorMessage" class="br-stepper__description">
90
+ {{ step.error ? step.errorMessage : step.description }}
91
+ </span>
92
+ </div>
93
+ </div>
94
+ </div>
95
+ </template>
96
+
97
+ <style lang="scss" scoped>
98
+ .br-stepper {
99
+ display: flex;
100
+
101
+ &--horizontal {
102
+ flex-direction: row;
103
+ align-items: flex-start;
104
+
105
+ .br-stepper__step {
106
+ flex: 1;
107
+ flex-direction: column;
108
+ align-items: center;
109
+ }
110
+
111
+ .br-stepper__indicator {
112
+ display: flex;
113
+ align-items: center;
114
+ width: 100%;
115
+ }
116
+
117
+ .br-stepper__connector {
118
+ flex: 1;
119
+ height: 2px;
120
+ margin: 0 var(--br-space-2);
121
+ }
122
+
123
+ .br-stepper__content {
124
+ text-align: center;
125
+ margin-top: var(--br-space-2);
126
+ }
127
+ }
128
+
129
+ &--vertical {
130
+ flex-direction: column;
131
+
132
+ .br-stepper__step {
133
+ flex-direction: row;
134
+ align-items: flex-start;
135
+ }
136
+
137
+ .br-stepper__indicator {
138
+ flex-direction: column;
139
+ align-items: center;
140
+ }
141
+
142
+ .br-stepper__connector {
143
+ width: 2px;
144
+ min-height: 40px;
145
+ margin: var(--br-space-2) 0;
146
+ }
147
+
148
+ .br-stepper__content {
149
+ margin-left: var(--br-space-3);
150
+ padding-bottom: var(--br-space-4);
151
+ }
152
+ }
153
+
154
+ &--alternative-label.br-stepper--horizontal {
155
+ .br-stepper__content {
156
+ position: absolute;
157
+ top: 100%;
158
+ left: 50%;
159
+ transform: translateX(-50%);
160
+ width: max-content;
161
+ max-width: 150px;
162
+ }
163
+ }
164
+
165
+ &__step {
166
+ display: flex;
167
+ position: relative;
168
+ }
169
+
170
+ &__indicator {
171
+ position: relative;
172
+ }
173
+
174
+ &__icon {
175
+ display: flex;
176
+ align-items: center;
177
+ justify-content: center;
178
+ width: 32px;
179
+ height: 32px;
180
+ border-radius: 50%;
181
+ background: var(--br-light-300);
182
+ color: var(--br-dark-500);
183
+ font-size: var(--br-text-sm);
184
+ font-weight: var(--br-font-medium);
185
+ flex-shrink: 0;
186
+ transition: all var(--br-transition-fast);
187
+
188
+ svg {
189
+ width: 18px;
190
+ height: 18px;
191
+ }
192
+ }
193
+
194
+ &__connector {
195
+ background: var(--br-light-300);
196
+ transition: background var(--br-transition-fast);
197
+ }
198
+
199
+ &__content {
200
+ display: flex;
201
+ flex-direction: column;
202
+ gap: var(--br-space-1);
203
+ }
204
+
205
+ &__title {
206
+ font-size: var(--br-text-sm);
207
+ font-weight: var(--br-font-medium);
208
+ color: var(--br-dark-700);
209
+ }
210
+
211
+ &__optional {
212
+ font-weight: var(--br-font-normal);
213
+ color: var(--br-dark-400);
214
+ }
215
+
216
+ &__description {
217
+ font-size: var(--br-text-xs);
218
+ color: var(--br-dark-500);
219
+ }
220
+
221
+ // States
222
+ &__step--completed {
223
+ .br-stepper__icon {
224
+ background: var(--br-primary-500);
225
+ color: var(--br-white);
226
+ }
227
+
228
+ .br-stepper__connector {
229
+ background: var(--br-primary-500);
230
+ }
231
+ }
232
+
233
+ &__step--active {
234
+ .br-stepper__icon {
235
+ background: var(--br-primary-500);
236
+ color: var(--br-white);
237
+ box-shadow: 0 0 0 4px var(--br-primary-100);
238
+ }
239
+
240
+ .br-stepper__title {
241
+ color: var(--br-primary-600);
242
+ }
243
+ }
244
+
245
+ &__step--error {
246
+ .br-stepper__icon {
247
+ background: var(--br-danger-500);
248
+ color: var(--br-white);
249
+ }
250
+
251
+ .br-stepper__title {
252
+ color: var(--br-danger-600);
253
+ }
254
+
255
+ .br-stepper__description {
256
+ color: var(--br-danger-500);
257
+ }
258
+ }
259
+
260
+ &__step--clickable {
261
+ cursor: pointer;
262
+
263
+ &:hover .br-stepper__icon {
264
+ transform: scale(1.1);
265
+ }
266
+ }
267
+
268
+ // Variants
269
+ &--outlined {
270
+ .br-stepper__icon {
271
+ background: transparent;
272
+ border: 2px solid var(--br-light-400);
273
+ }
274
+
275
+ .br-stepper__step--completed .br-stepper__icon,
276
+ .br-stepper__step--active .br-stepper__icon {
277
+ border-color: var(--br-primary-500);
278
+ background: transparent;
279
+ color: var(--br-primary-500);
280
+ }
281
+
282
+ .br-stepper__step--error .br-stepper__icon {
283
+ border-color: var(--br-danger-500);
284
+ background: transparent;
285
+ color: var(--br-danger-500);
286
+ }
287
+ }
288
+
289
+ &--simple {
290
+ .br-stepper__icon {
291
+ width: 12px;
292
+ height: 12px;
293
+ font-size: 0;
294
+ }
295
+
296
+ .br-stepper__step--completed .br-stepper__icon,
297
+ .br-stepper__step--active .br-stepper__icon {
298
+ background: var(--br-primary-500);
299
+ }
300
+ }
301
+ }
302
+ </style>
@@ -0,0 +1,2 @@
1
+ export { default as BrStepper } from './BrStepper.vue'
2
+ export * from './types'
@@ -0,0 +1,77 @@
1
+ export interface StepperStep {
2
+ /**
3
+ * Step title
4
+ */
5
+ title: string
6
+
7
+ /**
8
+ * Step description
9
+ */
10
+ description?: string
11
+
12
+ /**
13
+ * Step icon
14
+ */
15
+ icon?: string
16
+
17
+ /**
18
+ * Step is optional
19
+ */
20
+ optional?: boolean
21
+
22
+ /**
23
+ * Step has error
24
+ */
25
+ error?: boolean
26
+
27
+ /**
28
+ * Custom error message
29
+ */
30
+ errorMessage?: string
31
+ }
32
+
33
+ export type StepperOrientation = 'horizontal' | 'vertical'
34
+ export type StepperVariant = 'default' | 'outlined' | 'simple'
35
+
36
+ export interface StepperProps {
37
+ /**
38
+ * Stepper steps
39
+ */
40
+ steps: StepperStep[]
41
+
42
+ /**
43
+ * Orientation
44
+ * @default 'horizontal'
45
+ */
46
+ orientation?: StepperOrientation
47
+
48
+ /**
49
+ * Variant style
50
+ * @default 'default'
51
+ */
52
+ variant?: StepperVariant
53
+
54
+ /**
55
+ * Allow clicking on steps to navigate
56
+ * @default false
57
+ */
58
+ clickable?: boolean
59
+
60
+ /**
61
+ * Show step numbers
62
+ * @default true
63
+ */
64
+ showNumbers?: boolean
65
+
66
+ /**
67
+ * Linear progression (must complete in order)
68
+ * @default true
69
+ */
70
+ linear?: boolean
71
+
72
+ /**
73
+ * Alternative label position (below icon for horizontal)
74
+ * @default false
75
+ */
76
+ alternativeLabel?: boolean
77
+ }
@@ -0,0 +1,69 @@
1
+ <script setup lang="ts">
2
+ import { computed, inject } from 'vue'
3
+ import type { TabProps } from './types'
4
+
5
+ const props = withDefaults(defineProps<TabProps>(), {
6
+ disabled: false,
7
+ closable: false,
8
+ })
9
+
10
+ const emit = defineEmits<{
11
+ (e: 'close'): void
12
+ }>()
13
+
14
+ const tabs = inject<{
15
+ activeTab: { value: string | number }
16
+ selectTab: (id: string | number) => void
17
+ }>('tabs')
18
+
19
+ const isActive = computed(() => tabs?.activeTab.value === props.id)
20
+
21
+ const classes = computed(() => [
22
+ 'br-tabs__tab',
23
+ {
24
+ 'br-tabs__tab--active': isActive.value,
25
+ 'br-tabs__tab--disabled': props.disabled,
26
+ },
27
+ ])
28
+
29
+ function handleClick() {
30
+ if (props.disabled) return
31
+ tabs?.selectTab(props.id)
32
+ }
33
+
34
+ function handleClose(event: Event) {
35
+ event.stopPropagation()
36
+ emit('close')
37
+ }
38
+ </script>
39
+
40
+ <template>
41
+ <button
42
+ type="button"
43
+ role="tab"
44
+ :class="classes"
45
+ :aria-selected="isActive"
46
+ :disabled="disabled"
47
+ @click="handleClick"
48
+ >
49
+ <span v-if="icon" class="br-tabs__tab-icon">
50
+ <slot name="icon">{{ icon }}</slot>
51
+ </span>
52
+ <span class="br-tabs__tab-label">
53
+ <slot>{{ label }}</slot>
54
+ </span>
55
+ <span v-if="badge !== undefined" class="br-tabs__tab-badge">
56
+ {{ badge }}
57
+ </span>
58
+ <button
59
+ v-if="closable"
60
+ type="button"
61
+ class="br-tabs__tab-close"
62
+ @click="handleClose"
63
+ >
64
+ <svg viewBox="0 0 24 24" fill="currentColor">
65
+ <path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z" />
66
+ </svg>
67
+ </button>
68
+ </button>
69
+ </template>
@@ -0,0 +1,36 @@
1
+ <script setup lang="ts">
2
+ import { computed, inject, ref, watch } from 'vue'
3
+ import type { TabPanelProps } from './types'
4
+
5
+ const props = withDefaults(defineProps<TabPanelProps>(), {
6
+ lazy: true,
7
+ })
8
+
9
+ const tabs = inject<{
10
+ activeTab: { value: string | number }
11
+ lazy: { value: boolean }
12
+ }>('tabs')
13
+
14
+ const hasBeenActive = ref(false)
15
+ const isActive = computed(() => tabs?.activeTab.value === props.tabId)
16
+ const shouldRender = computed(() => {
17
+ const isLazy = props.lazy ?? tabs?.lazy.value ?? true
18
+ if (!isLazy) return true
19
+ return isActive.value || hasBeenActive.value
20
+ })
21
+
22
+ watch(isActive, (active) => {
23
+ if (active) hasBeenActive.value = true
24
+ })
25
+ </script>
26
+
27
+ <template>
28
+ <div
29
+ v-if="shouldRender"
30
+ v-show="isActive"
31
+ role="tabpanel"
32
+ class="br-tabs__panel"
33
+ >
34
+ <slot />
35
+ </div>
36
+ </template>
@@ -0,0 +1,168 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { mount } from '@vue/test-utils'
3
+ import BrTabs from './BrTabs.vue'
4
+
5
+ describe('BrTabs', () => {
6
+ const mockItems = [
7
+ { id: 'tab1', label: 'Tab 1', content: 'Content 1' },
8
+ { id: 'tab2', label: 'Tab 2', content: 'Content 2' },
9
+ { id: 'tab3', label: 'Tab 3', content: 'Content 3', disabled: true },
10
+ ]
11
+
12
+ it('renders tabs from items prop', () => {
13
+ const wrapper = mount(BrTabs, {
14
+ props: { items: mockItems, modelValue: 'tab1' },
15
+ })
16
+ const tabs = wrapper.findAll('.br-tabs__tab')
17
+ expect(tabs).toHaveLength(3)
18
+ })
19
+
20
+ it('renders tab labels', () => {
21
+ const wrapper = mount(BrTabs, {
22
+ props: { items: mockItems, modelValue: 'tab1' },
23
+ })
24
+ expect(wrapper.text()).toContain('Tab 1')
25
+ expect(wrapper.text()).toContain('Tab 2')
26
+ expect(wrapper.text()).toContain('Tab 3')
27
+ })
28
+
29
+ it('applies active class to selected tab', () => {
30
+ const wrapper = mount(BrTabs, {
31
+ props: { items: mockItems, modelValue: 'tab1' },
32
+ })
33
+ const activeTab = wrapper.find('.br-tabs__tab--active')
34
+ expect(activeTab.text()).toContain('Tab 1')
35
+ })
36
+
37
+ it('changes active tab on click', async () => {
38
+ let modelValue = 'tab1'
39
+ const wrapper = mount(BrTabs, {
40
+ props: {
41
+ items: mockItems,
42
+ modelValue,
43
+ 'onUpdate:modelValue': (e: unknown) => {
44
+ modelValue = e as string
45
+ wrapper.setProps({ modelValue })
46
+ },
47
+ },
48
+ })
49
+ const tabs = wrapper.findAll('.br-tabs__tab')
50
+ await tabs[1].trigger('click')
51
+ expect(wrapper.props('modelValue')).toBe('tab2')
52
+ })
53
+
54
+ it('does not activate disabled tab', async () => {
55
+ let modelValue = 'tab1'
56
+ const wrapper = mount(BrTabs, {
57
+ props: {
58
+ items: mockItems,
59
+ modelValue,
60
+ 'onUpdate:modelValue': (e: unknown) => {
61
+ modelValue = e as string
62
+ wrapper.setProps({ modelValue })
63
+ },
64
+ },
65
+ })
66
+ const tabs = wrapper.findAll('.br-tabs__tab')
67
+ await tabs[2].trigger('click')
68
+ expect(wrapper.props('modelValue')).toBe('tab1')
69
+ })
70
+
71
+ it('applies disabled class to disabled tabs', () => {
72
+ const wrapper = mount(BrTabs, {
73
+ props: { items: mockItems, modelValue: 'tab1' },
74
+ })
75
+ const disabledTab = wrapper.find('.br-tabs__tab--disabled')
76
+ expect(disabledTab.text()).toContain('Tab 3')
77
+ })
78
+
79
+ it('applies correct variant class', () => {
80
+ const variants = ['default', 'pills', 'underline', 'enclosed'] as const
81
+ variants.forEach((variant) => {
82
+ const wrapper = mount(BrTabs, {
83
+ props: { items: mockItems, modelValue: 'tab1', variant },
84
+ })
85
+ expect(wrapper.classes()).toContain(`br-tabs--${variant}`)
86
+ })
87
+ })
88
+
89
+ it('applies correct size class', () => {
90
+ const sizes = ['sm', 'md', 'lg'] as const
91
+ sizes.forEach((size) => {
92
+ const wrapper = mount(BrTabs, {
93
+ props: { items: mockItems, modelValue: 'tab1', size },
94
+ })
95
+ expect(wrapper.classes()).toContain(`br-tabs--${size}`)
96
+ })
97
+ })
98
+
99
+ it('applies vertical class when vertical prop is true', () => {
100
+ const wrapper = mount(BrTabs, {
101
+ props: { items: mockItems, modelValue: 'tab1', vertical: true },
102
+ })
103
+ expect(wrapper.classes()).toContain('br-tabs--vertical')
104
+ })
105
+
106
+ it('applies centered class when centered prop is true', () => {
107
+ const wrapper = mount(BrTabs, {
108
+ props: { items: mockItems, modelValue: 'tab1', centered: true },
109
+ })
110
+ expect(wrapper.classes()).toContain('br-tabs--centered')
111
+ })
112
+
113
+ it('applies grow class when grow prop is true', () => {
114
+ const wrapper = mount(BrTabs, {
115
+ props: { items: mockItems, modelValue: 'tab1', grow: true },
116
+ })
117
+ expect(wrapper.classes()).toContain('br-tabs--grow')
118
+ })
119
+
120
+ it('renders badges when provided', () => {
121
+ const itemsWithBadge = [
122
+ { id: 'tab1', label: 'Tab 1', badge: 5 },
123
+ { id: 'tab2', label: 'Tab 2' },
124
+ ]
125
+ const wrapper = mount(BrTabs, {
126
+ props: { items: itemsWithBadge, modelValue: 'tab1' },
127
+ })
128
+ expect(wrapper.find('.br-tabs__tab-badge').text()).toBe('5')
129
+ })
130
+
131
+ it('shows close button when closable is true', () => {
132
+ const wrapper = mount(BrTabs, {
133
+ props: { items: mockItems, modelValue: 'tab1', closable: true },
134
+ })
135
+ expect(wrapper.find('.br-tabs__tab-close').exists()).toBe(true)
136
+ })
137
+
138
+ it('emits tab-close when close button clicked', async () => {
139
+ const wrapper = mount(BrTabs, {
140
+ props: { items: mockItems, modelValue: 'tab1', closable: true },
141
+ })
142
+ await wrapper.find('.br-tabs__tab-close').trigger('click')
143
+ expect(wrapper.emitted('tab-close')).toBeTruthy()
144
+ expect(wrapper.emitted('tab-close')![0]).toEqual(['tab1'])
145
+ })
146
+
147
+ it('has correct accessibility attributes', () => {
148
+ const wrapper = mount(BrTabs, {
149
+ props: { items: mockItems, modelValue: 'tab1' },
150
+ })
151
+ const tablist = wrapper.find('[role="tablist"]')
152
+ expect(tablist.exists()).toBe(true)
153
+
154
+ const tabs = wrapper.findAll('[role="tab"]')
155
+ expect(tabs).toHaveLength(3)
156
+
157
+ const selectedTab = wrapper.find('[aria-selected="true"]')
158
+ expect(selectedTab.text()).toContain('Tab 1')
159
+ })
160
+
161
+ it('renders panel content for active tab', () => {
162
+ const wrapper = mount(BrTabs, {
163
+ props: { items: mockItems, modelValue: 'tab1' },
164
+ })
165
+ const visiblePanel = wrapper.find('.br-tabs__panel[style=""]') || wrapper.find('.br-tabs__panel:not([style*="display: none"])')
166
+ expect(wrapper.text()).toContain('Content 1')
167
+ })
168
+ })