@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.
- package/dist/braip-ui.cjs +2 -0
- package/dist/braip-ui.cjs.map +1 -0
- package/dist/braip-ui.js +2502 -0
- package/dist/braip-ui.js.map +1 -0
- package/dist/style.css +1 -0
- package/dist/types/components/atoms/BrAvatar/BrAvatar.vue.d.ts +9 -0
- package/dist/types/components/atoms/BrAvatar/BrAvatar.vue.d.ts.map +1 -0
- package/dist/types/components/atoms/BrAvatar/index.d.ts +3 -0
- package/dist/types/components/atoms/BrAvatar/index.d.ts.map +1 -0
- package/dist/types/components/atoms/BrAvatar/types.d.ts +37 -0
- package/dist/types/components/atoms/BrAvatar/types.d.ts.map +1 -0
- package/dist/types/components/atoms/BrBadge/BrBadge.test.d.ts +2 -0
- package/dist/types/components/atoms/BrBadge/BrBadge.test.d.ts.map +1 -0
- package/dist/types/components/atoms/BrBadge/BrBadge.vue.d.ts +18 -0
- package/dist/types/components/atoms/BrBadge/BrBadge.vue.d.ts.map +1 -0
- package/dist/types/components/atoms/BrBadge/index.d.ts +3 -0
- package/dist/types/components/atoms/BrBadge/index.d.ts.map +1 -0
- package/dist/types/components/atoms/BrBadge/types.d.ts +20 -0
- package/dist/types/components/atoms/BrBadge/types.d.ts.map +1 -0
- package/dist/types/components/atoms/BrButton/BrButton.test.d.ts +2 -0
- package/dist/types/components/atoms/BrButton/BrButton.test.d.ts.map +1 -0
- package/dist/types/components/atoms/BrButton/BrButton.vue.d.ts +25 -0
- package/dist/types/components/atoms/BrButton/BrButton.vue.d.ts.map +1 -0
- package/dist/types/components/atoms/BrButton/index.d.ts +3 -0
- package/dist/types/components/atoms/BrButton/index.d.ts.map +1 -0
- package/dist/types/components/atoms/BrButton/types.d.ts +35 -0
- package/dist/types/components/atoms/BrButton/types.d.ts.map +1 -0
- package/dist/types/components/atoms/BrCheckbox/BrCheckbox.test.d.ts +2 -0
- package/dist/types/components/atoms/BrCheckbox/BrCheckbox.test.d.ts.map +1 -0
- package/dist/types/components/atoms/BrCheckbox/BrCheckbox.vue.d.ts +29 -0
- package/dist/types/components/atoms/BrCheckbox/BrCheckbox.vue.d.ts.map +1 -0
- package/dist/types/components/atoms/BrCheckbox/BrCheckboxGroup.vue.d.ts +17 -0
- package/dist/types/components/atoms/BrCheckbox/BrCheckboxGroup.vue.d.ts.map +1 -0
- package/dist/types/components/atoms/BrCheckbox/index.d.ts +4 -0
- package/dist/types/components/atoms/BrCheckbox/index.d.ts.map +1 -0
- package/dist/types/components/atoms/BrCheckbox/types.d.ts +86 -0
- package/dist/types/components/atoms/BrCheckbox/types.d.ts.map +1 -0
- package/dist/types/components/atoms/BrImage/BrImage.vue.d.ts +9 -0
- package/dist/types/components/atoms/BrImage/BrImage.vue.d.ts.map +1 -0
- package/dist/types/components/atoms/BrImage/index.d.ts +3 -0
- package/dist/types/components/atoms/BrImage/index.d.ts.map +1 -0
- package/dist/types/components/atoms/BrImage/types.d.ts +43 -0
- package/dist/types/components/atoms/BrImage/types.d.ts.map +1 -0
- package/dist/types/components/atoms/BrInput/BrInput.test.d.ts +2 -0
- package/dist/types/components/atoms/BrInput/BrInput.test.d.ts.map +1 -0
- package/dist/types/components/atoms/BrInput/BrInput.vue.d.ts +35 -0
- package/dist/types/components/atoms/BrInput/BrInput.vue.d.ts.map +1 -0
- package/dist/types/components/atoms/BrInput/index.d.ts +3 -0
- package/dist/types/components/atoms/BrInput/index.d.ts.map +1 -0
- package/dist/types/components/atoms/BrInput/types.d.ts +55 -0
- package/dist/types/components/atoms/BrInput/types.d.ts.map +1 -0
- package/dist/types/components/atoms/BrProgressbar/BrProgressbar.vue.d.ts +15 -0
- package/dist/types/components/atoms/BrProgressbar/BrProgressbar.vue.d.ts.map +1 -0
- package/dist/types/components/atoms/BrProgressbar/index.d.ts +3 -0
- package/dist/types/components/atoms/BrProgressbar/index.d.ts.map +1 -0
- package/dist/types/components/atoms/BrProgressbar/types.d.ts +55 -0
- package/dist/types/components/atoms/BrProgressbar/types.d.ts.map +1 -0
- package/dist/types/components/atoms/BrRadio/BrRadio.vue.d.ts +26 -0
- package/dist/types/components/atoms/BrRadio/BrRadio.vue.d.ts.map +1 -0
- package/dist/types/components/atoms/BrRadio/BrRadioGroup.vue.d.ts +17 -0
- package/dist/types/components/atoms/BrRadio/BrRadioGroup.vue.d.ts.map +1 -0
- package/dist/types/components/atoms/BrRadio/index.d.ts +4 -0
- package/dist/types/components/atoms/BrRadio/index.d.ts.map +1 -0
- package/dist/types/components/atoms/BrRadio/types.d.ts +77 -0
- package/dist/types/components/atoms/BrRadio/types.d.ts.map +1 -0
- package/dist/types/components/atoms/BrRating/BrRating.vue.d.ts +21 -0
- package/dist/types/components/atoms/BrRating/BrRating.vue.d.ts.map +1 -0
- package/dist/types/components/atoms/BrRating/index.d.ts +3 -0
- package/dist/types/components/atoms/BrRating/index.d.ts.map +1 -0
- package/dist/types/components/atoms/BrRating/types.d.ts +51 -0
- package/dist/types/components/atoms/BrRating/types.d.ts.map +1 -0
- package/dist/types/components/atoms/BrSelect/BrSelect.vue.d.ts +27 -0
- package/dist/types/components/atoms/BrSelect/BrSelect.vue.d.ts.map +1 -0
- package/dist/types/components/atoms/BrSelect/index.d.ts +3 -0
- package/dist/types/components/atoms/BrSelect/index.d.ts.map +1 -0
- package/dist/types/components/atoms/BrSelect/types.d.ts +52 -0
- package/dist/types/components/atoms/BrSelect/types.d.ts.map +1 -0
- package/dist/types/components/atoms/BrSpinner/BrSpinner.vue.d.ts +8 -0
- package/dist/types/components/atoms/BrSpinner/BrSpinner.vue.d.ts.map +1 -0
- package/dist/types/components/atoms/BrSpinner/index.d.ts +3 -0
- package/dist/types/components/atoms/BrSpinner/index.d.ts.map +1 -0
- package/dist/types/components/atoms/BrSpinner/types.d.ts +20 -0
- package/dist/types/components/atoms/BrSpinner/types.d.ts.map +1 -0
- package/dist/types/components/atoms/BrSwitch/BrSwitch.test.d.ts +2 -0
- package/dist/types/components/atoms/BrSwitch/BrSwitch.test.d.ts.map +1 -0
- package/dist/types/components/atoms/BrSwitch/BrSwitch.vue.d.ts +15 -0
- package/dist/types/components/atoms/BrSwitch/BrSwitch.vue.d.ts.map +1 -0
- package/dist/types/components/atoms/BrSwitch/index.d.ts +3 -0
- package/dist/types/components/atoms/BrSwitch/index.d.ts.map +1 -0
- package/dist/types/components/atoms/BrSwitch/types.d.ts +14 -0
- package/dist/types/components/atoms/BrSwitch/types.d.ts.map +1 -0
- package/dist/types/components/atoms/BrTextarea/BrTextarea.vue.d.ts +31 -0
- package/dist/types/components/atoms/BrTextarea/BrTextarea.vue.d.ts.map +1 -0
- package/dist/types/components/atoms/BrTextarea/index.d.ts +3 -0
- package/dist/types/components/atoms/BrTextarea/index.d.ts.map +1 -0
- package/dist/types/components/atoms/BrTextarea/types.d.ts +37 -0
- package/dist/types/components/atoms/BrTextarea/types.d.ts.map +1 -0
- package/dist/types/components/atoms/BrTitle/BrTitle.vue.d.ts +22 -0
- package/dist/types/components/atoms/BrTitle/BrTitle.vue.d.ts.map +1 -0
- package/dist/types/components/atoms/BrTitle/index.d.ts +3 -0
- package/dist/types/components/atoms/BrTitle/index.d.ts.map +1 -0
- package/dist/types/components/atoms/BrTitle/types.d.ts +41 -0
- package/dist/types/components/atoms/BrTitle/types.d.ts.map +1 -0
- package/dist/types/components/atoms/BrVideo/BrVideo.vue.d.ts +39 -0
- package/dist/types/components/atoms/BrVideo/BrVideo.vue.d.ts.map +1 -0
- package/dist/types/components/atoms/BrVideo/index.d.ts +3 -0
- package/dist/types/components/atoms/BrVideo/index.d.ts.map +1 -0
- package/dist/types/components/atoms/BrVideo/types.d.ts +48 -0
- package/dist/types/components/atoms/BrVideo/types.d.ts.map +1 -0
- package/dist/types/components/atoms/index.d.ts +16 -0
- package/dist/types/components/atoms/index.d.ts.map +1 -0
- package/dist/types/components/index.d.ts +4 -0
- package/dist/types/components/index.d.ts.map +1 -0
- package/dist/types/components/molecules/BrAccordion/BrAccordion.vue.d.ts +23 -0
- package/dist/types/components/molecules/BrAccordion/BrAccordion.vue.d.ts.map +1 -0
- package/dist/types/components/molecules/BrAccordion/BrAccordionItem.vue.d.ts +20 -0
- package/dist/types/components/molecules/BrAccordion/BrAccordionItem.vue.d.ts.map +1 -0
- package/dist/types/components/molecules/BrAccordion/index.d.ts +4 -0
- package/dist/types/components/molecules/BrAccordion/index.d.ts.map +1 -0
- package/dist/types/components/molecules/BrAccordion/types.d.ts +72 -0
- package/dist/types/components/molecules/BrAccordion/types.d.ts.map +1 -0
- package/dist/types/components/molecules/BrCalendar/BrCalendar.vue.d.ts +21 -0
- package/dist/types/components/molecules/BrCalendar/BrCalendar.vue.d.ts.map +1 -0
- package/dist/types/components/molecules/BrCalendar/index.d.ts +3 -0
- package/dist/types/components/molecules/BrCalendar/index.d.ts.map +1 -0
- package/dist/types/components/molecules/BrCalendar/types.d.ts +68 -0
- package/dist/types/components/molecules/BrCalendar/types.d.ts.map +1 -0
- package/dist/types/components/molecules/BrCard/BrCard.vue.d.ts +35 -0
- package/dist/types/components/molecules/BrCard/BrCard.vue.d.ts.map +1 -0
- package/dist/types/components/molecules/BrCard/index.d.ts +3 -0
- package/dist/types/components/molecules/BrCard/index.d.ts.map +1 -0
- package/dist/types/components/molecules/BrCard/types.d.ts +61 -0
- package/dist/types/components/molecules/BrCard/types.d.ts.map +1 -0
- package/dist/types/components/molecules/BrFormField/BrFormField.vue.d.ts +24 -0
- package/dist/types/components/molecules/BrFormField/BrFormField.vue.d.ts.map +1 -0
- package/dist/types/components/molecules/BrFormField/index.d.ts +3 -0
- package/dist/types/components/molecules/BrFormField/index.d.ts.map +1 -0
- package/dist/types/components/molecules/BrFormField/types.d.ts +55 -0
- package/dist/types/components/molecules/BrFormField/types.d.ts.map +1 -0
- package/dist/types/components/molecules/BrModal/BrModal.test.d.ts +2 -0
- package/dist/types/components/molecules/BrModal/BrModal.test.d.ts.map +1 -0
- package/dist/types/components/molecules/BrModal/BrModal.vue.d.ts +43 -0
- package/dist/types/components/molecules/BrModal/BrModal.vue.d.ts.map +1 -0
- package/dist/types/components/molecules/BrModal/index.d.ts +3 -0
- package/dist/types/components/molecules/BrModal/index.d.ts.map +1 -0
- package/dist/types/components/molecules/BrModal/types.d.ts +49 -0
- package/dist/types/components/molecules/BrModal/types.d.ts.map +1 -0
- package/dist/types/components/molecules/BrStepper/BrStepper.vue.d.ts +22 -0
- package/dist/types/components/molecules/BrStepper/BrStepper.vue.d.ts.map +1 -0
- package/dist/types/components/molecules/BrStepper/index.d.ts +3 -0
- package/dist/types/components/molecules/BrStepper/index.d.ts.map +1 -0
- package/dist/types/components/molecules/BrStepper/types.d.ts +65 -0
- package/dist/types/components/molecules/BrStepper/types.d.ts.map +1 -0
- package/dist/types/components/molecules/BrTabs/BrTab.vue.d.ts +23 -0
- package/dist/types/components/molecules/BrTabs/BrTab.vue.d.ts.map +1 -0
- package/dist/types/components/molecules/BrTabs/BrTabPanel.vue.d.ts +16 -0
- package/dist/types/components/molecules/BrTabs/BrTabPanel.vue.d.ts.map +1 -0
- package/dist/types/components/molecules/BrTabs/BrTabs.test.d.ts +2 -0
- package/dist/types/components/molecules/BrTabs/BrTabs.test.d.ts.map +1 -0
- package/dist/types/components/molecules/BrTabs/BrTabs.vue.d.ts +40 -0
- package/dist/types/components/molecules/BrTabs/BrTabs.vue.d.ts.map +1 -0
- package/dist/types/components/molecules/BrTabs/index.d.ts +5 -0
- package/dist/types/components/molecules/BrTabs/index.d.ts.map +1 -0
- package/dist/types/components/molecules/BrTabs/types.d.ts +116 -0
- package/dist/types/components/molecules/BrTabs/types.d.ts.map +1 -0
- package/dist/types/components/molecules/index.d.ts +8 -0
- package/dist/types/components/molecules/index.d.ts.map +1 -0
- package/dist/types/components/organisms/BrNavbar/BrNavbar.vue.d.ts +28 -0
- package/dist/types/components/organisms/BrNavbar/BrNavbar.vue.d.ts.map +1 -0
- package/dist/types/components/organisms/BrNavbar/index.d.ts +3 -0
- package/dist/types/components/organisms/BrNavbar/index.d.ts.map +1 -0
- package/dist/types/components/organisms/BrNavbar/types.d.ts +84 -0
- package/dist/types/components/organisms/BrNavbar/types.d.ts.map +1 -0
- package/dist/types/components/organisms/BrSidebar/BrSidebar.vue.d.ts +35 -0
- package/dist/types/components/organisms/BrSidebar/BrSidebar.vue.d.ts.map +1 -0
- package/dist/types/components/organisms/BrSidebar/index.d.ts +3 -0
- package/dist/types/components/organisms/BrSidebar/index.d.ts.map +1 -0
- package/dist/types/components/organisms/BrSidebar/types.d.ts +100 -0
- package/dist/types/components/organisms/BrSidebar/types.d.ts.map +1 -0
- package/dist/types/components/organisms/index.d.ts +3 -0
- package/dist/types/components/organisms/index.d.ts.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/plugin.d.ts +9 -0
- package/dist/types/plugin.d.ts.map +1 -0
- package/dist/types/types/index.d.ts +48 -0
- package/dist/types/types/index.d.ts.map +1 -0
- package/package.json +77 -0
- package/src/assets/icons/airplane.svg +7 -0
- package/src/assets/icons/anchor.svg +6 -0
- package/src/assets/icons/arrow-bottom-right-o.svg +9 -0
- package/src/assets/icons/arrow-bottom-right-r.svg +9 -0
- package/src/assets/icons/arrow-bottom-right.svg +7 -0
- package/src/assets/icons/arrow-down-o.svg +9 -0
- package/src/assets/icons/arrow-down-r.svg +9 -0
- package/src/assets/icons/arrow-down.svg +7 -0
- package/src/assets/icons/arrow-left-o.svg +9 -0
- package/src/assets/icons/arrow-left-r.svg +9 -0
- package/src/assets/icons/arrow-left.svg +7 -0
- package/src/assets/icons/arrow-long-up.svg +7 -0
- package/src/assets/icons/arrow-right-o.svg +9 -0
- package/src/assets/icons/arrow-right-r.svg +9 -0
- package/src/assets/icons/arrow-right.svg +7 -0
- package/src/assets/icons/arrow-top-left-o.svg +9 -0
- package/src/assets/icons/arrow-top-left-r.svg +9 -0
- package/src/assets/icons/arrow-top-left.svg +7 -0
- package/src/assets/icons/arrow-top-right-o.svg +9 -0
- package/src/assets/icons/arrow-top-right-r.svg +9 -0
- package/src/assets/icons/arrow-top-right.svg +7 -0
- package/src/assets/icons/arrow-up-o.svg +9 -0
- package/src/assets/icons/arrow-up-r.svg +9 -0
- package/src/assets/icons/arrow-up.svg +7 -0
- package/src/assets/icons/awards.svg +6 -0
- package/src/assets/icons/band-aid.svg +21 -0
- package/src/assets/icons/bee.svg +7 -0
- package/src/assets/icons/bitbucket.svg +7 -0
- package/src/assets/icons/block.svg +11 -0
- package/src/assets/icons/bowl.svg +6 -0
- package/src/assets/icons/boy.svg +14 -0
- package/src/assets/icons/briefcase.svg +9 -0
- package/src/assets/icons/browse.svg +13 -0
- package/src/assets/icons/brush.svg +6 -0
- package/src/assets/icons/calibrate.svg +11 -0
- package/src/assets/icons/cap.svg +9 -0
- package/src/assets/icons/card-clubs.svg +17 -0
- package/src/assets/icons/card-diamonds.svg +9 -0
- package/src/assets/icons/card-hearts.svg +11 -0
- package/src/assets/icons/card-spades.svg +11 -0
- package/src/assets/icons/check-o.svg +9 -0
- package/src/assets/icons/check-r.svg +9 -0
- package/src/assets/icons/check.svg +3 -0
- package/src/assets/icons/chevron-double-down-o.svg +14 -0
- package/src/assets/icons/chevron-double-down-r.svg +14 -0
- package/src/assets/icons/chevron-double-down.svg +12 -0
- package/src/assets/icons/chevron-double-left-o.svg +14 -0
- package/src/assets/icons/chevron-double-left-r.svg +14 -0
- package/src/assets/icons/chevron-double-left.svg +12 -0
- package/src/assets/icons/chevron-double-right-o.svg +14 -0
- package/src/assets/icons/chevron-double-right-r.svg +14 -0
- package/src/assets/icons/chevron-double-right.svg +12 -0
- package/src/assets/icons/pix.svg +7 -0
- package/src/assets/icons/push-chevron-left-o.svg +12 -0
- package/src/assets/icons/push-chevron-left-r.svg +12 -0
- package/src/assets/icons/push-chevron-left.svg +10 -0
- package/src/assets/icons/push-chevron-right-o.svg +12 -0
- package/src/assets/icons/push-chevron-right-r.svg +12 -0
- package/src/assets/icons/push-chevron-right.svg +10 -0
- package/src/assets/icons/push-chevron-up-o.svg +6 -0
- package/src/assets/icons/push-chevron-up-r.svg +6 -0
- package/src/assets/icons/push-chevron-up.svg +10 -0
- package/src/assets/icons/sync.svg +12 -0
- package/src/assets/icons/trending-down.svg +7 -0
- package/src/assets/icons/trending.svg +7 -0
- package/src/components/atoms/BrAvatar/BrAvatar.vue +154 -0
- package/src/components/atoms/BrAvatar/index.ts +2 -0
- package/src/components/atoms/BrAvatar/types.ts +43 -0
- package/src/components/atoms/BrBadge/BrBadge.test.ts +61 -0
- package/src/components/atoms/BrBadge/BrBadge.vue +125 -0
- package/src/components/atoms/BrBadge/index.ts +2 -0
- package/src/components/atoms/BrBadge/types.ts +22 -0
- package/src/components/atoms/BrButton/BrButton.test.ts +79 -0
- package/src/components/atoms/BrButton/BrButton.vue +291 -0
- package/src/components/atoms/BrButton/index.ts +2 -0
- package/src/components/atoms/BrButton/types.ts +44 -0
- package/src/components/atoms/BrCheckbox/BrCheckbox.test.ts +132 -0
- package/src/components/atoms/BrCheckbox/BrCheckbox.vue +198 -0
- package/src/components/atoms/BrCheckbox/BrCheckboxGroup.vue +92 -0
- package/src/components/atoms/BrCheckbox/index.ts +3 -0
- package/src/components/atoms/BrCheckbox/types.ts +102 -0
- package/src/components/atoms/BrImage/BrImage.vue +134 -0
- package/src/components/atoms/BrImage/index.ts +2 -0
- package/src/components/atoms/BrImage/types.ts +51 -0
- package/src/components/atoms/BrInput/BrInput.test.ts +98 -0
- package/src/components/atoms/BrInput/BrInput.vue +215 -0
- package/src/components/atoms/BrInput/index.ts +2 -0
- package/src/components/atoms/BrInput/types.ts +65 -0
- package/src/components/atoms/BrProgressbar/BrProgressbar.vue +204 -0
- package/src/components/atoms/BrProgressbar/index.ts +2 -0
- package/src/components/atoms/BrProgressbar/types.ts +64 -0
- package/src/components/atoms/BrRadio/BrRadio.vue +175 -0
- package/src/components/atoms/BrRadio/BrRadioGroup.vue +77 -0
- package/src/components/atoms/BrRadio/index.ts +3 -0
- package/src/components/atoms/BrRadio/types.ts +91 -0
- package/src/components/atoms/BrRating/BrRating.vue +234 -0
- package/src/components/atoms/BrRating/index.ts +2 -0
- package/src/components/atoms/BrRating/types.ts +60 -0
- package/src/components/atoms/BrSelect/BrSelect.vue +408 -0
- package/src/components/atoms/BrSelect/index.ts +2 -0
- package/src/components/atoms/BrSelect/types.ts +61 -0
- package/src/components/atoms/BrSpinner/BrSpinner.vue +125 -0
- package/src/components/atoms/BrSpinner/index.ts +2 -0
- package/src/components/atoms/BrSpinner/types.ts +22 -0
- package/src/components/atoms/BrSwitch/BrSwitch.test.ts +81 -0
- package/src/components/atoms/BrSwitch/BrSwitch.vue +181 -0
- package/src/components/atoms/BrSwitch/index.ts +2 -0
- package/src/components/atoms/BrSwitch/types.ts +15 -0
- package/src/components/atoms/BrTextarea/BrTextarea.vue +179 -0
- package/src/components/atoms/BrTextarea/index.ts +2 -0
- package/src/components/atoms/BrTextarea/types.ts +43 -0
- package/src/components/atoms/BrTitle/BrTitle.vue +154 -0
- package/src/components/atoms/BrTitle/index.ts +2 -0
- package/src/components/atoms/BrTitle/types.ts +47 -0
- package/src/components/atoms/BrVideo/BrVideo.vue +135 -0
- package/src/components/atoms/BrVideo/index.ts +2 -0
- package/src/components/atoms/BrVideo/types.ts +56 -0
- package/src/components/atoms/index.ts +20 -0
- package/src/components/index.ts +7 -0
- package/src/components/molecules/BrAccordion/BrAccordion.vue +112 -0
- package/src/components/molecules/BrAccordion/BrAccordionItem.vue +168 -0
- package/src/components/molecules/BrAccordion/index.ts +3 -0
- package/src/components/molecules/BrAccordion/types.ts +85 -0
- package/src/components/molecules/BrCalendar/BrCalendar.vue +553 -0
- package/src/components/molecules/BrCalendar/index.ts +2 -0
- package/src/components/molecules/BrCalendar/types.ts +80 -0
- package/src/components/molecules/BrCard/BrCard.vue +262 -0
- package/src/components/molecules/BrCard/index.ts +2 -0
- package/src/components/molecules/BrCard/types.ts +72 -0
- package/src/components/molecules/BrFormField/BrFormField.vue +241 -0
- package/src/components/molecules/BrFormField/index.ts +2 -0
- package/src/components/molecules/BrFormField/types.ts +64 -0
- package/src/components/molecules/BrModal/BrModal.test.ts +212 -0
- package/src/components/molecules/BrModal/BrModal.vue +404 -0
- package/src/components/molecules/BrModal/index.ts +2 -0
- package/src/components/molecules/BrModal/types.ts +57 -0
- package/src/components/molecules/BrStepper/BrStepper.vue +302 -0
- package/src/components/molecules/BrStepper/index.ts +2 -0
- package/src/components/molecules/BrStepper/types.ts +77 -0
- package/src/components/molecules/BrTabs/BrTab.vue +69 -0
- package/src/components/molecules/BrTabs/BrTabPanel.vue +36 -0
- package/src/components/molecules/BrTabs/BrTabs.test.ts +168 -0
- package/src/components/molecules/BrTabs/BrTabs.vue +319 -0
- package/src/components/molecules/BrTabs/index.ts +4 -0
- package/src/components/molecules/BrTabs/types.ts +139 -0
- package/src/components/molecules/index.ts +11 -0
- package/src/components/organisms/BrNavbar/BrNavbar.vue +424 -0
- package/src/components/organisms/BrNavbar/index.ts +2 -0
- package/src/components/organisms/BrNavbar/types.ts +101 -0
- package/src/components/organisms/BrSidebar/BrSidebar.vue +382 -0
- package/src/components/organisms/BrSidebar/index.ts +2 -0
- package/src/components/organisms/BrSidebar/types.ts +121 -0
- package/src/components/organisms/index.ts +6 -0
- package/src/index.ts +32 -0
- package/src/plugin.ts +61 -0
- package/src/styles/base/_animations.scss +187 -0
- package/src/styles/base/_reset.scss +109 -0
- package/src/styles/base/index.scss +6 -0
- package/src/styles/main.scss +9 -0
- package/src/styles/tokens/_colors.scss +185 -0
- package/src/styles/tokens/_spacing.scss +88 -0
- package/src/styles/tokens/_typography.scss +77 -0
- package/src/styles/tokens/index.scss +7 -0
- package/src/types/index.ts +125 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"braip-ui.cjs","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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"}
|