@arolariu/components 0.0.40 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DEBUGGING.md +396 -401
- package/{readme.md → README.md} +627 -627
- package/changelog.md +8 -0
- package/dist/components/ui/accordion.d.ts.map +1 -0
- package/dist/components/ui/alert-dialog.d.ts.map +1 -0
- package/dist/components/ui/alert.d.ts.map +1 -0
- package/dist/components/ui/aspect-ratio.d.ts.map +1 -0
- package/dist/components/ui/avatar.d.ts.map +1 -0
- package/dist/components/ui/background-beams.d.ts.map +1 -0
- package/dist/components/ui/badge.d.ts.map +1 -0
- package/dist/components/ui/breadcrumb.d.ts.map +1 -0
- package/dist/components/ui/bubble-background.d.ts.map +1 -0
- package/dist/components/ui/button.d.ts.map +1 -0
- package/dist/components/ui/calendar.d.ts.map +1 -0
- package/dist/{esm/components → components}/ui/calendar.js +1 -1
- package/dist/components/ui/calendar.js.map +1 -0
- package/dist/components/ui/card.d.ts.map +1 -0
- package/dist/components/ui/carousel.d.ts.map +1 -0
- package/dist/components/ui/chart.d.ts +41 -0
- package/dist/components/ui/chart.d.ts.map +1 -0
- package/dist/{esm/components → components}/ui/chart.js +10 -10
- package/dist/components/ui/chart.js.map +1 -0
- package/dist/components/ui/checkbox.d.ts.map +1 -0
- package/dist/components/ui/collapsible.d.ts.map +1 -0
- package/dist/components/ui/command.d.ts.map +1 -0
- package/dist/components/ui/context-menu.d.ts.map +1 -0
- package/dist/components/ui/counting-number.d.ts.map +1 -0
- package/dist/components/ui/dialog.d.ts.map +1 -0
- package/dist/components/ui/dot-background.d.ts.map +1 -0
- package/dist/components/ui/drawer.d.ts.map +1 -0
- package/dist/components/ui/drawer.js.map +1 -0
- package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
- package/dist/components/ui/dropdrawer.d.ts.map +1 -0
- package/dist/components/ui/fireworks-background.d.ts.map +1 -0
- package/dist/components/ui/flip-button.d.ts.map +1 -0
- package/dist/components/ui/form.d.ts.map +1 -0
- package/dist/components/ui/gradient-background.d.ts.map +1 -0
- package/dist/components/ui/gradient-text.d.ts.map +1 -0
- package/dist/components/ui/highlight-text.d.ts.map +1 -0
- package/dist/components/ui/hole-background.d.ts.map +1 -0
- package/dist/components/ui/hover-card.d.ts.map +1 -0
- package/dist/components/ui/input-otp.d.ts.map +1 -0
- package/dist/components/ui/input.d.ts.map +1 -0
- package/dist/components/ui/input.js.map +1 -0
- package/dist/components/ui/label.d.ts.map +1 -0
- package/dist/components/ui/menubar.d.ts.map +1 -0
- package/dist/components/ui/navigation-menu.d.ts.map +1 -0
- package/dist/components/ui/pagination.d.ts.map +1 -0
- package/dist/components/ui/popover.d.ts.map +1 -0
- package/dist/components/ui/progress.d.ts.map +1 -0
- package/dist/components/ui/radio-group.d.ts.map +1 -0
- package/dist/components/ui/resizable.d.ts.map +1 -0
- package/dist/components/ui/ripple-button.d.ts.map +1 -0
- package/dist/components/ui/ripple-button.js.map +1 -0
- package/dist/components/ui/scratcher.d.ts.map +1 -0
- package/dist/components/ui/scratcher.js.map +1 -0
- package/dist/components/ui/scroll-area.d.ts.map +1 -0
- package/dist/components/ui/select.d.ts.map +1 -0
- package/dist/components/ui/separator.d.ts.map +1 -0
- package/dist/components/ui/sheet.d.ts.map +1 -0
- package/dist/components/ui/sidebar.d.ts.map +1 -0
- package/dist/components/ui/skeleton.d.ts.map +1 -0
- package/dist/components/ui/slider.d.ts.map +1 -0
- package/dist/components/ui/sonner.d.ts.map +1 -0
- package/dist/components/ui/switch.d.ts.map +1 -0
- package/dist/components/ui/table.d.ts.map +1 -0
- package/dist/components/ui/tabs.d.ts.map +1 -0
- package/dist/components/ui/textarea.d.ts.map +1 -0
- package/dist/components/ui/toggle-group.d.ts.map +1 -0
- package/dist/components/ui/toggle.d.ts.map +1 -0
- package/dist/components/ui/tooltip.d.ts.map +1 -0
- package/dist/hooks/use-mobile.d.ts.map +1 -0
- package/dist/index.css +25 -1
- package/dist/index.css.map +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +61 -61
- package/dist/lib/utils.d.ts.map +1 -0
- package/package.json +226 -296
- package/src/components/ui/calendar.tsx +216 -213
- package/src/components/ui/chart.tsx +353 -380
- package/src/components/ui/drawer.tsx +141 -141
- package/src/components/ui/input.tsx +22 -22
- package/src/components/ui/ripple-button.tsx +111 -111
- package/src/components/ui/scratcher.tsx +171 -171
- package/src/index.css +67 -69
- package/dist/cjs/components/ui/accordion.cjs +0 -92
- package/dist/cjs/components/ui/accordion.cjs.map +0 -1
- package/dist/cjs/components/ui/alert-dialog.cjs +0 -152
- package/dist/cjs/components/ui/alert-dialog.cjs.map +0 -1
- package/dist/cjs/components/ui/alert.cjs +0 -83
- package/dist/cjs/components/ui/alert.cjs.map +0 -1
- package/dist/cjs/components/ui/aspect-ratio.cjs +0 -47
- package/dist/cjs/components/ui/aspect-ratio.cjs.map +0 -1
- package/dist/cjs/components/ui/avatar.cjs +0 -69
- package/dist/cjs/components/ui/avatar.cjs.map +0 -1
- package/dist/cjs/components/ui/background-beams.cjs +0 -200
- package/dist/cjs/components/ui/background-beams.cjs.map +0 -1
- package/dist/cjs/components/ui/badge.cjs +0 -69
- package/dist/cjs/components/ui/badge.cjs.map +0 -1
- package/dist/cjs/components/ui/breadcrumb.cjs +0 -128
- package/dist/cjs/components/ui/breadcrumb.cjs.map +0 -1
- package/dist/cjs/components/ui/bubble-background.cjs +0 -213
- package/dist/cjs/components/ui/bubble-background.cjs.map +0 -1
- package/dist/cjs/components/ui/button.cjs +0 -80
- package/dist/cjs/components/ui/button.cjs.map +0 -1
- package/dist/cjs/components/ui/calendar.cjs +0 -146
- package/dist/cjs/components/ui/calendar.cjs.map +0 -1
- package/dist/cjs/components/ui/card.cjs +0 -108
- package/dist/cjs/components/ui/card.cjs.map +0 -1
- package/dist/cjs/components/ui/carousel.cjs +0 -207
- package/dist/cjs/components/ui/carousel.cjs.map +0 -1
- package/dist/cjs/components/ui/chart.cjs +0 -221
- package/dist/cjs/components/ui/chart.cjs.map +0 -1
- package/dist/cjs/components/ui/checkbox.cjs +0 -57
- package/dist/cjs/components/ui/checkbox.cjs.map +0 -1
- package/dist/cjs/components/ui/collapsible.cjs +0 -65
- package/dist/cjs/components/ui/collapsible.cjs.map +0 -1
- package/dist/cjs/components/ui/command.cjs +0 -159
- package/dist/cjs/components/ui/command.cjs.map +0 -1
- package/dist/cjs/components/ui/context-menu.cjs +0 -219
- package/dist/cjs/components/ui/context-menu.cjs.map +0 -1
- package/dist/cjs/components/ui/counting-number.cjs +0 -95
- package/dist/cjs/components/ui/counting-number.cjs.map +0 -1
- package/dist/cjs/components/ui/dialog.cjs +0 -156
- package/dist/cjs/components/ui/dialog.cjs.map +0 -1
- package/dist/cjs/components/ui/dot-background.cjs +0 -131
- package/dist/cjs/components/ui/dot-background.cjs.map +0 -1
- package/dist/cjs/components/ui/drawer.cjs +0 -147
- package/dist/cjs/components/ui/drawer.cjs.map +0 -1
- package/dist/cjs/components/ui/dropdown-menu.cjs +0 -220
- package/dist/cjs/components/ui/dropdown-menu.cjs.map +0 -1
- package/dist/cjs/components/ui/dropdrawer.cjs +0 -627
- package/dist/cjs/components/ui/dropdrawer.cjs.map +0 -1
- package/dist/cjs/components/ui/fireworks-background.cjs +0 -259
- package/dist/cjs/components/ui/fireworks-background.cjs.map +0 -1
- package/dist/cjs/components/ui/flip-button.cjs +0 -100
- package/dist/cjs/components/ui/flip-button.cjs.map +0 -1
- package/dist/cjs/components/ui/form.cjs +0 -149
- package/dist/cjs/components/ui/form.cjs.map +0 -1
- package/dist/cjs/components/ui/gradient-background.cjs +0 -60
- package/dist/cjs/components/ui/gradient-background.cjs.map +0 -1
- package/dist/cjs/components/ui/gradient-text.cjs +0 -83
- package/dist/cjs/components/ui/gradient-text.cjs.map +0 -1
- package/dist/cjs/components/ui/highlight-text.cjs +0 -74
- package/dist/cjs/components/ui/highlight-text.cjs.map +0 -1
- package/dist/cjs/components/ui/hole-background.cjs +0 -361
- package/dist/cjs/components/ui/hole-background.cjs.map +0 -1
- package/dist/cjs/components/ui/hover-card.cjs +0 -72
- package/dist/cjs/components/ui/hover-card.cjs.map +0 -1
- package/dist/cjs/components/ui/input-otp.cjs +0 -94
- package/dist/cjs/components/ui/input-otp.cjs.map +0 -1
- package/dist/cjs/components/ui/input.cjs +0 -49
- package/dist/cjs/components/ui/input.cjs.map +0 -1
- package/dist/cjs/components/ui/label.cjs +0 -49
- package/dist/cjs/components/ui/label.cjs.map +0 -1
- package/dist/cjs/components/ui/menubar.cjs +0 -233
- package/dist/cjs/components/ui/menubar.cjs.map +0 -1
- package/dist/cjs/components/ui/navigation-menu.cjs +0 -144
- package/dist/cjs/components/ui/navigation-menu.cjs.map +0 -1
- package/dist/cjs/components/ui/pagination.cjs +0 -142
- package/dist/cjs/components/ui/pagination.cjs.map +0 -1
- package/dist/cjs/components/ui/popover.cjs +0 -80
- package/dist/cjs/components/ui/popover.cjs.map +0 -1
- package/dist/cjs/components/ui/progress.cjs +0 -56
- package/dist/cjs/components/ui/progress.cjs.map +0 -1
- package/dist/cjs/components/ui/radio-group.cjs +0 -67
- package/dist/cjs/components/ui/radio-group.cjs.map +0 -1
- package/dist/cjs/components/ui/resizable.cjs +0 -75
- package/dist/cjs/components/ui/resizable.cjs.map +0 -1
- package/dist/cjs/components/ui/ripple-button.cjs +0 -108
- package/dist/cjs/components/ui/ripple-button.cjs.map +0 -1
- package/dist/cjs/components/ui/scratcher.cjs +0 -179
- package/dist/cjs/components/ui/scratcher.cjs.map +0 -1
- package/dist/cjs/components/ui/scroll-area.cjs +0 -73
- package/dist/cjs/components/ui/scroll-area.cjs.map +0 -1
- package/dist/cjs/components/ui/select.cjs +0 -177
- package/dist/cjs/components/ui/select.cjs.map +0 -1
- package/dist/cjs/components/ui/separator.cjs +0 -51
- package/dist/cjs/components/ui/separator.cjs.map +0 -1
- package/dist/cjs/components/ui/sheet.cjs +0 -150
- package/dist/cjs/components/ui/sheet.cjs.map +0 -1
- package/dist/cjs/components/ui/sidebar.cjs +0 -513
- package/dist/cjs/components/ui/sidebar.cjs.map +0 -1
- package/dist/cjs/components/ui/skeleton.cjs +0 -48
- package/dist/cjs/components/ui/skeleton.cjs.map +0 -1
- package/dist/cjs/components/ui/slider.cjs +0 -78
- package/dist/cjs/components/ui/slider.cjs.map +0 -1
- package/dist/cjs/components/ui/sonner.cjs +0 -58
- package/dist/cjs/components/ui/sonner.cjs.map +0 -1
- package/dist/cjs/components/ui/switch.cjs +0 -53
- package/dist/cjs/components/ui/switch.cjs.map +0 -1
- package/dist/cjs/components/ui/table.cjs +0 -122
- package/dist/cjs/components/ui/table.cjs.map +0 -1
- package/dist/cjs/components/ui/tabs.cjs +0 -79
- package/dist/cjs/components/ui/tabs.cjs.map +0 -1
- package/dist/cjs/components/ui/textarea.cjs +0 -48
- package/dist/cjs/components/ui/textarea.cjs.map +0 -1
- package/dist/cjs/components/ui/toggle-group.cjs +0 -80
- package/dist/cjs/components/ui/toggle-group.cjs.map +0 -1
- package/dist/cjs/components/ui/toggle.cjs +0 -74
- package/dist/cjs/components/ui/toggle.cjs.map +0 -1
- package/dist/cjs/components/ui/tooltip.cjs +0 -88
- package/dist/cjs/components/ui/tooltip.cjs.map +0 -1
- package/dist/cjs/hooks/use-mobile.cjs +0 -52
- package/dist/cjs/hooks/use-mobile.cjs.map +0 -1
- package/dist/cjs/index.cjs +0 -905
- package/dist/cjs/index.cjs.map +0 -1
- package/dist/cjs/index.css +0 -7309
- package/dist/cjs/index.css.map +0 -1
- package/dist/cjs/lib/utils.cjs +0 -42
- package/dist/cjs/lib/utils.cjs.map +0 -1
- package/dist/esm/components/ui/calendar.js.map +0 -1
- package/dist/esm/components/ui/chart.js.map +0 -1
- package/dist/esm/components/ui/drawer.js.map +0 -1
- package/dist/esm/components/ui/input.js.map +0 -1
- package/dist/esm/components/ui/ripple-button.js.map +0 -1
- package/dist/esm/components/ui/scratcher.js.map +0 -1
- package/dist/esm/index.css +0 -7309
- package/dist/esm/index.css.map +0 -1
- package/dist/esm/index.js +0 -62
- package/dist/types/components/ui/accordion.d.ts.map +0 -1
- package/dist/types/components/ui/alert-dialog.d.ts.map +0 -1
- package/dist/types/components/ui/alert.d.ts.map +0 -1
- package/dist/types/components/ui/aspect-ratio.d.ts.map +0 -1
- package/dist/types/components/ui/avatar.d.ts.map +0 -1
- package/dist/types/components/ui/background-beams.d.ts.map +0 -1
- package/dist/types/components/ui/badge.d.ts.map +0 -1
- package/dist/types/components/ui/breadcrumb.d.ts.map +0 -1
- package/dist/types/components/ui/bubble-background.d.ts.map +0 -1
- package/dist/types/components/ui/button.d.ts.map +0 -1
- package/dist/types/components/ui/calendar.d.ts.map +0 -1
- package/dist/types/components/ui/card.d.ts.map +0 -1
- package/dist/types/components/ui/carousel.d.ts.map +0 -1
- package/dist/types/components/ui/chart.d.ts +0 -55
- package/dist/types/components/ui/chart.d.ts.map +0 -1
- package/dist/types/components/ui/checkbox.d.ts.map +0 -1
- package/dist/types/components/ui/collapsible.d.ts.map +0 -1
- package/dist/types/components/ui/command.d.ts.map +0 -1
- package/dist/types/components/ui/context-menu.d.ts.map +0 -1
- package/dist/types/components/ui/counting-number.d.ts.map +0 -1
- package/dist/types/components/ui/dialog.d.ts.map +0 -1
- package/dist/types/components/ui/dot-background.d.ts.map +0 -1
- package/dist/types/components/ui/drawer.d.ts.map +0 -1
- package/dist/types/components/ui/dropdown-menu.d.ts.map +0 -1
- package/dist/types/components/ui/dropdrawer.d.ts.map +0 -1
- package/dist/types/components/ui/fireworks-background.d.ts.map +0 -1
- package/dist/types/components/ui/flip-button.d.ts.map +0 -1
- package/dist/types/components/ui/form.d.ts.map +0 -1
- package/dist/types/components/ui/gradient-background.d.ts.map +0 -1
- package/dist/types/components/ui/gradient-text.d.ts.map +0 -1
- package/dist/types/components/ui/highlight-text.d.ts.map +0 -1
- package/dist/types/components/ui/hole-background.d.ts.map +0 -1
- package/dist/types/components/ui/hover-card.d.ts.map +0 -1
- package/dist/types/components/ui/input-otp.d.ts.map +0 -1
- package/dist/types/components/ui/input.d.ts.map +0 -1
- package/dist/types/components/ui/label.d.ts.map +0 -1
- package/dist/types/components/ui/menubar.d.ts.map +0 -1
- package/dist/types/components/ui/navigation-menu.d.ts.map +0 -1
- package/dist/types/components/ui/pagination.d.ts.map +0 -1
- package/dist/types/components/ui/popover.d.ts.map +0 -1
- package/dist/types/components/ui/progress.d.ts.map +0 -1
- package/dist/types/components/ui/radio-group.d.ts.map +0 -1
- package/dist/types/components/ui/resizable.d.ts.map +0 -1
- package/dist/types/components/ui/ripple-button.d.ts.map +0 -1
- package/dist/types/components/ui/scratcher.d.ts.map +0 -1
- package/dist/types/components/ui/scroll-area.d.ts.map +0 -1
- package/dist/types/components/ui/select.d.ts.map +0 -1
- package/dist/types/components/ui/separator.d.ts.map +0 -1
- package/dist/types/components/ui/sheet.d.ts.map +0 -1
- package/dist/types/components/ui/sidebar.d.ts.map +0 -1
- package/dist/types/components/ui/skeleton.d.ts.map +0 -1
- package/dist/types/components/ui/slider.d.ts.map +0 -1
- package/dist/types/components/ui/sonner.d.ts.map +0 -1
- package/dist/types/components/ui/switch.d.ts.map +0 -1
- package/dist/types/components/ui/table.d.ts.map +0 -1
- package/dist/types/components/ui/tabs.d.ts.map +0 -1
- package/dist/types/components/ui/textarea.d.ts.map +0 -1
- package/dist/types/components/ui/toggle-group.d.ts.map +0 -1
- package/dist/types/components/ui/toggle.d.ts.map +0 -1
- package/dist/types/components/ui/tooltip.d.ts.map +0 -1
- package/dist/types/hooks/use-mobile.d.ts.map +0 -1
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/lib/utils.d.ts.map +0 -1
- package/tailwind.config.mjs +0 -65
- package/tsconfig.json +0 -58
- /package/{LICENSE → LICENSE.md} +0 -0
- /package/dist/{types/components → components}/ui/accordion.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/accordion.js +0 -0
- /package/dist/{esm/components → components}/ui/accordion.js.map +0 -0
- /package/dist/{types/components → components}/ui/alert-dialog.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/alert-dialog.js +0 -0
- /package/dist/{esm/components → components}/ui/alert-dialog.js.map +0 -0
- /package/dist/{types/components → components}/ui/alert.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/alert.js +0 -0
- /package/dist/{esm/components → components}/ui/alert.js.map +0 -0
- /package/dist/{types/components → components}/ui/aspect-ratio.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/aspect-ratio.js +0 -0
- /package/dist/{esm/components → components}/ui/aspect-ratio.js.map +0 -0
- /package/dist/{types/components → components}/ui/avatar.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/avatar.js +0 -0
- /package/dist/{esm/components → components}/ui/avatar.js.map +0 -0
- /package/dist/{types/components → components}/ui/background-beams.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/background-beams.js +0 -0
- /package/dist/{esm/components → components}/ui/background-beams.js.map +0 -0
- /package/dist/{types/components → components}/ui/badge.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/badge.js +0 -0
- /package/dist/{esm/components → components}/ui/badge.js.map +0 -0
- /package/dist/{types/components → components}/ui/breadcrumb.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/breadcrumb.js +0 -0
- /package/dist/{esm/components → components}/ui/breadcrumb.js.map +0 -0
- /package/dist/{types/components → components}/ui/bubble-background.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/bubble-background.js +0 -0
- /package/dist/{esm/components → components}/ui/bubble-background.js.map +0 -0
- /package/dist/{types/components → components}/ui/button.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/button.js +0 -0
- /package/dist/{esm/components → components}/ui/button.js.map +0 -0
- /package/dist/{types/components → components}/ui/calendar.d.ts +0 -0
- /package/dist/{types/components → components}/ui/card.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/card.js +0 -0
- /package/dist/{esm/components → components}/ui/card.js.map +0 -0
- /package/dist/{types/components → components}/ui/carousel.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/carousel.js +0 -0
- /package/dist/{esm/components → components}/ui/carousel.js.map +0 -0
- /package/dist/{types/components → components}/ui/checkbox.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/checkbox.js +0 -0
- /package/dist/{esm/components → components}/ui/checkbox.js.map +0 -0
- /package/dist/{types/components → components}/ui/collapsible.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/collapsible.js +0 -0
- /package/dist/{esm/components → components}/ui/collapsible.js.map +0 -0
- /package/dist/{types/components → components}/ui/command.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/command.js +0 -0
- /package/dist/{esm/components → components}/ui/command.js.map +0 -0
- /package/dist/{types/components → components}/ui/context-menu.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/context-menu.js +0 -0
- /package/dist/{esm/components → components}/ui/context-menu.js.map +0 -0
- /package/dist/{types/components → components}/ui/counting-number.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/counting-number.js +0 -0
- /package/dist/{esm/components → components}/ui/counting-number.js.map +0 -0
- /package/dist/{types/components → components}/ui/dialog.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/dialog.js +0 -0
- /package/dist/{esm/components → components}/ui/dialog.js.map +0 -0
- /package/dist/{types/components → components}/ui/dot-background.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/dot-background.js +0 -0
- /package/dist/{esm/components → components}/ui/dot-background.js.map +0 -0
- /package/dist/{types/components → components}/ui/drawer.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/drawer.js +0 -0
- /package/dist/{types/components → components}/ui/dropdown-menu.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/dropdown-menu.js +0 -0
- /package/dist/{esm/components → components}/ui/dropdown-menu.js.map +0 -0
- /package/dist/{types/components → components}/ui/dropdrawer.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/dropdrawer.js +0 -0
- /package/dist/{esm/components → components}/ui/dropdrawer.js.map +0 -0
- /package/dist/{types/components → components}/ui/fireworks-background.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/fireworks-background.js +0 -0
- /package/dist/{esm/components → components}/ui/fireworks-background.js.map +0 -0
- /package/dist/{types/components → components}/ui/flip-button.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/flip-button.js +0 -0
- /package/dist/{esm/components → components}/ui/flip-button.js.map +0 -0
- /package/dist/{types/components → components}/ui/form.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/form.js +0 -0
- /package/dist/{esm/components → components}/ui/form.js.map +0 -0
- /package/dist/{types/components → components}/ui/gradient-background.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/gradient-background.js +0 -0
- /package/dist/{esm/components → components}/ui/gradient-background.js.map +0 -0
- /package/dist/{types/components → components}/ui/gradient-text.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/gradient-text.js +0 -0
- /package/dist/{esm/components → components}/ui/gradient-text.js.map +0 -0
- /package/dist/{types/components → components}/ui/highlight-text.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/highlight-text.js +0 -0
- /package/dist/{esm/components → components}/ui/highlight-text.js.map +0 -0
- /package/dist/{types/components → components}/ui/hole-background.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/hole-background.js +0 -0
- /package/dist/{esm/components → components}/ui/hole-background.js.map +0 -0
- /package/dist/{types/components → components}/ui/hover-card.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/hover-card.js +0 -0
- /package/dist/{esm/components → components}/ui/hover-card.js.map +0 -0
- /package/dist/{types/components → components}/ui/input-otp.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/input-otp.js +0 -0
- /package/dist/{esm/components → components}/ui/input-otp.js.map +0 -0
- /package/dist/{types/components → components}/ui/input.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/input.js +0 -0
- /package/dist/{types/components → components}/ui/label.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/label.js +0 -0
- /package/dist/{esm/components → components}/ui/label.js.map +0 -0
- /package/dist/{types/components → components}/ui/menubar.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/menubar.js +0 -0
- /package/dist/{esm/components → components}/ui/menubar.js.map +0 -0
- /package/dist/{types/components → components}/ui/navigation-menu.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/navigation-menu.js +0 -0
- /package/dist/{esm/components → components}/ui/navigation-menu.js.map +0 -0
- /package/dist/{types/components → components}/ui/pagination.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/pagination.js +0 -0
- /package/dist/{esm/components → components}/ui/pagination.js.map +0 -0
- /package/dist/{types/components → components}/ui/popover.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/popover.js +0 -0
- /package/dist/{esm/components → components}/ui/popover.js.map +0 -0
- /package/dist/{types/components → components}/ui/progress.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/progress.js +0 -0
- /package/dist/{esm/components → components}/ui/progress.js.map +0 -0
- /package/dist/{types/components → components}/ui/radio-group.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/radio-group.js +0 -0
- /package/dist/{esm/components → components}/ui/radio-group.js.map +0 -0
- /package/dist/{types/components → components}/ui/resizable.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/resizable.js +0 -0
- /package/dist/{esm/components → components}/ui/resizable.js.map +0 -0
- /package/dist/{types/components → components}/ui/ripple-button.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/ripple-button.js +0 -0
- /package/dist/{types/components → components}/ui/scratcher.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/scratcher.js +0 -0
- /package/dist/{types/components → components}/ui/scroll-area.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/scroll-area.js +0 -0
- /package/dist/{esm/components → components}/ui/scroll-area.js.map +0 -0
- /package/dist/{types/components → components}/ui/select.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/select.js +0 -0
- /package/dist/{esm/components → components}/ui/select.js.map +0 -0
- /package/dist/{types/components → components}/ui/separator.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/separator.js +0 -0
- /package/dist/{esm/components → components}/ui/separator.js.map +0 -0
- /package/dist/{types/components → components}/ui/sheet.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/sheet.js +0 -0
- /package/dist/{esm/components → components}/ui/sheet.js.map +0 -0
- /package/dist/{types/components → components}/ui/sidebar.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/sidebar.js +0 -0
- /package/dist/{esm/components → components}/ui/sidebar.js.map +0 -0
- /package/dist/{types/components → components}/ui/skeleton.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/skeleton.js +0 -0
- /package/dist/{esm/components → components}/ui/skeleton.js.map +0 -0
- /package/dist/{types/components → components}/ui/slider.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/slider.js +0 -0
- /package/dist/{esm/components → components}/ui/slider.js.map +0 -0
- /package/dist/{types/components → components}/ui/sonner.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/sonner.js +0 -0
- /package/dist/{esm/components → components}/ui/sonner.js.map +0 -0
- /package/dist/{types/components → components}/ui/switch.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/switch.js +0 -0
- /package/dist/{esm/components → components}/ui/switch.js.map +0 -0
- /package/dist/{types/components → components}/ui/table.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/table.js +0 -0
- /package/dist/{esm/components → components}/ui/table.js.map +0 -0
- /package/dist/{types/components → components}/ui/tabs.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/tabs.js +0 -0
- /package/dist/{esm/components → components}/ui/tabs.js.map +0 -0
- /package/dist/{types/components → components}/ui/textarea.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/textarea.js +0 -0
- /package/dist/{esm/components → components}/ui/textarea.js.map +0 -0
- /package/dist/{types/components → components}/ui/toggle-group.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/toggle-group.js +0 -0
- /package/dist/{esm/components → components}/ui/toggle-group.js.map +0 -0
- /package/dist/{types/components → components}/ui/toggle.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/toggle.js +0 -0
- /package/dist/{esm/components → components}/ui/toggle.js.map +0 -0
- /package/dist/{types/components → components}/ui/tooltip.d.ts +0 -0
- /package/dist/{esm/components → components}/ui/tooltip.js +0 -0
- /package/dist/{esm/components → components}/ui/tooltip.js.map +0 -0
- /package/dist/{types/hooks → hooks}/use-mobile.d.ts +0 -0
- /package/dist/{esm/hooks → hooks}/use-mobile.js +0 -0
- /package/dist/{esm/hooks → hooks}/use-mobile.js.map +0 -0
- /package/dist/{types/index.d.ts → index.d.ts} +0 -0
- /package/dist/{types/lib → lib}/utils.d.ts +0 -0
- /package/dist/{esm/lib → lib}/utils.js +0 -0
- /package/dist/{esm/lib → lib}/utils.js.map +0 -0
package/{readme.md → README.md}
RENAMED
|
@@ -1,627 +1,627 @@
|
|
|
1
|
-
# ✨ @arolariu/components
|
|
2
|
-
|
|
3
|
-
<div align="center">
|
|
4
|
-
|
|
5
|
-

