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.
Files changed (260) hide show
  1. package/dist/chunks/Actions-Du8iQ3WR.es.js.map +1 -1
  2. package/dist/chunks/Actions-bpMDyl5M.cjs.js.map +1 -1
  3. package/dist/chunks/Empty-BReVQKje.es.js.map +1 -1
  4. package/dist/chunks/Empty-BYOOFAab.cjs.js.map +1 -1
  5. package/dist/chunks/ExportData-CwotVgye.es.js.map +1 -1
  6. package/dist/chunks/ExportData-DJE0jOHc.cjs.js.map +1 -1
  7. package/dist/chunks/Keyboard-CJVAJWdO.es.js.map +1 -1
  8. package/dist/chunks/Keyboard-kyPAAQWP.cjs.js.map +1 -1
  9. package/dist/chunks/Loader-D_jX_Wgx.cjs.js.map +1 -1
  10. package/dist/chunks/Loader-zvzAi0F6.es.js.map +1 -1
  11. package/dist/chunks/MyInput-ByJ5vTAN.es.js +280 -0
  12. package/dist/chunks/MyInput-ByJ5vTAN.es.js.map +1 -0
  13. package/dist/chunks/MyInput-mL2G5h2s.cjs.js +2 -0
  14. package/dist/chunks/MyInput-mL2G5h2s.cjs.js.map +1 -0
  15. package/dist/chunks/MyPagination-B0czoGZK.es.js.map +1 -1
  16. package/dist/chunks/MyPagination-CnF3468f.cjs.js.map +1 -1
  17. package/dist/chunks/{MySelect-5DHBVlKZ.es.js → MySelect-CRXtMlbf.es.js} +16 -16
  18. package/dist/chunks/MySelect-CRXtMlbf.es.js.map +1 -0
  19. package/dist/chunks/MySelect-CmLxmNJz.cjs.js +2 -0
  20. package/dist/chunks/MySelect-CmLxmNJz.cjs.js.map +1 -0
  21. package/dist/chunks/{PasswordConfirm-Uc4pncGw.cjs.js → PasswordConfirm-d5-QdLM5.cjs.js} +2 -2
  22. package/dist/chunks/PasswordConfirm-d5-QdLM5.cjs.js.map +1 -0
  23. package/dist/chunks/{PasswordConfirm-Dj97U7O9.es.js → PasswordConfirm-luxvE9Ug.es.js} +2 -2
  24. package/dist/chunks/PasswordConfirm-luxvE9Ug.es.js.map +1 -0
  25. package/dist/chunks/{Search-BtiKC-dt.es.js → Search-DunDXQgP.es.js} +21 -22
  26. package/dist/chunks/Search-DunDXQgP.es.js.map +1 -0
  27. package/dist/chunks/Search-kbkeTeSI.cjs.js +2 -0
  28. package/dist/chunks/Search-kbkeTeSI.cjs.js.map +1 -0
  29. package/dist/chunks/SortOrder-81BrXp3i.cjs.js.map +1 -1
  30. package/dist/chunks/SortOrder-CwuehjY1.es.js.map +1 -1
  31. package/dist/chunks/Spin-DUK1prd9.cjs.js.map +1 -1
  32. package/dist/chunks/Spin-DtW_edOq.es.js.map +1 -1
  33. package/dist/chunks/ThemeMode-BO6tit_Z.cjs.js.map +1 -1
  34. package/dist/chunks/ThemeMode-CqURAYDL.es.js.map +1 -1
  35. package/dist/chunks/_commonjsHelpers-DKOUU3wS.cjs.js +2 -0
  36. package/dist/chunks/_commonjsHelpers-DKOUU3wS.cjs.js.map +1 -0
  37. package/dist/chunks/_commonjsHelpers-DaMA6jEr.es.js +9 -0
  38. package/dist/chunks/_commonjsHelpers-DaMA6jEr.es.js.map +1 -0
  39. package/dist/chunks/useFilter-D93ncAmn.cjs.js +2 -0
  40. package/dist/chunks/useFilter-D93ncAmn.cjs.js.map +1 -0
  41. package/dist/chunks/useFilter-DpCwY1KO.es.js +17 -0
  42. package/dist/chunks/useFilter-DpCwY1KO.es.js.map +1 -0
  43. package/dist/chunks/useSortable-8RrwFw05.es.js +263 -0
  44. package/dist/chunks/useSortable-8RrwFw05.es.js.map +1 -0
  45. package/dist/chunks/useSortable-D9RgGUd0.cjs.js +2 -0
  46. package/dist/chunks/useSortable-D9RgGUd0.cjs.js.map +1 -0
  47. package/dist/chunks/useTheme-hjEZ-FC3.cjs.js.map +1 -1
  48. package/dist/chunks/useTheme-iKF3BEvj.es.js.map +1 -1
  49. package/dist/components/confirm/index.cjs.js +1 -1
  50. package/dist/components/confirm/index.es.js +1 -1
  51. package/dist/components/datatable/index.cjs.js +1 -1
  52. package/dist/components/datatable/index.cjs.js.map +1 -1
  53. package/dist/components/datatable/index.es.js +213 -212
  54. package/dist/components/datatable/index.es.js.map +1 -1
  55. package/dist/components/filters/index.cjs.js +1 -1
  56. package/dist/components/filters/index.cjs.js.map +1 -1
  57. package/dist/components/filters/index.es.js +6 -6
  58. package/dist/components/filters/index.es.js.map +1 -1
  59. package/dist/components/form/index.cjs.js +1 -1
  60. package/dist/components/form/index.cjs.js.map +1 -1
  61. package/dist/components/form/index.es.js +73 -73
  62. package/dist/components/form/index.es.js.map +1 -1
  63. package/dist/components/gallery/index.cjs.js +1 -1
  64. package/dist/components/gallery/index.cjs.js.map +1 -1
  65. package/dist/components/gallery/index.es.js +33 -33
  66. package/dist/components/gallery/index.es.js.map +1 -1
  67. package/dist/components/modal/index.cjs.js.map +1 -1
  68. package/dist/components/modal/index.es.js.map +1 -1
  69. package/dist/components/scroll/index.cjs.js.map +1 -1
  70. package/dist/components/scroll/index.es.js.map +1 -1
  71. package/dist/components/theme/index.cjs.js.map +1 -1
  72. package/dist/components/theme/index.es.js.map +1 -1
  73. package/dist/components/tooltip/index.cjs.js.map +1 -1
  74. package/dist/components/tooltip/index.es.js.map +1 -1
  75. package/dist/hooks/index.cjs.js +5 -5
  76. package/dist/hooks/index.cjs.js.map +1 -1
  77. package/dist/hooks/index.es.js +126 -126
  78. package/dist/hooks/index.es.js.map +1 -1
  79. package/dist/providers/index.cjs.js.map +1 -1
  80. package/dist/providers/index.es.js.map +1 -1
  81. package/dist/styles.css +1 -1
  82. package/dist/types/components/actions/Actions.d.ts +5 -2
  83. package/dist/types/components/actions/Actions.d.ts.map +1 -1
  84. package/dist/types/components/confirm/Confirm.d.ts +7 -2
  85. package/dist/types/components/confirm/Confirm.d.ts.map +1 -1
  86. package/dist/types/components/confirm/PasswordConfirm.d.ts +7 -1
  87. package/dist/types/components/confirm/PasswordConfirm.d.ts.map +1 -1
  88. package/dist/types/components/datatable/DataTable.d.ts +30 -30
  89. package/dist/types/components/datatable/DataTable.d.ts.map +1 -1
  90. package/dist/types/components/datatable/MyTable.d.ts +13 -13
  91. package/dist/types/components/empty/Empty.d.ts +1 -1
  92. package/dist/types/components/export/ExportData.d.ts +7 -0
  93. package/dist/types/components/export/ExportData.d.ts.map +1 -1
  94. package/dist/types/components/filters/AppliedFilters.d.ts +7 -7
  95. package/dist/types/components/filters/AppliedFilters.d.ts.map +1 -1
  96. package/dist/types/components/filters/FilterWrapper.d.ts +1 -0
  97. package/dist/types/components/filters/FilterWrapper.d.ts.map +1 -1
  98. package/dist/types/components/filters/Search.d.ts +1 -0
  99. package/dist/types/components/filters/Search.d.ts.map +1 -1
  100. package/dist/types/components/filters/SearchWithCtrl.d.ts +1 -0
  101. package/dist/types/components/filters/SearchWithCtrl.d.ts.map +1 -1
  102. package/dist/types/components/form/MyCheckbox.d.ts +1 -1
  103. package/dist/types/components/form/MyDatePicker.d.ts +1 -1
  104. package/dist/types/components/form/MyDateRangePicker.d.ts +1 -1
  105. package/dist/types/components/form/MyHtmlEditor.d.ts +1 -1
  106. package/dist/types/components/form/MyInput.d.ts +1 -0
  107. package/dist/types/components/form/MyInput.d.ts.map +1 -1
  108. package/dist/types/components/form/MyMaskInput.d.ts +1 -1
  109. package/dist/types/components/form/MyRadio.d.ts +1 -1
  110. package/dist/types/components/form/MySelect.d.ts +1 -1
  111. package/dist/types/components/form/MyShadcnSelect.d.ts +1 -1
  112. package/dist/types/components/form/MyTextarea.d.ts +1 -1
  113. package/dist/types/components/form/MyTimePicker.d.ts +1 -1
  114. package/dist/types/components/gallery/MyGallery.d.ts.map +1 -1
  115. package/dist/types/components/loader/Loader.d.ts +1 -1
  116. package/dist/types/components/loader/Spin.d.ts +1 -1
  117. package/dist/types/components/modal/MyModal.d.ts +9 -9
  118. package/dist/types/components/pagination/MyLimitSelect.d.ts +6 -3
  119. package/dist/types/components/pagination/MyLimitSelect.d.ts.map +1 -1
  120. package/dist/types/components/scroll/ScrollArea.d.ts +1 -1
  121. package/dist/types/components/theme/theme-toggle.d.ts +1 -1
  122. package/dist/types/components/tooltip/MyTooltip.d.ts +2 -1
  123. package/dist/types/components/tooltip/MyTooltip.d.ts.map +1 -1
  124. package/dist/types/enums/Keyboard.d.ts +1 -0
  125. package/dist/types/enums/Keyboard.d.ts.map +1 -1
  126. package/dist/types/enums/SortOrder.d.ts +2 -0
  127. package/dist/types/enums/SortOrder.d.ts.map +1 -1
  128. package/dist/types/enums/ThemeMode.d.ts +3 -0
  129. package/dist/types/enums/ThemeMode.d.ts.map +1 -1
  130. package/dist/types/hooks/useColumns.d.ts +7 -9
  131. package/dist/types/hooks/useColumns.d.ts.map +1 -1
  132. package/dist/types/hooks/useConfirm.d.ts +3 -1
  133. package/dist/types/hooks/useConfirm.d.ts.map +1 -1
  134. package/dist/types/hooks/useDataTable.d.ts +9 -10
  135. package/dist/types/hooks/useDataTable.d.ts.map +1 -1
  136. package/dist/types/hooks/useDocumentTitle.d.ts +1 -0
  137. package/dist/types/hooks/useDocumentTitle.d.ts.map +1 -1
  138. package/dist/types/hooks/useFilter.d.ts +13 -6
  139. package/dist/types/hooks/useFilter.d.ts.map +1 -1
  140. package/dist/types/hooks/useMediaQuerySizes.d.ts +8 -1
  141. package/dist/types/hooks/useMediaQuerySizes.d.ts.map +1 -1
  142. package/dist/types/hooks/useSortable.d.ts +10 -10
  143. package/dist/types/hooks/useSortable.d.ts.map +1 -1
  144. package/dist/types/hooks/useTheme.d.ts +5 -0
  145. package/dist/types/hooks/useTheme.d.ts.map +1 -1
  146. package/dist/types/providers/ThemeProvider.d.ts +1 -0
  147. package/dist/types/providers/ThemeProvider.d.ts.map +1 -1
  148. package/dist/types/stories/Actions.stories.d.ts +8 -0
  149. package/dist/types/stories/Actions.stories.d.ts.map +1 -0
  150. package/dist/types/stories/AppliedFilters.stories.d.ts +10 -0
  151. package/dist/types/stories/AppliedFilters.stories.d.ts.map +1 -0
  152. package/dist/types/stories/Confirm.stories.d.ts +8 -0
  153. package/dist/types/stories/Confirm.stories.d.ts.map +1 -0
  154. package/dist/types/stories/DataTable.stories.d.ts +19 -0
  155. package/dist/types/stories/DataTable.stories.d.ts.map +1 -0
  156. package/dist/types/stories/DateRangePicker.stories.d.ts +10 -0
  157. package/dist/types/stories/DateRangePicker.stories.d.ts.map +1 -0
  158. package/dist/types/stories/Empty.stories.d.ts +9 -0
  159. package/dist/types/stories/Empty.stories.d.ts.map +1 -0
  160. package/dist/types/stories/ExportData.stories.d.ts +9 -0
  161. package/dist/types/stories/ExportData.stories.d.ts.map +1 -0
  162. package/dist/types/stories/FilterWrapper.stories.d.ts +9 -0
  163. package/dist/types/stories/FilterWrapper.stories.d.ts.map +1 -0
  164. package/dist/types/stories/Loader.stories.d.ts +7 -0
  165. package/dist/types/stories/Loader.stories.d.ts.map +1 -0
  166. package/dist/types/stories/MyCheckbox.stories.d.ts +8 -0
  167. package/dist/types/stories/MyCheckbox.stories.d.ts.map +1 -0
  168. package/dist/types/stories/MyDatePicker.stories.d.ts +10 -0
  169. package/dist/types/stories/MyDatePicker.stories.d.ts.map +1 -0
  170. package/dist/types/stories/MyDateRangePicker.stories.d.ts +8 -0
  171. package/dist/types/stories/MyDateRangePicker.stories.d.ts.map +1 -0
  172. package/dist/types/stories/MyGallery.stories.d.ts +9 -0
  173. package/dist/types/stories/MyGallery.stories.d.ts.map +1 -0
  174. package/dist/types/stories/MyHtmlEditor.stories.d.ts +8 -0
  175. package/dist/types/stories/MyHtmlEditor.stories.d.ts.map +1 -0
  176. package/dist/types/stories/MyInput.stories.d.ts +10 -0
  177. package/dist/types/stories/MyInput.stories.d.ts.map +1 -0
  178. package/dist/types/stories/MyLimitSelect.stories.d.ts +9 -0
  179. package/dist/types/stories/MyLimitSelect.stories.d.ts.map +1 -0
  180. package/dist/types/stories/MyMaskInput.stories.d.ts +9 -0
  181. package/dist/types/stories/MyMaskInput.stories.d.ts.map +1 -0
  182. package/dist/types/stories/MyModal.stories.d.ts +10 -0
  183. package/dist/types/stories/MyModal.stories.d.ts.map +1 -0
  184. package/dist/types/stories/MyPagination.stories.d.ts +10 -0
  185. package/dist/types/stories/MyPagination.stories.d.ts.map +1 -0
  186. package/dist/types/stories/MyRadio.stories.d.ts +7 -0
  187. package/dist/types/stories/MyRadio.stories.d.ts.map +1 -0
  188. package/dist/types/stories/MySelect.stories.d.ts +10 -0
  189. package/dist/types/stories/MySelect.stories.d.ts.map +1 -0
  190. package/dist/types/stories/MyShadcnSelect.stories.d.ts +9 -0
  191. package/dist/types/stories/MyShadcnSelect.stories.d.ts.map +1 -0
  192. package/dist/types/stories/MySwitch.stories.d.ts +8 -0
  193. package/dist/types/stories/MySwitch.stories.d.ts.map +1 -0
  194. package/dist/types/stories/MyTable.stories.d.ts +19 -0
  195. package/dist/types/stories/MyTable.stories.d.ts.map +1 -0
  196. package/dist/types/stories/MyTextarea.stories.d.ts +9 -0
  197. package/dist/types/stories/MyTextarea.stories.d.ts.map +1 -0
  198. package/dist/types/stories/MyTimePicker.stories.d.ts +9 -0
  199. package/dist/types/stories/MyTimePicker.stories.d.ts.map +1 -0
  200. package/dist/types/stories/MyTooltip.stories.d.ts +10 -0
  201. package/dist/types/stories/MyTooltip.stories.d.ts.map +1 -0
  202. package/dist/types/stories/PasswordConfirm.stories.d.ts +8 -0
  203. package/dist/types/stories/PasswordConfirm.stories.d.ts.map +1 -0
  204. package/dist/types/stories/ScrollArea.stories.d.ts +8 -0
  205. package/dist/types/stories/ScrollArea.stories.d.ts.map +1 -0
  206. package/dist/types/stories/Search.stories.d.ts +8 -0
  207. package/dist/types/stories/Search.stories.d.ts.map +1 -0
  208. package/dist/types/stories/SearchWithCtrl.stories.d.ts +8 -0
  209. package/dist/types/stories/SearchWithCtrl.stories.d.ts.map +1 -0
  210. package/dist/types/stories/Spin.stories.d.ts +8 -0
  211. package/dist/types/stories/Spin.stories.d.ts.map +1 -0
  212. package/dist/types/stories/ThemeToggle.stories.d.ts +8 -0
  213. package/dist/types/stories/ThemeToggle.stories.d.ts.map +1 -0
  214. package/dist/types/types/translation-args.type.d.ts +7 -0
  215. package/dist/types/types/translation-args.type.d.ts.map +1 -1
  216. package/dist/types/utils/index.d.ts +2 -0
  217. package/dist/types/utils/index.d.ts.map +1 -0
  218. package/dist/types/utils/utils.d.ts +8 -0
  219. package/dist/types/utils/utils.d.ts.map +1 -0
  220. package/dist/utils/index.cjs.js +2 -0
  221. package/dist/utils/index.cjs.js.map +1 -0
  222. package/dist/utils/index.es.js +7 -0
  223. package/dist/utils/index.es.js.map +1 -0
  224. package/package.json +15 -5
  225. package/dist/chunks/MyInput-5ir4eN2m.cjs.js +0 -2
  226. package/dist/chunks/MyInput-5ir4eN2m.cjs.js.map +0 -1
  227. package/dist/chunks/MyInput-Cb0FlVxQ.es.js +0 -53
  228. package/dist/chunks/MyInput-Cb0FlVxQ.es.js.map +0 -1
  229. package/dist/chunks/MySelect-5DHBVlKZ.es.js.map +0 -1
  230. package/dist/chunks/MySelect-Dl3jKf5s.cjs.js +0 -2
  231. package/dist/chunks/MySelect-Dl3jKf5s.cjs.js.map +0 -1
  232. package/dist/chunks/PasswordConfirm-Dj97U7O9.es.js.map +0 -1
  233. package/dist/chunks/PasswordConfirm-Uc4pncGw.cjs.js.map +0 -1
  234. package/dist/chunks/Search-BtiKC-dt.es.js.map +0 -1
  235. package/dist/chunks/Search-DfRA43qp.cjs.js +0 -2
  236. package/dist/chunks/Search-DfRA43qp.cjs.js.map +0 -1
  237. package/dist/chunks/lodash-BjH0kD7j.cjs.js +0 -28
  238. package/dist/chunks/lodash-BjH0kD7j.cjs.js.map +0 -1
  239. package/dist/chunks/lodash-CRDOWzbs.es.js +0 -3701
  240. package/dist/chunks/lodash-CRDOWzbs.es.js.map +0 -1
  241. package/dist/chunks/useFilter-C_K_3fQu.es.js +0 -18
  242. package/dist/chunks/useFilter-C_K_3fQu.es.js.map +0 -1
  243. package/dist/chunks/useFilter-CsOF1_hM.cjs.js +0 -2
  244. package/dist/chunks/useFilter-CsOF1_hM.cjs.js.map +0 -1
  245. package/dist/chunks/useSortable-B3LF1tg8.cjs.js +0 -2
  246. package/dist/chunks/useSortable-B3LF1tg8.cjs.js.map +0 -1
  247. package/dist/chunks/useSortable-BXNk8Wth.es.js +0 -135
  248. package/dist/chunks/useSortable-BXNk8Wth.es.js.map +0 -1
  249. package/dist/types/stories/Button.d.ts +0 -15
  250. package/dist/types/stories/Button.d.ts.map +0 -1
  251. package/dist/types/stories/Button.stories.d.ts +0 -24
  252. package/dist/types/stories/Button.stories.d.ts.map +0 -1
  253. package/dist/types/stories/Header.d.ts +0 -12
  254. package/dist/types/stories/Header.d.ts.map +0 -1
  255. package/dist/types/stories/Header.stories.d.ts +0 -19
  256. package/dist/types/stories/Header.stories.d.ts.map +0 -1
  257. package/dist/types/stories/Page.d.ts +0 -3
  258. package/dist/types/stories/Page.d.ts.map +0 -1
  259. package/dist/types/stories/Page.stories.d.ts +0 -13
  260. 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"),i=require("react"),S=require("dgz-ui/utils"),E=require("../../chunks/lodash-BjH0kD7j.cjs.js"),N=require("lucide-react");var k={exports:{}},A=k.exports,C;function L(){return C||(C=1,(function(l,y){(function(p,a){a()})(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 a(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,c=document.createElement("a");t=t||e.name||"download",c.download=t,c.rel="noopener",typeof e=="string"?(c.href=e,c.origin===location.origin?v(c):h(c.href)?a(e,t,d):v(c,c.target="_blank")):(c.href=o.createObjectURL(e),setTimeout(function(){o.revokeObjectURL(c.href)},4e4),setTimeout(function(){v(c)},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))a(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 a(e,t,d);var c=e.type==="application/octet-stream",j=/constructor/i.test(u.HTMLElement)||u.safari,w=/CriOS\/[\d]+/.test(navigator.userAgent);if((w||c&&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})})(k)),k.exports}var F=L();const M=()=>[{icon:n.jsx(N.Download,{size:20}),onClick:l=>{F.saveAs(l.src,l.title)},label:"Download"}],T=i.memo(({src:l,alt:y,fallbackImage:p})=>{const[a,h]=i.useState(!1),v=()=>{h(!0)};return n.jsx("img",{src:a&&p?p:l,alt:y,className:"max-h-full max-w-full object-contain",onError:v})}),O=i.memo(({image:l,index:y,onClick:p,fallbackImage:a,className:h,...v})=>{const[u,s]=i.useState(!1),f=()=>{s(!0)};return i.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&&a?a: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:a,className:h,hasInfo:v,...u})=>{const[s,f]=i.useState(null),[e,t]=i.useState(!1),d=i.useMemo(()=>M(),[]),o=i.useMemo(()=>[...d,...p],[d,p]),c=i.useCallback(r=>{f(r),t(!0)},[]),j=i.useCallback(()=>{t(!1),f(null)},[]),w=i.useCallback(()=>{s!==null&&s>0&&f(s-1)},[s]),x=i.useCallback(()=>{s!==null&&s<l.length-1&&f(s+1)},[s,l.length]);i.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]),i.useEffect(()=>(e?document.body.style.overflow="hidden":document.body.style.overflow="unset",()=>{document.body.style.overflow="unset"}),[e]);const b=i.useMemo(()=>s!==null?l[s]:null,[s,l]),g=i.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(N.X,{size:20})})]})]}),E.lodashExports.isNumber(s)&&s>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(N.ChevronLeft,{size:24})}),E.lodashExports.isNumber(s)&&s<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(N.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:a})}),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=>{a&&(R.currentTarget.src=a)}})},r.id))})})]}),[e,a,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:c,fallbackImage:a}),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=i.memo(q);exports.MyGallery=D;
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 N, useCallback as j, useEffect as C, createElement as D } from "react";
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, l as S } from "../../chunks/lodash-CRDOWzbs.es.js";
5
- import { X as O, ChevronLeft as U, ChevronRight as z, Download as _ } from "lucide-react";
6
- var A = { exports: {} }, B = A.exports, T;
7
- function H() {
8
- return T || (T = 1, (function(s, w) {
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
- })(B, function() {
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 $ = H();
78
- const q = () => [
77
+ var H = B();
78
+ const $ = () => [
79
79
  {
80
- icon: /* @__PURE__ */ l(_, { size: 20 }),
80
+ icon: /* @__PURE__ */ l(z, { size: 20 }),
81
81
  onClick: (s) => {
82
- $.saveAs(s.src, s.title);
82
+ H.saveAs(s.src, s.title);
83
83
  },
84
84
  label: "Download"
85
85
  }
86
- ], G = R(
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
- ), I = R(
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__ */ D(
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
- ), X = ({
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 = N(() => q(), []), o = N(
148
+ const [r, d] = L(null), [e, t] = L(!1), u = j(() => $(), []), o = j(
149
149
  () => [...u, ...p],
150
150
  [u, p]
151
- ), a = j((n) => {
151
+ ), a = N((n) => {
152
152
  d(n), t(!0);
153
- }, []), x = j(() => {
153
+ }, []), x = N(() => {
154
154
  t(!1), d(null);
155
- }, []), y = j(() => {
155
+ }, []), y = N(() => {
156
156
  r !== null && r > 0 && d(r - 1);
157
- }, [r]), b = j(() => {
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 = N(
179
+ const m = j(
180
180
  () => r !== null ? s[r] : null,
181
181
  [r, s]
182
- ), E = N(() => !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: [
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(O, { size: 20 })
206
+ children: /* @__PURE__ */ l(D, { size: 20 })
207
207
  }
208
208
  )
209
209
  ] })
210
210
  ]
211
211
  }
212
212
  ),
213
- S.isNumber(r) && r > 0 && /* @__PURE__ */ l(
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(U, { size: 24 })
219
+ children: /* @__PURE__ */ l(O, { size: 24 })
220
220
  }
221
221
  ),
222
- S.isNumber(r) && r < s.length - 1 && /* @__PURE__ */ l(
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(z, { size: 24 })
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
- G,
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: (M) => {
254
- i && (M.currentTarget.src = 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
- I,
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
- }, Q = R(X);
304
+ }, J = R(I);
305
305
  export {
306
- Q as MyGallery
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\n * @param contentProps\n * @param {MyModalProps} props - The props for the MyModal 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
+ {"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\n * @param contentProps\n * @param {MyModalProps} props - The props for the MyModal 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
+ {"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 tigger as child element.\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":"kKA8BO,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"}
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"}