react-start-kit-shared 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +236 -0
- package/dist/chunks/Actions-2AYZB2tr.es.js +34 -0
- package/dist/chunks/Actions-2AYZB2tr.es.js.map +1 -0
- package/dist/chunks/Actions-CZS1OCgc.cjs.js +2 -0
- package/dist/chunks/Actions-CZS1OCgc.cjs.js.map +1 -0
- package/dist/chunks/DateRangePicker-BTWpQRRq.es.js +178 -0
- package/dist/chunks/DateRangePicker-BTWpQRRq.es.js.map +1 -0
- package/dist/chunks/DateRangePicker-D6Q3vFLO.cjs.js +2 -0
- package/dist/chunks/DateRangePicker-D6Q3vFLO.cjs.js.map +1 -0
- package/dist/chunks/Empty-BiJ2b9JP.cjs.js +2 -0
- package/dist/chunks/Empty-BiJ2b9JP.cjs.js.map +1 -0
- package/dist/chunks/Empty-CP4yXr6G.es.js +25 -0
- package/dist/chunks/Empty-CP4yXr6G.es.js.map +1 -0
- package/dist/chunks/ExportData-Cf-cs_pE.es.js +36 -0
- package/dist/chunks/ExportData-Cf-cs_pE.es.js.map +1 -0
- package/dist/chunks/ExportData-Yp3Tm5Lv.cjs.js +2 -0
- package/dist/chunks/ExportData-Yp3Tm5Lv.cjs.js.map +1 -0
- package/dist/chunks/Keyboard-CJVAJWdO.es.js +5 -0
- package/dist/chunks/Keyboard-CJVAJWdO.es.js.map +1 -0
- package/dist/chunks/Keyboard-kyPAAQWP.cjs.js +2 -0
- package/dist/chunks/Keyboard-kyPAAQWP.cjs.js.map +1 -0
- package/dist/chunks/Loader-B51uJ48y.cjs.js +2 -0
- package/dist/chunks/Loader-B51uJ48y.cjs.js.map +1 -0
- package/dist/chunks/Loader-JIMPYfiR.es.js +14 -0
- package/dist/chunks/Loader-JIMPYfiR.es.js.map +1 -0
- package/dist/chunks/MyInput-BbLCYCkb.es.js +280 -0
- package/dist/chunks/MyInput-BbLCYCkb.es.js.map +1 -0
- package/dist/chunks/MyInput-CIgmb5kZ.cjs.js +2 -0
- package/dist/chunks/MyInput-CIgmb5kZ.cjs.js.map +1 -0
- package/dist/chunks/MyPagination-DYYM6ks6.cjs.js +2 -0
- package/dist/chunks/MyPagination-DYYM6ks6.cjs.js.map +1 -0
- package/dist/chunks/MyPagination-Dtx70bK6.es.js +142 -0
- package/dist/chunks/MyPagination-Dtx70bK6.es.js.map +1 -0
- package/dist/chunks/MySelect-DWTZ-FuO.es.js +58 -0
- package/dist/chunks/MySelect-DWTZ-FuO.es.js.map +1 -0
- package/dist/chunks/MySelect-DoX-Qy5y.cjs.js +2 -0
- package/dist/chunks/MySelect-DoX-Qy5y.cjs.js.map +1 -0
- package/dist/chunks/PasswordConfirm-DGVigQbo.cjs.js +2 -0
- package/dist/chunks/PasswordConfirm-DGVigQbo.cjs.js.map +1 -0
- package/dist/chunks/PasswordConfirm-DYTMNa33.es.js +3270 -0
- package/dist/chunks/PasswordConfirm-DYTMNa33.es.js.map +1 -0
- package/dist/chunks/Search-BQKw3els.cjs.js +2 -0
- package/dist/chunks/Search-BQKw3els.cjs.js.map +1 -0
- package/dist/chunks/Search-DqbIV61m.es.js +147 -0
- package/dist/chunks/Search-DqbIV61m.es.js.map +1 -0
- package/dist/chunks/SortOrder-81BrXp3i.cjs.js +2 -0
- package/dist/chunks/SortOrder-81BrXp3i.cjs.js.map +1 -0
- package/dist/chunks/SortOrder-CwuehjY1.es.js +5 -0
- package/dist/chunks/SortOrder-CwuehjY1.es.js.map +1 -0
- package/dist/chunks/Spin-CCtUPIlI.cjs.js +2 -0
- package/dist/chunks/Spin-CCtUPIlI.cjs.js.map +1 -0
- package/dist/chunks/Spin-DSBxxpPG.es.js +37 -0
- package/dist/chunks/Spin-DSBxxpPG.es.js.map +1 -0
- package/dist/chunks/ThemeMode-BO6tit_Z.cjs.js +2 -0
- package/dist/chunks/ThemeMode-BO6tit_Z.cjs.js.map +1 -0
- package/dist/chunks/ThemeMode-CqURAYDL.es.js +5 -0
- package/dist/chunks/ThemeMode-CqURAYDL.es.js.map +1 -0
- package/dist/chunks/ThemeProviderContext-CDiIvEe7.es.js +10 -0
- package/dist/chunks/ThemeProviderContext-CDiIvEe7.es.js.map +1 -0
- package/dist/chunks/ThemeProviderContext-rq2okb30.cjs.js +2 -0
- package/dist/chunks/ThemeProviderContext-rq2okb30.cjs.js.map +1 -0
- package/dist/chunks/_commonjsHelpers-DKOUU3wS.cjs.js +2 -0
- package/dist/chunks/_commonjsHelpers-DKOUU3wS.cjs.js.map +1 -0
- package/dist/chunks/_commonjsHelpers-DaMA6jEr.es.js +9 -0
- package/dist/chunks/_commonjsHelpers-DaMA6jEr.es.js.map +1 -0
- package/dist/chunks/index-ClQFzqcq.cjs.js +2 -0
- package/dist/chunks/index-ClQFzqcq.cjs.js.map +1 -0
- package/dist/chunks/index-E1NtSoNr.es.js +10 -0
- package/dist/chunks/index-E1NtSoNr.es.js.map +1 -0
- package/dist/chunks/useColumnsStore-C5UCQBGh.es.js +181 -0
- package/dist/chunks/useColumnsStore-C5UCQBGh.es.js.map +1 -0
- package/dist/chunks/useColumnsStore-ChRhCpCd.cjs.js +2 -0
- package/dist/chunks/useColumnsStore-ChRhCpCd.cjs.js.map +1 -0
- package/dist/chunks/useFilter-D93ncAmn.cjs.js +2 -0
- package/dist/chunks/useFilter-D93ncAmn.cjs.js.map +1 -0
- package/dist/chunks/useFilter-DpCwY1KO.es.js +17 -0
- package/dist/chunks/useFilter-DpCwY1KO.es.js.map +1 -0
- package/dist/chunks/useSortable-B8xGLknV.cjs.js +2 -0
- package/dist/chunks/useSortable-B8xGLknV.cjs.js.map +1 -0
- package/dist/chunks/useSortable-DD1y7f_o.es.js +256 -0
- package/dist/chunks/useSortable-DD1y7f_o.es.js.map +1 -0
- package/dist/chunks/useTheme-hjEZ-FC3.cjs.js +2 -0
- package/dist/chunks/useTheme-hjEZ-FC3.cjs.js.map +1 -0
- package/dist/chunks/useTheme-iKF3BEvj.es.js +12 -0
- package/dist/chunks/useTheme-iKF3BEvj.es.js.map +1 -0
- package/dist/components/actions/index.cjs.js +2 -0
- package/dist/components/actions/index.cjs.js.map +1 -0
- package/dist/components/actions/index.es.js +5 -0
- package/dist/components/actions/index.es.js.map +1 -0
- package/dist/components/confirm/index.cjs.js +2 -0
- package/dist/components/confirm/index.cjs.js.map +1 -0
- package/dist/components/confirm/index.es.js +7 -0
- package/dist/components/confirm/index.es.js.map +1 -0
- package/dist/components/datatable/index.cjs.js +2 -0
- package/dist/components/datatable/index.cjs.js.map +1 -0
- package/dist/components/datatable/index.es.js +404 -0
- package/dist/components/datatable/index.es.js.map +1 -0
- package/dist/components/datepicker/index.cjs.js +2 -0
- package/dist/components/datepicker/index.cjs.js.map +1 -0
- package/dist/components/datepicker/index.es.js +5 -0
- package/dist/components/datepicker/index.es.js.map +1 -0
- package/dist/components/empty/index.cjs.js +2 -0
- package/dist/components/empty/index.cjs.js.map +1 -0
- package/dist/components/empty/index.es.js +5 -0
- package/dist/components/empty/index.es.js.map +1 -0
- package/dist/components/export/index.cjs.js +2 -0
- package/dist/components/export/index.cjs.js.map +1 -0
- package/dist/components/export/index.es.js +5 -0
- package/dist/components/export/index.es.js.map +1 -0
- package/dist/components/filters/index.cjs.js +2 -0
- package/dist/components/filters/index.cjs.js.map +1 -0
- package/dist/components/filters/index.es.js +48 -0
- package/dist/components/filters/index.es.js.map +1 -0
- package/dist/components/form/index.cjs.js +2 -0
- package/dist/components/form/index.cjs.js.map +1 -0
- package/dist/components/form/index.es.js +450 -0
- package/dist/components/form/index.es.js.map +1 -0
- package/dist/components/gallery/index.cjs.js +2 -0
- package/dist/components/gallery/index.cjs.js.map +1 -0
- package/dist/components/gallery/index.es.js +308 -0
- package/dist/components/gallery/index.es.js.map +1 -0
- package/dist/components/loader/index.cjs.js +2 -0
- package/dist/components/loader/index.cjs.js.map +1 -0
- package/dist/components/loader/index.es.js +7 -0
- package/dist/components/loader/index.es.js.map +1 -0
- package/dist/components/modal/index.cjs.js +2 -0
- package/dist/components/modal/index.cjs.js.map +1 -0
- package/dist/components/modal/index.es.js +46 -0
- package/dist/components/modal/index.es.js.map +1 -0
- package/dist/components/pagination/index.cjs.js +2 -0
- package/dist/components/pagination/index.cjs.js.map +1 -0
- package/dist/components/pagination/index.es.js +6 -0
- package/dist/components/pagination/index.es.js.map +1 -0
- package/dist/components/scroll/index.cjs.js +2 -0
- package/dist/components/scroll/index.cjs.js.map +1 -0
- package/dist/components/scroll/index.es.js +16 -0
- package/dist/components/scroll/index.es.js.map +1 -0
- package/dist/components/theme/index.cjs.js +2 -0
- package/dist/components/theme/index.cjs.js.map +1 -0
- package/dist/components/theme/index.es.js +26 -0
- package/dist/components/theme/index.es.js.map +1 -0
- package/dist/components/tooltip/index.cjs.js +2 -0
- package/dist/components/tooltip/index.cjs.js.map +1 -0
- package/dist/components/tooltip/index.es.js +18 -0
- package/dist/components/tooltip/index.es.js.map +1 -0
- package/dist/enums/index.cjs.js +2 -0
- package/dist/enums/index.cjs.js.map +1 -0
- package/dist/enums/index.es.js +9 -0
- package/dist/enums/index.es.js.map +1 -0
- package/dist/hooks/index.cjs.js +21 -0
- package/dist/hooks/index.cjs.js.map +1 -0
- package/dist/hooks/index.es.js +1015 -0
- package/dist/hooks/index.es.js.map +1 -0
- package/dist/index.cjs.js +2 -0
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.es.js +2 -0
- package/dist/index.es.js.map +1 -0
- package/dist/providers/index.cjs.js +2 -0
- package/dist/providers/index.cjs.js.map +1 -0
- package/dist/providers/index.es.js +32 -0
- package/dist/providers/index.es.js.map +1 -0
- package/dist/stores/index.cjs.js +2 -0
- package/dist/stores/index.cjs.js.map +1 -0
- package/dist/stores/index.es.js +21 -0
- package/dist/stores/index.es.js.map +1 -0
- package/dist/styles.css +1 -0
- package/dist/types/App.d.ts +3 -0
- package/dist/types/App.d.ts.map +1 -0
- package/dist/types/components/actions/Actions.d.ts +32 -0
- package/dist/types/components/actions/Actions.d.ts.map +1 -0
- package/dist/types/components/actions/index.d.ts +2 -0
- package/dist/types/components/actions/index.d.ts.map +1 -0
- package/dist/types/components/confirm/Confirm.d.ts +27 -0
- package/dist/types/components/confirm/Confirm.d.ts.map +1 -0
- package/dist/types/components/confirm/PasswordConfirm.d.ts +22 -0
- package/dist/types/components/confirm/PasswordConfirm.d.ts.map +1 -0
- package/dist/types/components/confirm/index.d.ts +4 -0
- package/dist/types/components/confirm/index.d.ts.map +1 -0
- package/dist/types/components/datatable/DataTable.d.ts +196 -0
- package/dist/types/components/datatable/DataTable.d.ts.map +1 -0
- package/dist/types/components/datatable/MyTable.d.ts +56 -0
- package/dist/types/components/datatable/MyTable.d.ts.map +1 -0
- package/dist/types/components/datatable/index.d.ts +3 -0
- package/dist/types/components/datatable/index.d.ts.map +1 -0
- package/dist/types/components/datepicker/DateRangePicker.d.ts +50 -0
- package/dist/types/components/datepicker/DateRangePicker.d.ts.map +1 -0
- package/dist/types/components/datepicker/index.d.ts +2 -0
- package/dist/types/components/datepicker/index.d.ts.map +1 -0
- package/dist/types/components/empty/Empty.d.ts +19 -0
- package/dist/types/components/empty/Empty.d.ts.map +1 -0
- package/dist/types/components/empty/index.d.ts +2 -0
- package/dist/types/components/empty/index.d.ts.map +1 -0
- package/dist/types/components/export/ExportData.d.ts +52 -0
- package/dist/types/components/export/ExportData.d.ts.map +1 -0
- package/dist/types/components/export/index.d.ts +2 -0
- package/dist/types/components/export/index.d.ts.map +1 -0
- package/dist/types/components/filters/AppliedFilters.d.ts +24 -0
- package/dist/types/components/filters/AppliedFilters.d.ts.map +1 -0
- package/dist/types/components/filters/FilterWrapper.d.ts +58 -0
- package/dist/types/components/filters/FilterWrapper.d.ts.map +1 -0
- package/dist/types/components/filters/Search.d.ts +28 -0
- package/dist/types/components/filters/Search.d.ts.map +1 -0
- package/dist/types/components/filters/SearchWithCtrl.d.ts +25 -0
- package/dist/types/components/filters/SearchWithCtrl.d.ts.map +1 -0
- package/dist/types/components/filters/index.d.ts +4 -0
- package/dist/types/components/filters/index.d.ts.map +1 -0
- package/dist/types/components/form/MyCheckbox.d.ts +20 -0
- package/dist/types/components/form/MyCheckbox.d.ts.map +1 -0
- package/dist/types/components/form/MyDatePicker.d.ts +43 -0
- package/dist/types/components/form/MyDatePicker.d.ts.map +1 -0
- package/dist/types/components/form/MyDateRangePicker.d.ts +26 -0
- package/dist/types/components/form/MyDateRangePicker.d.ts.map +1 -0
- package/dist/types/components/form/MyHtmlEditor.d.ts +26 -0
- package/dist/types/components/form/MyHtmlEditor.d.ts.map +1 -0
- package/dist/types/components/form/MyInput.d.ts +24 -0
- package/dist/types/components/form/MyInput.d.ts.map +1 -0
- package/dist/types/components/form/MyMaskInput.d.ts +28 -0
- package/dist/types/components/form/MyMaskInput.d.ts.map +1 -0
- package/dist/types/components/form/MyRadio.d.ts +25 -0
- package/dist/types/components/form/MyRadio.d.ts.map +1 -0
- package/dist/types/components/form/MySelect.d.ts +29 -0
- package/dist/types/components/form/MySelect.d.ts.map +1 -0
- package/dist/types/components/form/MyShadcnSelect.d.ts +39 -0
- package/dist/types/components/form/MyShadcnSelect.d.ts.map +1 -0
- package/dist/types/components/form/MySwitch.d.ts +20 -0
- package/dist/types/components/form/MySwitch.d.ts.map +1 -0
- package/dist/types/components/form/MyTextarea.d.ts +24 -0
- package/dist/types/components/form/MyTextarea.d.ts.map +1 -0
- package/dist/types/components/form/MyTimePicker.d.ts +29 -0
- package/dist/types/components/form/MyTimePicker.d.ts.map +1 -0
- package/dist/types/components/form/index.d.ts +14 -0
- package/dist/types/components/form/index.d.ts.map +1 -0
- package/dist/types/components/gallery/MyGallery.d.ts +62 -0
- package/dist/types/components/gallery/MyGallery.d.ts.map +1 -0
- package/dist/types/components/gallery/index.d.ts +2 -0
- package/dist/types/components/gallery/index.d.ts.map +1 -0
- package/dist/types/components/index.d.ts +15 -0
- package/dist/types/components/index.d.ts.map +1 -0
- package/dist/types/components/loader/Loader.d.ts +10 -0
- package/dist/types/components/loader/Loader.d.ts.map +1 -0
- package/dist/types/components/loader/Spin.d.ts +14 -0
- package/dist/types/components/loader/Spin.d.ts.map +1 -0
- package/dist/types/components/loader/index.d.ts +4 -0
- package/dist/types/components/loader/index.d.ts.map +1 -0
- package/dist/types/components/modal/MyModal.d.ts +51 -0
- package/dist/types/components/modal/MyModal.d.ts.map +1 -0
- package/dist/types/components/modal/index.d.ts +2 -0
- package/dist/types/components/modal/index.d.ts.map +1 -0
- package/dist/types/components/pagination/MyLimitSelect.d.ts +27 -0
- package/dist/types/components/pagination/MyLimitSelect.d.ts.map +1 -0
- package/dist/types/components/pagination/MyPagination.d.ts +39 -0
- package/dist/types/components/pagination/MyPagination.d.ts.map +1 -0
- package/dist/types/components/pagination/index.d.ts +4 -0
- package/dist/types/components/pagination/index.d.ts.map +1 -0
- package/dist/types/components/scroll/ScrollArea.d.ts +10 -0
- package/dist/types/components/scroll/ScrollArea.d.ts.map +1 -0
- package/dist/types/components/scroll/index.d.ts +2 -0
- package/dist/types/components/scroll/index.d.ts.map +1 -0
- package/dist/types/components/theme/index.d.ts +2 -0
- package/dist/types/components/theme/index.d.ts.map +1 -0
- package/dist/types/components/theme/theme-toggle.d.ts +15 -0
- package/dist/types/components/theme/theme-toggle.d.ts.map +1 -0
- package/dist/types/components/tooltip/MyTooltip.d.ts +25 -0
- package/dist/types/components/tooltip/MyTooltip.d.ts.map +1 -0
- package/dist/types/components/tooltip/index.d.ts +3 -0
- package/dist/types/components/tooltip/index.d.ts.map +1 -0
- package/dist/types/contexts/ThemeProviderContext.d.ts +18 -0
- package/dist/types/contexts/ThemeProviderContext.d.ts.map +1 -0
- package/dist/types/contexts/index.d.ts +2 -0
- package/dist/types/contexts/index.d.ts.map +1 -0
- package/dist/types/enums/Keyboard.d.ts +8 -0
- package/dist/types/enums/Keyboard.d.ts.map +1 -0
- package/dist/types/enums/SortOrder.d.ts +10 -0
- package/dist/types/enums/SortOrder.d.ts.map +1 -0
- package/dist/types/enums/ThemeMode.d.ts +12 -0
- package/dist/types/enums/ThemeMode.d.ts.map +1 -0
- package/dist/types/enums/index.d.ts +4 -0
- package/dist/types/enums/index.d.ts.map +1 -0
- package/dist/types/hooks/index.d.ts +9 -0
- package/dist/types/hooks/index.d.ts.map +1 -0
- package/dist/types/hooks/useColumns.d.ts +31 -0
- package/dist/types/hooks/useColumns.d.ts.map +1 -0
- package/dist/types/hooks/useConfirm.d.ts +21 -0
- package/dist/types/hooks/useConfirm.d.ts.map +1 -0
- package/dist/types/hooks/useDataTable.d.ts +33 -0
- package/dist/types/hooks/useDataTable.d.ts.map +1 -0
- package/dist/types/hooks/useDocumentTitle.d.ts +9 -0
- package/dist/types/hooks/useDocumentTitle.d.ts.map +1 -0
- package/dist/types/hooks/useFilter.d.ts +29 -0
- package/dist/types/hooks/useFilter.d.ts.map +1 -0
- package/dist/types/hooks/useMediaQuerySizes.d.ts +22 -0
- package/dist/types/hooks/useMediaQuerySizes.d.ts.map +1 -0
- package/dist/types/hooks/useSortable.d.ts +29 -0
- package/dist/types/hooks/useSortable.d.ts.map +1 -0
- package/dist/types/hooks/useTheme.d.ts +14 -0
- package/dist/types/hooks/useTheme.d.ts.map +1 -0
- package/dist/types/index.cjs.js +2 -0
- package/dist/types/index.cjs.js.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.es.js +2 -0
- package/dist/types/index.es.js.map +1 -0
- package/dist/types/main.d.ts +1 -0
- package/dist/types/main.d.ts.map +1 -0
- package/dist/types/providers/ThemeProvider.d.ts +24 -0
- package/dist/types/providers/ThemeProvider.d.ts.map +1 -0
- package/dist/types/providers/index.d.ts +2 -0
- package/dist/types/providers/index.d.ts.map +1 -0
- package/dist/types/schemas/createConfirmPasswordSchema.d.ts +20 -0
- package/dist/types/schemas/createConfirmPasswordSchema.d.ts.map +1 -0
- package/dist/types/schemas/index.d.ts +2 -0
- package/dist/types/schemas/index.d.ts.map +1 -0
- package/dist/types/stores/index.d.ts +3 -0
- package/dist/types/stores/index.d.ts.map +1 -0
- package/dist/types/stores/useColumnsStore.d.ts +26 -0
- package/dist/types/stores/useColumnsStore.d.ts.map +1 -0
- package/dist/types/stores/useDateRangeStore.d.ts +27 -0
- package/dist/types/stores/useDateRangeStore.d.ts.map +1 -0
- package/dist/types/stories/Actions.stories.d.ts +8 -0
- package/dist/types/stories/Actions.stories.d.ts.map +1 -0
- package/dist/types/stories/AppliedFilters.stories.d.ts +10 -0
- package/dist/types/stories/AppliedFilters.stories.d.ts.map +1 -0
- package/dist/types/stories/Confirm.stories.d.ts +8 -0
- package/dist/types/stories/Confirm.stories.d.ts.map +1 -0
- package/dist/types/stories/DataTable.stories.d.ts +19 -0
- package/dist/types/stories/DataTable.stories.d.ts.map +1 -0
- package/dist/types/stories/DateRangePicker.stories.d.ts +10 -0
- package/dist/types/stories/DateRangePicker.stories.d.ts.map +1 -0
- package/dist/types/stories/Empty.stories.d.ts +9 -0
- package/dist/types/stories/Empty.stories.d.ts.map +1 -0
- package/dist/types/stories/ExportData.stories.d.ts +9 -0
- package/dist/types/stories/ExportData.stories.d.ts.map +1 -0
- package/dist/types/stories/FilterWrapper.stories.d.ts +9 -0
- package/dist/types/stories/FilterWrapper.stories.d.ts.map +1 -0
- package/dist/types/stories/Loader.stories.d.ts +7 -0
- package/dist/types/stories/Loader.stories.d.ts.map +1 -0
- package/dist/types/stories/MyCheckbox.stories.d.ts +8 -0
- package/dist/types/stories/MyCheckbox.stories.d.ts.map +1 -0
- package/dist/types/stories/MyDatePicker.stories.d.ts +10 -0
- package/dist/types/stories/MyDatePicker.stories.d.ts.map +1 -0
- package/dist/types/stories/MyDateRangePicker.stories.d.ts +8 -0
- package/dist/types/stories/MyDateRangePicker.stories.d.ts.map +1 -0
- package/dist/types/stories/MyGallery.stories.d.ts +9 -0
- package/dist/types/stories/MyGallery.stories.d.ts.map +1 -0
- package/dist/types/stories/MyHtmlEditor.stories.d.ts +8 -0
- package/dist/types/stories/MyHtmlEditor.stories.d.ts.map +1 -0
- package/dist/types/stories/MyInput.stories.d.ts +10 -0
- package/dist/types/stories/MyInput.stories.d.ts.map +1 -0
- package/dist/types/stories/MyLimitSelect.stories.d.ts +9 -0
- package/dist/types/stories/MyLimitSelect.stories.d.ts.map +1 -0
- package/dist/types/stories/MyMaskInput.stories.d.ts +9 -0
- package/dist/types/stories/MyMaskInput.stories.d.ts.map +1 -0
- package/dist/types/stories/MyModal.stories.d.ts +10 -0
- package/dist/types/stories/MyModal.stories.d.ts.map +1 -0
- package/dist/types/stories/MyPagination.stories.d.ts +10 -0
- package/dist/types/stories/MyPagination.stories.d.ts.map +1 -0
- package/dist/types/stories/MyRadio.stories.d.ts +7 -0
- package/dist/types/stories/MyRadio.stories.d.ts.map +1 -0
- package/dist/types/stories/MySelect.stories.d.ts +10 -0
- package/dist/types/stories/MySelect.stories.d.ts.map +1 -0
- package/dist/types/stories/MyShadcnSelect.stories.d.ts +9 -0
- package/dist/types/stories/MyShadcnSelect.stories.d.ts.map +1 -0
- package/dist/types/stories/MySwitch.stories.d.ts +8 -0
- package/dist/types/stories/MySwitch.stories.d.ts.map +1 -0
- package/dist/types/stories/MyTable.stories.d.ts +19 -0
- package/dist/types/stories/MyTable.stories.d.ts.map +1 -0
- package/dist/types/stories/MyTextarea.stories.d.ts +9 -0
- package/dist/types/stories/MyTextarea.stories.d.ts.map +1 -0
- package/dist/types/stories/MyTimePicker.stories.d.ts +9 -0
- package/dist/types/stories/MyTimePicker.stories.d.ts.map +1 -0
- package/dist/types/stories/MyTooltip.stories.d.ts +10 -0
- package/dist/types/stories/MyTooltip.stories.d.ts.map +1 -0
- package/dist/types/stories/PasswordConfirm.stories.d.ts +8 -0
- package/dist/types/stories/PasswordConfirm.stories.d.ts.map +1 -0
- package/dist/types/stories/ScrollArea.stories.d.ts +8 -0
- package/dist/types/stories/ScrollArea.stories.d.ts.map +1 -0
- package/dist/types/stories/Search.stories.d.ts +8 -0
- package/dist/types/stories/Search.stories.d.ts.map +1 -0
- package/dist/types/stories/SearchWithCtrl.stories.d.ts +8 -0
- package/dist/types/stories/SearchWithCtrl.stories.d.ts.map +1 -0
- package/dist/types/stories/Spin.stories.d.ts +8 -0
- package/dist/types/stories/Spin.stories.d.ts.map +1 -0
- package/dist/types/stories/ThemeToggle.stories.d.ts +8 -0
- package/dist/types/stories/ThemeToggle.stories.d.ts.map +1 -0
- package/dist/types/types/column.type.d.ts +31 -0
- package/dist/types/types/column.type.d.ts.map +1 -0
- package/dist/types/types/index.d.ts +3 -0
- package/dist/types/types/index.d.ts.map +1 -0
- package/dist/types/types/translation-args.type.d.ts +17 -0
- package/dist/types/types/translation-args.type.d.ts.map +1 -0
- package/dist/types/utils/index.d.ts +2 -0
- package/dist/types/utils/index.d.ts.map +1 -0
- package/dist/types/utils/utils.d.ts +8 -0
- package/dist/types/utils/utils.d.ts.map +1 -0
- package/dist/types/vite-env.d.ts +1 -0
- package/dist/utils/index.cjs.js +2 -0
- package/dist/utils/index.cjs.js.map +1 -0
- package/dist/utils/index.es.js +7 -0
- package/dist/utils/index.es.js.map +1 -0
- package/package.json +265 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../../../src/components/form/MyCheckbox.tsx","../../../src/components/form/MyDatePicker.tsx","../../../src/components/form/MyDateRangePicker.tsx","../../../src/components/form/MyHtmlEditor.tsx","../../../src/components/form/MyMaskInput.tsx","../../../src/components/form/MyRadio.tsx","../../../src/components/form/MyShadcnSelect.tsx","../../../src/components/form/MySwitch.tsx","../../../src/components/form/MyTextarea.tsx","../../../src/components/form/MyTimePicker.tsx"],"sourcesContent":["import { useId } from 'react';\nimport type { FieldPath, FieldValues } from 'react-hook-form';\nimport {\n Checkbox,\n type CheckboxProps,\n FormControl,\n FormField,\n FormItem,\n type FormItemProps,\n FormLabel,\n} from 'react-start-kit/form';\n\n/**\n * Props for the MyCheckbox component.\n * @template TFieldValues - The type of the form values.\n */\nexport type MyCheckboxProps<TFieldValues extends FieldValues> =\n FormItemProps<TFieldValues> & CheckboxProps;\n\n/**\n * MyCheckbox is a checkbox component with optional react-hook-form integration.\n *\n * @template TFieldValues - Form values type used by react-hook-form.\n * @param control - The `react-hook-form` control object.\n * @param name - The name of the field in `react-hook-form`.\n * @param label - The label to display for the checkbox.\n * @param rules - The `react-hook-form` validation rules.\n * @param props - Checkbox and form item props.\n * @returns {JSX.Element | null} A checkbox component wrapped with form handling logic, or null if name/control are missing\n */\nexport const MyCheckbox = <TFieldValues extends FieldValues>({\n control,\n name,\n label,\n rules,\n ...props\n}: MyCheckboxProps<TFieldValues>) => {\n const id = useId();\n return (\n (name && control && (\n <FormField<TFieldValues, FieldPath<TFieldValues>>\n control={control}\n name={name}\n rules={rules}\n render={({ field }) => (\n <FormLabel className={'block'} htmlFor={props.id || id}>\n <FormItem className=\"flex flex-row items-start gap-3\">\n <FormControl>\n <Checkbox\n id={props.id || id}\n checked={field.value}\n onCheckedChange={field.onChange}\n {...props}\n />\n </FormControl>\n {label && <div className={'mt-0.5'}>{label}</div>}\n </FormItem>\n </FormLabel>\n )}\n />\n )) ||\n null\n );\n};\n","import get from 'lodash.get';\nimport { Calendar1 } from 'lucide-react';\nimport type { FieldPath, FieldValues } from 'react-hook-form';\nimport {\n Calendar,\n type CalendarProps,\n DATE,\n TimePicker,\n} from 'react-start-kit/calendar';\nimport {\n FormControl,\n FormField,\n FormItem,\n type FormItemProps,\n FormLabel,\n FormMessage,\n Input,\n type InputProps,\n} from 'react-start-kit/form';\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from 'react-start-kit/popover';\nimport { cn, dayjs } from 'react-start-kit/utils';\n\n/**\n * Props for the MyDatePicker component.\n * @template TFieldValues - The type of the form values.\n */\nexport type MyDatePickerProps<TFieldValues extends FieldValues> =\n FormItemProps<TFieldValues> &\n Omit<CalendarProps, 'mode' | 'disabled' | 'required'> & {\n /** Date format string for display. */\n format?: string;\n /** Props passed to the underlying Input component. */\n inputProps?: Omit<InputProps, 'onSelect'>;\n /** Placeholder text when no date is selected. */\n placeholder?: string;\n /** Whether the date picker is disabled. */\n disabled?: boolean;\n /** When true, shows a TimePicker below the calendar for time selection. */\n showTime?: true;\n\n required?: true;\n };\n\n/**\n * MyDatePicker shows a calendar popover to pick a single date, integrated with react-hook-form.\n * Can also be used standalone when no control/name are provided.\n *\n * @template TFieldValues - Form values type used by react-hook-form.\n * @param control - The `react-hook-form` control object.\n * @param name - The name of the field in `react-hook-form`.\n * @param label - The label to display for the date picker.\n * @param required - Whether the field is required.\n * @param rules - The `react-hook-form` validation rules.\n * @param format - The date format for display.\n * @param placeholder - The placeholder text when no date selected.\n * @param floatingError - Whether to show the error message in a floating container.\n * @param register - The `react-hook-form` register function.\n * @param disabled - Whether the date picker is disabled.\n * @param className - Additional CSS classes.\n * @param showTime - When true, shows a TimePicker below the calendar for time selection.\n * @param inputProps - Props passed to the underlying Input component.\n * @param props - Calendar, button and form item props.\n * @returns {JSX.Element | null} A date picker component integrated with react-hook-form, or null if name/control are missing.\n */\nexport const MyDatePicker = <TFieldValues extends FieldValues>({\n control,\n name,\n label,\n required,\n rules,\n format = DATE,\n floatingError,\n placeholder,\n disabled,\n register,\n className,\n showTime,\n inputProps,\n ...props\n}: MyDatePickerProps<TFieldValues>) => {\n return (\n (name && control && (\n <FormField<TFieldValues, FieldPath<TFieldValues>>\n control={control}\n name={name}\n rules={rules}\n render={({ field, formState }) => (\n <FormItem>\n {label && (\n <FormLabel className={'block'}>\n {label} {required && <span className={'text-red-600'}>*</span>}\n </FormLabel>\n )}\n <Popover>\n <PopoverTrigger asChild>\n <div className={'relative'}>\n <FormControl>\n <Input\n {...inputProps}\n variant={\n get(formState.errors, `${name}.message`)\n ? 'failure'\n : 'default'\n }\n disabled={disabled}\n {...field}\n readOnly\n placeholder={placeholder || 'Pick a date'}\n value={\n field.value\n ? dayjs(field.value).format(format)\n : undefined\n }\n className={cn('m-0 text-start', className)}\n />\n </FormControl>\n <Calendar1\n className={cn(\n 'text-secondary absolute top-2.5 right-2 size-5',\n disabled && 'pointer-events-none opacity-50'\n )}\n />\n <FormMessage\n className={cn(floatingError && 'absolute -bottom-5')}\n />\n </div>\n </PopoverTrigger>\n {!disabled && (\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <Calendar\n {...props}\n mode=\"single\"\n selected={field.value}\n onSelect={field.onChange}\n />\n {showTime && (\n <div className={'px-4 pb-3'}>\n <TimePicker\n value={dayjs(field.value as Date).format('HH:mm')}\n onChange={(time) => {\n const [hour, minute] = time.split(':');\n field.onChange(\n dayjs(field.value)\n .set('hour', Number(hour))\n .set('minute', Number(minute))\n .toDate()\n );\n }}\n />\n </div>\n )}\n </PopoverContent>\n )}\n </Popover>\n </FormItem>\n )}\n />\n )) ||\n null\n );\n};\n","import get from 'lodash.get';\nimport type { FieldPath, FieldValues } from 'react-hook-form';\nimport {\n FormControl,\n FormField,\n FormItem,\n type FormItemProps,\n FormLabel,\n FormMessage,\n} from 'react-start-kit/form';\nimport { cn } from 'react-start-kit/utils';\nimport { DateRangePicker, type DateRangePickerProps } from '../datepicker';\n\n/**\n * Props for the MyDateRangePicker component.\n * @template TFieldValues - The type of the form values.\n */\nexport type MyDateRangePickerProps<TFieldValues extends FieldValues> =\n FormItemProps<TFieldValues> &\n Omit<DateRangePickerProps, 'required'> & {\n required?: true;\n };\n\n/**\n * MyDateRangePicker renders a date range selector integrated with react-hook-form.\n *\n * @template TFieldValues - Form values type used by react-hook-form.\n * @param control - The `react-hook-form` control object.\n * @param name - The name of the field in `react-hook-form`.\n * @param label - The label to display for the date range picker.\n * @param required - Whether the field is required.\n * @param rules - The `react-hook-form` validation rules.\n * @param format - The date format for display.\n * @param placeholder - The placeholder text when no date is selected.\n * @param props - DateRangePicker props and form item props.\n * @returns {JSX.Element | null} A date range picker integrated with react-hook-form, or null if name/control are missing\n */\nexport const MyDateRangePicker = <TFieldValues extends FieldValues>({\n control,\n name,\n label,\n required,\n rules,\n placeholder,\n floatingError,\n ...props\n}: MyDateRangePickerProps<TFieldValues>) => {\n return (\n (name && control && (\n <FormField<TFieldValues, FieldPath<TFieldValues>>\n control={control}\n name={name}\n rules={rules}\n render={({ field, formState }) => (\n <FormItem>\n {label && (\n <FormLabel className={'block'}>\n {label} {required && <span className={'text-red-600'}>*</span>}\n </FormLabel>\n )}\n <div>\n <FormControl>\n <DateRangePicker\n {...props}\n error={`${get(formState.errors, name, '')}`}\n selected={field.value}\n onRangeSelected={field.onChange}\n placeholder={placeholder}\n />\n </FormControl>\n <FormMessage\n className={cn(floatingError && 'absolute -bottom-5')}\n />\n </div>\n </FormItem>\n )}\n />\n )) ||\n null\n );\n};\n","import type { FieldPath, FieldValues } from 'react-hook-form';\nimport {\n FormControl,\n FormField,\n FormItem,\n type FormItemProps,\n FormLabel,\n FormMessage,\n HtmlEditor,\n type HtmlEditorProps,\n} from 'react-start-kit/form';\nimport { cn } from 'react-start-kit/utils';\n\n/**\n * Props for the MyHtmlEditor component.\n * @template TFieldValues - The type of the form values.\n */\nexport type MyHtmlEditorProps<TFieldValues extends FieldValues> =\n FormItemProps<TFieldValues> &\n HtmlEditorProps & {\n /** Whether the field is required. */\n required?: boolean;\n };\n\n/**\n * MyHtmlEditor is a rich-text HTML editor with optional react-hook-form integration.\n * Works in both controlled (with control/name) and uncontrolled modes.\n *\n * @template TFieldValues - Form values type used by react-hook-form.\n * @param control - The `react-hook-form` control object.\n * @param name - The name of the field in `react-hook-form`.\n * @param label - The label to display for the HTML editor.\n * @param rules - The `react-hook-form` validation rules.\n * @param required - Whether the field is required.\n * @param floatingError - Whether to show the error message in a floating container.\n * @param props - HtmlEditor and form item props.\n * @returns {JSX.Element | null} An HtmlEditor component with label, helper text, and validation message, or null if name/control are missing\n */\nexport const MyHtmlEditor = <TFieldValues extends FieldValues>({\n control,\n name,\n label,\n rules,\n required,\n floatingError,\n ...props\n}: MyHtmlEditorProps<TFieldValues>) => {\n return (\n (name && control && (\n <FormField<TFieldValues, FieldPath<TFieldValues>>\n control={control}\n name={name}\n rules={rules}\n render={({ field }) => (\n <FormItem>\n {label && (\n <FormLabel className={'block'}>\n {label} {required && <span className={'text-red-600'}>*</span>}\n </FormLabel>\n )}\n <div>\n <FormControl>\n <HtmlEditor {...field} {...props} />\n </FormControl>\n <FormMessage\n className={cn(floatingError && 'absolute -bottom-5')}\n />\n </div>\n </FormItem>\n )}\n />\n )) ||\n null\n );\n};\n","import get from 'lodash.get';\nimport type { FieldPath, FieldValues } from 'react-hook-form';\nimport {\n FormControl,\n FormField,\n FormItem,\n type FormItemProps,\n FormLabel,\n FormMessage,\n MaskInput,\n type MaskInputProps,\n} from 'react-start-kit/form';\nimport { cn } from 'react-start-kit/utils';\n\n/**\n * Props for the MyMaskInput component.\n * @template TFieldValues - The type of the form values.\n */\nexport type MyMaskInputProps<TFieldValues extends FieldValues> =\n FormItemProps<TFieldValues> &\n MaskInputProps & {\n /** Whether the field is required. */\n required?: boolean;\n };\n\n/**\n * MyMaskInput is an input component with masking support and optional react-hook-form integration.\n * Works in both controlled (with control/name) and uncontrolled modes. By default it uses a space as\n * thousands separator, underscores as placeholder characters, lazy formatting disabled, and returns\n * unmasked value on change.\n *\n * @template TFieldValues - Form values type used by react-hook-form.\n * @param control - The `react-hook-form` control object.\n * @param name - The name of the field in `react-hook-form`.\n * @param label - The label to display for the mask input.\n * @param rules - The `react-hook-form` validation rules.\n * @param required - Whether the field is required.\n * @param floatingError - Whether to show the error message in a floating container.\n * @param props - MaskInput and form item props.\n * @returns {JSX.Element | null} A masked input with label, helper text, and validation message, or null if name/control are missing\n */\nexport const MyMaskInput = <TFieldValues extends FieldValues>({\n control,\n name,\n label,\n rules,\n required,\n floatingError,\n ...props\n}: MyMaskInputProps<TFieldValues>) => {\n return (\n (name && control && (\n <FormField<TFieldValues, FieldPath<TFieldValues>>\n control={control}\n name={name}\n rules={rules}\n render={({ field, formState }) => (\n <FormItem>\n {label && (\n <FormLabel className={'block'}>\n {label} {required && <span className={'text-red-600'}>*</span>}\n </FormLabel>\n )}\n <div>\n <FormControl>\n <MaskInput\n thousandsSeparator={' '}\n lazy={false}\n placeholderChar=\"_\"\n unmask\n {...field}\n {...props}\n variant={\n get(formState.errors, `${name}.message`)\n ? 'failure'\n : 'default'\n }\n onAccept={(value) => field.onChange(value)}\n />\n </FormControl>\n <FormMessage\n className={cn(floatingError && 'absolute -bottom-5')}\n />\n </div>\n </FormItem>\n )}\n />\n )) ||\n null\n );\n};\n","import React, { useId } from 'react';\nimport type { FieldPath, FieldValues } from 'react-hook-form';\nimport {\n FormControl,\n FormField,\n FormItem,\n type FormItemProps,\n FormLabel,\n RadioGroupItem,\n} from 'react-start-kit/form';\n\ntype RadioItemProps = React.ComponentPropsWithoutRef<typeof RadioGroupItem>;\n\n/**\n * Props for the MyRadio component.\n * @template TFieldValues - The type of the form values.\n */\nexport type MyRadioProps<TFieldValues extends FieldValues> =\n FormItemProps<TFieldValues> & RadioItemProps;\n\n/**\n * MyRadio is a radio input that can integrate with react-hook-form when control and name are provided.\n * Falls back to an uncontrolled radio item when not used inside a form.\n *\n * @template TFieldValues - Form values type used by react-hook-form.\n * @param control - The `react-hook-form` control object.\n * @param name - The name of the field in `react-hook-form`.\n * @param label - The label to display for the radio input.\n * @param rules - The `react-hook-form` validation rules.\n * @param value - The value of the radio input.\n * @param props - Radio item and form item props.\n * @returns {JSX.Element | null} A radio button item with form integration, or null if name/control are missing\n */\nconst MyRadio = <TFieldValues extends FieldValues>({\n control,\n name,\n label,\n rules,\n value,\n ...props\n}: MyRadioProps<TFieldValues>) => {\n const id = useId();\n return (\n (name && control && (\n <FormField<TFieldValues, FieldPath<TFieldValues>>\n control={control}\n name={name}\n rules={rules}\n render={({ field }) => (\n <FormLabel className={'block'} htmlFor={props.id || id}>\n <FormItem className=\"flex flex-row items-start gap-3\">\n <FormControl>\n <RadioGroupItem\n id={props.id || id}\n value={value}\n checked={field.value === value}\n onClick={() => {\n if (field.value !== value) {\n field.onChange(value);\n }\n }}\n {...props}\n />\n </FormControl>\n {label && <div className={'mt-0.5'}>{label}</div>}\n </FormItem>\n </FormLabel>\n )}\n />\n )) ||\n null\n );\n};\n\nexport { MyRadio };\n","import get from 'lodash.get';\nimport type { FieldPath, FieldValues } from 'react-hook-form';\nimport {\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n type FormItemProps,\n type Option,\n} from 'react-start-kit/form';\nimport { cn } from 'react-start-kit/utils';\n\n/**\n * Props for the MyShadcnSelect component.\n * @template TFieldValues - The type of the form values.\n */\nexport type MyShadcnSelectProps<TFieldValues extends FieldValues> =\n FormItemProps<TFieldValues> & {\n /** Array of options to display in the select dropdown. */\n options?: Option[];\n /** Placeholder text when no option is selected. */\n placeholder?: string;\n /** Additional CSS classes. */\n className?: string;\n /** Whether the select is disabled. */\n disabled?: boolean;\n /** Callback fired when the selected value changes. */\n onChange?: (value: string | number) => void;\n /** Whether the field is required. */\n required?: boolean;\n };\n\n/**\n * MyShadcnSelect is a native Shadcn select component integrated with react-hook-form.\n * Renders a dropdown select with customizable options and validation support.\n *\n * @template TFieldValues - Form values type used by react-hook-form.\n * @param control - The `react-hook-form` control object.\n * @param name - The name of the field in `react-hook-form`.\n * @param label - The label to display for the select.\n * @param required - Whether the field is required.\n * @param className - Additional CSS classes.\n * @param rules - The `react-hook-form` validation rules.\n * @param options - Array of options to display in the select dropdown.\n * @param placeholder - Placeholder text when no option is selected.\n * @param disabled - Whether the select is disabled.\n * @param onChange - Callback fired when the selected value changes.\n * @returns {JSX.Element | false} A select component integrated with react-hook-form, or false if name/control are missing\n */\nexport const MyShadcnSelect = <TFieldValues extends FieldValues>({\n control,\n name,\n label,\n required,\n className,\n rules,\n options = [],\n placeholder = 'Select an option',\n disabled,\n onChange,\n}: MyShadcnSelectProps<TFieldValues>) => {\n return (\n name &&\n control && (\n <FormField<TFieldValues, FieldPath<TFieldValues>>\n control={control}\n name={name}\n rules={rules}\n render={({ field, formState }) => {\n const hasError = !!get(formState.errors, `${name}`);\n\n const handleChange = (value: string) => {\n const val = Number(value) ? Number(value) : value;\n if (val && field.value !== val) {\n field.onChange(val);\n onChange?.(val);\n }\n };\n\n return (\n <FormItem>\n {label && (\n <FormLabel>\n {label} {required && <span className=\"text-red-600\">*</span>}\n </FormLabel>\n )}\n <div>\n <FormControl>\n <Select\n value={`${field.value || ''}`}\n onValueChange={handleChange}\n disabled={disabled}\n >\n <SelectTrigger\n ref={field.ref}\n variant={hasError ? 'failure' : 'default'}\n className={cn(className)}\n >\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n\n <SelectContent>\n {options.map((option) => (\n <SelectItem\n key={String(option.value)}\n value={String(option.value)}\n >\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </FormControl>\n <FormMessage />\n </div>\n </FormItem>\n );\n }}\n />\n )\n );\n};\n","import { useId } from 'react';\nimport type { FieldPath, FieldValues } from 'react-hook-form';\nimport {\n FormControl,\n FormField,\n FormItem,\n type FormItemProps,\n FormLabel,\n Switch,\n type SwitchProps,\n} from 'react-start-kit/form';\n\n/**\n * Props for the MySwitch component.\n * @template TFieldValues - The type of the form values.\n */\nexport type MySwitchProps<TFieldValues extends FieldValues> =\n FormItemProps<TFieldValues> & SwitchProps;\n\n/**\n * MySwitch is a toggle switch with optional react-hook-form integration.\n *\n * @template TFieldValues - Form values type used by react-hook-form.\n * @param control - The `react-hook-form` control object.\n * @param name - The name of the field in `react-hook-form`.\n * @param label - The label to display for the switch.\n * @param rules - The `react-hook-form` validation rules.\n * @param props - Switch and form item props.\n * @returns A toggle switch component, or null if name or control are missing.\n */\nexport const MySwitch = <TFieldValues extends FieldValues>({\n control,\n name,\n label,\n rules,\n ...props\n}: MySwitchProps<TFieldValues>) => {\n const id = useId();\n return (\n (name && control && (\n <FormField<TFieldValues, FieldPath<TFieldValues>>\n control={control}\n name={name}\n rules={rules}\n render={({ field }) => (\n <FormLabel className={'block'} htmlFor={props.id || id}>\n <FormItem className=\"flex flex-row items-start gap-3\">\n <FormControl>\n <Switch\n id={props.id || id}\n className={'m-0'}\n checked={field.value}\n onCheckedChange={field.onChange}\n {...props}\n />\n </FormControl>\n {label && <div className={'mt-0.5'}>{label}</div>}\n </FormItem>\n </FormLabel>\n )}\n />\n )) ||\n null\n );\n};\n","import get from 'lodash.get';\nimport type { FieldPath, FieldValues } from 'react-hook-form';\nimport {\n FormControl,\n FormField,\n FormItem,\n type FormItemProps,\n FormLabel,\n FormMessage,\n Textarea,\n type TextareaProps,\n} from 'react-start-kit/form';\nimport { cn } from 'react-start-kit/utils';\n\n/**\n * Props for the MyTextarea component.\n * @template TFieldValues - The type of the form values.\n */\nexport type MyTextareaProps<TFieldValues extends FieldValues> =\n FormItemProps<TFieldValues> & TextareaProps;\n\n/**\n * MyTextarea is a textarea component with optional react-hook-form integration.\n * Supports floating error message styling.\n *\n * @template TFieldValues - Form values type used by react-hook-form.\n * @param control - The `react-hook-form` control object.\n * @param name - The name of the field in `react-hook-form`.\n * @param label - The label to display for the textarea.\n * @param required - Whether the field is required.\n * @param rules - The `react-hook-form` validation rules.\n * @param className - Custom CSS class name.\n * @param floatingError - Whether to show the error message in a floating container.\n * @param props - Textarea and form item props.\n * @returns {JSX.Element | null} A textarea component integrated with react-hook-form, or null if name/control are missing\n */\nexport const MyTextarea = <TFieldValues extends FieldValues>({\n control,\n name,\n label,\n required,\n rules,\n className,\n floatingError,\n ...props\n}: MyTextareaProps<TFieldValues>) => {\n return (\n (name && control && (\n <FormField<TFieldValues, FieldPath<TFieldValues>>\n control={control}\n name={name}\n rules={rules}\n render={({ field, formState }) => (\n <FormItem>\n {label && (\n <FormLabel className={'block'}>\n {label} {required && <span className={'text-red-600'}>*</span>}\n </FormLabel>\n )}\n <div>\n <FormControl>\n <Textarea\n variant={\n get(formState.errors, `${name}.message`)\n ? 'failure'\n : 'default'\n }\n {...props}\n {...field}\n className={cn(className)}\n />\n </FormControl>\n <FormMessage\n className={cn(floatingError && 'absolute -bottom-5')}\n />\n </div>\n </FormItem>\n )}\n />\n )) ||\n null\n );\n};\n","import type { FieldPath, FieldValues } from 'react-hook-form';\nimport { TimePicker, type TimePickerProps } from 'react-start-kit/calendar';\nimport {\n FormControl,\n FormField,\n FormItem,\n type FormItemProps,\n FormLabel,\n FormMessage,\n} from 'react-start-kit/form';\nimport { cn } from 'react-start-kit/utils';\n\n/**\n * Props for the MyTimePicker component.\n * @template TFieldValues - The type of the form values.\n */\nexport type MyTimePickerProps<TFieldValues extends FieldValues> =\n FormItemProps<TFieldValues> &\n TimePickerProps & {\n /** Whether the field is required. */\n required?: boolean;\n /** Custom CSS class name. */\n className?: string;\n };\n\n/**\n * MyTimePicker is a time selection input with optional react-hook-form integration.\n *\n * @template TFieldValues - Form values type used by react-hook-form.\n * @param control - The `react-hook-form` control object.\n * @param name - The name of the field in `react-hook-form`.\n * @param label - The label to display for the time picker.\n * @param required - Whether the field is required.\n * @param className - Custom CSS class name.\n * @param rules - The `react-hook-form` validation rules.\n * @param floatingError - Whether to show the error message in a floating container.\n * @param props - TimePicker and form item props.\n * @returns {JSX.Element} A time picker component integrated with react-hook-form, or standalone TimePicker if no form integration\n */\nexport const MyTimePicker = <TFieldValues extends FieldValues>({\n control,\n name,\n label,\n required,\n className,\n rules,\n floatingError,\n ...props\n}: MyTimePickerProps<TFieldValues>) => {\n return name && control ? (\n <FormField<TFieldValues, FieldPath<TFieldValues>>\n control={control}\n name={name}\n rules={rules}\n render={({ field }) => (\n <FormItem>\n {label && (\n <FormLabel className={'block'}>\n {label} {required && <span className={'text-red-600'}>*</span>}\n </FormLabel>\n )}{' '}\n <div>\n <FormControl>\n <TimePicker {...field} {...props} />\n </FormControl>\n <FormMessage\n className={cn(floatingError && 'absolute -bottom-5')}\n />\n </div>\n </FormItem>\n )}\n />\n ) : (\n <TimePicker className={'mt-2'} {...props} />\n );\n};\n"],"names":["MyCheckbox","control","name","label","rules","props","id","useId","jsx","FormField","field","FormLabel","jsxs","FormItem","FormControl","Checkbox","MyDatePicker","required","format","DATE","floatingError","placeholder","disabled","register","className","showTime","inputProps","formState","Popover","PopoverTrigger","Input","get","dayjs","cn","Calendar1","FormMessage","PopoverContent","Calendar","TimePicker","time","hour","minute","MyDateRangePicker","DateRangePicker","MyHtmlEditor","HtmlEditor","MyMaskInput","MaskInput","value","MyRadio","RadioGroupItem","MyShadcnSelect","options","onChange","hasError","handleChange","val","Select","SelectTrigger","SelectValue","SelectContent","option","SelectItem","MySwitch","Switch","MyTextarea","Textarea","MyTimePicker"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react/jsx-runtime"),c=require("react"),E=require("../../chunks/_commonjsHelpers-DKOUU3wS.cjs.js"),k=require("lucide-react"),S=require("react-start-kit/utils");var N={exports:{}},A=N.exports,C;function L(){return C||(C=1,(function(l,y){(function(p,i){i()})(A,function(){function p(e,t){return typeof t>"u"?t={autoBom:!1}:typeof t!="object"&&(console.warn("Deprecated: Expected third argument to be a object"),t={autoBom:!t}),t.autoBom&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type)?new Blob(["\uFEFF",e],{type:e.type}):e}function i(e,t,d){var o=new XMLHttpRequest;o.open("GET",e),o.responseType="blob",o.onload=function(){f(o.response,t,d)},o.onerror=function(){console.error("could not download file")},o.send()}function h(e){var t=new XMLHttpRequest;t.open("HEAD",e,!1);try{t.send()}catch{}return 200<=t.status&&299>=t.status}function v(e){try{e.dispatchEvent(new MouseEvent("click"))}catch{var t=document.createEvent("MouseEvents");t.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),e.dispatchEvent(t)}}var u=typeof window=="object"&&window.window===window?window:typeof self=="object"&&self.self===self?self:typeof E.commonjsGlobal=="object"&&E.commonjsGlobal.global===E.commonjsGlobal?E.commonjsGlobal:void 0,s=u.navigator&&/Macintosh/.test(navigator.userAgent)&&/AppleWebKit/.test(navigator.userAgent)&&!/Safari/.test(navigator.userAgent),f=u.saveAs||(typeof window!="object"||window!==u?function(){}:"download"in HTMLAnchorElement.prototype&&!s?function(e,t,d){var o=u.URL||u.webkitURL,a=document.createElement("a");t=t||e.name||"download",a.download=t,a.rel="noopener",typeof e=="string"?(a.href=e,a.origin===location.origin?v(a):h(a.href)?i(e,t,d):v(a,a.target="_blank")):(a.href=o.createObjectURL(e),setTimeout(function(){o.revokeObjectURL(a.href)},4e4),setTimeout(function(){v(a)},0))}:"msSaveOrOpenBlob"in navigator?function(e,t,d){if(t=t||e.name||"download",typeof e!="string")navigator.msSaveOrOpenBlob(p(e,d),t);else if(h(e))i(e,t,d);else{var o=document.createElement("a");o.href=e,o.target="_blank",setTimeout(function(){v(o)})}}:function(e,t,d,o){if(o=o||open("","_blank"),o&&(o.document.title=o.document.body.innerText="downloading..."),typeof e=="string")return i(e,t,d);var a=e.type==="application/octet-stream",j=/constructor/i.test(u.HTMLElement)||u.safari,w=/CriOS\/[\d]+/.test(navigator.userAgent);if((w||a&&j||s)&&typeof FileReader<"u"){var x=new FileReader;x.onloadend=function(){var r=x.result;r=w?r:r.replace(/^data:[^;]*;/,"data:attachment/file;"),o?o.location.href=r:location=r,o=null},x.readAsDataURL(e)}else{var b=u.URL||u.webkitURL,g=b.createObjectURL(e);o?o.location=g:location.href=g,o=null,setTimeout(function(){b.revokeObjectURL(g)},4e4)}});u.saveAs=f.saveAs=f,l.exports=f})})(N)),N.exports}var F=L();const M=()=>[{icon:n.jsx(k.Download,{size:20}),onClick:l=>{F.saveAs(l.src,l.title)},label:"Download"}],T=c.memo(({src:l,alt:y,fallbackImage:p})=>{const[i,h]=c.useState(!1),v=()=>{h(!0)};return n.jsx("img",{src:i&&p?p:l,alt:y,className:"max-h-full max-w-full object-contain",onError:v})}),O=c.memo(({image:l,index:y,onClick:p,fallbackImage:i,className:h,...v})=>{const[u,s]=c.useState(!1),f=()=>{s(!0)};return c.createElement("div",{...v,key:l.id,className:S.cn("aspect-video cursor-pointer overflow-hidden rounded-lg bg-gray-200 transition-opacity hover:opacity-80",h),onClick:()=>p(y)},n.jsx("img",{src:u&&i?i:l.thumbnail||l.src,alt:l.alt||`Image ${y+1}`,className:"h-full w-full object-cover",onError:f}))}),q=({images:l,thumbnailProps:y,actionButtons:p=[],fallbackImage:i,className:h,hasInfo:v,...u})=>{const[s,f]=c.useState(null),[e,t]=c.useState(!1),d=c.useMemo(()=>M(),[]),o=c.useMemo(()=>[...d,...p],[d,p]),a=c.useCallback(r=>{f(r),t(!0)},[]),j=c.useCallback(()=>{t(!1),f(null)},[]),w=c.useCallback(()=>{s!==null&&s>0&&f(s-1)},[s]),x=c.useCallback(()=>{s!==null&&s<l.length-1&&f(s+1)},[s,l.length]);c.useEffect(()=>{const r=m=>{if(e)switch(m.key){case"Escape":j();break;case"ArrowLeft":m.preventDefault(),w();break;case"ArrowRight":m.preventDefault(),x();break}};return document.addEventListener("keydown",r),()=>document.removeEventListener("keydown",r)},[e,w,x,j]),c.useEffect(()=>(e?document.body.style.overflow="hidden":document.body.style.overflow="unset",()=>{document.body.style.overflow="unset"}),[e]);const b=c.useMemo(()=>s!==null?l[s]:null,[s,l]),g=c.useMemo(()=>!e||!b?null:n.jsxs("div",{className:"bg-opacity-95 bg-bg fixed inset-0 z-50 flex flex-col items-center justify-center",children:[n.jsxs("div",{className:"absolute top-0 flex w-full items-start justify-between p-3",children:[n.jsx("div",{children:b.title&&n.jsx("h2",{className:"text-body-lg-semi-bold",children:b.title})}),n.jsxs("div",{className:"flex items-center gap-4 py-1",children:[o.map((r,m)=>n.jsx("button",{onClick:()=>r.onClick(b),className:"cursor-pointer",title:r.label,children:r.icon},m)),n.jsx("button",{onClick:j,className:"cursor-pointer",title:"Close (Esc)",children:n.jsx(k.X,{size:20})})]})]}),(s||0)>0&&n.jsx("button",{onClick:w,className:"bg-opacity-50 hover:bg-opacity-70 bg-bg text-secondary absolute top-1/2 left-2 z-50 -translate-y-1/2 rounded-full p-3 transition-all",title:"Previous (←)",children:n.jsx(k.ChevronLeft,{size:24})}),(s||0)<l.length-1&&n.jsx("button",{onClick:x,className:"bg-opacity-0 hover:bg-opacity-100 text-secondary bg-bg absolute top-1/2 right-2 z-50 -translate-y-1/2 rounded-full p-3 transition-all",title:"Next (→)",children:n.jsx(k.ChevronRight,{size:24})}),n.jsx("div",{className:"flex max-h-full max-w-full items-center justify-center overflow-hidden p-8",children:n.jsx(T,{src:b.src,alt:b.alt||`Image ${s}`,fallbackImage:i})}),n.jsx("div",{className:"bg-bg absolute bottom-0 w-full",children:n.jsx("div",{className:"flex gap-2 overflow-x-auto p-3",children:l.map((r,m)=>n.jsx("div",{className:S.cn("hover:border-item-primary h-16 min-w-16 shrink-0 cursor-pointer rounded border-3 border-transparent transition-all",m==s&&"border-item-primary"),onClick:()=>f(m),children:n.jsx("img",{src:r.thumbnail||r.src,alt:r.alt||`Thumbnail ${m+1}`,className:"size-full object-cover",onError:R=>{i&&(R.currentTarget.src=i)}})},r.id))})})]}),[e,i,b,o,j,s,w,l,x]);return n.jsxs("div",{className:"w-full",children:[n.jsx("div",{...u,className:S.cn("grid grid-cols-1 gap-4 lg:grid-cols-2 xl:grid-cols-3 2xl:grid-cols-4",h),children:l.map((r,m)=>n.jsxs("div",{className:"relative",children:[n.jsx(O,{...y,image:r,index:m,onClick:a,fallbackImage:i}),v&&r.title&&n.jsx("div",{className:"bg-bg/70 absolute bottom-0 flex min-h-10 w-full items-center justify-center text-center",children:r.title})]},r.id))}),g]})},D=c.memo(q);exports.MyGallery=D;
|
|
2
|
+
//# sourceMappingURL=index.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../../../node_modules/file-saver/dist/FileSaver.min.js","../../../src/components/gallery/MyGallery.tsx"],"sourcesContent":["(function(a,b){if(\"function\"==typeof define&&define.amd)define([],b);else if(\"undefined\"!=typeof exports)b();else{b(),a.FileSaver={exports:{}}.exports}})(this,function(){\"use strict\";function b(a,b){return\"undefined\"==typeof b?b={autoBom:!1}:\"object\"!=typeof b&&(console.warn(\"Deprecated: Expected third argument to be a object\"),b={autoBom:!b}),b.autoBom&&/^\\s*(?:text\\/\\S*|application\\/xml|\\S*\\/\\S*\\+xml)\\s*;.*charset\\s*=\\s*utf-8/i.test(a.type)?new Blob([\"\\uFEFF\",a],{type:a.type}):a}function c(a,b,c){var d=new XMLHttpRequest;d.open(\"GET\",a),d.responseType=\"blob\",d.onload=function(){g(d.response,b,c)},d.onerror=function(){console.error(\"could not download file\")},d.send()}function d(a){var b=new XMLHttpRequest;b.open(\"HEAD\",a,!1);try{b.send()}catch(a){}return 200<=b.status&&299>=b.status}function e(a){try{a.dispatchEvent(new MouseEvent(\"click\"))}catch(c){var b=document.createEvent(\"MouseEvents\");b.initMouseEvent(\"click\",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),a.dispatchEvent(b)}}var f=\"object\"==typeof window&&window.window===window?window:\"object\"==typeof self&&self.self===self?self:\"object\"==typeof global&&global.global===global?global:void 0,a=f.navigator&&/Macintosh/.test(navigator.userAgent)&&/AppleWebKit/.test(navigator.userAgent)&&!/Safari/.test(navigator.userAgent),g=f.saveAs||(\"object\"!=typeof window||window!==f?function(){}:\"download\"in HTMLAnchorElement.prototype&&!a?function(b,g,h){var i=f.URL||f.webkitURL,j=document.createElement(\"a\");g=g||b.name||\"download\",j.download=g,j.rel=\"noopener\",\"string\"==typeof b?(j.href=b,j.origin===location.origin?e(j):d(j.href)?c(b,g,h):e(j,j.target=\"_blank\")):(j.href=i.createObjectURL(b),setTimeout(function(){i.revokeObjectURL(j.href)},4E4),setTimeout(function(){e(j)},0))}:\"msSaveOrOpenBlob\"in navigator?function(f,g,h){if(g=g||f.name||\"download\",\"string\"!=typeof f)navigator.msSaveOrOpenBlob(b(f,h),g);else if(d(f))c(f,g,h);else{var i=document.createElement(\"a\");i.href=f,i.target=\"_blank\",setTimeout(function(){e(i)})}}:function(b,d,e,g){if(g=g||open(\"\",\"_blank\"),g&&(g.document.title=g.document.body.innerText=\"downloading...\"),\"string\"==typeof b)return c(b,d,e);var h=\"application/octet-stream\"===b.type,i=/constructor/i.test(f.HTMLElement)||f.safari,j=/CriOS\\/[\\d]+/.test(navigator.userAgent);if((j||h&&i||a)&&\"undefined\"!=typeof FileReader){var k=new FileReader;k.onloadend=function(){var a=k.result;a=j?a:a.replace(/^data:[^;]*;/,\"data:attachment/file;\"),g?g.location.href=a:location=a,g=null},k.readAsDataURL(b)}else{var l=f.URL||f.webkitURL,m=l.createObjectURL(b);g?g.location=m:location.href=m,g=null,setTimeout(function(){l.revokeObjectURL(m)},4E4)}});f.saveAs=g.saveAs=g,\"undefined\"!=typeof module&&(module.exports=g)});\n\n//# sourceMappingURL=FileSaver.min.js.map","import { saveAs } from 'file-saver';\nimport { ChevronLeft, ChevronRight, Download, X } from 'lucide-react';\nimport {\n type HTMLAttributes,\n memo,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport { cn } from 'react-start-kit/utils';\n\n/**\n * Interface representing an image item in the gallery.\n */\nexport interface GalleryItem {\n /** Unique identifier for the image. */\n id: string;\n /** URL of the full-resolution image. */\n src: string;\n /** URL of the thumbnail image. */\n thumbnail: string;\n /** Alt text for the image. */\n alt: string;\n /** Optional title or description for the image. */\n title?: string;\n}\n\n/**\n * Props for the Thumbnail component.\n */\nexport interface ThumbnailProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onClick'\n> {\n /** The gallery item to display as a thumbnail. */\n image: GalleryItem;\n /** The index of the item in the gallery. */\n index: number;\n /** Callback executed when the thumbnail is clicked. */\n onClick: (index: number) => void;\n /** URL used when the thumbnail image fails to load. */\n fallbackImage?: string;\n}\n\n/**\n * Interface representing a custom action button in the fullscreen view.\n */\nexport interface GalleryActionButton {\n /** Icon to display on the button. */\n icon: ReactNode;\n /** Label for the button (used as title/tooltip). */\n label: string;\n /** Callback executed when the button is clicked. */\n onClick: (image: GalleryItem) => void;\n /** Custom CSS class name for the button. */\n className?: string;\n}\n\n/**\n * Props for the MyGallery component.\n */\nexport type MyGalleryProps = HTMLAttributes<HTMLDivElement> & {\n /** Array of gallery items to display. */\n images: GalleryItem[];\n /** Additional props to pass to each thumbnail component. */\n thumbnailProps?: ThumbnailProps;\n /** URL used when an image fails to load. */\n fallbackImage?: string;\n /** Custom action buttons rendered in fullscreen. */\n actionButtons?: GalleryActionButton[];\n /** Whether to show image title overlay on thumbnails. */\n hasInfo?: true;\n};\n\n/**\n * Creates the default action buttons for the gallery fullscreen view.\n * @returns {GalleryActionButton[]} Array containing the default download button\n */\nconst createDefaultActions = (): GalleryActionButton[] => [\n {\n icon: <Download size={20} />,\n onClick: (image) => {\n saveAs(image.src, image.title);\n },\n label: 'Download',\n },\n];\n\n/**\n * FullscreenImage component that displays an image with fallback support.\n * @param {Object} props - Component props\n * @param {string} props.src - Source URL of the image\n * @param {string} props.alt - Alt text for the image\n * @param {string} [props.fallbackImage] - URL to use if the main image fails to load\n * @returns {JSX.Element} An img element with error handling\n */\nconst FullscreenImage = memo(\n ({\n src,\n alt,\n fallbackImage,\n }: {\n src: string;\n alt: string;\n fallbackImage?: string;\n }) => {\n const [imgError, setImgError] = useState(false);\n\n const handleError = () => {\n setImgError(true);\n };\n\n return (\n <img\n src={imgError && fallbackImage ? fallbackImage : src}\n alt={alt}\n className=\"max-h-full max-w-full object-contain\"\n onError={handleError}\n />\n );\n }\n);\n\n/**\n * Thumbnail component that displays a clickable gallery image preview.\n * @param {ThumbnailProps} props - Component props\n * @returns {JSX.Element} A clickable thumbnail with error handling\n */\nconst Thumbnail = memo(\n ({\n image,\n index,\n onClick,\n fallbackImage,\n className,\n ...props\n }: ThumbnailProps) => {\n const [imgError, setImgError] = useState(false);\n\n const handleError = () => {\n setImgError(true);\n };\n\n return (\n <div\n {...props}\n key={image.id}\n className={cn(\n 'aspect-video cursor-pointer overflow-hidden rounded-lg bg-gray-200 transition-opacity hover:opacity-80',\n className\n )}\n onClick={() => onClick(index)}\n >\n <img\n src={\n imgError && fallbackImage\n ? fallbackImage\n : image.thumbnail || image.src\n }\n alt={image.alt || `Image ${index + 1}`}\n className=\"h-full w-full object-cover\"\n onError={handleError}\n />\n </div>\n );\n }\n);\n\n// Main component implementation\n/**\n * MyGallery displays a grid of image thumbnails with an immersive fullscreen viewer.\n * Includes keyboard navigation, download action, optional info overlay, and fallbacks.\n *\n * @param props.images - Array of gallery items to display.\n * @param props.thumbnailProps - Additional props to pass to each thumbnail component.\n * @param props.fallbackImage - URL used when an image fails to load.\n * @param props.actionButtons - Custom action buttons rendered in fullscreen.\n * @param props.hasInfo - Whether to show image title overlay on thumbnails.\n * @returns {JSX.Element} A gallery component with thumbnail grid and fullscreen viewer\n */\nconst MyGalleryComponent = ({\n images,\n thumbnailProps,\n actionButtons = [],\n fallbackImage,\n className,\n hasInfo,\n ...props\n}: MyGalleryProps) => {\n const [selectedIndex, setSelectedIndex] = useState<number | null>(null);\n const [isFullscreen, setIsFullscreen] = useState(false);\n\n // Memoize default actions to prevent recreation on each render\n const defaultActions = useMemo(() => createDefaultActions(), []);\n\n // Memoize combined action buttons\n const allActionButtons = useMemo(\n () => [...defaultActions, ...actionButtons],\n [defaultActions, actionButtons]\n );\n\n // Memoize event handlers to prevent recreation on each render\n const openFullscreen = useCallback((index: number) => {\n setSelectedIndex(index);\n setIsFullscreen(true);\n }, []);\n\n const closeFullscreen = useCallback(() => {\n setIsFullscreen(false);\n setSelectedIndex(null);\n }, []);\n\n const goToPrevious = useCallback(() => {\n if (selectedIndex !== null && selectedIndex > 0) {\n setSelectedIndex(selectedIndex - 1);\n }\n }, [selectedIndex]);\n\n const goToNext = useCallback(() => {\n if (selectedIndex !== null && selectedIndex < images.length - 1) {\n setSelectedIndex(selectedIndex + 1);\n }\n }, [selectedIndex, images.length]);\n\n // Keyboard navigation\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (!isFullscreen) return;\n\n switch (e.key) {\n case 'Escape':\n closeFullscreen();\n break;\n case 'ArrowLeft':\n e.preventDefault();\n goToPrevious();\n break;\n case 'ArrowRight':\n e.preventDefault();\n goToNext();\n break;\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isFullscreen, goToPrevious, goToNext, closeFullscreen]);\n\n // Prevent body scroll when fullscreen is open\n useEffect(() => {\n if (isFullscreen) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = 'unset';\n }\n\n return () => {\n document.body.style.overflow = 'unset';\n };\n }, [isFullscreen]);\n\n // Memoize currentImage to prevent unnecessary calculations\n const currentImage = useMemo(\n () => (selectedIndex !== null ? images[selectedIndex] : null),\n [selectedIndex, images]\n );\n\n // Memoized FullscreenView component\n const FullscreenView = useMemo(() => {\n if (!isFullscreen || !currentImage) return null;\n\n return (\n <div className=\"bg-opacity-95 bg-bg fixed inset-0 z-50 flex flex-col items-center justify-center\">\n <div\n className={\n 'absolute top-0 flex w-full items-start justify-between p-3'\n }\n >\n <div>\n {currentImage.title && (\n <h2 className=\"text-body-lg-semi-bold\">{currentImage.title}</h2>\n )}\n </div>\n\n {/* Top Bar with Actions and Close */}\n <div className=\"flex items-center gap-4 py-1\">\n {/* Action Buttons */}\n {allActionButtons.map((action, index) => (\n <button\n key={index}\n onClick={() => action.onClick(currentImage)}\n className=\"cursor-pointer\"\n title={action.label}\n >\n {action.icon}\n </button>\n ))}\n\n {/* Close Button */}\n <button\n onClick={closeFullscreen}\n className=\"cursor-pointer\"\n title=\"Close (Esc)\"\n >\n <X size={20} />\n </button>\n </div>\n </div>\n\n {/* Left Navigation */}\n {(selectedIndex || 0) > 0 && (\n <button\n onClick={goToPrevious}\n className=\"bg-opacity-50 hover:bg-opacity-70 bg-bg text-secondary absolute top-1/2 left-2 z-50 -translate-y-1/2 rounded-full p-3 transition-all\"\n title=\"Previous (←)\"\n >\n <ChevronLeft size={24} />\n </button>\n )}\n\n {/* Right Navigation */}\n {(selectedIndex || 0) < images.length - 1 && (\n <button\n onClick={goToNext}\n className=\"bg-opacity-0 hover:bg-opacity-100 text-secondary bg-bg absolute top-1/2 right-2 z-50 -translate-y-1/2 rounded-full p-3 transition-all\"\n title=\"Next (→)\"\n >\n <ChevronRight size={24} />\n </button>\n )}\n\n <div className=\"flex max-h-full max-w-full items-center justify-center overflow-hidden p-8\">\n <FullscreenImage\n src={currentImage.src}\n alt={currentImage.alt || `Image ${selectedIndex}`}\n fallbackImage={fallbackImage}\n />\n </div>\n\n <div className={'bg-bg absolute bottom-0 w-full'}>\n <div className=\"flex gap-2 overflow-x-auto p-3\">\n {images.map((image, index) => {\n return (\n <div\n key={image.id}\n className={cn(\n `hover:border-item-primary h-16 min-w-16 shrink-0 cursor-pointer rounded border-3 border-transparent transition-all`,\n index == selectedIndex && 'border-item-primary'\n )}\n onClick={() => setSelectedIndex(index)}\n >\n <img\n src={image.thumbnail || image.src}\n alt={image.alt || `Thumbnail ${index + 1}`}\n className=\"size-full object-cover\"\n onError={(e) => {\n if (fallbackImage) {\n e.currentTarget.src = fallbackImage;\n }\n }}\n />\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n }, [\n isFullscreen,\n fallbackImage,\n currentImage,\n allActionButtons,\n closeFullscreen,\n selectedIndex,\n goToPrevious,\n images,\n goToNext,\n ]);\n\n return (\n <div className={'w-full'}>\n <div\n {...props}\n className={cn(\n 'grid grid-cols-1 gap-4 lg:grid-cols-2 xl:grid-cols-3 2xl:grid-cols-4',\n className\n )}\n >\n {images.map((image, index) => (\n <div className={'relative'} key={image.id}>\n <Thumbnail\n {...thumbnailProps}\n image={image}\n index={index}\n onClick={openFullscreen}\n fallbackImage={fallbackImage}\n />\n {hasInfo && image.title && (\n <div\n className={\n 'bg-bg/70 absolute bottom-0 flex min-h-10 w-full items-center justify-center text-center'\n }\n >\n {image.title}\n </div>\n )}\n </div>\n ))}\n </div>\n\n {FullscreenView}\n </div>\n );\n};\n\n/**\n * Memoized MyGallery component.\n */\nexport const MyGallery = memo(MyGalleryComponent);\n"],"names":["a","b","this","c","d","g","e","f","global","h","i","j","k","l","m","module","createDefaultActions","jsx","Download","image","saveAs","FullscreenImage","memo","src","alt","fallbackImage","imgError","setImgError","useState","handleError","Thumbnail","index","onClick","className","props","createElement","cn","MyGalleryComponent","images","thumbnailProps","actionButtons","hasInfo","selectedIndex","setSelectedIndex","isFullscreen","setIsFullscreen","defaultActions","useMemo","allActionButtons","openFullscreen","useCallback","closeFullscreen","goToPrevious","goToNext","useEffect","handleKeyDown","currentImage","FullscreenView","jsxs","action","X","ChevronLeft","ChevronRight","MyGallery"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
import { jsxs as g, jsx as l } from "react/jsx-runtime";
|
|
2
|
+
import { memo as R, useState as L, useMemo as j, useCallback as N, useEffect as C, createElement as M } from "react";
|
|
3
|
+
import { c as k } from "../../chunks/_commonjsHelpers-DaMA6jEr.es.js";
|
|
4
|
+
import { X as D, ChevronLeft as O, ChevronRight as U, Download as z } from "lucide-react";
|
|
5
|
+
import { cn as F } from "react-start-kit/utils";
|
|
6
|
+
var A = { exports: {} }, _ = A.exports, S;
|
|
7
|
+
function B() {
|
|
8
|
+
return S || (S = 1, (function(s, w) {
|
|
9
|
+
(function(p, i) {
|
|
10
|
+
i();
|
|
11
|
+
})(_, function() {
|
|
12
|
+
function p(e, t) {
|
|
13
|
+
return typeof t > "u" ? t = { autoBom: !1 } : typeof t != "object" && (console.warn("Deprecated: Expected third argument to be a object"), t = { autoBom: !t }), t.autoBom && /^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type) ? new Blob(["\uFEFF", e], { type: e.type }) : e;
|
|
14
|
+
}
|
|
15
|
+
function i(e, t, u) {
|
|
16
|
+
var o = new XMLHttpRequest();
|
|
17
|
+
o.open("GET", e), o.responseType = "blob", o.onload = function() {
|
|
18
|
+
d(o.response, t, u);
|
|
19
|
+
}, o.onerror = function() {
|
|
20
|
+
console.error("could not download file");
|
|
21
|
+
}, o.send();
|
|
22
|
+
}
|
|
23
|
+
function h(e) {
|
|
24
|
+
var t = new XMLHttpRequest();
|
|
25
|
+
t.open("HEAD", e, !1);
|
|
26
|
+
try {
|
|
27
|
+
t.send();
|
|
28
|
+
} catch {
|
|
29
|
+
}
|
|
30
|
+
return 200 <= t.status && 299 >= t.status;
|
|
31
|
+
}
|
|
32
|
+
function v(e) {
|
|
33
|
+
try {
|
|
34
|
+
e.dispatchEvent(new MouseEvent("click"));
|
|
35
|
+
} catch {
|
|
36
|
+
var t = document.createEvent("MouseEvents");
|
|
37
|
+
t.initMouseEvent("click", !0, !0, window, 0, 0, 0, 80, 20, !1, !1, !1, !1, 0, null), e.dispatchEvent(t);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
var c = typeof window == "object" && window.window === window ? window : typeof self == "object" && self.self === self ? self : typeof k == "object" && k.global === k ? k : void 0, r = c.navigator && /Macintosh/.test(navigator.userAgent) && /AppleWebKit/.test(navigator.userAgent) && !/Safari/.test(navigator.userAgent), d = c.saveAs || (typeof window != "object" || window !== c ? function() {
|
|
41
|
+
} : "download" in HTMLAnchorElement.prototype && !r ? function(e, t, u) {
|
|
42
|
+
var o = c.URL || c.webkitURL, a = document.createElement("a");
|
|
43
|
+
t = t || e.name || "download", a.download = t, a.rel = "noopener", typeof e == "string" ? (a.href = e, a.origin === location.origin ? v(a) : h(a.href) ? i(e, t, u) : v(a, a.target = "_blank")) : (a.href = o.createObjectURL(e), setTimeout(function() {
|
|
44
|
+
o.revokeObjectURL(a.href);
|
|
45
|
+
}, 4e4), setTimeout(function() {
|
|
46
|
+
v(a);
|
|
47
|
+
}, 0));
|
|
48
|
+
} : "msSaveOrOpenBlob" in navigator ? function(e, t, u) {
|
|
49
|
+
if (t = t || e.name || "download", typeof e != "string") navigator.msSaveOrOpenBlob(p(e, u), t);
|
|
50
|
+
else if (h(e)) i(e, t, u);
|
|
51
|
+
else {
|
|
52
|
+
var o = document.createElement("a");
|
|
53
|
+
o.href = e, o.target = "_blank", setTimeout(function() {
|
|
54
|
+
v(o);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
} : function(e, t, u, o) {
|
|
58
|
+
if (o = o || open("", "_blank"), o && (o.document.title = o.document.body.innerText = "downloading..."), typeof e == "string") return i(e, t, u);
|
|
59
|
+
var a = e.type === "application/octet-stream", x = /constructor/i.test(c.HTMLElement) || c.safari, y = /CriOS\/[\d]+/.test(navigator.userAgent);
|
|
60
|
+
if ((y || a && x || r) && typeof FileReader < "u") {
|
|
61
|
+
var b = new FileReader();
|
|
62
|
+
b.onloadend = function() {
|
|
63
|
+
var n = b.result;
|
|
64
|
+
n = y ? n : n.replace(/^data:[^;]*;/, "data:attachment/file;"), o ? o.location.href = n : location = n, o = null;
|
|
65
|
+
}, b.readAsDataURL(e);
|
|
66
|
+
} else {
|
|
67
|
+
var m = c.URL || c.webkitURL, E = m.createObjectURL(e);
|
|
68
|
+
o ? o.location = E : location.href = E, o = null, setTimeout(function() {
|
|
69
|
+
m.revokeObjectURL(E);
|
|
70
|
+
}, 4e4);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
c.saveAs = d.saveAs = d, s.exports = d;
|
|
74
|
+
});
|
|
75
|
+
})(A)), A.exports;
|
|
76
|
+
}
|
|
77
|
+
var H = B();
|
|
78
|
+
const $ = () => [
|
|
79
|
+
{
|
|
80
|
+
icon: /* @__PURE__ */ l(z, { size: 20 }),
|
|
81
|
+
onClick: (s) => {
|
|
82
|
+
H.saveAs(s.src, s.title);
|
|
83
|
+
},
|
|
84
|
+
label: "Download"
|
|
85
|
+
}
|
|
86
|
+
], q = R(
|
|
87
|
+
({
|
|
88
|
+
src: s,
|
|
89
|
+
alt: w,
|
|
90
|
+
fallbackImage: p
|
|
91
|
+
}) => {
|
|
92
|
+
const [i, h] = L(!1);
|
|
93
|
+
return /* @__PURE__ */ l(
|
|
94
|
+
"img",
|
|
95
|
+
{
|
|
96
|
+
src: i && p ? p : s,
|
|
97
|
+
alt: w,
|
|
98
|
+
className: "max-h-full max-w-full object-contain",
|
|
99
|
+
onError: () => {
|
|
100
|
+
h(!0);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
), G = R(
|
|
106
|
+
({
|
|
107
|
+
image: s,
|
|
108
|
+
index: w,
|
|
109
|
+
onClick: p,
|
|
110
|
+
fallbackImage: i,
|
|
111
|
+
className: h,
|
|
112
|
+
...v
|
|
113
|
+
}) => {
|
|
114
|
+
const [c, r] = L(!1), d = () => {
|
|
115
|
+
r(!0);
|
|
116
|
+
};
|
|
117
|
+
return /* @__PURE__ */ M(
|
|
118
|
+
"div",
|
|
119
|
+
{
|
|
120
|
+
...v,
|
|
121
|
+
key: s.id,
|
|
122
|
+
className: F(
|
|
123
|
+
"aspect-video cursor-pointer overflow-hidden rounded-lg bg-gray-200 transition-opacity hover:opacity-80",
|
|
124
|
+
h
|
|
125
|
+
),
|
|
126
|
+
onClick: () => p(w)
|
|
127
|
+
},
|
|
128
|
+
/* @__PURE__ */ l(
|
|
129
|
+
"img",
|
|
130
|
+
{
|
|
131
|
+
src: c && i ? i : s.thumbnail || s.src,
|
|
132
|
+
alt: s.alt || `Image ${w + 1}`,
|
|
133
|
+
className: "h-full w-full object-cover",
|
|
134
|
+
onError: d
|
|
135
|
+
}
|
|
136
|
+
)
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
), I = ({
|
|
140
|
+
images: s,
|
|
141
|
+
thumbnailProps: w,
|
|
142
|
+
actionButtons: p = [],
|
|
143
|
+
fallbackImage: i,
|
|
144
|
+
className: h,
|
|
145
|
+
hasInfo: v,
|
|
146
|
+
...c
|
|
147
|
+
}) => {
|
|
148
|
+
const [r, d] = L(null), [e, t] = L(!1), u = j(() => $(), []), o = j(
|
|
149
|
+
() => [...u, ...p],
|
|
150
|
+
[u, p]
|
|
151
|
+
), a = N((n) => {
|
|
152
|
+
d(n), t(!0);
|
|
153
|
+
}, []), x = N(() => {
|
|
154
|
+
t(!1), d(null);
|
|
155
|
+
}, []), y = N(() => {
|
|
156
|
+
r !== null && r > 0 && d(r - 1);
|
|
157
|
+
}, [r]), b = N(() => {
|
|
158
|
+
r !== null && r < s.length - 1 && d(r + 1);
|
|
159
|
+
}, [r, s.length]);
|
|
160
|
+
C(() => {
|
|
161
|
+
const n = (f) => {
|
|
162
|
+
if (e)
|
|
163
|
+
switch (f.key) {
|
|
164
|
+
case "Escape":
|
|
165
|
+
x();
|
|
166
|
+
break;
|
|
167
|
+
case "ArrowLeft":
|
|
168
|
+
f.preventDefault(), y();
|
|
169
|
+
break;
|
|
170
|
+
case "ArrowRight":
|
|
171
|
+
f.preventDefault(), b();
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
return document.addEventListener("keydown", n), () => document.removeEventListener("keydown", n);
|
|
176
|
+
}, [e, y, b, x]), C(() => (e ? document.body.style.overflow = "hidden" : document.body.style.overflow = "unset", () => {
|
|
177
|
+
document.body.style.overflow = "unset";
|
|
178
|
+
}), [e]);
|
|
179
|
+
const m = j(
|
|
180
|
+
() => r !== null ? s[r] : null,
|
|
181
|
+
[r, s]
|
|
182
|
+
), E = j(() => !e || !m ? null : /* @__PURE__ */ g("div", { className: "bg-opacity-95 bg-bg fixed inset-0 z-50 flex flex-col items-center justify-center", children: [
|
|
183
|
+
/* @__PURE__ */ g(
|
|
184
|
+
"div",
|
|
185
|
+
{
|
|
186
|
+
className: "absolute top-0 flex w-full items-start justify-between p-3",
|
|
187
|
+
children: [
|
|
188
|
+
/* @__PURE__ */ l("div", { children: m.title && /* @__PURE__ */ l("h2", { className: "text-body-lg-semi-bold", children: m.title }) }),
|
|
189
|
+
/* @__PURE__ */ g("div", { className: "flex items-center gap-4 py-1", children: [
|
|
190
|
+
o.map((n, f) => /* @__PURE__ */ l(
|
|
191
|
+
"button",
|
|
192
|
+
{
|
|
193
|
+
onClick: () => n.onClick(m),
|
|
194
|
+
className: "cursor-pointer",
|
|
195
|
+
title: n.label,
|
|
196
|
+
children: n.icon
|
|
197
|
+
},
|
|
198
|
+
f
|
|
199
|
+
)),
|
|
200
|
+
/* @__PURE__ */ l(
|
|
201
|
+
"button",
|
|
202
|
+
{
|
|
203
|
+
onClick: x,
|
|
204
|
+
className: "cursor-pointer",
|
|
205
|
+
title: "Close (Esc)",
|
|
206
|
+
children: /* @__PURE__ */ l(D, { size: 20 })
|
|
207
|
+
}
|
|
208
|
+
)
|
|
209
|
+
] })
|
|
210
|
+
]
|
|
211
|
+
}
|
|
212
|
+
),
|
|
213
|
+
(r || 0) > 0 && /* @__PURE__ */ l(
|
|
214
|
+
"button",
|
|
215
|
+
{
|
|
216
|
+
onClick: y,
|
|
217
|
+
className: "bg-opacity-50 hover:bg-opacity-70 bg-bg text-secondary absolute top-1/2 left-2 z-50 -translate-y-1/2 rounded-full p-3 transition-all",
|
|
218
|
+
title: "Previous (←)",
|
|
219
|
+
children: /* @__PURE__ */ l(O, { size: 24 })
|
|
220
|
+
}
|
|
221
|
+
),
|
|
222
|
+
(r || 0) < s.length - 1 && /* @__PURE__ */ l(
|
|
223
|
+
"button",
|
|
224
|
+
{
|
|
225
|
+
onClick: b,
|
|
226
|
+
className: "bg-opacity-0 hover:bg-opacity-100 text-secondary bg-bg absolute top-1/2 right-2 z-50 -translate-y-1/2 rounded-full p-3 transition-all",
|
|
227
|
+
title: "Next (→)",
|
|
228
|
+
children: /* @__PURE__ */ l(U, { size: 24 })
|
|
229
|
+
}
|
|
230
|
+
),
|
|
231
|
+
/* @__PURE__ */ l("div", { className: "flex max-h-full max-w-full items-center justify-center overflow-hidden p-8", children: /* @__PURE__ */ l(
|
|
232
|
+
q,
|
|
233
|
+
{
|
|
234
|
+
src: m.src,
|
|
235
|
+
alt: m.alt || `Image ${r}`,
|
|
236
|
+
fallbackImage: i
|
|
237
|
+
}
|
|
238
|
+
) }),
|
|
239
|
+
/* @__PURE__ */ l("div", { className: "bg-bg absolute bottom-0 w-full", children: /* @__PURE__ */ l("div", { className: "flex gap-2 overflow-x-auto p-3", children: s.map((n, f) => /* @__PURE__ */ l(
|
|
240
|
+
"div",
|
|
241
|
+
{
|
|
242
|
+
className: F(
|
|
243
|
+
"hover:border-item-primary h-16 min-w-16 shrink-0 cursor-pointer rounded border-3 border-transparent transition-all",
|
|
244
|
+
f == r && "border-item-primary"
|
|
245
|
+
),
|
|
246
|
+
onClick: () => d(f),
|
|
247
|
+
children: /* @__PURE__ */ l(
|
|
248
|
+
"img",
|
|
249
|
+
{
|
|
250
|
+
src: n.thumbnail || n.src,
|
|
251
|
+
alt: n.alt || `Thumbnail ${f + 1}`,
|
|
252
|
+
className: "size-full object-cover",
|
|
253
|
+
onError: (T) => {
|
|
254
|
+
i && (T.currentTarget.src = i);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
)
|
|
258
|
+
},
|
|
259
|
+
n.id
|
|
260
|
+
)) }) })
|
|
261
|
+
] }), [
|
|
262
|
+
e,
|
|
263
|
+
i,
|
|
264
|
+
m,
|
|
265
|
+
o,
|
|
266
|
+
x,
|
|
267
|
+
r,
|
|
268
|
+
y,
|
|
269
|
+
s,
|
|
270
|
+
b
|
|
271
|
+
]);
|
|
272
|
+
return /* @__PURE__ */ g("div", { className: "w-full", children: [
|
|
273
|
+
/* @__PURE__ */ l(
|
|
274
|
+
"div",
|
|
275
|
+
{
|
|
276
|
+
...c,
|
|
277
|
+
className: F(
|
|
278
|
+
"grid grid-cols-1 gap-4 lg:grid-cols-2 xl:grid-cols-3 2xl:grid-cols-4",
|
|
279
|
+
h
|
|
280
|
+
),
|
|
281
|
+
children: s.map((n, f) => /* @__PURE__ */ g("div", { className: "relative", children: [
|
|
282
|
+
/* @__PURE__ */ l(
|
|
283
|
+
G,
|
|
284
|
+
{
|
|
285
|
+
...w,
|
|
286
|
+
image: n,
|
|
287
|
+
index: f,
|
|
288
|
+
onClick: a,
|
|
289
|
+
fallbackImage: i
|
|
290
|
+
}
|
|
291
|
+
),
|
|
292
|
+
v && n.title && /* @__PURE__ */ l(
|
|
293
|
+
"div",
|
|
294
|
+
{
|
|
295
|
+
className: "bg-bg/70 absolute bottom-0 flex min-h-10 w-full items-center justify-center text-center",
|
|
296
|
+
children: n.title
|
|
297
|
+
}
|
|
298
|
+
)
|
|
299
|
+
] }, n.id))
|
|
300
|
+
}
|
|
301
|
+
),
|
|
302
|
+
E
|
|
303
|
+
] });
|
|
304
|
+
}, J = R(I);
|
|
305
|
+
export {
|
|
306
|
+
J as MyGallery
|
|
307
|
+
};
|
|
308
|
+
//# sourceMappingURL=index.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../../../node_modules/file-saver/dist/FileSaver.min.js","../../../src/components/gallery/MyGallery.tsx"],"sourcesContent":["(function(a,b){if(\"function\"==typeof define&&define.amd)define([],b);else if(\"undefined\"!=typeof exports)b();else{b(),a.FileSaver={exports:{}}.exports}})(this,function(){\"use strict\";function b(a,b){return\"undefined\"==typeof b?b={autoBom:!1}:\"object\"!=typeof b&&(console.warn(\"Deprecated: Expected third argument to be a object\"),b={autoBom:!b}),b.autoBom&&/^\\s*(?:text\\/\\S*|application\\/xml|\\S*\\/\\S*\\+xml)\\s*;.*charset\\s*=\\s*utf-8/i.test(a.type)?new Blob([\"\\uFEFF\",a],{type:a.type}):a}function c(a,b,c){var d=new XMLHttpRequest;d.open(\"GET\",a),d.responseType=\"blob\",d.onload=function(){g(d.response,b,c)},d.onerror=function(){console.error(\"could not download file\")},d.send()}function d(a){var b=new XMLHttpRequest;b.open(\"HEAD\",a,!1);try{b.send()}catch(a){}return 200<=b.status&&299>=b.status}function e(a){try{a.dispatchEvent(new MouseEvent(\"click\"))}catch(c){var b=document.createEvent(\"MouseEvents\");b.initMouseEvent(\"click\",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),a.dispatchEvent(b)}}var f=\"object\"==typeof window&&window.window===window?window:\"object\"==typeof self&&self.self===self?self:\"object\"==typeof global&&global.global===global?global:void 0,a=f.navigator&&/Macintosh/.test(navigator.userAgent)&&/AppleWebKit/.test(navigator.userAgent)&&!/Safari/.test(navigator.userAgent),g=f.saveAs||(\"object\"!=typeof window||window!==f?function(){}:\"download\"in HTMLAnchorElement.prototype&&!a?function(b,g,h){var i=f.URL||f.webkitURL,j=document.createElement(\"a\");g=g||b.name||\"download\",j.download=g,j.rel=\"noopener\",\"string\"==typeof b?(j.href=b,j.origin===location.origin?e(j):d(j.href)?c(b,g,h):e(j,j.target=\"_blank\")):(j.href=i.createObjectURL(b),setTimeout(function(){i.revokeObjectURL(j.href)},4E4),setTimeout(function(){e(j)},0))}:\"msSaveOrOpenBlob\"in navigator?function(f,g,h){if(g=g||f.name||\"download\",\"string\"!=typeof f)navigator.msSaveOrOpenBlob(b(f,h),g);else if(d(f))c(f,g,h);else{var i=document.createElement(\"a\");i.href=f,i.target=\"_blank\",setTimeout(function(){e(i)})}}:function(b,d,e,g){if(g=g||open(\"\",\"_blank\"),g&&(g.document.title=g.document.body.innerText=\"downloading...\"),\"string\"==typeof b)return c(b,d,e);var h=\"application/octet-stream\"===b.type,i=/constructor/i.test(f.HTMLElement)||f.safari,j=/CriOS\\/[\\d]+/.test(navigator.userAgent);if((j||h&&i||a)&&\"undefined\"!=typeof FileReader){var k=new FileReader;k.onloadend=function(){var a=k.result;a=j?a:a.replace(/^data:[^;]*;/,\"data:attachment/file;\"),g?g.location.href=a:location=a,g=null},k.readAsDataURL(b)}else{var l=f.URL||f.webkitURL,m=l.createObjectURL(b);g?g.location=m:location.href=m,g=null,setTimeout(function(){l.revokeObjectURL(m)},4E4)}});f.saveAs=g.saveAs=g,\"undefined\"!=typeof module&&(module.exports=g)});\n\n//# sourceMappingURL=FileSaver.min.js.map","import { saveAs } from 'file-saver';\nimport { ChevronLeft, ChevronRight, Download, X } from 'lucide-react';\nimport {\n type HTMLAttributes,\n memo,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport { cn } from 'react-start-kit/utils';\n\n/**\n * Interface representing an image item in the gallery.\n */\nexport interface GalleryItem {\n /** Unique identifier for the image. */\n id: string;\n /** URL of the full-resolution image. */\n src: string;\n /** URL of the thumbnail image. */\n thumbnail: string;\n /** Alt text for the image. */\n alt: string;\n /** Optional title or description for the image. */\n title?: string;\n}\n\n/**\n * Props for the Thumbnail component.\n */\nexport interface ThumbnailProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onClick'\n> {\n /** The gallery item to display as a thumbnail. */\n image: GalleryItem;\n /** The index of the item in the gallery. */\n index: number;\n /** Callback executed when the thumbnail is clicked. */\n onClick: (index: number) => void;\n /** URL used when the thumbnail image fails to load. */\n fallbackImage?: string;\n}\n\n/**\n * Interface representing a custom action button in the fullscreen view.\n */\nexport interface GalleryActionButton {\n /** Icon to display on the button. */\n icon: ReactNode;\n /** Label for the button (used as title/tooltip). */\n label: string;\n /** Callback executed when the button is clicked. */\n onClick: (image: GalleryItem) => void;\n /** Custom CSS class name for the button. */\n className?: string;\n}\n\n/**\n * Props for the MyGallery component.\n */\nexport type MyGalleryProps = HTMLAttributes<HTMLDivElement> & {\n /** Array of gallery items to display. */\n images: GalleryItem[];\n /** Additional props to pass to each thumbnail component. */\n thumbnailProps?: ThumbnailProps;\n /** URL used when an image fails to load. */\n fallbackImage?: string;\n /** Custom action buttons rendered in fullscreen. */\n actionButtons?: GalleryActionButton[];\n /** Whether to show image title overlay on thumbnails. */\n hasInfo?: true;\n};\n\n/**\n * Creates the default action buttons for the gallery fullscreen view.\n * @returns {GalleryActionButton[]} Array containing the default download button\n */\nconst createDefaultActions = (): GalleryActionButton[] => [\n {\n icon: <Download size={20} />,\n onClick: (image) => {\n saveAs(image.src, image.title);\n },\n label: 'Download',\n },\n];\n\n/**\n * FullscreenImage component that displays an image with fallback support.\n * @param {Object} props - Component props\n * @param {string} props.src - Source URL of the image\n * @param {string} props.alt - Alt text for the image\n * @param {string} [props.fallbackImage] - URL to use if the main image fails to load\n * @returns {JSX.Element} An img element with error handling\n */\nconst FullscreenImage = memo(\n ({\n src,\n alt,\n fallbackImage,\n }: {\n src: string;\n alt: string;\n fallbackImage?: string;\n }) => {\n const [imgError, setImgError] = useState(false);\n\n const handleError = () => {\n setImgError(true);\n };\n\n return (\n <img\n src={imgError && fallbackImage ? fallbackImage : src}\n alt={alt}\n className=\"max-h-full max-w-full object-contain\"\n onError={handleError}\n />\n );\n }\n);\n\n/**\n * Thumbnail component that displays a clickable gallery image preview.\n * @param {ThumbnailProps} props - Component props\n * @returns {JSX.Element} A clickable thumbnail with error handling\n */\nconst Thumbnail = memo(\n ({\n image,\n index,\n onClick,\n fallbackImage,\n className,\n ...props\n }: ThumbnailProps) => {\n const [imgError, setImgError] = useState(false);\n\n const handleError = () => {\n setImgError(true);\n };\n\n return (\n <div\n {...props}\n key={image.id}\n className={cn(\n 'aspect-video cursor-pointer overflow-hidden rounded-lg bg-gray-200 transition-opacity hover:opacity-80',\n className\n )}\n onClick={() => onClick(index)}\n >\n <img\n src={\n imgError && fallbackImage\n ? fallbackImage\n : image.thumbnail || image.src\n }\n alt={image.alt || `Image ${index + 1}`}\n className=\"h-full w-full object-cover\"\n onError={handleError}\n />\n </div>\n );\n }\n);\n\n// Main component implementation\n/**\n * MyGallery displays a grid of image thumbnails with an immersive fullscreen viewer.\n * Includes keyboard navigation, download action, optional info overlay, and fallbacks.\n *\n * @param props.images - Array of gallery items to display.\n * @param props.thumbnailProps - Additional props to pass to each thumbnail component.\n * @param props.fallbackImage - URL used when an image fails to load.\n * @param props.actionButtons - Custom action buttons rendered in fullscreen.\n * @param props.hasInfo - Whether to show image title overlay on thumbnails.\n * @returns {JSX.Element} A gallery component with thumbnail grid and fullscreen viewer\n */\nconst MyGalleryComponent = ({\n images,\n thumbnailProps,\n actionButtons = [],\n fallbackImage,\n className,\n hasInfo,\n ...props\n}: MyGalleryProps) => {\n const [selectedIndex, setSelectedIndex] = useState<number | null>(null);\n const [isFullscreen, setIsFullscreen] = useState(false);\n\n // Memoize default actions to prevent recreation on each render\n const defaultActions = useMemo(() => createDefaultActions(), []);\n\n // Memoize combined action buttons\n const allActionButtons = useMemo(\n () => [...defaultActions, ...actionButtons],\n [defaultActions, actionButtons]\n );\n\n // Memoize event handlers to prevent recreation on each render\n const openFullscreen = useCallback((index: number) => {\n setSelectedIndex(index);\n setIsFullscreen(true);\n }, []);\n\n const closeFullscreen = useCallback(() => {\n setIsFullscreen(false);\n setSelectedIndex(null);\n }, []);\n\n const goToPrevious = useCallback(() => {\n if (selectedIndex !== null && selectedIndex > 0) {\n setSelectedIndex(selectedIndex - 1);\n }\n }, [selectedIndex]);\n\n const goToNext = useCallback(() => {\n if (selectedIndex !== null && selectedIndex < images.length - 1) {\n setSelectedIndex(selectedIndex + 1);\n }\n }, [selectedIndex, images.length]);\n\n // Keyboard navigation\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (!isFullscreen) return;\n\n switch (e.key) {\n case 'Escape':\n closeFullscreen();\n break;\n case 'ArrowLeft':\n e.preventDefault();\n goToPrevious();\n break;\n case 'ArrowRight':\n e.preventDefault();\n goToNext();\n break;\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isFullscreen, goToPrevious, goToNext, closeFullscreen]);\n\n // Prevent body scroll when fullscreen is open\n useEffect(() => {\n if (isFullscreen) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = 'unset';\n }\n\n return () => {\n document.body.style.overflow = 'unset';\n };\n }, [isFullscreen]);\n\n // Memoize currentImage to prevent unnecessary calculations\n const currentImage = useMemo(\n () => (selectedIndex !== null ? images[selectedIndex] : null),\n [selectedIndex, images]\n );\n\n // Memoized FullscreenView component\n const FullscreenView = useMemo(() => {\n if (!isFullscreen || !currentImage) return null;\n\n return (\n <div className=\"bg-opacity-95 bg-bg fixed inset-0 z-50 flex flex-col items-center justify-center\">\n <div\n className={\n 'absolute top-0 flex w-full items-start justify-between p-3'\n }\n >\n <div>\n {currentImage.title && (\n <h2 className=\"text-body-lg-semi-bold\">{currentImage.title}</h2>\n )}\n </div>\n\n {/* Top Bar with Actions and Close */}\n <div className=\"flex items-center gap-4 py-1\">\n {/* Action Buttons */}\n {allActionButtons.map((action, index) => (\n <button\n key={index}\n onClick={() => action.onClick(currentImage)}\n className=\"cursor-pointer\"\n title={action.label}\n >\n {action.icon}\n </button>\n ))}\n\n {/* Close Button */}\n <button\n onClick={closeFullscreen}\n className=\"cursor-pointer\"\n title=\"Close (Esc)\"\n >\n <X size={20} />\n </button>\n </div>\n </div>\n\n {/* Left Navigation */}\n {(selectedIndex || 0) > 0 && (\n <button\n onClick={goToPrevious}\n className=\"bg-opacity-50 hover:bg-opacity-70 bg-bg text-secondary absolute top-1/2 left-2 z-50 -translate-y-1/2 rounded-full p-3 transition-all\"\n title=\"Previous (←)\"\n >\n <ChevronLeft size={24} />\n </button>\n )}\n\n {/* Right Navigation */}\n {(selectedIndex || 0) < images.length - 1 && (\n <button\n onClick={goToNext}\n className=\"bg-opacity-0 hover:bg-opacity-100 text-secondary bg-bg absolute top-1/2 right-2 z-50 -translate-y-1/2 rounded-full p-3 transition-all\"\n title=\"Next (→)\"\n >\n <ChevronRight size={24} />\n </button>\n )}\n\n <div className=\"flex max-h-full max-w-full items-center justify-center overflow-hidden p-8\">\n <FullscreenImage\n src={currentImage.src}\n alt={currentImage.alt || `Image ${selectedIndex}`}\n fallbackImage={fallbackImage}\n />\n </div>\n\n <div className={'bg-bg absolute bottom-0 w-full'}>\n <div className=\"flex gap-2 overflow-x-auto p-3\">\n {images.map((image, index) => {\n return (\n <div\n key={image.id}\n className={cn(\n `hover:border-item-primary h-16 min-w-16 shrink-0 cursor-pointer rounded border-3 border-transparent transition-all`,\n index == selectedIndex && 'border-item-primary'\n )}\n onClick={() => setSelectedIndex(index)}\n >\n <img\n src={image.thumbnail || image.src}\n alt={image.alt || `Thumbnail ${index + 1}`}\n className=\"size-full object-cover\"\n onError={(e) => {\n if (fallbackImage) {\n e.currentTarget.src = fallbackImage;\n }\n }}\n />\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n }, [\n isFullscreen,\n fallbackImage,\n currentImage,\n allActionButtons,\n closeFullscreen,\n selectedIndex,\n goToPrevious,\n images,\n goToNext,\n ]);\n\n return (\n <div className={'w-full'}>\n <div\n {...props}\n className={cn(\n 'grid grid-cols-1 gap-4 lg:grid-cols-2 xl:grid-cols-3 2xl:grid-cols-4',\n className\n )}\n >\n {images.map((image, index) => (\n <div className={'relative'} key={image.id}>\n <Thumbnail\n {...thumbnailProps}\n image={image}\n index={index}\n onClick={openFullscreen}\n fallbackImage={fallbackImage}\n />\n {hasInfo && image.title && (\n <div\n className={\n 'bg-bg/70 absolute bottom-0 flex min-h-10 w-full items-center justify-center text-center'\n }\n >\n {image.title}\n </div>\n )}\n </div>\n ))}\n </div>\n\n {FullscreenView}\n </div>\n );\n};\n\n/**\n * Memoized MyGallery component.\n */\nexport const MyGallery = memo(MyGalleryComponent);\n"],"names":["a","b","this","c","d","g","e","f","global","h","i","j","k","l","m","module","createDefaultActions","jsx","Download","image","saveAs","FullscreenImage","memo","src","alt","fallbackImage","imgError","setImgError","useState","Thumbnail","index","onClick","className","props","handleError","createElement","cn","MyGalleryComponent","images","thumbnailProps","actionButtons","hasInfo","selectedIndex","setSelectedIndex","isFullscreen","setIsFullscreen","defaultActions","useMemo","allActionButtons","openFullscreen","useCallback","closeFullscreen","goToPrevious","goToNext","useEffect","handleKeyDown","currentImage","FullscreenView","jsxs","action","X","ChevronLeft","ChevronRight","MyGallery"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("react/jsx-runtime"),x=require("react-start-kit/dialog"),m=require("react-start-kit/utils"),d=({header:t,footer:e,trigger:o,children:n,size:l="lg",className:r,triggerProps:i,contentProps:s,...c})=>a.jsxs(x.Dialog,{...c,children:[o&&a.jsx(x.DialogTrigger,{asChild:!0,...i,children:o}),a.jsxs(x.DialogContent,{className:m.cn("data-[state=open]:animate-contentShowTop top-4 bottom-auto max-h-[calc(100vh-2rem)] max-w-lg translate-y-0 overflow-y-auto",l==="xl"&&"max-w-xl",l==="2xl"&&"max-w-2xl",l==="3xl"&&"max-w-3xl",l==="4xl"&&"max-w-5xl",l==="5xl"&&"max-w-5xl",l==="6xl"&&"max-w-6xl",l==="7xl"&&"max-w-7xl",l==="full"&&"max-w-[95%]",r),...s,children:[a.jsxs(x.DialogHeader,{children:[a.jsx(x.DialogTitle,{className:"mb-0",children:t}),a.jsx(x.DialogDescription,{className:"hidden"})]}),n,e&&a.jsx(x.DialogFooter,{children:e})]})]});exports.MyModal=d;
|
|
2
|
+
//# sourceMappingURL=index.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../../../src/components/modal/MyModal.tsx"],"sourcesContent":["import type { DialogProps } from '@radix-ui/react-dialog';\nimport type { ReactNode } from 'react';\nimport {\n Dialog,\n type DialogContainerProps,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from 'react-start-kit/dialog';\nimport { cn } from 'react-start-kit/utils';\n\n/**\n * Props for the MyModal component.\n * Extends Radix UI's DialogProps.\n *\n * @typedef {Object} MyModalProps\n * @property {ReactNode} [header] - The content to be displayed in the modal header.\n * @property {ReactNode} [trigger] - The element that triggers the modal when clicked.\n * @property {ReactNode} [children] - The main content of the modal.\n * @property {ReactNode} [footer] - The content to be displayed in the modal footer.\n * @property {string} [className] - Additional CSS classes for the modal content.\n * @property {'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl' | '6xl' | '7xl' | 'full'} [size='lg'] - The maximum width size of the modal.\n * @property {DialogContainerProps['triggerProps']} [triggerProps] - Props passed to the DialogTrigger component.\n * @property {DialogContainerProps['contentProps']} [contentProps] - Props passed to the DialogContent component.\n */\nexport type MyModalProps = DialogProps &\n DialogContainerProps & {\n header?: ReactNode;\n trigger?: ReactNode;\n children?: ReactNode;\n footer?: ReactNode;\n className?: string;\n size?: 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl' | '6xl' | '7xl' | 'full';\n };\n\n/**\n * A reusable modal component that wraps the Dialog component from react-start-kit.\n * It provides a structured layout with a header, scrollable content area, and optional footer.\n *\n * @component\n * @param {ReactNode} props.header - The content to be displayed in the modal header\n * @param {ReactNode} props.footer - The content to be displayed in the modal footer\n * @param {ReactNode} props.trigger - The element that triggers the modal when clicked\n * @param {ReactNode} props.children - The main content of the modal\n * @param {'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl' | '6xl' | '7xl' | 'full'} props.size - The maximum width size of the modal (default: 'lg')\n * @param {string} props.className - Additional CSS classes for the modal content\n * @param {DialogContainerProps['triggerProps']} props.triggerProps - Props passed to the DialogTrigger component\n * @param {DialogContainerProps['contentProps']} props.contentProps - Props passed to the DialogContent component\n * @returns {JSX.Element} A modal dialog component\n *\n * @example\n * <MyModal\n * header=\"User Settings\"\n * trigger={<button>Open Settings</button>}\n * footer={<button onClick={save}>Save</button>}\n * >\n * <p>Settings content goes here...</p>\n * </MyModal>\n */\nexport const MyModal = ({\n header,\n footer,\n trigger,\n children,\n size = 'lg',\n className,\n triggerProps,\n contentProps,\n ...props\n}: MyModalProps) => {\n return (\n <Dialog {...props}>\n {trigger && (\n <DialogTrigger asChild {...triggerProps}>\n {trigger}\n </DialogTrigger>\n )}\n <DialogContent\n className={cn(\n `data-[state=open]:animate-contentShowTop top-4 bottom-auto max-h-[calc(100vh-2rem)] max-w-lg translate-y-0 overflow-y-auto`,\n size === 'xl' && 'max-w-xl',\n size === '2xl' && 'max-w-2xl',\n size === '3xl' && 'max-w-3xl',\n size === '4xl' && 'max-w-5xl',\n size === '5xl' && 'max-w-5xl',\n size === '6xl' && 'max-w-6xl',\n size === '7xl' && 'max-w-7xl',\n size === 'full' && 'max-w-[95%]',\n className\n )}\n {...contentProps}\n >\n <DialogHeader>\n <DialogTitle className={'mb-0'}>{header}</DialogTitle>\n <DialogDescription className={'hidden'} />\n </DialogHeader>\n {children}\n {footer && <DialogFooter>{footer}</DialogFooter>}\n </DialogContent>\n </Dialog>\n );\n};\n"],"names":["MyModal","header","footer","trigger","children","size","className","triggerProps","contentProps","props","jsxs","Dialog","DialogTrigger","DialogContent","cn","DialogHeader","jsx","DialogTitle","DialogDescription","DialogFooter"],"mappings":"4LA8DaA,EAAU,CAAC,CACtB,OAAAC,EACA,OAAAC,EACA,QAAAC,EACA,SAAAC,EACA,KAAAC,EAAO,KACP,UAAAC,EACA,aAAAC,EACA,aAAAC,EACA,GAAGC,CACL,IAEIC,EAAAA,KAACC,EAAAA,OAAA,CAAQ,GAAGF,EACT,SAAA,CAAAN,SACES,EAAAA,cAAA,CAAc,QAAO,GAAE,GAAGL,EACxB,SAAAJ,EACH,EAEFO,EAAAA,KAACG,EAAAA,cAAA,CACC,UAAWC,EAAAA,GACT,6HACAT,IAAS,MAAQ,WACjBA,IAAS,OAAS,YAClBA,IAAS,OAAS,YAClBA,IAAS,OAAS,YAClBA,IAAS,OAAS,YAClBA,IAAS,OAAS,YAClBA,IAAS,OAAS,YAClBA,IAAS,QAAU,cACnBC,CAAA,EAED,GAAGE,EAEJ,SAAA,CAAAE,OAACK,EAAAA,aAAA,CACC,SAAA,CAAAC,EAAAA,IAACC,EAAAA,YAAA,CAAY,UAAW,OAAS,SAAAhB,EAAO,EACxCe,EAAAA,IAACE,EAAAA,kBAAA,CAAkB,UAAW,QAAA,CAAU,CAAA,EAC1C,EACCd,EACAF,GAAUc,EAAAA,IAACG,EAAAA,aAAA,CAAc,SAAAjB,CAAA,CAAO,CAAA,CAAA,CAAA,CACnC,EACF"}
|