|
|
6
|
-

|
|
7
|
-

|
|
8
|
-

|
|
9
|
-
|
|
10
|
-

|
|
11
|
-

|
|
12
|
-

|
|
13
|
-

|
|
14
|
-
|
|
15
|
-
**Modern • Accessible • Production Ready**
|
|
16
|
-
|
|
17
|
-
_A comprehensive collection of 60+ beautifully crafted React components built on [Radix UI](https://www.radix-ui.com/) primitives, designed for modern applications that demand both beauty and performance._
|
|
18
|
-
|
|
19
|
-
[🚀 Get Started](#-quick-start) • [📖 Documentation](#-component-catalog) • [🎨 Storybook](https://storybook.arolariu.ro) • [💡 Examples](#-usage-examples) • [🤝 Contributing](#-contributing)
|
|
20
|
-
|
|
21
|
-
</div>
|
|
22
|
-
|
|
23
|
-
---
|
|
24
|
-
|
|
25
|
-
## 🎯 Why Choose @arolariu/components?
|
|
26
|
-
|
|
27
|
-
**For Developers Who Care About Quality**
|
|
28
|
-
|
|
29
|
-
- **🎨 Beautiful by Default** - Carefully designed components that look great out of the box
|
|
30
|
-
- **♿ Accessibility First** - Built on Radix UI primitives with WAI-ARIA compliance
|
|
31
|
-
- **⚡ Performance Optimized** - Tree-shakeable, minimal bundle impact, source maps included
|
|
32
|
-
- **🔧 Developer Experience** - Full TypeScript support, comprehensive docs, and debugging tools
|
|
33
|
-
- **🎭 Flexible Styling** - Tailwind CSS integration with easy customization
|
|
34
|
-
- **🚀 Modern Stack** - React 18/19, ESM
|
|
35
|
-
|
|
36
|
-
**Perfect for building modern web applications, design systems, and prototypes.**
|
|
37
|
-
|
|
38
|
-
## � Quick Start
|
|
39
|
-
|
|
40
|
-
Get up and running with @arolariu/components in under 2 minutes!
|
|
41
|
-
|
|
42
|
-
### Installation
|
|
43
|
-
|
|
44
|
-
```bash
|
|
45
|
-
# npm
|
|
46
|
-
npm install @arolariu/components
|
|
47
|
-
|
|
48
|
-
# yarn
|
|
49
|
-
yarn add @arolariu/components
|
|
50
|
-
|
|
51
|
-
# pnpm
|
|
52
|
-
pnpm add @arolariu/components
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
### Basic Setup
|
|
56
|
-
|
|
57
|
-
```tsx
|
|
58
|
-
// 1. Import the component you need
|
|
59
|
-
import { Button } from "@arolariu/components/button";
|
|
60
|
-
import {
|
|
61
|
-
Card,
|
|
62
|
-
CardHeader,
|
|
63
|
-
CardTitle,
|
|
64
|
-
CardContent,
|
|
65
|
-
} from "@arolariu/components/card";
|
|
66
|
-
|
|
67
|
-
// 2. Use it in your React component
|
|
68
|
-
export default function MyApp() {
|
|
69
|
-
return (
|
|
70
|
-
<Card className="w-96">
|
|
71
|
-
<CardHeader>
|
|
72
|
-
<CardTitle>Welcome to @arolariu/components!</CardTitle>
|
|
73
|
-
</CardHeader>
|
|
74
|
-
<CardContent>
|
|
75
|
-
<Button>Get Started</Button>
|
|
76
|
-
</CardContent>
|
|
77
|
-
</Card>
|
|
78
|
-
);
|
|
79
|
-
}
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
### Add Styles (Required)
|
|
83
|
-
|
|
84
|
-
```tsx
|
|
85
|
-
// Import the CSS in your app's entry point (e.g., main.tsx, _app.tsx)
|
|
86
|
-
import "@arolariu/components/styles";
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
**That's it!** 🎉 You're ready to build beautiful UIs.
|
|
90
|
-
|
|
91
|
-
---
|
|
92
|
-
|
|
93
|
-
## 📖 Component Catalog
|
|
94
|
-
|
|
95
|
-
Explore our comprehensive collection of **60+ components** organized by category:
|
|
96
|
-
|
|
97
|
-
### 🎨 Layout & Structure
|
|
98
|
-
|
|
99
|
-
| Component | Description | Import |
|
|
100
|
-
| --------------- | --------------------------------------- | ----------------------------------- |
|
|
101
|
-
| **Card** | Flexible container for grouping content | `@arolariu/components/card` |
|
|
102
|
-
| **AspectRatio** | Maintain consistent aspect ratios | `@arolariu/components/aspect-ratio` |
|
|
103
|
-
| **Separator** | Visual dividers for content sections | `@arolariu/components/separator` |
|
|
104
|
-
| **Resizable** | Split panes with resizable dividers | `@arolariu/components/resizable` |
|
|
105
|
-
|
|
106
|
-
### 🎭 Interactive Elements
|
|
107
|
-
|
|
108
|
-
| Component | Description | Import |
|
|
109
|
-
| ------------ | ----------------------------------------- | ------------------------------- |
|
|
110
|
-
| **Button** | Primary action triggers with variants | `@arolariu/components/button` |
|
|
111
|
-
| **Input** | Text input fields with validation support | `@arolariu/components/input` |
|
|
112
|
-
| **Checkbox** | Binary choice selections | `@arolariu/components/checkbox` |
|
|
113
|
-
| **Select** | Dropdown selection menus | `@arolariu/components/select` |
|
|
114
|
-
| **Slider** | Range input controls | `@arolariu/components/slider` |
|
|
115
|
-
|
|
116
|
-
### 🧭 Navigation
|
|
117
|
-
|
|
118
|
-
| Component | Description | Import |
|
|
119
|
-
| ------------------ | ------------------------------ | -------------------------------------- |
|
|
120
|
-
| **Tabs** | Tabbed content navigation | `@arolariu/components/tabs` |
|
|
121
|
-
| **Breadcrumb** | Hierarchical navigation trails | `@arolariu/components/breadcrumb` |
|
|
122
|
-
| **NavigationMenu** | Complex dropdown navigation | `@arolariu/components/navigation-menu` |
|
|
123
|
-
| **Sidebar** | Collapsible side navigation | `@arolariu/components/sidebar` |
|
|
124
|
-
|
|
125
|
-
### � Overlays & Dialogs
|
|
126
|
-
|
|
127
|
-
| Component | Description | Import |
|
|
128
|
-
| -------------- | ---------------------------------- | --------------------------------- |
|
|
129
|
-
| **Dialog** | Modal dialogs and confirmations | `@arolariu/components/dialog` |
|
|
130
|
-
| **Sheet** | Slide-out panels from screen edges | `@arolariu/components/sheet` |
|
|
131
|
-
| **Popover** | Floating content containers | `@arolariu/components/popover` |
|
|
132
|
-
| **Tooltip** | Contextual information on hover | `@arolariu/components/tooltip` |
|
|
133
|
-
| **DropDrawer** | Advanced drawer with drop zones | `@arolariu/components/dropdrawer` |
|
|
134
|
-
|
|
135
|
-
### 📊 Data Display
|
|
136
|
-
|
|
137
|
-
| Component | Description | Import |
|
|
138
|
-
| ------------ | -------------------------------------- | ------------------------------- |
|
|
139
|
-
| **Table** | Data tables with sorting/pagination | `@arolariu/components/table` |
|
|
140
|
-
| **Calendar** | Date selection and navigation | `@arolariu/components/calendar` |
|
|
141
|
-
| **Avatar** | User profile pictures and placeholders | `@arolariu/components/avatar` |
|
|
142
|
-
| **Badge** | Status indicators and labels | `@arolariu/components/badge` |
|
|
143
|
-
| **Chart** | Data visualization components | `@arolariu/components/chart` |
|
|
144
|
-
|
|
145
|
-
### 🎪 Animated Backgrounds
|
|
146
|
-
|
|
147
|
-
| Component | Description | Import |
|
|
148
|
-
| ----------------------- | ------------------------------- | ------------------------------------------- |
|
|
149
|
-
| **DotBackground** | Animated dot matrix backgrounds | `@arolariu/components/dot-background` |
|
|
150
|
-
| **BubbleBackground** | Floating bubble animations | `@arolariu/components/bubble-background` |
|
|
151
|
-
| **FireworksBackground** | Particle explosion effects | `@arolariu/components/fireworks-background` |
|
|
152
|
-
| **GradientBackground** | Dynamic gradient animations | `@arolariu/components/gradient-background` |
|
|
153
|
-
|
|
154
|
-
### 🎛️ Form Controls
|
|
155
|
-
|
|
156
|
-
| Component | Description | Import |
|
|
157
|
-
| -------------- | ---------------------------------- | ---------------------------------- |
|
|
158
|
-
| **Form** | Form validation and management | `@arolariu/components/form` |
|
|
159
|
-
| **InputOTP** | One-time password input fields | `@arolariu/components/input-otp` |
|
|
160
|
-
| **RadioGroup** | Single-choice option groups | `@arolariu/components/radio-group` |
|
|
161
|
-
| **Switch** | Toggle switches for binary options | `@arolariu/components/switch` |
|
|
162
|
-
| **Textarea** | Multi-line text input areas | `@arolariu/components/textarea` |
|
|
163
|
-
|
|
164
|
-
### � Feedback & Status
|
|
165
|
-
|
|
166
|
-
| Component | Description | Import |
|
|
167
|
-
| ------------ | ------------------------------- | ------------------------------- |
|
|
168
|
-
| **Alert** | Important message notifications | `@arolariu/components/alert` |
|
|
169
|
-
| **Progress** | Task completion indicators | `@arolariu/components/progress` |
|
|
170
|
-
| **Skeleton** | Loading state placeholders | `@arolariu/components/skeleton` |
|
|
171
|
-
| **Sonner** | Toast notification system | `@arolariu/components/sonner` |
|
|
172
|
-
|
|
173
|
-
[**👀 View All Components**](https://storybook.arolariu.ro) in our interactive Storybook
|
|
174
|
-
|
|
175
|
-
---
|
|
176
|
-
|
|
177
|
-
## 💡 Usage Examples
|
|
178
|
-
|
|
179
|
-
### Building a Login Form
|
|
180
|
-
|
|
181
|
-
```tsx
|
|
182
|
-
import {
|
|
183
|
-
Card,
|
|
184
|
-
CardHeader,
|
|
185
|
-
CardTitle,
|
|
186
|
-
CardContent,
|
|
187
|
-
CardFooter,
|
|
188
|
-
} from "@arolariu/components/card";
|
|
189
|
-
import { Input } from "@arolariu/components/input";
|
|
190
|
-
import { Button } from "@arolariu/components/button";
|
|
191
|
-
import { Label } from "@arolariu/components/label";
|
|
192
|
-
|
|
193
|
-
export function LoginForm() {
|
|
194
|
-
return (
|
|
195
|
-
<Card className="w-96 mx-auto">
|
|
196
|
-
<CardHeader>
|
|
197
|
-
<CardTitle>Welcome Back</CardTitle>
|
|
198
|
-
</CardHeader>
|
|
199
|
-
<CardContent className="space-y-4">
|
|
200
|
-
<div>
|
|
201
|
-
<Label htmlFor="email">Email</Label>
|
|
202
|
-
<Input id="email" type="email" placeholder="you@example.com" />
|
|
203
|
-
</div>
|
|
204
|
-
<div>
|
|
205
|
-
<Label htmlFor="password">Password</Label>
|
|
206
|
-
<Input id="password" type="password" />
|
|
207
|
-
</div>
|
|
208
|
-
</CardContent>
|
|
209
|
-
<CardFooter>
|
|
210
|
-
<Button className="w-full">Sign In</Button>
|
|
211
|
-
</CardFooter>
|
|
212
|
-
</Card>
|
|
213
|
-
);
|
|
214
|
-
}
|
|
215
|
-
```
|
|
216
|
-
|
|
217
|
-
### Data Dashboard
|
|
218
|
-
|
|
219
|
-
```tsx
|
|
220
|
-
import {
|
|
221
|
-
Card,
|
|
222
|
-
CardHeader,
|
|
223
|
-
CardTitle,
|
|
224
|
-
CardContent,
|
|
225
|
-
} from "@arolariu/components/card";
|
|
226
|
-
import { Progress } from "@arolariu/components/progress";
|
|
227
|
-
import { Badge } from "@arolariu/components/badge";
|
|
228
|
-
import { Chart } from "@arolariu/components/chart";
|
|
229
|
-
|
|
230
|
-
export function Dashboard() {
|
|
231
|
-
return (
|
|
232
|
-
<div className="grid grid-cols-1 md:grid-cols-3 gap-6 p-6">
|
|
233
|
-
<Card>
|
|
234
|
-
<CardHeader>
|
|
235
|
-
<CardTitle className="flex items-center justify-between">
|
|
236
|
-
Sales <Badge variant="secondary">+12%</Badge>
|
|
237
|
-
</CardTitle>
|
|
238
|
-
</CardHeader>
|
|
239
|
-
<CardContent>
|
|
240
|
-
<Progress value={75} className="w-full" />
|
|
241
|
-
<p className="text-sm text-muted-foreground mt-2">
|
|
242
|
-
75% of monthly goal
|
|
243
|
-
</p>
|
|
244
|
-
</CardContent>
|
|
245
|
-
</Card>
|
|
246
|
-
|
|
247
|
-
<Card>
|
|
248
|
-
<CardHeader>
|
|
249
|
-
<CardTitle>Revenue</CardTitle>
|
|
250
|
-
</CardHeader>
|
|
251
|
-
<CardContent>
|
|
252
|
-
<Chart data={chartData} type="line" />
|
|
253
|
-
</CardContent>
|
|
254
|
-
</Card>
|
|
255
|
-
</div>
|
|
256
|
-
);
|
|
257
|
-
}
|
|
258
|
-
```
|
|
259
|
-
|
|
260
|
-
### Interactive Navigation
|
|
261
|
-
|
|
262
|
-
```tsx
|
|
263
|
-
import {
|
|
264
|
-
NavigationMenu,
|
|
265
|
-
NavigationMenuItem,
|
|
266
|
-
NavigationMenuList,
|
|
267
|
-
} from "@arolariu/components/navigation-menu";
|
|
268
|
-
import { Button } from "@arolariu/components/button";
|
|
269
|
-
import { Sheet, SheetContent, SheetTrigger } from "@arolariu/components/sheet";
|
|
270
|
-
import { MenuIcon } from "lucide-react";
|
|
271
|
-
|
|
272
|
-
export function AppHeader() {
|
|
273
|
-
return (
|
|
274
|
-
<header className="border-b">
|
|
275
|
-
<div className="container mx-auto px-4 py-2 flex items-center justify-between">
|
|
276
|
-
<h1 className="text-2xl font-bold">My App</h1>
|
|
277
|
-
|
|
278
|
-
{/* Desktop Navigation */}
|
|
279
|
-
<NavigationMenu className="hidden md:flex">
|
|
280
|
-
<NavigationMenuList>
|
|
281
|
-
<NavigationMenuItem>
|
|
282
|
-
<Button variant="ghost">Home</Button>
|
|
283
|
-
</NavigationMenuItem>
|
|
284
|
-
<NavigationMenuItem>
|
|
285
|
-
<Button variant="ghost">About</Button>
|
|
286
|
-
</NavigationMenuItem>
|
|
287
|
-
<NavigationMenuItem>
|
|
288
|
-
<Button variant="ghost">Contact</Button>
|
|
289
|
-
</NavigationMenuItem>
|
|
290
|
-
</NavigationMenuList>
|
|
291
|
-
</NavigationMenu>
|
|
292
|
-
|
|
293
|
-
{/* Mobile Navigation */}
|
|
294
|
-
<Sheet>
|
|
295
|
-
<SheetTrigger asChild>
|
|
296
|
-
<Button variant="ghost" size="icon" className="md:hidden">
|
|
297
|
-
<MenuIcon />
|
|
298
|
-
</Button>
|
|
299
|
-
</SheetTrigger>
|
|
300
|
-
<SheetContent>
|
|
301
|
-
<nav className="space-y-4">
|
|
302
|
-
<Button variant="ghost" className="w-full justify-start">
|
|
303
|
-
Home
|
|
304
|
-
</Button>
|
|
305
|
-
<Button variant="ghost" className="w-full justify-start">
|
|
306
|
-
About
|
|
307
|
-
</Button>
|
|
308
|
-
<Button variant="ghost" className="w-full justify-start">
|
|
309
|
-
Contact
|
|
310
|
-
</Button>
|
|
311
|
-
</nav>
|
|
312
|
-
</SheetContent>
|
|
313
|
-
</Sheet>
|
|
314
|
-
</div>
|
|
315
|
-
</header>
|
|
316
|
-
);
|
|
317
|
-
}
|
|
318
|
-
```
|
|
319
|
-
|
|
320
|
-
---
|
|
321
|
-
|
|
322
|
-
## 🛠️ Advanced Features
|
|
323
|
-
|
|
324
|
-
### Tree Shaking & Bundle Optimization
|
|
325
|
-
|
|
326
|
-
**@arolariu/components** is built with bundle optimization in mind:
|
|
327
|
-
|
|
328
|
-
```tsx
|
|
329
|
-
// ✅ Optimal: Import only what you need
|
|
330
|
-
import { Button } from "@arolariu/components/button";
|
|
331
|
-
import { Card } from "@arolariu/components/card";
|
|
332
|
-
|
|
333
|
-
// ❌ Avoid: Barrel imports increase bundle size
|
|
334
|
-
import { Button, Card } from "@arolariu/components";
|
|
335
|
-
```
|
|
336
|
-
|
|
337
|
-
**Bundle Impact:**
|
|
338
|
-
|
|
339
|
-
- Individual components: ~2-5KB gzipped
|
|
340
|
-
- Full library: ~150KB gzipped
|
|
341
|
-
- With tree shaking: Only pay for what you use
|
|
342
|
-
|
|
343
|
-
### TypeScript Integration
|
|
344
|
-
|
|
345
|
-
Full TypeScript support with intelligent autocomplete:
|
|
346
|
-
|
|
347
|
-
```tsx
|
|
348
|
-
import { Button, type ButtonProps } from "@arolariu/components/button";
|
|
349
|
-
import { type VariantProps } from "class-variance-authority";
|
|
350
|
-
|
|
351
|
-
// Get variant types for custom components
|
|
352
|
-
type ButtonVariant = VariantProps<typeof Button>["variant"];
|
|
353
|
-
|
|
354
|
-
interface CustomButtonProps extends ButtonProps {
|
|
355
|
-
icon?: React.ReactNode;
|
|
356
|
-
variant?: ButtonVariant;
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
export function CustomButton({ icon, children, ...props }: CustomButtonProps) {
|
|
360
|
-
return (
|
|
361
|
-
<Button {...props}>
|
|
362
|
-
{icon && <span className="mr-2">{icon}</span>}
|
|
363
|
-
{children}
|
|
364
|
-
</Button>
|
|
365
|
-
);
|
|
366
|
-
}
|
|
367
|
-
```
|
|
368
|
-
|
|
369
|
-
### Server-Side Rendering (SSR)
|
|
370
|
-
|
|
371
|
-
Compatible with **Next.js**, **Remix**, and other SSR frameworks:
|
|
372
|
-
|
|
373
|
-
```tsx
|
|
374
|
-
// app/page.tsx (Next.js App Router)
|
|
375
|
-
import { Card, CardContent } from "@arolariu/components/card";
|
|
376
|
-
import { Button } from "@arolariu/components/button";
|
|
377
|
-
|
|
378
|
-
export default function HomePage() {
|
|
379
|
-
return (
|
|
380
|
-
<Card>
|
|
381
|
-
<CardContent>
|
|
382
|
-
<Button>Server-rendered Button</Button>
|
|
383
|
-
</CardContent>
|
|
384
|
-
</Card>
|
|
385
|
-
);
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
// For client-side interactivity
|
|
389
|
-
("use client");
|
|
390
|
-
import { useState } from "react";
|
|
391
|
-
import {
|
|
392
|
-
Dialog,
|
|
393
|
-
DialogTrigger,
|
|
394
|
-
DialogContent,
|
|
395
|
-
} from "@arolariu/components/dialog";
|
|
396
|
-
|
|
397
|
-
export function InteractiveComponent() {
|
|
398
|
-
const [isOpen, setIsOpen] = useState(false);
|
|
399
|
-
|
|
400
|
-
return (
|
|
401
|
-
<Dialog open={isOpen} onOpenChange={setIsOpen}>
|
|
402
|
-
<DialogTrigger asChild>
|
|
403
|
-
<Button>Open Dialog</Button>
|
|
404
|
-
</DialogTrigger>
|
|
405
|
-
<DialogContent>
|
|
406
|
-
<p>This dialog requires client-side JavaScript!</p>
|
|
407
|
-
</DialogContent>
|
|
408
|
-
</Dialog>
|
|
409
|
-
);
|
|
410
|
-
}
|
|
411
|
-
```
|
|
412
|
-
|
|
413
|
-
### Theming & Customization
|
|
414
|
-
|
|
415
|
-
Built with **Tailwind CSS** for easy customization:
|
|
416
|
-
|
|
417
|
-
```tsx
|
|
418
|
-
// Custom theme configuration
|
|
419
|
-
import { Button } from "@arolariu/components/button";
|
|
420
|
-
|
|
421
|
-
// Override styles with Tailwind classes
|
|
422
|
-
<Button className="bg-purple-600 hover:bg-purple-700 text-white">
|
|
423
|
-
Custom Styled Button
|
|
424
|
-
</Button>;
|
|
425
|
-
|
|
426
|
-
// Or create your own variants
|
|
427
|
-
import { cva } from "class-variance-authority";
|
|
428
|
-
|
|
429
|
-
const customButtonVariants = cva(
|
|
430
|
-
"inline-flex items-center justify-center rounded-md font-medium transition-colors",
|
|
431
|
-
{
|
|
432
|
-
variants: {
|
|
433
|
-
variant: {
|
|
434
|
-
gradient:
|
|
435
|
-
"bg-gradient-to-r from-purple-500 to-pink-500 text-white hover:from-purple-600 hover:to-pink-600",
|
|
436
|
-
neon: "bg-black text-green-400 border border-green-400 hover:bg-green-400 hover:text-black",
|
|
437
|
-
},
|
|
438
|
-
},
|
|
439
|
-
},
|
|
440
|
-
);
|
|
441
|
-
```
|
|
442
|
-
|
|
443
|
-
---
|
|
444
|
-
|
|
445
|
-
## 🔍 Debugging & Development
|
|
446
|
-
|
|
447
|
-
### Complete Source Map Support
|
|
448
|
-
|
|
449
|
-
**Debug like a pro** with comprehensive development tools:
|
|
450
|
-
|
|
451
|
-
- ✅ **JavaScript source maps** for accurate debugging
|
|
452
|
-
- ✅ **CSS source maps** for Tailwind debugging
|
|
453
|
-
- ✅ **TypeScript declaration maps** for IDE IntelliSense
|
|
454
|
-
- ✅ **Original source access** via included `src/` directory
|
|
455
|
-
|
|
456
|
-
### Browser DevTools Integration
|
|
457
|
-
|
|
458
|
-
```tsx
|
|
459
|
-
// Components are easily debuggable in DevTools
|
|
460
|
-
import { Button } from "@arolariu/components/button";
|
|
461
|
-
|
|
462
|
-
function MyComponent() {
|
|
463
|
-
return <Button onClick={() => console.log("Clicked!")}>Debug Me</Button>;
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
// Set breakpoints in your original TypeScript code
|
|
467
|
-
// Stack traces point to exact source locations
|
|
468
|
-
// Inspect component props and state easily
|
|
469
|
-
```
|
|
470
|
-
|
|
471
|
-
📖 **[Full Debugging Guide](./DEBUGGING.md)** - Learn advanced debugging techniques
|
|
472
|
-
|
|
473
|
-
---
|
|
474
|
-
|
|
475
|
-
## 🌐 Browser Support
|
|
476
|
-
|
|
477
|
-
**Modern browsers only** for optimal performance:
|
|
478
|
-
|
|
479
|
-
| Browser | Version |
|
|
480
|
-
| ------------------ | ----------- |
|
|
481
|
-
| 🌟 **Chrome/Edge** | 90+ (2021+) |
|
|
482
|
-
| 🦊 **Firefox** | 88+ (2021+) |
|
|
483
|
-
| 🧭 **Safari** | 14+ (2020+) |
|
|
484
|
-
|
|
485
|
-
**Why modern browsers?** We use latest web standards for smaller bundles and better performance.
|
|
486
|
-
|
|
487
|
-
---
|
|
488
|
-
|
|
489
|
-
## 🤝 Contributing
|
|
490
|
-
|
|
491
|
-
We welcome contributions! Help make @arolariu/components even better.
|
|
492
|
-
|
|
493
|
-
### Quick Start for Contributors
|
|
494
|
-
|
|
495
|
-
```bash
|
|
496
|
-
# 1. Fork and clone the repository
|
|
497
|
-
git clone https://github.com/your-username/arolariu.ro.git
|
|
498
|
-
cd arolariu.ro/packages/components
|
|
499
|
-
|
|
500
|
-
# 2. Install dependencies
|
|
501
|
-
yarn install
|
|
502
|
-
|
|
503
|
-
# 3. Start development environment
|
|
504
|
-
yarn storybook # Launch Storybook at http://localhost:6006
|
|
505
|
-
yarn build # Build the library
|
|
506
|
-
|
|
507
|
-
# 4. Make your changes and test
|
|
508
|
-
yarn build # Ensure everything builds correctly
|
|
509
|
-
```
|
|
510
|
-
|
|
511
|
-
### Ways to Contribute
|
|
512
|
-
|
|
513
|
-
- 🐛 **Report bugs** - Found an issue? [Open an issue](https://github.com/arolariu/arolariu.ro/issues)
|
|
514
|
-
- 💡 **Suggest features** - Have an idea? We'd love to hear it!
|
|
515
|
-
- 🔧 **Fix issues** - Browse [open issues](https://github.com/arolariu/arolariu.ro/issues) and submit PRs
|
|
516
|
-
- 📖 **Improve docs** - Help make our documentation clearer
|
|
517
|
-
- 🎨 **Add components** - Contribute new components following our patterns
|
|
518
|
-
|
|
519
|
-
### Component Development Guidelines
|
|
520
|
-
|
|
521
|
-
1. **Follow accessibility standards** - Use Radix UI primitives when possible
|
|
522
|
-
2. **Include TypeScript types** - Full type definitions required
|
|
523
|
-
3. **Add Storybook stories** - Document all variants and use cases
|
|
524
|
-
4. **Write tests** - Ensure components work correctly
|
|
525
|
-
5. **Follow naming conventions** - Use clear, descriptive names
|
|
526
|
-
|
|
527
|
-
**[Read our full contributing guide →](./CONTRIBUTING.md)**
|
|
528
|
-
|
|
529
|
-
---
|
|
530
|
-
|
|
531
|
-
## 📦 Package Details
|
|
532
|
-
|
|
533
|
-
### Bundle Information
|
|
534
|
-
|
|
535
|
-
```bash
|
|
536
|
-
# Package size analysis
|
|
537
|
-
npm install @arolariu/components
|
|
538
|
-
npx bundlephobia @arolariu/components
|
|
539
|
-
```
|
|
540
|
-
|
|
541
|
-
**Key Stats:**
|
|
542
|
-
|
|
543
|
-
- � **Bundle size**: ~150KB (full library, gzipped)
|
|
544
|
-
- 🌲 **Tree-shakeable**: Import only what you need (2-5KB per component)
|
|
545
|
-
- 📝 **TypeScript**: 100% typed with declaration maps
|
|
546
|
-
- ♿ **Accessibility**: WAI-ARIA compliant via Radix UI
|
|
547
|
-
- 🎭 **Styling**: Tailwind CSS integration
|
|
548
|
-
- 📱 **Responsive**: Mobile-first design approach
|
|
549
|
-
|
|
550
|
-
### Dependencies
|
|
551
|
-
|
|
552
|
-
**Zero runtime dependencies** for end users! Built on top of:
|
|
553
|
-
|
|
554
|
-
- **Radix UI** - Accessible component primitives
|
|
555
|
-
- **Tailwind CSS** - Utility-first styling (peer dependency)
|
|
556
|
-
- **Motion** - Animation library (peer dependency)
|
|
557
|
-
- **React 18/19** - Modern React features (peer dependency)
|
|
558
|
-
|
|
559
|
-
---
|
|
560
|
-
|
|
561
|
-
## 📄 License
|
|
562
|
-
|
|
563
|
-
**MIT License** - Use freely in personal and commercial projects.
|
|
564
|
-
|
|
565
|
-
```
|
|
566
|
-
MIT License
|
|
567
|
-
|
|
568
|
-
Copyright (c) 2025 Alexandru-Razvan Olariu
|
|
569
|
-
|
|
570
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
571
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
572
|
-
in the Software without restriction, including without limitation the rights
|
|
573
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
574
|
-
copies of the Software...
|
|
575
|
-
```
|
|
576
|
-
|
|
577
|
-
[**View full license →**](./LICENSE)
|
|
578
|
-
|
|
579
|
-
---
|
|
580
|
-
|
|
581
|
-
## 👨💻 About the Author
|
|
582
|
-
|
|
583
|
-
**Alexandru-Razvan Olariu**
|
|
584
|
-
|
|
585
|
-
Senior Software Engineer passionate about creating beautiful, accessible user interfaces and developer tools.
|
|
586
|
-
|
|
587
|
-
- 🌐 **Website**: [arolariu.ro](https://arolariu.ro)
|
|
588
|
-
- 💻 **GitHub**: [@arolariu](https://github.com/arolariu)
|
|
589
|
-
- � **LinkedIn**: [Alexandru-Razvan Olariu](https://www.linkedin.com/in/olariu-alexandru/)
|
|
590
|
-
- 📧 **Email**: [admin@arolariu.ro](mailto:admin@arolariu.ro)
|
|
591
|
-
|
|
592
|
-
---
|
|
593
|
-
|
|
594
|
-
## 🙏 Acknowledgments & Inspiration
|
|
595
|
-
|
|
596
|
-
This library wouldn't exist without these amazing projects:
|
|
597
|
-
|
|
598
|
-
- 🎨 **[Radix UI](https://www.radix-ui.com/)** - Accessible component primitives
|
|
599
|
-
- 💫 **[shadcn/ui](https://ui.shadcn.com/)** - Component design patterns and inspiration
|
|
600
|
-
- 🎭 **[Tailwind CSS](https://tailwindcss.com/)** - Utility-first CSS framework
|
|
601
|
-
- ⚡ **[Motion](https://motion.dev/)** - Animation library for React
|
|
602
|
-
- 🛠️ **[Rslib](https://rslib.dev/)** - Fast, modern bundling with Rsbuild
|
|
603
|
-
- 📖 **[Storybook](https://storybook.js.org/)** - Component development environment
|
|
604
|
-
- 🎪 **[Magic UI](https://magicui.design/)** - Additional component inspiration
|
|
605
|
-
- ✨ **[Aceternity UI](https://ui.aceternity.com/)** - Creative component patterns
|
|
606
|
-
|
|
607
|
-
**Special thanks** to the open-source community for making all of this possible! 💜
|
|
608
|
-
|
|
609
|
-
---
|
|
610
|
-
|
|
611
|
-
<div align="center">
|
|
612
|
-
|
|
613
|
-
## ⭐ Star the Project
|
|
614
|
-
|
|
615
|
-
If **@arolariu/components** helps you build better UIs, please consider giving it a star on GitHub!
|
|
616
|
-
|
|
617
|
-
[](https://github.com/arolariu/arolariu.ro)
|
|
618
|
-
|
|
619
|
-
**[⭐ Star on GitHub](https://github.com/arolariu/arolariu.ro)** • **[📖 View Documentation](https://storybook.arolariu.ro)** • **[🐛 Report Issues](https://github.com/arolariu/arolariu.ro/issues)**
|
|
620
|
-
|
|
621
|
-
---
|
|
622
|
-
|
|
623
|
-
**Built with ❤️ for the React community**
|
|
624
|
-
|
|
625
|
-
_Making beautiful, accessible UIs easier to build, one component at a time._
|
|
626
|
-
|
|
627
|
-
</div>
|
|
1
|
+
# ✨ @arolariu/components
|
|
2
|
+
|
|
3
|
+
<div align="center">
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+

|
|
7
|
+

|
|
8
|
+

|
|
9
|
+
|
|
10
|
+

|
|
11
|
+

|
|
12
|
+

|
|
13
|
+

|
|
14
|
+
|
|
15
|
+
**Modern • Accessible • Production Ready**
|
|
16
|
+
|
|
17
|
+
_A comprehensive collection of 60+ beautifully crafted React components built on [Radix UI](https://www.radix-ui.com/) primitives, designed for modern applications that demand both beauty and performance._
|
|
18
|
+
|
|
19
|
+
[🚀 Get Started](#-quick-start) • [📖 Documentation](#-component-catalog) • [🎨 Storybook](https://storybook.arolariu.ro) • [💡 Examples](#-usage-examples) • [🤝 Contributing](#-contributing)
|
|
20
|
+
|
|
21
|
+
</div>
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 🎯 Why Choose @arolariu/components?
|
|
26
|
+
|
|
27
|
+
**For Developers Who Care About Quality**
|
|
28
|
+
|
|
29
|
+
- **🎨 Beautiful by Default** - Carefully designed components that look great out of the box
|
|
30
|
+
- **♿ Accessibility First** - Built on Radix UI primitives with WAI-ARIA compliance
|
|
31
|
+
- **⚡ Performance Optimized** - Tree-shakeable, minimal bundle impact, source maps included
|
|
32
|
+
- **🔧 Developer Experience** - Full TypeScript support, comprehensive docs, and debugging tools
|
|
33
|
+
- **🎭 Flexible Styling** - Tailwind CSS integration with easy customization
|
|
34
|
+
- **🚀 Modern Stack** - React 18/19, ESM, SSR compatible
|
|
35
|
+
|
|
36
|
+
**Perfect for building modern web applications, design systems, and prototypes.**
|
|
37
|
+
|
|
38
|
+
## � Quick Start
|
|
39
|
+
|
|
40
|
+
Get up and running with @arolariu/components in under 2 minutes!
|
|
41
|
+
|
|
42
|
+
### Installation
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
# npm
|
|
46
|
+
npm install @arolariu/components
|
|
47
|
+
|
|
48
|
+
# yarn
|
|
49
|
+
yarn add @arolariu/components
|
|
50
|
+
|
|
51
|
+
# pnpm
|
|
52
|
+
pnpm add @arolariu/components
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Basic Setup
|
|
56
|
+
|
|
57
|
+
```tsx
|
|
58
|
+
// 1. Import the component you need
|
|
59
|
+
import { Button } from "@arolariu/components/button";
|
|
60
|
+
import {
|
|
61
|
+
Card,
|
|
62
|
+
CardHeader,
|
|
63
|
+
CardTitle,
|
|
64
|
+
CardContent,
|
|
65
|
+
} from "@arolariu/components/card";
|
|
66
|
+
|
|
67
|
+
// 2. Use it in your React component
|
|
68
|
+
export default function MyApp() {
|
|
69
|
+
return (
|
|
70
|
+
<Card className="w-96">
|
|
71
|
+
<CardHeader>
|
|
72
|
+
<CardTitle>Welcome to @arolariu/components!</CardTitle>
|
|
73
|
+
</CardHeader>
|
|
74
|
+
<CardContent>
|
|
75
|
+
<Button>Get Started</Button>
|
|
76
|
+
</CardContent>
|
|
77
|
+
</Card>
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Add Styles (Required)
|
|
83
|
+
|
|
84
|
+
```tsx
|
|
85
|
+
// Import the CSS in your app's entry point (e.g., main.tsx, _app.tsx)
|
|
86
|
+
import "@arolariu/components/styles";
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
**That's it!** 🎉 You're ready to build beautiful UIs.
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## 📖 Component Catalog
|
|
94
|
+
|
|
95
|
+
Explore our comprehensive collection of **60+ components** organized by category:
|
|
96
|
+
|
|
97
|
+
### 🎨 Layout & Structure
|
|
98
|
+
|
|
99
|
+
| Component | Description | Import |
|
|
100
|
+
| --------------- | --------------------------------------- | ----------------------------------- |
|
|
101
|
+
| **Card** | Flexible container for grouping content | `@arolariu/components/card` |
|
|
102
|
+
| **AspectRatio** | Maintain consistent aspect ratios | `@arolariu/components/aspect-ratio` |
|
|
103
|
+
| **Separator** | Visual dividers for content sections | `@arolariu/components/separator` |
|
|
104
|
+
| **Resizable** | Split panes with resizable dividers | `@arolariu/components/resizable` |
|
|
105
|
+
|
|
106
|
+
### 🎭 Interactive Elements
|
|
107
|
+
|
|
108
|
+
| Component | Description | Import |
|
|
109
|
+
| ------------ | ----------------------------------------- | ------------------------------- |
|
|
110
|
+
| **Button** | Primary action triggers with variants | `@arolariu/components/button` |
|
|
111
|
+
| **Input** | Text input fields with validation support | `@arolariu/components/input` |
|
|
112
|
+
| **Checkbox** | Binary choice selections | `@arolariu/components/checkbox` |
|
|
113
|
+
| **Select** | Dropdown selection menus | `@arolariu/components/select` |
|
|
114
|
+
| **Slider** | Range input controls | `@arolariu/components/slider` |
|
|
115
|
+
|
|
116
|
+
### 🧭 Navigation
|
|
117
|
+
|
|
118
|
+
| Component | Description | Import |
|
|
119
|
+
| ------------------ | ------------------------------ | -------------------------------------- |
|
|
120
|
+
| **Tabs** | Tabbed content navigation | `@arolariu/components/tabs` |
|
|
121
|
+
| **Breadcrumb** | Hierarchical navigation trails | `@arolariu/components/breadcrumb` |
|
|
122
|
+
| **NavigationMenu** | Complex dropdown navigation | `@arolariu/components/navigation-menu` |
|
|
123
|
+
| **Sidebar** | Collapsible side navigation | `@arolariu/components/sidebar` |
|
|
124
|
+
|
|
125
|
+
### � Overlays & Dialogs
|
|
126
|
+
|
|
127
|
+
| Component | Description | Import |
|
|
128
|
+
| -------------- | ---------------------------------- | --------------------------------- |
|
|
129
|
+
| **Dialog** | Modal dialogs and confirmations | `@arolariu/components/dialog` |
|
|
130
|
+
| **Sheet** | Slide-out panels from screen edges | `@arolariu/components/sheet` |
|
|
131
|
+
| **Popover** | Floating content containers | `@arolariu/components/popover` |
|
|
132
|
+
| **Tooltip** | Contextual information on hover | `@arolariu/components/tooltip` |
|
|
133
|
+
| **DropDrawer** | Advanced drawer with drop zones | `@arolariu/components/dropdrawer` |
|
|
134
|
+
|
|
135
|
+
### 📊 Data Display
|
|
136
|
+
|
|
137
|
+
| Component | Description | Import |
|
|
138
|
+
| ------------ | -------------------------------------- | ------------------------------- |
|
|
139
|
+
| **Table** | Data tables with sorting/pagination | `@arolariu/components/table` |
|
|
140
|
+
| **Calendar** | Date selection and navigation | `@arolariu/components/calendar` |
|
|
141
|
+
| **Avatar** | User profile pictures and placeholders | `@arolariu/components/avatar` |
|
|
142
|
+
| **Badge** | Status indicators and labels | `@arolariu/components/badge` |
|
|
143
|
+
| **Chart** | Data visualization components | `@arolariu/components/chart` |
|
|
144
|
+
|
|
145
|
+
### 🎪 Animated Backgrounds
|
|
146
|
+
|
|
147
|
+
| Component | Description | Import |
|
|
148
|
+
| ----------------------- | ------------------------------- | ------------------------------------------- |
|
|
149
|
+
| **DotBackground** | Animated dot matrix backgrounds | `@arolariu/components/dot-background` |
|
|
150
|
+
| **BubbleBackground** | Floating bubble animations | `@arolariu/components/bubble-background` |
|
|
151
|
+
| **FireworksBackground** | Particle explosion effects | `@arolariu/components/fireworks-background` |
|
|
152
|
+
| **GradientBackground** | Dynamic gradient animations | `@arolariu/components/gradient-background` |
|
|
153
|
+
|
|
154
|
+
### 🎛️ Form Controls
|
|
155
|
+
|
|
156
|
+
| Component | Description | Import |
|
|
157
|
+
| -------------- | ---------------------------------- | ---------------------------------- |
|
|
158
|
+
| **Form** | Form validation and management | `@arolariu/components/form` |
|
|
159
|
+
| **InputOTP** | One-time password input fields | `@arolariu/components/input-otp` |
|
|
160
|
+
| **RadioGroup** | Single-choice option groups | `@arolariu/components/radio-group` |
|
|
161
|
+
| **Switch** | Toggle switches for binary options | `@arolariu/components/switch` |
|
|
162
|
+
| **Textarea** | Multi-line text input areas | `@arolariu/components/textarea` |
|
|
163
|
+
|
|
164
|
+
### � Feedback & Status
|
|
165
|
+
|
|
166
|
+
| Component | Description | Import |
|
|
167
|
+
| ------------ | ------------------------------- | ------------------------------- |
|
|
168
|
+
| **Alert** | Important message notifications | `@arolariu/components/alert` |
|
|
169
|
+
| **Progress** | Task completion indicators | `@arolariu/components/progress` |
|
|
170
|
+
| **Skeleton** | Loading state placeholders | `@arolariu/components/skeleton` |
|
|
171
|
+
| **Sonner** | Toast notification system | `@arolariu/components/sonner` |
|
|
172
|
+
|
|
173
|
+
[**👀 View All Components**](https://storybook.arolariu.ro) in our interactive Storybook
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## 💡 Usage Examples
|
|
178
|
+
|
|
179
|
+
### Building a Login Form
|
|
180
|
+
|
|
181
|
+
```tsx
|
|
182
|
+
import {
|
|
183
|
+
Card,
|
|
184
|
+
CardHeader,
|
|
185
|
+
CardTitle,
|
|
186
|
+
CardContent,
|
|
187
|
+
CardFooter,
|
|
188
|
+
} from "@arolariu/components/card";
|
|
189
|
+
import { Input } from "@arolariu/components/input";
|
|
190
|
+
import { Button } from "@arolariu/components/button";
|
|
191
|
+
import { Label } from "@arolariu/components/label";
|
|
192
|
+
|
|
193
|
+
export function LoginForm() {
|
|
194
|
+
return (
|
|
195
|
+
<Card className="w-96 mx-auto">
|
|
196
|
+
<CardHeader>
|
|
197
|
+
<CardTitle>Welcome Back</CardTitle>
|
|
198
|
+
</CardHeader>
|
|
199
|
+
<CardContent className="space-y-4">
|
|
200
|
+
<div>
|
|
201
|
+
<Label htmlFor="email">Email</Label>
|
|
202
|
+
<Input id="email" type="email" placeholder="you@example.com" />
|
|
203
|
+
</div>
|
|
204
|
+
<div>
|
|
205
|
+
<Label htmlFor="password">Password</Label>
|
|
206
|
+
<Input id="password" type="password" />
|
|
207
|
+
</div>
|
|
208
|
+
</CardContent>
|
|
209
|
+
<CardFooter>
|
|
210
|
+
<Button className="w-full">Sign In</Button>
|
|
211
|
+
</CardFooter>
|
|
212
|
+
</Card>
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### Data Dashboard
|
|
218
|
+
|
|
219
|
+
```tsx
|
|
220
|
+
import {
|
|
221
|
+
Card,
|
|
222
|
+
CardHeader,
|
|
223
|
+
CardTitle,
|
|
224
|
+
CardContent,
|
|
225
|
+
} from "@arolariu/components/card";
|
|
226
|
+
import { Progress } from "@arolariu/components/progress";
|
|
227
|
+
import { Badge } from "@arolariu/components/badge";
|
|
228
|
+
import { Chart } from "@arolariu/components/chart";
|
|
229
|
+
|
|
230
|
+
export function Dashboard() {
|
|
231
|
+
return (
|
|
232
|
+
<div className="grid grid-cols-1 md:grid-cols-3 gap-6 p-6">
|
|
233
|
+
<Card>
|
|
234
|
+
<CardHeader>
|
|
235
|
+
<CardTitle className="flex items-center justify-between">
|
|
236
|
+
Sales <Badge variant="secondary">+12%</Badge>
|
|
237
|
+
</CardTitle>
|
|
238
|
+
</CardHeader>
|
|
239
|
+
<CardContent>
|
|
240
|
+
<Progress value={75} className="w-full" />
|
|
241
|
+
<p className="text-sm text-muted-foreground mt-2">
|
|
242
|
+
75% of monthly goal
|
|
243
|
+
</p>
|
|
244
|
+
</CardContent>
|
|
245
|
+
</Card>
|
|
246
|
+
|
|
247
|
+
<Card>
|
|
248
|
+
<CardHeader>
|
|
249
|
+
<CardTitle>Revenue</CardTitle>
|
|
250
|
+
</CardHeader>
|
|
251
|
+
<CardContent>
|
|
252
|
+
<Chart data={chartData} type="line" />
|
|
253
|
+
</CardContent>
|
|
254
|
+
</Card>
|
|
255
|
+
</div>
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
### Interactive Navigation
|
|
261
|
+
|
|
262
|
+
```tsx
|
|
263
|
+
import {
|
|
264
|
+
NavigationMenu,
|
|
265
|
+
NavigationMenuItem,
|
|
266
|
+
NavigationMenuList,
|
|
267
|
+
} from "@arolariu/components/navigation-menu";
|
|
268
|
+
import { Button } from "@arolariu/components/button";
|
|
269
|
+
import { Sheet, SheetContent, SheetTrigger } from "@arolariu/components/sheet";
|
|
270
|
+
import { MenuIcon } from "lucide-react";
|
|
271
|
+
|
|
272
|
+
export function AppHeader() {
|
|
273
|
+
return (
|
|
274
|
+
<header className="border-b">
|
|
275
|
+
<div className="container mx-auto px-4 py-2 flex items-center justify-between">
|
|
276
|
+
<h1 className="text-2xl font-bold">My App</h1>
|
|
277
|
+
|
|
278
|
+
{/* Desktop Navigation */}
|
|
279
|
+
<NavigationMenu className="hidden md:flex">
|
|
280
|
+
<NavigationMenuList>
|
|
281
|
+
<NavigationMenuItem>
|
|
282
|
+
<Button variant="ghost">Home</Button>
|
|
283
|
+
</NavigationMenuItem>
|
|
284
|
+
<NavigationMenuItem>
|
|
285
|
+
<Button variant="ghost">About</Button>
|
|
286
|
+
</NavigationMenuItem>
|
|
287
|
+
<NavigationMenuItem>
|
|
288
|
+
<Button variant="ghost">Contact</Button>
|
|
289
|
+
</NavigationMenuItem>
|
|
290
|
+
</NavigationMenuList>
|
|
291
|
+
</NavigationMenu>
|
|
292
|
+
|
|
293
|
+
{/* Mobile Navigation */}
|
|
294
|
+
<Sheet>
|
|
295
|
+
<SheetTrigger asChild>
|
|
296
|
+
<Button variant="ghost" size="icon" className="md:hidden">
|
|
297
|
+
<MenuIcon />
|
|
298
|
+
</Button>
|
|
299
|
+
</SheetTrigger>
|
|
300
|
+
<SheetContent>
|
|
301
|
+
<nav className="space-y-4">
|
|
302
|
+
<Button variant="ghost" className="w-full justify-start">
|
|
303
|
+
Home
|
|
304
|
+
</Button>
|
|
305
|
+
<Button variant="ghost" className="w-full justify-start">
|
|
306
|
+
About
|
|
307
|
+
</Button>
|
|
308
|
+
<Button variant="ghost" className="w-full justify-start">
|
|
309
|
+
Contact
|
|
310
|
+
</Button>
|
|
311
|
+
</nav>
|
|
312
|
+
</SheetContent>
|
|
313
|
+
</Sheet>
|
|
314
|
+
</div>
|
|
315
|
+
</header>
|
|
316
|
+
);
|
|
317
|
+
}
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
---
|
|
321
|
+
|
|
322
|
+
## 🛠️ Advanced Features
|
|
323
|
+
|
|
324
|
+
### Tree Shaking & Bundle Optimization
|
|
325
|
+
|
|
326
|
+
**@arolariu/components** is built with bundle optimization in mind:
|
|
327
|
+
|
|
328
|
+
```tsx
|
|
329
|
+
// ✅ Optimal: Import only what you need
|
|
330
|
+
import { Button } from "@arolariu/components/button";
|
|
331
|
+
import { Card } from "@arolariu/components/card";
|
|
332
|
+
|
|
333
|
+
// ❌ Avoid: Barrel imports increase bundle size
|
|
334
|
+
import { Button, Card } from "@arolariu/components";
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
**Bundle Impact:**
|
|
338
|
+
|
|
339
|
+
- Individual components: ~2-5KB gzipped
|
|
340
|
+
- Full library: ~150KB gzipped
|
|
341
|
+
- With tree shaking: Only pay for what you use
|
|
342
|
+
|
|
343
|
+
### TypeScript Integration
|
|
344
|
+
|
|
345
|
+
Full TypeScript support with intelligent autocomplete:
|
|
346
|
+
|
|
347
|
+
```tsx
|
|
348
|
+
import { Button, type ButtonProps } from "@arolariu/components/button";
|
|
349
|
+
import { type VariantProps } from "class-variance-authority";
|
|
350
|
+
|
|
351
|
+
// Get variant types for custom components
|
|
352
|
+
type ButtonVariant = VariantProps<typeof Button>["variant"];
|
|
353
|
+
|
|
354
|
+
interface CustomButtonProps extends ButtonProps {
|
|
355
|
+
icon?: React.ReactNode;
|
|
356
|
+
variant?: ButtonVariant;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
export function CustomButton({ icon, children, ...props }: CustomButtonProps) {
|
|
360
|
+
return (
|
|
361
|
+
<Button {...props}>
|
|
362
|
+
{icon && <span className="mr-2">{icon}</span>}
|
|
363
|
+
{children}
|
|
364
|
+
</Button>
|
|
365
|
+
);
|
|
366
|
+
}
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
### Server-Side Rendering (SSR)
|
|
370
|
+
|
|
371
|
+
Compatible with **Next.js**, **Remix**, and other SSR frameworks:
|
|
372
|
+
|
|
373
|
+
```tsx
|
|
374
|
+
// app/page.tsx (Next.js App Router)
|
|
375
|
+
import { Card, CardContent } from "@arolariu/components/card";
|
|
376
|
+
import { Button } from "@arolariu/components/button";
|
|
377
|
+
|
|
378
|
+
export default function HomePage() {
|
|
379
|
+
return (
|
|
380
|
+
<Card>
|
|
381
|
+
<CardContent>
|
|
382
|
+
<Button>Server-rendered Button</Button>
|
|
383
|
+
</CardContent>
|
|
384
|
+
</Card>
|
|
385
|
+
);
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
// For client-side interactivity
|
|
389
|
+
("use client");
|
|
390
|
+
import { useState } from "react";
|
|
391
|
+
import {
|
|
392
|
+
Dialog,
|
|
393
|
+
DialogTrigger,
|
|
394
|
+
DialogContent,
|
|
395
|
+
} from "@arolariu/components/dialog";
|
|
396
|
+
|
|
397
|
+
export function InteractiveComponent() {
|
|
398
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
399
|
+
|
|
400
|
+
return (
|
|
401
|
+
<Dialog open={isOpen} onOpenChange={setIsOpen}>
|
|
402
|
+
<DialogTrigger asChild>
|
|
403
|
+
<Button>Open Dialog</Button>
|
|
404
|
+
</DialogTrigger>
|
|
405
|
+
<DialogContent>
|
|
406
|
+
<p>This dialog requires client-side JavaScript!</p>
|
|
407
|
+
</DialogContent>
|
|
408
|
+
</Dialog>
|
|
409
|
+
);
|
|
410
|
+
}
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
### Theming & Customization
|
|
414
|
+
|
|
415
|
+
Built with **Tailwind CSS** for easy customization:
|
|
416
|
+
|
|
417
|
+
```tsx
|
|
418
|
+
// Custom theme configuration
|
|
419
|
+
import { Button } from "@arolariu/components/button";
|
|
420
|
+
|
|
421
|
+
// Override styles with Tailwind classes
|
|
422
|
+
<Button className="bg-purple-600 hover:bg-purple-700 text-white">
|
|
423
|
+
Custom Styled Button
|
|
424
|
+
</Button>;
|
|
425
|
+
|
|
426
|
+
// Or create your own variants
|
|
427
|
+
import { cva } from "class-variance-authority";
|
|
428
|
+
|
|
429
|
+
const customButtonVariants = cva(
|
|
430
|
+
"inline-flex items-center justify-center rounded-md font-medium transition-colors",
|
|
431
|
+
{
|
|
432
|
+
variants: {
|
|
433
|
+
variant: {
|
|
434
|
+
gradient:
|
|
435
|
+
"bg-gradient-to-r from-purple-500 to-pink-500 text-white hover:from-purple-600 hover:to-pink-600",
|
|
436
|
+
neon: "bg-black text-green-400 border border-green-400 hover:bg-green-400 hover:text-black",
|
|
437
|
+
},
|
|
438
|
+
},
|
|
439
|
+
},
|
|
440
|
+
);
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
---
|
|
444
|
+
|
|
445
|
+
## 🔍 Debugging & Development
|
|
446
|
+
|
|
447
|
+
### Complete Source Map Support
|
|
448
|
+
|
|
449
|
+
**Debug like a pro** with comprehensive development tools:
|
|
450
|
+
|
|
451
|
+
- ✅ **JavaScript source maps** for accurate debugging
|
|
452
|
+
- ✅ **CSS source maps** for Tailwind debugging
|
|
453
|
+
- ✅ **TypeScript declaration maps** for IDE IntelliSense
|
|
454
|
+
- ✅ **Original source access** via included `src/` directory
|
|
455
|
+
|
|
456
|
+
### Browser DevTools Integration
|
|
457
|
+
|
|
458
|
+
```tsx
|
|
459
|
+
// Components are easily debuggable in DevTools
|
|
460
|
+
import { Button } from "@arolariu/components/button";
|
|
461
|
+
|
|
462
|
+
function MyComponent() {
|
|
463
|
+
return <Button onClick={() => console.log("Clicked!")}>Debug Me</Button>;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
// Set breakpoints in your original TypeScript code
|
|
467
|
+
// Stack traces point to exact source locations
|
|
468
|
+
// Inspect component props and state easily
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
📖 **[Full Debugging Guide](./DEBUGGING.md)** - Learn advanced debugging techniques
|
|
472
|
+
|
|
473
|
+
---
|
|
474
|
+
|
|
475
|
+
## 🌐 Browser Support
|
|
476
|
+
|
|
477
|
+
**Modern browsers only** for optimal performance:
|
|
478
|
+
|
|
479
|
+
| Browser | Version |
|
|
480
|
+
| ------------------ | ----------- |
|
|
481
|
+
| 🌟 **Chrome/Edge** | 90+ (2021+) |
|
|
482
|
+
| 🦊 **Firefox** | 88+ (2021+) |
|
|
483
|
+
| 🧭 **Safari** | 14+ (2020+) |
|
|
484
|
+
|
|
485
|
+
**Why modern browsers?** We use latest web standards for smaller bundles and better performance.
|
|
486
|
+
|
|
487
|
+
---
|
|
488
|
+
|
|
489
|
+
## 🤝 Contributing
|
|
490
|
+
|
|
491
|
+
We welcome contributions! Help make @arolariu/components even better.
|
|
492
|
+
|
|
493
|
+
### Quick Start for Contributors
|
|
494
|
+
|
|
495
|
+
```bash
|
|
496
|
+
# 1. Fork and clone the repository
|
|
497
|
+
git clone https://github.com/your-username/arolariu.ro.git
|
|
498
|
+
cd arolariu.ro/packages/components
|
|
499
|
+
|
|
500
|
+
# 2. Install dependencies
|
|
501
|
+
yarn install
|
|
502
|
+
|
|
503
|
+
# 3. Start development environment
|
|
504
|
+
yarn storybook # Launch Storybook at http://localhost:6006
|
|
505
|
+
yarn build # Build the library
|
|
506
|
+
|
|
507
|
+
# 4. Make your changes and test
|
|
508
|
+
yarn build # Ensure everything builds correctly
|
|
509
|
+
```
|
|
510
|
+
|
|
511
|
+
### Ways to Contribute
|
|
512
|
+
|
|
513
|
+
- 🐛 **Report bugs** - Found an issue? [Open an issue](https://github.com/arolariu/arolariu.ro/issues)
|
|
514
|
+
- 💡 **Suggest features** - Have an idea? We'd love to hear it!
|
|
515
|
+
- 🔧 **Fix issues** - Browse [open issues](https://github.com/arolariu/arolariu.ro/issues) and submit PRs
|
|
516
|
+
- 📖 **Improve docs** - Help make our documentation clearer
|
|
517
|
+
- 🎨 **Add components** - Contribute new components following our patterns
|
|
518
|
+
|
|
519
|
+
### Component Development Guidelines
|
|
520
|
+
|
|
521
|
+
1. **Follow accessibility standards** - Use Radix UI primitives when possible
|
|
522
|
+
2. **Include TypeScript types** - Full type definitions required
|
|
523
|
+
3. **Add Storybook stories** - Document all variants and use cases
|
|
524
|
+
4. **Write tests** - Ensure components work correctly
|
|
525
|
+
5. **Follow naming conventions** - Use clear, descriptive names
|
|
526
|
+
|
|
527
|
+
**[Read our full contributing guide →](./CONTRIBUTING.md)**
|
|
528
|
+
|
|
529
|
+
---
|
|
530
|
+
|
|
531
|
+
## 📦 Package Details
|
|
532
|
+
|
|
533
|
+
### Bundle Information
|
|
534
|
+
|
|
535
|
+
```bash
|
|
536
|
+
# Package size analysis
|
|
537
|
+
npm install @arolariu/components
|
|
538
|
+
npx bundlephobia @arolariu/components
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
**Key Stats:**
|
|
542
|
+
|
|
543
|
+
- � **Bundle size**: ~150KB (full library, gzipped)
|
|
544
|
+
- 🌲 **Tree-shakeable**: Import only what you need (2-5KB per component)
|
|
545
|
+
- 📝 **TypeScript**: 100% typed with declaration maps
|
|
546
|
+
- ♿ **Accessibility**: WAI-ARIA compliant via Radix UI
|
|
547
|
+
- 🎭 **Styling**: Tailwind CSS integration
|
|
548
|
+
- 📱 **Responsive**: Mobile-first design approach
|
|
549
|
+
|
|
550
|
+
### Dependencies
|
|
551
|
+
|
|
552
|
+
**Zero runtime dependencies** for end users! Built on top of:
|
|
553
|
+
|
|
554
|
+
- **Radix UI** - Accessible component primitives
|
|
555
|
+
- **Tailwind CSS** - Utility-first styling (peer dependency)
|
|
556
|
+
- **Motion** - Animation library (peer dependency)
|
|
557
|
+
- **React 18/19** - Modern React features (peer dependency)
|
|
558
|
+
|
|
559
|
+
---
|
|
560
|
+
|
|
561
|
+
## 📄 License
|
|
562
|
+
|
|
563
|
+
**MIT License** - Use freely in personal and commercial projects.
|
|
564
|
+
|
|
565
|
+
```
|
|
566
|
+
MIT License
|
|
567
|
+
|
|
568
|
+
Copyright (c) 2025 Alexandru-Razvan Olariu
|
|
569
|
+
|
|
570
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
571
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
572
|
+
in the Software without restriction, including without limitation the rights
|
|
573
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
574
|
+
copies of the Software...
|
|
575
|
+
```
|
|
576
|
+
|
|
577
|
+
[**View full license →**](./LICENSE)
|
|
578
|
+
|
|
579
|
+
---
|
|
580
|
+
|
|
581
|
+
## 👨💻 About the Author
|
|
582
|
+
|
|
583
|
+
**Alexandru-Razvan Olariu**
|
|
584
|
+
|
|
585
|
+
Senior Software Engineer passionate about creating beautiful, accessible user interfaces and developer tools.
|
|
586
|
+
|
|
587
|
+
- 🌐 **Website**: [arolariu.ro](https://arolariu.ro)
|
|
588
|
+
- 💻 **GitHub**: [@arolariu](https://github.com/arolariu)
|
|
589
|
+
- � **LinkedIn**: [Alexandru-Razvan Olariu](https://www.linkedin.com/in/olariu-alexandru/)
|
|
590
|
+
- 📧 **Email**: [admin@arolariu.ro](mailto:admin@arolariu.ro)
|
|
591
|
+
|
|
592
|
+
---
|
|
593
|
+
|
|
594
|
+
## 🙏 Acknowledgments & Inspiration
|
|
595
|
+
|
|
596
|
+
This library wouldn't exist without these amazing projects:
|
|
597
|
+
|
|
598
|
+
- 🎨 **[Radix UI](https://www.radix-ui.com/)** - Accessible component primitives
|
|
599
|
+
- 💫 **[shadcn/ui](https://ui.shadcn.com/)** - Component design patterns and inspiration
|
|
600
|
+
- 🎭 **[Tailwind CSS](https://tailwindcss.com/)** - Utility-first CSS framework
|
|
601
|
+
- ⚡ **[Motion](https://motion.dev/)** - Animation library for React
|
|
602
|
+
- 🛠️ **[Rslib](https://rslib.dev/)** - Fast, modern bundling with Rsbuild
|
|
603
|
+
- 📖 **[Storybook](https://storybook.js.org/)** - Component development environment
|
|
604
|
+
- 🎪 **[Magic UI](https://magicui.design/)** - Additional component inspiration
|
|
605
|
+
- ✨ **[Aceternity UI](https://ui.aceternity.com/)** - Creative component patterns
|
|
606
|
+
|
|
607
|
+
**Special thanks** to the open-source community for making all of this possible! 💜
|
|
608
|
+
|
|
609
|
+
---
|
|
610
|
+
|
|
611
|
+
<div align="center">
|
|
612
|
+
|
|
613
|
+
## ⭐ Star the Project
|
|
614
|
+
|
|
615
|
+
If **@arolariu/components** helps you build better UIs, please consider giving it a star on GitHub!
|
|
616
|
+
|
|
617
|
+
[](https://github.com/arolariu/arolariu.ro)
|
|
618
|
+
|
|
619
|
+
**[⭐ Star on GitHub](https://github.com/arolariu/arolariu.ro)** • **[📖 View Documentation](https://storybook.arolariu.ro)** • **[🐛 Report Issues](https://github.com/arolariu/arolariu.ro/issues)**
|
|
620
|
+
|
|
621
|
+
---
|
|
622
|
+
|
|
623
|
+
**Built with ❤️ for the React community**
|
|
624
|
+
|
|
625
|
+
_Making beautiful, accessible UIs easier to build, one component at a time._
|
|
626
|
+
|
|
627
|
+
</div>
|