dgz-ui-shared 1.2.35 → 1.2.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/Actions-Du8iQ3WR.es.js.map +1 -1
- package/dist/chunks/Actions-bpMDyl5M.cjs.js.map +1 -1
- package/dist/chunks/Empty-BReVQKje.es.js.map +1 -1
- package/dist/chunks/Empty-BYOOFAab.cjs.js.map +1 -1
- package/dist/chunks/ExportData-CwotVgye.es.js.map +1 -1
- package/dist/chunks/ExportData-DJE0jOHc.cjs.js.map +1 -1
- package/dist/chunks/Keyboard-CJVAJWdO.es.js.map +1 -1
- package/dist/chunks/Keyboard-kyPAAQWP.cjs.js.map +1 -1
- package/dist/chunks/Loader-D_jX_Wgx.cjs.js.map +1 -1
- package/dist/chunks/Loader-zvzAi0F6.es.js.map +1 -1
- package/dist/chunks/MyInput-ByJ5vTAN.es.js +280 -0
- package/dist/chunks/MyInput-ByJ5vTAN.es.js.map +1 -0
- package/dist/chunks/MyInput-mL2G5h2s.cjs.js +2 -0
- package/dist/chunks/MyInput-mL2G5h2s.cjs.js.map +1 -0
- package/dist/chunks/MyPagination-B0czoGZK.es.js.map +1 -1
- package/dist/chunks/MyPagination-CnF3468f.cjs.js.map +1 -1
- package/dist/chunks/{MySelect-5DHBVlKZ.es.js → MySelect-CRXtMlbf.es.js} +16 -16
- package/dist/chunks/MySelect-CRXtMlbf.es.js.map +1 -0
- package/dist/chunks/MySelect-CmLxmNJz.cjs.js +2 -0
- package/dist/chunks/MySelect-CmLxmNJz.cjs.js.map +1 -0
- package/dist/chunks/{PasswordConfirm-Uc4pncGw.cjs.js → PasswordConfirm-d5-QdLM5.cjs.js} +2 -2
- package/dist/chunks/PasswordConfirm-d5-QdLM5.cjs.js.map +1 -0
- package/dist/chunks/{PasswordConfirm-Dj97U7O9.es.js → PasswordConfirm-luxvE9Ug.es.js} +2 -2
- package/dist/chunks/PasswordConfirm-luxvE9Ug.es.js.map +1 -0
- package/dist/chunks/{Search-BtiKC-dt.es.js → Search-DunDXQgP.es.js} +21 -22
- package/dist/chunks/Search-DunDXQgP.es.js.map +1 -0
- package/dist/chunks/Search-kbkeTeSI.cjs.js +2 -0
- package/dist/chunks/Search-kbkeTeSI.cjs.js.map +1 -0
- package/dist/chunks/SortOrder-81BrXp3i.cjs.js.map +1 -1
- package/dist/chunks/SortOrder-CwuehjY1.es.js.map +1 -1
- package/dist/chunks/Spin-DUK1prd9.cjs.js.map +1 -1
- package/dist/chunks/Spin-DtW_edOq.es.js.map +1 -1
- package/dist/chunks/ThemeMode-BO6tit_Z.cjs.js.map +1 -1
- package/dist/chunks/ThemeMode-CqURAYDL.es.js.map +1 -1
- 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/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-8RrwFw05.es.js +263 -0
- package/dist/chunks/useSortable-8RrwFw05.es.js.map +1 -0
- package/dist/chunks/useSortable-D9RgGUd0.cjs.js +2 -0
- package/dist/chunks/useSortable-D9RgGUd0.cjs.js.map +1 -0
- package/dist/chunks/useTheme-hjEZ-FC3.cjs.js.map +1 -1
- package/dist/chunks/useTheme-iKF3BEvj.es.js.map +1 -1
- package/dist/components/confirm/index.cjs.js +1 -1
- package/dist/components/confirm/index.es.js +1 -1
- package/dist/components/datatable/index.cjs.js +1 -1
- package/dist/components/datatable/index.cjs.js.map +1 -1
- package/dist/components/datatable/index.es.js +213 -212
- package/dist/components/datatable/index.es.js.map +1 -1
- package/dist/components/filters/index.cjs.js +1 -1
- package/dist/components/filters/index.cjs.js.map +1 -1
- package/dist/components/filters/index.es.js +6 -6
- package/dist/components/filters/index.es.js.map +1 -1
- package/dist/components/form/index.cjs.js +1 -1
- package/dist/components/form/index.cjs.js.map +1 -1
- package/dist/components/form/index.es.js +73 -73
- package/dist/components/form/index.es.js.map +1 -1
- package/dist/components/gallery/index.cjs.js +1 -1
- package/dist/components/gallery/index.cjs.js.map +1 -1
- package/dist/components/gallery/index.es.js +33 -33
- package/dist/components/gallery/index.es.js.map +1 -1
- package/dist/components/modal/index.cjs.js.map +1 -1
- package/dist/components/modal/index.es.js.map +1 -1
- package/dist/components/scroll/index.cjs.js.map +1 -1
- package/dist/components/scroll/index.es.js.map +1 -1
- package/dist/components/theme/index.cjs.js.map +1 -1
- package/dist/components/theme/index.es.js.map +1 -1
- package/dist/components/tooltip/index.cjs.js.map +1 -1
- package/dist/components/tooltip/index.es.js.map +1 -1
- package/dist/hooks/index.cjs.js +5 -5
- package/dist/hooks/index.cjs.js.map +1 -1
- package/dist/hooks/index.es.js +126 -126
- package/dist/hooks/index.es.js.map +1 -1
- package/dist/providers/index.cjs.js.map +1 -1
- package/dist/providers/index.es.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/components/actions/Actions.d.ts +5 -2
- package/dist/types/components/actions/Actions.d.ts.map +1 -1
- package/dist/types/components/confirm/Confirm.d.ts +7 -2
- package/dist/types/components/confirm/Confirm.d.ts.map +1 -1
- package/dist/types/components/confirm/PasswordConfirm.d.ts +7 -1
- package/dist/types/components/confirm/PasswordConfirm.d.ts.map +1 -1
- package/dist/types/components/datatable/DataTable.d.ts +30 -30
- package/dist/types/components/datatable/DataTable.d.ts.map +1 -1
- package/dist/types/components/datatable/MyTable.d.ts +13 -13
- package/dist/types/components/empty/Empty.d.ts +1 -1
- package/dist/types/components/export/ExportData.d.ts +7 -0
- package/dist/types/components/export/ExportData.d.ts.map +1 -1
- package/dist/types/components/filters/AppliedFilters.d.ts +7 -7
- package/dist/types/components/filters/AppliedFilters.d.ts.map +1 -1
- package/dist/types/components/filters/FilterWrapper.d.ts +1 -0
- package/dist/types/components/filters/FilterWrapper.d.ts.map +1 -1
- package/dist/types/components/filters/Search.d.ts +1 -0
- package/dist/types/components/filters/Search.d.ts.map +1 -1
- package/dist/types/components/filters/SearchWithCtrl.d.ts +1 -0
- package/dist/types/components/filters/SearchWithCtrl.d.ts.map +1 -1
- package/dist/types/components/form/MyCheckbox.d.ts +1 -1
- package/dist/types/components/form/MyDatePicker.d.ts +1 -1
- package/dist/types/components/form/MyDateRangePicker.d.ts +1 -1
- package/dist/types/components/form/MyHtmlEditor.d.ts +1 -1
- package/dist/types/components/form/MyInput.d.ts +1 -0
- package/dist/types/components/form/MyInput.d.ts.map +1 -1
- package/dist/types/components/form/MyMaskInput.d.ts +1 -1
- package/dist/types/components/form/MyRadio.d.ts +1 -1
- package/dist/types/components/form/MySelect.d.ts +1 -1
- package/dist/types/components/form/MyShadcnSelect.d.ts +1 -1
- package/dist/types/components/form/MyTextarea.d.ts +1 -1
- package/dist/types/components/form/MyTimePicker.d.ts +1 -1
- package/dist/types/components/gallery/MyGallery.d.ts.map +1 -1
- package/dist/types/components/loader/Loader.d.ts +1 -1
- package/dist/types/components/loader/Spin.d.ts +1 -1
- package/dist/types/components/modal/MyModal.d.ts +9 -9
- package/dist/types/components/pagination/MyLimitSelect.d.ts +6 -3
- package/dist/types/components/pagination/MyLimitSelect.d.ts.map +1 -1
- package/dist/types/components/scroll/ScrollArea.d.ts +1 -1
- package/dist/types/components/theme/theme-toggle.d.ts +1 -1
- package/dist/types/components/tooltip/MyTooltip.d.ts +2 -1
- package/dist/types/components/tooltip/MyTooltip.d.ts.map +1 -1
- package/dist/types/enums/Keyboard.d.ts +1 -0
- package/dist/types/enums/Keyboard.d.ts.map +1 -1
- package/dist/types/enums/SortOrder.d.ts +2 -0
- package/dist/types/enums/SortOrder.d.ts.map +1 -1
- package/dist/types/enums/ThemeMode.d.ts +3 -0
- package/dist/types/enums/ThemeMode.d.ts.map +1 -1
- package/dist/types/hooks/useColumns.d.ts +7 -9
- package/dist/types/hooks/useColumns.d.ts.map +1 -1
- package/dist/types/hooks/useConfirm.d.ts +3 -1
- package/dist/types/hooks/useConfirm.d.ts.map +1 -1
- package/dist/types/hooks/useDataTable.d.ts +9 -10
- package/dist/types/hooks/useDataTable.d.ts.map +1 -1
- package/dist/types/hooks/useDocumentTitle.d.ts +1 -0
- package/dist/types/hooks/useDocumentTitle.d.ts.map +1 -1
- package/dist/types/hooks/useFilter.d.ts +13 -6
- package/dist/types/hooks/useFilter.d.ts.map +1 -1
- package/dist/types/hooks/useMediaQuerySizes.d.ts +8 -1
- package/dist/types/hooks/useMediaQuerySizes.d.ts.map +1 -1
- package/dist/types/hooks/useSortable.d.ts +10 -10
- package/dist/types/hooks/useSortable.d.ts.map +1 -1
- package/dist/types/hooks/useTheme.d.ts +5 -0
- package/dist/types/hooks/useTheme.d.ts.map +1 -1
- package/dist/types/providers/ThemeProvider.d.ts +1 -0
- package/dist/types/providers/ThemeProvider.d.ts.map +1 -1
- 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/translation-args.type.d.ts +7 -0
- package/dist/types/types/translation-args.type.d.ts.map +1 -1
- 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/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 +15 -5
- package/dist/chunks/MyInput-5ir4eN2m.cjs.js +0 -2
- package/dist/chunks/MyInput-5ir4eN2m.cjs.js.map +0 -1
- package/dist/chunks/MyInput-Cb0FlVxQ.es.js +0 -53
- package/dist/chunks/MyInput-Cb0FlVxQ.es.js.map +0 -1
- package/dist/chunks/MySelect-5DHBVlKZ.es.js.map +0 -1
- package/dist/chunks/MySelect-Dl3jKf5s.cjs.js +0 -2
- package/dist/chunks/MySelect-Dl3jKf5s.cjs.js.map +0 -1
- package/dist/chunks/PasswordConfirm-Dj97U7O9.es.js.map +0 -1
- package/dist/chunks/PasswordConfirm-Uc4pncGw.cjs.js.map +0 -1
- package/dist/chunks/Search-BtiKC-dt.es.js.map +0 -1
- package/dist/chunks/Search-DfRA43qp.cjs.js +0 -2
- package/dist/chunks/Search-DfRA43qp.cjs.js.map +0 -1
- package/dist/chunks/lodash-BjH0kD7j.cjs.js +0 -28
- package/dist/chunks/lodash-BjH0kD7j.cjs.js.map +0 -1
- package/dist/chunks/lodash-CRDOWzbs.es.js +0 -3701
- package/dist/chunks/lodash-CRDOWzbs.es.js.map +0 -1
- package/dist/chunks/useFilter-C_K_3fQu.es.js +0 -18
- package/dist/chunks/useFilter-C_K_3fQu.es.js.map +0 -1
- package/dist/chunks/useFilter-CsOF1_hM.cjs.js +0 -2
- package/dist/chunks/useFilter-CsOF1_hM.cjs.js.map +0 -1
- package/dist/chunks/useSortable-B3LF1tg8.cjs.js +0 -2
- package/dist/chunks/useSortable-B3LF1tg8.cjs.js.map +0 -1
- package/dist/chunks/useSortable-BXNk8Wth.es.js +0 -135
- package/dist/chunks/useSortable-BXNk8Wth.es.js.map +0 -1
- package/dist/types/stories/Button.d.ts +0 -15
- package/dist/types/stories/Button.d.ts.map +0 -1
- package/dist/types/stories/Button.stories.d.ts +0 -24
- package/dist/types/stories/Button.stories.d.ts.map +0 -1
- package/dist/types/stories/Header.d.ts +0 -12
- package/dist/types/stories/Header.d.ts.map +0 -1
- package/dist/types/stories/Header.stories.d.ts +0 -19
- package/dist/types/stories/Header.stories.d.ts.map +0 -1
- package/dist/types/stories/Page.d.ts +0 -3
- package/dist/types/stories/Page.d.ts.map +0 -1
- package/dist/types/stories/Page.stories.d.ts +0 -13
- package/dist/types/stories/Page.stories.d.ts.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react/jsx-runtime"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react/jsx-runtime"),c=require("react"),S=require("dgz-ui/utils"),E=require("../../chunks/_commonjsHelpers-DKOUU3wS.cjs.js"),k=require("lucide-react");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
2
|
//# sourceMappingURL=index.cjs.js.map
|
|
@@ -1 +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 { cn } from 'dgz-ui/utils';\nimport { saveAs } from 'file-saver';\nimport { isNumber } from 'lodash';\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';\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// Default action buttons moved outside component to prevent recreation on each render\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// FullscreenImage component to handle image loading errors\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// Thumbnail component to optimize rendering of grid items\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 */\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 {isNumber(selectedIndex) && selectedIndex > 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 {isNumber(selectedIndex) && selectedIndex < 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","isNumber","ChevronLeft","ChevronRight","MyGallery"],"mappings":"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","x_google_ignoreList":[0]}
|
|
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 { cn } from 'dgz-ui/utils';\nimport { 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';\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]}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { jsxs as g, jsx as l } from "react/jsx-runtime";
|
|
2
|
-
import { memo as R, useState as L, useMemo as
|
|
2
|
+
import { memo as R, useState as L, useMemo as j, useCallback as N, useEffect as C, createElement as M } from "react";
|
|
3
3
|
import { cn as F } from "dgz-ui/utils";
|
|
4
|
-
import { c as k
|
|
5
|
-
import { X as
|
|
6
|
-
var A = { exports: {} },
|
|
7
|
-
function
|
|
8
|
-
return
|
|
4
|
+
import { c as k } from "../../chunks/_commonjsHelpers-DaMA6jEr.es.js";
|
|
5
|
+
import { X as D, ChevronLeft as O, ChevronRight as U, Download as z } from "lucide-react";
|
|
6
|
+
var A = { exports: {} }, _ = A.exports, S;
|
|
7
|
+
function B() {
|
|
8
|
+
return S || (S = 1, (function(s, w) {
|
|
9
9
|
(function(p, i) {
|
|
10
10
|
i();
|
|
11
|
-
})(
|
|
11
|
+
})(_, function() {
|
|
12
12
|
function p(e, t) {
|
|
13
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
14
|
}
|
|
@@ -74,16 +74,16 @@ function H() {
|
|
|
74
74
|
});
|
|
75
75
|
})(A)), A.exports;
|
|
76
76
|
}
|
|
77
|
-
var
|
|
78
|
-
const
|
|
77
|
+
var H = B();
|
|
78
|
+
const $ = () => [
|
|
79
79
|
{
|
|
80
|
-
icon: /* @__PURE__ */ l(
|
|
80
|
+
icon: /* @__PURE__ */ l(z, { size: 20 }),
|
|
81
81
|
onClick: (s) => {
|
|
82
|
-
|
|
82
|
+
H.saveAs(s.src, s.title);
|
|
83
83
|
},
|
|
84
84
|
label: "Download"
|
|
85
85
|
}
|
|
86
|
-
],
|
|
86
|
+
], q = R(
|
|
87
87
|
({
|
|
88
88
|
src: s,
|
|
89
89
|
alt: w,
|
|
@@ -102,7 +102,7 @@ const q = () => [
|
|
|
102
102
|
}
|
|
103
103
|
);
|
|
104
104
|
}
|
|
105
|
-
),
|
|
105
|
+
), G = R(
|
|
106
106
|
({
|
|
107
107
|
image: s,
|
|
108
108
|
index: w,
|
|
@@ -114,7 +114,7 @@ const q = () => [
|
|
|
114
114
|
const [c, r] = L(!1), d = () => {
|
|
115
115
|
r(!0);
|
|
116
116
|
};
|
|
117
|
-
return /* @__PURE__ */
|
|
117
|
+
return /* @__PURE__ */ M(
|
|
118
118
|
"div",
|
|
119
119
|
{
|
|
120
120
|
...v,
|
|
@@ -136,7 +136,7 @@ const q = () => [
|
|
|
136
136
|
)
|
|
137
137
|
);
|
|
138
138
|
}
|
|
139
|
-
),
|
|
139
|
+
), I = ({
|
|
140
140
|
images: s,
|
|
141
141
|
thumbnailProps: w,
|
|
142
142
|
actionButtons: p = [],
|
|
@@ -145,16 +145,16 @@ const q = () => [
|
|
|
145
145
|
hasInfo: v,
|
|
146
146
|
...c
|
|
147
147
|
}) => {
|
|
148
|
-
const [r, d] = L(null), [e, t] = L(!1), u =
|
|
148
|
+
const [r, d] = L(null), [e, t] = L(!1), u = j(() => $(), []), o = j(
|
|
149
149
|
() => [...u, ...p],
|
|
150
150
|
[u, p]
|
|
151
|
-
), a =
|
|
151
|
+
), a = N((n) => {
|
|
152
152
|
d(n), t(!0);
|
|
153
|
-
}, []), x =
|
|
153
|
+
}, []), x = N(() => {
|
|
154
154
|
t(!1), d(null);
|
|
155
|
-
}, []), y =
|
|
155
|
+
}, []), y = N(() => {
|
|
156
156
|
r !== null && r > 0 && d(r - 1);
|
|
157
|
-
}, [r]), b =
|
|
157
|
+
}, [r]), b = N(() => {
|
|
158
158
|
r !== null && r < s.length - 1 && d(r + 1);
|
|
159
159
|
}, [r, s.length]);
|
|
160
160
|
C(() => {
|
|
@@ -176,10 +176,10 @@ const q = () => [
|
|
|
176
176
|
}, [e, y, b, x]), C(() => (e ? document.body.style.overflow = "hidden" : document.body.style.overflow = "unset", () => {
|
|
177
177
|
document.body.style.overflow = "unset";
|
|
178
178
|
}), [e]);
|
|
179
|
-
const m =
|
|
179
|
+
const m = j(
|
|
180
180
|
() => r !== null ? s[r] : null,
|
|
181
181
|
[r, s]
|
|
182
|
-
), E =
|
|
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
183
|
/* @__PURE__ */ g(
|
|
184
184
|
"div",
|
|
185
185
|
{
|
|
@@ -203,33 +203,33 @@ const q = () => [
|
|
|
203
203
|
onClick: x,
|
|
204
204
|
className: "cursor-pointer",
|
|
205
205
|
title: "Close (Esc)",
|
|
206
|
-
children: /* @__PURE__ */ l(
|
|
206
|
+
children: /* @__PURE__ */ l(D, { size: 20 })
|
|
207
207
|
}
|
|
208
208
|
)
|
|
209
209
|
] })
|
|
210
210
|
]
|
|
211
211
|
}
|
|
212
212
|
),
|
|
213
|
-
|
|
213
|
+
(r || 0) > 0 && /* @__PURE__ */ l(
|
|
214
214
|
"button",
|
|
215
215
|
{
|
|
216
216
|
onClick: y,
|
|
217
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
218
|
title: "Previous (←)",
|
|
219
|
-
children: /* @__PURE__ */ l(
|
|
219
|
+
children: /* @__PURE__ */ l(O, { size: 24 })
|
|
220
220
|
}
|
|
221
221
|
),
|
|
222
|
-
|
|
222
|
+
(r || 0) < s.length - 1 && /* @__PURE__ */ l(
|
|
223
223
|
"button",
|
|
224
224
|
{
|
|
225
225
|
onClick: b,
|
|
226
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
227
|
title: "Next (→)",
|
|
228
|
-
children: /* @__PURE__ */ l(
|
|
228
|
+
children: /* @__PURE__ */ l(U, { size: 24 })
|
|
229
229
|
}
|
|
230
230
|
),
|
|
231
231
|
/* @__PURE__ */ l("div", { className: "flex max-h-full max-w-full items-center justify-center overflow-hidden p-8", children: /* @__PURE__ */ l(
|
|
232
|
-
|
|
232
|
+
q,
|
|
233
233
|
{
|
|
234
234
|
src: m.src,
|
|
235
235
|
alt: m.alt || `Image ${r}`,
|
|
@@ -250,8 +250,8 @@ const q = () => [
|
|
|
250
250
|
src: n.thumbnail || n.src,
|
|
251
251
|
alt: n.alt || `Thumbnail ${f + 1}`,
|
|
252
252
|
className: "size-full object-cover",
|
|
253
|
-
onError: (
|
|
254
|
-
i && (
|
|
253
|
+
onError: (T) => {
|
|
254
|
+
i && (T.currentTarget.src = i);
|
|
255
255
|
}
|
|
256
256
|
}
|
|
257
257
|
)
|
|
@@ -280,7 +280,7 @@ const q = () => [
|
|
|
280
280
|
),
|
|
281
281
|
children: s.map((n, f) => /* @__PURE__ */ g("div", { className: "relative", children: [
|
|
282
282
|
/* @__PURE__ */ l(
|
|
283
|
-
|
|
283
|
+
G,
|
|
284
284
|
{
|
|
285
285
|
...w,
|
|
286
286
|
image: n,
|
|
@@ -301,8 +301,8 @@ const q = () => [
|
|
|
301
301
|
),
|
|
302
302
|
E
|
|
303
303
|
] });
|
|
304
|
-
},
|
|
304
|
+
}, J = R(I);
|
|
305
305
|
export {
|
|
306
|
-
|
|
306
|
+
J as MyGallery
|
|
307
307
|
};
|
|
308
308
|
//# sourceMappingURL=index.es.js.map
|
|
@@ -1 +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 { cn } from 'dgz-ui/utils';\nimport { saveAs } from 'file-saver';\nimport { isNumber } from 'lodash';\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';\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// Default action buttons moved outside component to prevent recreation on each render\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// FullscreenImage component to handle image loading errors\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// Thumbnail component to optimize rendering of grid items\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 */\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 {isNumber(selectedIndex) && selectedIndex > 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 {isNumber(selectedIndex) && selectedIndex < 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","isNumber","ChevronLeft","ChevronRight","MyGallery"],"mappings":"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","x_google_ignoreList":[0]}
|
|
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 { cn } from 'dgz-ui/utils';\nimport { 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';\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]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../../../src/components/modal/MyModal.tsx"],"sourcesContent":["import type { DialogProps } from '@radix-ui/react-dialog';\nimport {\n Dialog,\n type DialogContainerProps,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from 'dgz-ui/dialog';\nimport { cn } from 'dgz-ui/utils';\nimport type { ReactNode } from 'react';\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 dgz-ui.\n * It provides a structured layout with a header, scrollable content area, and optional footer.\n *\n * @component\n * @param header\n * @param footer\n * @param trigger\n * @param children\n * @param size\n * @param className\n * @param triggerProps
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../../../src/components/modal/MyModal.tsx"],"sourcesContent":["import type { DialogProps } from '@radix-ui/react-dialog';\nimport {\n Dialog,\n type DialogContainerProps,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from 'dgz-ui/dialog';\nimport { cn } from 'dgz-ui/utils';\nimport type { ReactNode } from 'react';\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 dgz-ui.\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":"0KA8DaA,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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../../../src/components/modal/MyModal.tsx"],"sourcesContent":["import type { DialogProps } from '@radix-ui/react-dialog';\nimport {\n Dialog,\n type DialogContainerProps,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from 'dgz-ui/dialog';\nimport { cn } from 'dgz-ui/utils';\nimport type { ReactNode } from 'react';\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 dgz-ui.\n * It provides a structured layout with a header, scrollable content area, and optional footer.\n *\n * @component\n * @param header\n * @param footer\n * @param trigger\n * @param children\n * @param size\n * @param className\n * @param triggerProps
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../../../src/components/modal/MyModal.tsx"],"sourcesContent":["import type { DialogProps } from '@radix-ui/react-dialog';\nimport {\n Dialog,\n type DialogContainerProps,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from 'dgz-ui/dialog';\nimport { cn } from 'dgz-ui/utils';\nimport type { ReactNode } from 'react';\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 dgz-ui.\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":";;;AA8DO,MAAMA,IAAU,CAAC;AAAA,EACtB,QAAAC;AAAA,EACA,QAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,WAAAC;AAAA,EACA,cAAAC;AAAA,EACA,cAAAC;AAAA,EACA,GAAGC;AACL,MAEI,gBAAAC,EAACC,GAAA,EAAQ,GAAGF,GACT,UAAA;AAAA,EAAAN,uBACES,GAAA,EAAc,SAAO,IAAE,GAAGL,GACxB,UAAAJ,GACH;AAAA,EAEF,gBAAAO;AAAA,IAACG;AAAA,IAAA;AAAA,MACC,WAAWC;AAAA,QACT;AAAA,QACAT,MAAS,QAAQ;AAAA,QACjBA,MAAS,SAAS;AAAA,QAClBA,MAAS,SAAS;AAAA,QAClBA,MAAS,SAAS;AAAA,QAClBA,MAAS,SAAS;AAAA,QAClBA,MAAS,SAAS;AAAA,QAClBA,MAAS,SAAS;AAAA,QAClBA,MAAS,UAAU;AAAA,QACnBC;AAAA,MAAA;AAAA,MAED,GAAGE;AAAA,MAEJ,UAAA;AAAA,QAAA,gBAAAE,EAACK,GAAA,EACC,UAAA;AAAA,UAAA,gBAAAC,EAACC,GAAA,EAAY,WAAW,QAAS,UAAAhB,GAAO;AAAA,UACxC,gBAAAe,EAACE,GAAA,EAAkB,WAAW,SAAA,CAAU;AAAA,QAAA,GAC1C;AAAA,QACCd;AAAA,QACAF,KAAU,gBAAAc,EAACG,GAAA,EAAc,UAAAjB,EAAA,CAAO;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AACnC,GACF;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../../../src/components/scroll/ScrollArea.tsx"],"sourcesContent":["import { cn } from 'dgz-ui/utils';\nimport type { ComponentProps } from 'react';\n\n/**\n * ScrollArea is a simple styled scrollable container div.\n *\n * @param props - Native div props.\n * @param className - className extends default scrollbar styles.\n * @returns A scrollable container component.\n */\nexport const ScrollArea = ({ className, ...props }: ComponentProps<'div'>) => {\n return (\n <div\n {...props}\n className={cn(\n 'scrollbar-thin scrollbar-thumb-rounded-full scrollbar-track-rounded-full overflow-auto',\n className\n )}\n />\n );\n};\n"],"names":["ScrollArea","className","props","jsx","cn"],"mappings":"+IAUaA,EAAa,CAAC,CAAE,UAAAC,EAAW,GAAGC,KAEvCC,EAAAA,IAAC,MAAA,CACE,GAAGD,EACJ,UAAWE,EAAAA,GACT,yFACAH,CAAA,CACF,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../../../src/components/scroll/ScrollArea.tsx"],"sourcesContent":["import { cn } from 'dgz-ui/utils';\nimport type { ComponentProps } from 'react';\n\n/**\n * ScrollArea is a simple styled scrollable container div.\n *\n * @param props - Native div props.\n * @param className - className extends default scrollbar styles.\n * @returns {JSX.Element} A scrollable container component.\n */\nexport const ScrollArea = ({ className, ...props }: ComponentProps<'div'>) => {\n return (\n <div\n {...props}\n className={cn(\n 'scrollbar-thin scrollbar-thumb-rounded-full scrollbar-track-rounded-full overflow-auto',\n className\n )}\n />\n );\n};\n"],"names":["ScrollArea","className","props","jsx","cn"],"mappings":"+IAUaA,EAAa,CAAC,CAAE,UAAAC,EAAW,GAAGC,KAEvCC,EAAAA,IAAC,MAAA,CACE,GAAGD,EACJ,UAAWE,EAAAA,GACT,yFACAH,CAAA,CACF,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../../../src/components/scroll/ScrollArea.tsx"],"sourcesContent":["import { cn } from 'dgz-ui/utils';\nimport type { ComponentProps } from 'react';\n\n/**\n * ScrollArea is a simple styled scrollable container div.\n *\n * @param props - Native div props.\n * @param className - className extends default scrollbar styles.\n * @returns A scrollable container component.\n */\nexport const ScrollArea = ({ className, ...props }: ComponentProps<'div'>) => {\n return (\n <div\n {...props}\n className={cn(\n 'scrollbar-thin scrollbar-thumb-rounded-full scrollbar-track-rounded-full overflow-auto',\n className\n )}\n />\n );\n};\n"],"names":["ScrollArea","className","props","jsx","cn"],"mappings":";;AAUO,MAAMA,IAAa,CAAC,EAAE,WAAAC,GAAW,GAAGC,QAEvC,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACE,GAAGD;AAAA,IACJ,WAAWE;AAAA,MACT;AAAA,MACAH;AAAA,IAAA;AAAA,EACF;AAAA;"}
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../../../src/components/scroll/ScrollArea.tsx"],"sourcesContent":["import { cn } from 'dgz-ui/utils';\nimport type { ComponentProps } from 'react';\n\n/**\n * ScrollArea is a simple styled scrollable container div.\n *\n * @param props - Native div props.\n * @param className - className extends default scrollbar styles.\n * @returns {JSX.Element} A scrollable container component.\n */\nexport const ScrollArea = ({ className, ...props }: ComponentProps<'div'>) => {\n return (\n <div\n {...props}\n className={cn(\n 'scrollbar-thin scrollbar-thumb-rounded-full scrollbar-track-rounded-full overflow-auto',\n className\n )}\n />\n );\n};\n"],"names":["ScrollArea","className","props","jsx","cn"],"mappings":";;AAUO,MAAMA,IAAa,CAAC,EAAE,WAAAC,GAAW,GAAGC,QAEvC,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACE,GAAGD;AAAA,IACJ,WAAWE;AAAA,MACT;AAAA,MACAH;AAAA,IAAA;AAAA,EACF;AAAA;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../../../src/components/theme/theme-toggle.tsx"],"sourcesContent":["import { Button } from 'dgz-ui/button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from 'dgz-ui/dropdown';\nimport { Moon, Sun } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { ThemeMode } from '../../enums';\nimport { useTheme } from '../../hooks';\n\n/**\n * Props for the ThemeToggle component.\n */\nexport interface ThemeToggleProps {\n /** Optional className passed to the trigger button. */\n className?: string;\n}\n\n/**\n * ThemeToggle provides a dropdown to switch between Light, Dark, and System themes.\n *\n * @param className - Optional className passed to the trigger button.\n * @returns A dropdown menu to switch themes.\n */\nexport function ThemeToggle({ className }: ThemeToggleProps) {\n const { t } = useTranslation();\n const { setTheme } = useTheme();\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"tertiary\" size=\"icon\" className={className}>\n <Sun className=\"h-[1.2rem] w-[1.2rem] scale-100 rotate-0 transition-all dark:scale-0 dark:-rotate-90\" />\n <Moon className=\"absolute h-[1.2rem] w-[1.2rem] scale-0 rotate-90 transition-all dark:scale-100 dark:rotate-0\" />\n <span className=\"sr-only\">{t('Toggle theme')}</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={() => setTheme(ThemeMode.LIGHT)}>\n {t('Light')}\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setTheme(ThemeMode.DARK)}>\n {t('Dark')}\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setTheme(ThemeMode.SYSTEM)}>\n {t('System')}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n"],"names":["ThemeToggle","className","t","useTranslation","setTheme","useTheme","DropdownMenu","jsx","DropdownMenuTrigger","jsxs","Button","Sun","Moon","DropdownMenuContent","DropdownMenuItem","ThemeMode"],"mappings":"yUA0BO,SAASA,EAAY,CAAE,UAAAC,GAA+B,CAC3D,KAAM,CAAE,EAAAC,CAAA,EAAMC,iBAAA,EACR,CAAE,SAAAC,CAAA,EAAaC,WAAA,EAErB,cACGC,eAAA,CACC,SAAA,CAAAC,EAAAA,IAACC,EAAAA,oBAAA,CAAoB,QAAO,GAC1B,SAAAC,EAAAA,KAACC,EAAAA,QAAO,QAAQ,WAAW,KAAK,OAAO,UAAAT,EACrC,SAAA,CAAAM,EAAAA,IAACI,EAAAA,IAAA,CAAI,UAAU,sFAAA,CAAuF,EACtGJ,EAAAA,IAACK,EAAAA,KAAA,CAAK,UAAU,8FAAA,CAA+F,QAC9G,OAAA,CAAK,UAAU,UAAW,SAAAV,EAAE,cAAc,CAAA,CAAE,CAAA,CAAA,CAC/C,CAAA,CACF,EACAO,EAAAA,KAACI,EAAAA,oBAAA,CAAoB,MAAM,MACzB,SAAA,CAAAN,EAAAA,IAACO,EAAAA,iBAAA,CAAiB,QAAS,IAAMV,EAASW,EAAAA,UAAU,KAAK,EACtD,SAAAb,EAAE,OAAO,CAAA,CACZ,EACAK,EAAAA,IAACO,EAAAA,iBAAA,CAAiB,QAAS,IAAMV,EAASW,EAAAA,UAAU,IAAI,EACrD,SAAAb,EAAE,MAAM,CAAA,CACX,EACAK,EAAAA,IAACO,EAAAA,iBAAA,CAAiB,QAAS,IAAMV,EAASW,YAAU,MAAM,EACvD,SAAAb,EAAE,QAAQ,CAAA,CACb,CAAA,CAAA,CACF,CAAA,EACF,CAEJ"}
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../../../src/components/theme/theme-toggle.tsx"],"sourcesContent":["import { Button } from 'dgz-ui/button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from 'dgz-ui/dropdown';\nimport { Moon, Sun } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { ThemeMode } from '../../enums';\nimport { useTheme } from '../../hooks';\n\n/**\n * Props for the ThemeToggle component.\n */\nexport interface ThemeToggleProps {\n /** Optional className passed to the trigger button. */\n className?: string;\n}\n\n/**\n * ThemeToggle provides a dropdown to switch between Light, Dark, and System themes.\n *\n * @param className - Optional className passed to the trigger button.\n * @returns {JSX.Element} A dropdown menu to switch themes.\n */\nexport function ThemeToggle({ className }: ThemeToggleProps) {\n const { t } = useTranslation();\n const { setTheme } = useTheme();\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"tertiary\" size=\"icon\" className={className}>\n <Sun className=\"h-[1.2rem] w-[1.2rem] scale-100 rotate-0 transition-all dark:scale-0 dark:-rotate-90\" />\n <Moon className=\"absolute h-[1.2rem] w-[1.2rem] scale-0 rotate-90 transition-all dark:scale-100 dark:rotate-0\" />\n <span className=\"sr-only\">{t('Toggle theme')}</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={() => setTheme(ThemeMode.LIGHT)}>\n {t('Light')}\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setTheme(ThemeMode.DARK)}>\n {t('Dark')}\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setTheme(ThemeMode.SYSTEM)}>\n {t('System')}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n"],"names":["ThemeToggle","className","t","useTranslation","setTheme","useTheme","DropdownMenu","jsx","DropdownMenuTrigger","jsxs","Button","Sun","Moon","DropdownMenuContent","DropdownMenuItem","ThemeMode"],"mappings":"yUA0BO,SAASA,EAAY,CAAE,UAAAC,GAA+B,CAC3D,KAAM,CAAE,EAAAC,CAAA,EAAMC,iBAAA,EACR,CAAE,SAAAC,CAAA,EAAaC,WAAA,EAErB,cACGC,eAAA,CACC,SAAA,CAAAC,EAAAA,IAACC,EAAAA,oBAAA,CAAoB,QAAO,GAC1B,SAAAC,EAAAA,KAACC,EAAAA,QAAO,QAAQ,WAAW,KAAK,OAAO,UAAAT,EACrC,SAAA,CAAAM,EAAAA,IAACI,EAAAA,IAAA,CAAI,UAAU,sFAAA,CAAuF,EACtGJ,EAAAA,IAACK,EAAAA,KAAA,CAAK,UAAU,8FAAA,CAA+F,QAC9G,OAAA,CAAK,UAAU,UAAW,SAAAV,EAAE,cAAc,CAAA,CAAE,CAAA,CAAA,CAC/C,CAAA,CACF,EACAO,EAAAA,KAACI,EAAAA,oBAAA,CAAoB,MAAM,MACzB,SAAA,CAAAN,EAAAA,IAACO,EAAAA,iBAAA,CAAiB,QAAS,IAAMV,EAASW,EAAAA,UAAU,KAAK,EACtD,SAAAb,EAAE,OAAO,CAAA,CACZ,EACAK,EAAAA,IAACO,EAAAA,iBAAA,CAAiB,QAAS,IAAMV,EAASW,EAAAA,UAAU,IAAI,EACrD,SAAAb,EAAE,MAAM,CAAA,CACX,EACAK,EAAAA,IAACO,EAAAA,iBAAA,CAAiB,QAAS,IAAMV,EAASW,YAAU,MAAM,EACvD,SAAAb,EAAE,QAAQ,CAAA,CACb,CAAA,CAAA,CACF,CAAA,EACF,CAEJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../../../src/components/theme/theme-toggle.tsx"],"sourcesContent":["import { Button } from 'dgz-ui/button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from 'dgz-ui/dropdown';\nimport { Moon, Sun } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { ThemeMode } from '../../enums';\nimport { useTheme } from '../../hooks';\n\n/**\n * Props for the ThemeToggle component.\n */\nexport interface ThemeToggleProps {\n /** Optional className passed to the trigger button. */\n className?: string;\n}\n\n/**\n * ThemeToggle provides a dropdown to switch between Light, Dark, and System themes.\n *\n * @param className - Optional className passed to the trigger button.\n * @returns A dropdown menu to switch themes.\n */\nexport function ThemeToggle({ className }: ThemeToggleProps) {\n const { t } = useTranslation();\n const { setTheme } = useTheme();\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"tertiary\" size=\"icon\" className={className}>\n <Sun className=\"h-[1.2rem] w-[1.2rem] scale-100 rotate-0 transition-all dark:scale-0 dark:-rotate-90\" />\n <Moon className=\"absolute h-[1.2rem] w-[1.2rem] scale-0 rotate-90 transition-all dark:scale-100 dark:rotate-0\" />\n <span className=\"sr-only\">{t('Toggle theme')}</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={() => setTheme(ThemeMode.LIGHT)}>\n {t('Light')}\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setTheme(ThemeMode.DARK)}>\n {t('Dark')}\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setTheme(ThemeMode.SYSTEM)}>\n {t('System')}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n"],"names":["ThemeToggle","className","t","useTranslation","setTheme","useTheme","DropdownMenu","jsx","DropdownMenuTrigger","jsxs","Button","Sun","Moon","DropdownMenuContent","DropdownMenuItem","ThemeMode"],"mappings":";;;;;;;AA0BO,SAASA,EAAY,EAAE,WAAAC,KAA+B;AAC3D,QAAM,EAAE,GAAAC,EAAA,IAAMC,EAAA,GACR,EAAE,UAAAC,EAAA,IAAaC,EAAA;AAErB,2BACGC,GAAA,EACC,UAAA;AAAA,IAAA,gBAAAC,EAACC,GAAA,EAAoB,SAAO,IAC1B,UAAA,gBAAAC,EAACC,KAAO,SAAQ,YAAW,MAAK,QAAO,WAAAT,GACrC,UAAA;AAAA,MAAA,gBAAAM,EAACI,GAAA,EAAI,WAAU,uFAAA,CAAuF;AAAA,MACtG,gBAAAJ,EAACK,GAAA,EAAK,WAAU,+FAAA,CAA+F;AAAA,wBAC9G,QAAA,EAAK,WAAU,WAAW,UAAAV,EAAE,cAAc,EAAA,CAAE;AAAA,IAAA,EAAA,CAC/C,EAAA,CACF;AAAA,IACA,gBAAAO,EAACI,GAAA,EAAoB,OAAM,OACzB,UAAA;AAAA,MAAA,gBAAAN,EAACO,GAAA,EAAiB,SAAS,MAAMV,EAASW,EAAU,KAAK,GACtD,UAAAb,EAAE,OAAO,EAAA,CACZ;AAAA,MACA,gBAAAK,EAACO,GAAA,EAAiB,SAAS,MAAMV,EAASW,EAAU,IAAI,GACrD,UAAAb,EAAE,MAAM,EAAA,CACX;AAAA,MACA,gBAAAK,EAACO,GAAA,EAAiB,SAAS,MAAMV,EAASW,EAAU,MAAM,GACvD,UAAAb,EAAE,QAAQ,EAAA,CACb;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;"}
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../../../src/components/theme/theme-toggle.tsx"],"sourcesContent":["import { Button } from 'dgz-ui/button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from 'dgz-ui/dropdown';\nimport { Moon, Sun } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { ThemeMode } from '../../enums';\nimport { useTheme } from '../../hooks';\n\n/**\n * Props for the ThemeToggle component.\n */\nexport interface ThemeToggleProps {\n /** Optional className passed to the trigger button. */\n className?: string;\n}\n\n/**\n * ThemeToggle provides a dropdown to switch between Light, Dark, and System themes.\n *\n * @param className - Optional className passed to the trigger button.\n * @returns {JSX.Element} A dropdown menu to switch themes.\n */\nexport function ThemeToggle({ className }: ThemeToggleProps) {\n const { t } = useTranslation();\n const { setTheme } = useTheme();\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"tertiary\" size=\"icon\" className={className}>\n <Sun className=\"h-[1.2rem] w-[1.2rem] scale-100 rotate-0 transition-all dark:scale-0 dark:-rotate-90\" />\n <Moon className=\"absolute h-[1.2rem] w-[1.2rem] scale-0 rotate-90 transition-all dark:scale-100 dark:rotate-0\" />\n <span className=\"sr-only\">{t('Toggle theme')}</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={() => setTheme(ThemeMode.LIGHT)}>\n {t('Light')}\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setTheme(ThemeMode.DARK)}>\n {t('Dark')}\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setTheme(ThemeMode.SYSTEM)}>\n {t('System')}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n"],"names":["ThemeToggle","className","t","useTranslation","setTheme","useTheme","DropdownMenu","jsx","DropdownMenuTrigger","jsxs","Button","Sun","Moon","DropdownMenuContent","DropdownMenuItem","ThemeMode"],"mappings":";;;;;;;AA0BO,SAASA,EAAY,EAAE,WAAAC,KAA+B;AAC3D,QAAM,EAAE,GAAAC,EAAA,IAAMC,EAAA,GACR,EAAE,UAAAC,EAAA,IAAaC,EAAA;AAErB,2BACGC,GAAA,EACC,UAAA;AAAA,IAAA,gBAAAC,EAACC,GAAA,EAAoB,SAAO,IAC1B,UAAA,gBAAAC,EAACC,KAAO,SAAQ,YAAW,MAAK,QAAO,WAAAT,GACrC,UAAA;AAAA,MAAA,gBAAAM,EAACI,GAAA,EAAI,WAAU,uFAAA,CAAuF;AAAA,MACtG,gBAAAJ,EAACK,GAAA,EAAK,WAAU,+FAAA,CAA+F;AAAA,wBAC9G,QAAA,EAAK,WAAU,WAAW,UAAAV,EAAE,cAAc,EAAA,CAAE;AAAA,IAAA,EAAA,CAC/C,EAAA,CACF;AAAA,IACA,gBAAAO,EAACI,GAAA,EAAoB,OAAM,OACzB,UAAA;AAAA,MAAA,gBAAAN,EAACO,GAAA,EAAiB,SAAS,MAAMV,EAASW,EAAU,KAAK,GACtD,UAAAb,EAAE,OAAO,EAAA,CACZ;AAAA,MACA,gBAAAK,EAACO,GAAA,EAAiB,SAAS,MAAMV,EAASW,EAAU,IAAI,GACrD,UAAAb,EAAE,MAAM,EAAA,CACX;AAAA,MACA,gBAAAK,EAACO,GAAA,EAAiB,SAAS,MAAMV,EAASW,EAAU,MAAM,GACvD,UAAAb,EAAE,QAAQ,EAAA,CACb;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../../../src/components/tooltip/MyTooltip.tsx"],"sourcesContent":["import { type TooltipContentProps } from '@radix-ui/react-tooltip';\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from 'dgz-ui/tooltip';\nimport { type ReactNode } from 'react';\n\n/**\n * Props for the MyTooltip component.\n */\nexport type MyTooltipProps = Omit<TooltipContentProps, 'content'> & {\n /** Element that triggers the tooltip. */\n children: ReactNode;\n /** Content shown inside the tooltip. */\n content: ReactNode;\n /** Whether to render the tooltip; if false, renders children only. */\n show?: boolean;\n asChild?: boolean;\n};\n\n/**\n * MyTooltip wraps children with a tooltip that can be conditionally shown.\n *\n * @param props.content - Content shown inside the tooltip.\n * @param props.children - Element that triggers the tooltip.\n * @param props.show - Whether to render the tooltip; if false, renders children only.\n * @param props.asChild - Whether to render the tooltip
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../../../src/components/tooltip/MyTooltip.tsx"],"sourcesContent":["import { type TooltipContentProps } from '@radix-ui/react-tooltip';\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from 'dgz-ui/tooltip';\nimport { type ReactNode } from 'react';\n\n/**\n * Props for the MyTooltip component.\n */\nexport type MyTooltipProps = Omit<TooltipContentProps, 'content'> & {\n /** Element that triggers the tooltip. */\n children: ReactNode;\n /** Content shown inside the tooltip. */\n content: ReactNode;\n /** Whether to render the tooltip; if false, renders children only. */\n show?: boolean;\n asChild?: boolean;\n};\n\n/**\n * MyTooltip wraps children with a tooltip that can be conditionally shown.\n *\n * @param props.content - Content shown inside the tooltip.\n * @param props.children - Element that triggers the tooltip.\n * @param props.show - Whether to render the tooltip; if false, renders children only.\n * @param props.asChild - Whether to render the tooltip trigger as child element.\n * @returns {JSX.Element} Either a tooltip-wrapped element or just the children\n */\nexport const MyTooltip = ({\n content,\n children,\n show = true,\n asChild,\n ...props\n}: MyTooltipProps) => {\n return show ? (\n <TooltipProvider>\n <Tooltip>\n <TooltipContent {...props}>{content}</TooltipContent>\n <TooltipTrigger asChild={asChild}>{children}</TooltipTrigger>\n </Tooltip>\n </TooltipProvider>\n ) : (\n children\n );\n};\n"],"names":["MyTooltip","content","children","show","asChild","props","jsx","TooltipProvider","jsxs","Tooltip","TooltipContent","TooltipTrigger"],"mappings":"kKA+BO,MAAMA,EAAY,CAAC,CACxB,QAAAC,EACA,SAAAC,EACA,KAAAC,EAAO,GACP,QAAAC,EACA,GAAGC,CACL,IACSF,EACLG,EAAAA,IAACC,kBAAA,CACC,SAAAC,OAACC,EAAAA,QAAA,CACC,SAAA,CAAAH,EAAAA,IAACI,EAAAA,eAAA,CAAgB,GAAGL,EAAQ,SAAAJ,CAAA,CAAQ,EACpCK,EAAAA,IAACK,EAAAA,eAAA,CAAe,QAAAP,EAAmB,SAAAF,CAAA,CAAS,CAAA,CAAA,CAC9C,EACF,EAEAA"}
|