@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 @@
1
+ {"version":3,"file":"braip-ui.js","sources":["../src/components/atoms/BrButton/BrButton.vue","../src/components/atoms/BrInput/BrInput.vue","../src/components/atoms/BrSelect/BrSelect.vue","../src/components/atoms/BrBadge/BrBadge.vue","../src/components/atoms/BrTitle/BrTitle.vue","../src/components/atoms/BrSpinner/BrSpinner.vue","../src/components/atoms/BrSwitch/BrSwitch.vue","../src/components/atoms/BrTextarea/BrTextarea.vue","../src/components/atoms/BrAvatar/BrAvatar.vue","../src/components/atoms/BrImage/BrImage.vue","../src/components/atoms/BrVideo/BrVideo.vue","../src/components/atoms/BrRadio/BrRadio.vue","../src/components/atoms/BrRadio/BrRadioGroup.vue","../src/components/atoms/BrProgressbar/BrProgressbar.vue","../src/components/atoms/BrRating/BrRating.vue","../src/components/atoms/BrCheckbox/BrCheckbox.vue","../src/components/atoms/BrCheckbox/BrCheckboxGroup.vue","../src/components/molecules/BrModal/BrModal.vue","../src/components/molecules/BrAccordion/BrAccordionItem.vue","../src/components/molecules/BrAccordion/BrAccordion.vue","../src/components/molecules/BrCard/BrCard.vue","../src/components/molecules/BrFormField/BrFormField.vue","../src/components/molecules/BrStepper/BrStepper.vue","../src/components/molecules/BrCalendar/BrCalendar.vue","../src/components/molecules/BrTabs/BrTabs.vue","../src/components/molecules/BrTabs/BrTab.vue","../src/components/molecules/BrTabs/BrTabPanel.vue","../src/components/organisms/BrNavbar/BrNavbar.vue","../src/components/organisms/BrSidebar/BrSidebar.vue","../src/plugin.ts","../src/index.ts"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * BrButton - Primary button component\n *\n * @example\n * <BrButton>Click me</BrButton>\n * <BrButton variant=\"secondary\" size=\"lg\">Large Button</BrButton>\n * <BrButton variant=\"outline\" loading>Loading...</BrButton>\n */\n\nimport { computed } from 'vue'\nimport type { ButtonProps, ButtonVariant, ButtonSize } from './types'\n\n// ---------------------------------------------------------------------------\n// PROPS\n// ---------------------------------------------------------------------------\n\nconst props = withDefaults(defineProps<ButtonProps>(), {\n variant: 'primary',\n size: 'md',\n type: 'button',\n disabled: false,\n loading: false,\n block: false,\n})\n\n// ---------------------------------------------------------------------------\n// EMITS\n// ---------------------------------------------------------------------------\n\nconst emit = defineEmits<{\n (e: 'click', event: MouseEvent): void\n}>()\n\n// ---------------------------------------------------------------------------\n// COMPUTED\n// ---------------------------------------------------------------------------\n\nconst classes = computed(() => [\n 'br-button',\n `br-button--${props.variant}`,\n `br-button--${props.size}`,\n {\n 'br-button--block': props.block,\n 'br-button--loading': props.loading,\n 'br-button--disabled': props.disabled || props.loading,\n },\n])\n\nconst isDisabled = computed(() => props.disabled || props.loading)\n\n// ---------------------------------------------------------------------------\n// METHODS\n// ---------------------------------------------------------------------------\n\nfunction handleClick(event: MouseEvent) {\n if (!isDisabled.value) {\n emit('click', event)\n }\n}\n</script>\n\n<template>\n <button\n :class=\"classes\"\n :type=\"type\"\n :disabled=\"isDisabled\"\n @click=\"handleClick\"\n >\n <span v-if=\"loading\" class=\"br-button__loader\">\n <svg\n class=\"br-button__spinner\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-dasharray=\"31.416\"\n stroke-dashoffset=\"10\"\n />\n </svg>\n </span>\n <span class=\"br-button__content\" :class=\"{ 'br-button__content--hidden': loading }\">\n <slot />\n </span>\n </button>\n</template>\n\n<style lang=\"scss\" scoped>\n.br-button {\n // Base styles\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--br-space-2);\n font-family: var(--br-font-primary);\n font-weight: var(--br-font-semibold);\n line-height: 1;\n border: 2px solid transparent;\n border-radius: var(--br-radius-md);\n cursor: pointer;\n transition: all var(--br-transition-fast);\n position: relative;\n white-space: nowrap;\n user-select: none;\n\n &:focus-visible {\n outline: 2px solid var(--br-primary-600);\n outline-offset: 2px;\n }\n\n // ---------------------------------------------------------------------------\n // SIZES\n // ---------------------------------------------------------------------------\n\n &--sm {\n height: 32px;\n padding: 0 var(--br-space-3);\n font-size: var(--br-text-xs);\n }\n\n &--md {\n height: 40px;\n padding: 0 var(--br-space-5);\n font-size: var(--br-text-sm);\n }\n\n &--lg {\n height: 48px;\n padding: 0 var(--br-space-6);\n font-size: var(--br-text-base);\n }\n\n // ---------------------------------------------------------------------------\n // VARIANTS\n // ---------------------------------------------------------------------------\n\n &--primary {\n background-color: var(--br-primary-600);\n color: var(--br-light-0);\n border-color: var(--br-primary-600);\n\n &:hover:not(:disabled) {\n background-color: var(--br-primary-700);\n border-color: var(--br-primary-700);\n }\n\n &:active:not(:disabled) {\n background-color: var(--br-primary-800);\n border-color: var(--br-primary-800);\n }\n }\n\n &--secondary {\n background-color: var(--br-secondary-600);\n color: var(--br-dark-0);\n border-color: var(--br-secondary-600);\n\n &:hover:not(:disabled) {\n background-color: var(--br-secondary-700);\n border-color: var(--br-secondary-700);\n }\n\n &:active:not(:disabled) {\n background-color: var(--br-secondary-800);\n border-color: var(--br-secondary-800);\n }\n }\n\n &--outline {\n background-color: transparent;\n color: var(--br-primary-600);\n border-color: var(--br-primary-600);\n\n &:hover:not(:disabled) {\n background-color: var(--br-primary-100);\n }\n\n &:active:not(:disabled) {\n background-color: var(--br-primary-200);\n }\n }\n\n &--ghost {\n background-color: transparent;\n color: var(--br-primary-600);\n border-color: transparent;\n\n &:hover:not(:disabled) {\n background-color: var(--br-primary-100);\n }\n\n &:active:not(:disabled) {\n background-color: var(--br-primary-200);\n }\n }\n\n &--danger {\n background-color: var(--br-danger-600);\n color: var(--br-light-0);\n border-color: var(--br-danger-600);\n\n &:hover:not(:disabled) {\n background-color: var(--br-danger-700);\n border-color: var(--br-danger-700);\n }\n\n &:active:not(:disabled) {\n background-color: var(--br-danger-800);\n border-color: var(--br-danger-800);\n }\n }\n\n &--success {\n background-color: var(--br-success-600);\n color: var(--br-light-0);\n border-color: var(--br-success-600);\n\n &:hover:not(:disabled) {\n background-color: var(--br-success-700);\n border-color: var(--br-success-700);\n }\n\n &:active:not(:disabled) {\n background-color: var(--br-success-800);\n border-color: var(--br-success-800);\n }\n }\n\n // ---------------------------------------------------------------------------\n // STATES\n // ---------------------------------------------------------------------------\n\n &--block {\n width: 100%;\n }\n\n &--disabled,\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n pointer-events: none;\n }\n\n &--loading {\n cursor: wait;\n }\n\n // ---------------------------------------------------------------------------\n // INTERNAL ELEMENTS\n // ---------------------------------------------------------------------------\n\n &__content {\n display: inline-flex;\n align-items: center;\n gap: var(--br-space-2);\n\n &--hidden {\n visibility: hidden;\n }\n }\n\n &__loader {\n position: absolute;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n &__spinner {\n width: 1.25em;\n height: 1.25em;\n animation: br-spin 1s linear infinite;\n }\n}\n\n@keyframes br-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * BrInput - Text input component\n *\n * @example\n * <BrInput v-model=\"value\" placeholder=\"Digite aqui\" />\n * <BrInput type=\"password\" v-model=\"password\" />\n * <BrInput type=\"number\" :min=\"0\" :max=\"100\" />\n */\n\nimport { computed, ref, watch } from 'vue'\nimport type { InputProps } from './types'\n\n// ---------------------------------------------------------------------------\n// PROPS\n// ---------------------------------------------------------------------------\n\nconst props = withDefaults(defineProps<InputProps>(), {\n type: 'text',\n placeholder: '',\n disabled: false,\n readonly: false,\n error: false,\n size: 'md',\n block: true,\n})\n\n// ---------------------------------------------------------------------------\n// MODEL\n// ---------------------------------------------------------------------------\n\nconst model = defineModel<string | number>()\n\n// ---------------------------------------------------------------------------\n// EMITS\n// ---------------------------------------------------------------------------\n\nconst emit = defineEmits<{\n (e: 'focus', value: string | number | undefined): void\n (e: 'blur', value: string | number | undefined): void\n (e: 'enter', value: string | number | undefined): void\n (e: 'keydown', event: KeyboardEvent): void\n}>()\n\n// ---------------------------------------------------------------------------\n// REFS\n// ---------------------------------------------------------------------------\n\nconst inputRef = ref<HTMLInputElement | null>(null)\nconst isFocused = ref(false)\n\n// ---------------------------------------------------------------------------\n// COMPUTED\n// ---------------------------------------------------------------------------\n\nconst classes = computed(() => [\n 'br-input',\n `br-input--${props.size}`,\n {\n 'br-input--block': props.block,\n 'br-input--error': props.error,\n 'br-input--disabled': props.disabled,\n 'br-input--focused': isFocused.value,\n },\n])\n\n// ---------------------------------------------------------------------------\n// METHODS\n// ---------------------------------------------------------------------------\n\nfunction handleInput(event: Event) {\n const target = event.target as HTMLInputElement\n const value = props.type === 'number' ? Number(target.value) : target.value\n\n if (props.type === 'number' && props.min !== undefined && Number(value) < props.min) {\n model.value = props.min\n return\n }\n\n if (props.type === 'number' && props.max !== undefined && Number(value) > props.max) {\n model.value = props.max\n return\n }\n\n model.value = value\n}\n\nfunction handleFocus() {\n isFocused.value = true\n emit('focus', model.value)\n}\n\nfunction handleBlur() {\n isFocused.value = false\n emit('blur', model.value)\n}\n\nfunction handleKeydown(event: KeyboardEvent) {\n emit('keydown', event)\n if (event.key === 'Enter') {\n emit('enter', model.value)\n }\n}\n\nfunction focus() {\n inputRef.value?.focus()\n}\n\nfunction blur() {\n inputRef.value?.blur()\n}\n\n// ---------------------------------------------------------------------------\n// EXPOSE\n// ---------------------------------------------------------------------------\n\ndefineExpose({ focus, blur, inputRef })\n</script>\n\n<template>\n <input\n ref=\"inputRef\"\n :class=\"classes\"\n :type=\"type\"\n :value=\"model\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :min=\"min\"\n :max=\"max\"\n :maxlength=\"maxLength\"\n :autocomplete=\"autocomplete\"\n @input=\"handleInput\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n @keydown=\"handleKeydown\"\n />\n</template>\n\n<style lang=\"scss\" scoped>\n.br-input {\n font-family: var(--br-font-primary);\n border: 1px solid var(--br-light-300);\n border-radius: var(--br-radius-sm);\n background: var(--br-light-0);\n color: var(--br-dark-700);\n transition: all var(--br-transition-fast);\n\n &::placeholder {\n color: var(--br-dark-1100);\n }\n\n &:focus {\n outline: none;\n border-color: var(--br-primary-600);\n box-shadow: 0 0 0 3px rgba(109, 54, 251, 0.1);\n }\n\n // ---------------------------------------------------------------------------\n // SIZES\n // ---------------------------------------------------------------------------\n\n &--sm {\n height: 36px;\n padding: 0 var(--br-space-3);\n font-size: var(--br-text-xs);\n }\n\n &--md {\n height: 44px;\n padding: 0 var(--br-space-4);\n font-size: var(--br-text-sm);\n }\n\n &--lg {\n height: 56px;\n padding: 0 var(--br-space-4);\n font-size: var(--br-text-base);\n }\n\n // ---------------------------------------------------------------------------\n // STATES\n // ---------------------------------------------------------------------------\n\n &--block {\n width: 100%;\n }\n\n &--error {\n border-color: var(--br-danger-600);\n\n &:focus {\n border-color: var(--br-danger-600);\n box-shadow: 0 0 0 3px rgba(255, 46, 46, 0.1);\n }\n }\n\n &--disabled {\n background: var(--br-light-200);\n color: var(--br-dark-1100);\n cursor: not-allowed;\n }\n}\n\n// Remove number input spinners\ninput[type='number']::-webkit-inner-spin-button,\ninput[type='number']::-webkit-outer-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}\n\ninput[type='number'] {\n -moz-appearance: textfield;\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * BrSelect - Dropdown select component\n *\n * @example\n * <BrSelect v-model=\"selected\" :options=\"options\" />\n * <BrSelect v-model=\"value\" :options=\"items\" placeholder=\"Selecione...\" />\n */\n\nimport { computed, ref, watch, onMounted, onUnmounted } from 'vue'\nimport type { SelectProps, SelectOption } from './types'\n\n// ---------------------------------------------------------------------------\n// PROPS\n// ---------------------------------------------------------------------------\n\nconst props = withDefaults(defineProps<SelectProps>(), {\n options: () => [],\n placeholder: 'Selecione...',\n disabled: false,\n error: false,\n size: 'md',\n searchable: false,\n clearable: false,\n})\n\n// ---------------------------------------------------------------------------\n// MODEL\n// ---------------------------------------------------------------------------\n\nconst model = defineModel<string | number | null>()\n\n// ---------------------------------------------------------------------------\n// EMITS\n// ---------------------------------------------------------------------------\n\nconst emit = defineEmits<{\n (e: 'change', value: string | number | null): void\n (e: 'open'): void\n (e: 'close'): void\n}>()\n\n// ---------------------------------------------------------------------------\n// REFS\n// ---------------------------------------------------------------------------\n\nconst selectRef = ref<HTMLDivElement | null>(null)\nconst isOpen = ref(false)\nconst searchQuery = ref('')\nconst highlightedIndex = ref(0)\n\n// ---------------------------------------------------------------------------\n// COMPUTED\n// ---------------------------------------------------------------------------\n\nconst selectedOption = computed(() => {\n return props.options.find((opt) => opt.id === model.value)\n})\n\nconst filteredOptions = computed(() => {\n if (!props.searchable || !searchQuery.value) {\n return props.options\n }\n const query = searchQuery.value.toLowerCase()\n return props.options.filter((opt) => opt.text.toLowerCase().includes(query))\n})\n\nconst classes = computed(() => [\n 'br-select',\n `br-select--${props.size}`,\n {\n 'br-select--open': isOpen.value,\n 'br-select--error': props.error,\n 'br-select--disabled': props.disabled,\n 'br-select--has-value': model.value !== null && model.value !== undefined,\n },\n])\n\n// ---------------------------------------------------------------------------\n// METHODS\n// ---------------------------------------------------------------------------\n\nfunction toggleDropdown() {\n if (props.disabled) return\n isOpen.value = !isOpen.value\n if (isOpen.value) {\n emit('open')\n highlightedIndex.value = 0\n } else {\n emit('close')\n searchQuery.value = ''\n }\n}\n\nfunction selectOption(option: SelectOption) {\n model.value = option.id\n emit('change', option.id)\n closeDropdown()\n}\n\nfunction closeDropdown() {\n isOpen.value = false\n searchQuery.value = ''\n emit('close')\n}\n\nfunction clearSelection() {\n model.value = null\n emit('change', null)\n}\n\nfunction handleKeydown(event: KeyboardEvent) {\n if (!isOpen.value) {\n if (event.key === 'Enter' || event.key === ' ' || event.key === 'ArrowDown') {\n event.preventDefault()\n toggleDropdown()\n }\n return\n }\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n highlightedIndex.value = Math.min(highlightedIndex.value + 1, filteredOptions.value.length - 1)\n break\n case 'ArrowUp':\n event.preventDefault()\n highlightedIndex.value = Math.max(highlightedIndex.value - 1, 0)\n break\n case 'Enter':\n event.preventDefault()\n if (filteredOptions.value[highlightedIndex.value]) {\n selectOption(filteredOptions.value[highlightedIndex.value])\n }\n break\n case 'Escape':\n closeDropdown()\n break\n }\n}\n\nfunction handleClickOutside(event: MouseEvent) {\n if (selectRef.value && !selectRef.value.contains(event.target as Node)) {\n closeDropdown()\n }\n}\n\n// ---------------------------------------------------------------------------\n// LIFECYCLE\n// ---------------------------------------------------------------------------\n\nonMounted(() => {\n document.addEventListener('click', handleClickOutside)\n})\n\nonUnmounted(() => {\n document.removeEventListener('click', handleClickOutside)\n})\n</script>\n\n<template>\n <div ref=\"selectRef\" :class=\"classes\" @keydown=\"handleKeydown\">\n <button\n type=\"button\"\n class=\"br-select__trigger\"\n :disabled=\"disabled\"\n @click=\"toggleDropdown\"\n >\n <span class=\"br-select__value\">\n {{ selectedOption?.text || placeholder }}\n </span>\n <span class=\"br-select__actions\">\n <span\n v-if=\"clearable && model !== null && model !== undefined\"\n class=\"br-select__clear\"\n @click.stop=\"clearSelection\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <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\" />\n </svg>\n </span>\n <span class=\"br-select__arrow\">\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6-6-6z\" />\n </svg>\n </span>\n </span>\n </button>\n\n <Transition name=\"br-select-dropdown\">\n <div v-if=\"isOpen\" class=\"br-select__dropdown\">\n <input\n v-if=\"searchable\"\n v-model=\"searchQuery\"\n type=\"text\"\n class=\"br-select__search\"\n placeholder=\"Buscar...\"\n @click.stop\n />\n <ul class=\"br-select__options\">\n <li\n v-for=\"(option, index) in filteredOptions\"\n :key=\"option.id\"\n class=\"br-select__option\"\n :class=\"{\n 'br-select__option--selected': option.id === model,\n 'br-select__option--highlighted': index === highlightedIndex,\n }\"\n @click=\"selectOption(option)\"\n @mouseenter=\"highlightedIndex = index\"\n >\n {{ option.text }}\n </li>\n <li v-if=\"filteredOptions.length === 0\" class=\"br-select__empty\">\n Nenhum resultado encontrado\n </li>\n </ul>\n </div>\n </Transition>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n.br-select {\n position: relative;\n width: 100%;\n\n &__trigger {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n padding: 0 var(--br-space-4);\n border: 1px solid var(--br-light-300);\n border-radius: var(--br-radius-sm);\n background: var(--br-light-0);\n color: var(--br-dark-700);\n font-family: var(--br-font-primary);\n cursor: pointer;\n transition: all var(--br-transition-fast);\n\n &:focus {\n outline: none;\n border-color: var(--br-primary-600);\n box-shadow: 0 0 0 3px rgba(109, 54, 251, 0.1);\n }\n }\n\n &__value {\n flex: 1;\n text-align: left;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n &__actions {\n display: flex;\n align-items: center;\n gap: var(--br-space-1);\n }\n\n &__clear,\n &__arrow {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n color: var(--br-dark-900);\n\n svg {\n width: 16px;\n height: 16px;\n }\n }\n\n &__clear:hover {\n color: var(--br-danger-600);\n }\n\n &__arrow {\n transition: transform var(--br-transition-fast);\n }\n\n // ---------------------------------------------------------------------------\n // SIZES\n // ---------------------------------------------------------------------------\n\n &--sm .br-select__trigger {\n height: 36px;\n font-size: var(--br-text-xs);\n }\n\n &--md .br-select__trigger {\n height: 44px;\n font-size: var(--br-text-sm);\n }\n\n &--lg .br-select__trigger {\n height: 56px;\n font-size: var(--br-text-base);\n }\n\n // ---------------------------------------------------------------------------\n // STATES\n // ---------------------------------------------------------------------------\n\n &--open {\n .br-select__arrow {\n transform: rotate(180deg);\n }\n\n .br-select__trigger {\n border-color: var(--br-primary-600);\n }\n }\n\n &--error .br-select__trigger {\n border-color: var(--br-danger-600);\n }\n\n &--disabled .br-select__trigger {\n background: var(--br-light-200);\n color: var(--br-dark-1100);\n cursor: not-allowed;\n }\n\n &:not(&--has-value) .br-select__value {\n color: var(--br-dark-1100);\n }\n\n // ---------------------------------------------------------------------------\n // DROPDOWN\n // ---------------------------------------------------------------------------\n\n &__dropdown {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n right: 0;\n z-index: var(--br-z-dropdown);\n background: var(--br-light-0);\n border: 1px solid var(--br-light-300);\n border-radius: var(--br-radius-md);\n box-shadow: var(--br-shadow-lg);\n overflow: hidden;\n }\n\n &__search {\n width: 100%;\n padding: var(--br-space-3);\n border: none;\n border-bottom: 1px solid var(--br-light-300);\n font-family: var(--br-font-primary);\n font-size: var(--br-text-sm);\n\n &:focus {\n outline: none;\n }\n }\n\n &__options {\n list-style: none;\n margin: 0;\n padding: var(--br-space-1) 0;\n max-height: 240px;\n overflow-y: auto;\n }\n\n &__option {\n padding: var(--br-space-3) var(--br-space-4);\n cursor: pointer;\n transition: background var(--br-transition-fast);\n\n &:hover,\n &--highlighted {\n background: var(--br-light-100);\n }\n\n &--selected {\n background: var(--br-primary-100);\n color: var(--br-primary-700);\n }\n }\n\n &__empty {\n padding: var(--br-space-4);\n text-align: center;\n color: var(--br-dark-1100);\n }\n}\n\n// ---------------------------------------------------------------------------\n// TRANSITION\n// ---------------------------------------------------------------------------\n\n.br-select-dropdown-enter-active,\n.br-select-dropdown-leave-active {\n transition: opacity 0.15s ease, transform 0.15s ease;\n}\n\n.br-select-dropdown-enter-from,\n.br-select-dropdown-leave-to {\n opacity: 0;\n transform: translateY(-8px);\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * BrBadge - Badge/Tag component for status indicators\n *\n * @example\n * <BrBadge>Default</BrBadge>\n * <BrBadge variant=\"success\">Ativo</BrBadge>\n * <BrBadge variant=\"danger\" size=\"lg\">Erro</BrBadge>\n */\n\nimport { computed } from 'vue'\nimport type { BadgeProps } from './types'\n\n// ---------------------------------------------------------------------------\n// PROPS\n// ---------------------------------------------------------------------------\n\nconst props = withDefaults(defineProps<BadgeProps>(), {\n variant: 'default',\n size: 'md',\n rounded: false,\n})\n\n// ---------------------------------------------------------------------------\n// COMPUTED\n// ---------------------------------------------------------------------------\n\nconst classes = computed(() => [\n 'br-badge',\n `br-badge--${props.variant}`,\n `br-badge--${props.size}`,\n {\n 'br-badge--rounded': props.rounded,\n },\n])\n</script>\n\n<template>\n <span :class=\"classes\">\n <slot />\n </span>\n</template>\n\n<style lang=\"scss\" scoped>\n.br-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--br-space-1);\n font-family: var(--br-font-primary);\n font-weight: var(--br-font-medium);\n line-height: 1;\n white-space: nowrap;\n transition: all var(--br-transition-fast);\n\n // ---------------------------------------------------------------------------\n // SIZES\n // ---------------------------------------------------------------------------\n\n &--sm {\n padding: 2px 6px;\n font-size: 10px;\n border-radius: var(--br-radius-sm);\n }\n\n &--md {\n padding: 4px 10px;\n font-size: var(--br-text-xs);\n border-radius: var(--br-radius-md);\n }\n\n &--lg {\n padding: 6px 12px;\n font-size: var(--br-text-sm);\n border-radius: var(--br-radius-md);\n }\n\n // ---------------------------------------------------------------------------\n // VARIANTS\n // ---------------------------------------------------------------------------\n\n &--default {\n background: var(--br-light-200);\n color: var(--br-dark-700);\n }\n\n &--primary {\n background: var(--br-primary-100);\n color: var(--br-primary-700);\n }\n\n &--secondary {\n background: var(--br-secondary-100);\n color: var(--br-secondary-900);\n }\n\n &--success {\n background: var(--br-success-100);\n color: var(--br-success-800);\n }\n\n &--danger {\n background: var(--br-danger-100);\n color: var(--br-danger-700);\n }\n\n &--warning {\n background: var(--br-warning-100);\n color: var(--br-warning-800);\n }\n\n &--info {\n background: var(--br-info-100);\n color: var(--br-info-800);\n }\n\n // ---------------------------------------------------------------------------\n // MODIFIERS\n // ---------------------------------------------------------------------------\n\n &--rounded {\n border-radius: var(--br-radius-full);\n }\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * BrTitle - Typography heading component\n *\n * @example\n * <BrTitle>Default Title</BrTitle>\n * <BrTitle tag=\"h2\" level=\"2\">Heading 2</BrTitle>\n * <BrTitle level=\"6\" weight=\"semibold\">Small Title</BrTitle>\n */\n\nimport { computed } from 'vue'\nimport type { TitleProps } from './types'\n\n// ---------------------------------------------------------------------------\n// PROPS\n// ---------------------------------------------------------------------------\n\nconst props = withDefaults(defineProps<TitleProps>(), {\n tag: 'h1',\n level: '4',\n weight: 'semibold',\n color: 'var(--br-dark-0)',\n align: 'left',\n truncate: false,\n maxLines: undefined,\n})\n\n// ---------------------------------------------------------------------------\n// COMPUTED\n// ---------------------------------------------------------------------------\n\nconst classes = computed(() => [\n 'br-title',\n `br-title--level-${props.level}`,\n `br-title--${props.weight}`,\n `br-title--${props.align}`,\n {\n 'br-title--truncate': props.truncate,\n 'br-title--clamp': props.maxLines,\n },\n])\n\nconst styles = computed(() => ({\n color: props.color,\n '--max-lines': props.maxLines,\n}))\n</script>\n\n<template>\n <component :is=\"tag\" :class=\"classes\" :style=\"styles\">\n <slot />\n </component>\n</template>\n\n<style lang=\"scss\" scoped>\n.br-title {\n font-family: var(--br-font-secondary);\n margin: 0;\n padding: 0;\n transition: color var(--br-transition-fast);\n\n // ---------------------------------------------------------------------------\n // LEVELS (Based on design system)\n // ---------------------------------------------------------------------------\n\n &--level-1 {\n font-size: var(--br-text-h1);\n line-height: 1.2;\n }\n\n &--level-2 {\n font-size: var(--br-text-h2);\n line-height: 1.25;\n }\n\n &--level-3 {\n font-size: var(--br-text-h3);\n line-height: 1.3;\n }\n\n &--level-4 {\n font-size: var(--br-text-h4);\n line-height: 1.35;\n }\n\n &--level-5 {\n font-size: var(--br-text-h5);\n line-height: 1.4;\n }\n\n &--level-6 {\n font-size: var(--br-text-h6);\n line-height: 1.4;\n }\n\n &--level-7 {\n font-size: var(--br-text-h7);\n line-height: 1.4;\n }\n\n // ---------------------------------------------------------------------------\n // WEIGHTS\n // ---------------------------------------------------------------------------\n\n &--normal {\n font-weight: var(--br-font-normal);\n }\n\n &--medium {\n font-weight: var(--br-font-medium);\n }\n\n &--semibold {\n font-weight: var(--br-font-semibold);\n }\n\n &--bold {\n font-weight: var(--br-font-bold);\n }\n\n // ---------------------------------------------------------------------------\n // ALIGNMENT\n // ---------------------------------------------------------------------------\n\n &--left {\n text-align: left;\n }\n\n &--center {\n text-align: center;\n }\n\n &--right {\n text-align: right;\n }\n\n // ---------------------------------------------------------------------------\n // TRUNCATION\n // ---------------------------------------------------------------------------\n\n &--truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n &--clamp {\n display: -webkit-box;\n -webkit-line-clamp: var(--max-lines);\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * BrSpinner - Loading spinner component\n *\n * @example\n * <BrSpinner />\n * <BrSpinner size=\"lg\" color=\"var(--br-primary-600)\" />\n * <BrSpinner status=\"success\" />\n */\n\nimport { computed } from 'vue'\nimport type { SpinnerProps } from './types'\n\n// ---------------------------------------------------------------------------\n// PROPS\n// ---------------------------------------------------------------------------\n\nconst props = withDefaults(defineProps<SpinnerProps>(), {\n size: 'md',\n color: 'var(--br-primary-600)',\n status: 'loading',\n})\n\n// ---------------------------------------------------------------------------\n// COMPUTED\n// ---------------------------------------------------------------------------\n\nconst sizeMap = {\n sm: 16,\n md: 24,\n lg: 32,\n xl: 48,\n}\n\nconst spinnerSize = computed(() => sizeMap[props.size])\n\nconst styles = computed(() => ({\n '--spinner-size': `${spinnerSize.value}px`,\n '--spinner-color': props.color,\n}))\n</script>\n\n<template>\n <div class=\"br-spinner\" :style=\"styles\">\n <span v-if=\"status === 'loading'\" class=\"br-spinner__circle\" />\n <svg\n v-else-if=\"status === 'success'\"\n class=\"br-spinner__check\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17z\"\n fill=\"currentColor\"\n />\n </svg>\n <svg\n v-else-if=\"status === 'error'\"\n class=\"br-spinner__error\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n 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\"\n fill=\"currentColor\"\n />\n </svg>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n.br-spinner {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n &__circle {\n width: var(--spinner-size);\n height: var(--spinner-size);\n border-radius: 50%;\n background: conic-gradient(from 0deg, transparent 0%, var(--spinner-color) 100%);\n mask: radial-gradient(farthest-side, transparent calc(100% - 3px), #000 calc(100% - 3px));\n -webkit-mask: radial-gradient(farthest-side, transparent calc(100% - 3px), #000 calc(100% - 3px));\n animation: br-spin 1s linear infinite;\n }\n\n &__check,\n &__error {\n width: var(--spinner-size);\n height: var(--spinner-size);\n color: var(--spinner-color);\n animation: br-fade-in 0.3s ease-out;\n }\n\n &__check {\n color: var(--br-success-600);\n }\n\n &__error {\n color: var(--br-danger-600);\n }\n}\n\n@keyframes br-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes br-fade-in {\n from {\n opacity: 0;\n transform: scale(0.8);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * BrSwitch - Toggle switch component\n *\n * @example\n * <BrSwitch v-model=\"isActive\" />\n * <BrSwitch v-model=\"isEnabled\" size=\"lg\" />\n * <BrSwitch v-model=\"value\" disabled />\n */\n\nimport { computed } from 'vue'\nimport type { SwitchProps } from './types'\n\n// ---------------------------------------------------------------------------\n// PROPS\n// ---------------------------------------------------------------------------\n\nconst props = withDefaults(defineProps<SwitchProps>(), {\n size: 'md',\n disabled: false,\n})\n\n// ---------------------------------------------------------------------------\n// MODEL\n// ---------------------------------------------------------------------------\n\nconst model = defineModel<boolean>({ default: false })\n\n// ---------------------------------------------------------------------------\n// COMPUTED\n// ---------------------------------------------------------------------------\n\nconst classes = computed(() => [\n 'br-switch',\n `br-switch--${props.size}`,\n {\n 'br-switch--checked': model.value,\n 'br-switch--disabled': props.disabled,\n },\n])\n\n// ---------------------------------------------------------------------------\n// METHODS\n// ---------------------------------------------------------------------------\n\nfunction toggle() {\n if (!props.disabled) {\n model.value = !model.value\n }\n}\n</script>\n\n<template>\n <button\n type=\"button\"\n role=\"switch\"\n :class=\"classes\"\n :aria-checked=\"model\"\n :disabled=\"disabled\"\n @click=\"toggle\"\n >\n <span class=\"br-switch__track\">\n <span class=\"br-switch__thumb\" />\n </span>\n </button>\n</template>\n\n<style lang=\"scss\" scoped>\n.br-switch {\n display: inline-flex;\n align-items: center;\n padding: 0;\n border: none;\n background: transparent;\n cursor: pointer;\n transition: all var(--br-transition-fast);\n\n &__track {\n position: relative;\n display: flex;\n align-items: center;\n background: var(--br-dark-1100);\n border-radius: var(--br-radius-full);\n transition: background var(--br-transition-fast);\n }\n\n &__thumb {\n position: absolute;\n background: var(--br-light-0);\n border-radius: 50%;\n box-shadow: var(--br-shadow-sm);\n transition: transform var(--br-transition-fast);\n }\n\n // ---------------------------------------------------------------------------\n // SIZES\n // ---------------------------------------------------------------------------\n\n &--sm {\n .br-switch__track {\n width: 36px;\n height: 20px;\n }\n\n .br-switch__thumb {\n width: 16px;\n height: 16px;\n left: 2px;\n }\n\n &.br-switch--checked .br-switch__thumb {\n transform: translateX(16px);\n }\n }\n\n &--md {\n .br-switch__track {\n width: 44px;\n height: 24px;\n }\n\n .br-switch__thumb {\n width: 20px;\n height: 20px;\n left: 2px;\n }\n\n &.br-switch--checked .br-switch__thumb {\n transform: translateX(20px);\n }\n }\n\n &--lg {\n .br-switch__track {\n width: 52px;\n height: 28px;\n }\n\n .br-switch__thumb {\n width: 24px;\n height: 24px;\n left: 2px;\n }\n\n &.br-switch--checked .br-switch__thumb {\n transform: translateX(24px);\n }\n }\n\n // ---------------------------------------------------------------------------\n // STATES\n // ---------------------------------------------------------------------------\n\n &--checked {\n .br-switch__track {\n background: var(--br-primary-600);\n }\n }\n\n &--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n &:focus-visible {\n outline: 2px solid var(--br-primary-600);\n outline-offset: 2px;\n border-radius: var(--br-radius-full);\n }\n\n &:hover:not(&--disabled) {\n .br-switch__track {\n background: var(--br-dark-900);\n }\n\n &.br-switch--checked .br-switch__track {\n background: var(--br-primary-700);\n }\n }\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * BrTextarea - Multiline text input component\n *\n * @example\n * <BrTextarea v-model=\"text\" placeholder=\"Digite sua mensagem...\" />\n * <BrTextarea v-model=\"description\" :rows=\"6\" resize=\"vertical\" />\n */\n\nimport { computed, ref } from 'vue'\nimport type { TextareaProps } from './types'\n\n// ---------------------------------------------------------------------------\n// PROPS\n// ---------------------------------------------------------------------------\n\nconst props = withDefaults(defineProps<TextareaProps>(), {\n placeholder: '',\n disabled: false,\n readonly: false,\n error: false,\n rows: 4,\n resize: 'vertical',\n maxLength: undefined,\n})\n\n// ---------------------------------------------------------------------------\n// MODEL\n// ---------------------------------------------------------------------------\n\nconst model = defineModel<string>({ default: '' })\n\n// ---------------------------------------------------------------------------\n// EMITS\n// ---------------------------------------------------------------------------\n\nconst emit = defineEmits<{\n (e: 'focus', value: string): void\n (e: 'blur', value: string): void\n}>()\n\n// ---------------------------------------------------------------------------\n// REFS\n// ---------------------------------------------------------------------------\n\nconst textareaRef = ref<HTMLTextAreaElement | null>(null)\nconst isFocused = ref(false)\n\n// ---------------------------------------------------------------------------\n// COMPUTED\n// ---------------------------------------------------------------------------\n\nconst classes = computed(() => [\n 'br-textarea',\n {\n 'br-textarea--error': props.error,\n 'br-textarea--disabled': props.disabled,\n 'br-textarea--focused': isFocused.value,\n },\n])\n\nconst styles = computed(() => ({\n resize: props.resize,\n}))\n\nconst charCount = computed(() => model.value?.length || 0)\n\n// ---------------------------------------------------------------------------\n// METHODS\n// ---------------------------------------------------------------------------\n\nfunction handleInput(event: Event) {\n const target = event.target as HTMLTextAreaElement\n model.value = target.value\n}\n\nfunction handleFocus() {\n isFocused.value = true\n emit('focus', model.value)\n}\n\nfunction handleBlur() {\n isFocused.value = false\n emit('blur', model.value)\n}\n\nfunction focus() {\n textareaRef.value?.focus()\n}\n\nfunction blur() {\n textareaRef.value?.blur()\n}\n\n// ---------------------------------------------------------------------------\n// EXPOSE\n// ---------------------------------------------------------------------------\n\ndefineExpose({ focus, blur, textareaRef })\n</script>\n\n<template>\n <div class=\"br-textarea-wrapper\">\n <textarea\n ref=\"textareaRef\"\n :class=\"classes\"\n :style=\"styles\"\n :value=\"model\"\n :placeholder=\"placeholder\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :rows=\"rows\"\n :maxlength=\"maxLength\"\n @input=\"handleInput\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n />\n <div v-if=\"maxLength\" class=\"br-textarea__counter\">\n {{ charCount }}/{{ maxLength }}\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n.br-textarea-wrapper {\n position: relative;\n width: 100%;\n}\n\n.br-textarea {\n width: 100%;\n font-family: var(--br-font-primary);\n font-size: var(--br-text-sm);\n line-height: 1.5;\n padding: var(--br-space-3) var(--br-space-4);\n border: 1px solid var(--br-light-300);\n border-radius: var(--br-radius-md);\n background: var(--br-light-0);\n color: var(--br-dark-700);\n transition: all var(--br-transition-fast);\n\n &::placeholder {\n color: var(--br-dark-1100);\n }\n\n &:focus {\n outline: none;\n border-color: var(--br-primary-600);\n box-shadow: 0 0 0 3px rgba(109, 54, 251, 0.1);\n }\n\n // ---------------------------------------------------------------------------\n // STATES\n // ---------------------------------------------------------------------------\n\n &--error {\n border-color: var(--br-danger-600);\n\n &:focus {\n border-color: var(--br-danger-600);\n box-shadow: 0 0 0 3px rgba(255, 46, 46, 0.1);\n }\n }\n\n &--disabled {\n background: var(--br-light-200);\n color: var(--br-dark-1100);\n cursor: not-allowed;\n }\n\n &__counter {\n position: absolute;\n bottom: var(--br-space-2);\n right: var(--br-space-3);\n font-size: var(--br-text-xs);\n color: var(--br-dark-1100);\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport type { AvatarProps } from './types'\n\nconst props = withDefaults(defineProps<AvatarProps>(), {\n size: 'md',\n shape: 'circle',\n showStatus: false,\n status: 'offline',\n})\n\nconst imageError = ref(false)\n\nconst classes = computed(() => [\n 'br-avatar',\n `br-avatar--${props.size}`,\n `br-avatar--${props.shape}`,\n])\n\nconst displayInitials = computed(() => {\n if (props.initials) return props.initials.slice(0, 2).toUpperCase()\n if (props.alt) {\n const words = props.alt.split(' ')\n if (words.length >= 2) {\n return (words[0][0] + words[1][0]).toUpperCase()\n }\n return props.alt.slice(0, 2).toUpperCase()\n }\n return '?'\n})\n\nconst showImage = computed(() => props.src && !imageError.value)\n\nfunction handleImageError() {\n imageError.value = true\n}\n</script>\n\n<template>\n <div :class=\"classes\">\n <img\n v-if=\"showImage\"\n :src=\"src\"\n :alt=\"alt\"\n class=\"br-avatar__image\"\n @error=\"handleImageError\"\n />\n <span v-else class=\"br-avatar__initials\">{{ displayInitials }}</span>\n\n <span\n v-if=\"showStatus\"\n class=\"br-avatar__status\"\n :class=\"`br-avatar__status--${status}`\"\n />\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n.br-avatar {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n background: var(--br-primary-100);\n color: var(--br-primary-600);\n font-weight: var(--br-font-semibold);\n overflow: hidden;\n flex-shrink: 0;\n\n // Sizes\n &--xs {\n width: 24px;\n height: 24px;\n font-size: var(--br-text-xs);\n }\n\n &--sm {\n width: 32px;\n height: 32px;\n font-size: var(--br-text-sm);\n }\n\n &--md {\n width: 40px;\n height: 40px;\n font-size: var(--br-text-base);\n }\n\n &--lg {\n width: 48px;\n height: 48px;\n font-size: var(--br-text-lg);\n }\n\n &--xl {\n width: 64px;\n height: 64px;\n font-size: var(--br-text-xl);\n }\n\n &--2xl {\n width: 96px;\n height: 96px;\n font-size: var(--br-text-2xl);\n }\n\n // Shapes\n &--circle {\n border-radius: var(--br-radius-full);\n }\n\n &--square {\n border-radius: var(--br-radius-lg);\n }\n\n &__image {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n &__initials {\n user-select: none;\n }\n\n &__status {\n position: absolute;\n bottom: 0;\n right: 0;\n width: 25%;\n height: 25%;\n min-width: 8px;\n min-height: 8px;\n border-radius: var(--br-radius-full);\n border: 2px solid var(--br-light-0);\n\n &--online {\n background: var(--br-success-600);\n }\n\n &--offline {\n background: var(--br-dark-500);\n }\n\n &--away {\n background: var(--br-warning-600);\n }\n\n &--busy {\n background: var(--br-danger-600);\n }\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref, onMounted } from 'vue'\nimport type { ImageProps } from './types'\n\nconst props = withDefaults(defineProps<ImageProps>(), {\n fit: 'cover',\n lazy: true,\n showPlaceholder: true,\n rounded: false,\n})\n\nconst isLoaded = ref(false)\nconst hasError = ref(false)\nconst imageRef = ref<HTMLImageElement | null>(null)\n\nconst classes = computed(() => [\n 'br-image',\n {\n 'br-image--loading': !isLoaded.value && props.showPlaceholder,\n 'br-image--error': hasError.value,\n 'br-image--rounded': props.rounded === true,\n [`br-image--rounded-${props.rounded}`]: typeof props.rounded === 'string',\n },\n])\n\nconst imageStyles = computed(() => ({\n width: typeof props.width === 'number' ? `${props.width}px` : props.width,\n height: typeof props.height === 'number' ? `${props.height}px` : props.height,\n objectFit: props.fit,\n}))\n\nconst currentSrc = computed(() => {\n if (hasError.value && props.fallback) return props.fallback\n return props.src\n})\n\nfunction handleLoad() {\n isLoaded.value = true\n}\n\nfunction handleError() {\n hasError.value = true\n if (!props.fallback) {\n isLoaded.value = true\n }\n}\n\nonMounted(() => {\n if (!props.lazy && imageRef.value) {\n imageRef.value.loading = 'eager'\n }\n})\n</script>\n\n<template>\n <div :class=\"classes\" :style=\"{ width: imageStyles.width, height: imageStyles.height }\">\n <div v-if=\"!isLoaded && showPlaceholder\" class=\"br-image__placeholder\">\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z\"/>\n </svg>\n </div>\n <img\n ref=\"imageRef\"\n :src=\"currentSrc\"\n :alt=\"alt\"\n :loading=\"lazy ? 'lazy' : 'eager'\"\n class=\"br-image__img\"\n :style=\"imageStyles\"\n @load=\"handleLoad\"\n @error=\"handleError\"\n />\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n.br-image {\n position: relative;\n display: inline-block;\n overflow: hidden;\n background: var(--br-light-200);\n\n &--rounded {\n border-radius: var(--br-radius-md);\n }\n\n &--rounded-sm {\n border-radius: var(--br-radius-sm);\n }\n\n &--rounded-md {\n border-radius: var(--br-radius-md);\n }\n\n &--rounded-lg {\n border-radius: var(--br-radius-lg);\n }\n\n &--rounded-xl {\n border-radius: var(--br-radius-xl);\n }\n\n &--rounded-full {\n border-radius: var(--br-radius-full);\n }\n\n &__placeholder {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--br-light-200);\n color: var(--br-dark-500);\n\n svg {\n width: 40%;\n height: 40%;\n max-width: 48px;\n max-height: 48px;\n }\n }\n\n &__img {\n display: block;\n width: 100%;\n height: 100%;\n transition: opacity var(--br-transition-normal);\n }\n\n &--loading &__img {\n opacity: 0;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport type { VideoProps } from './types'\n\nconst props = withDefaults(defineProps<VideoProps>(), {\n autoplay: false,\n loop: false,\n muted: false,\n controls: true,\n preload: 'metadata',\n rounded: false,\n})\n\nconst emit = defineEmits<{\n (e: 'play'): void\n (e: 'pause'): void\n (e: 'ended'): void\n (e: 'error', error: Event): void\n}>()\n\nconst videoRef = ref<HTMLVideoElement | null>(null)\nconst isPlaying = ref(false)\n\nconst classes = computed(() => [\n 'br-video',\n {\n 'br-video--rounded': props.rounded === true,\n [`br-video--rounded-${props.rounded}`]: typeof props.rounded === 'string',\n },\n])\n\nconst videoStyles = computed(() => ({\n width: typeof props.width === 'number' ? `${props.width}px` : props.width,\n height: typeof props.height === 'number' ? `${props.height}px` : props.height,\n}))\n\nfunction play() {\n videoRef.value?.play()\n}\n\nfunction pause() {\n videoRef.value?.pause()\n}\n\nfunction toggle() {\n if (isPlaying.value) {\n pause()\n } else {\n play()\n }\n}\n\nfunction handlePlay() {\n isPlaying.value = true\n emit('play')\n}\n\nfunction handlePause() {\n isPlaying.value = false\n emit('pause')\n}\n\nfunction handleEnded() {\n isPlaying.value = false\n emit('ended')\n}\n\nfunction handleError(event: Event) {\n emit('error', event)\n}\n\ndefineExpose({\n play,\n pause,\n toggle,\n videoRef,\n})\n</script>\n\n<template>\n <div :class=\"classes\" :style=\"videoStyles\">\n <video\n ref=\"videoRef\"\n :src=\"src\"\n :poster=\"poster\"\n :autoplay=\"autoplay\"\n :loop=\"loop\"\n :muted=\"muted\"\n :controls=\"controls\"\n :preload=\"preload\"\n class=\"br-video__player\"\n @play=\"handlePlay\"\n @pause=\"handlePause\"\n @ended=\"handleEnded\"\n @error=\"handleError\"\n >\n <slot />\n </video>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n.br-video {\n position: relative;\n display: inline-block;\n overflow: hidden;\n background: var(--br-dark-0);\n\n &--rounded {\n border-radius: var(--br-radius-md);\n }\n\n &--rounded-sm {\n border-radius: var(--br-radius-sm);\n }\n\n &--rounded-md {\n border-radius: var(--br-radius-md);\n }\n\n &--rounded-lg {\n border-radius: var(--br-radius-lg);\n }\n\n &--rounded-xl {\n border-radius: var(--br-radius-xl);\n }\n\n &__player {\n display: block;\n width: 100%;\n height: 100%;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { RadioProps } from './types'\n\nconst props = withDefaults(defineProps<RadioProps>(), {\n size: 'md',\n disabled: false,\n error: false,\n})\n\nconst model = defineModel<string | number | boolean>()\n\nconst classes = computed(() => [\n 'br-radio',\n `br-radio--${props.size}`,\n {\n 'br-radio--disabled': props.disabled,\n 'br-radio--error': props.error,\n 'br-radio--checked': model.value === props.value,\n },\n])\n\nconst inputId = computed(() => `radio-${props.name}-${props.value}`)\n\nfunction handleChange() {\n if (!props.disabled) {\n model.value = props.value\n }\n}\n</script>\n\n<template>\n <label :class=\"classes\" :for=\"inputId\">\n <input\n :id=\"inputId\"\n type=\"radio\"\n :name=\"name\"\n :value=\"value\"\n :checked=\"model === value\"\n :disabled=\"disabled\"\n class=\"br-radio__input\"\n @change=\"handleChange\"\n />\n <span class=\"br-radio__control\">\n <span class=\"br-radio__dot\" />\n </span>\n <span v-if=\"label || $slots.default\" class=\"br-radio__label\">\n <slot>{{ label }}</slot>\n </span>\n <span v-if=\"helperText\" class=\"br-radio__helper\">{{ helperText }}</span>\n </label>\n</template>\n\n<style lang=\"scss\" scoped>\n.br-radio {\n display: inline-flex;\n align-items: flex-start;\n gap: var(--br-space-2);\n cursor: pointer;\n user-select: none;\n\n &__input {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n }\n\n &__control {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n border: 2px solid var(--br-dark-300);\n border-radius: 50%;\n background: var(--br-white);\n transition: all var(--br-transition-fast);\n }\n\n &__dot {\n border-radius: 50%;\n background: transparent;\n transition: all var(--br-transition-fast);\n }\n\n &__label {\n color: var(--br-dark-700);\n line-height: 1.4;\n }\n\n &__helper {\n display: block;\n width: 100%;\n margin-top: var(--br-space-1);\n font-size: var(--br-text-sm);\n color: var(--br-dark-500);\n }\n\n // Sizes\n &--sm {\n .br-radio__control {\n width: 16px;\n height: 16px;\n }\n .br-radio__dot {\n width: 8px;\n height: 8px;\n }\n .br-radio__label {\n font-size: var(--br-text-sm);\n }\n }\n\n &--md {\n .br-radio__control {\n width: 20px;\n height: 20px;\n }\n .br-radio__dot {\n width: 10px;\n height: 10px;\n }\n .br-radio__label {\n font-size: var(--br-text-md);\n }\n }\n\n &--lg {\n .br-radio__control {\n width: 24px;\n height: 24px;\n }\n .br-radio__dot {\n width: 12px;\n height: 12px;\n }\n .br-radio__label {\n font-size: var(--br-text-lg);\n }\n }\n\n // States\n &:hover:not(&--disabled) {\n .br-radio__control {\n border-color: var(--br-primary-500);\n }\n }\n\n &--checked {\n .br-radio__control {\n border-color: var(--br-primary-500);\n }\n .br-radio__dot {\n background: var(--br-primary-500);\n }\n }\n\n &--error {\n .br-radio__control {\n border-color: var(--br-danger-500);\n }\n &.br-radio--checked .br-radio__dot {\n background: var(--br-danger-500);\n }\n .br-radio__helper {\n color: var(--br-danger-500);\n }\n }\n\n &--disabled {\n cursor: not-allowed;\n opacity: 0.5;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { RadioGroupProps } from './types'\nimport BrRadio from './BrRadio.vue'\n\nconst props = withDefaults(defineProps<RadioGroupProps>(), {\n direction: 'vertical',\n size: 'md',\n disabled: false,\n error: false,\n})\n\nconst model = defineModel<string | number | boolean>()\n\nconst classes = computed(() => [\n 'br-radio-group',\n `br-radio-group--${props.direction}`,\n {\n 'br-radio-group--error': props.error,\n },\n])\n</script>\n\n<template>\n <div :class=\"classes\" role=\"radiogroup\" :aria-label=\"label\">\n <span v-if=\"label\" class=\"br-radio-group__label\">{{ label }}</span>\n <div class=\"br-radio-group__options\">\n <BrRadio\n v-for=\"option in options\"\n :key=\"String(option.value)\"\n v-model=\"model\"\n :value=\"option.value\"\n :label=\"option.label\"\n :name=\"name\"\n :size=\"size\"\n :disabled=\"disabled || option.disabled\"\n :error=\"error\"\n />\n </div>\n <span v-if=\"error && errorMessage\" class=\"br-radio-group__error\">\n {{ errorMessage }}\n </span>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n.br-radio-group {\n display: flex;\n flex-direction: column;\n gap: var(--br-space-2);\n\n &__label {\n font-size: var(--br-text-sm);\n font-weight: var(--br-font-medium);\n color: var(--br-dark-700);\n }\n\n &__options {\n display: flex;\n gap: var(--br-space-3);\n }\n\n &--vertical &__options {\n flex-direction: column;\n }\n\n &--horizontal &__options {\n flex-direction: row;\n flex-wrap: wrap;\n }\n\n &__error {\n font-size: var(--br-text-sm);\n color: var(--br-danger-500);\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { ProgressbarProps } from './types'\n\nconst props = withDefaults(defineProps<ProgressbarProps>(), {\n value: 0,\n max: 100,\n size: 'md',\n variant: 'primary',\n showLabel: false,\n labelPosition: 'right',\n striped: false,\n animated: false,\n indeterminate: false,\n rounded: true,\n})\n\nconst percentage = computed(() => {\n if (props.indeterminate) return 0\n return Math.min(100, Math.max(0, (props.value / props.max) * 100))\n})\n\nconst classes = computed(() => [\n 'br-progressbar',\n `br-progressbar--${props.size}`,\n `br-progressbar--${props.variant}`,\n {\n 'br-progressbar--striped': props.striped,\n 'br-progressbar--animated': props.animated,\n 'br-progressbar--indeterminate': props.indeterminate,\n 'br-progressbar--rounded': props.rounded,\n [`br-progressbar--label-${props.labelPosition}`]: props.showLabel,\n },\n])\n\nconst barStyle = computed(() => ({\n width: props.indeterminate ? '100%' : `${percentage.value}%`,\n}))\n</script>\n\n<template>\n <div :class=\"classes\">\n <span v-if=\"showLabel && labelPosition === 'top'\" class=\"br-progressbar__label\">\n {{ Math.round(percentage) }}%\n </span>\n <div class=\"br-progressbar__track\">\n <div class=\"br-progressbar__bar\" :style=\"barStyle\">\n <span v-if=\"showLabel && labelPosition === 'inside'\" class=\"br-progressbar__label\">\n {{ Math.round(percentage) }}%\n </span>\n </div>\n </div>\n <span v-if=\"showLabel && labelPosition === 'right'\" class=\"br-progressbar__label\">\n {{ Math.round(percentage) }}%\n </span>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n.br-progressbar {\n display: flex;\n align-items: center;\n gap: var(--br-space-2);\n width: 100%;\n\n &--label-top {\n flex-direction: column;\n align-items: flex-start;\n }\n\n &__track {\n flex: 1;\n background: var(--br-light-300);\n overflow: hidden;\n }\n\n &__bar {\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: width var(--br-transition-normal);\n }\n\n &__label {\n font-size: var(--br-text-sm);\n font-weight: var(--br-font-medium);\n color: var(--br-dark-600);\n white-space: nowrap;\n }\n\n // Sizes\n &--xs {\n .br-progressbar__track {\n height: 4px;\n }\n }\n\n &--sm {\n .br-progressbar__track {\n height: 8px;\n }\n }\n\n &--md {\n .br-progressbar__track {\n height: 12px;\n }\n }\n\n &--lg {\n .br-progressbar__track {\n height: 20px;\n }\n .br-progressbar__bar {\n font-size: var(--br-text-xs);\n }\n }\n\n // Rounded\n &--rounded {\n .br-progressbar__track {\n border-radius: var(--br-radius-full);\n }\n .br-progressbar__bar {\n border-radius: var(--br-radius-full);\n }\n }\n\n // Variants\n &--primary .br-progressbar__bar {\n background: var(--br-primary-500);\n }\n\n &--success .br-progressbar__bar {\n background: var(--br-success-500);\n }\n\n &--warning .br-progressbar__bar {\n background: var(--br-warning-500);\n }\n\n &--danger .br-progressbar__bar {\n background: var(--br-danger-500);\n }\n\n &--info .br-progressbar__bar {\n background: var(--br-info-500);\n }\n\n // Inside label\n &--label-inside {\n .br-progressbar__label {\n color: var(--br-white);\n font-size: var(--br-text-xs);\n padding: 0 var(--br-space-2);\n }\n }\n\n // Striped\n &--striped .br-progressbar__bar {\n background-image: linear-gradient(\n 45deg,\n rgba(255, 255, 255, 0.15) 25%,\n transparent 25%,\n transparent 50%,\n rgba(255, 255, 255, 0.15) 50%,\n rgba(255, 255, 255, 0.15) 75%,\n transparent 75%,\n transparent\n );\n background-size: 1rem 1rem;\n }\n\n // Animated\n &--animated .br-progressbar__bar {\n animation: progress-bar-stripes 1s linear infinite;\n }\n\n // Indeterminate\n &--indeterminate .br-progressbar__bar {\n width: 30% !important;\n animation: progress-bar-indeterminate 1.5s ease-in-out infinite;\n }\n}\n\n@keyframes progress-bar-stripes {\n from {\n background-position: 1rem 0;\n }\n to {\n background-position: 0 0;\n }\n}\n\n@keyframes progress-bar-indeterminate {\n 0% {\n transform: translateX(-100%);\n }\n 100% {\n transform: translateX(400%);\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport type { RatingProps } from './types'\n\nconst props = withDefaults(defineProps<RatingProps>(), {\n max: 5,\n size: 'md',\n allowHalf: false,\n readonly: false,\n disabled: false,\n showValue: false,\n icon: 'star',\n clearable: false,\n})\n\nconst model = defineModel<number>({ default: 0 })\nconst hoverValue = ref<number | null>(null)\n\nconst displayValue = computed(() => {\n if (hoverValue.value !== null && !props.readonly && !props.disabled) {\n return hoverValue.value\n }\n return model.value\n})\n\nconst classes = computed(() => [\n 'br-rating',\n `br-rating--${props.size}`,\n {\n 'br-rating--readonly': props.readonly,\n 'br-rating--disabled': props.disabled,\n },\n])\n\nconst stars = computed(() => {\n const items = []\n for (let i = 1; i <= props.max; i++) {\n const filled = displayValue.value >= i\n const halfFilled = props.allowHalf && displayValue.value >= i - 0.5 && displayValue.value < i\n items.push({\n index: i,\n filled,\n halfFilled,\n })\n }\n return items\n})\n\nfunction handleMouseMove(index: number, event: MouseEvent) {\n if (props.readonly || props.disabled) return\n\n if (props.allowHalf) {\n const target = event.currentTarget as HTMLElement\n const rect = target.getBoundingClientRect()\n const isHalf = event.clientX - rect.left < rect.width / 2\n hoverValue.value = isHalf ? index - 0.5 : index\n } else {\n hoverValue.value = index\n }\n}\n\nfunction handleMouseLeave() {\n hoverValue.value = null\n}\n\nfunction handleClick(index: number, event: MouseEvent) {\n if (props.readonly || props.disabled) return\n\n let newValue: number\n if (props.allowHalf) {\n const target = event.currentTarget as HTMLElement\n const rect = target.getBoundingClientRect()\n const isHalf = event.clientX - rect.left < rect.width / 2\n newValue = isHalf ? index - 0.5 : index\n } else {\n newValue = index\n }\n\n if (props.clearable && model.value === newValue) {\n model.value = 0\n } else {\n model.value = newValue\n }\n}\n\nconst iconPaths = {\n star: 'M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z',\n heart: 'M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z',\n circle: 'M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2z',\n}\n</script>\n\n<template>\n <div :class=\"classes\" @mouseleave=\"handleMouseLeave\">\n <div class=\"br-rating__stars\">\n <button\n v-for=\"star in stars\"\n :key=\"star.index\"\n type=\"button\"\n class=\"br-rating__star\"\n :class=\"{\n 'br-rating__star--filled': star.filled,\n 'br-rating__star--half': star.halfFilled,\n }\"\n :style=\"{\n '--active-color': activeColor,\n '--inactive-color': inactiveColor,\n }\"\n :disabled=\"disabled\"\n @mousemove=\"handleMouseMove(star.index, $event)\"\n @click=\"handleClick(star.index, $event)\"\n >\n <svg viewBox=\"0 0 24 24\" class=\"br-rating__icon\">\n <defs v-if=\"star.halfFilled\">\n <linearGradient :id=\"`half-${star.index}`\">\n <stop offset=\"50%\" stop-color=\"currentColor\" />\n <stop offset=\"50%\" stop-color=\"var(--br-light-400)\" />\n </linearGradient>\n </defs>\n <path\n :d=\"iconPaths[icon]\"\n :fill=\"star.halfFilled ? `url(#half-${star.index})` : 'currentColor'\"\n />\n </svg>\n </button>\n </div>\n <span v-if=\"showValue\" class=\"br-rating__value\">\n {{ model.toFixed(allowHalf ? 1 : 0) }}\n </span>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n.br-rating {\n display: inline-flex;\n align-items: center;\n gap: var(--br-space-2);\n\n &__stars {\n display: flex;\n gap: var(--br-space-1);\n }\n\n &__star {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n border: none;\n background: transparent;\n cursor: pointer;\n color: var(--inactive-color, var(--br-light-400));\n transition: transform var(--br-transition-fast), color var(--br-transition-fast);\n\n &:hover:not(:disabled) {\n transform: scale(1.1);\n }\n\n &--filled,\n &--half {\n color: var(--active-color, var(--br-warning-500));\n }\n\n &:disabled {\n cursor: not-allowed;\n }\n }\n\n &__icon {\n width: 100%;\n height: 100%;\n }\n\n &__value {\n font-weight: var(--br-font-medium);\n color: var(--br-dark-600);\n }\n\n // Sizes\n &--sm {\n .br-rating__star {\n width: 16px;\n height: 16px;\n }\n .br-rating__value {\n font-size: var(--br-text-sm);\n }\n }\n\n &--md {\n .br-rating__star {\n width: 24px;\n height: 24px;\n }\n .br-rating__value {\n font-size: var(--br-text-md);\n }\n }\n\n &--lg {\n .br-rating__star {\n width: 32px;\n height: 32px;\n }\n .br-rating__value {\n font-size: var(--br-text-lg);\n }\n }\n\n &--xl {\n .br-rating__star {\n width: 40px;\n height: 40px;\n }\n .br-rating__value {\n font-size: var(--br-text-xl);\n }\n }\n\n // States\n &--readonly {\n .br-rating__star {\n cursor: default;\n &:hover {\n transform: none;\n }\n }\n }\n\n &--disabled {\n opacity: 0.5;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport type { CheckboxProps } from './types'\n\nconst props = withDefaults(defineProps<CheckboxProps>(), {\n size: 'md',\n disabled: false,\n indeterminate: false,\n error: false,\n trueValue: true,\n falseValue: false,\n})\n\nconst model = defineModel<string | number | boolean | Array<string | number>>()\nconst inputRef = ref<HTMLInputElement | null>(null)\n\nconst isChecked = computed(() => {\n if (Array.isArray(model.value)) {\n return model.value.includes(props.trueValue as never)\n }\n return model.value === props.trueValue\n})\n\nconst classes = computed(() => [\n 'br-checkbox',\n `br-checkbox--${props.size}`,\n {\n 'br-checkbox--disabled': props.disabled,\n 'br-checkbox--error': props.error,\n 'br-checkbox--checked': isChecked.value,\n 'br-checkbox--indeterminate': props.indeterminate,\n },\n])\n\nwatch(\n () => props.indeterminate,\n (val) => {\n if (inputRef.value) {\n inputRef.value.indeterminate = val\n }\n },\n { immediate: true }\n)\n\nfunction handleChange() {\n if (props.disabled) return\n\n if (Array.isArray(model.value)) {\n const newValue = [...model.value]\n const index = newValue.indexOf(props.trueValue as never)\n if (index > -1) {\n newValue.splice(index, 1)\n } else {\n newValue.push(props.trueValue as never)\n }\n model.value = newValue\n } else {\n model.value = isChecked.value ? props.falseValue : props.trueValue\n }\n}\n</script>\n\n<template>\n <label :class=\"classes\">\n <input\n ref=\"inputRef\"\n type=\"checkbox\"\n :checked=\"isChecked\"\n :disabled=\"disabled\"\n class=\"br-checkbox__input\"\n @change=\"handleChange\"\n />\n <span class=\"br-checkbox__control\">\n <svg v-if=\"isChecked && !indeterminate\" viewBox=\"0 0 24 24\" class=\"br-checkbox__icon\">\n <path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\" fill=\"currentColor\" />\n </svg>\n <svg v-else-if=\"indeterminate\" viewBox=\"0 0 24 24\" class=\"br-checkbox__icon\">\n <path d=\"M19 13H5v-2h14v2z\" fill=\"currentColor\" />\n </svg>\n </span>\n <span v-if=\"label || $slots.default\" class=\"br-checkbox__label\">\n <slot>{{ label }}</slot>\n </span>\n <span v-if=\"helperText\" class=\"br-checkbox__helper\">{{ helperText }}</span>\n </label>\n</template>\n\n<style lang=\"scss\" scoped>\n.br-checkbox {\n display: inline-flex;\n align-items: flex-start;\n gap: var(--br-space-2);\n cursor: pointer;\n user-select: none;\n\n &__input {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n }\n\n &__control {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n border: 2px solid var(--br-dark-300);\n border-radius: var(--br-radius-sm);\n background: var(--br-white);\n transition: all var(--br-transition-fast);\n }\n\n &__icon {\n width: 100%;\n height: 100%;\n color: var(--br-white);\n }\n\n &__label {\n color: var(--br-dark-700);\n line-height: 1.4;\n }\n\n &__helper {\n display: block;\n width: 100%;\n margin-top: var(--br-space-1);\n font-size: var(--br-text-sm);\n color: var(--br-dark-500);\n }\n\n // Sizes\n &--sm {\n .br-checkbox__control {\n width: 16px;\n height: 16px;\n }\n .br-checkbox__label {\n font-size: var(--br-text-sm);\n }\n }\n\n &--md {\n .br-checkbox__control {\n width: 20px;\n height: 20px;\n }\n .br-checkbox__label {\n font-size: var(--br-text-md);\n }\n }\n\n &--lg {\n .br-checkbox__control {\n width: 24px;\n height: 24px;\n }\n .br-checkbox__label {\n font-size: var(--br-text-lg);\n }\n }\n\n // States\n &:hover:not(&--disabled) {\n .br-checkbox__control {\n border-color: var(--br-primary-500);\n }\n }\n\n &--checked,\n &--indeterminate {\n .br-checkbox__control {\n background: var(--br-primary-500);\n border-color: var(--br-primary-500);\n }\n }\n\n &--error {\n .br-checkbox__control {\n border-color: var(--br-danger-500);\n }\n &.br-checkbox--checked .br-checkbox__control,\n &.br-checkbox--indeterminate .br-checkbox__control {\n background: var(--br-danger-500);\n border-color: var(--br-danger-500);\n }\n .br-checkbox__helper {\n color: var(--br-danger-500);\n }\n }\n\n &--disabled {\n cursor: not-allowed;\n opacity: 0.5;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { CheckboxGroupProps } from './types'\nimport BrCheckbox from './BrCheckbox.vue'\n\nconst props = withDefaults(defineProps<CheckboxGroupProps>(), {\n direction: 'vertical',\n size: 'md',\n disabled: false,\n error: false,\n})\n\nconst model = defineModel<Array<string | number>>({ default: () => [] })\n\nconst classes = computed(() => [\n 'br-checkbox-group',\n `br-checkbox-group--${props.direction}`,\n {\n 'br-checkbox-group--error': props.error,\n },\n])\n\nfunction isDisabled(option: (typeof props.options)[0]) {\n if (props.disabled || option.disabled) return true\n\n // Check max limit\n if (props.max && model.value.length >= props.max && !model.value.includes(option.value)) {\n return true\n }\n\n // Check min limit (prevent unchecking if at minimum)\n if (props.min && model.value.length <= props.min && model.value.includes(option.value)) {\n return true\n }\n\n return false\n}\n</script>\n\n<template>\n <div :class=\"classes\" role=\"group\" :aria-label=\"label\">\n <span v-if=\"label\" class=\"br-checkbox-group__label\">{{ label }}</span>\n <div class=\"br-checkbox-group__options\">\n <BrCheckbox\n v-for=\"option in options\"\n :key=\"String(option.value)\"\n v-model=\"model\"\n :label=\"option.label\"\n :true-value=\"option.value\"\n :size=\"size\"\n :disabled=\"isDisabled(option)\"\n :error=\"error\"\n />\n </div>\n <span v-if=\"error && errorMessage\" class=\"br-checkbox-group__error\">\n {{ errorMessage }}\n </span>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n.br-checkbox-group {\n display: flex;\n flex-direction: column;\n gap: var(--br-space-2);\n\n &__label {\n font-size: var(--br-text-sm);\n font-weight: var(--br-font-medium);\n color: var(--br-dark-700);\n }\n\n &__options {\n display: flex;\n gap: var(--br-space-3);\n }\n\n &--vertical &__options {\n flex-direction: column;\n }\n\n &--horizontal &__options {\n flex-direction: row;\n flex-wrap: wrap;\n }\n\n &__error {\n font-size: var(--br-text-sm);\n color: var(--br-danger-500);\n }\n}\n</style>\n","<script setup lang=\"ts\">\n/**\n * BrModal - Modal dialog component\n *\n * @example\n * <BrModal v-model=\"isOpen\" title=\"Meu Modal\">\n * <p>Conteúdo do modal</p>\n * </BrModal>\n *\n * <BrModal v-model=\"isOpen\" variant=\"aside\" title=\"Painel Lateral\">\n * <p>Conteúdo do painel</p>\n * </BrModal>\n */\n\nimport { computed, watch, onMounted, onUnmounted, ref } from 'vue'\nimport type { ModalProps } from './types'\n\n// ---------------------------------------------------------------------------\n// PROPS\n// ---------------------------------------------------------------------------\n\nconst props = withDefaults(defineProps<ModalProps>(), {\n title: '',\n variant: 'center',\n size: 'md',\n closable: true,\n closeOnClickOutside: true,\n closeOnEscape: true,\n showHeader: true,\n showFooter: false,\n persistent: false,\n})\n\n// ---------------------------------------------------------------------------\n// MODEL\n// ---------------------------------------------------------------------------\n\nconst isOpen = defineModel<boolean>({ default: false })\n\n// ---------------------------------------------------------------------------\n// EMITS\n// ---------------------------------------------------------------------------\n\nconst emit = defineEmits<{\n (e: 'close'): void\n (e: 'confirm'): void\n (e: 'cancel'): void\n}>()\n\n// ---------------------------------------------------------------------------\n// COMPUTED\n// ---------------------------------------------------------------------------\n\nconst classes = computed(() => [\n 'br-modal',\n `br-modal--${props.variant}`,\n `br-modal--${props.size}`,\n {\n 'br-modal--open': isOpen.value,\n },\n])\n\n// ---------------------------------------------------------------------------\n// METHODS\n// ---------------------------------------------------------------------------\n\nfunction close() {\n if (!props.persistent) {\n isOpen.value = false\n emit('close')\n }\n}\n\nfunction handleBackdropClick() {\n if (props.closeOnClickOutside) {\n close()\n }\n}\n\nfunction handleEscape(event: KeyboardEvent) {\n if (event.key === 'Escape' && props.closeOnEscape && isOpen.value) {\n close()\n }\n}\n\nfunction handleConfirm() {\n emit('confirm')\n}\n\nfunction handleCancel() {\n emit('cancel')\n close()\n}\n\n// ---------------------------------------------------------------------------\n// WATCHERS\n// ---------------------------------------------------------------------------\n\nwatch(isOpen, (value) => {\n // SSR guard: document is undefined on server\n if (typeof document === 'undefined') return\n document.body.style.overflow = value ? 'hidden' : ''\n})\n\n// ---------------------------------------------------------------------------\n// SSR-SAFE TELEPORT\n// ---------------------------------------------------------------------------\n\n// Teleport is disabled during SSR and enabled after client hydration\nconst isMounted = ref(false)\n\n// ---------------------------------------------------------------------------\n// LIFECYCLE\n// ---------------------------------------------------------------------------\n\nonMounted(() => {\n isMounted.value = true\n document.addEventListener('keydown', handleEscape)\n})\n\nonUnmounted(() => {\n document.removeEventListener('keydown', handleEscape)\n document.body.style.overflow = ''\n})\n</script>\n\n<template>\n <!-- Teleport disabled during SSR to prevent hydration issues -->\n <Teleport to=\"body\" :disabled=\"!isMounted\">\n <Transition name=\"br-modal-fade\">\n <div v-if=\"isOpen\" :class=\"classes\">\n <!-- Backdrop -->\n <div class=\"br-modal__backdrop\" @click=\"handleBackdropClick\" />\n\n <!-- Modal Content -->\n <Transition :name=\"variant === 'aside' ? 'br-modal-slide' : 'br-modal-scale'\">\n <div v-if=\"isOpen\" class=\"br-modal__container\">\n <!-- Header -->\n <header v-if=\"showHeader\" class=\"br-modal__header\">\n <slot name=\"header\">\n <h2 class=\"br-modal__title\">{{ title }}</h2>\n </slot>\n <button\n v-if=\"closable\"\n type=\"button\"\n class=\"br-modal__close\"\n aria-label=\"Fechar\"\n @click=\"close\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <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\" />\n </svg>\n </button>\n </header>\n\n <!-- Body -->\n <div class=\"br-modal__body\">\n <slot />\n </div>\n\n <!-- Footer -->\n <footer v-if=\"showFooter || $slots.footer\" class=\"br-modal__footer\">\n <slot name=\"footer\">\n <button type=\"button\" class=\"br-modal__btn br-modal__btn--cancel\" @click=\"handleCancel\">\n Cancelar\n </button>\n <button type=\"button\" class=\"br-modal__btn br-modal__btn--confirm\" @click=\"handleConfirm\">\n Confirmar\n </button>\n </slot>\n </footer>\n </div>\n </Transition>\n </div>\n </Transition>\n </Teleport>\n</template>\n\n<style lang=\"scss\" scoped>\n.br-modal {\n position: fixed;\n inset: 0;\n z-index: var(--br-z-modal);\n display: flex;\n\n // ---------------------------------------------------------------------------\n // VARIANTS\n // ---------------------------------------------------------------------------\n\n &--center {\n align-items: center;\n justify-content: center;\n padding: var(--br-space-4);\n }\n\n &--aside {\n justify-content: flex-end;\n }\n\n // ---------------------------------------------------------------------------\n // SIZES\n // ---------------------------------------------------------------------------\n\n &--sm .br-modal__container {\n max-width: 400px;\n }\n\n &--md .br-modal__container {\n max-width: 560px;\n }\n\n &--lg .br-modal__container {\n max-width: 800px;\n }\n\n &--xl .br-modal__container {\n max-width: 1140px;\n }\n\n &--aside {\n &.br-modal--sm .br-modal__container {\n width: 320px;\n }\n\n &.br-modal--md .br-modal__container {\n width: 480px;\n }\n\n &.br-modal--lg .br-modal__container {\n width: 640px;\n }\n\n &.br-modal--xl .br-modal__container {\n width: 800px;\n }\n }\n\n // ---------------------------------------------------------------------------\n // BACKDROP\n // ---------------------------------------------------------------------------\n\n &__backdrop {\n position: absolute;\n inset: 0;\n background: rgba(0, 0, 0, 0.5);\n }\n\n // ---------------------------------------------------------------------------\n // CONTAINER\n // ---------------------------------------------------------------------------\n\n &__container {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n max-height: 90vh;\n background: var(--br-light-0);\n border-radius: var(--br-radius-lg);\n box-shadow: var(--br-shadow-xl);\n overflow: hidden;\n }\n\n &--aside &__container {\n height: 100%;\n max-height: 100%;\n border-radius: var(--br-radius-lg) 0 0 var(--br-radius-lg);\n }\n\n // ---------------------------------------------------------------------------\n // HEADER\n // ---------------------------------------------------------------------------\n\n &__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--br-space-4);\n padding: var(--br-space-6);\n border-bottom: 1px solid var(--br-light-300);\n }\n\n &__title {\n flex: 1;\n margin: 0;\n font-family: var(--br-font-primary);\n font-size: var(--br-text-lg);\n font-weight: var(--br-font-semibold);\n color: var(--br-dark-0);\n }\n\n &__close {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n border: none;\n border-radius: var(--br-radius-sm);\n background: transparent;\n color: var(--br-dark-900);\n cursor: pointer;\n transition: all var(--br-transition-fast);\n\n svg {\n width: 20px;\n height: 20px;\n }\n\n &:hover {\n background: var(--br-light-200);\n color: var(--br-dark-700);\n }\n }\n\n // ---------------------------------------------------------------------------\n // BODY\n // ---------------------------------------------------------------------------\n\n &__body {\n flex: 1;\n padding: var(--br-space-6);\n overflow-y: auto;\n }\n\n // ---------------------------------------------------------------------------\n // FOOTER\n // ---------------------------------------------------------------------------\n\n &__footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--br-space-3);\n padding: var(--br-space-6);\n border-top: 1px solid var(--br-light-300);\n }\n\n &__btn {\n padding: var(--br-space-3) var(--br-space-6);\n font-family: var(--br-font-primary);\n font-size: var(--br-text-sm);\n font-weight: var(--br-font-semibold);\n border: none;\n border-radius: var(--br-radius-md);\n cursor: pointer;\n transition: all var(--br-transition-fast);\n\n &--cancel {\n background: var(--br-primary-100);\n color: var(--br-primary-600);\n\n &:hover {\n background: var(--br-primary-200);\n }\n }\n\n &--confirm {\n background: var(--br-primary-600);\n color: var(--br-light-0);\n\n &:hover {\n background: var(--br-primary-700);\n }\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// TRANSITIONS\n// ---------------------------------------------------------------------------\n\n.br-modal-fade-enter-active,\n.br-modal-fade-leave-active {\n transition: opacity 0.3s ease;\n}\n\n.br-modal-fade-enter-from,\n.br-modal-fade-leave-to {\n opacity: 0;\n}\n\n.br-modal-scale-enter-active,\n.br-modal-scale-leave-active {\n transition: opacity 0.3s ease, transform 0.3s ease;\n}\n\n.br-modal-scale-enter-from,\n.br-modal-scale-leave-to {\n opacity: 0;\n transform: scale(0.95);\n}\n\n.br-modal-slide-enter-active,\n.br-modal-slide-leave-active {\n transition: transform 0.3s ease;\n}\n\n.br-modal-slide-enter-from,\n.br-modal-slide-leave-to {\n transform: translateX(100%);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, inject, ref, useId } from 'vue'\nimport type { AccordionItemProps } from './types'\n\nconst props = withDefaults(defineProps<AccordionItemProps>(), {\n disabled: false,\n})\n\nconst accordion = inject<{\n iconPosition: { value: 'left' | 'right' }\n disabled: { value: boolean }\n toggleItem: (id: string | number) => void\n isItemOpen: (id: string | number) => boolean\n}>('accordion')\n\n// useId() generates deterministic IDs that match between SSR and client hydration\nconst itemId = ref(props.id ?? useId())\nconst contentRef = ref<HTMLElement | null>(null)\n\nconst isOpen = computed(() => {\n if (props.open !== undefined) return props.open\n return accordion?.isItemOpen(itemId.value) ?? false\n})\n\nconst isDisabled = computed(() => props.disabled || accordion?.disabled.value)\nconst iconPosition = computed(() => accordion?.iconPosition.value ?? 'right')\n\nconst classes = computed(() => [\n 'br-accordion-item',\n {\n 'br-accordion-item--open': isOpen.value,\n 'br-accordion-item--disabled': isDisabled.value,\n 'br-accordion-item--icon-left': iconPosition.value === 'left',\n },\n])\n\nfunction toggle() {\n if (isDisabled.value) return\n accordion?.toggleItem(itemId.value)\n}\n\nconst contentHeight = computed(() => {\n if (!isOpen.value) return '0px'\n return contentRef.value ? `${contentRef.value.scrollHeight}px` : 'auto'\n})\n</script>\n\n<template>\n <div :class=\"classes\">\n <button\n type=\"button\"\n class=\"br-accordion-item__header\"\n :aria-expanded=\"isOpen\"\n :disabled=\"isDisabled\"\n @click=\"toggle\"\n >\n <svg\n v-if=\"iconPosition === 'left'\"\n class=\"br-accordion-item__icon\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <path d=\"M8.59 16.59L13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.41z\" />\n </svg>\n <span v-if=\"icon\" class=\"br-accordion-item__custom-icon\">\n <slot name=\"icon\">{{ icon }}</slot>\n </span>\n <span class=\"br-accordion-item__title\">\n <slot name=\"title\">{{ title }}</slot>\n </span>\n <svg\n v-if=\"iconPosition === 'right'\"\n class=\"br-accordion-item__icon\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <path d=\"M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z\" />\n </svg>\n </button>\n <div\n class=\"br-accordion-item__content-wrapper\"\n :style=\"{ height: contentHeight }\"\n >\n <div ref=\"contentRef\" class=\"br-accordion-item__content\">\n <slot />\n </div>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n.br-accordion-item {\n &__header {\n display: flex;\n align-items: center;\n width: 100%;\n padding: var(--br-space-4);\n border: none;\n background: transparent;\n cursor: pointer;\n text-align: left;\n font-size: var(--br-text-md);\n font-weight: var(--br-font-medium);\n color: var(--br-dark-700);\n transition: background-color var(--br-transition-fast);\n\n &:hover:not(:disabled) {\n background: var(--br-light-100);\n }\n\n &:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n }\n }\n\n &__icon {\n width: 20px;\n height: 20px;\n flex-shrink: 0;\n color: var(--br-dark-500);\n transition: transform var(--br-transition-fast);\n }\n\n &__custom-icon {\n margin-right: var(--br-space-2);\n }\n\n &__title {\n flex: 1;\n }\n\n &__content-wrapper {\n overflow: hidden;\n transition: height var(--br-transition-normal);\n }\n\n &__content {\n padding: 0 var(--br-space-4) var(--br-space-4);\n color: var(--br-dark-600);\n font-size: var(--br-text-sm);\n line-height: 1.6;\n }\n\n // Open state\n &--open {\n .br-accordion-item__icon {\n transform: rotate(180deg);\n }\n\n &.br-accordion-item--icon-left .br-accordion-item__icon {\n transform: rotate(90deg);\n }\n }\n\n // Icon left\n &--icon-left {\n .br-accordion-item__icon {\n margin-right: var(--br-space-2);\n }\n }\n\n // Borders between items (for default variant)\n &:not(:last-child) {\n border-bottom: 1px solid var(--br-light-300);\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, provide, ref, reactive } from 'vue'\nimport type { AccordionProps } from './types'\nimport BrAccordionItem from './BrAccordionItem.vue'\n\nconst props = withDefaults(defineProps<AccordionProps>(), {\n multiple: false,\n variant: 'default',\n iconPosition: 'right',\n disabled: false,\n})\n\nconst openItems = ref<Set<string | number>>(new Set())\n\nconst classes = computed(() => [\n 'br-accordion',\n `br-accordion--${props.variant}`,\n {\n 'br-accordion--disabled': props.disabled,\n },\n])\n\nfunction toggleItem(id: string | number) {\n if (props.disabled) return\n\n if (openItems.value.has(id)) {\n openItems.value.delete(id)\n } else {\n if (!props.multiple) {\n openItems.value.clear()\n }\n openItems.value.add(id)\n }\n openItems.value = new Set(openItems.value)\n}\n\nfunction isItemOpen(id: string | number) {\n return openItems.value.has(id)\n}\n\nprovide(\n 'accordion',\n reactive({\n iconPosition: computed(() => props.iconPosition),\n disabled: computed(() => props.disabled),\n toggleItem,\n isItemOpen,\n })\n)\n</script>\n\n<template>\n <div :class=\"classes\">\n <template v-if=\"items && items.length\">\n <BrAccordionItem\n v-for=\"item in items\"\n :key=\"item.id\"\n :id=\"item.id\"\n :title=\"item.title\"\n :icon=\"item.icon\"\n :disabled=\"item.disabled\"\n >\n <template v-if=\"item.content\">\n {{ item.content }}\n </template>\n <slot v-else :name=\"`item-${item.id}`\" :item=\"item\" />\n </BrAccordionItem>\n </template>\n <slot v-else />\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n.br-accordion {\n width: 100%;\n\n &--default {\n border: 1px solid var(--br-light-300);\n border-radius: var(--br-radius-md);\n overflow: hidden;\n }\n\n &--bordered {\n :deep(.br-accordion-item) {\n border: 1px solid var(--br-light-300);\n border-radius: var(--br-radius-md);\n margin-bottom: var(--br-space-2);\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n }\n\n &--separated {\n :deep(.br-accordion-item) {\n background: var(--br-light-100);\n border-radius: var(--br-radius-md);\n margin-bottom: var(--br-space-2);\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n }\n\n &--disabled {\n opacity: 0.6;\n pointer-events: none;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { CardProps } from './types'\n\nconst props = withDefaults(defineProps<CardProps>(), {\n variant: 'elevated',\n size: 'md',\n clickable: false,\n imagePosition: 'top',\n disabled: false,\n loading: false,\n rounded: 'md',\n fullWidth: false,\n})\n\nconst emit = defineEmits<{\n (e: 'click', event: MouseEvent): void\n}>()\n\nconst classes = computed(() => [\n 'br-card',\n `br-card--${props.variant}`,\n `br-card--${props.size}`,\n `br-card--rounded-${props.rounded}`,\n `br-card--image-${props.imagePosition}`,\n {\n 'br-card--clickable': props.clickable,\n 'br-card--disabled': props.disabled,\n 'br-card--loading': props.loading,\n 'br-card--full-width': props.fullWidth,\n },\n])\n\nconst imageStyle = computed(() => {\n if (!props.imageHeight) return {}\n const height = typeof props.imageHeight === 'number' ? `${props.imageHeight}px` : props.imageHeight\n return { height }\n})\n\nfunction handleClick(event: MouseEvent) {\n if (props.disabled || props.loading) return\n emit('click', event)\n}\n</script>\n\n<template>\n <div\n :class=\"classes\"\n :role=\"clickable ? 'button' : undefined\"\n :tabindex=\"clickable && !disabled ? 0 : undefined\"\n @click=\"clickable ? handleClick($event) : undefined\"\n @keydown.enter=\"clickable ? handleClick($event as unknown as MouseEvent) : undefined\"\n >\n <div v-if=\"loading\" class=\"br-card__loader\">\n <div class=\"br-card__loader-spinner\" />\n </div>\n\n <div v-if=\"image && (imagePosition === 'top' || imagePosition === 'left')\" class=\"br-card__image\" :style=\"imageStyle\">\n <slot name=\"image\">\n <img :src=\"image\" alt=\"\" />\n </slot>\n </div>\n\n <div class=\"br-card__content\">\n <div v-if=\"title || subtitle || $slots.header\" class=\"br-card__header\">\n <slot name=\"header\">\n <h3 v-if=\"title\" class=\"br-card__title\">{{ title }}</h3>\n <p v-if=\"subtitle\" class=\"br-card__subtitle\">{{ subtitle }}</p>\n </slot>\n </div>\n\n <div class=\"br-card__body\">\n <slot />\n </div>\n\n <div v-if=\"$slots.footer\" class=\"br-card__footer\">\n <slot name=\"footer\" />\n </div>\n </div>\n\n <div v-if=\"image && (imagePosition === 'bottom' || imagePosition === 'right')\" class=\"br-card__image\" :style=\"imageStyle\">\n <slot name=\"image\">\n <img :src=\"image\" alt=\"\" />\n </slot>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n.br-card {\n position: relative;\n display: flex;\n flex-direction: column;\n background: var(--br-white);\n overflow: hidden;\n\n &--elevated {\n box-shadow: var(--br-shadow-md);\n }\n\n &--outlined {\n border: 1px solid var(--br-light-300);\n }\n\n &--filled {\n background: var(--br-light-100);\n }\n\n // Sizes\n &--sm {\n .br-card__content {\n padding: var(--br-space-3);\n }\n }\n\n &--md {\n .br-card__content {\n padding: var(--br-space-4);\n }\n }\n\n &--lg {\n .br-card__content {\n padding: var(--br-space-6);\n }\n }\n\n // Border radius\n &--rounded-none {\n border-radius: 0;\n }\n\n &--rounded-sm {\n border-radius: var(--br-radius-sm);\n }\n\n &--rounded-md {\n border-radius: var(--br-radius-md);\n }\n\n &--rounded-lg {\n border-radius: var(--br-radius-lg);\n }\n\n &--rounded-xl {\n border-radius: var(--br-radius-xl);\n }\n\n // Image positions\n &--image-left,\n &--image-right {\n flex-direction: row;\n }\n\n &--image-right {\n .br-card__image {\n order: 1;\n }\n }\n\n // States\n &--clickable {\n cursor: pointer;\n transition: transform var(--br-transition-fast), box-shadow var(--br-transition-fast);\n\n &:hover:not(.br-card--disabled) {\n transform: translateY(-2px);\n box-shadow: var(--br-shadow-lg);\n }\n\n &:active:not(.br-card--disabled) {\n transform: translateY(0);\n }\n }\n\n &--disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n &--loading {\n pointer-events: none;\n }\n\n &--full-width {\n width: 100%;\n }\n\n &__loader {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(255, 255, 255, 0.8);\n z-index: 10;\n }\n\n &__loader-spinner {\n width: 32px;\n height: 32px;\n border: 3px solid var(--br-light-300);\n border-top-color: var(--br-primary-500);\n border-radius: 50%;\n animation: spin 0.8s linear infinite;\n }\n\n &__image {\n flex-shrink: 0;\n overflow: hidden;\n\n img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n }\n\n &__content {\n display: flex;\n flex-direction: column;\n flex: 1;\n }\n\n &__header {\n margin-bottom: var(--br-space-3);\n }\n\n &__title {\n margin: 0;\n font-size: var(--br-text-lg);\n font-weight: var(--br-font-semibold);\n color: var(--br-dark-800);\n line-height: 1.3;\n }\n\n &__subtitle {\n margin: var(--br-space-1) 0 0;\n font-size: var(--br-text-sm);\n color: var(--br-dark-500);\n }\n\n &__body {\n flex: 1;\n color: var(--br-dark-600);\n font-size: var(--br-text-md);\n line-height: 1.5;\n }\n\n &__footer {\n margin-top: var(--br-space-4);\n padding-top: var(--br-space-3);\n border-top: 1px solid var(--br-light-200);\n }\n}\n\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, useSlots } from 'vue'\nimport type { FormFieldProps } from './types'\n\nconst props = withDefaults(defineProps<FormFieldProps>(), {\n labelPosition: 'top',\n required: false,\n error: false,\n success: false,\n disabled: false,\n})\n\nconst slots = useSlots()\n\nconst classes = computed(() => [\n 'br-form-field',\n `br-form-field--label-${props.labelPosition}`,\n {\n 'br-form-field--error': props.error,\n 'br-form-field--success': props.success,\n 'br-form-field--disabled': props.disabled,\n 'br-form-field--has-prefix': !!slots.prefix,\n 'br-form-field--has-suffix': !!slots.suffix,\n },\n])\n\nconst messageType = computed(() => {\n if (props.error && props.errorMessage) return 'error'\n if (props.success && props.successMessage) return 'success'\n if (props.helperText) return 'helper'\n return null\n})\n\nconst message = computed(() => {\n if (props.error && props.errorMessage) return props.errorMessage\n if (props.success && props.successMessage) return props.successMessage\n return props.helperText\n})\n</script>\n\n<template>\n <div :class=\"classes\">\n <label v-if=\"label\" class=\"br-form-field__label\">\n {{ label }}\n <span v-if=\"required\" class=\"br-form-field__required\">*</span>\n </label>\n\n <div class=\"br-form-field__control\">\n <span v-if=\"$slots.prefix\" class=\"br-form-field__prefix\">\n <slot name=\"prefix\" />\n </span>\n\n <div class=\"br-form-field__input\">\n <slot />\n </div>\n\n <span v-if=\"$slots.suffix\" class=\"br-form-field__suffix\">\n <slot name=\"suffix\" />\n </span>\n </div>\n\n <div v-if=\"message || charCount || hint\" class=\"br-form-field__footer\">\n <span\n v-if=\"message\"\n class=\"br-form-field__message\"\n :class=\"`br-form-field__message--${messageType}`\"\n >\n <svg v-if=\"messageType === 'error'\" viewBox=\"0 0 24 24\" class=\"br-form-field__icon\">\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\" fill=\"currentColor\" />\n </svg>\n <svg v-else-if=\"messageType === 'success'\" viewBox=\"0 0 24 24\" class=\"br-form-field__icon\">\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\" fill=\"currentColor\" />\n </svg>\n {{ message }}\n </span>\n\n <span v-if=\"charCount\" class=\"br-form-field__char-count\">\n {{ charCount.current }}/{{ charCount.max }}\n </span>\n </div>\n\n <span v-if=\"hint\" class=\"br-form-field__hint\">\n {{ hint }}\n </span>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n.br-form-field {\n display: flex;\n flex-direction: column;\n gap: var(--br-space-1);\n\n &--label-left {\n flex-direction: row;\n align-items: flex-start;\n gap: var(--br-space-3);\n\n .br-form-field__label {\n min-width: 120px;\n padding-top: var(--br-space-2);\n }\n\n .br-form-field__control {\n flex: 1;\n }\n }\n\n &__label {\n display: flex;\n align-items: center;\n gap: var(--br-space-1);\n font-size: var(--br-text-sm);\n font-weight: var(--br-font-medium);\n color: var(--br-dark-700);\n }\n\n &__required {\n color: var(--br-danger-500);\n }\n\n &__control {\n display: flex;\n align-items: stretch;\n position: relative;\n }\n\n &__input {\n flex: 1;\n display: flex;\n\n :deep(input),\n :deep(select),\n :deep(textarea) {\n width: 100%;\n }\n }\n\n &__prefix,\n &__suffix {\n display: flex;\n align-items: center;\n padding: 0 var(--br-space-3);\n background: var(--br-light-100);\n border: 1px solid var(--br-light-300);\n color: var(--br-dark-500);\n font-size: var(--br-text-sm);\n }\n\n &__prefix {\n border-right: none;\n border-radius: var(--br-radius-md) 0 0 var(--br-radius-md);\n }\n\n &__suffix {\n border-left: none;\n border-radius: 0 var(--br-radius-md) var(--br-radius-md) 0;\n }\n\n &--has-prefix :deep(input),\n &--has-prefix :deep(select) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n\n &--has-suffix :deep(input),\n &--has-suffix :deep(select) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n\n &__footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n min-height: 20px;\n }\n\n &__message {\n display: flex;\n align-items: center;\n gap: var(--br-space-1);\n font-size: var(--br-text-sm);\n\n &--helper {\n color: var(--br-dark-500);\n }\n\n &--error {\n color: var(--br-danger-500);\n }\n\n &--success {\n color: var(--br-success-500);\n }\n }\n\n &__icon {\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n }\n\n &__char-count {\n font-size: var(--br-text-xs);\n color: var(--br-dark-400);\n }\n\n &__hint {\n font-size: var(--br-text-xs);\n color: var(--br-dark-400);\n font-style: italic;\n }\n\n // States\n &--error {\n .br-form-field__label {\n color: var(--br-danger-600);\n }\n\n :deep(input),\n :deep(select),\n :deep(textarea) {\n border-color: var(--br-danger-500);\n }\n }\n\n &--success {\n :deep(input),\n :deep(select),\n :deep(textarea) {\n border-color: var(--br-success-500);\n }\n }\n\n &--disabled {\n opacity: 0.6;\n pointer-events: none;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { StepperProps } from './types'\n\nconst props = withDefaults(defineProps<StepperProps>(), {\n orientation: 'horizontal',\n variant: 'default',\n clickable: false,\n showNumbers: true,\n linear: true,\n alternativeLabel: false,\n})\n\nconst model = defineModel<number>({ default: 0 })\n\nconst emit = defineEmits<{\n (e: 'step-click', step: number): void\n}>()\n\nconst classes = computed(() => [\n 'br-stepper',\n `br-stepper--${props.orientation}`,\n `br-stepper--${props.variant}`,\n {\n 'br-stepper--clickable': props.clickable,\n 'br-stepper--alternative-label': props.alternativeLabel,\n },\n])\n\nfunction getStepStatus(index: number) {\n if (index < model.value) return 'completed'\n if (index === model.value) return 'active'\n return 'pending'\n}\n\nfunction canNavigateTo(index: number) {\n if (!props.clickable) return false\n if (props.linear && index > model.value) return false\n return true\n}\n\nfunction handleStepClick(index: number) {\n if (!canNavigateTo(index)) return\n if (props.steps[index].error) return\n\n model.value = index\n emit('step-click', index)\n}\n</script>\n\n<template>\n <div :class=\"classes\">\n <div\n v-for=\"(step, index) in steps\"\n :key=\"index\"\n class=\"br-stepper__step\"\n :class=\"{\n 'br-stepper__step--completed': getStepStatus(index) === 'completed',\n 'br-stepper__step--active': getStepStatus(index) === 'active',\n 'br-stepper__step--pending': getStepStatus(index) === 'pending',\n 'br-stepper__step--error': step.error,\n 'br-stepper__step--clickable': canNavigateTo(index),\n }\"\n :role=\"clickable ? 'button' : undefined\"\n :tabindex=\"canNavigateTo(index) ? 0 : undefined\"\n @click=\"handleStepClick(index)\"\n @keydown.enter=\"handleStepClick(index)\"\n >\n <div class=\"br-stepper__indicator\">\n <span class=\"br-stepper__icon\">\n <svg v-if=\"getStepStatus(index) === 'completed' && !step.error\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\" />\n </svg>\n <svg v-else-if=\"step.error\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <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\" />\n </svg>\n <template v-else-if=\"showNumbers\">\n {{ index + 1 }}\n </template>\n </span>\n <div v-if=\"index < steps.length - 1\" class=\"br-stepper__connector\" />\n </div>\n\n <div class=\"br-stepper__content\">\n <span class=\"br-stepper__title\">\n {{ step.title }}\n <span v-if=\"step.optional\" class=\"br-stepper__optional\">(Opcional)</span>\n </span>\n <span v-if=\"step.description || step.errorMessage\" class=\"br-stepper__description\">\n {{ step.error ? step.errorMessage : step.description }}\n </span>\n </div>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n.br-stepper {\n display: flex;\n\n &--horizontal {\n flex-direction: row;\n align-items: flex-start;\n\n .br-stepper__step {\n flex: 1;\n flex-direction: column;\n align-items: center;\n }\n\n .br-stepper__indicator {\n display: flex;\n align-items: center;\n width: 100%;\n }\n\n .br-stepper__connector {\n flex: 1;\n height: 2px;\n margin: 0 var(--br-space-2);\n }\n\n .br-stepper__content {\n text-align: center;\n margin-top: var(--br-space-2);\n }\n }\n\n &--vertical {\n flex-direction: column;\n\n .br-stepper__step {\n flex-direction: row;\n align-items: flex-start;\n }\n\n .br-stepper__indicator {\n flex-direction: column;\n align-items: center;\n }\n\n .br-stepper__connector {\n width: 2px;\n min-height: 40px;\n margin: var(--br-space-2) 0;\n }\n\n .br-stepper__content {\n margin-left: var(--br-space-3);\n padding-bottom: var(--br-space-4);\n }\n }\n\n &--alternative-label.br-stepper--horizontal {\n .br-stepper__content {\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n width: max-content;\n max-width: 150px;\n }\n }\n\n &__step {\n display: flex;\n position: relative;\n }\n\n &__indicator {\n position: relative;\n }\n\n &__icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border-radius: 50%;\n background: var(--br-light-300);\n color: var(--br-dark-500);\n font-size: var(--br-text-sm);\n font-weight: var(--br-font-medium);\n flex-shrink: 0;\n transition: all var(--br-transition-fast);\n\n svg {\n width: 18px;\n height: 18px;\n }\n }\n\n &__connector {\n background: var(--br-light-300);\n transition: background var(--br-transition-fast);\n }\n\n &__content {\n display: flex;\n flex-direction: column;\n gap: var(--br-space-1);\n }\n\n &__title {\n font-size: var(--br-text-sm);\n font-weight: var(--br-font-medium);\n color: var(--br-dark-700);\n }\n\n &__optional {\n font-weight: var(--br-font-normal);\n color: var(--br-dark-400);\n }\n\n &__description {\n font-size: var(--br-text-xs);\n color: var(--br-dark-500);\n }\n\n // States\n &__step--completed {\n .br-stepper__icon {\n background: var(--br-primary-500);\n color: var(--br-white);\n }\n\n .br-stepper__connector {\n background: var(--br-primary-500);\n }\n }\n\n &__step--active {\n .br-stepper__icon {\n background: var(--br-primary-500);\n color: var(--br-white);\n box-shadow: 0 0 0 4px var(--br-primary-100);\n }\n\n .br-stepper__title {\n color: var(--br-primary-600);\n }\n }\n\n &__step--error {\n .br-stepper__icon {\n background: var(--br-danger-500);\n color: var(--br-white);\n }\n\n .br-stepper__title {\n color: var(--br-danger-600);\n }\n\n .br-stepper__description {\n color: var(--br-danger-500);\n }\n }\n\n &__step--clickable {\n cursor: pointer;\n\n &:hover .br-stepper__icon {\n transform: scale(1.1);\n }\n }\n\n // Variants\n &--outlined {\n .br-stepper__icon {\n background: transparent;\n border: 2px solid var(--br-light-400);\n }\n\n .br-stepper__step--completed .br-stepper__icon,\n .br-stepper__step--active .br-stepper__icon {\n border-color: var(--br-primary-500);\n background: transparent;\n color: var(--br-primary-500);\n }\n\n .br-stepper__step--error .br-stepper__icon {\n border-color: var(--br-danger-500);\n background: transparent;\n color: var(--br-danger-500);\n }\n }\n\n &--simple {\n .br-stepper__icon {\n width: 12px;\n height: 12px;\n font-size: 0;\n }\n\n .br-stepper__step--completed .br-stepper__icon,\n .br-stepper__step--active .br-stepper__icon {\n background: var(--br-primary-500);\n }\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport type { CalendarProps, CalendarView, CalendarRange } from './types'\n\nconst props = withDefaults(defineProps<CalendarProps>(), {\n view: 'day',\n firstDayOfWeek: 0,\n showWeekNumbers: false,\n multiple: false,\n range: false,\n locale: 'pt-BR',\n readonly: false,\n disabled: false,\n})\n\nconst model = defineModel<Date | Date[] | CalendarRange | null>()\n\nconst currentView = ref<CalendarView>(props.view)\nconst viewDate = ref(new Date())\n\nconst weekDays = computed(() => {\n const days = []\n const baseDate = new Date(2024, 0, props.firstDayOfWeek)\n for (let i = 0; i < 7; i++) {\n const date = new Date(baseDate)\n date.setDate(baseDate.getDate() + i)\n days.push(date.toLocaleDateString(props.locale, { weekday: 'short' }))\n }\n return days\n})\n\nconst monthName = computed(() => {\n return viewDate.value.toLocaleDateString(props.locale, { month: 'long', year: 'numeric' })\n})\n\nconst calendarDays = computed(() => {\n const year = viewDate.value.getFullYear()\n const month = viewDate.value.getMonth()\n const firstDay = new Date(year, month, 1)\n const lastDay = new Date(year, month + 1, 0)\n\n const days = []\n const startOffset = (firstDay.getDay() - props.firstDayOfWeek + 7) % 7\n\n // Previous month days\n for (let i = startOffset - 1; i >= 0; i--) {\n const date = new Date(year, month, -i)\n days.push({ date, isCurrentMonth: false, isToday: false })\n }\n\n // Current month days\n const today = new Date()\n for (let i = 1; i <= lastDay.getDate(); i++) {\n const date = new Date(year, month, i)\n const isToday =\n date.getDate() === today.getDate() &&\n date.getMonth() === today.getMonth() &&\n date.getFullYear() === today.getFullYear()\n days.push({ date, isCurrentMonth: true, isToday })\n }\n\n // Next month days\n const remaining = 42 - days.length\n for (let i = 1; i <= remaining; i++) {\n const date = new Date(year, month + 1, i)\n days.push({ date, isCurrentMonth: false, isToday: false })\n }\n\n return days\n})\n\nconst months = computed(() => {\n const months = []\n for (let i = 0; i < 12; i++) {\n const date = new Date(viewDate.value.getFullYear(), i, 1)\n months.push({\n index: i,\n name: date.toLocaleDateString(props.locale, { month: 'short' }),\n })\n }\n return months\n})\n\nconst years = computed(() => {\n const currentYear = viewDate.value.getFullYear()\n const startYear = Math.floor(currentYear / 10) * 10\n const years = []\n for (let i = startYear - 1; i <= startYear + 10; i++) {\n years.push(i)\n }\n return years\n})\n\nfunction isDateDisabled(date: Date) {\n if (props.disabled) return true\n\n if (props.minDate) {\n const min = new Date(props.minDate)\n min.setHours(0, 0, 0, 0)\n if (date < min) return true\n }\n\n if (props.maxDate) {\n const max = new Date(props.maxDate)\n max.setHours(23, 59, 59, 999)\n if (date > max) return true\n }\n\n if (props.disabledDates) {\n return props.disabledDates.some((d) => {\n const disabled = new Date(d)\n return (\n date.getDate() === disabled.getDate() &&\n date.getMonth() === disabled.getMonth() &&\n date.getFullYear() === disabled.getFullYear()\n )\n })\n }\n\n return false\n}\n\nfunction isDateSelected(date: Date) {\n if (!model.value) return false\n\n if (props.range && typeof model.value === 'object' && 'start' in model.value) {\n const range = model.value as CalendarRange\n if (range.start && isSameDay(date, range.start)) return true\n if (range.end && isSameDay(date, range.end)) return true\n return false\n }\n\n if (props.multiple && Array.isArray(model.value)) {\n return model.value.some((d) => isSameDay(date, d))\n }\n\n if (model.value instanceof Date) {\n return isSameDay(date, model.value)\n }\n\n return false\n}\n\nfunction isInRange(date: Date) {\n if (!props.range || !model.value || typeof model.value !== 'object' || !('start' in model.value))\n return false\n\n const range = model.value as CalendarRange\n if (!range.start || !range.end) return false\n\n return date > range.start && date < range.end\n}\n\nfunction isSameDay(date1: Date, date2: Date) {\n return (\n date1.getDate() === date2.getDate() &&\n date1.getMonth() === date2.getMonth() &&\n date1.getFullYear() === date2.getFullYear()\n )\n}\n\nfunction getHighlight(date: Date) {\n if (!props.highlightedDates) return null\n return props.highlightedDates.find((h) => isSameDay(date, new Date(h.date)))\n}\n\nfunction selectDate(date: Date) {\n if (props.readonly || props.disabled || isDateDisabled(date)) return\n\n if (props.range) {\n const current = (model.value as CalendarRange) || { start: null, end: null }\n if (!current.start || current.end) {\n model.value = { start: date, end: null }\n } else {\n if (date < current.start) {\n model.value = { start: date, end: current.start }\n } else {\n model.value = { start: current.start, end: date }\n }\n }\n } else if (props.multiple) {\n const current = (model.value as Date[]) || []\n const index = current.findIndex((d) => isSameDay(d, date))\n if (index > -1) {\n const newValue = [...current]\n newValue.splice(index, 1)\n model.value = newValue\n } else {\n model.value = [...current, date]\n }\n } else {\n model.value = date\n }\n}\n\nfunction selectMonth(month: number) {\n viewDate.value = new Date(viewDate.value.getFullYear(), month, 1)\n currentView.value = 'day'\n}\n\nfunction selectYear(year: number) {\n viewDate.value = new Date(year, viewDate.value.getMonth(), 1)\n currentView.value = 'month'\n}\n\nfunction navigate(direction: number) {\n const date = new Date(viewDate.value)\n if (currentView.value === 'day') {\n date.setMonth(date.getMonth() + direction)\n } else if (currentView.value === 'month') {\n date.setFullYear(date.getFullYear() + direction)\n } else {\n date.setFullYear(date.getFullYear() + direction * 10)\n }\n viewDate.value = date\n}\n\nfunction goToToday() {\n viewDate.value = new Date()\n currentView.value = 'day'\n}\n\nconst classes = computed(() => [\n 'br-calendar',\n {\n 'br-calendar--disabled': props.disabled,\n 'br-calendar--readonly': props.readonly,\n },\n])\n</script>\n\n<template>\n <div :class=\"classes\">\n <div class=\"br-calendar__header\">\n <button\n type=\"button\"\n class=\"br-calendar__nav\"\n :disabled=\"disabled\"\n @click=\"navigate(-1)\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\" />\n </svg>\n </button>\n\n <button\n type=\"button\"\n class=\"br-calendar__title\"\n :disabled=\"disabled\"\n @click=\"currentView = currentView === 'day' ? 'month' : 'year'\"\n >\n {{ monthName }}\n </button>\n\n <button\n type=\"button\"\n class=\"br-calendar__nav\"\n :disabled=\"disabled\"\n @click=\"navigate(1)\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" />\n </svg>\n </button>\n </div>\n\n <!-- Day View -->\n <div v-if=\"currentView === 'day'\" class=\"br-calendar__days\">\n <div class=\"br-calendar__weekdays\">\n <span v-if=\"showWeekNumbers\" class=\"br-calendar__weekday\">#</span>\n <span v-for=\"day in weekDays\" :key=\"day\" class=\"br-calendar__weekday\">\n {{ day }}\n </span>\n </div>\n\n <div class=\"br-calendar__grid\">\n <template v-for=\"(day, index) in calendarDays\" :key=\"index\">\n <span\n v-if=\"showWeekNumbers && index % 7 === 0\"\n class=\"br-calendar__week-number\"\n >\n {{ Math.ceil((index + 1) / 7) }}\n </span>\n <button\n type=\"button\"\n class=\"br-calendar__day\"\n :class=\"{\n 'br-calendar__day--other-month': !day.isCurrentMonth,\n 'br-calendar__day--today': day.isToday,\n 'br-calendar__day--selected': isDateSelected(day.date),\n 'br-calendar__day--in-range': isInRange(day.date),\n 'br-calendar__day--disabled': isDateDisabled(day.date),\n 'br-calendar__day--highlighted': getHighlight(day.date),\n }\"\n :style=\"getHighlight(day.date) ? { '--highlight-color': getHighlight(day.date)?.color } : {}\"\n :disabled=\"isDateDisabled(day.date)\"\n :title=\"getHighlight(day.date)?.label\"\n @click=\"selectDate(day.date)\"\n >\n {{ day.date.getDate() }}\n </button>\n </template>\n </div>\n </div>\n\n <!-- Month View -->\n <div v-else-if=\"currentView === 'month'\" class=\"br-calendar__months\">\n <button\n v-for=\"month in months\"\n :key=\"month.index\"\n type=\"button\"\n class=\"br-calendar__month\"\n :class=\"{\n 'br-calendar__month--current': month.index === new Date().getMonth() && viewDate.getFullYear() === new Date().getFullYear(),\n }\"\n :disabled=\"disabled\"\n @click=\"selectMonth(month.index)\"\n >\n {{ month.name }}\n </button>\n </div>\n\n <!-- Year View -->\n <div v-else class=\"br-calendar__years\">\n <button\n v-for=\"year in years\"\n :key=\"year\"\n type=\"button\"\n class=\"br-calendar__year\"\n :class=\"{\n 'br-calendar__year--current': year === new Date().getFullYear(),\n }\"\n :disabled=\"disabled\"\n @click=\"selectYear(year)\"\n >\n {{ year }}\n </button>\n </div>\n\n <div class=\"br-calendar__footer\">\n <button type=\"button\" class=\"br-calendar__today\" :disabled=\"disabled\" @click=\"goToToday\">\n Hoje\n </button>\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n.br-calendar {\n display: inline-flex;\n flex-direction: column;\n padding: var(--br-space-3);\n background: var(--br-white);\n border: 1px solid var(--br-light-300);\n border-radius: var(--br-radius-lg);\n min-width: 280px;\n\n &--disabled {\n opacity: 0.6;\n pointer-events: none;\n }\n\n &__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: var(--br-space-3);\n }\n\n &__nav {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n border: none;\n border-radius: var(--br-radius-md);\n background: transparent;\n color: var(--br-dark-600);\n cursor: pointer;\n transition: background var(--br-transition-fast);\n\n svg {\n width: 20px;\n height: 20px;\n }\n\n &:hover:not(:disabled) {\n background: var(--br-light-100);\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n }\n\n &__title {\n flex: 1;\n padding: var(--br-space-2);\n border: none;\n background: transparent;\n font-size: var(--br-text-md);\n font-weight: var(--br-font-semibold);\n color: var(--br-dark-800);\n cursor: pointer;\n text-transform: capitalize;\n\n &:hover:not(:disabled) {\n background: var(--br-light-100);\n border-radius: var(--br-radius-md);\n }\n }\n\n &__weekdays {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n margin-bottom: var(--br-space-2);\n }\n\n &__weekday {\n text-align: center;\n font-size: var(--br-text-xs);\n font-weight: var(--br-font-medium);\n color: var(--br-dark-500);\n text-transform: uppercase;\n }\n\n &__grid {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n gap: 2px;\n }\n\n &__week-number {\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: var(--br-text-xs);\n color: var(--br-dark-400);\n }\n\n &__day {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n padding: 0;\n border: none;\n border-radius: var(--br-radius-md);\n background: transparent;\n font-size: var(--br-text-sm);\n color: var(--br-dark-700);\n cursor: pointer;\n transition: all var(--br-transition-fast);\n\n &:hover:not(:disabled):not(&--selected) {\n background: var(--br-light-100);\n }\n\n &--other-month {\n color: var(--br-dark-300);\n }\n\n &--today {\n font-weight: var(--br-font-bold);\n color: var(--br-primary-600);\n }\n\n &--selected {\n background: var(--br-primary-500);\n color: var(--br-white);\n }\n\n &--in-range {\n background: var(--br-primary-100);\n border-radius: 0;\n }\n\n &--disabled {\n opacity: 0.3;\n cursor: not-allowed;\n }\n\n &--highlighted {\n position: relative;\n\n &::after {\n content: '';\n position: absolute;\n bottom: 4px;\n width: 4px;\n height: 4px;\n border-radius: 50%;\n background: var(--highlight-color, var(--br-primary-500));\n }\n }\n }\n\n &__months,\n &__years {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: var(--br-space-2);\n }\n\n &__month,\n &__year {\n padding: var(--br-space-3);\n border: none;\n border-radius: var(--br-radius-md);\n background: transparent;\n font-size: var(--br-text-sm);\n color: var(--br-dark-700);\n cursor: pointer;\n text-transform: capitalize;\n transition: background var(--br-transition-fast);\n\n &:hover:not(:disabled) {\n background: var(--br-light-100);\n }\n\n &--current {\n color: var(--br-primary-600);\n font-weight: var(--br-font-semibold);\n }\n }\n\n &__footer {\n display: flex;\n justify-content: center;\n margin-top: var(--br-space-3);\n padding-top: var(--br-space-3);\n border-top: 1px solid var(--br-light-200);\n }\n\n &__today {\n padding: var(--br-space-2) var(--br-space-4);\n border: none;\n border-radius: var(--br-radius-md);\n background: transparent;\n font-size: var(--br-text-sm);\n color: var(--br-primary-600);\n cursor: pointer;\n\n &:hover:not(:disabled) {\n background: var(--br-primary-50);\n }\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, provide, reactive } from 'vue'\nimport type { TabsProps } from './types'\n\nconst props = withDefaults(defineProps<TabsProps>(), {\n variant: 'default',\n size: 'md',\n fullWidth: false,\n centered: false,\n vertical: false,\n grow: false,\n closable: false,\n lazy: true,\n})\n\nconst model = defineModel<string | number>()\n\nconst emit = defineEmits<{\n (e: 'tab-close', id: string | number): void\n}>()\n\nconst classes = computed(() => [\n 'br-tabs',\n `br-tabs--${props.variant}`,\n `br-tabs--${props.size}`,\n {\n 'br-tabs--full-width': props.fullWidth,\n 'br-tabs--centered': props.centered,\n 'br-tabs--vertical': props.vertical,\n 'br-tabs--grow': props.grow,\n },\n])\n\nfunction selectTab(id: string | number) {\n model.value = id\n}\n\nfunction closeTab(id: string | number, event: Event) {\n event.stopPropagation()\n emit('tab-close', id)\n}\n\nprovide(\n 'tabs',\n reactive({\n activeTab: model,\n selectTab,\n lazy: computed(() => props.lazy),\n })\n)\n</script>\n\n<template>\n <div :class=\"classes\">\n <div class=\"br-tabs__list\" role=\"tablist\">\n <template v-if=\"items && items.length\">\n <button\n v-for=\"item in items\"\n :key=\"item.id\"\n type=\"button\"\n role=\"tab\"\n class=\"br-tabs__tab\"\n :class=\"{\n 'br-tabs__tab--active': model === item.id,\n 'br-tabs__tab--disabled': item.disabled,\n }\"\n :aria-selected=\"model === item.id\"\n :disabled=\"item.disabled\"\n @click=\"selectTab(item.id)\"\n >\n <span v-if=\"item.icon\" class=\"br-tabs__tab-icon\">{{ item.icon }}</span>\n <span class=\"br-tabs__tab-label\">{{ item.label }}</span>\n <span v-if=\"item.badge !== undefined\" class=\"br-tabs__tab-badge\">\n {{ item.badge }}\n </span>\n <button\n v-if=\"closable || item.closable\"\n type=\"button\"\n class=\"br-tabs__tab-close\"\n @click=\"closeTab(item.id, $event)\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <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\" />\n </svg>\n </button>\n </button>\n </template>\n <slot v-else name=\"tabs\" />\n </div>\n\n <div class=\"br-tabs__panels\">\n <template v-if=\"items && items.length\">\n <div\n v-for=\"item in items\"\n v-show=\"model === item.id\"\n :key=\"item.id\"\n role=\"tabpanel\"\n class=\"br-tabs__panel\"\n >\n <slot :name=\"`panel-${item.id}`\" :item=\"item\">\n {{ item.content }}\n </slot>\n </div>\n </template>\n <slot v-else />\n </div>\n </div>\n</template>\n\n<style lang=\"scss\" scoped>\n.br-tabs {\n display: flex;\n flex-direction: column;\n\n &--vertical {\n flex-direction: row;\n\n .br-tabs__list {\n flex-direction: column;\n border-bottom: none;\n border-right: 1px solid var(--br-light-300);\n }\n\n .br-tabs__panels {\n flex: 1;\n padding-left: var(--br-space-4);\n }\n }\n\n &__list {\n display: flex;\n gap: var(--br-space-1);\n border-bottom: 1px solid var(--br-light-300);\n }\n\n &--centered &__list {\n justify-content: center;\n }\n\n &--grow &__list {\n .br-tabs__tab {\n flex: 1;\n }\n }\n\n &__tab {\n display: flex;\n align-items: center;\n gap: var(--br-space-2);\n padding: var(--br-space-3) var(--br-space-4);\n border: none;\n background: transparent;\n color: var(--br-dark-600);\n font-weight: var(--br-font-medium);\n cursor: pointer;\n white-space: nowrap;\n transition: all var(--br-transition-fast);\n position: relative;\n\n &:hover:not(:disabled) {\n color: var(--br-primary-500);\n background: var(--br-light-100);\n }\n\n &--active {\n color: var(--br-primary-600);\n }\n\n &--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n }\n\n &__tab-icon {\n font-size: 1.2em;\n }\n\n &__tab-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 6px;\n border-radius: var(--br-radius-full);\n background: var(--br-primary-100);\n color: var(--br-primary-700);\n font-size: var(--br-text-xs);\n font-weight: var(--br-font-semibold);\n }\n\n &__tab-close {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n padding: 0;\n border: none;\n border-radius: var(--br-radius-sm);\n background: transparent;\n color: var(--br-dark-400);\n cursor: pointer;\n transition: all var(--br-transition-fast);\n\n svg {\n width: 12px;\n height: 12px;\n }\n\n &:hover {\n background: var(--br-light-300);\n color: var(--br-dark-600);\n }\n }\n\n &__panels {\n padding-top: var(--br-space-4);\n }\n\n &__panel {\n animation: fadeIn var(--br-transition-fast);\n }\n\n // Sizes\n &--sm {\n .br-tabs__tab {\n padding: var(--br-space-2) var(--br-space-3);\n font-size: var(--br-text-sm);\n }\n }\n\n &--lg {\n .br-tabs__tab {\n padding: var(--br-space-4) var(--br-space-5);\n font-size: var(--br-text-lg);\n }\n }\n\n // Variants\n &--default {\n .br-tabs__tab--active::after {\n content: '';\n position: absolute;\n bottom: -1px;\n left: 0;\n right: 0;\n height: 2px;\n background: var(--br-primary-500);\n }\n }\n\n &--pills {\n .br-tabs__list {\n border-bottom: none;\n gap: var(--br-space-2);\n }\n\n .br-tabs__tab {\n border-radius: var(--br-radius-full);\n\n &--active {\n background: var(--br-primary-500);\n color: var(--br-white);\n }\n }\n }\n\n &--underline {\n .br-tabs__list {\n border-bottom: none;\n }\n\n .br-tabs__tab {\n border-bottom: 2px solid transparent;\n\n &--active {\n border-bottom-color: var(--br-primary-500);\n }\n }\n }\n\n &--enclosed {\n .br-tabs__list {\n border-bottom: none;\n }\n\n .br-tabs__tab {\n border: 1px solid transparent;\n border-bottom: 1px solid var(--br-light-300);\n border-radius: var(--br-radius-md) var(--br-radius-md) 0 0;\n margin-bottom: -1px;\n\n &--active {\n border-color: var(--br-light-300);\n border-bottom-color: var(--br-white);\n background: var(--br-white);\n }\n }\n\n .br-tabs__panels {\n border: 1px solid var(--br-light-300);\n border-top: none;\n border-radius: 0 0 var(--br-radius-md) var(--br-radius-md);\n padding: var(--br-space-4);\n }\n }\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, inject } from 'vue'\nimport type { TabProps } from './types'\n\nconst props = withDefaults(defineProps<TabProps>(), {\n disabled: false,\n closable: false,\n})\n\nconst emit = defineEmits<{\n (e: 'close'): void\n}>()\n\nconst tabs = inject<{\n activeTab: { value: string | number }\n selectTab: (id: string | number) => void\n}>('tabs')\n\nconst isActive = computed(() => tabs?.activeTab.value === props.id)\n\nconst classes = computed(() => [\n 'br-tabs__tab',\n {\n 'br-tabs__tab--active': isActive.value,\n 'br-tabs__tab--disabled': props.disabled,\n },\n])\n\nfunction handleClick() {\n if (props.disabled) return\n tabs?.selectTab(props.id)\n}\n\nfunction handleClose(event: Event) {\n event.stopPropagation()\n emit('close')\n}\n</script>\n\n<template>\n <button\n type=\"button\"\n role=\"tab\"\n :class=\"classes\"\n :aria-selected=\"isActive\"\n :disabled=\"disabled\"\n @click=\"handleClick\"\n >\n <span v-if=\"icon\" class=\"br-tabs__tab-icon\">\n <slot name=\"icon\">{{ icon }}</slot>\n </span>\n <span class=\"br-tabs__tab-label\">\n <slot>{{ label }}</slot>\n </span>\n <span v-if=\"badge !== undefined\" class=\"br-tabs__tab-badge\">\n {{ badge }}\n </span>\n <button\n v-if=\"closable\"\n type=\"button\"\n class=\"br-tabs__tab-close\"\n @click=\"handleClose\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <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\" />\n </svg>\n </button>\n </button>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, inject, ref, watch } from 'vue'\nimport type { TabPanelProps } from './types'\n\nconst props = withDefaults(defineProps<TabPanelProps>(), {\n lazy: true,\n})\n\nconst tabs = inject<{\n activeTab: { value: string | number }\n lazy: { value: boolean }\n}>('tabs')\n\nconst hasBeenActive = ref(false)\nconst isActive = computed(() => tabs?.activeTab.value === props.tabId)\nconst shouldRender = computed(() => {\n const isLazy = props.lazy ?? tabs?.lazy.value ?? true\n if (!isLazy) return true\n return isActive.value || hasBeenActive.value\n})\n\nwatch(isActive, (active) => {\n if (active) hasBeenActive.value = true\n})\n</script>\n\n<template>\n <div\n v-if=\"shouldRender\"\n v-show=\"isActive\"\n role=\"tabpanel\"\n class=\"br-tabs__panel\"\n >\n <slot />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport type { NavbarProps } from './types'\n\nconst props = withDefaults(defineProps<NavbarProps>(), {\n variant: 'default',\n position: 'static',\n showMobileToggle: true,\n elevated: true,\n dense: false,\n})\n\nconst isMobileMenuOpen = ref(false)\n\nconst classes = computed(() => [\n 'br-navbar',\n `br-navbar--${props.variant}`,\n `br-navbar--${props.position}`,\n {\n 'br-navbar--elevated': props.elevated,\n 'br-navbar--dense': props.dense,\n 'br-navbar--mobile-open': isMobileMenuOpen.value,\n },\n])\n\nconst style = computed(() => {\n if (props.color && props.variant === 'colored') {\n return { '--navbar-color': props.color }\n }\n return {}\n})\n\nfunction toggleMobileMenu() {\n isMobileMenuOpen.value = !isMobileMenuOpen.value\n}\n\nfunction closeMobileMenu() {\n isMobileMenuOpen.value = false\n}\n</script>\n\n<template>\n <nav :class=\"classes\" :style=\"style\">\n <div class=\"br-navbar__container\">\n <!-- Brand/Logo -->\n <div class=\"br-navbar__brand\">\n <slot name=\"brand\">\n <img v-if=\"logo\" :src=\"logo\" alt=\"\" class=\"br-navbar__logo\" />\n <span v-if=\"brand\" class=\"br-navbar__brand-text\">{{ brand }}</span>\n </slot>\n </div>\n\n <!-- Desktop Navigation -->\n <div class=\"br-navbar__nav\">\n <slot name=\"nav\">\n <template v-if=\"items && items.length\">\n <template v-for=\"item in items\" :key=\"item.id\">\n <div v-if=\"item.children && item.children.length\" class=\"br-navbar__dropdown\">\n <button\n type=\"button\"\n class=\"br-navbar__item br-navbar__dropdown-trigger\"\n :disabled=\"item.disabled\"\n >\n <span v-if=\"item.icon\" class=\"br-navbar__item-icon\">{{ item.icon }}</span>\n <span>{{ item.label }}</span>\n <svg class=\"br-navbar__dropdown-arrow\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M7 10l5 5 5-5z\" />\n </svg>\n </button>\n <div class=\"br-navbar__dropdown-menu\">\n <component\n :is=\"child.to ? 'router-link' : child.href ? 'a' : 'button'\"\n v-for=\"child in item.children\"\n :key=\"child.id\"\n class=\"br-navbar__dropdown-item\"\n :to=\"child.to\"\n :href=\"child.href\"\n :disabled=\"child.disabled\"\n @click=\"child.onClick\"\n >\n <span v-if=\"child.icon\" class=\"br-navbar__item-icon\">{{ child.icon }}</span>\n <span>{{ child.label }}</span>\n </component>\n </div>\n </div>\n <component\n v-else\n :is=\"item.to ? 'router-link' : item.href ? 'a' : 'button'\"\n class=\"br-navbar__item\"\n :to=\"item.to\"\n :href=\"item.href\"\n :disabled=\"item.disabled\"\n @click=\"item.onClick\"\n >\n <span v-if=\"item.icon\" class=\"br-navbar__item-icon\">{{ item.icon }}</span>\n <span>{{ item.label }}</span>\n <span v-if=\"item.badge\" class=\"br-navbar__item-badge\">{{ item.badge }}</span>\n </component>\n </template>\n </template>\n </slot>\n </div>\n\n <!-- Actions slot -->\n <div class=\"br-navbar__actions\">\n <slot name=\"actions\" />\n </div>\n\n <!-- Mobile Menu Toggle -->\n <button\n v-if=\"showMobileToggle\"\n type=\"button\"\n class=\"br-navbar__mobile-toggle\"\n :aria-expanded=\"isMobileMenuOpen\"\n @click=\"toggleMobileMenu\"\n >\n <span class=\"br-navbar__mobile-toggle-bar\" />\n <span class=\"br-navbar__mobile-toggle-bar\" />\n <span class=\"br-navbar__mobile-toggle-bar\" />\n </button>\n </div>\n\n <!-- Mobile Menu -->\n <div v-if=\"showMobileToggle\" class=\"br-navbar__mobile-menu\">\n <slot name=\"mobile-nav\">\n <template v-if=\"items && items.length\">\n <component\n :is=\"item.to ? 'router-link' : item.href ? 'a' : 'button'\"\n v-for=\"item in items\"\n :key=\"item.id\"\n class=\"br-navbar__mobile-item\"\n :to=\"item.to\"\n :href=\"item.href\"\n :disabled=\"item.disabled\"\n @click=\"closeMobileMenu(); item.onClick?.()\"\n >\n <span v-if=\"item.icon\" class=\"br-navbar__item-icon\">{{ item.icon }}</span>\n <span>{{ item.label }}</span>\n </component>\n </template>\n </slot>\n <slot name=\"mobile-actions\" />\n </div>\n </nav>\n</template>\n\n<style lang=\"scss\" scoped>\n.br-navbar {\n width: 100%;\n background: var(--br-white);\n z-index: 1000;\n\n &--fixed {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n }\n\n &--sticky {\n position: sticky;\n top: 0;\n }\n\n &--elevated {\n box-shadow: var(--br-shadow-sm);\n }\n\n &--transparent {\n background: transparent;\n }\n\n &--colored {\n background: var(--navbar-color, var(--br-primary-500));\n\n .br-navbar__item,\n .br-navbar__brand-text {\n color: var(--br-white);\n }\n\n .br-navbar__mobile-toggle-bar {\n background: var(--br-white);\n }\n }\n\n &__container {\n display: flex;\n align-items: center;\n gap: var(--br-space-4);\n max-width: 1280px;\n margin: 0 auto;\n padding: var(--br-space-3) var(--br-space-4);\n }\n\n &--dense &__container {\n padding: var(--br-space-2) var(--br-space-4);\n }\n\n &__brand {\n display: flex;\n align-items: center;\n gap: var(--br-space-2);\n flex-shrink: 0;\n }\n\n &__logo {\n height: 32px;\n width: auto;\n }\n\n &__brand-text {\n font-size: var(--br-text-lg);\n font-weight: var(--br-font-bold);\n color: var(--br-dark-800);\n }\n\n &__nav {\n display: flex;\n align-items: center;\n gap: var(--br-space-1);\n flex: 1;\n\n @media (max-width: 768px) {\n display: none;\n }\n }\n\n &__item {\n display: flex;\n align-items: center;\n gap: var(--br-space-2);\n padding: var(--br-space-2) var(--br-space-3);\n border: none;\n border-radius: var(--br-radius-md);\n background: transparent;\n font-size: var(--br-text-sm);\n font-weight: var(--br-font-medium);\n color: var(--br-dark-600);\n text-decoration: none;\n cursor: pointer;\n transition: all var(--br-transition-fast);\n\n &:hover:not(:disabled) {\n background: var(--br-light-100);\n color: var(--br-dark-800);\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n &.router-link-active {\n color: var(--br-primary-600);\n background: var(--br-primary-50);\n }\n }\n\n &__item-icon {\n font-size: 1.2em;\n }\n\n &__item-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 6px;\n border-radius: var(--br-radius-full);\n background: var(--br-danger-500);\n color: var(--br-white);\n font-size: var(--br-text-xs);\n font-weight: var(--br-font-semibold);\n }\n\n &__dropdown {\n position: relative;\n\n &:hover .br-navbar__dropdown-menu {\n opacity: 1;\n visibility: visible;\n transform: translateY(0);\n }\n }\n\n &__dropdown-trigger {\n display: flex;\n align-items: center;\n gap: var(--br-space-1);\n }\n\n &__dropdown-arrow {\n width: 16px;\n height: 16px;\n transition: transform var(--br-transition-fast);\n }\n\n &__dropdown:hover &__dropdown-arrow {\n transform: rotate(180deg);\n }\n\n &__dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n min-width: 180px;\n padding: var(--br-space-2);\n background: var(--br-white);\n border-radius: var(--br-radius-md);\n box-shadow: var(--br-shadow-lg);\n opacity: 0;\n visibility: hidden;\n transform: translateY(-8px);\n transition: all var(--br-transition-fast);\n z-index: 1001;\n }\n\n &__dropdown-item {\n display: flex;\n align-items: center;\n gap: var(--br-space-2);\n width: 100%;\n padding: var(--br-space-2) var(--br-space-3);\n border: none;\n border-radius: var(--br-radius-sm);\n background: transparent;\n font-size: var(--br-text-sm);\n color: var(--br-dark-600);\n text-decoration: none;\n cursor: pointer;\n\n &:hover:not(:disabled) {\n background: var(--br-light-100);\n }\n }\n\n &__actions {\n display: flex;\n align-items: center;\n gap: var(--br-space-2);\n margin-left: auto;\n\n @media (max-width: 768px) {\n display: none;\n }\n }\n\n &__mobile-toggle {\n display: none;\n flex-direction: column;\n justify-content: center;\n gap: 4px;\n width: 32px;\n height: 32px;\n padding: 6px;\n border: none;\n border-radius: var(--br-radius-md);\n background: transparent;\n cursor: pointer;\n\n @media (max-width: 768px) {\n display: flex;\n margin-left: auto;\n }\n }\n\n &__mobile-toggle-bar {\n width: 100%;\n height: 2px;\n background: var(--br-dark-600);\n border-radius: 1px;\n transition: all var(--br-transition-fast);\n }\n\n &--mobile-open &__mobile-toggle-bar:nth-child(1) {\n transform: translateY(6px) rotate(45deg);\n }\n\n &--mobile-open &__mobile-toggle-bar:nth-child(2) {\n opacity: 0;\n }\n\n &--mobile-open &__mobile-toggle-bar:nth-child(3) {\n transform: translateY(-6px) rotate(-45deg);\n }\n\n &__mobile-menu {\n display: none;\n flex-direction: column;\n padding: var(--br-space-4);\n border-top: 1px solid var(--br-light-200);\n\n @media (max-width: 768px) {\n .br-navbar--mobile-open & {\n display: flex;\n }\n }\n }\n\n &__mobile-item {\n display: flex;\n align-items: center;\n gap: var(--br-space-2);\n padding: var(--br-space-3);\n border: none;\n border-radius: var(--br-radius-md);\n background: transparent;\n font-size: var(--br-text-md);\n color: var(--br-dark-700);\n text-decoration: none;\n cursor: pointer;\n\n &:hover {\n background: var(--br-light-100);\n }\n\n &.router-link-active {\n color: var(--br-primary-600);\n background: var(--br-primary-50);\n }\n }\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref, provide } from 'vue'\nimport type { SidebarProps, SidebarItem } from './types'\n\nconst props = withDefaults(defineProps<SidebarProps>(), {\n variant: 'default',\n collapsed: false,\n showToggle: true,\n elevated: true,\n fixed: false,\n width: 260,\n collapsedWidth: 64,\n showBrand: true,\n})\n\nconst isCollapsed = defineModel<boolean>('collapsed', { default: false })\nconst expandedItems = ref<Set<string | number>>(new Set())\n\nconst classes = computed(() => [\n 'br-sidebar',\n `br-sidebar--${props.variant}`,\n {\n 'br-sidebar--collapsed': isCollapsed.value,\n 'br-sidebar--elevated': props.elevated,\n 'br-sidebar--fixed': props.fixed,\n },\n])\n\nconst style = computed(() => ({\n width:\n typeof (isCollapsed.value ? props.collapsedWidth : props.width) === 'number'\n ? `${isCollapsed.value ? props.collapsedWidth : props.width}px`\n : (isCollapsed.value ? props.collapsedWidth : props.width),\n}))\n\nfunction toggleCollapse() {\n isCollapsed.value = !isCollapsed.value\n}\n\nfunction toggleExpanded(id: string | number) {\n if (expandedItems.value.has(id)) {\n expandedItems.value.delete(id)\n } else {\n expandedItems.value.add(id)\n }\n expandedItems.value = new Set(expandedItems.value)\n}\n\nfunction isExpanded(id: string | number) {\n return expandedItems.value.has(id)\n}\n\nprovide('sidebar', {\n isCollapsed,\n toggleExpanded,\n isExpanded,\n})\n</script>\n\n<template>\n <aside :class=\"classes\" :style=\"style\">\n <!-- Brand Area -->\n <div v-if=\"showBrand\" class=\"br-sidebar__brand\">\n <slot name=\"brand\">\n <img v-if=\"logo\" :src=\"logo\" alt=\"\" class=\"br-sidebar__logo\" />\n <span v-if=\"brand && !isCollapsed\" class=\"br-sidebar__brand-text\">{{ brand }}</span>\n </slot>\n </div>\n\n <!-- Navigation -->\n <nav class=\"br-sidebar__nav\">\n <slot name=\"nav\">\n <template v-if=\"items && items.length\">\n <template v-for=\"item in items\" :key=\"item.id\">\n <!-- Divider/Section Header -->\n <div v-if=\"item.divider\" class=\"br-sidebar__divider\">\n <span v-if=\"!isCollapsed\">{{ item.label }}</span>\n </div>\n\n <!-- Item with children -->\n <div v-else-if=\"item.children && item.children.length\" class=\"br-sidebar__group\">\n <button\n type=\"button\"\n class=\"br-sidebar__item br-sidebar__group-trigger\"\n :class=\"{ 'br-sidebar__item--expanded': isExpanded(item.id) }\"\n :disabled=\"item.disabled\"\n @click=\"toggleExpanded(item.id)\"\n >\n <span v-if=\"item.icon\" class=\"br-sidebar__item-icon\">{{ item.icon }}</span>\n <span v-if=\"!isCollapsed\" class=\"br-sidebar__item-label\">{{ item.label }}</span>\n <svg v-if=\"!isCollapsed\" class=\"br-sidebar__group-arrow\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M8.59 16.59L13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.41z\" />\n </svg>\n </button>\n <div v-if=\"!isCollapsed\" class=\"br-sidebar__group-items\" :class=\"{ 'br-sidebar__group-items--expanded': isExpanded(item.id) }\">\n <component\n :is=\"child.to ? 'router-link' : child.href ? 'a' : 'button'\"\n v-for=\"child in item.children\"\n :key=\"child.id\"\n class=\"br-sidebar__item br-sidebar__item--nested\"\n :to=\"child.to\"\n :href=\"child.href\"\n :disabled=\"child.disabled\"\n @click=\"child.onClick\"\n >\n <span v-if=\"child.icon\" class=\"br-sidebar__item-icon\">{{ child.icon }}</span>\n <span class=\"br-sidebar__item-label\">{{ child.label }}</span>\n <span v-if=\"child.badge\" class=\"br-sidebar__item-badge\" :class=\"`br-sidebar__item-badge--${child.badgeVariant || 'primary'}`\">\n {{ child.badge }}\n </span>\n </component>\n </div>\n </div>\n\n <!-- Regular item -->\n <component\n v-else\n :is=\"item.to ? 'router-link' : item.href ? 'a' : 'button'\"\n class=\"br-sidebar__item\"\n :to=\"item.to\"\n :href=\"item.href\"\n :disabled=\"item.disabled\"\n :title=\"isCollapsed ? item.label : undefined\"\n @click=\"item.onClick\"\n >\n <span v-if=\"item.icon\" class=\"br-sidebar__item-icon\">{{ item.icon }}</span>\n <span v-if=\"!isCollapsed\" class=\"br-sidebar__item-label\">{{ item.label }}</span>\n <span v-if=\"item.badge && !isCollapsed\" class=\"br-sidebar__item-badge\" :class=\"`br-sidebar__item-badge--${item.badgeVariant || 'primary'}`\">\n {{ item.badge }}\n </span>\n </component>\n </template>\n </template>\n </slot>\n </nav>\n\n <!-- Footer -->\n <div class=\"br-sidebar__footer\">\n <slot name=\"footer\" />\n\n <button\n v-if=\"showToggle\"\n type=\"button\"\n class=\"br-sidebar__toggle\"\n @click=\"toggleCollapse\"\n >\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path v-if=\"isCollapsed\" d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" />\n <path v-else d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\" />\n </svg>\n </button>\n </div>\n </aside>\n</template>\n\n<style lang=\"scss\" scoped>\n.br-sidebar {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--br-white);\n border-right: 1px solid var(--br-light-200);\n transition: width var(--br-transition-normal);\n overflow: hidden;\n\n &--elevated {\n box-shadow: var(--br-shadow-md);\n border-right: none;\n }\n\n &--fixed {\n position: fixed;\n top: 0;\n left: 0;\n bottom: 0;\n z-index: 999;\n }\n\n &__brand {\n display: flex;\n align-items: center;\n gap: var(--br-space-3);\n padding: var(--br-space-4);\n border-bottom: 1px solid var(--br-light-200);\n min-height: 64px;\n }\n\n &__logo {\n width: 32px;\n height: 32px;\n flex-shrink: 0;\n object-fit: contain;\n }\n\n &__brand-text {\n font-size: var(--br-text-lg);\n font-weight: var(--br-font-bold);\n color: var(--br-dark-800);\n white-space: nowrap;\n overflow: hidden;\n }\n\n &--collapsed &__brand {\n justify-content: center;\n padding: var(--br-space-4) var(--br-space-2);\n }\n\n &__nav {\n flex: 1;\n padding: var(--br-space-2);\n overflow-y: auto;\n overflow-x: hidden;\n }\n\n &__divider {\n padding: var(--br-space-3) var(--br-space-3) var(--br-space-2);\n font-size: var(--br-text-xs);\n font-weight: var(--br-font-semibold);\n color: var(--br-dark-400);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n\n &__group {\n margin-bottom: var(--br-space-1);\n }\n\n &__group-items {\n max-height: 0;\n overflow: hidden;\n transition: max-height var(--br-transition-normal);\n\n &--expanded {\n max-height: 500px;\n }\n }\n\n &__group-arrow {\n width: 20px;\n height: 20px;\n margin-left: auto;\n color: var(--br-dark-400);\n transition: transform var(--br-transition-fast);\n }\n\n &__item--expanded &__group-arrow {\n transform: rotate(90deg);\n }\n\n &__item {\n display: flex;\n align-items: center;\n gap: var(--br-space-3);\n width: 100%;\n padding: var(--br-space-3);\n border: none;\n border-radius: var(--br-radius-md);\n background: transparent;\n font-size: var(--br-text-sm);\n font-weight: var(--br-font-medium);\n color: var(--br-dark-600);\n text-decoration: none;\n cursor: pointer;\n transition: all var(--br-transition-fast);\n white-space: nowrap;\n\n &:hover:not(:disabled) {\n background: var(--br-light-100);\n color: var(--br-dark-800);\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n &.router-link-active {\n background: var(--br-primary-50);\n color: var(--br-primary-600);\n\n .br-sidebar__item-icon {\n color: var(--br-primary-500);\n }\n }\n\n &--nested {\n padding-left: var(--br-space-6);\n }\n }\n\n &--collapsed &__item {\n justify-content: center;\n padding: var(--br-space-3) var(--br-space-2);\n }\n\n &__item-icon {\n font-size: 1.25em;\n flex-shrink: 0;\n color: var(--br-dark-500);\n }\n\n &__item-label {\n flex: 1;\n text-align: left;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n &__item-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 20px;\n height: 20px;\n padding: 0 6px;\n border-radius: var(--br-radius-full);\n font-size: var(--br-text-xs);\n font-weight: var(--br-font-semibold);\n\n &--primary {\n background: var(--br-primary-100);\n color: var(--br-primary-700);\n }\n\n &--success {\n background: var(--br-success-100);\n color: var(--br-success-700);\n }\n\n &--warning {\n background: var(--br-warning-100);\n color: var(--br-warning-700);\n }\n\n &--danger {\n background: var(--br-danger-100);\n color: var(--br-danger-700);\n }\n }\n\n &__footer {\n padding: var(--br-space-3);\n border-top: 1px solid var(--br-light-200);\n }\n\n &__toggle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n padding: var(--br-space-2);\n border: none;\n border-radius: var(--br-radius-md);\n background: var(--br-light-100);\n color: var(--br-dark-500);\n cursor: pointer;\n transition: all var(--br-transition-fast);\n\n svg {\n width: 20px;\n height: 20px;\n }\n\n &:hover {\n background: var(--br-light-200);\n color: var(--br-dark-700);\n }\n }\n\n // Compact variant\n &--compact {\n .br-sidebar__item {\n padding: var(--br-space-2) var(--br-space-3);\n font-size: var(--br-text-xs);\n }\n\n .br-sidebar__item-icon {\n font-size: 1.1em;\n }\n }\n}\n</style>\n","// =============================================================================\n// BRAIP UI - VUE PLUGIN\n// =============================================================================\n\nimport type { App, Plugin } from 'vue'\nimport type { BraipUIOptions } from './types'\n\n// Import all components\nimport * as components from './components'\n\n// Import styles\nimport './styles/main.scss'\n\n// ---------------------------------------------------------------------------\n// DEFAULT OPTIONS\n// ---------------------------------------------------------------------------\n\nconst defaultOptions: BraipUIOptions = {\n prefix: 'Br',\n theme: 'light',\n locale: 'pt-BR',\n}\n\n// ---------------------------------------------------------------------------\n// PLUGIN DEFINITION\n// ---------------------------------------------------------------------------\n\nexport const BraipUI: Plugin = {\n install(app: App, options: BraipUIOptions = {}) {\n const mergedOptions = { ...defaultOptions, ...options }\n\n // Register all components globally\n Object.entries(components).forEach(([name, component]) => {\n // Apply prefix if specified\n const componentName = mergedOptions.prefix\n ? `${mergedOptions.prefix}${name.replace(/^Br/, '')}`\n : name\n\n app.component(componentName, component)\n })\n\n // Provide options globally\n app.provide('braip-ui-options', mergedOptions)\n\n // Provide theme\n app.provide('braip-ui-theme', mergedOptions.theme)\n\n // Set theme class on document\n if (typeof document !== 'undefined') {\n document.documentElement.setAttribute('data-br-theme', mergedOptions.theme || 'light')\n }\n },\n}\n\n// ---------------------------------------------------------------------------\n// EXPORTS\n// ---------------------------------------------------------------------------\n\nexport default BraipUI\nexport { defaultOptions }\nexport type { BraipUIOptions }\n","// =============================================================================\n// BRAIP UI - MAIN ENTRY POINT\n// =============================================================================\n// Vue 3 Component Library\n// https://github.com/braip/braip-ui\n// =============================================================================\n\n// Plugin\nexport { BraipUI, default } from './plugin'\n\n// Components\nexport * from './components'\n\n// Plugin Types (non-component types)\nexport type {\n BraipUIOptions,\n ComponentDefaults,\n UseModalReturn,\n UseThemeReturn,\n MaybeRef,\n ComponentSize,\n ComponentStatus,\n} from './types'\n\n// Composables (future)\n// export * from './composables'\n\n// Directives (future)\n// export * from './directives'\n\n// Version\nexport const version = '0.1.0'\n"],"names":["props","__props","emit","__emit","classes","computed","isDisabled","handleClick","event","_createElementBlock","_openBlock","_hoisted_2","_cache","_createElementVNode","_normalizeClass","_renderSlot","_ctx","model","_useModel","inputRef","ref","isFocused","handleInput","target","value","handleFocus","handleBlur","handleKeydown","focus","_a","blur","__expose","selectRef","isOpen","searchQuery","highlightedIndex","selectedOption","opt","filteredOptions","query","toggleDropdown","selectOption","option","closeDropdown","clearSelection","handleClickOutside","onMounted","onUnmounted","_toDisplayString","_hoisted_3","_createVNode","_Transition","_hoisted_4","$event","_hoisted_5","_Fragment","_renderList","index","_hoisted_6","_hoisted_7","styles","_createBlock","_resolveDynamicComponent","sizeMap","spinnerSize","_hoisted_1","toggle","textareaRef","charCount","imageError","displayInitials","words","showImage","handleImageError","isLoaded","hasError","imageRef","imageStyles","currentSrc","handleLoad","handleError","videoRef","isPlaying","videoStyles","play","pause","handlePlay","handlePause","handleEnded","inputId","handleChange","$slots","BrRadio","percentage","barStyle","hoverValue","displayValue","stars","items","i","filled","halfFilled","handleMouseMove","rect","isHalf","handleMouseLeave","newValue","iconPaths","star","_normalizeStyle","isChecked","watch","val","BrCheckbox","close","handleBackdropClick","handleEscape","handleConfirm","handleCancel","isMounted","_Teleport","accordion","inject","itemId","useId","contentRef","iconPosition","contentHeight","openItems","toggleItem","id","isItemOpen","provide","reactive","item","BrAccordionItem","_createTextVNode","imageStyle","_hoisted_8","_hoisted_9","slots","useSlots","messageType","message","_hoisted_10","_hoisted_11","getStepStatus","canNavigateTo","handleStepClick","step","_withKeys","currentView","viewDate","weekDays","days","baseDate","date","monthName","calendarDays","year","month","firstDay","lastDay","startOffset","today","isToday","remaining","months","years","currentYear","startYear","isDateDisabled","min","max","d","disabled","isDateSelected","range","isSameDay","isInRange","date1","date2","getHighlight","h","selectDate","current","selectMonth","selectYear","navigate","direction","goToToday","day","_b","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","selectTab","closeTab","tabs","isActive","handleClose","hasBeenActive","shouldRender","active","_withDirectives","isMobileMenuOpen","style","toggleMobileMenu","closeMobileMenu","child","isCollapsed","expandedItems","toggleCollapse","toggleExpanded","isExpanded","_hoisted_17","_hoisted_18","_hoisted_19","defaultOptions","BraipUI","app","options","mergedOptions","components","name","component","componentName","version"],"mappings":"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"}