erp-pro-ui 0.1.1 → 0.1.2
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/README.md +512 -288
- package/dist/accordion.cjs +1 -1
- package/dist/accordion.mjs +1 -1
- package/dist/alert.cjs +1 -1
- package/dist/alert.mjs +1 -1
- package/dist/ascii-text.cjs +1 -1
- package/dist/ascii-text.mjs +1 -1
- package/dist/button.cjs +1 -1
- package/dist/button.mjs +1 -1
- package/dist/card.cjs +1 -1
- package/dist/card.mjs +1 -1
- package/dist/carousel.cjs +1 -1
- package/dist/carousel.mjs +1 -1
- package/dist/catalog.cjs +6 -0
- package/dist/catalog.cjs.map +1 -1
- package/dist/catalog.d.ts +11 -1
- package/dist/catalog.d.ts.map +1 -1
- package/dist/catalog.mjs +6 -0
- package/dist/catalog.mjs.map +1 -1
- package/dist/charts.cjs +4 -1
- package/dist/charts.mjs +2 -2
- package/dist/checkbox.cjs +1 -1
- package/dist/checkbox.mjs +1 -1
- package/dist/chip.cjs +1 -1
- package/dist/chip.mjs +1 -1
- package/dist/chroma-grid.cjs +1 -1
- package/dist/chroma-grid.mjs +1 -1
- package/dist/chunks/{accordion-C_0oGZkZ.mjs → accordion-Cbt-SJhj.mjs} +4 -4
- package/dist/chunks/accordion-Cbt-SJhj.mjs.map +1 -0
- package/dist/chunks/{accordion-BZ5hyz0_.cjs → accordion-pfJR8YYA.cjs} +4 -4
- package/dist/chunks/accordion-pfJR8YYA.cjs.map +1 -0
- package/dist/chunks/{alert-DeVa-NR1.mjs → alert-CtdLy4Hv.mjs} +6 -6
- package/dist/chunks/alert-CtdLy4Hv.mjs.map +1 -0
- package/dist/chunks/{alert-BdBDWqBN.cjs → alert-Dvz1GoL5.cjs} +6 -6
- package/dist/chunks/alert-Dvz1GoL5.cjs.map +1 -0
- package/dist/chunks/{ascii-text-BzQCLfya.mjs → ascii-text-C5tyNsR3.mjs} +32 -5
- package/dist/chunks/ascii-text-C5tyNsR3.mjs.map +1 -0
- package/dist/chunks/{ascii-text-D6lVHWph.cjs → ascii-text-DlmArZXh.cjs} +32 -5
- package/dist/chunks/ascii-text-DlmArZXh.cjs.map +1 -0
- package/dist/chunks/background-gradient-animation-BL-lnrJe.mjs.map +1 -1
- package/dist/chunks/background-gradient-animation-CXV9GDH8.cjs.map +1 -1
- package/dist/chunks/{button-CmNEMp_O.mjs → button-B0Lhj0AS.mjs} +3 -3
- package/dist/chunks/button-B0Lhj0AS.mjs.map +1 -0
- package/dist/chunks/{button-BH1eUjae.cjs → button-CZL6kFzT.cjs} +3 -3
- package/dist/chunks/button-CZL6kFzT.cjs.map +1 -0
- package/dist/chunks/{card-CzstAQYy.mjs → card-CcIF6z2H.mjs} +2 -2
- package/dist/chunks/card-CcIF6z2H.mjs.map +1 -0
- package/dist/chunks/{card-DZGM4zLx.cjs → card-gt-HZh0h.cjs} +2 -2
- package/dist/chunks/card-gt-HZh0h.cjs.map +1 -0
- package/dist/chunks/{carousel-47Eiyzwg.cjs → carousel-Cq5uwqQt.cjs} +3 -3
- package/dist/chunks/{carousel-BJ3nm2bw.mjs.map → carousel-Cq5uwqQt.cjs.map} +1 -1
- package/dist/chunks/{carousel-BJ3nm2bw.mjs → carousel-DJdqBVRK.mjs} +3 -3
- package/dist/chunks/{carousel-47Eiyzwg.cjs.map → carousel-DJdqBVRK.mjs.map} +1 -1
- package/dist/chunks/charts-BpElnsoR.cjs +687 -0
- package/dist/chunks/charts-BpElnsoR.cjs.map +1 -0
- package/dist/chunks/charts-DugYWvEf.mjs +632 -0
- package/dist/chunks/charts-DugYWvEf.mjs.map +1 -0
- package/dist/chunks/{checkbox-B3eIojWs.mjs → checkbox-DvwlGwWe.mjs} +8 -8
- package/dist/chunks/checkbox-DvwlGwWe.mjs.map +1 -0
- package/dist/chunks/{checkbox-DQmZwRTt.cjs → checkbox-yHuSw-hV.cjs} +8 -8
- package/dist/chunks/checkbox-yHuSw-hV.cjs.map +1 -0
- package/dist/chunks/{chip-cZ7-HmWw.mjs → chip-BGSUmnlO.mjs} +12 -12
- package/dist/chunks/chip-BGSUmnlO.mjs.map +1 -0
- package/dist/chunks/{chip-BH6wzwat.cjs → chip-DcBji__g.cjs} +12 -12
- package/dist/chunks/chip-DcBji__g.cjs.map +1 -0
- package/dist/chunks/{chroma-grid-DtsqM4LW.cjs → chroma-grid-9E9j1s9I.cjs} +10 -10
- package/dist/chunks/chroma-grid-9E9j1s9I.cjs.map +1 -0
- package/dist/chunks/{chroma-grid-CC_fFzxO.mjs → chroma-grid-Cdeql_2C.mjs} +10 -10
- package/dist/chunks/chroma-grid-Cdeql_2C.mjs.map +1 -0
- package/dist/chunks/color-palette-BLvDnCOD.cjs +754 -0
- package/dist/chunks/color-palette-BLvDnCOD.cjs.map +1 -0
- package/dist/chunks/color-palette-CXlCDiZz.mjs +748 -0
- package/dist/chunks/color-palette-CXlCDiZz.mjs.map +1 -0
- package/dist/chunks/{combobox-mAvOcg-E.cjs → combobox-BXu3s0dt.cjs} +56 -32
- package/dist/chunks/combobox-BXu3s0dt.cjs.map +1 -0
- package/dist/chunks/combobox-CjK-qG4k.mjs +132 -0
- package/dist/chunks/combobox-CjK-qG4k.mjs.map +1 -0
- package/dist/chunks/{data-table-BRcGhJDf.cjs → data-table-9HELVsYR.cjs} +197 -292
- package/dist/chunks/data-table-9HELVsYR.cjs.map +1 -0
- package/dist/chunks/{data-table-Dp0t_I_z.mjs → data-table-DyEQn9Yj.mjs} +197 -292
- package/dist/chunks/data-table-DyEQn9Yj.mjs.map +1 -0
- package/dist/chunks/{date-picker-BWBkr6LG.mjs → date-picker-D8gaaMlJ.mjs} +39 -16
- package/dist/chunks/date-picker-D8gaaMlJ.mjs.map +1 -0
- package/dist/chunks/{date-picker-DooielHi.cjs → date-picker-W9om1j7A.cjs} +39 -16
- package/dist/chunks/date-picker-W9om1j7A.cjs.map +1 -0
- package/dist/chunks/{dialog-Cbuf8V0g.cjs → dialog-CYFiWN8M.cjs} +20 -20
- package/dist/chunks/dialog-CYFiWN8M.cjs.map +1 -0
- package/dist/chunks/{dialog-C6nxSfIl.mjs → dialog-DUWnV9tN.mjs} +20 -20
- package/dist/chunks/dialog-DUWnV9tN.mjs.map +1 -0
- package/dist/chunks/{drawer-Dn0u8Sck.cjs → drawer-CLjsYdxN.cjs} +39 -22
- package/dist/chunks/drawer-CLjsYdxN.cjs.map +1 -0
- package/dist/chunks/drawer-D82Jz6KO.mjs +122 -0
- package/dist/chunks/drawer-D82Jz6KO.mjs.map +1 -0
- package/dist/chunks/{form-TwlDrshv.mjs → form-B2vcaHwh.mjs} +4 -4
- package/dist/chunks/form-B2vcaHwh.mjs.map +1 -0
- package/dist/chunks/{form-DcEuk721.cjs → form-CzH9GQc6.cjs} +4 -4
- package/dist/chunks/form-CzH9GQc6.cjs.map +1 -0
- package/dist/chunks/{gradual-blur-2jVhPcND.cjs → gradual-blur-B9GoY8o1.cjs} +1 -1
- package/dist/chunks/{gradual-blur-2jVhPcND.cjs.map → gradual-blur-B9GoY8o1.cjs.map} +1 -1
- package/dist/chunks/{gradual-blur-jTzKCmAV.mjs → gradual-blur-Bl3dOMEz.mjs} +1 -1
- package/dist/chunks/{gradual-blur-jTzKCmAV.mjs.map → gradual-blur-Bl3dOMEz.mjs.map} +1 -1
- package/dist/chunks/{hover-card-KjWMnvt_.cjs → hover-card-v0QwmVBU.cjs} +9 -4
- package/dist/chunks/hover-card-v0QwmVBU.cjs.map +1 -0
- package/dist/chunks/{hover-card-DwTVfjgN.mjs → hover-card-xqwpmZNm.mjs} +9 -4
- package/dist/chunks/{hover-card-KjWMnvt_.cjs.map → hover-card-xqwpmZNm.mjs.map} +1 -1
- package/dist/chunks/{icons-DYkpqWYG.cjs → icons-BxIzP2jd.cjs} +131 -8
- package/dist/chunks/icons-BxIzP2jd.cjs.map +1 -0
- package/dist/chunks/{icons-CrM6pFkv.mjs → icons-DuumN7z-.mjs} +108 -9
- package/dist/chunks/icons-DuumN7z-.mjs.map +1 -0
- package/dist/chunks/{input-CoRHoZkB.cjs → input-D9qZNqXV.cjs} +8 -8
- package/dist/chunks/input-D9qZNqXV.cjs.map +1 -0
- package/dist/chunks/{input-ChhwdNGk.mjs → input-wNqevfQ4.mjs} +8 -8
- package/dist/chunks/input-wNqevfQ4.mjs.map +1 -0
- package/dist/chunks/{label-EciNc4hO.cjs → label-BWPEGVam.cjs} +1 -1
- package/dist/chunks/{label-EciNc4hO.cjs.map → label-BWPEGVam.cjs.map} +1 -1
- package/dist/chunks/{label-JZn7PmtR.mjs → label-KPA-yYOF.mjs} +1 -1
- package/dist/chunks/{label-JZn7PmtR.mjs.map → label-KPA-yYOF.mjs.map} +1 -1
- package/dist/chunks/{loading-DPNa_X3c.mjs → loading-S1TdIrbB.mjs} +2 -2
- package/dist/chunks/{loading-DPNa_X3c.mjs.map → loading-S1TdIrbB.mjs.map} +1 -1
- package/dist/chunks/{loading-Cqgps3nf.cjs → loading-q7IEg56I.cjs} +2 -2
- package/dist/chunks/{loading-Cqgps3nf.cjs.map → loading-q7IEg56I.cjs.map} +1 -1
- package/dist/chunks/multi-select-combobox-ELSH_Xr4.mjs +132 -0
- package/dist/chunks/multi-select-combobox-ELSH_Xr4.mjs.map +1 -0
- package/dist/chunks/multi-select-combobox-UW0X15W7.cjs +139 -0
- package/dist/chunks/multi-select-combobox-UW0X15W7.cjs.map +1 -0
- package/dist/chunks/{otp-input-DaQDfI9C.cjs → otp-input-B6zzOEqw.cjs} +13 -14
- package/dist/chunks/otp-input-B6zzOEqw.cjs.map +1 -0
- package/dist/chunks/{otp-input-CNungc1j.mjs → otp-input-Bg4nQG6x.mjs} +13 -14
- package/dist/chunks/otp-input-Bg4nQG6x.mjs.map +1 -0
- package/dist/chunks/{overlay-BfUR77DT.cjs → overlay-DWNTyQzK.cjs} +1 -1
- package/dist/chunks/{overlay-BfUR77DT.cjs.map → overlay-DWNTyQzK.cjs.map} +1 -1
- package/dist/chunks/{overlay-CpdakhXI.mjs → overlay-TycCIFOu.mjs} +1 -1
- package/dist/chunks/{overlay-CpdakhXI.mjs.map → overlay-TycCIFOu.mjs.map} +1 -1
- package/dist/chunks/{password-strength-meter-xtMqhhFg.mjs → password-strength-meter-CbNSBuh_.mjs} +10 -10
- package/dist/chunks/password-strength-meter-CbNSBuh_.mjs.map +1 -0
- package/dist/chunks/{password-strength-meter-u4YI00zE.cjs → password-strength-meter-DxMV6GAs.cjs} +10 -10
- package/dist/chunks/password-strength-meter-DxMV6GAs.cjs.map +1 -0
- package/dist/chunks/progress-bar-C1OvQ-NI.cjs +96 -0
- package/dist/chunks/progress-bar-C1OvQ-NI.cjs.map +1 -0
- package/dist/chunks/progress-bar-C9FZDrju.mjs +89 -0
- package/dist/chunks/progress-bar-C9FZDrju.mjs.map +1 -0
- package/dist/chunks/{radio-C-fPZgSY.mjs → radio-C9w_CoiY.mjs} +9 -9
- package/dist/chunks/radio-C9w_CoiY.mjs.map +1 -0
- package/dist/chunks/{radio-mCgvEhOR.cjs → radio-jMHDvaMY.cjs} +9 -9
- package/dist/chunks/radio-jMHDvaMY.cjs.map +1 -0
- package/dist/chunks/select-D71tk6-I.mjs +152 -0
- package/dist/chunks/select-D71tk6-I.mjs.map +1 -0
- package/dist/chunks/select-WC_kPqUP.cjs +158 -0
- package/dist/chunks/select-WC_kPqUP.cjs.map +1 -0
- package/dist/chunks/{skeleton-D1S4RyeL.mjs → skeleton-BhYWOp0Q.mjs} +1 -1
- package/dist/chunks/{skeleton-D1S4RyeL.mjs.map → skeleton-BhYWOp0Q.mjs.map} +1 -1
- package/dist/chunks/{skeleton-C-NHrM-w.cjs → skeleton-DTXpHYYB.cjs} +1 -1
- package/dist/chunks/{skeleton-C-NHrM-w.cjs.map → skeleton-DTXpHYYB.cjs.map} +1 -1
- package/dist/chunks/{spinners-hf553hP9.mjs → spinners-BBCWD2gw.mjs} +2 -2
- package/dist/chunks/{spinners-hf553hP9.mjs.map → spinners-BBCWD2gw.mjs.map} +1 -1
- package/dist/chunks/{spinners-CU3bLaoo.cjs → spinners-BL4ERCCw.cjs} +2 -2
- package/dist/chunks/{spinners-CU3bLaoo.cjs.map → spinners-BL4ERCCw.cjs.map} +1 -1
- package/dist/chunks/{splash-cursor-Dpzl_YXx.cjs → splash-cursor-BVSmbcIX.cjs} +9 -8
- package/dist/chunks/splash-cursor-BVSmbcIX.cjs.map +1 -0
- package/dist/chunks/{splash-cursor-9BsoQZl0.mjs → splash-cursor-rSrTnawZ.mjs} +9 -8
- package/dist/chunks/splash-cursor-rSrTnawZ.mjs.map +1 -0
- package/dist/chunks/{spotlight-card-Bl0aXnT4.mjs → spotlight-card-BpZLMOp6.mjs} +1 -1
- package/dist/chunks/{spotlight-card-Bl0aXnT4.mjs.map → spotlight-card-BpZLMOp6.mjs.map} +1 -1
- package/dist/chunks/{spotlight-card-SUhrgstF.cjs → spotlight-card-DS1dy1W3.cjs} +1 -1
- package/dist/chunks/{spotlight-card-SUhrgstF.cjs.map → spotlight-card-DS1dy1W3.cjs.map} +1 -1
- package/dist/chunks/{stepper-uz8iRzlY.mjs → stepper-D4yQsQB0.mjs} +14 -14
- package/dist/chunks/stepper-D4yQsQB0.mjs.map +1 -0
- package/dist/chunks/{stepper-BDz6PkjV.cjs → stepper-fY-Sx72k.cjs} +14 -14
- package/dist/chunks/stepper-fY-Sx72k.cjs.map +1 -0
- package/dist/chunks/{sun-to-moon-button-3E6qah0o.mjs → sun-to-moon-button-B2Aje05o.mjs} +3 -3
- package/dist/chunks/{sun-to-moon-button-3E6qah0o.mjs.map → sun-to-moon-button-B2Aje05o.mjs.map} +1 -1
- package/dist/chunks/{sun-to-moon-button-B__3FWnK.cjs → sun-to-moon-button-BmFwRBye.cjs} +3 -3
- package/dist/chunks/{sun-to-moon-button-B__3FWnK.cjs.map → sun-to-moon-button-BmFwRBye.cjs.map} +1 -1
- package/dist/chunks/{switch-y8oWcyLp.cjs → switch-C5otDb4c.cjs} +3 -3
- package/dist/chunks/switch-C5otDb4c.cjs.map +1 -0
- package/dist/chunks/{switch-DYLavKgf.mjs → switch-DOVl_i_s.mjs} +3 -3
- package/dist/chunks/switch-DOVl_i_s.mjs.map +1 -0
- package/dist/chunks/textarea-CAUsyu4-.cjs +63 -0
- package/dist/chunks/textarea-CAUsyu4-.cjs.map +1 -0
- package/dist/chunks/textarea-CU5C-Zw9.mjs +57 -0
- package/dist/chunks/textarea-CU5C-Zw9.mjs.map +1 -0
- package/dist/chunks/{theme-CBtWIFMT.cjs → theme-7DWLxJK_.cjs} +4 -2
- package/dist/chunks/theme-7DWLxJK_.cjs.map +1 -0
- package/dist/chunks/{theme-Bwu0HKqZ.mjs → theme-BceKeYhw.mjs} +4 -2
- package/dist/chunks/theme-BceKeYhw.mjs.map +1 -0
- package/dist/chunks/{toast-C8JRhbSo.mjs → toast-CvfP7PUP.mjs} +20 -20
- package/dist/chunks/toast-CvfP7PUP.mjs.map +1 -0
- package/dist/chunks/{toast-DWOwpD2F.cjs → toast-Ds7_19Ap.cjs} +20 -20
- package/dist/chunks/toast-Ds7_19Ap.cjs.map +1 -0
- package/dist/chunks/{tooltip-YtA_66_1.mjs → tooltip-efHETBo1.mjs} +1 -1
- package/dist/chunks/{tooltip-YtA_66_1.mjs.map → tooltip-efHETBo1.mjs.map} +1 -1
- package/dist/chunks/{tooltip-BHXNmXsa.cjs → tooltip-nkIqViGk.cjs} +1 -1
- package/dist/chunks/{tooltip-BHXNmXsa.cjs.map → tooltip-nkIqViGk.cjs.map} +1 -1
- package/dist/chunks/{typography-BzprBnQc.mjs → typography-CLu6Hx9j.mjs} +7 -3
- package/dist/chunks/{typography-BzprBnQc.mjs.map → typography-CLu6Hx9j.mjs.map} +1 -1
- package/dist/chunks/{typography-3wSx67DZ.cjs → typography-DaLu9tty.cjs} +7 -3
- package/dist/chunks/{typography-3wSx67DZ.cjs.map → typography-DaLu9tty.cjs.map} +1 -1
- package/dist/color-palette.cjs +1 -1
- package/dist/color-palette.mjs +1 -1
- package/dist/colors.css +121 -186
- package/dist/combobox.cjs +1 -1
- package/dist/combobox.mjs +1 -1
- package/dist/components/data-display/charts/AreaChart.d.ts.map +1 -1
- package/dist/components/data-display/charts/BarChart.d.ts.map +1 -1
- package/dist/components/data-display/charts/NeonLineChart.d.ts.map +1 -1
- package/dist/components/data-display/charts/PieChart.d.ts.map +1 -1
- package/dist/components/data-display/charts/StackedBarChart.d.ts.map +1 -1
- package/dist/components/data-display/charts/ThinBreakdownBar.d.ts.map +1 -1
- package/dist/components/data-display/charts/chartPalette.d.ts +10 -0
- package/dist/components/data-display/charts/chartPalette.d.ts.map +1 -0
- package/dist/components/data-display/charts/index.d.ts +2 -0
- package/dist/components/data-display/charts/index.d.ts.map +1 -1
- package/dist/components/data-display/chip/Chip.d.ts.map +1 -1
- package/dist/components/data-display/color-palette/ColorPalette.d.ts.map +1 -1
- package/dist/components/data-display/data-table/DataTable.d.ts +17 -10
- package/dist/components/data-display/data-table/DataTable.d.ts.map +1 -1
- package/dist/components/data-display/data-table/index.d.ts +1 -1
- package/dist/components/data-display/data-table/index.d.ts.map +1 -1
- package/dist/components/data-display/index.d.ts +1 -0
- package/dist/components/data-display/index.d.ts.map +1 -1
- package/dist/components/data-display/progress-bar/ProgressBar.d.ts +18 -0
- package/dist/components/data-display/progress-bar/ProgressBar.d.ts.map +1 -0
- package/dist/components/data-display/progress-bar/index.d.ts +3 -0
- package/dist/components/data-display/progress-bar/index.d.ts.map +1 -0
- package/dist/components/effects/ascii-text/ASCIIText.d.ts.map +1 -1
- package/dist/components/effects/border-beam/BorderBeam.d.ts.map +1 -1
- package/dist/components/effects/chroma-grid/ChromaGrid.d.ts.map +1 -1
- package/dist/components/effects/splash-cursor/SplashCursor.d.ts.map +1 -1
- package/dist/components/forms/combobox/Combobox.d.ts.map +1 -1
- package/dist/components/forms/date-picker/DatePicker.d.ts.map +1 -1
- package/dist/components/forms/input/Input.d.ts.map +1 -1
- package/dist/components/forms/multi-select-combobox/MultiSelectCombobox.d.ts.map +1 -1
- package/dist/components/forms/otp-input/OTPInput.d.ts.map +1 -1
- package/dist/components/forms/password-strength-meter/PasswordCriteria.d.ts.map +1 -1
- package/dist/components/forms/select/Select.d.ts.map +1 -1
- package/dist/components/forms/select/types.d.ts +2 -0
- package/dist/components/forms/select/types.d.ts.map +1 -1
- package/dist/components/forms/textarea/Textarea.d.ts.map +1 -1
- package/dist/components/icons/ColumnsIcon.d.ts +9 -0
- package/dist/components/icons/ColumnsIcon.d.ts.map +1 -0
- package/dist/components/icons/MailIcon.d.ts +9 -0
- package/dist/components/icons/MailIcon.d.ts.map +1 -0
- package/dist/components/icons/PlayIcon.d.ts +9 -0
- package/dist/components/icons/PlayIcon.d.ts.map +1 -0
- package/dist/components/icons/ZapIcon.d.ts +9 -0
- package/dist/components/icons/ZapIcon.d.ts.map +1 -0
- package/dist/components/icons/index.d.ts +4 -0
- package/dist/components/icons/index.d.ts.map +1 -1
- package/dist/components/navigation/accordion/Accordion.d.ts.map +1 -1
- package/dist/components/overlays/drawer/Drawer.d.ts.map +1 -1
- package/dist/components/overlays/hover-card/HoverCard.d.ts.map +1 -1
- package/dist/components/typography/Typography.d.ts.map +1 -1
- package/dist/data-table.cjs +1 -1
- package/dist/data-table.mjs +1 -1
- package/dist/date-picker.cjs +1 -1
- package/dist/date-picker.mjs +1 -1
- package/dist/dialog.cjs +1 -1
- package/dist/dialog.mjs +1 -1
- package/dist/docs.cjs +50 -4
- package/dist/docs.cjs.map +1 -1
- package/dist/docs.d.ts +59 -9
- package/dist/docs.d.ts.map +1 -1
- package/dist/docs.mjs +50 -4
- package/dist/docs.mjs.map +1 -1
- package/dist/drawer.cjs +1 -1
- package/dist/drawer.mjs +1 -1
- package/dist/fonts.css +5 -0
- package/dist/form.cjs +1 -1
- package/dist/form.mjs +1 -1
- package/dist/foundation.css +3 -3
- package/dist/foundations/theme/ThemeProvider.d.ts +1 -0
- package/dist/foundations/theme/ThemeProvider.d.ts.map +1 -1
- package/dist/gradual-blur.cjs +1 -1
- package/dist/gradual-blur.mjs +1 -1
- package/dist/hover-card.cjs +1 -1
- package/dist/hover-card.mjs +1 -1
- package/dist/icons.cjs +5 -1
- package/dist/icons.mjs +2 -2
- package/dist/index.cjs +50 -41
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +43 -42
- package/dist/index.mjs.map +1 -1
- package/dist/input.cjs +1 -1
- package/dist/input.mjs +1 -1
- package/dist/label.cjs +1 -1
- package/dist/label.mjs +1 -1
- package/dist/loading.cjs +1 -1
- package/dist/loading.mjs +1 -1
- package/dist/multi-select-combobox.cjs +1 -1
- package/dist/multi-select-combobox.mjs +1 -1
- package/dist/otp-input.cjs +1 -1
- package/dist/otp-input.mjs +1 -1
- package/dist/password-strength-meter.cjs +1 -1
- package/dist/password-strength-meter.mjs +1 -1
- package/dist/progress-bar.cjs +3 -0
- package/dist/progress-bar.d.ts +2 -0
- package/dist/progress-bar.mjs +2 -0
- package/dist/radio.cjs +1 -1
- package/dist/radio.mjs +1 -1
- package/dist/select.cjs +1 -1
- package/dist/select.mjs +1 -1
- package/dist/skeleton.cjs +1 -1
- package/dist/skeleton.mjs +1 -1
- package/dist/spinners.cjs +1 -1
- package/dist/spinners.mjs +1 -1
- package/dist/splash-cursor.cjs +1 -1
- package/dist/splash-cursor.mjs +1 -1
- package/dist/spotlight-card.cjs +1 -1
- package/dist/spotlight-card.mjs +1 -1
- package/dist/stepper.cjs +1 -1
- package/dist/stepper.mjs +1 -1
- package/dist/sun-to-moon-button.cjs +1 -1
- package/dist/sun-to-moon-button.mjs +1 -1
- package/dist/switch.cjs +1 -1
- package/dist/switch.mjs +1 -1
- package/dist/textarea.cjs +1 -1
- package/dist/textarea.mjs +1 -1
- package/dist/theme.cjs +1 -1
- package/dist/theme.mjs +1 -1
- package/dist/toast.cjs +1 -1
- package/dist/toast.mjs +1 -1
- package/dist/tokens.css +592 -0
- package/dist/tooltip.cjs +1 -1
- package/dist/tooltip.mjs +1 -1
- package/dist/typography.cjs +1 -1
- package/dist/typography.mjs +1 -1
- package/package.json +19 -5
- package/dist/chunks/accordion-BZ5hyz0_.cjs.map +0 -1
- package/dist/chunks/accordion-C_0oGZkZ.mjs.map +0 -1
- package/dist/chunks/alert-BdBDWqBN.cjs.map +0 -1
- package/dist/chunks/alert-DeVa-NR1.mjs.map +0 -1
- package/dist/chunks/ascii-text-BzQCLfya.mjs.map +0 -1
- package/dist/chunks/ascii-text-D6lVHWph.cjs.map +0 -1
- package/dist/chunks/button-BH1eUjae.cjs.map +0 -1
- package/dist/chunks/button-CmNEMp_O.mjs.map +0 -1
- package/dist/chunks/card-CzstAQYy.mjs.map +0 -1
- package/dist/chunks/card-DZGM4zLx.cjs.map +0 -1
- package/dist/chunks/charts-Bynf6x07.mjs +0 -448
- package/dist/chunks/charts-Bynf6x07.mjs.map +0 -1
- package/dist/chunks/charts-UYl7Ecqv.cjs +0 -485
- package/dist/chunks/charts-UYl7Ecqv.cjs.map +0 -1
- package/dist/chunks/checkbox-B3eIojWs.mjs.map +0 -1
- package/dist/chunks/checkbox-DQmZwRTt.cjs.map +0 -1
- package/dist/chunks/chip-BH6wzwat.cjs.map +0 -1
- package/dist/chunks/chip-cZ7-HmWw.mjs.map +0 -1
- package/dist/chunks/chroma-grid-CC_fFzxO.mjs.map +0 -1
- package/dist/chunks/chroma-grid-DtsqM4LW.cjs.map +0 -1
- package/dist/chunks/color-palette-Cz7vqbil.cjs +0 -1156
- package/dist/chunks/color-palette-Cz7vqbil.cjs.map +0 -1
- package/dist/chunks/color-palette-yadpDCUw.mjs +0 -1150
- package/dist/chunks/color-palette-yadpDCUw.mjs.map +0 -1
- package/dist/chunks/combobox-B9Nzlhu3.mjs +0 -108
- package/dist/chunks/combobox-B9Nzlhu3.mjs.map +0 -1
- package/dist/chunks/combobox-mAvOcg-E.cjs.map +0 -1
- package/dist/chunks/data-table-BRcGhJDf.cjs.map +0 -1
- package/dist/chunks/data-table-Dp0t_I_z.mjs.map +0 -1
- package/dist/chunks/date-picker-BWBkr6LG.mjs.map +0 -1
- package/dist/chunks/date-picker-DooielHi.cjs.map +0 -1
- package/dist/chunks/dialog-C6nxSfIl.mjs.map +0 -1
- package/dist/chunks/dialog-Cbuf8V0g.cjs.map +0 -1
- package/dist/chunks/drawer-DIuvgqTA.mjs +0 -105
- package/dist/chunks/drawer-DIuvgqTA.mjs.map +0 -1
- package/dist/chunks/drawer-Dn0u8Sck.cjs.map +0 -1
- package/dist/chunks/form-DcEuk721.cjs.map +0 -1
- package/dist/chunks/form-TwlDrshv.mjs.map +0 -1
- package/dist/chunks/hover-card-DwTVfjgN.mjs.map +0 -1
- package/dist/chunks/icons-CrM6pFkv.mjs.map +0 -1
- package/dist/chunks/icons-DYkpqWYG.cjs.map +0 -1
- package/dist/chunks/input-ChhwdNGk.mjs.map +0 -1
- package/dist/chunks/input-CoRHoZkB.cjs.map +0 -1
- package/dist/chunks/multi-select-combobox-BPRTZVF6.mjs +0 -108
- package/dist/chunks/multi-select-combobox-BPRTZVF6.mjs.map +0 -1
- package/dist/chunks/multi-select-combobox-DiMwJxj_.cjs +0 -115
- package/dist/chunks/multi-select-combobox-DiMwJxj_.cjs.map +0 -1
- package/dist/chunks/otp-input-CNungc1j.mjs.map +0 -1
- package/dist/chunks/otp-input-DaQDfI9C.cjs.map +0 -1
- package/dist/chunks/password-strength-meter-u4YI00zE.cjs.map +0 -1
- package/dist/chunks/password-strength-meter-xtMqhhFg.mjs.map +0 -1
- package/dist/chunks/radio-C-fPZgSY.mjs.map +0 -1
- package/dist/chunks/radio-mCgvEhOR.cjs.map +0 -1
- package/dist/chunks/select-BB-pOzI2.mjs +0 -116
- package/dist/chunks/select-BB-pOzI2.mjs.map +0 -1
- package/dist/chunks/select-BwelAQc1.cjs +0 -122
- package/dist/chunks/select-BwelAQc1.cjs.map +0 -1
- package/dist/chunks/splash-cursor-9BsoQZl0.mjs.map +0 -1
- package/dist/chunks/splash-cursor-Dpzl_YXx.cjs.map +0 -1
- package/dist/chunks/stepper-BDz6PkjV.cjs.map +0 -1
- package/dist/chunks/stepper-uz8iRzlY.mjs.map +0 -1
- package/dist/chunks/switch-DYLavKgf.mjs.map +0 -1
- package/dist/chunks/switch-y8oWcyLp.cjs.map +0 -1
- package/dist/chunks/textarea-BWkUVpm3.cjs +0 -66
- package/dist/chunks/textarea-BWkUVpm3.cjs.map +0 -1
- package/dist/chunks/textarea-Bxqe70TW.mjs +0 -60
- package/dist/chunks/textarea-Bxqe70TW.mjs.map +0 -1
- package/dist/chunks/theme-Bwu0HKqZ.mjs.map +0 -1
- package/dist/chunks/theme-CBtWIFMT.cjs.map +0 -1
- package/dist/chunks/toast-C8JRhbSo.mjs.map +0 -1
- package/dist/chunks/toast-DWOwpD2F.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loading-DPNa_X3c.mjs","names":[],"sources":["../../src/components/data-display/loading/Loading.tsx"],"sourcesContent":["import { LoaderIcon, RingLoaderIcon } from \"../../icons\";\n\nexport type LoadingVariant =\n | \"spinner\"\n | \"dots\"\n | \"pulse\"\n | \"bars\"\n | \"ring\"\n | \"bounce\"\n | \"wave\"\n | \"skeleton\";\n\nexport type LoadingSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nexport interface LoadingProps {\n /** The variant/style of the loading indicator */\n variant?: LoadingVariant;\n /** Size of the loading indicator */\n size?: LoadingSize;\n /** Custom color for the loading indicator */\n color?: string;\n /** Text to display alongside the loading indicator */\n text?: string;\n /** Position of the text relative to the indicator */\n textPosition?: \"right\" | \"bottom\";\n /** Whether to show as a full-screen overlay */\n fullScreen?: boolean;\n /** Whether to show as an overlay within parent container */\n overlay?: boolean;\n /** Custom className */\n className?: string;\n /** Skeleton specific: width */\n skeletonWidth?: string;\n /** Skeleton specific: height */\n skeletonHeight?: string;\n /** Skeleton specific: rounded style */\n skeletonRounded?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"full\";\n}\n\nconst sizeMap: Record<LoadingSize, { container: string; text: string }> = {\n xs: { container: \"w-4 h-4\", text: \"text-xs\" },\n sm: { container: \"w-6 h-6\", text: \"text-sm\" },\n md: { container: \"w-8 h-8\", text: \"text-sm\" },\n lg: { container: \"w-12 h-12\", text: \"text-base\" },\n xl: { container: \"w-16 h-16\", text: \"text-lg\" },\n};\n\n// Spinner - Classic rotating circle\nfunction Spinner({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n return (\n <LoaderIcon\n className={`animate-spin ${sizeMap[size].container}`}\n color={color}\n aria-hidden=\"true\"\n />\n );\n}\n\n// Dots - Three bouncing dots\nfunction Dots({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const dotSize = {\n xs: \"w-1.5 h-1.5\",\n sm: \"w-2 h-2\",\n md: \"w-2.5 h-2.5\",\n lg: \"w-3 h-3\",\n xl: \"w-4 h-4\",\n };\n\n return (\n <div className=\"flex items-center gap-1\">\n {[0, 1, 2].map((i) => (\n <div\n key={i}\n className={`${dotSize[size]} rounded-full animate-bounce`}\n style={{\n backgroundColor: color,\n animationDelay: `${i * 0.15}s`,\n animationDuration: \"0.6s\",\n }}\n />\n ))}\n </div>\n );\n}\n\n// Pulse - Pulsing circle\nfunction Pulse({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n return (\n <div className={`relative ${sizeMap[size].container}`}>\n <div\n className=\"absolute inset-0 rounded-full animate-ping opacity-75\"\n style={{ backgroundColor: color }}\n />\n <div\n className=\"absolute inset-2 rounded-full\"\n style={{ backgroundColor: color }}\n />\n </div>\n );\n}\n\n// Bars - Audio-style animated bars\nfunction Bars({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const barWidth = {\n xs: \"w-0.5\",\n sm: \"w-1\",\n md: \"w-1.5\",\n lg: \"w-2\",\n xl: \"w-2.5\",\n };\n\n return (\n <div className={`flex items-end gap-0.5 ${sizeMap[size].container}`}>\n {[0, 1, 2, 3, 4].map((i) => (\n <div\n key={i}\n className={`${barWidth[size]} rounded-sm`}\n style={{\n backgroundColor: color,\n animation: \"loading-bars 1s ease-in-out infinite\",\n animationDelay: `${i * 0.1}s`,\n height: \"40%\",\n }}\n />\n ))}\n <style>{`\n @keyframes loading-bars {\n 0%, 100% { height: 40%; }\n 50% { height: 100%; }\n }\n `}</style>\n </div>\n );\n}\n\n// Ring - Rotating ring with gradient\nfunction Ring({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const strokeWidth = {\n xs: 3,\n sm: 3,\n md: 4,\n lg: 4,\n xl: 5,\n };\n\n return (\n <RingLoaderIcon\n className={`animate-spin ${sizeMap[size].container}`}\n color={color}\n strokeWidth={strokeWidth[size]}\n aria-hidden=\"true\"\n />\n );\n}\n\n// Bounce - Three bouncing circles\nfunction Bounce({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const dotSize = {\n xs: \"w-2 h-2\",\n sm: \"w-3 h-3\",\n md: \"w-4 h-4\",\n lg: \"w-5 h-5\",\n xl: \"w-6 h-6\",\n };\n\n return (\n <div className=\"flex items-center gap-1\">\n {[0, 1, 2].map((i) => (\n <div\n key={i}\n className={`${dotSize[size]} rounded-full`}\n style={{\n backgroundColor: color,\n animation: \"loading-bounce 1.4s ease-in-out infinite both\",\n animationDelay: `${i * 0.16}s`,\n }}\n />\n ))}\n <style>{`\n @keyframes loading-bounce {\n 0%, 80%, 100% { transform: scale(0); }\n 40% { transform: scale(1); }\n }\n `}</style>\n </div>\n );\n}\n\n// Wave - Wave animation\nfunction Wave({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const barHeight = {\n xs: \"h-3\",\n sm: \"h-4\",\n md: \"h-6\",\n lg: \"h-8\",\n xl: \"h-10\",\n };\n const barWidth = {\n xs: \"w-0.5\",\n sm: \"w-1\",\n md: \"w-1\",\n lg: \"w-1.5\",\n xl: \"w-2\",\n };\n\n return (\n <div className=\"flex items-center gap-0.5\">\n {[0, 1, 2, 3, 4].map((i) => (\n <div\n key={i}\n className={`${barWidth[size]} ${barHeight[size]} rounded-full`}\n style={{\n backgroundColor: color,\n animation: \"loading-wave 1.2s ease-in-out infinite\",\n animationDelay: `${i * 0.1}s`,\n }}\n />\n ))}\n <style>{`\n @keyframes loading-wave {\n 0%, 40%, 100% { transform: scaleY(0.4); }\n 20% { transform: scaleY(1); }\n }\n `}</style>\n </div>\n );\n}\n\n// Skeleton - Loading placeholder\nfunction Skeleton({\n width = \"100%\",\n height = \"1rem\",\n rounded = \"md\",\n}: {\n width?: string;\n height?: string;\n rounded?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"full\";\n}) {\n const roundedMap = {\n none: \"\",\n sm: \"rounded-sm\",\n md: \"rounded-md\",\n lg: \"rounded-lg\",\n full: \"rounded-full\",\n };\n\n return (\n <div\n className={`animate-pulse bg-neutral-200 dark:bg-neutral-700 ${roundedMap[rounded]}`}\n style={{ width, height }}\n />\n );\n}\n\nexport default function Loading({\n variant = \"spinner\",\n size = \"md\",\n color = \"#7367f0\",\n text,\n textPosition = \"right\",\n fullScreen = false,\n overlay = false,\n className = \"\",\n skeletonWidth,\n skeletonHeight,\n skeletonRounded = \"md\",\n}: LoadingProps) {\n const renderLoader = () => {\n switch (variant) {\n case \"spinner\":\n return <Spinner size={size} color={color} />;\n case \"dots\":\n return <Dots size={size} color={color} />;\n case \"pulse\":\n return <Pulse size={size} color={color} />;\n case \"bars\":\n return <Bars size={size} color={color} />;\n case \"ring\":\n return <Ring size={size} color={color} />;\n case \"bounce\":\n return <Bounce size={size} color={color} />;\n case \"wave\":\n return <Wave size={size} color={color} />;\n case \"skeleton\":\n return (\n <Skeleton\n width={skeletonWidth}\n height={skeletonHeight}\n rounded={skeletonRounded}\n />\n );\n default:\n return <Spinner size={size} color={color} />;\n }\n };\n\n const content = (\n <div\n className={`inline-flex items-center ${\n textPosition === \"bottom\" ? \"flex-col gap-2\" : \"flex-row gap-3\"\n } ${className}`}\n >\n {renderLoader()}\n {text && (\n <span\n className={`${sizeMap[size].text} text-neutral-600 dark:text-neutral-400 font-medium`}\n >\n {text}\n </span>\n )}\n </div>\n );\n\n if (fullScreen) {\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-white/80 dark:bg-neutral-950/80 backdrop-blur-sm\">\n {content}\n </div>\n );\n }\n\n if (overlay) {\n return (\n <div className=\"absolute inset-0 z-10 flex items-center justify-center bg-white/70 dark:bg-neutral-900/70 backdrop-blur-sm rounded-inherit\">\n {content}\n </div>\n );\n }\n\n return content;\n}\n\n// Export individual components for direct use\nexport { Spinner, Dots, Pulse, Bars, Ring, Bounce, Wave, Skeleton };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"loading-S1TdIrbB.mjs","names":[],"sources":["../../src/components/data-display/loading/Loading.tsx"],"sourcesContent":["import { LoaderIcon, RingLoaderIcon } from \"../../icons\";\n\nexport type LoadingVariant =\n | \"spinner\"\n | \"dots\"\n | \"pulse\"\n | \"bars\"\n | \"ring\"\n | \"bounce\"\n | \"wave\"\n | \"skeleton\";\n\nexport type LoadingSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nexport interface LoadingProps {\n /** The variant/style of the loading indicator */\n variant?: LoadingVariant;\n /** Size of the loading indicator */\n size?: LoadingSize;\n /** Custom color for the loading indicator */\n color?: string;\n /** Text to display alongside the loading indicator */\n text?: string;\n /** Position of the text relative to the indicator */\n textPosition?: \"right\" | \"bottom\";\n /** Whether to show as a full-screen overlay */\n fullScreen?: boolean;\n /** Whether to show as an overlay within parent container */\n overlay?: boolean;\n /** Custom className */\n className?: string;\n /** Skeleton specific: width */\n skeletonWidth?: string;\n /** Skeleton specific: height */\n skeletonHeight?: string;\n /** Skeleton specific: rounded style */\n skeletonRounded?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"full\";\n}\n\nconst sizeMap: Record<LoadingSize, { container: string; text: string }> = {\n xs: { container: \"w-4 h-4\", text: \"text-xs\" },\n sm: { container: \"w-6 h-6\", text: \"text-sm\" },\n md: { container: \"w-8 h-8\", text: \"text-sm\" },\n lg: { container: \"w-12 h-12\", text: \"text-base\" },\n xl: { container: \"w-16 h-16\", text: \"text-lg\" },\n};\n\n// Spinner - Classic rotating circle\nfunction Spinner({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n return (\n <LoaderIcon\n className={`animate-spin ${sizeMap[size].container}`}\n color={color}\n aria-hidden=\"true\"\n />\n );\n}\n\n// Dots - Three bouncing dots\nfunction Dots({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const dotSize = {\n xs: \"w-1.5 h-1.5\",\n sm: \"w-2 h-2\",\n md: \"w-2.5 h-2.5\",\n lg: \"w-3 h-3\",\n xl: \"w-4 h-4\",\n };\n\n return (\n <div className=\"flex items-center gap-1\">\n {[0, 1, 2].map((i) => (\n <div\n key={i}\n className={`${dotSize[size]} rounded-full animate-bounce`}\n style={{\n backgroundColor: color,\n animationDelay: `${i * 0.15}s`,\n animationDuration: \"0.6s\",\n }}\n />\n ))}\n </div>\n );\n}\n\n// Pulse - Pulsing circle\nfunction Pulse({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n return (\n <div className={`relative ${sizeMap[size].container}`}>\n <div\n className=\"absolute inset-0 rounded-full animate-ping opacity-75\"\n style={{ backgroundColor: color }}\n />\n <div\n className=\"absolute inset-2 rounded-full\"\n style={{ backgroundColor: color }}\n />\n </div>\n );\n}\n\n// Bars - Audio-style animated bars\nfunction Bars({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const barWidth = {\n xs: \"w-0.5\",\n sm: \"w-1\",\n md: \"w-1.5\",\n lg: \"w-2\",\n xl: \"w-2.5\",\n };\n\n return (\n <div className={`flex items-end gap-0.5 ${sizeMap[size].container}`}>\n {[0, 1, 2, 3, 4].map((i) => (\n <div\n key={i}\n className={`${barWidth[size]} rounded-sm`}\n style={{\n backgroundColor: color,\n animation: \"loading-bars 1s ease-in-out infinite\",\n animationDelay: `${i * 0.1}s`,\n height: \"40%\",\n }}\n />\n ))}\n <style>{`\n @keyframes loading-bars {\n 0%, 100% { height: 40%; }\n 50% { height: 100%; }\n }\n `}</style>\n </div>\n );\n}\n\n// Ring - Rotating ring with gradient\nfunction Ring({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const strokeWidth = {\n xs: 3,\n sm: 3,\n md: 4,\n lg: 4,\n xl: 5,\n };\n\n return (\n <RingLoaderIcon\n className={`animate-spin ${sizeMap[size].container}`}\n color={color}\n strokeWidth={strokeWidth[size]}\n aria-hidden=\"true\"\n />\n );\n}\n\n// Bounce - Three bouncing circles\nfunction Bounce({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const dotSize = {\n xs: \"w-2 h-2\",\n sm: \"w-3 h-3\",\n md: \"w-4 h-4\",\n lg: \"w-5 h-5\",\n xl: \"w-6 h-6\",\n };\n\n return (\n <div className=\"flex items-center gap-1\">\n {[0, 1, 2].map((i) => (\n <div\n key={i}\n className={`${dotSize[size]} rounded-full`}\n style={{\n backgroundColor: color,\n animation: \"loading-bounce 1.4s ease-in-out infinite both\",\n animationDelay: `${i * 0.16}s`,\n }}\n />\n ))}\n <style>{`\n @keyframes loading-bounce {\n 0%, 80%, 100% { transform: scale(0); }\n 40% { transform: scale(1); }\n }\n `}</style>\n </div>\n );\n}\n\n// Wave - Wave animation\nfunction Wave({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const barHeight = {\n xs: \"h-3\",\n sm: \"h-4\",\n md: \"h-6\",\n lg: \"h-8\",\n xl: \"h-10\",\n };\n const barWidth = {\n xs: \"w-0.5\",\n sm: \"w-1\",\n md: \"w-1\",\n lg: \"w-1.5\",\n xl: \"w-2\",\n };\n\n return (\n <div className=\"flex items-center gap-0.5\">\n {[0, 1, 2, 3, 4].map((i) => (\n <div\n key={i}\n className={`${barWidth[size]} ${barHeight[size]} rounded-full`}\n style={{\n backgroundColor: color,\n animation: \"loading-wave 1.2s ease-in-out infinite\",\n animationDelay: `${i * 0.1}s`,\n }}\n />\n ))}\n <style>{`\n @keyframes loading-wave {\n 0%, 40%, 100% { transform: scaleY(0.4); }\n 20% { transform: scaleY(1); }\n }\n `}</style>\n </div>\n );\n}\n\n// Skeleton - Loading placeholder\nfunction Skeleton({\n width = \"100%\",\n height = \"1rem\",\n rounded = \"md\",\n}: {\n width?: string;\n height?: string;\n rounded?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"full\";\n}) {\n const roundedMap = {\n none: \"\",\n sm: \"rounded-sm\",\n md: \"rounded-md\",\n lg: \"rounded-lg\",\n full: \"rounded-full\",\n };\n\n return (\n <div\n className={`animate-pulse bg-neutral-200 dark:bg-neutral-700 ${roundedMap[rounded]}`}\n style={{ width, height }}\n />\n );\n}\n\nexport default function Loading({\n variant = \"spinner\",\n size = \"md\",\n color = \"#7367f0\",\n text,\n textPosition = \"right\",\n fullScreen = false,\n overlay = false,\n className = \"\",\n skeletonWidth,\n skeletonHeight,\n skeletonRounded = \"md\",\n}: LoadingProps) {\n const renderLoader = () => {\n switch (variant) {\n case \"spinner\":\n return <Spinner size={size} color={color} />;\n case \"dots\":\n return <Dots size={size} color={color} />;\n case \"pulse\":\n return <Pulse size={size} color={color} />;\n case \"bars\":\n return <Bars size={size} color={color} />;\n case \"ring\":\n return <Ring size={size} color={color} />;\n case \"bounce\":\n return <Bounce size={size} color={color} />;\n case \"wave\":\n return <Wave size={size} color={color} />;\n case \"skeleton\":\n return (\n <Skeleton\n width={skeletonWidth}\n height={skeletonHeight}\n rounded={skeletonRounded}\n />\n );\n default:\n return <Spinner size={size} color={color} />;\n }\n };\n\n const content = (\n <div\n className={`inline-flex items-center ${\n textPosition === \"bottom\" ? \"flex-col gap-2\" : \"flex-row gap-3\"\n } ${className}`}\n >\n {renderLoader()}\n {text && (\n <span\n className={`${sizeMap[size].text} text-neutral-600 dark:text-neutral-400 font-medium`}\n >\n {text}\n </span>\n )}\n </div>\n );\n\n if (fullScreen) {\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-white/80 dark:bg-neutral-950/80 backdrop-blur-sm\">\n {content}\n </div>\n );\n }\n\n if (overlay) {\n return (\n <div className=\"absolute inset-0 z-10 flex items-center justify-center bg-white/70 dark:bg-neutral-900/70 backdrop-blur-sm rounded-inherit\">\n {content}\n </div>\n );\n }\n\n return content;\n}\n\n// Export individual components for direct use\nexport { Spinner, Dots, Pulse, Bars, Ring, Bounce, Wave, Skeleton };\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
require("./chunk-B_GkZjkl.cjs");
|
|
2
|
-
const require_icons = require("./icons-
|
|
2
|
+
const require_icons = require("./icons-BxIzP2jd.cjs");
|
|
3
3
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
4
4
|
//#region src/components/data-display/loading/Loading.tsx
|
|
5
5
|
var sizeMap = {
|
|
@@ -310,4 +310,4 @@ Object.defineProperty(exports, "Wave", {
|
|
|
310
310
|
}
|
|
311
311
|
});
|
|
312
312
|
|
|
313
|
-
//# sourceMappingURL=loading-
|
|
313
|
+
//# sourceMappingURL=loading-q7IEg56I.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loading-Cqgps3nf.cjs","names":[],"sources":["../../src/components/data-display/loading/Loading.tsx"],"sourcesContent":["import { LoaderIcon, RingLoaderIcon } from \"../../icons\";\n\nexport type LoadingVariant =\n | \"spinner\"\n | \"dots\"\n | \"pulse\"\n | \"bars\"\n | \"ring\"\n | \"bounce\"\n | \"wave\"\n | \"skeleton\";\n\nexport type LoadingSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nexport interface LoadingProps {\n /** The variant/style of the loading indicator */\n variant?: LoadingVariant;\n /** Size of the loading indicator */\n size?: LoadingSize;\n /** Custom color for the loading indicator */\n color?: string;\n /** Text to display alongside the loading indicator */\n text?: string;\n /** Position of the text relative to the indicator */\n textPosition?: \"right\" | \"bottom\";\n /** Whether to show as a full-screen overlay */\n fullScreen?: boolean;\n /** Whether to show as an overlay within parent container */\n overlay?: boolean;\n /** Custom className */\n className?: string;\n /** Skeleton specific: width */\n skeletonWidth?: string;\n /** Skeleton specific: height */\n skeletonHeight?: string;\n /** Skeleton specific: rounded style */\n skeletonRounded?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"full\";\n}\n\nconst sizeMap: Record<LoadingSize, { container: string; text: string }> = {\n xs: { container: \"w-4 h-4\", text: \"text-xs\" },\n sm: { container: \"w-6 h-6\", text: \"text-sm\" },\n md: { container: \"w-8 h-8\", text: \"text-sm\" },\n lg: { container: \"w-12 h-12\", text: \"text-base\" },\n xl: { container: \"w-16 h-16\", text: \"text-lg\" },\n};\n\n// Spinner - Classic rotating circle\nfunction Spinner({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n return (\n <LoaderIcon\n className={`animate-spin ${sizeMap[size].container}`}\n color={color}\n aria-hidden=\"true\"\n />\n );\n}\n\n// Dots - Three bouncing dots\nfunction Dots({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const dotSize = {\n xs: \"w-1.5 h-1.5\",\n sm: \"w-2 h-2\",\n md: \"w-2.5 h-2.5\",\n lg: \"w-3 h-3\",\n xl: \"w-4 h-4\",\n };\n\n return (\n <div className=\"flex items-center gap-1\">\n {[0, 1, 2].map((i) => (\n <div\n key={i}\n className={`${dotSize[size]} rounded-full animate-bounce`}\n style={{\n backgroundColor: color,\n animationDelay: `${i * 0.15}s`,\n animationDuration: \"0.6s\",\n }}\n />\n ))}\n </div>\n );\n}\n\n// Pulse - Pulsing circle\nfunction Pulse({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n return (\n <div className={`relative ${sizeMap[size].container}`}>\n <div\n className=\"absolute inset-0 rounded-full animate-ping opacity-75\"\n style={{ backgroundColor: color }}\n />\n <div\n className=\"absolute inset-2 rounded-full\"\n style={{ backgroundColor: color }}\n />\n </div>\n );\n}\n\n// Bars - Audio-style animated bars\nfunction Bars({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const barWidth = {\n xs: \"w-0.5\",\n sm: \"w-1\",\n md: \"w-1.5\",\n lg: \"w-2\",\n xl: \"w-2.5\",\n };\n\n return (\n <div className={`flex items-end gap-0.5 ${sizeMap[size].container}`}>\n {[0, 1, 2, 3, 4].map((i) => (\n <div\n key={i}\n className={`${barWidth[size]} rounded-sm`}\n style={{\n backgroundColor: color,\n animation: \"loading-bars 1s ease-in-out infinite\",\n animationDelay: `${i * 0.1}s`,\n height: \"40%\",\n }}\n />\n ))}\n <style>{`\n @keyframes loading-bars {\n 0%, 100% { height: 40%; }\n 50% { height: 100%; }\n }\n `}</style>\n </div>\n );\n}\n\n// Ring - Rotating ring with gradient\nfunction Ring({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const strokeWidth = {\n xs: 3,\n sm: 3,\n md: 4,\n lg: 4,\n xl: 5,\n };\n\n return (\n <RingLoaderIcon\n className={`animate-spin ${sizeMap[size].container}`}\n color={color}\n strokeWidth={strokeWidth[size]}\n aria-hidden=\"true\"\n />\n );\n}\n\n// Bounce - Three bouncing circles\nfunction Bounce({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const dotSize = {\n xs: \"w-2 h-2\",\n sm: \"w-3 h-3\",\n md: \"w-4 h-4\",\n lg: \"w-5 h-5\",\n xl: \"w-6 h-6\",\n };\n\n return (\n <div className=\"flex items-center gap-1\">\n {[0, 1, 2].map((i) => (\n <div\n key={i}\n className={`${dotSize[size]} rounded-full`}\n style={{\n backgroundColor: color,\n animation: \"loading-bounce 1.4s ease-in-out infinite both\",\n animationDelay: `${i * 0.16}s`,\n }}\n />\n ))}\n <style>{`\n @keyframes loading-bounce {\n 0%, 80%, 100% { transform: scale(0); }\n 40% { transform: scale(1); }\n }\n `}</style>\n </div>\n );\n}\n\n// Wave - Wave animation\nfunction Wave({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const barHeight = {\n xs: \"h-3\",\n sm: \"h-4\",\n md: \"h-6\",\n lg: \"h-8\",\n xl: \"h-10\",\n };\n const barWidth = {\n xs: \"w-0.5\",\n sm: \"w-1\",\n md: \"w-1\",\n lg: \"w-1.5\",\n xl: \"w-2\",\n };\n\n return (\n <div className=\"flex items-center gap-0.5\">\n {[0, 1, 2, 3, 4].map((i) => (\n <div\n key={i}\n className={`${barWidth[size]} ${barHeight[size]} rounded-full`}\n style={{\n backgroundColor: color,\n animation: \"loading-wave 1.2s ease-in-out infinite\",\n animationDelay: `${i * 0.1}s`,\n }}\n />\n ))}\n <style>{`\n @keyframes loading-wave {\n 0%, 40%, 100% { transform: scaleY(0.4); }\n 20% { transform: scaleY(1); }\n }\n `}</style>\n </div>\n );\n}\n\n// Skeleton - Loading placeholder\nfunction Skeleton({\n width = \"100%\",\n height = \"1rem\",\n rounded = \"md\",\n}: {\n width?: string;\n height?: string;\n rounded?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"full\";\n}) {\n const roundedMap = {\n none: \"\",\n sm: \"rounded-sm\",\n md: \"rounded-md\",\n lg: \"rounded-lg\",\n full: \"rounded-full\",\n };\n\n return (\n <div\n className={`animate-pulse bg-neutral-200 dark:bg-neutral-700 ${roundedMap[rounded]}`}\n style={{ width, height }}\n />\n );\n}\n\nexport default function Loading({\n variant = \"spinner\",\n size = \"md\",\n color = \"#7367f0\",\n text,\n textPosition = \"right\",\n fullScreen = false,\n overlay = false,\n className = \"\",\n skeletonWidth,\n skeletonHeight,\n skeletonRounded = \"md\",\n}: LoadingProps) {\n const renderLoader = () => {\n switch (variant) {\n case \"spinner\":\n return <Spinner size={size} color={color} />;\n case \"dots\":\n return <Dots size={size} color={color} />;\n case \"pulse\":\n return <Pulse size={size} color={color} />;\n case \"bars\":\n return <Bars size={size} color={color} />;\n case \"ring\":\n return <Ring size={size} color={color} />;\n case \"bounce\":\n return <Bounce size={size} color={color} />;\n case \"wave\":\n return <Wave size={size} color={color} />;\n case \"skeleton\":\n return (\n <Skeleton\n width={skeletonWidth}\n height={skeletonHeight}\n rounded={skeletonRounded}\n />\n );\n default:\n return <Spinner size={size} color={color} />;\n }\n };\n\n const content = (\n <div\n className={`inline-flex items-center ${\n textPosition === \"bottom\" ? \"flex-col gap-2\" : \"flex-row gap-3\"\n } ${className}`}\n >\n {renderLoader()}\n {text && (\n <span\n className={`${sizeMap[size].text} text-neutral-600 dark:text-neutral-400 font-medium`}\n >\n {text}\n </span>\n )}\n </div>\n );\n\n if (fullScreen) {\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-white/80 dark:bg-neutral-950/80 backdrop-blur-sm\">\n {content}\n </div>\n );\n }\n\n if (overlay) {\n return (\n <div className=\"absolute inset-0 z-10 flex items-center justify-center bg-white/70 dark:bg-neutral-900/70 backdrop-blur-sm rounded-inherit\">\n {content}\n </div>\n );\n }\n\n return content;\n}\n\n// Export individual components for direct use\nexport { Spinner, Dots, Pulse, Bars, Ring, Bounce, Wave, Skeleton };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"loading-q7IEg56I.cjs","names":[],"sources":["../../src/components/data-display/loading/Loading.tsx"],"sourcesContent":["import { LoaderIcon, RingLoaderIcon } from \"../../icons\";\n\nexport type LoadingVariant =\n | \"spinner\"\n | \"dots\"\n | \"pulse\"\n | \"bars\"\n | \"ring\"\n | \"bounce\"\n | \"wave\"\n | \"skeleton\";\n\nexport type LoadingSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nexport interface LoadingProps {\n /** The variant/style of the loading indicator */\n variant?: LoadingVariant;\n /** Size of the loading indicator */\n size?: LoadingSize;\n /** Custom color for the loading indicator */\n color?: string;\n /** Text to display alongside the loading indicator */\n text?: string;\n /** Position of the text relative to the indicator */\n textPosition?: \"right\" | \"bottom\";\n /** Whether to show as a full-screen overlay */\n fullScreen?: boolean;\n /** Whether to show as an overlay within parent container */\n overlay?: boolean;\n /** Custom className */\n className?: string;\n /** Skeleton specific: width */\n skeletonWidth?: string;\n /** Skeleton specific: height */\n skeletonHeight?: string;\n /** Skeleton specific: rounded style */\n skeletonRounded?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"full\";\n}\n\nconst sizeMap: Record<LoadingSize, { container: string; text: string }> = {\n xs: { container: \"w-4 h-4\", text: \"text-xs\" },\n sm: { container: \"w-6 h-6\", text: \"text-sm\" },\n md: { container: \"w-8 h-8\", text: \"text-sm\" },\n lg: { container: \"w-12 h-12\", text: \"text-base\" },\n xl: { container: \"w-16 h-16\", text: \"text-lg\" },\n};\n\n// Spinner - Classic rotating circle\nfunction Spinner({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n return (\n <LoaderIcon\n className={`animate-spin ${sizeMap[size].container}`}\n color={color}\n aria-hidden=\"true\"\n />\n );\n}\n\n// Dots - Three bouncing dots\nfunction Dots({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const dotSize = {\n xs: \"w-1.5 h-1.5\",\n sm: \"w-2 h-2\",\n md: \"w-2.5 h-2.5\",\n lg: \"w-3 h-3\",\n xl: \"w-4 h-4\",\n };\n\n return (\n <div className=\"flex items-center gap-1\">\n {[0, 1, 2].map((i) => (\n <div\n key={i}\n className={`${dotSize[size]} rounded-full animate-bounce`}\n style={{\n backgroundColor: color,\n animationDelay: `${i * 0.15}s`,\n animationDuration: \"0.6s\",\n }}\n />\n ))}\n </div>\n );\n}\n\n// Pulse - Pulsing circle\nfunction Pulse({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n return (\n <div className={`relative ${sizeMap[size].container}`}>\n <div\n className=\"absolute inset-0 rounded-full animate-ping opacity-75\"\n style={{ backgroundColor: color }}\n />\n <div\n className=\"absolute inset-2 rounded-full\"\n style={{ backgroundColor: color }}\n />\n </div>\n );\n}\n\n// Bars - Audio-style animated bars\nfunction Bars({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const barWidth = {\n xs: \"w-0.5\",\n sm: \"w-1\",\n md: \"w-1.5\",\n lg: \"w-2\",\n xl: \"w-2.5\",\n };\n\n return (\n <div className={`flex items-end gap-0.5 ${sizeMap[size].container}`}>\n {[0, 1, 2, 3, 4].map((i) => (\n <div\n key={i}\n className={`${barWidth[size]} rounded-sm`}\n style={{\n backgroundColor: color,\n animation: \"loading-bars 1s ease-in-out infinite\",\n animationDelay: `${i * 0.1}s`,\n height: \"40%\",\n }}\n />\n ))}\n <style>{`\n @keyframes loading-bars {\n 0%, 100% { height: 40%; }\n 50% { height: 100%; }\n }\n `}</style>\n </div>\n );\n}\n\n// Ring - Rotating ring with gradient\nfunction Ring({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const strokeWidth = {\n xs: 3,\n sm: 3,\n md: 4,\n lg: 4,\n xl: 5,\n };\n\n return (\n <RingLoaderIcon\n className={`animate-spin ${sizeMap[size].container}`}\n color={color}\n strokeWidth={strokeWidth[size]}\n aria-hidden=\"true\"\n />\n );\n}\n\n// Bounce - Three bouncing circles\nfunction Bounce({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const dotSize = {\n xs: \"w-2 h-2\",\n sm: \"w-3 h-3\",\n md: \"w-4 h-4\",\n lg: \"w-5 h-5\",\n xl: \"w-6 h-6\",\n };\n\n return (\n <div className=\"flex items-center gap-1\">\n {[0, 1, 2].map((i) => (\n <div\n key={i}\n className={`${dotSize[size]} rounded-full`}\n style={{\n backgroundColor: color,\n animation: \"loading-bounce 1.4s ease-in-out infinite both\",\n animationDelay: `${i * 0.16}s`,\n }}\n />\n ))}\n <style>{`\n @keyframes loading-bounce {\n 0%, 80%, 100% { transform: scale(0); }\n 40% { transform: scale(1); }\n }\n `}</style>\n </div>\n );\n}\n\n// Wave - Wave animation\nfunction Wave({\n size = \"md\",\n color = \"currentColor\",\n}: {\n size?: LoadingSize;\n color?: string;\n}) {\n const barHeight = {\n xs: \"h-3\",\n sm: \"h-4\",\n md: \"h-6\",\n lg: \"h-8\",\n xl: \"h-10\",\n };\n const barWidth = {\n xs: \"w-0.5\",\n sm: \"w-1\",\n md: \"w-1\",\n lg: \"w-1.5\",\n xl: \"w-2\",\n };\n\n return (\n <div className=\"flex items-center gap-0.5\">\n {[0, 1, 2, 3, 4].map((i) => (\n <div\n key={i}\n className={`${barWidth[size]} ${barHeight[size]} rounded-full`}\n style={{\n backgroundColor: color,\n animation: \"loading-wave 1.2s ease-in-out infinite\",\n animationDelay: `${i * 0.1}s`,\n }}\n />\n ))}\n <style>{`\n @keyframes loading-wave {\n 0%, 40%, 100% { transform: scaleY(0.4); }\n 20% { transform: scaleY(1); }\n }\n `}</style>\n </div>\n );\n}\n\n// Skeleton - Loading placeholder\nfunction Skeleton({\n width = \"100%\",\n height = \"1rem\",\n rounded = \"md\",\n}: {\n width?: string;\n height?: string;\n rounded?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"full\";\n}) {\n const roundedMap = {\n none: \"\",\n sm: \"rounded-sm\",\n md: \"rounded-md\",\n lg: \"rounded-lg\",\n full: \"rounded-full\",\n };\n\n return (\n <div\n className={`animate-pulse bg-neutral-200 dark:bg-neutral-700 ${roundedMap[rounded]}`}\n style={{ width, height }}\n />\n );\n}\n\nexport default function Loading({\n variant = \"spinner\",\n size = \"md\",\n color = \"#7367f0\",\n text,\n textPosition = \"right\",\n fullScreen = false,\n overlay = false,\n className = \"\",\n skeletonWidth,\n skeletonHeight,\n skeletonRounded = \"md\",\n}: LoadingProps) {\n const renderLoader = () => {\n switch (variant) {\n case \"spinner\":\n return <Spinner size={size} color={color} />;\n case \"dots\":\n return <Dots size={size} color={color} />;\n case \"pulse\":\n return <Pulse size={size} color={color} />;\n case \"bars\":\n return <Bars size={size} color={color} />;\n case \"ring\":\n return <Ring size={size} color={color} />;\n case \"bounce\":\n return <Bounce size={size} color={color} />;\n case \"wave\":\n return <Wave size={size} color={color} />;\n case \"skeleton\":\n return (\n <Skeleton\n width={skeletonWidth}\n height={skeletonHeight}\n rounded={skeletonRounded}\n />\n );\n default:\n return <Spinner size={size} color={color} />;\n }\n };\n\n const content = (\n <div\n className={`inline-flex items-center ${\n textPosition === \"bottom\" ? \"flex-col gap-2\" : \"flex-row gap-3\"\n } ${className}`}\n >\n {renderLoader()}\n {text && (\n <span\n className={`${sizeMap[size].text} text-neutral-600 dark:text-neutral-400 font-medium`}\n >\n {text}\n </span>\n )}\n </div>\n );\n\n if (fullScreen) {\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-white/80 dark:bg-neutral-950/80 backdrop-blur-sm\">\n {content}\n </div>\n );\n }\n\n if (overlay) {\n return (\n <div className=\"absolute inset-0 z-10 flex items-center justify-center bg-white/70 dark:bg-neutral-900/70 backdrop-blur-sm rounded-inherit\">\n {content}\n </div>\n );\n }\n\n return content;\n}\n\n// Export individual components for direct use\nexport { Spinner, Dots, Pulse, Bars, Ring, Bounce, Wave, Skeleton };\n"],"mappings":"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"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { n as mergeClassNames } from "./utils-ati1KkDb.mjs";
|
|
2
|
+
import { J as CheckIcon, N as ChevronDownIcon, q as CloseIcon } from "./icons-DuumN7z-.mjs";
|
|
3
|
+
import { useEffect, useRef, useState } from "react";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { motion, useMotionTemplate, useMotionValue } from "framer-motion";
|
|
6
|
+
//#region src/components/forms/multi-select-combobox/MultiSelectCombobox.tsx
|
|
7
|
+
var MultiSelectCombobox = ({ options, value = [], onChange, placeholder = "Select...", className, bgClassName = "bg-background-secondary" }) => {
|
|
8
|
+
const [open, setOpen] = useState(false);
|
|
9
|
+
const [search, setSearch] = useState("");
|
|
10
|
+
const [visible, setVisible] = useState(false);
|
|
11
|
+
const ref = useRef(null);
|
|
12
|
+
const mouseX = useMotionValue(0);
|
|
13
|
+
const mouseY = useMotionValue(0);
|
|
14
|
+
const radius = 100;
|
|
15
|
+
const filteredOptions = options.filter((opt) => opt.label.toLowerCase().includes(search.toLowerCase()));
|
|
16
|
+
useEffect(() => {
|
|
17
|
+
const handleClick = (e) => {
|
|
18
|
+
if (ref.current && !ref.current.contains(e.target)) {
|
|
19
|
+
setOpen(false);
|
|
20
|
+
setSearch("");
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
if (open) document.addEventListener("mousedown", handleClick);
|
|
24
|
+
return () => document.removeEventListener("mousedown", handleClick);
|
|
25
|
+
}, [open]);
|
|
26
|
+
const handleMouseMove = (event) => {
|
|
27
|
+
const { left, top } = event.currentTarget.getBoundingClientRect();
|
|
28
|
+
mouseX.set(event.clientX - left);
|
|
29
|
+
mouseY.set(event.clientY - top);
|
|
30
|
+
};
|
|
31
|
+
const handleOptionClick = (optionValue) => {
|
|
32
|
+
if (value.includes(optionValue)) onChange(value.filter((v) => v !== optionValue));
|
|
33
|
+
else onChange([...value, optionValue]);
|
|
34
|
+
};
|
|
35
|
+
const handleRemoveTag = (optionValue, e) => {
|
|
36
|
+
e.stopPropagation();
|
|
37
|
+
onChange(value.filter((v) => v !== optionValue));
|
|
38
|
+
};
|
|
39
|
+
const selectedLabels = value.map((v) => options.find((opt) => opt.value === v)?.label).filter(Boolean);
|
|
40
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
41
|
+
ref,
|
|
42
|
+
className: mergeClassNames("relative w-full", className),
|
|
43
|
+
tabIndex: 0,
|
|
44
|
+
children: [/* @__PURE__ */ jsx(motion.div, {
|
|
45
|
+
style: { backgroundImage: useMotionTemplate`
|
|
46
|
+
radial-gradient(
|
|
47
|
+
${visible ? `${radius}px` : "0px"} circle at ${mouseX}px ${mouseY}px,
|
|
48
|
+
var(--ds-color-accent),
|
|
49
|
+
transparent 90%
|
|
50
|
+
)
|
|
51
|
+
` },
|
|
52
|
+
onMouseMove: handleMouseMove,
|
|
53
|
+
onMouseEnter: () => setVisible(true),
|
|
54
|
+
onMouseLeave: () => setVisible(false),
|
|
55
|
+
className: "group/multi-combobox rounded-lg border-border p-[2px] transition duration-300 hover:border-accent",
|
|
56
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
57
|
+
className: mergeClassNames("shadow-input flex min-h-10 w-full cursor-pointer items-center justify-between rounded-md border border-input px-3 py-2 text-sm text-foreground transition duration-400 ease-in-out group-hover/multi-combobox:shadow-none", bgClassName),
|
|
58
|
+
onClick: () => {
|
|
59
|
+
setOpen((o) => {
|
|
60
|
+
if (o) setSearch("");
|
|
61
|
+
return !o;
|
|
62
|
+
});
|
|
63
|
+
},
|
|
64
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
65
|
+
className: "flex flex-1 flex-wrap gap-1",
|
|
66
|
+
children: selectedLabels.length > 0 ? selectedLabels.map((label, index) => /* @__PURE__ */ jsxs("span", {
|
|
67
|
+
className: "inline-flex items-center gap-1 rounded-md bg-accent-subtle px-2 py-0.5 text-xs font-medium text-accent",
|
|
68
|
+
children: [label, /* @__PURE__ */ jsx("button", {
|
|
69
|
+
type: "button",
|
|
70
|
+
onClick: (e) => handleRemoveTag(value[index], e),
|
|
71
|
+
className: "ml-0.5 rounded-full p-0.5 transition-colors hover:bg-accent/10",
|
|
72
|
+
children: /* @__PURE__ */ jsx(CloseIcon, {
|
|
73
|
+
className: "w-3 h-3",
|
|
74
|
+
"aria-hidden": "true"
|
|
75
|
+
})
|
|
76
|
+
})]
|
|
77
|
+
}, value[index])) : /* @__PURE__ */ jsx("span", {
|
|
78
|
+
className: "text-muted-foreground",
|
|
79
|
+
children: placeholder
|
|
80
|
+
})
|
|
81
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
82
|
+
className: mergeClassNames("ml-2 shrink-0 text-muted-foreground transition-transform duration-300", open ? "rotate-180" : "rotate-0"),
|
|
83
|
+
children: /* @__PURE__ */ jsx(ChevronDownIcon, {
|
|
84
|
+
width: 24,
|
|
85
|
+
height: 24,
|
|
86
|
+
color: "currentColor",
|
|
87
|
+
className: "h-5 w-5"
|
|
88
|
+
})
|
|
89
|
+
})]
|
|
90
|
+
})
|
|
91
|
+
}), open && /* @__PURE__ */ jsxs("div", {
|
|
92
|
+
className: "absolute right-0 left-0 z-20 mt-1 flex max-h-60 flex-col rounded-lg border border-border bg-background-secondary shadow-3 backdrop-blur-xl transition",
|
|
93
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
94
|
+
className: "sticky top-0 z-10 rounded-t-lg border-b border-border-muted bg-elevated/95 backdrop-blur-sm",
|
|
95
|
+
children: /* @__PURE__ */ jsx("input", {
|
|
96
|
+
autoFocus: true,
|
|
97
|
+
className: "w-full bg-transparent px-3 py-2 text-sm text-foreground outline-none placeholder:text-muted-foreground focus-visible:ring-2 focus-visible:ring-accent",
|
|
98
|
+
placeholder: "Type to search...",
|
|
99
|
+
value: search,
|
|
100
|
+
onChange: (e) => setSearch(e.target.value),
|
|
101
|
+
onClick: (e) => e.stopPropagation()
|
|
102
|
+
})
|
|
103
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
104
|
+
className: "max-h-80 flex-1 overflow-auto",
|
|
105
|
+
children: [filteredOptions.length === 0 && /* @__PURE__ */ jsx("div", {
|
|
106
|
+
className: "p-3 text-center text-muted-foreground text-sm",
|
|
107
|
+
children: "No options found"
|
|
108
|
+
}), filteredOptions.map((option) => {
|
|
109
|
+
const isSelected = value.includes(option.value);
|
|
110
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
111
|
+
className: mergeClassNames("flex cursor-pointer items-center gap-2 px-3 py-2 text-sm transition", isSelected ? "bg-accent-subtle text-accent" : "text-foreground hover:bg-accent hover:text-on-accent"),
|
|
112
|
+
onClick: () => handleOptionClick(option.value),
|
|
113
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
114
|
+
className: mergeClassNames("flex h-4 w-4 items-center justify-center rounded border transition", isSelected ? "border-accent bg-accent text-on-accent" : "border-border"),
|
|
115
|
+
children: isSelected && /* @__PURE__ */ jsx(CheckIcon, {
|
|
116
|
+
width: 12,
|
|
117
|
+
height: 12
|
|
118
|
+
})
|
|
119
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
120
|
+
className: "flex-1",
|
|
121
|
+
children: option.label
|
|
122
|
+
})]
|
|
123
|
+
}, option.value);
|
|
124
|
+
})]
|
|
125
|
+
})]
|
|
126
|
+
})]
|
|
127
|
+
});
|
|
128
|
+
};
|
|
129
|
+
//#endregion
|
|
130
|
+
export { MultiSelectCombobox as t };
|
|
131
|
+
|
|
132
|
+
//# sourceMappingURL=multi-select-combobox-ELSH_Xr4.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-select-combobox-ELSH_Xr4.mjs","names":[],"sources":["../../src/components/forms/multi-select-combobox/MultiSelectCombobox.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from \"react\";\nimport { motion, useMotionTemplate, useMotionValue } from \"framer-motion\";\n\nimport { CheckIcon, ChevronDownIcon, CloseIcon } from \"../../icons\";\nimport { mergeClassNames } from \"../../../utils\";\n\nexport interface MultiSelectOption {\n label: string;\n value: string;\n}\n\nexport interface MultiSelectComboboxProps {\n options: MultiSelectOption[];\n value: string[];\n onChange: (values: string[]) => void;\n placeholder?: string;\n className?: string;\n bgClassName?: string;\n}\n\nconst MultiSelectCombobox: React.FC<MultiSelectComboboxProps> = ({\n options,\n value = [],\n onChange,\n placeholder = \"Select...\",\n className,\n bgClassName = \"bg-background-secondary\",\n}) => {\n const [open, setOpen] = useState(false);\n const [search, setSearch] = useState(\"\");\n const [visible, setVisible] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n const mouseX = useMotionValue(0);\n const mouseY = useMotionValue(0);\n const radius = 100;\n\n // Filter options by search\n const filteredOptions = options.filter((opt) =>\n opt.label.toLowerCase().includes(search.toLowerCase()),\n );\n\n // Close dropdown on outside click\n useEffect(() => {\n const handleClick = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) {\n setOpen(false);\n setSearch(\"\");\n }\n };\n if (open) {\n document.addEventListener(\"mousedown\", handleClick);\n }\n return () => document.removeEventListener(\"mousedown\", handleClick);\n }, [open]);\n\n const handleMouseMove = (event: React.MouseEvent<HTMLDivElement>) => {\n const { left, top } = event.currentTarget.getBoundingClientRect();\n mouseX.set(event.clientX - left);\n mouseY.set(event.clientY - top);\n };\n\n const handleOptionClick = (optionValue: string) => {\n if (value.includes(optionValue)) {\n onChange(value.filter((v) => v !== optionValue));\n } else {\n onChange([...value, optionValue]);\n }\n };\n\n const handleRemoveTag = (optionValue: string, e: React.MouseEvent) => {\n e.stopPropagation();\n onChange(value.filter((v) => v !== optionValue));\n };\n\n const selectedLabels = value\n .map((v) => options.find((opt) => opt.value === v)?.label)\n .filter(Boolean);\n\n return (\n <div\n ref={ref}\n className={mergeClassNames(\"relative w-full\", className)}\n tabIndex={0}\n >\n <motion.div\n style={{\n backgroundImage: useMotionTemplate`\n radial-gradient(\n ${visible ? `${radius}px` : \"0px\"} circle at ${mouseX}px ${mouseY}px,\n var(--ds-color-accent),\n transparent 90%\n )\n `,\n }}\n onMouseMove={handleMouseMove}\n onMouseEnter={() => setVisible(true)}\n onMouseLeave={() => setVisible(false)}\n className=\"group/multi-combobox rounded-lg border-border p-[2px] transition duration-300 hover:border-accent\"\n >\n <div\n className={mergeClassNames(\n \"shadow-input flex min-h-10 w-full cursor-pointer items-center justify-between rounded-md border border-input px-3 py-2 text-sm text-foreground transition duration-400 ease-in-out group-hover/multi-combobox:shadow-none\",\n bgClassName,\n )}\n onClick={() => {\n setOpen((o) => {\n if (o) setSearch(\"\");\n return !o;\n });\n }}\n >\n <div className=\"flex flex-1 flex-wrap gap-1\">\n {selectedLabels.length > 0 ? (\n selectedLabels.map((label, index) => (\n <span\n key={value[index]}\n className=\"inline-flex items-center gap-1 rounded-md bg-accent-subtle px-2 py-0.5 text-xs font-medium text-accent\"\n >\n {label}\n <button\n type=\"button\"\n onClick={(e) => handleRemoveTag(value[index], e)}\n className=\"ml-0.5 rounded-full p-0.5 transition-colors hover:bg-accent/10\"\n >\n <CloseIcon className=\"w-3 h-3\" aria-hidden=\"true\" />\n </button>\n </span>\n ))\n ) : (\n <span className=\"text-muted-foreground\">{placeholder}</span>\n )}\n </div>\n <span\n className={mergeClassNames(\n \"ml-2 shrink-0 text-muted-foreground transition-transform duration-300\",\n open ? \"rotate-180\" : \"rotate-0\",\n )}\n >\n <ChevronDownIcon\n width={24}\n height={24}\n color=\"currentColor\"\n className=\"h-5 w-5\"\n />\n </span>\n </div>\n </motion.div>\n {open && (\n <div className=\"absolute right-0 left-0 z-20 mt-1 flex max-h-60 flex-col rounded-lg border border-border bg-background-secondary shadow-3 backdrop-blur-xl transition\">\n {/* Sticky search input */}\n <div className=\"sticky top-0 z-10 rounded-t-lg border-b border-border-muted bg-elevated/95 backdrop-blur-sm\">\n <input\n autoFocus\n className=\"w-full bg-transparent px-3 py-2 text-sm text-foreground outline-none placeholder:text-muted-foreground focus-visible:ring-2 focus-visible:ring-accent\"\n placeholder=\"Type to search...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onClick={(e) => e.stopPropagation()}\n />\n </div>\n {/* Scrollable options */}\n <div className=\"max-h-80 flex-1 overflow-auto\">\n {filteredOptions.length === 0 && (\n <div className=\"p-3 text-center text-muted-foreground text-sm\">\n No options found\n </div>\n )}\n {filteredOptions.map((option) => {\n const isSelected = value.includes(option.value);\n return (\n <div\n key={option.value}\n className={mergeClassNames(\n \"flex cursor-pointer items-center gap-2 px-3 py-2 text-sm transition\",\n isSelected\n ? \"bg-accent-subtle text-accent\"\n : \"text-foreground hover:bg-accent hover:text-on-accent\",\n )}\n onClick={() => handleOptionClick(option.value)}\n >\n <span\n className={mergeClassNames(\n \"flex h-4 w-4 items-center justify-center rounded border transition\",\n isSelected\n ? \"border-accent bg-accent text-on-accent\"\n : \"border-border\",\n )}\n >\n {isSelected && <CheckIcon width={12} height={12} />}\n </span>\n <span className=\"flex-1\">{option.label}</span>\n </div>\n );\n })}\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default MultiSelectCombobox;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
const require_chunk = require("./chunk-B_GkZjkl.cjs");
|
|
2
|
+
const require_utils = require("./utils-B4SmmY4J.cjs");
|
|
3
|
+
const require_icons = require("./icons-BxIzP2jd.cjs");
|
|
4
|
+
let react = require("react");
|
|
5
|
+
react = require_chunk.__toESM(react);
|
|
6
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
7
|
+
let framer_motion = require("framer-motion");
|
|
8
|
+
//#region src/components/forms/multi-select-combobox/MultiSelectCombobox.tsx
|
|
9
|
+
var MultiSelectCombobox = ({ options, value = [], onChange, placeholder = "Select...", className, bgClassName = "bg-background-secondary" }) => {
|
|
10
|
+
const [open, setOpen] = (0, react.useState)(false);
|
|
11
|
+
const [search, setSearch] = (0, react.useState)("");
|
|
12
|
+
const [visible, setVisible] = (0, react.useState)(false);
|
|
13
|
+
const ref = (0, react.useRef)(null);
|
|
14
|
+
const mouseX = (0, framer_motion.useMotionValue)(0);
|
|
15
|
+
const mouseY = (0, framer_motion.useMotionValue)(0);
|
|
16
|
+
const radius = 100;
|
|
17
|
+
const filteredOptions = options.filter((opt) => opt.label.toLowerCase().includes(search.toLowerCase()));
|
|
18
|
+
(0, react.useEffect)(() => {
|
|
19
|
+
const handleClick = (e) => {
|
|
20
|
+
if (ref.current && !ref.current.contains(e.target)) {
|
|
21
|
+
setOpen(false);
|
|
22
|
+
setSearch("");
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
if (open) document.addEventListener("mousedown", handleClick);
|
|
26
|
+
return () => document.removeEventListener("mousedown", handleClick);
|
|
27
|
+
}, [open]);
|
|
28
|
+
const handleMouseMove = (event) => {
|
|
29
|
+
const { left, top } = event.currentTarget.getBoundingClientRect();
|
|
30
|
+
mouseX.set(event.clientX - left);
|
|
31
|
+
mouseY.set(event.clientY - top);
|
|
32
|
+
};
|
|
33
|
+
const handleOptionClick = (optionValue) => {
|
|
34
|
+
if (value.includes(optionValue)) onChange(value.filter((v) => v !== optionValue));
|
|
35
|
+
else onChange([...value, optionValue]);
|
|
36
|
+
};
|
|
37
|
+
const handleRemoveTag = (optionValue, e) => {
|
|
38
|
+
e.stopPropagation();
|
|
39
|
+
onChange(value.filter((v) => v !== optionValue));
|
|
40
|
+
};
|
|
41
|
+
const selectedLabels = value.map((v) => options.find((opt) => opt.value === v)?.label).filter(Boolean);
|
|
42
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
43
|
+
ref,
|
|
44
|
+
className: require_utils.mergeClassNames("relative w-full", className),
|
|
45
|
+
tabIndex: 0,
|
|
46
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(framer_motion.motion.div, {
|
|
47
|
+
style: { backgroundImage: framer_motion.useMotionTemplate`
|
|
48
|
+
radial-gradient(
|
|
49
|
+
${visible ? `${radius}px` : "0px"} circle at ${mouseX}px ${mouseY}px,
|
|
50
|
+
var(--ds-color-accent),
|
|
51
|
+
transparent 90%
|
|
52
|
+
)
|
|
53
|
+
` },
|
|
54
|
+
onMouseMove: handleMouseMove,
|
|
55
|
+
onMouseEnter: () => setVisible(true),
|
|
56
|
+
onMouseLeave: () => setVisible(false),
|
|
57
|
+
className: "group/multi-combobox rounded-lg border-border p-[2px] transition duration-300 hover:border-accent",
|
|
58
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
59
|
+
className: require_utils.mergeClassNames("shadow-input flex min-h-10 w-full cursor-pointer items-center justify-between rounded-md border border-input px-3 py-2 text-sm text-foreground transition duration-400 ease-in-out group-hover/multi-combobox:shadow-none", bgClassName),
|
|
60
|
+
onClick: () => {
|
|
61
|
+
setOpen((o) => {
|
|
62
|
+
if (o) setSearch("");
|
|
63
|
+
return !o;
|
|
64
|
+
});
|
|
65
|
+
},
|
|
66
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
67
|
+
className: "flex flex-1 flex-wrap gap-1",
|
|
68
|
+
children: selectedLabels.length > 0 ? selectedLabels.map((label, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
69
|
+
className: "inline-flex items-center gap-1 rounded-md bg-accent-subtle px-2 py-0.5 text-xs font-medium text-accent",
|
|
70
|
+
children: [label, /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
71
|
+
type: "button",
|
|
72
|
+
onClick: (e) => handleRemoveTag(value[index], e),
|
|
73
|
+
className: "ml-0.5 rounded-full p-0.5 transition-colors hover:bg-accent/10",
|
|
74
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_icons.CloseIcon, {
|
|
75
|
+
className: "w-3 h-3",
|
|
76
|
+
"aria-hidden": "true"
|
|
77
|
+
})
|
|
78
|
+
})]
|
|
79
|
+
}, value[index])) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
80
|
+
className: "text-muted-foreground",
|
|
81
|
+
children: placeholder
|
|
82
|
+
})
|
|
83
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
84
|
+
className: require_utils.mergeClassNames("ml-2 shrink-0 text-muted-foreground transition-transform duration-300", open ? "rotate-180" : "rotate-0"),
|
|
85
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_icons.ChevronDownIcon, {
|
|
86
|
+
width: 24,
|
|
87
|
+
height: 24,
|
|
88
|
+
color: "currentColor",
|
|
89
|
+
className: "h-5 w-5"
|
|
90
|
+
})
|
|
91
|
+
})]
|
|
92
|
+
})
|
|
93
|
+
}), open && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
94
|
+
className: "absolute right-0 left-0 z-20 mt-1 flex max-h-60 flex-col rounded-lg border border-border bg-background-secondary shadow-3 backdrop-blur-xl transition",
|
|
95
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
96
|
+
className: "sticky top-0 z-10 rounded-t-lg border-b border-border-muted bg-elevated/95 backdrop-blur-sm",
|
|
97
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
98
|
+
autoFocus: true,
|
|
99
|
+
className: "w-full bg-transparent px-3 py-2 text-sm text-foreground outline-none placeholder:text-muted-foreground focus-visible:ring-2 focus-visible:ring-accent",
|
|
100
|
+
placeholder: "Type to search...",
|
|
101
|
+
value: search,
|
|
102
|
+
onChange: (e) => setSearch(e.target.value),
|
|
103
|
+
onClick: (e) => e.stopPropagation()
|
|
104
|
+
})
|
|
105
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
106
|
+
className: "max-h-80 flex-1 overflow-auto",
|
|
107
|
+
children: [filteredOptions.length === 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
108
|
+
className: "p-3 text-center text-muted-foreground text-sm",
|
|
109
|
+
children: "No options found"
|
|
110
|
+
}), filteredOptions.map((option) => {
|
|
111
|
+
const isSelected = value.includes(option.value);
|
|
112
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
113
|
+
className: require_utils.mergeClassNames("flex cursor-pointer items-center gap-2 px-3 py-2 text-sm transition", isSelected ? "bg-accent-subtle text-accent" : "text-foreground hover:bg-accent hover:text-on-accent"),
|
|
114
|
+
onClick: () => handleOptionClick(option.value),
|
|
115
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
116
|
+
className: require_utils.mergeClassNames("flex h-4 w-4 items-center justify-center rounded border transition", isSelected ? "border-accent bg-accent text-on-accent" : "border-border"),
|
|
117
|
+
children: isSelected && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_icons.CheckIcon, {
|
|
118
|
+
width: 12,
|
|
119
|
+
height: 12
|
|
120
|
+
})
|
|
121
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
122
|
+
className: "flex-1",
|
|
123
|
+
children: option.label
|
|
124
|
+
})]
|
|
125
|
+
}, option.value);
|
|
126
|
+
})]
|
|
127
|
+
})]
|
|
128
|
+
})]
|
|
129
|
+
});
|
|
130
|
+
};
|
|
131
|
+
//#endregion
|
|
132
|
+
Object.defineProperty(exports, "MultiSelectCombobox", {
|
|
133
|
+
enumerable: true,
|
|
134
|
+
get: function() {
|
|
135
|
+
return MultiSelectCombobox;
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
//# sourceMappingURL=multi-select-combobox-UW0X15W7.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-select-combobox-UW0X15W7.cjs","names":[],"sources":["../../src/components/forms/multi-select-combobox/MultiSelectCombobox.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from \"react\";\nimport { motion, useMotionTemplate, useMotionValue } from \"framer-motion\";\n\nimport { CheckIcon, ChevronDownIcon, CloseIcon } from \"../../icons\";\nimport { mergeClassNames } from \"../../../utils\";\n\nexport interface MultiSelectOption {\n label: string;\n value: string;\n}\n\nexport interface MultiSelectComboboxProps {\n options: MultiSelectOption[];\n value: string[];\n onChange: (values: string[]) => void;\n placeholder?: string;\n className?: string;\n bgClassName?: string;\n}\n\nconst MultiSelectCombobox: React.FC<MultiSelectComboboxProps> = ({\n options,\n value = [],\n onChange,\n placeholder = \"Select...\",\n className,\n bgClassName = \"bg-background-secondary\",\n}) => {\n const [open, setOpen] = useState(false);\n const [search, setSearch] = useState(\"\");\n const [visible, setVisible] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n const mouseX = useMotionValue(0);\n const mouseY = useMotionValue(0);\n const radius = 100;\n\n // Filter options by search\n const filteredOptions = options.filter((opt) =>\n opt.label.toLowerCase().includes(search.toLowerCase()),\n );\n\n // Close dropdown on outside click\n useEffect(() => {\n const handleClick = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) {\n setOpen(false);\n setSearch(\"\");\n }\n };\n if (open) {\n document.addEventListener(\"mousedown\", handleClick);\n }\n return () => document.removeEventListener(\"mousedown\", handleClick);\n }, [open]);\n\n const handleMouseMove = (event: React.MouseEvent<HTMLDivElement>) => {\n const { left, top } = event.currentTarget.getBoundingClientRect();\n mouseX.set(event.clientX - left);\n mouseY.set(event.clientY - top);\n };\n\n const handleOptionClick = (optionValue: string) => {\n if (value.includes(optionValue)) {\n onChange(value.filter((v) => v !== optionValue));\n } else {\n onChange([...value, optionValue]);\n }\n };\n\n const handleRemoveTag = (optionValue: string, e: React.MouseEvent) => {\n e.stopPropagation();\n onChange(value.filter((v) => v !== optionValue));\n };\n\n const selectedLabels = value\n .map((v) => options.find((opt) => opt.value === v)?.label)\n .filter(Boolean);\n\n return (\n <div\n ref={ref}\n className={mergeClassNames(\"relative w-full\", className)}\n tabIndex={0}\n >\n <motion.div\n style={{\n backgroundImage: useMotionTemplate`\n radial-gradient(\n ${visible ? `${radius}px` : \"0px\"} circle at ${mouseX}px ${mouseY}px,\n var(--ds-color-accent),\n transparent 90%\n )\n `,\n }}\n onMouseMove={handleMouseMove}\n onMouseEnter={() => setVisible(true)}\n onMouseLeave={() => setVisible(false)}\n className=\"group/multi-combobox rounded-lg border-border p-[2px] transition duration-300 hover:border-accent\"\n >\n <div\n className={mergeClassNames(\n \"shadow-input flex min-h-10 w-full cursor-pointer items-center justify-between rounded-md border border-input px-3 py-2 text-sm text-foreground transition duration-400 ease-in-out group-hover/multi-combobox:shadow-none\",\n bgClassName,\n )}\n onClick={() => {\n setOpen((o) => {\n if (o) setSearch(\"\");\n return !o;\n });\n }}\n >\n <div className=\"flex flex-1 flex-wrap gap-1\">\n {selectedLabels.length > 0 ? (\n selectedLabels.map((label, index) => (\n <span\n key={value[index]}\n className=\"inline-flex items-center gap-1 rounded-md bg-accent-subtle px-2 py-0.5 text-xs font-medium text-accent\"\n >\n {label}\n <button\n type=\"button\"\n onClick={(e) => handleRemoveTag(value[index], e)}\n className=\"ml-0.5 rounded-full p-0.5 transition-colors hover:bg-accent/10\"\n >\n <CloseIcon className=\"w-3 h-3\" aria-hidden=\"true\" />\n </button>\n </span>\n ))\n ) : (\n <span className=\"text-muted-foreground\">{placeholder}</span>\n )}\n </div>\n <span\n className={mergeClassNames(\n \"ml-2 shrink-0 text-muted-foreground transition-transform duration-300\",\n open ? \"rotate-180\" : \"rotate-0\",\n )}\n >\n <ChevronDownIcon\n width={24}\n height={24}\n color=\"currentColor\"\n className=\"h-5 w-5\"\n />\n </span>\n </div>\n </motion.div>\n {open && (\n <div className=\"absolute right-0 left-0 z-20 mt-1 flex max-h-60 flex-col rounded-lg border border-border bg-background-secondary shadow-3 backdrop-blur-xl transition\">\n {/* Sticky search input */}\n <div className=\"sticky top-0 z-10 rounded-t-lg border-b border-border-muted bg-elevated/95 backdrop-blur-sm\">\n <input\n autoFocus\n className=\"w-full bg-transparent px-3 py-2 text-sm text-foreground outline-none placeholder:text-muted-foreground focus-visible:ring-2 focus-visible:ring-accent\"\n placeholder=\"Type to search...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n onClick={(e) => e.stopPropagation()}\n />\n </div>\n {/* Scrollable options */}\n <div className=\"max-h-80 flex-1 overflow-auto\">\n {filteredOptions.length === 0 && (\n <div className=\"p-3 text-center text-muted-foreground text-sm\">\n No options found\n </div>\n )}\n {filteredOptions.map((option) => {\n const isSelected = value.includes(option.value);\n return (\n <div\n key={option.value}\n className={mergeClassNames(\n \"flex cursor-pointer items-center gap-2 px-3 py-2 text-sm transition\",\n isSelected\n ? \"bg-accent-subtle text-accent\"\n : \"text-foreground hover:bg-accent hover:text-on-accent\",\n )}\n onClick={() => handleOptionClick(option.value)}\n >\n <span\n className={mergeClassNames(\n \"flex h-4 w-4 items-center justify-center rounded border transition\",\n isSelected\n ? \"border-accent bg-accent text-on-accent\"\n : \"border-border\",\n )}\n >\n {isSelected && <CheckIcon width={12} height={12} />}\n </span>\n <span className=\"flex-1\">{option.label}</span>\n </div>\n );\n })}\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default MultiSelectCombobox;\n"],"mappings":"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"}
|
|
@@ -9,19 +9,19 @@ var sizeStyles = {
|
|
|
9
9
|
};
|
|
10
10
|
var variantStyles = {
|
|
11
11
|
outlined: {
|
|
12
|
-
base: "border border-
|
|
13
|
-
focus: "focus:border-
|
|
14
|
-
error: "border-
|
|
12
|
+
base: "border border-input bg-background-secondary rounded-lg shadow-input text-foreground",
|
|
13
|
+
focus: "focus:border-accent focus:ring-2 focus:ring-accent",
|
|
14
|
+
error: "border-destructive"
|
|
15
15
|
},
|
|
16
16
|
filled: {
|
|
17
|
-
base: "border border-transparent bg-
|
|
18
|
-
focus: "focus:border-
|
|
19
|
-
error: "bg-
|
|
17
|
+
base: "border border-transparent bg-accent-subtle rounded-lg text-foreground",
|
|
18
|
+
focus: "focus:border-accent focus:bg-background-secondary focus:ring-2 focus:ring-accent",
|
|
19
|
+
error: "bg-danger-subtle border-danger-border"
|
|
20
20
|
},
|
|
21
21
|
underlined: {
|
|
22
|
-
base: "border-b-2 border-
|
|
23
|
-
focus: "focus:border-
|
|
24
|
-
error: "border-
|
|
22
|
+
base: "border-b-2 border-border-strong bg-transparent rounded-none text-foreground",
|
|
23
|
+
focus: "focus:border-accent",
|
|
24
|
+
error: "border-destructive"
|
|
25
25
|
}
|
|
26
26
|
};
|
|
27
27
|
var OTPInput = (0, react.forwardRef)(({ length = 6, onChange, onComplete, value: controlledValue, defaultValue = "", size = "md", variant = "outlined", disabled = false, error = false, errorMessage, placeholder = "", mask = false, autoFocus = false, type = "number", className = "", inputClassName = "", separator = /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
@@ -148,13 +148,12 @@ var OTPInput = (0, react.forwardRef)(({ length = 6, onChange, onComplete, value:
|
|
|
148
148
|
"aria-label": `${ariaLabel} digit ${i + 1}`,
|
|
149
149
|
className: `
|
|
150
150
|
text-center font-semibold outline-none transition-all
|
|
151
|
-
text-
|
|
152
|
-
placeholder:text-neutral-300 dark:placeholder:text-neutral-600
|
|
151
|
+
placeholder:text-muted-foreground
|
|
153
152
|
${sizeStyles[size]}
|
|
154
153
|
${variantStyles[variant].base}
|
|
155
154
|
${!error ? variantStyles[variant].focus : ""}
|
|
156
155
|
${error ? variantStyles[variant].error : ""}
|
|
157
|
-
${disabled ? "opacity-50 cursor-not-allowed bg-
|
|
156
|
+
${disabled ? "opacity-50 cursor-not-allowed bg-muted" : ""}
|
|
158
157
|
${inputClassName}
|
|
159
158
|
`
|
|
160
159
|
}, i));
|
|
@@ -170,7 +169,7 @@ var OTPInput = (0, react.forwardRef)(({ length = 6, onChange, onComplete, value:
|
|
|
170
169
|
"aria-label": ariaLabel,
|
|
171
170
|
children: renderInputs()
|
|
172
171
|
}), error && errorMessage && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
173
|
-
className: "text-sm text-
|
|
172
|
+
className: "text-sm text-destructive",
|
|
174
173
|
children: errorMessage
|
|
175
174
|
})]
|
|
176
175
|
});
|
|
@@ -184,4 +183,4 @@ Object.defineProperty(exports, "OTPInput", {
|
|
|
184
183
|
}
|
|
185
184
|
});
|
|
186
185
|
|
|
187
|
-
//# sourceMappingURL=otp-input-
|
|
186
|
+
//# sourceMappingURL=otp-input-B6zzOEqw.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otp-input-B6zzOEqw.cjs","names":[],"sources":["../../src/components/forms/otp-input/OTPInput.tsx"],"sourcesContent":["import {\n forwardRef,\n useState,\n useRef,\n useCallback,\n useEffect,\n type KeyboardEvent,\n type ClipboardEvent,\n type ChangeEvent,\n} from \"react\";\n\nexport type OTPInputSize = \"sm\" | \"md\" | \"lg\";\nexport type OTPInputVariant = \"outlined\" | \"filled\" | \"underlined\";\n\nexport interface OTPInputProps {\n /** Number of OTP digits */\n length?: number;\n /** Callback when OTP value changes */\n onChange?: (value: string) => void;\n /** Callback when all digits are filled */\n onComplete?: (value: string) => void;\n /** The current value (controlled) */\n value?: string;\n /** Default value (uncontrolled) */\n defaultValue?: string;\n /** Size of the input boxes */\n size?: OTPInputSize;\n /** Visual variant */\n variant?: OTPInputVariant;\n /** Whether the input is disabled */\n disabled?: boolean;\n /** Whether there's an error */\n error?: boolean;\n /** Error message to display */\n errorMessage?: string;\n /** Placeholder character */\n placeholder?: string;\n /** Whether to mask the input (like password) */\n mask?: boolean;\n /** Whether to auto-focus the first input */\n autoFocus?: boolean;\n /** Input type - number only or alphanumeric */\n type?: \"number\" | \"text\";\n /** Custom className for the container */\n className?: string;\n /** Custom className for each input box */\n inputClassName?: string;\n /** Separator to show between groups of digits */\n separator?: React.ReactNode;\n /** Position(s) to show separator (e.g., [3] means after 3rd digit) */\n separatorPositions?: number[];\n /** Accessible label */\n \"aria-label\"?: string;\n}\n\nconst sizeStyles: Record<OTPInputSize, string> = {\n sm: \"w-9 h-10 text-base\",\n md: \"w-12 h-14 text-xl\",\n lg: \"w-14 h-16 text-2xl\",\n};\n\nconst variantStyles: Record<\n OTPInputVariant,\n { base: string; focus: string; error: string }\n> = {\n outlined: {\n base: \"border border-input bg-background-secondary rounded-lg shadow-input text-foreground\",\n focus: \"focus:border-accent focus:ring-2 focus:ring-accent\",\n error: \"border-destructive\",\n },\n filled: {\n base: \"border border-transparent bg-accent-subtle rounded-lg text-foreground\",\n focus:\n \"focus:border-accent focus:bg-background-secondary focus:ring-2 focus:ring-accent\",\n error: \"bg-danger-subtle border-danger-border\",\n },\n underlined: {\n base: \"border-b-2 border-border-strong bg-transparent rounded-none text-foreground\",\n focus: \"focus:border-accent\",\n error: \"border-destructive\",\n },\n};\n\nconst OTPInput = forwardRef<HTMLDivElement, OTPInputProps>(\n (\n {\n length = 6,\n onChange,\n onComplete,\n value: controlledValue,\n defaultValue = \"\",\n size = \"md\",\n variant = \"outlined\",\n disabled = false,\n error = false,\n errorMessage,\n placeholder = \"\",\n mask = false,\n autoFocus = false,\n type = \"number\",\n className = \"\",\n inputClassName = \"\",\n separator = <span className=\"text-neutral-400 text-2xl mx-2\">—</span>,\n separatorPositions = [],\n \"aria-label\": ariaLabel = \"One-time password\",\n },\n ref,\n ) => {\n const [values, setValues] = useState<string[]>(() => {\n const initial = controlledValue ?? defaultValue;\n return initial\n .split(\"\")\n .slice(0, length)\n .concat(Array(length).fill(\"\"))\n .slice(0, length);\n });\n\n const inputRefs = useRef<(HTMLInputElement | null)[]>([]);\n\n // Sync with controlled value\n useEffect(() => {\n if (controlledValue !== undefined) {\n const newValues = controlledValue\n .split(\"\")\n .slice(0, length)\n .concat(Array(length).fill(\"\"))\n .slice(0, length);\n setValues(newValues);\n }\n }, [controlledValue, length]);\n\n // Auto-focus first input\n useEffect(() => {\n if (autoFocus && inputRefs.current[0]) {\n inputRefs.current[0].focus();\n }\n }, [autoFocus]);\n\n const focusInput = useCallback(\n (index: number) => {\n if (index >= 0 && index < length && inputRefs.current[index]) {\n inputRefs.current[index]?.focus();\n inputRefs.current[index]?.select();\n }\n },\n [length],\n );\n\n const handleChange = useCallback(\n (index: number, e: ChangeEvent<HTMLInputElement>) => {\n const inputValue = e.target.value;\n const char = inputValue.slice(-1);\n\n // Validate input based on type\n if (type === \"number\" && char && !/^\\d$/.test(char)) {\n return;\n }\n\n const newValues = [...values];\n newValues[index] = char;\n setValues(newValues);\n\n const otpValue = newValues.join(\"\");\n onChange?.(otpValue);\n\n // Move to next input if value entered\n if (char && index < length - 1) {\n focusInput(index + 1);\n }\n\n // Check if complete\n if (newValues.every((v) => v !== \"\") && newValues.length === length) {\n onComplete?.(otpValue);\n }\n },\n [values, onChange, onComplete, length, type, focusInput],\n );\n\n const handleKeyDown = useCallback(\n (index: number, e: KeyboardEvent<HTMLInputElement>) => {\n switch (e.key) {\n case \"Backspace\":\n e.preventDefault();\n const newValues = [...values];\n if (values[index]) {\n // Clear current value\n newValues[index] = \"\";\n setValues(newValues);\n onChange?.(newValues.join(\"\"));\n } else if (index > 0) {\n // Move to previous and clear\n newValues[index - 1] = \"\";\n setValues(newValues);\n onChange?.(newValues.join(\"\"));\n focusInput(index - 1);\n }\n break;\n case \"ArrowLeft\":\n e.preventDefault();\n focusInput(index - 1);\n break;\n case \"ArrowRight\":\n e.preventDefault();\n focusInput(index + 1);\n break;\n case \"Delete\":\n e.preventDefault();\n const deleteValues = [...values];\n deleteValues[index] = \"\";\n setValues(deleteValues);\n onChange?.(deleteValues.join(\"\"));\n break;\n }\n },\n [values, onChange, focusInput],\n );\n\n const handlePaste = useCallback(\n (e: ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault();\n const pastedData = e.clipboardData.getData(\"text\").slice(0, length);\n\n // Validate pasted content\n if (type === \"number\" && !/^\\d*$/.test(pastedData)) {\n return;\n }\n\n const newValues = pastedData\n .split(\"\")\n .slice(0, length)\n .concat(Array(length).fill(\"\"))\n .slice(0, length);\n\n setValues(newValues);\n const otpValue = newValues.join(\"\");\n onChange?.(otpValue);\n\n // Focus last filled input or last input\n const lastFilledIndex = newValues.findLastIndex((v) => v !== \"\");\n focusInput(Math.min(lastFilledIndex + 1, length - 1));\n\n // Check if complete\n if (newValues.every((v) => v !== \"\") && pastedData.length >= length) {\n onComplete?.(otpValue);\n }\n },\n [length, type, onChange, onComplete, focusInput],\n );\n\n const handleFocus = useCallback((e: React.FocusEvent<HTMLInputElement>) => {\n e.target.select();\n }, []);\n\n const renderInputs = () => {\n const inputs: React.ReactNode[] = [];\n\n for (let i = 0; i < length; i++) {\n // Add separator if needed\n if (separatorPositions.includes(i) && i > 0) {\n inputs.push(\n <div key={`separator-${i}`} className=\"flex items-center\">\n {separator}\n </div>,\n );\n }\n\n inputs.push(\n <input\n key={i}\n ref={(el) => {\n inputRefs.current[i] = el;\n // React 19: Return cleanup function\n return () => {\n inputRefs.current[i] = null;\n };\n }}\n type={mask ? \"password\" : \"text\"}\n inputMode={type === \"number\" ? \"numeric\" : \"text\"}\n pattern={type === \"number\" ? \"\\\\d*\" : undefined}\n maxLength={1}\n value={values[i] || \"\"}\n placeholder={placeholder}\n disabled={disabled}\n onChange={(e) => handleChange(i, e)}\n onKeyDown={(e) => handleKeyDown(i, e)}\n onPaste={handlePaste}\n onFocus={handleFocus}\n aria-label={`${ariaLabel} digit ${i + 1}`}\n className={`\n text-center font-semibold outline-none transition-all\n placeholder:text-muted-foreground\n ${sizeStyles[size]}\n ${variantStyles[variant].base}\n ${!error ? variantStyles[variant].focus : \"\"}\n ${error ? variantStyles[variant].error : \"\"}\n ${disabled ? \"opacity-50 cursor-not-allowed bg-muted\" : \"\"}\n ${inputClassName}\n `}\n />,\n );\n }\n\n return inputs;\n };\n\n return (\n <div ref={ref} className={`flex flex-col gap-2 ${className}`}>\n <div\n className=\"flex items-center gap-2\"\n role=\"group\"\n aria-label={ariaLabel}\n >\n {renderInputs()}\n </div>\n {error && errorMessage && (\n <span className=\"text-sm text-destructive\">{errorMessage}</span>\n )}\n </div>\n );\n },\n);\n\nOTPInput.displayName = \"OTPInput\";\n\nexport default OTPInput;\nexport { OTPInput };\n"],"mappings":"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"}
|