@mari-ui/components 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (459) hide show
  1. package/dist/accordion.js +4 -4
  2. package/dist/accordion.js.map +1 -1
  3. package/dist/alert.js +5 -5
  4. package/dist/alert.js.map +1 -1
  5. package/dist/autocomplete.js +8 -8
  6. package/dist/autocomplete.js.map +1 -1
  7. package/dist/avatar.js +3 -3
  8. package/dist/badge.js +3 -3
  9. package/dist/breadcrumb.js +9 -9
  10. package/dist/breadcrumb.js.map +1 -1
  11. package/dist/button.js +4 -4
  12. package/dist/calendar.js +14 -14
  13. package/dist/calendar.js.map +1 -1
  14. package/dist/card.js +4 -4
  15. package/dist/card.js.map +1 -1
  16. package/dist/carousel.js +4 -4
  17. package/dist/carousel.js.map +1 -1
  18. package/dist/chart.js +5 -5
  19. package/dist/chart.js.map +1 -1
  20. package/dist/checkbox.js +4 -4
  21. package/dist/{chunk-BDV4GOEN.js → chunk-5GILG5AK.js} +1 -1
  22. package/dist/chunk-5GILG5AK.js.map +1 -0
  23. package/dist/{chunk-IP2J3BWY.js → chunk-6AMBZXZJ.js} +1 -1
  24. package/dist/chunk-6AMBZXZJ.js.map +1 -0
  25. package/dist/{chunk-XUKVQO6M.js → chunk-6CSUVVFG.js} +1 -1
  26. package/dist/chunk-6CSUVVFG.js.map +1 -0
  27. package/dist/{chunk-ELHESRRH.js → chunk-7FQQRTPX.js} +5 -5
  28. package/dist/chunk-7FQQRTPX.js.map +1 -0
  29. package/dist/{chunk-QNOHFHVL.js → chunk-7WB4CDWX.js} +4 -4
  30. package/dist/chunk-7WB4CDWX.js.map +1 -0
  31. package/dist/{chunk-47FHUOLT.js → chunk-BLFY5UAL.js} +1 -1
  32. package/dist/chunk-BLFY5UAL.js.map +1 -0
  33. package/dist/{chunk-CYLXW66E.js → chunk-C3QWJFSE.js} +2 -2
  34. package/dist/chunk-C3QWJFSE.js.map +1 -0
  35. package/dist/{chunk-QDFDMWXD.js → chunk-CNWRDTEW.js} +7 -7
  36. package/dist/chunk-CNWRDTEW.js.map +1 -0
  37. package/dist/{chunk-2IEXY3OZ.js → chunk-CVKAGR3D.js} +4 -4
  38. package/dist/{chunk-LZHERDNB.js → chunk-CXIWRNSP.js} +5 -5
  39. package/dist/chunk-CXIWRNSP.js.map +1 -0
  40. package/dist/{chunk-FNJHS5KQ.js → chunk-E5JTEQ4V.js} +6 -6
  41. package/dist/chunk-E5JTEQ4V.js.map +1 -0
  42. package/dist/{chunk-IO4346TF.js → chunk-FC7T3INX.js} +8 -8
  43. package/dist/chunk-FC7T3INX.js.map +1 -0
  44. package/dist/{chunk-KCYM2JXP.js → chunk-FWSMUUZ5.js} +5 -5
  45. package/dist/chunk-FWSMUUZ5.js.map +1 -0
  46. package/dist/{chunk-3ABWBQCS.js → chunk-GTNCXOUL.js} +2 -2
  47. package/dist/chunk-GTNCXOUL.js.map +1 -0
  48. package/dist/{chunk-ZLPAXPDI.js → chunk-GVJ4M63W.js} +3 -3
  49. package/dist/{chunk-ZLPAXPDI.js.map → chunk-GVJ4M63W.js.map} +1 -1
  50. package/dist/{chunk-LBXIPDAB.js → chunk-JXD5DW6E.js} +3 -3
  51. package/dist/chunk-JXD5DW6E.js.map +1 -0
  52. package/dist/{chunk-P7Z5BREP.js → chunk-L6DBWUAB.js} +6 -6
  53. package/dist/chunk-L6DBWUAB.js.map +1 -0
  54. package/dist/{chunk-YZ7MDC6B.js → chunk-LNL4TCGL.js} +2 -2
  55. package/dist/chunk-LNL4TCGL.js.map +1 -0
  56. package/dist/{chunk-TCYDVNSU.js → chunk-MT4VH7QV.js} +1 -1
  57. package/dist/chunk-MT4VH7QV.js.map +1 -0
  58. package/dist/{chunk-DKENCYHA.js → chunk-MXGY2ENX.js} +1 -1
  59. package/dist/chunk-MXGY2ENX.js.map +1 -0
  60. package/dist/{chunk-DUCIAQGR.js → chunk-NENNFQEY.js} +3 -3
  61. package/dist/chunk-NENNFQEY.js.map +1 -0
  62. package/dist/{chunk-LBQMEHK6.js → chunk-NPFMPRII.js} +1 -1
  63. package/dist/chunk-NPFMPRII.js.map +1 -0
  64. package/dist/{chunk-NS7FKOFI.js → chunk-NYXU5EFE.js} +1 -1
  65. package/dist/chunk-NYXU5EFE.js.map +1 -0
  66. package/dist/{chunk-S66GKX2W.js → chunk-OAWUZIIN.js} +1 -1
  67. package/dist/chunk-OAWUZIIN.js.map +1 -0
  68. package/dist/{chunk-JNZODUXP.js → chunk-OYDG6C54.js} +1 -1
  69. package/dist/chunk-OYDG6C54.js.map +1 -0
  70. package/dist/{chunk-FFXRFQSU.js → chunk-POBOJBNJ.js} +1 -1
  71. package/dist/chunk-POBOJBNJ.js.map +1 -0
  72. package/dist/{chunk-RIBB5OJV.js → chunk-PR2MCHU4.js} +4 -4
  73. package/dist/chunk-PR2MCHU4.js.map +1 -0
  74. package/dist/{chunk-LEOIKO7C.js → chunk-RLWP6NJU.js} +4 -4
  75. package/dist/chunk-RLWP6NJU.js.map +1 -0
  76. package/dist/{chunk-V7KDUUV6.js → chunk-RMNV2CE2.js} +2 -2
  77. package/dist/chunk-RMNV2CE2.js.map +1 -0
  78. package/dist/{chunk-ZXYQ2ZPR.js → chunk-TEMTIMAH.js} +3 -3
  79. package/dist/chunk-TEMTIMAH.js.map +1 -0
  80. package/dist/{chunk-NPM7IDYV.js → chunk-TSFAAREV.js} +3 -3
  81. package/dist/chunk-TSFAAREV.js.map +1 -0
  82. package/dist/{chunk-54HHEXXD.js → chunk-VKN374SD.js} +1 -1
  83. package/dist/chunk-VKN374SD.js.map +1 -0
  84. package/dist/{chunk-ZMA7BT2L.js → chunk-XWBJPA3D.js} +4 -4
  85. package/dist/{chunk-ZMA7BT2L.js.map → chunk-XWBJPA3D.js.map} +1 -1
  86. package/dist/{chunk-QZRBO7BE.js → chunk-Z4KFHRDW.js} +9 -9
  87. package/dist/chunk-Z4KFHRDW.js.map +1 -0
  88. package/dist/{chunk-TXRQCHOR.js → chunk-ZAR3SCPV.js} +5 -5
  89. package/dist/chunk-ZAR3SCPV.js.map +1 -0
  90. package/dist/color-picker.js +19 -19
  91. package/dist/date-picker.js +10 -10
  92. package/dist/date-picker.js.map +1 -1
  93. package/dist/divider.js +2 -2
  94. package/dist/divider.js.map +1 -1
  95. package/dist/drawer.js +7 -7
  96. package/dist/dropdown.js +7 -7
  97. package/dist/empty.js +5 -5
  98. package/dist/field.js +2 -2
  99. package/dist/field.js.map +1 -1
  100. package/dist/float-button.js +6 -6
  101. package/dist/float-button.js.map +1 -1
  102. package/dist/image.js +8 -8
  103. package/dist/image.js.map +1 -1
  104. package/dist/input-number.js +6 -6
  105. package/dist/input.js +8 -8
  106. package/dist/list.js +12 -12
  107. package/dist/list.js.map +1 -1
  108. package/dist/loading.js +1 -1
  109. package/dist/logo.js.map +1 -1
  110. package/dist/mari.css +8 -2
  111. package/dist/masonry.js +5 -5
  112. package/dist/masonry.js.map +1 -1
  113. package/dist/menu.js +10 -10
  114. package/dist/menu.js.map +1 -1
  115. package/dist/modal.js +8 -8
  116. package/dist/modal.js.map +1 -1
  117. package/dist/pagination.js +5 -5
  118. package/dist/popconfirm.js +13 -13
  119. package/dist/popconfirm.js.map +1 -1
  120. package/dist/popover.js +10 -10
  121. package/dist/progress.js +2 -2
  122. package/dist/progress.js.map +1 -1
  123. package/dist/qrcode.js +1 -1
  124. package/dist/qrcode.js.map +1 -1
  125. package/dist/radio.js +4 -4
  126. package/dist/radio.js.map +1 -1
  127. package/dist/rate.js +2 -2
  128. package/dist/rate.js.map +1 -1
  129. package/dist/segmented.js +4 -4
  130. package/dist/select.js +11 -11
  131. package/dist/skeleton.js +3 -3
  132. package/dist/slider.js +8 -8
  133. package/dist/slider.js.map +1 -1
  134. package/dist/splitter.js.map +1 -1
  135. package/dist/statistic.js +7 -7
  136. package/dist/statistic.js.map +1 -1
  137. package/dist/steps.js +4 -4
  138. package/dist/steps.js.map +1 -1
  139. package/dist/styles.css +1 -1
  140. package/dist/switch.js +2 -2
  141. package/dist/switch.js.map +1 -1
  142. package/dist/table.js +19 -19
  143. package/dist/table.js.map +1 -1
  144. package/dist/tabs.js +2 -2
  145. package/dist/tabs.js.map +1 -1
  146. package/dist/tag.js +3 -3
  147. package/dist/theme-customizer.js +19 -19
  148. package/dist/theme-customizer.js.map +1 -1
  149. package/dist/timeline.js +5 -5
  150. package/dist/timeline.js.map +1 -1
  151. package/dist/toast.js +7 -7
  152. package/dist/tooltip.js +4 -4
  153. package/dist/tour.js +12 -12
  154. package/dist/tour.js.map +1 -1
  155. package/dist/transfer.js +11 -11
  156. package/dist/transfer.js.map +1 -1
  157. package/dist/tree-select.js +12 -12
  158. package/dist/tree-select.js.map +1 -1
  159. package/dist/tree.js +5 -5
  160. package/dist/types/accordion/Accordion.d.ts +1 -3
  161. package/dist/types/accordion/Accordion.d.ts.map +1 -1
  162. package/dist/types/alert/Alert.d.ts +0 -1
  163. package/dist/types/alert/Alert.d.ts.map +1 -1
  164. package/dist/types/autocomplete/AutoComplete.d.ts +2 -2
  165. package/dist/types/autocomplete/utils.d.ts +0 -8
  166. package/dist/types/autocomplete/utils.d.ts.map +1 -1
  167. package/dist/types/avatar/utils.d.ts +1 -1
  168. package/dist/types/badge/Badge.d.ts +0 -3
  169. package/dist/types/badge/Badge.d.ts.map +1 -1
  170. package/dist/types/breadcrumb/Breadcrumb.d.ts +1 -12
  171. package/dist/types/breadcrumb/Breadcrumb.d.ts.map +1 -1
  172. package/dist/types/breadcrumb/utils.d.ts +0 -7
  173. package/dist/types/breadcrumb/utils.d.ts.map +1 -1
  174. package/dist/types/button/types.d.ts +1 -9
  175. package/dist/types/button/types.d.ts.map +1 -1
  176. package/dist/types/calendar/Calendar.d.ts +3 -4
  177. package/dist/types/calendar/Calendar.d.ts.map +1 -1
  178. package/dist/types/calendar/_components/CalendarPanel.d.ts +1 -2
  179. package/dist/types/calendar/_components/CalendarPanel.d.ts.map +1 -1
  180. package/dist/types/calendar/_components/DayGrid.d.ts +1 -1
  181. package/dist/types/calendar/types.d.ts +1 -1
  182. package/dist/types/calendar/types.d.ts.map +1 -1
  183. package/dist/types/card/Card.d.ts +3 -4
  184. package/dist/types/card/Card.d.ts.map +1 -1
  185. package/dist/types/card/types.d.ts +1 -1
  186. package/dist/types/carousel/types.d.ts +4 -10
  187. package/dist/types/carousel/types.d.ts.map +1 -1
  188. package/dist/types/carousel/utils.d.ts +0 -11
  189. package/dist/types/carousel/utils.d.ts.map +1 -1
  190. package/dist/types/chart/_shared/paths.d.ts +1 -1
  191. package/dist/types/chart/_shared/scale.d.ts +1 -2
  192. package/dist/types/chart/_shared/scale.d.ts.map +1 -1
  193. package/dist/types/chart/bar-chart/BarChart.d.ts +1 -1
  194. package/dist/types/chart/gauge/Gauge.d.ts +1 -1
  195. package/dist/types/chart/line-chart/LineChart.d.ts +2 -2
  196. package/dist/types/chart/pie-chart/PieChart.d.ts +1 -1
  197. package/dist/types/chart/sparkline/Sparkline.d.ts +1 -1
  198. package/dist/types/checkbox/utils.d.ts.map +1 -1
  199. package/dist/types/color-picker/ColorPicker.d.ts +0 -6
  200. package/dist/types/color-picker/ColorPicker.d.ts.map +1 -1
  201. package/dist/types/color-picker/_components/ColorPresets.d.ts +1 -1
  202. package/dist/types/color-picker/_components/ColorPresets.d.ts.map +1 -1
  203. package/dist/types/color-picker/utils.d.ts +1 -1
  204. package/dist/types/date-picker/DatePicker.d.ts +0 -6
  205. package/dist/types/date-picker/DatePicker.d.ts.map +1 -1
  206. package/dist/types/date-picker/TimePicker.d.ts +1 -1
  207. package/dist/types/date-picker/_components/TimePanel.d.ts.map +1 -1
  208. package/dist/types/date-picker/utils.d.ts +1 -1
  209. package/dist/types/date-picker/utils.d.ts.map +1 -1
  210. package/dist/types/divider/Divider.d.ts +1 -1
  211. package/dist/types/divider/types.d.ts +2 -4
  212. package/dist/types/divider/types.d.ts.map +1 -1
  213. package/dist/types/drawer/Drawer.d.ts +5 -6
  214. package/dist/types/drawer/Drawer.d.ts.map +1 -1
  215. package/dist/types/dropdown/_components/DropdownContent.d.ts +1 -1
  216. package/dist/types/dropdown/_components/DropdownItem.d.ts +0 -5
  217. package/dist/types/dropdown/_components/DropdownItem.d.ts.map +1 -1
  218. package/dist/types/dropdown/types.d.ts +1 -1
  219. package/dist/types/dropdown/useDropdown.d.ts +0 -16
  220. package/dist/types/dropdown/useDropdown.d.ts.map +1 -1
  221. package/dist/types/dropdown/utils.d.ts +1 -1
  222. package/dist/types/empty/Empty.d.ts +1 -6
  223. package/dist/types/empty/Empty.d.ts.map +1 -1
  224. package/dist/types/field/Field.d.ts +1 -5
  225. package/dist/types/field/Field.d.ts.map +1 -1
  226. package/dist/types/float-button/BackTop.d.ts +1 -1
  227. package/dist/types/float-button/FloatButton.d.ts +0 -5
  228. package/dist/types/float-button/FloatButton.d.ts.map +1 -1
  229. package/dist/types/float-button/FloatButtonGroup.d.ts +1 -1
  230. package/dist/types/float-button/utils.d.ts +1 -1
  231. package/dist/types/foundations/usePersonaTheme.d.ts +1 -1
  232. package/dist/types/image/Image.d.ts +0 -6
  233. package/dist/types/image/Image.d.ts.map +1 -1
  234. package/dist/types/image/ImageGallery.d.ts +1 -1
  235. package/dist/types/image/ImageViewer.d.ts +1 -1
  236. package/dist/types/image/galleryUtils.d.ts +1 -1
  237. package/dist/types/input/SearchInput.d.ts +1 -6
  238. package/dist/types/input/SearchInput.d.ts.map +1 -1
  239. package/dist/types/input/Textarea.d.ts +2 -6
  240. package/dist/types/input/Textarea.d.ts.map +1 -1
  241. package/dist/types/input/mention/types.d.ts +1 -2
  242. package/dist/types/input/mention/types.d.ts.map +1 -1
  243. package/dist/types/input/types.d.ts +3 -15
  244. package/dist/types/input/types.d.ts.map +1 -1
  245. package/dist/types/input/utils.d.ts +1 -26
  246. package/dist/types/input/utils.d.ts.map +1 -1
  247. package/dist/types/input-number/InputNumber.d.ts +0 -2
  248. package/dist/types/input-number/InputNumber.d.ts.map +1 -1
  249. package/dist/types/input-number/utils.d.ts +1 -1
  250. package/dist/types/lib/ContentSkeleton.d.ts +1 -1
  251. package/dist/types/lib/FloatingArrow.d.ts +0 -10
  252. package/dist/types/lib/FloatingArrow.d.ts.map +1 -1
  253. package/dist/types/lib/SkeletonDemo.d.ts +1 -1
  254. package/dist/types/lib/SkeletonSlot.d.ts +1 -1
  255. package/dist/types/lib/colorClasses.d.ts +1 -7
  256. package/dist/types/lib/colorClasses.d.ts.map +1 -1
  257. package/dist/types/lib/date/index.d.ts +1 -1
  258. package/dist/types/lib/elevationClass.d.ts +0 -8
  259. package/dist/types/lib/elevationClass.d.ts.map +1 -1
  260. package/dist/types/lib/fieldContext.d.ts +1 -1
  261. package/dist/types/lib/floating.d.ts +2 -7
  262. package/dist/types/lib/floating.d.ts.map +1 -1
  263. package/dist/types/lib/infiniteScroll.d.ts +1 -1
  264. package/dist/types/lib/linkBehavior.d.ts +1 -1
  265. package/dist/types/lib/overlay.d.ts +0 -7
  266. package/dist/types/lib/overlay.d.ts.map +1 -1
  267. package/dist/types/lib/sizeClasses.d.ts +2 -2
  268. package/dist/types/lib/skeleton.d.ts +1 -1
  269. package/dist/types/lib/storyMeta.d.ts +7 -28
  270. package/dist/types/lib/storyMeta.d.ts.map +1 -1
  271. package/dist/types/lib/storybookArgTypes.d.ts +1 -1
  272. package/dist/types/lib/useFloatingPosition.d.ts +1 -1
  273. package/dist/types/list/List.d.ts +0 -4
  274. package/dist/types/list/List.d.ts.map +1 -1
  275. package/dist/types/loading/Loading.d.ts.map +1 -1
  276. package/dist/types/loading/types.d.ts +2 -5
  277. package/dist/types/loading/types.d.ts.map +1 -1
  278. package/dist/types/loading/utils.d.ts +0 -5
  279. package/dist/types/loading/utils.d.ts.map +1 -1
  280. package/dist/types/masonry/Masonry.d.ts +0 -4
  281. package/dist/types/masonry/Masonry.d.ts.map +1 -1
  282. package/dist/types/menu/_shared/MenuLink.d.ts +0 -4
  283. package/dist/types/menu/_shared/MenuLink.d.ts.map +1 -1
  284. package/dist/types/menu/_shared/MobileNav.d.ts +0 -6
  285. package/dist/types/menu/_shared/MobileNav.d.ts.map +1 -1
  286. package/dist/types/menu/_shared/NavBar.d.ts +0 -8
  287. package/dist/types/menu/_shared/NavBar.d.ts.map +1 -1
  288. package/dist/types/menu/basic-menu/BasicMenu.d.ts +2 -16
  289. package/dist/types/menu/basic-menu/BasicMenu.d.ts.map +1 -1
  290. package/dist/types/menu/mega-menu/MegaMenu.d.ts +0 -8
  291. package/dist/types/menu/mega-menu/MegaMenu.d.ts.map +1 -1
  292. package/dist/types/menu/mega-menu/_components/MegaMenuItem.d.ts +0 -12
  293. package/dist/types/menu/mega-menu/_components/MegaMenuItem.d.ts.map +1 -1
  294. package/dist/types/menu/sidebar/Sidebar.d.ts +1 -16
  295. package/dist/types/menu/sidebar/Sidebar.d.ts.map +1 -1
  296. package/dist/types/menu/sidebar/_components/SidebarButton.d.ts +0 -6
  297. package/dist/types/menu/sidebar/_components/SidebarButton.d.ts.map +1 -1
  298. package/dist/types/menu/sidebar/_components/SidebarItem.d.ts +0 -10
  299. package/dist/types/menu/sidebar/_components/SidebarItem.d.ts.map +1 -1
  300. package/dist/types/menu/sidebar/_components/SidebarMenu.d.ts +0 -4
  301. package/dist/types/menu/sidebar/_components/SidebarMenu.d.ts.map +1 -1
  302. package/dist/types/menu/types.d.ts +2 -11
  303. package/dist/types/menu/types.d.ts.map +1 -1
  304. package/dist/types/menu/utils.d.ts +0 -22
  305. package/dist/types/menu/utils.d.ts.map +1 -1
  306. package/dist/types/modal/Modal.d.ts +1 -12
  307. package/dist/types/modal/Modal.d.ts.map +1 -1
  308. package/dist/types/modal/types.d.ts +3 -4
  309. package/dist/types/modal/types.d.ts.map +1 -1
  310. package/dist/types/modal/utils.d.ts +1 -5
  311. package/dist/types/modal/utils.d.ts.map +1 -1
  312. package/dist/types/pagination/Pagination.d.ts +2 -11
  313. package/dist/types/pagination/Pagination.d.ts.map +1 -1
  314. package/dist/types/pagination/types.d.ts +1 -1
  315. package/dist/types/pagination/types.d.ts.map +1 -1
  316. package/dist/types/pagination/utils.d.ts +5 -12
  317. package/dist/types/pagination/utils.d.ts.map +1 -1
  318. package/dist/types/popconfirm/Popconfirm.d.ts +0 -4
  319. package/dist/types/popconfirm/Popconfirm.d.ts.map +1 -1
  320. package/dist/types/popover/Popover.d.ts +0 -5
  321. package/dist/types/popover/Popover.d.ts.map +1 -1
  322. package/dist/types/progress/Progress.d.ts +0 -3
  323. package/dist/types/progress/Progress.d.ts.map +1 -1
  324. package/dist/types/qrcode/QRCode.d.ts +0 -6
  325. package/dist/types/qrcode/QRCode.d.ts.map +1 -1
  326. package/dist/types/radio/utils.d.ts +1 -1
  327. package/dist/types/segmented/Segmented.d.ts +0 -4
  328. package/dist/types/segmented/Segmented.d.ts.map +1 -1
  329. package/dist/types/select/Select.d.ts +0 -5
  330. package/dist/types/select/Select.d.ts.map +1 -1
  331. package/dist/types/select/_components/SelectPanel.d.ts +2 -3
  332. package/dist/types/select/_components/SelectPanel.d.ts.map +1 -1
  333. package/dist/types/select/types.d.ts +1 -1
  334. package/dist/types/select/types.d.ts.map +1 -1
  335. package/dist/types/skeleton/utils.d.ts.map +1 -1
  336. package/dist/types/slider/Slider.d.ts.map +1 -1
  337. package/dist/types/slider/utils.d.ts +0 -1
  338. package/dist/types/slider/utils.d.ts.map +1 -1
  339. package/dist/types/splitter/Splitter.d.ts +4 -4
  340. package/dist/types/statistic/Statistic.d.ts +1 -1
  341. package/dist/types/statistic/utils.d.ts +2 -4
  342. package/dist/types/statistic/utils.d.ts.map +1 -1
  343. package/dist/types/steps/Steps.d.ts.map +1 -1
  344. package/dist/types/steps/_components/StepsContent.d.ts +1 -10
  345. package/dist/types/steps/_components/StepsContent.d.ts.map +1 -1
  346. package/dist/types/steps/types.d.ts +1 -1
  347. package/dist/types/steps/types.d.ts.map +1 -1
  348. package/dist/types/steps/utils.d.ts +0 -9
  349. package/dist/types/steps/utils.d.ts.map +1 -1
  350. package/dist/types/switch/Switch.d.ts +1 -9
  351. package/dist/types/switch/Switch.d.ts.map +1 -1
  352. package/dist/types/switch/utils.d.ts.map +1 -1
  353. package/dist/types/table/Table.d.ts +7 -11
  354. package/dist/types/table/Table.d.ts.map +1 -1
  355. package/dist/types/table/_components/TableBody.d.ts.map +1 -1
  356. package/dist/types/table/_components/TableEditDrawer.d.ts +0 -8
  357. package/dist/types/table/_components/TableEditDrawer.d.ts.map +1 -1
  358. package/dist/types/table/_components/TableHeader.d.ts +0 -7
  359. package/dist/types/table/_components/TableHeader.d.ts.map +1 -1
  360. package/dist/types/table/_components/TableInfoValue.d.ts +0 -10
  361. package/dist/types/table/_components/TableInfoValue.d.ts.map +1 -1
  362. package/dist/types/table/_components/TablePagination.d.ts +0 -12
  363. package/dist/types/table/_components/TablePagination.d.ts.map +1 -1
  364. package/dist/types/table/_components/TableRowActions.d.ts +0 -6
  365. package/dist/types/table/_components/TableRowActions.d.ts.map +1 -1
  366. package/dist/types/table/types.d.ts +2 -18
  367. package/dist/types/table/types.d.ts.map +1 -1
  368. package/dist/types/table/utils.d.ts +1 -7
  369. package/dist/types/table/utils.d.ts.map +1 -1
  370. package/dist/types/tabs/Tabs.d.ts +0 -1
  371. package/dist/types/tabs/Tabs.d.ts.map +1 -1
  372. package/dist/types/tabs/_components/TabsContent.d.ts +0 -5
  373. package/dist/types/tabs/_components/TabsContent.d.ts.map +1 -1
  374. package/dist/types/tabs/_components/TabsList.d.ts +6 -6
  375. package/dist/types/tabs/_components/TabsTrigger.d.ts +1 -1
  376. package/dist/types/tabs/utils.d.ts +0 -5
  377. package/dist/types/tabs/utils.d.ts.map +1 -1
  378. package/dist/types/tag/utils.d.ts +0 -8
  379. package/dist/types/tag/utils.d.ts.map +1 -1
  380. package/dist/types/theme-customizer/ThemeCustomizer.d.ts +1 -1
  381. package/dist/types/timeline/Timeline.d.ts +1 -3
  382. package/dist/types/timeline/Timeline.d.ts.map +1 -1
  383. package/dist/types/toast/Toast.d.ts +2 -2
  384. package/dist/types/toast/useToast.d.ts +2 -4
  385. package/dist/types/toast/useToast.d.ts.map +1 -1
  386. package/dist/types/toast/utils.d.ts +0 -1
  387. package/dist/types/toast/utils.d.ts.map +1 -1
  388. package/dist/types/tooltip/Tooltip.d.ts.map +1 -1
  389. package/dist/types/tooltip/utils.d.ts +0 -6
  390. package/dist/types/tooltip/utils.d.ts.map +1 -1
  391. package/dist/types/tour/Tour.d.ts +0 -6
  392. package/dist/types/tour/Tour.d.ts.map +1 -1
  393. package/dist/types/tour/utils.d.ts +1 -1
  394. package/dist/types/tour/utils.d.ts.map +1 -1
  395. package/dist/types/transfer/Transfer.d.ts +0 -5
  396. package/dist/types/transfer/Transfer.d.ts.map +1 -1
  397. package/dist/types/transfer/utils.d.ts +1 -3
  398. package/dist/types/transfer/utils.d.ts.map +1 -1
  399. package/dist/types/tree/Tree.d.ts +0 -6
  400. package/dist/types/tree/Tree.d.ts.map +1 -1
  401. package/dist/types/tree/utils.d.ts +1 -1
  402. package/dist/types/tree-select/TreeSelect.d.ts +0 -6
  403. package/dist/types/tree-select/TreeSelect.d.ts.map +1 -1
  404. package/dist/types/tree-select/_components/TreeSelectPanel.d.ts +1 -1
  405. package/dist/types/tree-select/utils.d.ts +1 -1
  406. package/dist/types/typography/utils.d.ts.map +1 -1
  407. package/dist/types/upload/_components/List.d.ts +0 -7
  408. package/dist/types/upload/_components/List.d.ts.map +1 -1
  409. package/dist/types/upload/_components/ReviewList.d.ts +0 -8
  410. package/dist/types/upload/_components/ReviewList.d.ts.map +1 -1
  411. package/dist/types/upload/_components/UploadDragDropButton.d.ts +0 -8
  412. package/dist/types/upload/_components/UploadDragDropButton.d.ts.map +1 -1
  413. package/dist/types/upload/_components/UploadReviewButton.d.ts +0 -5
  414. package/dist/types/upload/_components/UploadReviewButton.d.ts.map +1 -1
  415. package/dist/types/upload/types.d.ts +5 -8
  416. package/dist/types/upload/types.d.ts.map +1 -1
  417. package/dist/types/upload/useUpload.d.ts +0 -10
  418. package/dist/types/upload/useUpload.d.ts.map +1 -1
  419. package/dist/types/upload/utils.d.ts +0 -4
  420. package/dist/types/upload/utils.d.ts.map +1 -1
  421. package/dist/typewriter.js +1 -1
  422. package/dist/typography.js +2 -2
  423. package/dist/typography.js.map +1 -1
  424. package/dist/upload.js +8 -8
  425. package/dist/upload.js.map +1 -1
  426. package/package.json +3 -3
  427. package/dist/chunk-3ABWBQCS.js.map +0 -1
  428. package/dist/chunk-47FHUOLT.js.map +0 -1
  429. package/dist/chunk-54HHEXXD.js.map +0 -1
  430. package/dist/chunk-BDV4GOEN.js.map +0 -1
  431. package/dist/chunk-CYLXW66E.js.map +0 -1
  432. package/dist/chunk-DKENCYHA.js.map +0 -1
  433. package/dist/chunk-DUCIAQGR.js.map +0 -1
  434. package/dist/chunk-ELHESRRH.js.map +0 -1
  435. package/dist/chunk-FFXRFQSU.js.map +0 -1
  436. package/dist/chunk-FNJHS5KQ.js.map +0 -1
  437. package/dist/chunk-IO4346TF.js.map +0 -1
  438. package/dist/chunk-IP2J3BWY.js.map +0 -1
  439. package/dist/chunk-JNZODUXP.js.map +0 -1
  440. package/dist/chunk-KCYM2JXP.js.map +0 -1
  441. package/dist/chunk-LBQMEHK6.js.map +0 -1
  442. package/dist/chunk-LBXIPDAB.js.map +0 -1
  443. package/dist/chunk-LEOIKO7C.js.map +0 -1
  444. package/dist/chunk-LZHERDNB.js.map +0 -1
  445. package/dist/chunk-NPM7IDYV.js.map +0 -1
  446. package/dist/chunk-NS7FKOFI.js.map +0 -1
  447. package/dist/chunk-P7Z5BREP.js.map +0 -1
  448. package/dist/chunk-QDFDMWXD.js.map +0 -1
  449. package/dist/chunk-QNOHFHVL.js.map +0 -1
  450. package/dist/chunk-QZRBO7BE.js.map +0 -1
  451. package/dist/chunk-RIBB5OJV.js.map +0 -1
  452. package/dist/chunk-S66GKX2W.js.map +0 -1
  453. package/dist/chunk-TCYDVNSU.js.map +0 -1
  454. package/dist/chunk-TXRQCHOR.js.map +0 -1
  455. package/dist/chunk-V7KDUUV6.js.map +0 -1
  456. package/dist/chunk-XUKVQO6M.js.map +0 -1
  457. package/dist/chunk-YZ7MDC6B.js.map +0 -1
  458. package/dist/chunk-ZXYQ2ZPR.js.map +0 -1
  459. /package/dist/{chunk-2IEXY3OZ.js.map → chunk-CVKAGR3D.js.map} +0 -0
@@ -2,9 +2,10 @@ import type { SkeletonableProps } from "../lib/skeleton";
2
2
  export type ListType = "list" | "review";
3
3
  export type InputType = "button" | "dragDrop" | "review";
4
4
  export type ReviewType = "square" | "circle";
5
- /** Bir dosyanın yükleme durumu — gerçek bir sunucu/`action` yok, bu yüzden
6
- * `uploading` → `done` geçişi simüle edilir (ant.design'ın kendi demo
7
- * sayfalarının da yaptığı gibi), ama UI bu durumu GERÇEKTEN render eder. */
5
+ /**
6
+ * Bir dosyanın yükleme durumu — gerçek bir sunucu/`action` yok, bu yüzden
7
+ * `uploading` → `done` geçişi simüle edilir, ama UI bu durumu GERÇEKTEN render eder.
8
+ */
8
9
  export type UploadFileStatus = "uploading" | "done";
9
10
  export interface UploadFileItem {
10
11
  file: File;
@@ -19,11 +20,7 @@ export interface UploadProps extends SkeletonableProps {
19
20
  max?: number;
20
21
  listType?: ListType;
21
22
  reviewType?: ReviewType;
22
- /**
23
- * Liste her değiştiğinde (ekleme, silme, yükleme tamamlandı) çağrılır.
24
- * `files`: listedeki dosyalar; `items`: durum/ilerleme bilgisiyle.
25
- * Eskiden HİÇ yoktu — bileşen seçilen dosyaları tüketiciye veremiyordu.
26
- */
23
+ /** Liste değişince (ekleme ya da silme) çağrılır: seçilen dosyalar ve listenin güncel hali. */
27
24
  onChange?: (files: File[], items: UploadFileItem[]) => void;
28
25
  disabled?: boolean;
29
26
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/upload/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;AACzC,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAC;AACzD,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE7C;;4EAE4E;AAC5E,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,MAAM,CAAC;AAEpD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,IAAI,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,gBAAgB,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAY,SAAQ,iBAAiB;IACpD,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,IAAI,CAAC;IAC5D,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/upload/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;AACzC,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAC;AACzD,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE7C;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,MAAM,CAAC;AAEpD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,IAAI,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,gBAAgB,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAY,SAAQ,iBAAiB;IACpD,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,UAAU,CAAC,EAAE,UAAU,CAAC;IAMxB,+FAA+F;IAC/F,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,IAAI,CAAC;IAC5D,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB"}
@@ -4,16 +4,6 @@ export interface UseUploadOptions {
4
4
  fileType?: string;
5
5
  max: number;
6
6
  }
7
- /**
8
- * Faz 13 (kullanıcı geri bildirimi — ant.design ile birebir karşılaştırma):
9
- * eskiden burada sadece çıplak `File[]` tutuluyordu, her dosya HEP "hazır"
10
- * durumundaydı — ant'ın dosya listesinin/picture-card'ının asıl karakteri
11
- * olan "yükleniyor" (ilerleme çubuğu) → "tamamlandı" geçişi hiç yoktu, tüm
12
- * dosyalar aynı anda statik görünüyordu. Gerçek bir sunucu/`action` prop'u
13
- * olmadığı için ilerleme SİMÜLE ediliyor (ant'ın kendi dokümantasyon
14
- * demoları da aynısını yapıyor) — ama durum modeli gerçek: her dosya
15
- * `uploading` → `done` arasında geçiş yapıyor, UI bunu render ediyor.
16
- */
17
7
  export declare function useUpload({ fileSize, fileType, max }: UseUploadOptions): {
18
8
  fileList: UploadFileItem[];
19
9
  setFileList: import("react").Dispatch<import("react").SetStateAction<UploadFileItem[]>>;
@@ -1 +1 @@
1
- {"version":3,"file":"useUpload.d.ts","sourceRoot":"","sources":["../../../src/upload/useUpload.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,gBAAgB;;;oBA2C9C,IAAI;sBAuBF,IAAI,EAAE;qBAKP,MAAM;EAK/B"}
1
+ {"version":3,"file":"useUpload.d.ts","sourceRoot":"","sources":["../../../src/upload/useUpload.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb;AAYD,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,gBAAgB;;;oBA2C9C,IAAI;sBAuBF,IAAI,EAAE;qBAKP,MAAM;EAK/B"}
@@ -5,10 +5,6 @@ export declare function getFileKey(file: File): string;
5
5
  /**
6
6
  * `allowedType` native `accept` sözdizimini izler: virgülle ayrılmış MIME
7
7
  * türleri ("image/png"), joker ("image/*") ve uzantılar (".png" ya da "png").
8
- *
9
- * Faz 15: eskiden yalnız TEK bir değer ve MIME alt türüyle karşılaştırma vardı —
10
- * "image/*" (en yaygın değer) her dosyayı reddediyor ("*" ≠ "png"), ".jpg"
11
- * MIME'daki "jpeg" ile eşleşmiyor, "image/png,image/jpeg" hiç çalışmıyordu.
12
8
  */
13
9
  export declare function isFileValid({ file, allowedType, maxSize, }: {
14
10
  file: File;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/upload/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAI,GAAG,MAAM,CAQ/D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAEnD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAE/C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAE7C;AAoBD;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,WAAW,EACX,OAAO,GACR,EAAE;IACD,IAAI,EAAE,IAAI,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,cAAc,GAAG,eAAe,CAAA;CAAE,CAQhE;AAED,2GAA2G;AAC3G,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAQlF"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/upload/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAI,GAAG,MAAM,CAQ/D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAEnD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAE/C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAE7C;AAyBD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,WAAW,EACX,OAAO,GACR,EAAE;IACD,IAAI,EAAE,IAAI,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,cAAc,GAAG,eAAe,CAAA;CAAE,CAQhE;AAED,2GAA2G;AAC3G,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAQlF"}
@@ -5,7 +5,7 @@ import {
5
5
  } from "./chunk-RAS77O7N.js";
6
6
  import {
7
7
  skeletonBoxProps
8
- } from "./chunk-54HHEXXD.js";
8
+ } from "./chunk-VKN374SD.js";
9
9
 
10
10
  // src/typewriter/Typewriter.tsx
11
11
  import { cn } from "@mari-ui/core";
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  textClass
3
- } from "./chunk-IP2J3BWY.js";
3
+ } from "./chunk-6AMBZXZJ.js";
4
4
  import {
5
5
  skeletonBoxProps,
6
6
  skeletonFill
7
- } from "./chunk-54HHEXXD.js";
7
+ } from "./chunk-VKN374SD.js";
8
8
 
9
9
  // src/typography/Typography.tsx
10
10
  import { cn as cn2 } from "@mari-ui/core";
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/typography/Typography.tsx","../src/typography/utils.ts"],"sourcesContent":["import React from \"react\";\nimport { cn } from \"@mari-ui/core\";\nimport { skeletonBoxProps, skeletonFill } from \"../lib/skeleton\";\nimport type { ParagraphProps, TextProps, TitleProps } from \"./types\";\nimport { getParagraphClass, getTextClass, getTitleBaseClass, getTitleClass, PARAGRAPH_BASE_CLASS } from \"./utils\";\n\n// Hook yok, browser API yok — üçü de saf sunum, \"use client\" gerekmiyor.\n\n/**\n * İskelet satırı: kutu yüksekliği tam bir satır (`1lh`) — metin yüklenince\n * blok zıplamaz; dolgu çubuğu satırın ortasında, yazı gövdesi kadar kalın.\n */\nfunction SkeletonLine({ width }: Readonly<{ width: string }>) {\n return (\n <span className=\"flex h-[1lh] items-center\">\n <span className={cn(\"h-[0.7em] rounded-sm\", skeletonFill(true), width)} />\n </span>\n );\n}\n\nexport function Text({ children, className, color, weight, muted, ellipsis, skeleton = false, ...props }: Readonly<TextProps>) {\n if (skeleton) {\n // Metin varsa şeffaf olarak yerinde kalır → iskelet tam o genişlikte. `w-fit`:\n // flex sütununda span bloklaşıp tam genişliğe uzamasın.\n return <span {...skeletonBoxProps(cn(getTextClass(undefined, weight, false, undefined, ellipsis), \"w-fit max-w-full rounded-sm\", className))}>{children ?? \" \".repeat(16)}</span>;\n }\n return (\n <span className={getTextClass(color, weight, muted, className, ellipsis)} {...props}>\n {children}\n </span>\n );\n}\n\nexport function Paragraph({ children, className, color, muted, ellipsis, skeleton = false, skeletonRows = 3, ...props }: Readonly<ParagraphProps>) {\n if (skeleton) {\n return (\n <div aria-hidden data-skeleton=\"\" className={cn(PARAGRAPH_BASE_CLASS, className)}>\n {Array.from({ length: skeletonRows }, (_, i) => (\n <SkeletonLine key={i} width={i === skeletonRows - 1 && skeletonRows > 1 ? \"w-3/5\" : \"w-full\"} />\n ))}\n </div>\n );\n }\n return (\n <p className={getParagraphClass(color, muted, className, ellipsis)} {...props}>\n {children}\n </p>\n );\n}\n\nexport function Title({ level = 1, children, className, color, ellipsis, skeleton = false, ...props }: Readonly<TitleProps>) {\n if (skeleton) {\n return (\n <div aria-hidden data-skeleton=\"\" className={cn(getTitleBaseClass(level), className)}>\n <SkeletonLine width=\"w-2/5\" />\n </div>\n );\n }\n const Heading = `h${level}` as React.ElementType;\n return (\n <Heading className={getTitleClass(level, color, className, ellipsis)} {...props}>\n {children}\n </Heading>\n );\n}\n","import { cn, type ColorRole } from \"@mari-ui/core\";\nimport { textClass } from \"../lib/colorClasses\";\nimport type { TextWeight, TitleLevel, TypographyEllipsis } from \"./types\";\n\n/**\n * Eskiden Typography'nin HİÇBİR varsayılan stili yoktu (font boyutu, ağırlık,\n * satır yüksekliği — hiçbiri). Bu, diğer component'lerin AŞIRI stillenmiş\n * olmasıyla tam ters bir dengesizlikti. Burada minimal ama tutarlı bir tip\n * skalası bağlanıyor; derin görsel yeniden tasarım kasıtlı olarak kapsam\n * dışı (plan madde 10 — kullanıcının sonraki fazlara bıraktığı iş).\n */\n// Faz 15: h1/h2/h3 mobilde bir adım küçük başlar (375px'te 30px'lik h1 iki\n// kelimede kırılıyordu); `text-balance` çok satırlı başlıkta satırları dengeler.\nconst TITLE_CLASS: Record<TitleLevel, string> = {\n 1: \"text-2xl sm:text-3xl font-semibold leading-tight tracking-tight\",\n 2: \"text-xl sm:text-2xl font-semibold leading-tight tracking-tight\",\n 3: \"text-lg sm:text-xl font-semibold leading-snug\",\n 4: \"text-lg font-semibold leading-snug\",\n 5: \"text-base font-semibold leading-normal\",\n 6: \"text-sm font-semibold leading-normal\",\n};\n\nconst WEIGHT_CLASS: Record<TextWeight, string> = {\n normal: \"font-normal\",\n medium: \"font-medium\",\n semibold: \"font-semibold\",\n bold: \"font-bold\",\n};\n\nconst LINE_CLAMP_CLASS = { 2: \"line-clamp-2\", 3: \"line-clamp-3\", 4: \"line-clamp-4\", 5: \"line-clamp-5\" } as const;\n\n/** `inline`: `Text` bir `<span>` — tek satır kısaltma için satır içi blok olmalı. */\nexport function getEllipsisClass(ellipsis: TypographyEllipsis | undefined, inline = false): string | undefined {\n if (!ellipsis) return undefined;\n if (ellipsis === true) return cn(\"truncate\", inline && \"inline-block max-w-full align-bottom\");\n return cn(LINE_CLAMP_CLASS[ellipsis.rows], inline && \"inline-block max-w-full\");\n}\n\nexport function getTitleBaseClass(level: TitleLevel): string {\n return cn(\"font-heading text-balance\", TITLE_CLASS[level]);\n}\n\nexport function getTitleClass(level: TitleLevel, color: ColorRole | undefined, className?: string, ellipsis?: TypographyEllipsis): string {\n return cn(getTitleBaseClass(level), color ? textClass[color] : \"text-mari-foreground\", getEllipsisClass(ellipsis), className);\n}\n\n/**\n * İç içe ternary yerine ayrık fonksiyon (Faz 8, SonarJS `no-nested-\n * conditional`) — `getTextClass`/`getParagraphClass`teki BİREBİR AYNI\n * mantığı da tek yerde topluyor (ikisi ayrı ayrı yazıyordu).\n */\nfunction resolveMutedOrColorClass(muted: boolean | undefined, color: ColorRole | undefined): string {\n if (muted) return \"text-mari-muted\";\n return color ? textClass[color] : \"text-mari-foreground\";\n}\n\nexport function getTextClass(\n color: ColorRole | undefined,\n weight: TextWeight | undefined,\n muted: boolean | undefined,\n className?: string,\n ellipsis?: TypographyEllipsis\n): string {\n return cn(\"text-sm leading-normal\", resolveMutedOrColorClass(muted, color), weight && WEIGHT_CLASS[weight], getEllipsisClass(ellipsis, true), className);\n}\n\nexport const PARAGRAPH_BASE_CLASS = \"text-sm leading-relaxed text-pretty\";\n\nexport function getParagraphClass(color: ColorRole | undefined, muted: boolean | undefined, className?: string, ellipsis?: TypographyEllipsis): string {\n return cn(PARAGRAPH_BASE_CLASS, resolveMutedOrColorClass(muted, color), getEllipsisClass(ellipsis), className);\n}\n"],"mappings":"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","names":["cn","cn"]}
1
+ {"version":3,"sources":["../src/typography/Typography.tsx","../src/typography/utils.ts"],"sourcesContent":["import React from \"react\";\nimport { cn } from \"@mari-ui/core\";\nimport { skeletonBoxProps, skeletonFill } from \"../lib/skeleton\";\nimport type { ParagraphProps, TextProps, TitleProps } from \"./types\";\nimport { getParagraphClass, getTextClass, getTitleBaseClass, getTitleClass, PARAGRAPH_BASE_CLASS } from \"./utils\";\n\n// Hook yok, browser API yok — üçü de saf sunum, \"use client\" gerekmiyor.\n\n/**\n * İskelet satırı: kutu yüksekliği tam bir satır (`1lh`) — metin yüklenince\n * blok zıplamaz; dolgu çubuğu satırın ortasında, yazı gövdesi kadar kalın.\n */\nfunction SkeletonLine({ width }: Readonly<{ width: string }>) {\n return (\n <span className=\"flex h-[1lh] items-center\">\n <span className={cn(\"h-[0.7em] rounded-sm\", skeletonFill(true), width)} />\n </span>\n );\n}\n\nexport function Text({ children, className, color, weight, muted, ellipsis, skeleton = false, ...props }: Readonly<TextProps>) {\n if (skeleton) {\n // Metin varsa şeffaf olarak yerinde kalır → iskelet tam o genişlikte. `w-fit`:\n // flex sütununda span bloklaşıp tam genişliğe uzamasın.\n return <span {...skeletonBoxProps(cn(getTextClass(undefined, weight, false, undefined, ellipsis), \"w-fit max-w-full rounded-sm\", className))}>{children ?? \" \".repeat(16)}</span>;\n }\n return (\n <span className={getTextClass(color, weight, muted, className, ellipsis)} {...props}>\n {children}\n </span>\n );\n}\n\nexport function Paragraph({ children, className, color, muted, ellipsis, skeleton = false, skeletonRows = 3, ...props }: Readonly<ParagraphProps>) {\n if (skeleton) {\n return (\n <div aria-hidden data-skeleton=\"\" className={cn(PARAGRAPH_BASE_CLASS, className)}>\n {Array.from({ length: skeletonRows }, (_, i) => (\n <SkeletonLine key={i} width={i === skeletonRows - 1 && skeletonRows > 1 ? \"w-3/5\" : \"w-full\"} />\n ))}\n </div>\n );\n }\n return (\n <p className={getParagraphClass(color, muted, className, ellipsis)} {...props}>\n {children}\n </p>\n );\n}\n\nexport function Title({ level = 1, children, className, color, ellipsis, skeleton = false, ...props }: Readonly<TitleProps>) {\n if (skeleton) {\n return (\n <div aria-hidden data-skeleton=\"\" className={cn(getTitleBaseClass(level), className)}>\n <SkeletonLine width=\"w-2/5\" />\n </div>\n );\n }\n const Heading = `h${level}` as React.ElementType;\n return (\n <Heading className={getTitleClass(level, color, className, ellipsis)} {...props}>\n {children}\n </Heading>\n );\n}\n","import { cn, type ColorRole } from \"@mari-ui/core\";\nimport { textClass } from \"../lib/colorClasses\";\nimport type { TextWeight, TitleLevel, TypographyEllipsis } from \"./types\";\n\n/*\n * Eskiden Typography'nin HİÇBİR varsayılan stili yoktu (font boyutu, ağırlık,\n * satır yüksekliği — hiçbiri). Bu, diğer component'lerin AŞIRI stillenmiş\n * olmasıyla tam ters bir dengesizlikti. Burada minimal ama tutarlı bir tip\n * skalası bağlanıyor; derin görsel yeniden tasarım kasıtlı olarak kapsam\n * dışı (plan madde 10 — kullanıcının sonraki fazlara bıraktığı iş).\n */\n// Faz 15: h1/h2/h3 mobilde bir adım küçük başlar (375px'te 30px'lik h1 iki\n// kelimede kırılıyordu); `text-balance` çok satırlı başlıkta satırları dengeler.\nconst TITLE_CLASS: Record<TitleLevel, string> = {\n 1: \"text-2xl sm:text-3xl font-semibold leading-tight tracking-tight\",\n 2: \"text-xl sm:text-2xl font-semibold leading-tight tracking-tight\",\n 3: \"text-lg sm:text-xl font-semibold leading-snug\",\n 4: \"text-lg font-semibold leading-snug\",\n 5: \"text-base font-semibold leading-normal\",\n 6: \"text-sm font-semibold leading-normal\",\n};\n\nconst WEIGHT_CLASS: Record<TextWeight, string> = {\n normal: \"font-normal\",\n medium: \"font-medium\",\n semibold: \"font-semibold\",\n bold: \"font-bold\",\n};\n\nconst LINE_CLAMP_CLASS = { 2: \"line-clamp-2\", 3: \"line-clamp-3\", 4: \"line-clamp-4\", 5: \"line-clamp-5\" } as const;\n\n/** `inline`: `Text` bir `<span>` — tek satır kısaltma için satır içi blok olmalı. */\nexport function getEllipsisClass(ellipsis: TypographyEllipsis | undefined, inline = false): string | undefined {\n if (!ellipsis) return undefined;\n if (ellipsis === true) return cn(\"truncate\", inline && \"inline-block max-w-full align-bottom\");\n return cn(LINE_CLAMP_CLASS[ellipsis.rows], inline && \"inline-block max-w-full\");\n}\n\nexport function getTitleBaseClass(level: TitleLevel): string {\n return cn(\"font-heading text-balance\", TITLE_CLASS[level]);\n}\n\nexport function getTitleClass(level: TitleLevel, color: ColorRole | undefined, className?: string, ellipsis?: TypographyEllipsis): string {\n return cn(getTitleBaseClass(level), color ? textClass[color] : \"text-mari-foreground\", getEllipsisClass(ellipsis), className);\n}\n\n/**\n * İç içe ternary yerine ayrık fonksiyon — `getTextClass`/`getParagraphClass`teki BİREBİR AYNI\n * mantığı da tek yerde topluyor (ikisi ayrı ayrı yazıyordu).\n */\nfunction resolveMutedOrColorClass(muted: boolean | undefined, color: ColorRole | undefined): string {\n if (muted) return \"text-mari-muted\";\n return color ? textClass[color] : \"text-mari-foreground\";\n}\n\nexport function getTextClass(\n color: ColorRole | undefined,\n weight: TextWeight | undefined,\n muted: boolean | undefined,\n className?: string,\n ellipsis?: TypographyEllipsis\n): string {\n return cn(\"text-sm leading-normal\", resolveMutedOrColorClass(muted, color), weight && WEIGHT_CLASS[weight], getEllipsisClass(ellipsis, true), className);\n}\n\nexport const PARAGRAPH_BASE_CLASS = \"text-sm leading-relaxed text-pretty\";\n\nexport function getParagraphClass(color: ColorRole | undefined, muted: boolean | undefined, className?: string, ellipsis?: TypographyEllipsis): string {\n return cn(PARAGRAPH_BASE_CLASS, resolveMutedOrColorClass(muted, color), getEllipsisClass(ellipsis), className);\n}\n"],"mappings":"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","names":["cn","cn"]}
package/dist/upload.js CHANGED
@@ -2,18 +2,18 @@
2
2
 
3
3
  import {
4
4
  useToast
5
- } from "./chunk-ELHESRRH.js";
6
- import "./chunk-V7KDUUV6.js";
7
- import "./chunk-NPM7IDYV.js";
8
- import "./chunk-XUKVQO6M.js";
5
+ } from "./chunk-7FQQRTPX.js";
6
+ import "./chunk-RMNV2CE2.js";
7
+ import "./chunk-TSFAAREV.js";
8
+ import "./chunk-6CSUVVFG.js";
9
9
  import {
10
10
  Button
11
- } from "./chunk-2IEXY3OZ.js";
12
- import "./chunk-FFXRFQSU.js";
13
- import "./chunk-IP2J3BWY.js";
11
+ } from "./chunk-CVKAGR3D.js";
12
+ import "./chunk-POBOJBNJ.js";
13
+ import "./chunk-6AMBZXZJ.js";
14
14
  import {
15
15
  skeletonBoxProps
16
- } from "./chunk-54HHEXXD.js";
16
+ } from "./chunk-VKN374SD.js";
17
17
 
18
18
  // src/upload/Upload.tsx
19
19
  import { useCallback, useEffect as useEffect3, useRef as useRef2 } from "react";
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/upload/Upload.tsx","../src/upload/_components/ReviewList.tsx","../src/upload/utils.ts","../src/upload/_components/List.tsx","../src/upload/_components/UploadListButton.tsx","../src/upload/_components/UploadDragDropButton.tsx","../src/upload/_components/UploadReviewButton.tsx","../src/upload/useUpload.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useCallback, useEffect, useRef } from \"react\";\nimport { cn } from \"@mari-ui/core\";\nimport { skeletonBoxProps } from \"../lib/skeleton\";\nimport { Button } from \"../button\";\nimport type { UploadProps } from \"./types\";\nimport { ReviewList } from \"./_components/ReviewList\";\nimport { UploadList } from \"./_components/List\";\nimport { UploadListButton } from \"./_components/UploadListButton\";\nimport { UploadDragDropButton } from \"./_components/UploadDragDropButton\";\nimport { UploadReviewButton } from \"./_components/UploadReviewButton\";\nimport { useUpload } from \"./useUpload\";\nimport { toAcceptAttribute } from \"./utils\";\n\nexport type { UploadProps };\n\nexport function Upload({\n inputType = \"button\",\n fileSize = 5 * 1024 * 1024,\n fileType,\n max = 5,\n listType = \"list\",\n reviewType = \"square\",\n onChange,\n disabled = false,\n skeleton = false,\n}: Readonly<UploadProps>) {\n const fileInputRef = useRef<HTMLInputElement>(null);\n const { fileList, deleteFile, addFiles } = useUpload({ fileSize, fileType, max });\n\n // İlk (boş) render'da değil, liste gerçekten değişince bildir.\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n const isFirst = useRef(true);\n useEffect(() => {\n if (isFirst.current) {\n isFirst.current = false;\n return;\n }\n onChangeRef.current?.(\n fileList.map((item) => item.file),\n fileList\n );\n }, [fileList]);\n\n const handleClick = useCallback(() => {\n if (!disabled) fileInputRef.current?.click();\n }, [disabled]);\n\n if (skeleton) {\n if (listType === \"review\") return <div {...skeletonBoxProps(cn(\"h-28 w-28\", reviewType === \"circle\" ? \"rounded-full\" : \"rounded-lg\"))} />;\n if (inputType === \"dragDrop\") return <div {...skeletonBoxProps(\"min-h-52 w-full rounded-lg\")} />;\n return (\n <Button skeleton variant=\"outline\" icon={<span className=\"size-4\" />}>\n Yüklemek için tıklayın\n </Button>\n );\n }\n\n // Native `accept` çıplak uzantıyı (\"png\") yok sayar — \".png\"ye çevrilir.\n const acceptAttr = toAcceptAttribute(fileType);\n\n /**\n * Eskiden sadece `files?.[0]` alınıyordu — `max > 1` olsa bile \"gözat\"\n * butonuyla asla birden fazla dosya SEÇİLEMİYORDU (native input `multiple`\n * taşımadığı için OS diyaloğu da tek seçime kilitliydi). Sürükle-bırak\n * (`addFiles`) zaten çoklu dosyayı destekliyordu — gerçek eksiklik sadece\n * tıklayarak-gözat yolundaydı.\n */\n const handleFileChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const { files } = event.target;\n if (!files || files.length === 0) return;\n addFiles(Array.from(files));\n // Aynı dosyayı ard arda seçince `onChange` tekrar tetiklensin diye sıfırla.\n event.target.value = \"\";\n };\n\n const isReview = listType === \"review\";\n\n return (\n <div className=\"flex flex-col gap-2\">\n {!isReview && (inputType === \"dragDrop\" ? <UploadDragDropButton addFiles={addFiles} handleClick={handleClick} disabled={disabled} /> : <UploadListButton handleClick={handleClick} disabled={disabled} />)}\n {/* Görsel açıdan hep gizli, programatik olarak `handleClick` ile tetiklenir\n — bu yüzden stillenmiş `Input`a değil, düz native `<input>`'a ihtiyacı var\n (`multiple`/`accept` gibi Input'un desteklemediği native attribute'lar gerekiyor). */}\n <input ref={fileInputRef} className=\"hidden\" type=\"file\" multiple={max > 1} accept={acceptAttr} onChange={handleFileChange} disabled={disabled} />\n {isReview ? (\n // ant.design'ın \"Pictures Wall\"ıyla birebir: \"ekle\" karosu küçük\n // resimlerle AYNI grid'de akar (eskiden ayrı bir satırda,\n // farklı boyutta duruyordu).\n <div className=\"flex flex-wrap gap-2\">\n {fileList.map((item) => (\n <ReviewList key={item.id} item={item} reviewType={reviewType} handleDelete={deleteFile} />\n ))}\n {fileList.length < max && <UploadReviewButton handleClick={handleClick} reviewType={reviewType} disabled={disabled} />}\n </div>\n ) : (\n <ul className=\"flex flex-col\">\n {fileList.map((item) => (\n <UploadList key={item.id} item={item} handleDelete={deleteFile} />\n ))}\n </ul>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useState } from \"react\";\nimport { EyeIcon, XIcon } from \"lucide-react\";\nimport { cn } from \"@mari-ui/core\";\nimport { Button } from \"../../button\";\nimport { getFileExtension, isImageFile } from \"../utils\";\nimport type { ReviewType, UploadFileItem } from \"../types\";\n\nexport interface ReviewListProps {\n item: UploadFileItem;\n reviewType: ReviewType;\n handleDelete: (id: string) => void;\n}\n\n/**\n * ant.design'ın \"Pictures Wall\" (picture-card) karosuyla birebir\n * karşılaştırıldı: `uploading` durumunda küçük resim yerine \"Yükleniyor...\"\n * + ince bir ilerleme çubuğu gösterilir; tamamlanınca gerçek küçük resme\n * geçer ve hover'da önizleme (yeni sekmede aç) + sil ikonları belirir\n * (eskiden sadece sil vardı). `next/image` kaldırıldı — bu paket bir\n * Next.js uygulaması değil.\n */\nexport function ReviewList({ item, reviewType, handleDelete }: Readonly<ReviewListProps>) {\n const { file, status, progress } = item;\n const extension = getFileExtension(file).toLocaleUpperCase();\n const isImage = isImageFile(file);\n const [objectUrl, setObjectUrl] = useState<string | null>(null);\n const isUploading = status === \"uploading\";\n\n useEffect(() => {\n if (!isImage) return;\n const url = URL.createObjectURL(file);\n setObjectUrl(url);\n return () => URL.revokeObjectURL(url);\n }, [file, isImage]);\n\n const shapeClass = reviewType === \"circle\" ? \"rounded-full\" : \"rounded-lg\";\n\n return (\n <div\n className={cn(\n \"group relative flex h-28 w-28 shrink-0 flex-col items-center justify-center gap-1.5 border border-mari-border bg-mari-surface-alt p-2\",\n shapeClass\n )}\n >\n {isUploading ? (\n <div className=\"flex w-full flex-col items-center gap-2 px-2\">\n <span className=\"text-xs text-mari-muted\">Yükleniyor...</span>\n <div className=\"h-0.5 w-full overflow-hidden rounded-full bg-mari-border\" role=\"progressbar\" aria-valuenow={progress} aria-valuemin={0} aria-valuemax={100}>\n <div className=\"h-full rounded-full bg-mari-primary-solid transition-all duration-200\" style={{ width: `${progress}%` }} />\n </div>\n </div>\n ) : (\n <>\n {isImage && objectUrl ? (\n <img src={objectUrl} alt={file.name} className={cn(\"h-full w-full object-cover\", shapeClass)} />\n ) : (\n <span className=\"text-2xl font-bold text-mari-primary\">{extension}</span>\n )}\n <div\n className={cn(\n \"absolute inset-0 z-10 flex items-center justify-center gap-3 bg-black/40 opacity-0 transition-opacity duration-200 group-hover:opacity-100 group-focus-within:opacity-100\",\n // Dokunmatikte hover yok: karartma yerine köşede hep görünür küçük butonlar.\n \"pointer-coarse:items-start pointer-coarse:justify-end pointer-coarse:gap-1 pointer-coarse:bg-transparent pointer-coarse:p-1 pointer-coarse:opacity-100\",\n shapeClass\n )}\n >\n {isImage && objectUrl && (\n <Button\n variant=\"ghost\"\n shape=\"circle\"\n size=\"sm\"\n className=\"text-white hover:text-white pointer-coarse:bg-black/55\"\n aria-label={`${file.name} dosyasını önizle`}\n onClick={() => window.open(objectUrl, \"_blank\", \"noopener,noreferrer\")}\n >\n <EyeIcon size={18} />\n </Button>\n )}\n <Button\n variant=\"ghost\"\n shape=\"circle\"\n size=\"sm\"\n className=\"text-white hover:text-white pointer-coarse:bg-black/55\"\n aria-label={`${file.name} dosyasını kaldır`}\n onClick={() => handleDelete(item.id)}\n >\n <XIcon size={18} />\n </Button>\n </div>\n </>\n )}\n </div>\n );\n}\n","export function formatBytes(bytes: number, decimals = 2): string {\n if (bytes === 0) return \"0 Bytes\";\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n const size = parseFloat((bytes / Math.pow(k, i)).toFixed(dm));\n return `${size} ${sizes[i] ?? \"Bytes\"}`;\n}\n\nexport function getFileExtension(file: File): string {\n return file.type.split(\"/\")[1] ?? \"\";\n}\n\nexport function isImageFile(file: File): boolean {\n return file.type.startsWith(\"image/\");\n}\n\nexport function getFileKey(file: File): string {\n return `${file.lastModified}-${file.name}`;\n}\n\n/** Dosya adının uzantısı (küçük harf, noktasız). */\nfunction nameExtension(file: File): string {\n const dot = file.name.lastIndexOf(\".\");\n return dot > 0 ? file.name.slice(dot + 1).toLowerCase() : \"\";\n}\n\nconst EXTENSION_ALIASES: Record<string, string> = { jpg: \"jpeg\", jpeg: \"jpg\", tif: \"tiff\", tiff: \"tif\" };\n\n/** Tek bir `accept` belirteciyle eşleşme: \"image/*\", \"image/png\", \".png\" ya da \"png\". */\nfunction matchesAcceptToken(file: File, token: string): boolean {\n const type = file.type.toLowerCase();\n if (token.endsWith(\"/*\")) return type.startsWith(token.slice(0, -1));\n if (token.includes(\"/\")) return type === token;\n const ext = token.replace(/^\\./, \"\");\n const candidates = new Set([nameExtension(file), getFileExtension(file).toLowerCase()]);\n return candidates.has(ext) || candidates.has(EXTENSION_ALIASES[ext] ?? \"\");\n}\n\n/**\n * `allowedType` native `accept` sözdizimini izler: virgülle ayrılmış MIME\n * türleri (\"image/png\"), joker (\"image/*\") ve uzantılar (\".png\" ya da \"png\").\n *\n * Faz 15: eskiden yalnız TEK bir değer ve MIME alt türüyle karşılaştırma vardı —\n * \"image/*\" (en yaygın değer) her dosyayı reddediyor (\"*\" ≠ \"png\"), \".jpg\"\n * MIME'daki \"jpeg\" ile eşleşmiyor, \"image/png,image/jpeg\" hiç çalışmıyordu.\n */\nexport function isFileValid({\n file,\n allowedType,\n maxSize,\n}: {\n file: File;\n allowedType?: string;\n maxSize?: number;\n}): { valid: boolean; reason?: \"invalid-type\" | \"size-exceeded\" } {\n const tokens = (allowedType ?? \"\")\n .split(\",\")\n .map((t) => t.trim().toLowerCase())\n .filter(Boolean);\n if (tokens.length > 0 && !tokens.some((t) => matchesAcceptToken(file, t))) return { valid: false, reason: \"invalid-type\" };\n if (maxSize && file.size > maxSize) return { valid: false, reason: \"size-exceeded\" };\n return { valid: true };\n}\n\n/** `fileType` → native `accept` özniteliği (çıplak \"png\" → \".png\"; tarayıcı çıplak uzantıyı yok sayar). */\nexport function toAcceptAttribute(fileType: string | undefined): string | undefined {\n if (!fileType) return undefined;\n return fileType\n .split(\",\")\n .map((t) => t.trim())\n .filter(Boolean)\n .map((t) => (t.includes(\"/\") || t.startsWith(\".\") ? t : `.${t}`))\n .join(\",\");\n}\n","import React from \"react\";\nimport { PaperclipIcon, XIcon } from \"lucide-react\";\nimport { cn } from \"@mari-ui/core\";\nimport { Button } from \"../../button\";\nimport type { UploadFileItem } from \"../types\";\n\nexport interface UploadListProps {\n item: UploadFileItem;\n handleDelete: (id: string) => void;\n}\n\n/**\n * ant.design'ın varsayılan dosya listesiyle birebir karşılaştırıldı: satır\n * sadece ataç ikonu + dosya adından oluşur (uzantı/boyut AYRICA yazılmaz —\n * eskiden \"ad.ext (UZANTI) (boyut)\" şeklinde kalabalıktı). Silme ikonu\n * SADECE satır hover'ındayken görünür (eskiden hep görünürdü). `uploading`\n * durumunda satırın altında ince bir ilerleme çubuğu belirir.\n */\nexport function UploadList({ item, handleDelete }: Readonly<UploadListProps>) {\n const isUploading = item.status === \"uploading\";\n\n return (\n <li className=\"group flex flex-col gap-1 rounded-sm px-2 py-1 hover:bg-mari-surface-alt\">\n <span className=\"flex items-center justify-between gap-2 text-sm\">\n <span className=\"flex min-w-0 items-center gap-1.5 text-mari-foreground\">\n <PaperclipIcon size={14} className={cn(\"shrink-0\", isUploading ? \"text-mari-primary\" : \"text-mari-muted\")} />\n <span className=\"truncate\">{item.file.name}</span>\n </span>\n <Button\n variant=\"ghost\"\n color=\"neutral\"\n size=\"sm\"\n shape=\"circle\"\n // Dokunmatikte hover yok — sil butonu orada hep görünür (eskiden görünmez ama dokunulabilir bir hedefti).\n className=\"shrink-0 opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 pointer-coarse:opacity-100\"\n aria-label={`${item.file.name} dosyasını kaldır`}\n onClick={() => handleDelete(item.id)}\n >\n <XIcon size={14} />\n </Button>\n </span>\n {isUploading && (\n <div className=\"h-0.5 w-full overflow-hidden rounded-full bg-mari-border\" role=\"progressbar\" aria-valuenow={item.progress} aria-valuemin={0} aria-valuemax={100}>\n <div className=\"h-full rounded-full bg-mari-primary-solid transition-all duration-200\" style={{ width: `${item.progress}%` }} />\n </div>\n )}\n </li>\n );\n}\n","import React from \"react\";\nimport { UploadIcon } from \"lucide-react\";\nimport { Button } from \"../../button\";\n\nexport interface UploadListButtonProps {\n handleClick: () => void;\n disabled?: boolean;\n}\n\nexport function UploadListButton({ handleClick, disabled }: Readonly<UploadListButtonProps>) {\n return (\n // `self-start` — ant.design'ın butonu da içeriği kadar geniştir; flex-col\n // ebeveynin `align-items: stretch` varsayılanı (Faz 13'te fark edildi)\n // butonu tam genişliğe geriyor, ikon/metni köşelere itip garip\n // görünmesine sebep oluyordu.\n <Button onClick={handleClick} disabled={disabled} className=\"self-start\" variant=\"outline\" color=\"primary\" icon={<UploadIcon size={16} />}>\n Yüklemek için tıklayın\n </Button>\n );\n}\n","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { InboxIcon } from \"lucide-react\";\nimport { cn } from \"@mari-ui/core\";\n\nexport interface UploadDragDropButtonProps {\n handleClick: () => void;\n addFiles: (files: File[]) => void;\n disabled?: boolean;\n}\n\n/**\n * ant.design'ın sürükle-bırak alanıyla birebir karşılaştırıldı: büyük,\n * renkli bir \"gelen kutusu\" ikonu + kalın bir ana başlık + soluk bir\n * ikincil ipucu satırı. Eskiden küçük generik bir `UploadIcon` + tek satır\n * metin vardı. Sürükleme sırasında kenarlık primary'e döner (ant'ın\n * `dragover` durumu) — eskiden sadece `hover:` vardı, gerçek sürükleme\n * anında görsel geri bildirim yoktu.\n */\nexport function UploadDragDropButton({ handleClick, addFiles, disabled = false }: Readonly<UploadDragDropButtonProps>) {\n const [isDragOver, setIsDragOver] = useState(false);\n\n const handleDrop = (event: React.DragEvent<HTMLElement>) => {\n event.preventDefault();\n setIsDragOver(false);\n if (disabled) return;\n addFiles(Array.from(event.dataTransfer.files));\n };\n\n const handleDragOver = (event: React.DragEvent<HTMLElement>) => {\n event.preventDefault();\n setIsDragOver(true);\n };\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled}\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n onDragLeave={() => setIsDragOver(false)}\n className={cn(\n \"flex w-full min-h-52 cursor-pointer flex-col items-center justify-center gap-2 rounded-lg border border-dashed bg-mari-surface-alt p-6 text-center transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-mari-ring sm:p-8\",\n isDragOver ? \"border-mari-primary bg-mari-primary-subtle\" : \"border-mari-input hover:border-mari-primary\",\n disabled && \"cursor-not-allowed opacity-50 hover:border-mari-input\"\n )}\n >\n <InboxIcon size={40} className=\"text-mari-primary\" />\n {/* Dokunmatikte sürükle-bırak yok — metin cihaza göre. */}\n <span className=\"text-base text-mari-foreground pointer-coarse:hidden\">Yüklemek için tıklayın veya dosyayı buraya sürükleyin</span>\n <span className=\"hidden text-base text-mari-foreground pointer-coarse:inline\">Dosya seçmek için dokunun</span>\n <span className=\"text-sm text-mari-muted\">Tek seferde bir veya birden fazla dosya yükleyebilirsiniz.</span>\n </button>\n );\n}\n","import React from \"react\";\nimport { PlusIcon } from \"lucide-react\";\nimport { cn } from \"@mari-ui/core\";\nimport { Button } from \"../../button\";\nimport type { ReviewType } from \"../types\";\n\nexport interface UploadReviewButtonProps {\n handleClick: () => void;\n reviewType: ReviewType;\n disabled?: boolean;\n}\n\n/**\n * ant.design'ın \"Pictures Wall\" karosuyla AYNI boyutta (`h-28 w-28`) —\n * eskiden ayrı bir satırda/boyutta duruyordu, artık küçük resimlerle AYNI\n * grid'e (bkz. `Upload.tsx`) akıp aynı boyutta bir \"ekle\" karosu oluyor.\n */\nexport function UploadReviewButton({ handleClick, reviewType, disabled }: Readonly<UploadReviewButtonProps>) {\n return (\n <Button\n onClick={handleClick}\n disabled={disabled}\n variant=\"ghost\"\n color=\"neutral\"\n icon={<PlusIcon size={18} />}\n className={cn(\n \"h-28 w-28 shrink-0 flex-col gap-1 border border-dashed border-mari-border bg-mari-surface-alt hover:border-mari-primary-border hover:text-mari-primary\",\n reviewType === \"circle\" ? \"rounded-full\" : \"rounded-lg\"\n )}\n >\n <span className=\"text-xs\">Yükle</span>\n </Button>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { useToast } from \"../toast\";\nimport { formatBytes, getFileExtension, getFileKey, isFileValid } from \"./utils\";\nimport type { UploadFileItem } from \"./types\";\n\nexport interface UseUploadOptions {\n fileSize: number;\n fileType?: string;\n max: number;\n}\n\n/**\n * Faz 13 (kullanıcı geri bildirimi — ant.design ile birebir karşılaştırma):\n * eskiden burada sadece çıplak `File[]` tutuluyordu, her dosya HEP \"hazır\"\n * durumundaydı — ant'ın dosya listesinin/picture-card'ının asıl karakteri\n * olan \"yükleniyor\" (ilerleme çubuğu) → \"tamamlandı\" geçişi hiç yoktu, tüm\n * dosyalar aynı anda statik görünüyordu. Gerçek bir sunucu/`action` prop'u\n * olmadığı için ilerleme SİMÜLE ediliyor (ant'ın kendi dokümantasyon\n * demoları da aynısını yapıyor) — ama durum modeli gerçek: her dosya\n * `uploading` → `done` arasında geçiş yapıyor, UI bunu render ediyor.\n */\nexport function useUpload({ fileSize, fileType, max }: UseUploadOptions) {\n const [fileList, setFileList] = useState<UploadFileItem[]>([]);\n const { showToast } = useToast();\n const timersRef = useRef<Set<ReturnType<typeof setInterval>>>(new Set());\n\n useEffect(() => {\n const timers = timersRef.current;\n return () => {\n timers.forEach(clearInterval);\n };\n }, []);\n\n // Sabit bir artışla ilerliyor (rastgele değil) — güvenlik açısından hassas\n // olmayan salt görsel bir simülasyon için bile `Math.random()` SonarJS'in\n // \"pseudo-random\" uyarısını tetikliyor; deterministik artış hem uyarıyı\n // ortadan kaldırıyor hem test edilebilirliği artırıyor. `setInterval`'ın\n // içine doğrudan iç içe yazmak yerine (SonarJS'in izin verdiği içiçe\n // fonksiyon derinliğini aşıyordu) ayrı, adlandırılmış bir fonksiyon.\n const PROGRESS_STEP = 22;\n const TICK_MS = 250;\n // 100/22 ≈ 5 tick'te tamamlanır; interval'i temizlemek için biraz payla.\n const TICKS_TO_COMPLETE = Math.ceil(100 / PROGRESS_STEP) + 1;\n\n const advanceItem = (item: UploadFileItem, targetId: string): UploadFileItem => {\n if (item.id !== targetId || item.status !== \"uploading\") return item;\n const nextProgress = Math.min(100, item.progress + PROGRESS_STEP);\n return nextProgress >= 100 ? { ...item, progress: 100, status: \"done\" } : { ...item, progress: nextProgress };\n };\n\n const advanceFileList = (prev: UploadFileItem[], targetId: string): UploadFileItem[] => prev.map((item) => advanceItem(item, targetId));\n\n const simulateUpload = (id: string) => {\n const tick = () => setFileList((prev) => advanceFileList(prev, id));\n const interval = setInterval(tick, TICK_MS);\n timersRef.current.add(interval);\n\n const stop = () => {\n clearInterval(interval);\n timersRef.current.delete(interval);\n };\n setTimeout(stop, TICK_MS * TICKS_TO_COMPLETE);\n };\n\n const addFile = (file: File) => {\n const extension = getFileExtension(file);\n const { valid, reason } = isFileValid({ file, allowedType: fileType, maxSize: fileSize });\n\n if (!valid) {\n showToast({\n title: \"Geçersiz dosya\",\n description: reason === \"invalid-type\" ? `.${extension} dosya türüne izin verilmiyor.` : `Dosya boyutu çok büyük (${formatBytes(file.size)})`,\n type: \"error\",\n });\n return;\n }\n\n if (fileList.length >= max) {\n showToast({ title: \"Hata\", description: `En fazla ${max} dosya yükleyebilirsiniz.`, type: \"error\" });\n return;\n }\n\n const id = getFileKey(file);\n setFileList((prev) => [...prev, { file, id, status: \"uploading\", progress: 0 }]);\n simulateUpload(id);\n };\n\n const addFiles = (files: File[]) => {\n const remaining = max - fileList.length;\n files.slice(0, remaining).forEach((file) => addFile(file));\n };\n\n const deleteFile = (id: string) => {\n setFileList((prev) => prev.filter((item) => item.id !== id));\n };\n\n return { fileList, setFileList, addFile, addFiles, deleteFile };\n}\n"],"mappings":"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","names":["useEffect","useRef","cn","XIcon","cn","jsx","jsxs","cn","XIcon","jsx","useState","cn","jsx","jsxs","cn","jsx","cn","useEffect","useState","useState","useEffect","jsx","jsxs","useRef","useEffect","cn"]}
1
+ {"version":3,"sources":["../src/upload/Upload.tsx","../src/upload/_components/ReviewList.tsx","../src/upload/utils.ts","../src/upload/_components/List.tsx","../src/upload/_components/UploadListButton.tsx","../src/upload/_components/UploadDragDropButton.tsx","../src/upload/_components/UploadReviewButton.tsx","../src/upload/useUpload.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useCallback, useEffect, useRef } from \"react\";\nimport { cn } from \"@mari-ui/core\";\nimport { skeletonBoxProps } from \"../lib/skeleton\";\nimport { Button } from \"../button\";\nimport type { UploadProps } from \"./types\";\nimport { ReviewList } from \"./_components/ReviewList\";\nimport { UploadList } from \"./_components/List\";\nimport { UploadListButton } from \"./_components/UploadListButton\";\nimport { UploadDragDropButton } from \"./_components/UploadDragDropButton\";\nimport { UploadReviewButton } from \"./_components/UploadReviewButton\";\nimport { useUpload } from \"./useUpload\";\nimport { toAcceptAttribute } from \"./utils\";\n\nexport type { UploadProps };\n\nexport function Upload({\n inputType = \"button\",\n fileSize = 5 * 1024 * 1024,\n fileType,\n max = 5,\n listType = \"list\",\n reviewType = \"square\",\n onChange,\n disabled = false,\n skeleton = false,\n}: Readonly<UploadProps>) {\n const fileInputRef = useRef<HTMLInputElement>(null);\n const { fileList, deleteFile, addFiles } = useUpload({ fileSize, fileType, max });\n\n // İlk (boş) render'da değil, liste gerçekten değişince bildir.\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n const isFirst = useRef(true);\n useEffect(() => {\n if (isFirst.current) {\n isFirst.current = false;\n return;\n }\n onChangeRef.current?.(\n fileList.map((item) => item.file),\n fileList\n );\n }, [fileList]);\n\n const handleClick = useCallback(() => {\n if (!disabled) fileInputRef.current?.click();\n }, [disabled]);\n\n if (skeleton) {\n if (listType === \"review\") return <div {...skeletonBoxProps(cn(\"h-28 w-28\", reviewType === \"circle\" ? \"rounded-full\" : \"rounded-lg\"))} />;\n if (inputType === \"dragDrop\") return <div {...skeletonBoxProps(\"min-h-52 w-full rounded-lg\")} />;\n return (\n <Button skeleton variant=\"outline\" icon={<span className=\"size-4\" />}>\n Yüklemek için tıklayın\n </Button>\n );\n }\n\n // Native `accept` çıplak uzantıyı (\"png\") yok sayar — \".png\"ye çevrilir.\n const acceptAttr = toAcceptAttribute(fileType);\n\n /*\n * Eskiden sadece `files?.[0]` alınıyordu — `max > 1` olsa bile \"gözat\"\n * butonuyla asla birden fazla dosya SEÇİLEMİYORDU (native input `multiple`\n * taşımadığı için OS diyaloğu da tek seçime kilitliydi). Sürükle-bırak\n * (`addFiles`) zaten çoklu dosyayı destekliyordu — gerçek eksiklik sadece\n * tıklayarak-gözat yolundaydı.\n */\n const handleFileChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const { files } = event.target;\n if (!files || files.length === 0) return;\n addFiles(Array.from(files));\n // Aynı dosyayı ard arda seçince `onChange` tekrar tetiklensin diye sıfırla.\n event.target.value = \"\";\n };\n\n const isReview = listType === \"review\";\n\n return (\n <div className=\"flex flex-col gap-2\">\n {!isReview && (inputType === \"dragDrop\" ? <UploadDragDropButton addFiles={addFiles} handleClick={handleClick} disabled={disabled} /> : <UploadListButton handleClick={handleClick} disabled={disabled} />)}\n {/* Görsel açıdan hep gizli, programatik olarak `handleClick` ile tetiklenir\n — bu yüzden stillenmiş `Input`a değil, düz native `<input>`'a ihtiyacı var\n (`multiple`/`accept` gibi Input'un desteklemediği native attribute'lar gerekiyor). */}\n <input ref={fileInputRef} className=\"hidden\" type=\"file\" multiple={max > 1} accept={acceptAttr} onChange={handleFileChange} disabled={disabled} />\n {isReview ? (\n // ant.design'ın \"Pictures Wall\"ıyla birebir: \"ekle\" karosu küçük\n // resimlerle AYNI grid'de akar (eskiden ayrı bir satırda,\n // farklı boyutta duruyordu).\n <div className=\"flex flex-wrap gap-2\">\n {fileList.map((item) => (\n <ReviewList key={item.id} item={item} reviewType={reviewType} handleDelete={deleteFile} />\n ))}\n {fileList.length < max && <UploadReviewButton handleClick={handleClick} reviewType={reviewType} disabled={disabled} />}\n </div>\n ) : (\n <ul className=\"flex flex-col\">\n {fileList.map((item) => (\n <UploadList key={item.id} item={item} handleDelete={deleteFile} />\n ))}\n </ul>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useState } from \"react\";\nimport { EyeIcon, XIcon } from \"lucide-react\";\nimport { cn } from \"@mari-ui/core\";\nimport { Button } from \"../../button\";\nimport { getFileExtension, isImageFile } from \"../utils\";\nimport type { ReviewType, UploadFileItem } from \"../types\";\n\nexport interface ReviewListProps {\n item: UploadFileItem;\n reviewType: ReviewType;\n handleDelete: (id: string) => void;\n}\n\n/*\n * ant.design'ın \"Pictures Wall\" (picture-card) karosuyla birebir\n * karşılaştırıldı: `uploading` durumunda küçük resim yerine \"Yükleniyor...\"\n * + ince bir ilerleme çubuğu gösterilir; tamamlanınca gerçek küçük resme\n * geçer ve hover'da önizleme (yeni sekmede aç) + sil ikonları belirir\n * (eskiden sadece sil vardı). `next/image` kaldırıldı — bu paket bir\n * Next.js uygulaması değil.\n */\nexport function ReviewList({ item, reviewType, handleDelete }: Readonly<ReviewListProps>) {\n const { file, status, progress } = item;\n const extension = getFileExtension(file).toLocaleUpperCase();\n const isImage = isImageFile(file);\n const [objectUrl, setObjectUrl] = useState<string | null>(null);\n const isUploading = status === \"uploading\";\n\n useEffect(() => {\n if (!isImage) return;\n const url = URL.createObjectURL(file);\n setObjectUrl(url);\n return () => URL.revokeObjectURL(url);\n }, [file, isImage]);\n\n const shapeClass = reviewType === \"circle\" ? \"rounded-full\" : \"rounded-lg\";\n\n return (\n <div\n className={cn(\n \"group relative flex h-28 w-28 shrink-0 flex-col items-center justify-center gap-1.5 border border-mari-border bg-mari-surface-alt p-2\",\n shapeClass\n )}\n >\n {isUploading ? (\n <div className=\"flex w-full flex-col items-center gap-2 px-2\">\n <span className=\"text-xs text-mari-muted\">Yükleniyor...</span>\n <div className=\"h-0.5 w-full overflow-hidden rounded-full bg-mari-border\" role=\"progressbar\" aria-valuenow={progress} aria-valuemin={0} aria-valuemax={100}>\n <div className=\"h-full rounded-full bg-mari-primary-solid transition-all duration-200\" style={{ width: `${progress}%` }} />\n </div>\n </div>\n ) : (\n <>\n {isImage && objectUrl ? (\n <img src={objectUrl} alt={file.name} className={cn(\"h-full w-full object-cover\", shapeClass)} />\n ) : (\n <span className=\"text-2xl font-bold text-mari-primary\">{extension}</span>\n )}\n <div\n className={cn(\n \"absolute inset-0 z-10 flex items-center justify-center gap-3 bg-black/40 opacity-0 transition-opacity duration-200 group-hover:opacity-100 group-focus-within:opacity-100\",\n // Dokunmatikte hover yok: karartma yerine köşede hep görünür küçük butonlar.\n \"pointer-coarse:items-start pointer-coarse:justify-end pointer-coarse:gap-1 pointer-coarse:bg-transparent pointer-coarse:p-1 pointer-coarse:opacity-100\",\n shapeClass\n )}\n >\n {isImage && objectUrl && (\n <Button\n variant=\"ghost\"\n shape=\"circle\"\n size=\"sm\"\n className=\"text-white hover:text-white pointer-coarse:bg-black/55\"\n aria-label={`${file.name} dosyasını önizle`}\n onClick={() => window.open(objectUrl, \"_blank\", \"noopener,noreferrer\")}\n >\n <EyeIcon size={18} />\n </Button>\n )}\n <Button\n variant=\"ghost\"\n shape=\"circle\"\n size=\"sm\"\n className=\"text-white hover:text-white pointer-coarse:bg-black/55\"\n aria-label={`${file.name} dosyasını kaldır`}\n onClick={() => handleDelete(item.id)}\n >\n <XIcon size={18} />\n </Button>\n </div>\n </>\n )}\n </div>\n );\n}\n","export function formatBytes(bytes: number, decimals = 2): string {\n if (bytes === 0) return \"0 Bytes\";\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n const size = parseFloat((bytes / Math.pow(k, i)).toFixed(dm));\n return `${size} ${sizes[i] ?? \"Bytes\"}`;\n}\n\nexport function getFileExtension(file: File): string {\n return file.type.split(\"/\")[1] ?? \"\";\n}\n\nexport function isImageFile(file: File): boolean {\n return file.type.startsWith(\"image/\");\n}\n\nexport function getFileKey(file: File): string {\n return `${file.lastModified}-${file.name}`;\n}\n\n/** Dosya adının uzantısı (küçük harf, noktasız). */\nfunction nameExtension(file: File): string {\n const dot = file.name.lastIndexOf(\".\");\n return dot > 0 ? file.name.slice(dot + 1).toLowerCase() : \"\";\n}\n\nconst EXTENSION_ALIASES: Record<string, string> = { jpg: \"jpeg\", jpeg: \"jpg\", tif: \"tiff\", tiff: \"tif\" };\n\n/** Tek bir `accept` belirteciyle eşleşme: \"image/*\", \"image/png\", \".png\" ya da \"png\". */\nfunction matchesAcceptToken(file: File, token: string): boolean {\n const type = file.type.toLowerCase();\n if (token.endsWith(\"/*\")) return type.startsWith(token.slice(0, -1));\n if (token.includes(\"/\")) return type === token;\n const ext = token.replace(/^\\./, \"\");\n const candidates = new Set([nameExtension(file), getFileExtension(file).toLowerCase()]);\n return candidates.has(ext) || candidates.has(EXTENSION_ALIASES[ext] ?? \"\");\n}\n\n/*\n * eskiden yalnız TEK bir değer ve MIME alt türüyle karşılaştırma vardı —\n * \"image/*\" (en yaygın değer) her dosyayı reddediyor (\"*\" ≠ \"png\"), \".jpg\"\n * MIME'daki \"jpeg\" ile eşleşmiyor, \"image/png,image/jpeg\" hiç çalışmıyordu.\n */\n/**\n * `allowedType` native `accept` sözdizimini izler: virgülle ayrılmış MIME\n * türleri (\"image/png\"), joker (\"image/*\") ve uzantılar (\".png\" ya da \"png\").\n */\nexport function isFileValid({\n file,\n allowedType,\n maxSize,\n}: {\n file: File;\n allowedType?: string;\n maxSize?: number;\n}): { valid: boolean; reason?: \"invalid-type\" | \"size-exceeded\" } {\n const tokens = (allowedType ?? \"\")\n .split(\",\")\n .map((t) => t.trim().toLowerCase())\n .filter(Boolean);\n if (tokens.length > 0 && !tokens.some((t) => matchesAcceptToken(file, t))) return { valid: false, reason: \"invalid-type\" };\n if (maxSize && file.size > maxSize) return { valid: false, reason: \"size-exceeded\" };\n return { valid: true };\n}\n\n/** `fileType` → native `accept` özniteliği (çıplak \"png\" → \".png\"; tarayıcı çıplak uzantıyı yok sayar). */\nexport function toAcceptAttribute(fileType: string | undefined): string | undefined {\n if (!fileType) return undefined;\n return fileType\n .split(\",\")\n .map((t) => t.trim())\n .filter(Boolean)\n .map((t) => (t.includes(\"/\") || t.startsWith(\".\") ? t : `.${t}`))\n .join(\",\");\n}\n","import React from \"react\";\nimport { PaperclipIcon, XIcon } from \"lucide-react\";\nimport { cn } from \"@mari-ui/core\";\nimport { Button } from \"../../button\";\nimport type { UploadFileItem } from \"../types\";\n\nexport interface UploadListProps {\n item: UploadFileItem;\n handleDelete: (id: string) => void;\n}\n\n/*\n * ant.design'ın varsayılan dosya listesiyle birebir karşılaştırıldı: satır\n * sadece ataç ikonu + dosya adından oluşur (uzantı/boyut AYRICA yazılmaz —\n * eskiden \"ad.ext (UZANTI) (boyut)\" şeklinde kalabalıktı). Silme ikonu\n * SADECE satır hover'ındayken görünür (eskiden hep görünürdü). `uploading`\n * durumunda satırın altında ince bir ilerleme çubuğu belirir.\n */\nexport function UploadList({ item, handleDelete }: Readonly<UploadListProps>) {\n const isUploading = item.status === \"uploading\";\n\n return (\n <li className=\"group flex flex-col gap-1 rounded-sm px-2 py-1 hover:bg-mari-surface-alt\">\n <span className=\"flex items-center justify-between gap-2 text-sm\">\n <span className=\"flex min-w-0 items-center gap-1.5 text-mari-foreground\">\n <PaperclipIcon size={14} className={cn(\"shrink-0\", isUploading ? \"text-mari-primary\" : \"text-mari-muted\")} />\n <span className=\"truncate\">{item.file.name}</span>\n </span>\n <Button\n variant=\"ghost\"\n color=\"neutral\"\n size=\"sm\"\n shape=\"circle\"\n // Dokunmatikte hover yok — sil butonu orada hep görünür (eskiden görünmez ama dokunulabilir bir hedefti).\n className=\"shrink-0 opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 pointer-coarse:opacity-100\"\n aria-label={`${item.file.name} dosyasını kaldır`}\n onClick={() => handleDelete(item.id)}\n >\n <XIcon size={14} />\n </Button>\n </span>\n {isUploading && (\n <div className=\"h-0.5 w-full overflow-hidden rounded-full bg-mari-border\" role=\"progressbar\" aria-valuenow={item.progress} aria-valuemin={0} aria-valuemax={100}>\n <div className=\"h-full rounded-full bg-mari-primary-solid transition-all duration-200\" style={{ width: `${item.progress}%` }} />\n </div>\n )}\n </li>\n );\n}\n","import React from \"react\";\nimport { UploadIcon } from \"lucide-react\";\nimport { Button } from \"../../button\";\n\nexport interface UploadListButtonProps {\n handleClick: () => void;\n disabled?: boolean;\n}\n\nexport function UploadListButton({ handleClick, disabled }: Readonly<UploadListButtonProps>) {\n return (\n // `self-start` — ant.design'ın butonu da içeriği kadar geniştir; flex-col\n // ebeveynin `align-items: stretch` varsayılanı (Faz 13'te fark edildi)\n // butonu tam genişliğe geriyor, ikon/metni köşelere itip garip\n // görünmesine sebep oluyordu.\n <Button onClick={handleClick} disabled={disabled} className=\"self-start\" variant=\"outline\" color=\"primary\" icon={<UploadIcon size={16} />}>\n Yüklemek için tıklayın\n </Button>\n );\n}\n","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { InboxIcon } from \"lucide-react\";\nimport { cn } from \"@mari-ui/core\";\n\nexport interface UploadDragDropButtonProps {\n handleClick: () => void;\n addFiles: (files: File[]) => void;\n disabled?: boolean;\n}\n\n/*\n * ant.design'ın sürükle-bırak alanıyla birebir karşılaştırıldı: büyük,\n * renkli bir \"gelen kutusu\" ikonu + kalın bir ana başlık + soluk bir\n * ikincil ipucu satırı. Eskiden küçük generik bir `UploadIcon` + tek satır\n * metin vardı. Sürükleme sırasında kenarlık primary'e döner (ant'ın\n * `dragover` durumu) — eskiden sadece `hover:` vardı, gerçek sürükleme\n * anında görsel geri bildirim yoktu.\n */\nexport function UploadDragDropButton({ handleClick, addFiles, disabled = false }: Readonly<UploadDragDropButtonProps>) {\n const [isDragOver, setIsDragOver] = useState(false);\n\n const handleDrop = (event: React.DragEvent<HTMLElement>) => {\n event.preventDefault();\n setIsDragOver(false);\n if (disabled) return;\n addFiles(Array.from(event.dataTransfer.files));\n };\n\n const handleDragOver = (event: React.DragEvent<HTMLElement>) => {\n event.preventDefault();\n setIsDragOver(true);\n };\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled}\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n onDragLeave={() => setIsDragOver(false)}\n className={cn(\n \"flex w-full min-h-52 cursor-pointer flex-col items-center justify-center gap-2 rounded-lg border border-dashed bg-mari-surface-alt p-6 text-center transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-mari-ring sm:p-8\",\n isDragOver ? \"border-mari-primary bg-mari-primary-subtle\" : \"border-mari-input hover:border-mari-primary\",\n disabled && \"cursor-not-allowed opacity-50 hover:border-mari-input\"\n )}\n >\n <InboxIcon size={40} className=\"text-mari-primary\" />\n {/* Dokunmatikte sürükle-bırak yok — metin cihaza göre. */}\n <span className=\"text-base text-mari-foreground pointer-coarse:hidden\">Yüklemek için tıklayın veya dosyayı buraya sürükleyin</span>\n <span className=\"hidden text-base text-mari-foreground pointer-coarse:inline\">Dosya seçmek için dokunun</span>\n <span className=\"text-sm text-mari-muted\">Tek seferde bir veya birden fazla dosya yükleyebilirsiniz.</span>\n </button>\n );\n}\n","import React from \"react\";\nimport { PlusIcon } from \"lucide-react\";\nimport { cn } from \"@mari-ui/core\";\nimport { Button } from \"../../button\";\nimport type { ReviewType } from \"../types\";\n\nexport interface UploadReviewButtonProps {\n handleClick: () => void;\n reviewType: ReviewType;\n disabled?: boolean;\n}\n\n/*\n * ant.design'ın \"Pictures Wall\" karosuyla AYNI boyutta (`h-28 w-28`) —\n * eskiden ayrı bir satırda/boyutta duruyordu, artık küçük resimlerle AYNI\n * grid'e (bkz. `Upload.tsx`) akıp aynı boyutta bir \"ekle\" karosu oluyor.\n */\nexport function UploadReviewButton({ handleClick, reviewType, disabled }: Readonly<UploadReviewButtonProps>) {\n return (\n <Button\n onClick={handleClick}\n disabled={disabled}\n variant=\"ghost\"\n color=\"neutral\"\n icon={<PlusIcon size={18} />}\n className={cn(\n \"h-28 w-28 shrink-0 flex-col gap-1 border border-dashed border-mari-border bg-mari-surface-alt hover:border-mari-primary-border hover:text-mari-primary\",\n reviewType === \"circle\" ? \"rounded-full\" : \"rounded-lg\"\n )}\n >\n <span className=\"text-xs\">Yükle</span>\n </Button>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { useToast } from \"../toast\";\nimport { formatBytes, getFileExtension, getFileKey, isFileValid } from \"./utils\";\nimport type { UploadFileItem } from \"./types\";\n\nexport interface UseUploadOptions {\n fileSize: number;\n fileType?: string;\n max: number;\n}\n\n/*\n * Faz 13:\n * eskiden burada sadece çıplak `File[]` tutuluyordu, her dosya HEP \"hazır\"\n * durumundaydı — ant'ın dosya listesinin/picture-card'ının asıl karakteri\n * olan \"yükleniyor\" (ilerleme çubuğu) → \"tamamlandı\" geçişi hiç yoktu, tüm\n * dosyalar aynı anda statik görünüyordu. Gerçek bir sunucu/`action` prop'u\n * olmadığı için ilerleme SİMÜLE ediliyor (ant'ın kendi dokümantasyon\n * demoları da aynısını yapıyor) — ama durum modeli gerçek: her dosya\n * `uploading` → `done` arasında geçiş yapıyor, UI bunu render ediyor.\n */\nexport function useUpload({ fileSize, fileType, max }: UseUploadOptions) {\n const [fileList, setFileList] = useState<UploadFileItem[]>([]);\n const { showToast } = useToast();\n const timersRef = useRef<Set<ReturnType<typeof setInterval>>>(new Set());\n\n useEffect(() => {\n const timers = timersRef.current;\n return () => {\n timers.forEach(clearInterval);\n };\n }, []);\n\n // Sabit bir artışla ilerliyor (rastgele değil) — güvenlik açısından hassas\n // olmayan salt görsel bir simülasyon için bile `Math.random()` SonarJS'in\n // \"pseudo-random\" uyarısını tetikliyor; deterministik artış hem uyarıyı\n // ortadan kaldırıyor hem test edilebilirliği artırıyor. `setInterval`'ın\n // içine doğrudan iç içe yazmak yerine (SonarJS'in izin verdiği içiçe\n // fonksiyon derinliğini aşıyordu) ayrı, adlandırılmış bir fonksiyon.\n const PROGRESS_STEP = 22;\n const TICK_MS = 250;\n // 100/22 ≈ 5 tick'te tamamlanır; interval'i temizlemek için biraz payla.\n const TICKS_TO_COMPLETE = Math.ceil(100 / PROGRESS_STEP) + 1;\n\n const advanceItem = (item: UploadFileItem, targetId: string): UploadFileItem => {\n if (item.id !== targetId || item.status !== \"uploading\") return item;\n const nextProgress = Math.min(100, item.progress + PROGRESS_STEP);\n return nextProgress >= 100 ? { ...item, progress: 100, status: \"done\" } : { ...item, progress: nextProgress };\n };\n\n const advanceFileList = (prev: UploadFileItem[], targetId: string): UploadFileItem[] => prev.map((item) => advanceItem(item, targetId));\n\n const simulateUpload = (id: string) => {\n const tick = () => setFileList((prev) => advanceFileList(prev, id));\n const interval = setInterval(tick, TICK_MS);\n timersRef.current.add(interval);\n\n const stop = () => {\n clearInterval(interval);\n timersRef.current.delete(interval);\n };\n setTimeout(stop, TICK_MS * TICKS_TO_COMPLETE);\n };\n\n const addFile = (file: File) => {\n const extension = getFileExtension(file);\n const { valid, reason } = isFileValid({ file, allowedType: fileType, maxSize: fileSize });\n\n if (!valid) {\n showToast({\n title: \"Geçersiz dosya\",\n description: reason === \"invalid-type\" ? `.${extension} dosya türüne izin verilmiyor.` : `Dosya boyutu çok büyük (${formatBytes(file.size)})`,\n type: \"error\",\n });\n return;\n }\n\n if (fileList.length >= max) {\n showToast({ title: \"Hata\", description: `En fazla ${max} dosya yükleyebilirsiniz.`, type: \"error\" });\n return;\n }\n\n const id = getFileKey(file);\n setFileList((prev) => [...prev, { file, id, status: \"uploading\", progress: 0 }]);\n simulateUpload(id);\n };\n\n const addFiles = (files: File[]) => {\n const remaining = max - fileList.length;\n files.slice(0, remaining).forEach((file) => addFile(file));\n };\n\n const deleteFile = (id: string) => {\n setFileList((prev) => prev.filter((item) => item.id !== id));\n };\n\n return { fileList, setFileList, addFile, addFiles, deleteFile };\n}\n"],"mappings":"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","names":["useEffect","useRef","cn","XIcon","cn","jsx","jsxs","cn","XIcon","jsx","useState","cn","jsx","jsxs","cn","jsx","cn","useEffect","useState","useState","useEffect","jsx","jsxs","useRef","useEffect","cn"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mari-ui/components",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "description": "mari-ui'ın web / React Server Components uyumlu bileşen kütüphanesi.",
5
5
  "license": "MIT",
6
6
  "author": "Aykut Yılmaz",
@@ -273,8 +273,8 @@
273
273
  }
274
274
  },
275
275
  "dependencies": {
276
- "@mari-ui/core": "0.1.1",
277
- "@mari-ui/tokens": "0.1.1",
276
+ "@mari-ui/core": "0.2.0",
277
+ "@mari-ui/tokens": "0.2.0",
278
278
  "@react-input/mask": "^2.0.4",
279
279
  "lucide-react": "^0.511.0",
280
280
  "qrcode-generator": "^1.5.2"
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/useFloatingPosition.ts"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState, type RefObject } from \"react\";\nimport type { Placement } from \"@mari-ui/core\";\nimport { computePanelPosition, type ArrowOptions, type Side } from \"./floating\";\n\nexport interface FloatingCoords {\n top: number;\n left: number;\n side: Side;\n arrowOffset: number;\n /** Üst/alt yönlerde tetikleyicinin genişliği (panel en az o kadar geniş olur); yanlarda `undefined`. */\n anchorWidth: number | undefined;\n}\n\nexport interface FloatingOptions {\n placement: Placement;\n /** Tetikleyici ile panel arası (px). */\n gap: number;\n /** Panelin viewport kenarından en az uzaklığı (px). Varsayılan: 8. */\n edge?: number;\n arrow?: ArrowOptions;\n}\n\n/**\n * Faz 16.1 — `document.body`'ye portal edilmiş, `position: fixed` bir panelin\n * konumu. Dropdown'da vardı, Select de aynısına ihtiyaç duyunca buraya\n * taşındı. Konum tek seferlik değil, panel AÇIK KALDIĞI SÜRECE her karede\n * yeniden hesaplanır: sayfa kaydırılınca, sticky bir çubuk hareket edince ya\n * da içerik asenkron yüklenip düzen kayınca ölçüm eskimesin. Değişmeyen\n * karelerde state güncellenmez (gereksiz render yok).\n *\n * Kapalıyken `null` döner; ilk ölçüm gelene kadar da `null` — panel o ana\n * kadar `invisible` çizilmeli (boyutu ölçülebilsin, ama sol-üstte parlamasın).\n */\nexport function useFloatingPosition(\n open: boolean,\n anchorRef: RefObject<HTMLElement | null>,\n panelRef: RefObject<HTMLElement | null>,\n { placement, gap, edge = 8, arrow }: FloatingOptions\n): FloatingCoords | null {\n const [coords, setCoords] = useState<FloatingCoords | null>(null);\n const arrowInset = arrow?.inset;\n const pointAtCenter = arrow?.pointAtCenter;\n\n useEffect(() => {\n if (!open) {\n setCoords(null);\n return;\n }\n let frameId: number;\n const update = () => {\n const anchorEl = anchorRef.current;\n if (anchorEl) {\n const rect = anchorEl.getBoundingClientRect();\n const panelRect = panelRef.current?.getBoundingClientRect();\n const { top, left, side, arrowOffset } = computePanelPosition(\n { top: rect.top, left: rect.left, width: rect.width, height: rect.height },\n { width: panelRect?.width ?? 0, height: panelRect?.height ?? 0 },\n placement,\n { width: window.innerWidth, height: window.innerHeight },\n gap,\n edge,\n arrowInset === undefined ? undefined : { inset: arrowInset, pointAtCenter: !!pointAtCenter }\n );\n const anchorWidth = side === \"top\" || side === \"bottom\" ? rect.width : undefined;\n setCoords((prev) =>\n prev && prev.top === top && prev.left === left && prev.side === side && prev.arrowOffset === arrowOffset && prev.anchorWidth === anchorWidth\n ? prev\n : { top, left, side, arrowOffset, anchorWidth }\n );\n }\n frameId = requestAnimationFrame(update);\n };\n frameId = requestAnimationFrame(update);\n return () => cancelAnimationFrame(frameId);\n }, [open, placement, gap, edge, arrowInset, pointAtCenter, anchorRef, panelRef]);\n\n return coords;\n}\n"],"mappings":";;;;;AAEA,SAAS,WAAW,gBAAgC;AAiC7C,SAAS,oBACd,MACA,WACA,UACA,EAAE,WAAW,KAAK,OAAO,GAAG,MAAM,GACX;AACvB,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAgC,IAAI;AAChE,QAAM,aAAa,OAAO;AAC1B,QAAM,gBAAgB,OAAO;AAE7B,YAAU,MAAM;AACd,QAAI,CAAC,MAAM;AACT,gBAAU,IAAI;AACd;AAAA,IACF;AACA,QAAI;AACJ,UAAM,SAAS,MAAM;AACnB,YAAM,WAAW,UAAU;AAC3B,UAAI,UAAU;AACZ,cAAM,OAAO,SAAS,sBAAsB;AAC5C,cAAM,YAAY,SAAS,SAAS,sBAAsB;AAC1D,cAAM,EAAE,KAAK,MAAM,MAAM,YAAY,IAAI;AAAA,UACvC,EAAE,KAAK,KAAK,KAAK,MAAM,KAAK,MAAM,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAO;AAAA,UACzE,EAAE,OAAO,WAAW,SAAS,GAAG,QAAQ,WAAW,UAAU,EAAE;AAAA,UAC/D;AAAA,UACA,EAAE,OAAO,OAAO,YAAY,QAAQ,OAAO,YAAY;AAAA,UACvD;AAAA,UACA;AAAA,UACA,eAAe,SAAY,SAAY,EAAE,OAAO,YAAY,eAAe,CAAC,CAAC,cAAc;AAAA,QAC7F;AACA,cAAM,cAAc,SAAS,SAAS,SAAS,WAAW,KAAK,QAAQ;AACvE;AAAA,UAAU,CAAC,SACT,QAAQ,KAAK,QAAQ,OAAO,KAAK,SAAS,QAAQ,KAAK,SAAS,QAAQ,KAAK,gBAAgB,eAAe,KAAK,gBAAgB,cAC7H,OACA,EAAE,KAAK,MAAM,MAAM,aAAa,YAAY;AAAA,QAClD;AAAA,MACF;AACA,gBAAU,sBAAsB,MAAM;AAAA,IACxC;AACA,cAAU,sBAAsB,MAAM;AACtC,WAAO,MAAM,qBAAqB,OAAO;AAAA,EAC3C,GAAG,CAAC,MAAM,WAAW,KAAK,MAAM,YAAY,eAAe,WAAW,QAAQ,CAAC;AAE/E,SAAO;AACT;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/loading/Loading.tsx","../src/loading/utils.ts"],"sourcesContent":["\"use client\";\n\nimport React, { useEffect, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn, type ColorRole, type Size } from \"@mari-ui/core\";\nimport type { LoadingProps } from \"./types\";\nimport { clampPercent, SPINNER_SIZE, SPINNER_VIEWBOX, STROKE_WIDTH, strokeClass, TIP_CLASS } from \"./utils\";\n\nexport type { LoadingProps };\n\n/**\n * Faz 13.6 — yapı ant.design Spin'den, görünüm kendi token'larımızdan.\n *\n * Eski sürüm tek bir şey yapabiliyordu: `fixed inset-0` tam ekran bir spinner.\n * - Bir kartın/formun İÇİNDE kullanılamıyordu; örtü de yoktu — alttaki\n * sayfa yükleme sırasında tıklanabiliyordu.\n * - `role=\"status\"` yoktu (gizli \"Yükleniyor...\" metni hiç duyurulmuyordu);\n * boyut, açıklama, gecikme yoktu.\n *\n * Artık üç mod: satır içi (varsayılan), sarmalama (`children` — içerik yerinde\n * kalır, soluklaşır, `inert` olur; düzen kaymaz), tam ekran (`fullscreen`).\n * `delay` hızlı biten isteklerde yanıp sönmeyi önler; `percent` belirli ilerleme.\n *\n * Faz 15.6: spinner boyutu rem (px kök fontla ölçeklenmiyordu); `aria-valuenow`\n * da sınırlanır (percent=150 → 150/100 duyuruluyordu); tam ekran `document.body`'ye\n * portal edilir (transform'lu bir atanın içinde `fixed` ekranı kaplamıyordu);\n * mod başına ayrık bileşenler (sonar cognitive-complexity).\n */\n\nfunction useDelayedVisible(spinning: boolean, delay: number): boolean {\n const [delayed, setDelayed] = useState(delay <= 0 && spinning);\n useEffect(() => {\n if (!spinning) {\n setDelayed(false);\n return;\n }\n if (delay <= 0) {\n setDelayed(true);\n return;\n }\n const timer = setTimeout(() => setDelayed(true), delay);\n return () => clearTimeout(timer);\n }, [spinning, delay]);\n return spinning && delayed;\n}\n\nfunction Spinner({ size, color, percent }: Readonly<{ size: Size; color: ColorRole; percent?: number }>) {\n const box = SPINNER_VIEWBOX[size];\n const stroke = STROKE_WIDTH[size];\n const radius = (box - stroke) / 2;\n const circumference = 2 * Math.PI * radius;\n const determinate = percent !== undefined;\n const dash = determinate ? (clampPercent(percent) / 100) * circumference : circumference * 0.28;\n\n return (\n <svg\n aria-hidden\n viewBox={`0 0 ${box} ${box}`}\n style={{ width: SPINNER_SIZE[size], height: SPINNER_SIZE[size] }}\n className={cn(\n \"shrink-0\",\n // Hareket azaltma tercihinde de döner (durum bilgisi taşıyor) ama yavaş.\n !determinate && \"animate-spin motion-reduce:animate-[spin_2s_linear_infinite]\",\n determinate && \"-rotate-90\"\n )}\n >\n <circle cx={box / 2} cy={box / 2} r={radius} fill=\"none\" strokeWidth={stroke} className=\"stroke-mari-border\" />\n <circle\n cx={box / 2}\n cy={box / 2}\n r={radius}\n fill=\"none\"\n strokeWidth={stroke}\n strokeLinecap=\"round\"\n strokeDasharray={`${dash} ${circumference}`}\n className={cn(strokeClass[color], determinate && \"transition-[stroke-dasharray] duration-300 motion-reduce:transition-none\")}\n />\n </svg>\n );\n}\n\ninterface IndicatorProps {\n size: Size;\n color: ColorRole;\n percent?: number;\n tip?: React.ReactNode;\n indicator?: React.ReactNode;\n /** Küçük satır içi gösterge yan yana, diğerleri alt alta. */\n row: boolean;\n}\n\nfunction IndicatorBlock({ size, color, percent, tip, indicator, row }: Readonly<IndicatorProps>) {\n const determinate = percent !== undefined;\n return (\n <div className={cn(\"flex items-center gap-2 text-mari-muted\", row ? \"flex-row\" : \"flex-col\")}>\n {indicator ?? <Spinner size={size} color={color} percent={percent} />}\n {(tip || determinate) && (\n <span className={cn(\"tabular-nums\", TIP_CLASS[size])}>\n {tip}\n {determinate && <span className={cn(tip ? \"ml-1.5\" : \"\", \"font-medium text-mari-foreground\")}>%{Math.round(clampPercent(percent))}</span>}\n </span>\n )}\n </div>\n );\n}\n\n/** Belirli ilerlemede progressbar, aksi halde canlı durum bölgesi. */\nfunction getA11yProps(label: string, percent: number | undefined): React.HTMLAttributes<HTMLDivElement> {\n if (percent === undefined) return { role: \"status\", \"aria-live\": \"polite\", \"aria-label\": label };\n return { role: \"progressbar\", \"aria-label\": label, \"aria-valuemin\": 0, \"aria-valuemax\": 100, \"aria-valuenow\": Math.round(clampPercent(percent)) };\n}\n\nfunction WrapperLoading({\n visible,\n label,\n a11yProps,\n determinate,\n className,\n children,\n indicator,\n}: Readonly<{\n visible: boolean;\n label: string;\n a11yProps: React.HTMLAttributes<HTMLDivElement>;\n determinate: boolean;\n className?: string;\n children: React.ReactNode;\n indicator: React.ReactNode;\n}>) {\n return (\n <div className={cn(\"relative\", className)} aria-busy={visible || undefined}>\n {/* Yüklenirken içerik etkileşime kapalı (inert) — formda çift gönderimi, listede yarım veriye tıklamayı önler. */}\n <div inert={visible || undefined} className={cn(\"transition-opacity duration-200 motion-reduce:transition-none\", visible && \"pointer-events-none select-none opacity-40\")}>\n {children}\n </div>\n {/* Canlı bölge HEP DOM'da, sadece metni değişir — yükleme başlayınca yeni\n eklenen bir role=status'u bazı ekran okuyucular duyurmuyor. */}\n {!determinate && (\n <span role=\"status\" aria-live=\"polite\" className=\"sr-only\">\n {visible ? label : \"\"}\n </span>\n )}\n {visible && (\n // Uzun içerikte spinner ilk 400px'in ortasında kalsın (ant.design) — sayfanın dibinde kaybolmasın.\n <div\n {...(determinate ? a11yProps : { \"aria-hidden\": true })}\n className=\"absolute inset-x-0 top-0 z-10 flex h-full max-h-[25rem] items-center justify-center transition-opacity duration-200 motion-reduce:transition-none starting:opacity-0\"\n >\n {/* Soluk içeriğin (grafik, metin) üstünde okunur kalsın diye yüzey kutusu. */}\n <div className=\"rounded-xl border border-mari-border bg-mari-surface/95 px-4 py-3 shadow-mari-md\">{indicator}</div>\n </div>\n )}\n </div>\n );\n}\n\nexport function Loading({\n spinning = true,\n size = \"md\",\n tip,\n delay = 0,\n percent,\n fullscreen = false,\n children,\n color = \"primary\",\n indicator,\n className,\n}: Readonly<LoadingProps>) {\n const visible = useDelayedVisible(spinning, delay);\n const label = typeof tip === \"string\" ? tip : \"Yükleniyor\";\n const a11yProps = getA11yProps(label, percent);\n const indicatorBlock = (\n <IndicatorBlock size={size} color={color} percent={percent} tip={tip} indicator={indicator} row={size === \"sm\" && !fullscreen} />\n );\n\n if (children !== undefined && !fullscreen) {\n return (\n <WrapperLoading visible={visible} label={label} a11yProps={a11yProps} determinate={percent !== undefined} className={className} indicator={indicatorBlock}>\n {children}\n </WrapperLoading>\n );\n }\n\n if (!visible) return null;\n\n if (fullscreen) {\n if (typeof document === \"undefined\") return null;\n return createPortal(\n <div\n {...a11yProps}\n className={cn(\n \"fixed inset-0 z-mari-modal flex items-center justify-center bg-mari-surface/80 backdrop-blur-sm\",\n \"transition-opacity duration-200 motion-reduce:transition-none starting:opacity-0\",\n className\n )}\n >\n {indicatorBlock}\n </div>,\n document.body\n );\n }\n\n return (\n <div {...a11yProps} className={cn(\"inline-flex\", className)}>\n {indicatorBlock}\n </div>\n );\n}\n","import type { ColorRole, Size } from \"@mari-ui/core\";\n\n/** SVG `stroke` rengi — Tailwind tarayıcısı için literal (bkz. lib/colorClasses). */\nexport const strokeClass: Record<ColorRole, string> = {\n primary: \"stroke-mari-primary\",\n accent: \"stroke-mari-accent\",\n success: \"stroke-mari-success\",\n error: \"stroke-mari-error\",\n warning: \"stroke-mari-warning\",\n info: \"stroke-mari-info\",\n neutral: \"stroke-mari-neutral\",\n};\n\n/**\n * SVG'nin iç koordinat sistemi (viewBox birimi) — ekrandaki boyut `SPINNER_SIZE`.\n * Faz 15.6: eskiden `width/height` bu sayılarla px'ti; kök font büyüyünce\n * (4K, erişilebilirlik yazı boyutu) spinner küçük kalıyordu (px yasak kuralı).\n */\nexport const SPINNER_VIEWBOX: Record<Size, number> = { sm: 16, md: 24, lg: 40 };\nexport const SPINNER_SIZE: Record<Size, string> = { sm: \"1rem\", md: \"1.5rem\", lg: \"2.5rem\" };\n/** Halka kalınlığı (viewBox birimi) çapla birlikte — küçükte ince çizgi kaybolmasın. */\nexport const STROKE_WIDTH: Record<Size, number> = { sm: 2, md: 2.5, lg: 3.5 };\nexport const TIP_CLASS: Record<Size, string> = { sm: \"text-xs\", md: \"text-sm\", lg: \"text-base\" };\n\nexport function clampPercent(percent: number | undefined): number {\n return Math.min(100, Math.max(0, percent ?? 0));\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/skeleton.ts"],"sourcesContent":["import { cn } from \"@mari-ui/core\";\n\n/**\n * Faz 15 — component'lerin ortak `skeleton` sözleşmesi.\n *\n * `loading` ≠ `skeleton`: `loading` = bir EYLEM sürüyor (Button spinner'ı,\n * component etkileşimli kalır ya da disabled olur). `skeleton` = VERİ henüz\n * yok; component kendi geometrisinde (aynı boyut + radius sınıfları) içeriksiz\n * bir yer tutucu çizer → yüklenince layout zıplamaz.\n *\n * Yer tutucu ekran okuyucudan gizlidir; \"yükleniyor\" duyurusu tüketicinin\n * işidir (yüklenen bölgeye `aria-busy`, ya da tek bir `<Skeleton label>`).\n */\nexport interface SkeletonableProps {\n /** Veri gelene kadar component'in kendi boyutunda iskelet çizer. */\n skeleton?: boolean;\n}\n\n/**\n * Tek kaynak dolgu: `active` → parıltı (gradyan kayar), değilse düz.\n * `prefers-reduced-motion`da parıltı durur.\n */\nexport function skeletonFill(active: boolean | undefined): string {\n return active\n ? \"bg-linear-to-r from-mari-border/70 via-mari-surface-alt to-mari-border/70 bg-[length:400%_100%] animate-[mari-skeleton-shimmer_1.4s_ease_infinite] motion-reduce:animate-none\"\n : \"bg-mari-border/70\";\n}\n\n/**\n * Bir component'in `skeleton` dalında kök elemana yayılacak prop'lar.\n * `className`e component'in GERÇEK boyut/radius sınıflarını verin (örn.\n * `sizeClass[size]`) ki iskelet ile yüklenmiş hali birebir aynı kutuyu kaplasın.\n */\nexport function skeletonBoxProps(className?: string) {\n return {\n \"aria-hidden\": true as const,\n \"data-skeleton\": \"\",\n // Dolgu ve şeffaf metin SONDA: `className` bir metin rengi (ör. Typography'nin\n // `text-mari-foreground`'u) taşısa bile twMerge onları ezmesin.\n className: cn(\"pointer-events-none select-none\", className, skeletonFill(true), \"text-transparent\"),\n };\n}\n"],"mappings":";AAAA,SAAS,UAAU;AAsBZ,SAAS,aAAa,QAAqC;AAChE,SAAO,SACH,kLACA;AACN;AAOO,SAAS,iBAAiB,WAAoB;AACnD,SAAO;AAAA,IACL,eAAe;AAAA,IACf,iBAAiB;AAAA;AAAA;AAAA,IAGjB,WAAW,GAAG,mCAAmC,WAAW,aAAa,IAAI,GAAG,kBAAkB;AAAA,EACpG;AACF;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/infiniteScroll.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useEffect, useRef } from \"react\";\nimport { Loader2Icon } from \"lucide-react\";\nimport { cn } from \"@mari-ui/core\";\n\n/**\n * Faz 16.3 — List ve Masonry'nin ortak sonsuz kaydırma sözleşmesi.\n *\n * Erişilebilirlik: yalnız kaydırmaya bağlı yükleme klavye kullanıcısını\n * sayfa sonuna (alt bilgiye) hiç ulaştırmayabilir. Bu yüzden işaretçinin\n * yanında her zaman odaklanabilir bir \"Daha fazla yükle\" düğmesi de olur\n * (fare kullanıcısı için kendiliğinden, klavye için düğmeyle). Yükleme ve\n * \"hepsi bu kadar\" durumu `role=\"status\"` ile duyurulur.\n */\nexport interface InfiniteScrollOptions {\n /** Yüklenecek kayıt kaldı mı. `false` olunca işaretçi kalkar, `endMessage` görünür. */\n hasMore: boolean;\n /** Sonraki sayfa yüklenirken `true` verin — bu sırada yeni istek tetiklenmez. */\n loading?: boolean;\n /** Liste sonu görünüme girince (ya da düğmeyle) çağrılır. */\n onLoadMore: () => void;\n /** İşaretçinin görünüme ne kadar erken sayılacağı. Varsayılan: `\"200px\"` (sona gelmeden yükler). */\n rootMargin?: string;\n /** Tüm kayıtlar yüklenince. Varsayılan: \"Hepsi bu kadar\". `null` gizler. */\n endMessage?: React.ReactNode;\n /** Düğme metni. Varsayılan: \"Daha fazla yükle\". */\n loadMoreLabel?: string;\n}\n\n/**\n * İşaretçi görünüme girince `onLoadMore`. Yükleme bitip işaretçi hâlâ\n * görünürse (içerik ekranı doldurmadıysa) gözlem yeniden kurulur ve bir\n * sonraki sayfa da istenir — ekran dolana kadar.\n */\nexport function useInfiniteScroll(sentinel: React.RefObject<HTMLElement | null>, { hasMore, loading = false, onLoadMore, rootMargin = \"200px\" }: InfiniteScrollOptions) {\n const callback = useRef(onLoadMore);\n callback.current = onLoadMore;\n\n useEffect(() => {\n const el = sentinel.current;\n if (!el || !hasMore || loading || typeof IntersectionObserver === \"undefined\") return;\n // `root: null` yine de kaydırılan ata kaplarının kırpmasını hesaba katar → hem sayfa hem iç kaydırma alanında çalışır.\n const observer = new IntersectionObserver((entries) => {\n if (entries.some((e) => e.isIntersecting)) callback.current();\n }, { rootMargin });\n observer.observe(el);\n return () => observer.disconnect();\n }, [sentinel, hasMore, loading, rootMargin]);\n}\n\n/** Liste sonu: gözlenen işaretçi + durum + klavye için düğme. */\nexport function InfiniteScrollFooter({ options, className }: Readonly<{ options: InfiniteScrollOptions; className?: string }>) {\n const sentinel = useRef<HTMLDivElement>(null);\n useInfiniteScroll(sentinel, options);\n const { hasMore, loading = false, onLoadMore, endMessage = \"Hepsi bu kadar\", loadMoreLabel = \"Daha fazla yükle\" } = options;\n\n return (\n // `relative`: içindeki sr-only düğme konumlanmamış bir kaydırma kabından kaçıp sayfayı genişletmesin.\n <div className={cn(\"relative flex flex-col items-center gap-2 py-3 text-sm text-mari-muted\", className)}>\n <div ref={sentinel} aria-hidden className=\"h-px w-full\" />\n <div role=\"status\" className=\"flex min-h-5 items-center gap-2\">\n {loading && (\n <>\n <Loader2Icon size={16} aria-hidden className=\"animate-spin motion-reduce:animate-none\" />\n Yükleniyor…\n </>\n )}\n {!loading && !hasMore && endMessage}\n </div>\n {hasMore && !loading && (\n // Fare kullanıcısında görünmez (kaydırma yetiyor); klavyeyle odaklanınca belirir.\n <button\n type=\"button\"\n onClick={onLoadMore}\n className=\"sr-only rounded-md px-3 py-1.5 font-medium text-mari-primary focus-visible:not-sr-only focus-visible:outline-2 focus-visible:outline-mari-ring\"\n >\n {loadMoreLabel}\n </button>\n )}\n </div>\n );\n}\n"],"mappings":";AAEA,SAAgB,WAAW,cAAc;AACzC,SAAS,mBAAmB;AAC5B,SAAS,UAAU;AAwDb,SAGI,UAHJ,KAGI,YAHJ;AAzBC,SAAS,kBAAkB,UAA+C,EAAE,SAAS,UAAU,OAAO,YAAY,aAAa,QAAQ,GAA0B;AACtK,QAAM,WAAW,OAAO,UAAU;AAClC,WAAS,UAAU;AAEnB,YAAU,MAAM;AACd,UAAM,KAAK,SAAS;AACpB,QAAI,CAAC,MAAM,CAAC,WAAW,WAAW,OAAO,yBAAyB,YAAa;AAE/E,UAAM,WAAW,IAAI,qBAAqB,CAAC,YAAY;AACrD,UAAI,QAAQ,KAAK,CAAC,MAAM,EAAE,cAAc,EAAG,UAAS,QAAQ;AAAA,IAC9D,GAAG,EAAE,WAAW,CAAC;AACjB,aAAS,QAAQ,EAAE;AACnB,WAAO,MAAM,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,UAAU,SAAS,SAAS,UAAU,CAAC;AAC7C;AAGO,SAAS,qBAAqB,EAAE,SAAS,UAAU,GAAqE;AAC7H,QAAM,WAAW,OAAuB,IAAI;AAC5C,oBAAkB,UAAU,OAAO;AACnC,QAAM,EAAE,SAAS,UAAU,OAAO,YAAY,aAAa,kBAAkB,gBAAgB,sBAAmB,IAAI;AAEpH;AAAA;AAAA,IAEE,qBAAC,SAAI,WAAW,GAAG,0EAA0E,SAAS,GACpG;AAAA,0BAAC,SAAI,KAAK,UAAU,eAAW,MAAC,WAAU,eAAc;AAAA,MACxD,qBAAC,SAAI,MAAK,UAAS,WAAU,mCAC1B;AAAA,mBACC,iCACE;AAAA,8BAAC,eAAY,MAAM,IAAI,eAAW,MAAC,WAAU,2CAA0C;AAAA,UAAE;AAAA,WAE3F;AAAA,QAED,CAAC,WAAW,CAAC,WAAW;AAAA,SAC3B;AAAA,MACC,WAAW,CAAC;AAAA,MAEX;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS;AAAA,UACT,WAAU;AAAA,UAET;AAAA;AAAA,MACH;AAAA,OAEJ;AAAA;AAEJ;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/date/index.ts","../src/calendar/_components/CellGrid.tsx","../src/calendar/_components/DayGrid.tsx"],"sourcesContent":["/**\n * Faz 16.5 — Calendar / DatePicker / TimePicker'ın ortak tarih motoru.\n * Bağımlılık yok: yerel `Date` + `Intl` (varsayılan yerel `tr-TR`). Tüm\n * hesaplar YEREL saatte; gün karşılaştırmaları saat bileşenini yok sayar.\n */\n\nexport const DEFAULT_LOCALE = \"tr-TR\";\n/** Haftanın ilk günü: 1 = Pazartesi (Türkiye), 0 = Pazar. */\nexport type WeekStart = 0 | 1;\n\nexport const startOfDay = (d: Date) => new Date(d.getFullYear(), d.getMonth(), d.getDate());\nexport const startOfMonth = (d: Date) => new Date(d.getFullYear(), d.getMonth(), 1);\nexport const daysInMonth = (year: number, month: number) => new Date(year, month + 1, 0).getDate();\n\nexport function addDays(d: Date, n: number): Date {\n const r = new Date(d);\n r.setDate(r.getDate() + n);\n return r;\n}\n\n/** Ay ekler; hedef ayda o gün yoksa ayın son gününe çeker (31 Ocak + 1 ay = 28/29 Şubat). */\nexport function addMonths(d: Date, n: number): Date {\n const total = d.getFullYear() * 12 + d.getMonth() + n;\n const year = Math.floor(total / 12);\n const month = total - year * 12;\n const day = Math.min(d.getDate(), daysInMonth(year, month));\n return new Date(year, month, day, d.getHours(), d.getMinutes(), d.getSeconds());\n}\n\nexport const addYears = (d: Date, n: number) => addMonths(d, n * 12);\n\nexport const isSameDay = (a: Date | null | undefined, b: Date | null | undefined) =>\n !!a && !!b && a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();\nexport const isSameMonth = (a: Date | null | undefined, b: Date | null | undefined) =>\n !!a && !!b && a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth();\nexport const isSameYear = (a: Date | null | undefined, b: Date | null | undefined) => !!a && !!b && a.getFullYear() === b.getFullYear();\n\n/** Gün düzeyinde karşılaştırma: <0, 0, >0. */\nexport const compareDay = (a: Date, b: Date) => startOfDay(a).getTime() - startOfDay(b).getTime();\n\n/** `d`, `a` ile `b` arasında mı (gün düzeyinde, uçlar dahil, sıra fark etmez). */\nexport function isBetweenDays(d: Date, a: Date, b: Date): boolean {\n const [lo, hi] = compareDay(a, b) <= 0 ? [a, b] : [b, a];\n return compareDay(d, lo) >= 0 && compareDay(d, hi) <= 0;\n}\n\nexport function startOfWeek(d: Date, weekStart: WeekStart = 1): Date {\n const diff = (d.getDay() - weekStart + 7) % 7;\n return startOfDay(addDays(d, -diff));\n}\n\nexport const endOfWeek = (d: Date, weekStart: WeekStart = 1) => addDays(startOfWeek(d, weekStart), 6);\n\n/** Ay görünümü: her zaman 6 hafta × 7 gün (yükseklik aydan aya zıplamasın). */\nexport function getMonthGrid(year: number, month: number, weekStart: WeekStart = 1): Date[][] {\n const first = startOfWeek(new Date(year, month, 1), weekStart);\n return Array.from({ length: 6 }, (_, w) => Array.from({ length: 7 }, (_, i) => addDays(first, w * 7 + i)));\n}\n\n/** ISO 8601 hafta numarası (Pazartesi başlangıç; yılın ilk Perşembesini içeren hafta 1). */\nexport function getISOWeek(d: Date): number {\n const t = startOfDay(d);\n t.setDate(t.getDate() + 3 - ((t.getDay() + 6) % 7));\n const firstThursday = new Date(t.getFullYear(), 0, 4);\n return 1 + Math.round(((t.getTime() - firstThursday.getTime()) / 86400000 - 3 + ((firstThursday.getDay() + 6) % 7)) / 7);\n}\n\n/* ─────────────────────────── Yerel adlar ─────────────────────────── */\n\nexport function monthNames(locale = DEFAULT_LOCALE, width: \"long\" | \"short\" = \"long\"): string[] {\n const fmt = new Intl.DateTimeFormat(locale, { month: width });\n return Array.from({ length: 12 }, (_, m) => fmt.format(new Date(2024, m, 1)));\n}\n\n/** Haftanın günleri, `weekStart`tan başlayarak. */\nexport function weekdayNames(locale = DEFAULT_LOCALE, weekStart: WeekStart = 1, width: \"long\" | \"short\" | \"narrow\" = \"short\"): string[] {\n const fmt = new Intl.DateTimeFormat(locale, { weekday: width });\n // 2024-01-07 bir Pazar.\n return Array.from({ length: 7 }, (_, i) => fmt.format(new Date(2024, 0, 7 + ((i + weekStart) % 7))));\n}\n\n/** Ekran okuyucu için tam tarih: \"1 Ekim 2026 Perşembe\". */\nexport function fullDateLabel(d: Date, locale = DEFAULT_LOCALE): string {\n return new Intl.DateTimeFormat(locale, { day: \"numeric\", month: \"long\", year: \"numeric\", weekday: \"long\" }).format(d);\n}\n\n/* ─────────────────────────── Biçim / ayrıştırma ─────────────────────────── */\n\n/**\n * Desteklenen belirteçler: `yyyy`, `MM`, `M`, `dd`, `d`, `HH`, `H`, `mm`,\n * `ss`, `MMMM` (ay adı), `MMM` (kısa ay adı), `EEEE`/`EEE` (gün adı).\n * Diğer karakterler olduğu gibi yazılır.\n */\nconst TOKEN_RE = /yyyy|MMMM|MMM|MM|M|dd|d|HH|H|mm|ss|EEEE|EEE/g;\n\nconst pad = (n: number, len = 2) => String(n).padStart(len, \"0\");\n\nexport function formatDate(d: Date, pattern: string, locale = DEFAULT_LOCALE): string {\n return pattern.replace(TOKEN_RE, (token) => {\n switch (token) {\n case \"yyyy\":\n return pad(d.getFullYear(), 4);\n case \"MMMM\":\n return monthNames(locale, \"long\")[d.getMonth()]!;\n case \"MMM\":\n return monthNames(locale, \"short\")[d.getMonth()]!;\n case \"MM\":\n return pad(d.getMonth() + 1);\n case \"M\":\n return String(d.getMonth() + 1);\n case \"dd\":\n return pad(d.getDate());\n case \"d\":\n return String(d.getDate());\n case \"HH\":\n return pad(d.getHours());\n case \"H\":\n return String(d.getHours());\n case \"mm\":\n return pad(d.getMinutes());\n case \"ss\":\n return pad(d.getSeconds());\n case \"EEEE\":\n return new Intl.DateTimeFormat(locale, { weekday: \"long\" }).format(d);\n default:\n return new Intl.DateTimeFormat(locale, { weekday: \"short\" }).format(d);\n }\n });\n}\n\nconst NUMERIC: Record<string, string> = { yyyy: \"(\\\\d{4})\", MM: \"(\\\\d{1,2})\", M: \"(\\\\d{1,2})\", dd: \"(\\\\d{1,2})\", d: \"(\\\\d{1,2})\", HH: \"(\\\\d{1,2})\", H: \"(\\\\d{1,2})\", mm: \"(\\\\d{1,2})\", ss: \"(\\\\d{1,2})\" };\nconst escapeRe = (s: string) => s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n/**\n * Sayısal desenle yazılmış metni çözer (ay/gün adı içeren desen çözülmez).\n * Kesin: 31.02.2026 gibi var olmayan tarih `null`. Desende olmayan alanlar\n * `reference`tan (varsayılan: bugün 00:00) alınır. Ayraç olarak `.`, `/`, `-`\n * birbirinin yerine kabul edilir; tek haneli gün/ay (1.2.2026) da olur.\n */\nexport function parseDate(text: string, pattern: string, reference: Date = startOfDay(new Date())): Date | null {\n const tokens: string[] = [];\n let re = \"\";\n let last = 0;\n for (const m of pattern.matchAll(TOKEN_RE)) {\n const literal = pattern.slice(last, m.index);\n re += escapeRe(literal).replace(/\\\\\\.|\\/|-/g, \"[./-]\");\n const group = NUMERIC[m[0]];\n if (!group) return null;\n re += group;\n tokens.push(m[0]);\n last = m.index! + m[0].length;\n }\n re += escapeRe(pattern.slice(last)).replace(/\\\\\\.|\\/|-/g, \"[./-]\");\n const match = new RegExp(`^\\\\s*${re}\\\\s*$`).exec(text);\n if (!match) return null;\n const parts = { y: reference.getFullYear(), M: reference.getMonth() + 1, d: reference.getDate(), H: reference.getHours(), m: reference.getMinutes(), s: reference.getSeconds() };\n tokens.forEach((t, i) => {\n const v = Number(match[i + 1]);\n if (t === \"yyyy\") parts.y = v;\n else if (t.startsWith(\"M\")) parts.M = v;\n else if (t.startsWith(\"d\")) parts.d = v;\n else if (t.startsWith(\"H\")) parts.H = v;\n else if (t === \"mm\") parts.m = v;\n else parts.s = v;\n });\n if (parts.M < 1 || parts.M > 12 || parts.d < 1 || parts.d > daysInMonth(parts.y, parts.M - 1)) return null;\n if (parts.H > 23 || parts.m > 59 || parts.s > 59) return null;\n return new Date(parts.y, parts.M - 1, parts.d, parts.H, parts.m, parts.s);\n}\n\n/* ─────────────────────────── Klavye (APG date grid) ─────────────────────────── */\n\n/**\n * ←/→ gün, ↑/↓ hafta, Home/End haftanın başı/sonu, PageUp/PageDown ay\n * (Shift ile yıl). Tanınmayan tuş → `null`.\n */\nexport function dayGridKeyStep(d: Date, key: string, shift: boolean, weekStart: WeekStart = 1): Date | null {\n switch (key) {\n case \"ArrowLeft\":\n return addDays(d, -1);\n case \"ArrowRight\":\n return addDays(d, 1);\n case \"ArrowUp\":\n return addDays(d, -7);\n case \"ArrowDown\":\n return addDays(d, 7);\n case \"Home\":\n return startOfWeek(d, weekStart);\n case \"End\":\n return endOfWeek(d, weekStart);\n case \"PageUp\":\n return shift ? addYears(d, -1) : addMonths(d, -1);\n case \"PageDown\":\n return shift ? addYears(d, 1) : addMonths(d, 1);\n default:\n return null;\n }\n}\n\n/** Ay/yıl ızgarası (3 sütun): ←/→ ±1, ↑/↓ ±3, Home/End satır başı/sonu. Değer bir indekstir. */\nexport function cellGridKeyStep(index: number, key: string, columns = 3): number | null {\n const map: Record<string, number> = { ArrowLeft: -1, ArrowRight: 1, ArrowUp: -columns, ArrowDown: columns };\n if (key in map) return index + map[key]!;\n if (key === \"Home\") return index - (index % columns);\n if (key === \"End\") return index - (index % columns) + columns - 1;\n return null;\n}\n\n/** Sınırlar içinde mi (gün düzeyinde). */\nexport function isWithin(d: Date, min?: Date | null, max?: Date | null): boolean {\n if (min && compareDay(d, min) < 0) return false;\n if (max && compareDay(d, max) > 0) return false;\n return true;\n}\n","\"use client\";\n\nimport React, { useEffect, useRef } from \"react\";\nimport { cn } from \"@mari-ui/core\";\nimport { skeletonBoxProps } from \"../../lib/skeleton\";\nimport { cellGridKeyStep } from \"../../lib/date\";\n\nexport interface GridCell {\n key: string;\n /** Hücrede görünen (ör. \"Eki\", \"2026\"). */\n label: React.ReactNode;\n /** Ekran okuyucu adı (ör. \"Ekim 2026\"). */\n fullLabel: string;\n selected: boolean;\n current: boolean;\n disabled: boolean;\n /** Önceki/sonraki döneme ait (on yılın dışındaki yıllar). */\n outside?: boolean;\n}\n\nexport interface CellGridProps {\n cells: GridCell[];\n focusedIndex: number;\n /** Odak ızgara dışına taşarsa (ör. -1 ya da 12) kapsayıcı sayfayı değiştirir. */\n onFocusIndex: (index: number) => void;\n onSelect: (index: number) => void;\n label: string;\n columns?: number;\n variant?: \"compact\" | \"full\";\n /** Hücreye ek içerik (yalnız `full`). */\n cellRender?: (index: number) => React.ReactNode;\n takeFocus?: boolean;\n /** PageUp/PageDown: sayfa (yıl / on yıl) değiştir. */\n onPage?: (delta: -1 | 1) => void;\n skeleton?: boolean;\n}\n\nfunction GridCellView({ cell, focused, full, content, onClick }: Readonly<{ cell: GridCell; focused: boolean; full: boolean; content: React.ReactNode; onClick: () => void }>) {\n const solid = cell.selected && !full;\n return (\n <td\n role=\"gridcell\"\n tabIndex={focused ? 0 : -1}\n aria-label={full ? undefined : cell.fullLabel}\n aria-selected={cell.selected}\n aria-disabled={cell.disabled || undefined}\n aria-current={cell.current ? \"date\" : undefined}\n onClick={onClick}\n className={cn(\n \"group relative cursor-pointer p-1 outline-none\",\n cell.disabled && \"cursor-not-allowed\",\n \"[&:focus-visible>div]:outline-2 [&:focus-visible>div]:outline-offset-1 [&:focus-visible>div]:outline-mari-ring\"\n )}\n >\n <div\n className={cn(\n \"rounded-md transition-colors\",\n full ? \"flex h-24 flex-col gap-1 border-t-2 p-1.5 text-left max-sm:h-16\" : \"flex h-9 items-center justify-center pointer-coarse:h-11\",\n solid && \"bg-mari-primary-solid font-medium text-mari-primary-solid-contrast\",\n cell.selected && full && \"border-mari-primary bg-mari-primary-subtle\",\n !cell.selected && full && \"border-mari-border\",\n !cell.selected && !cell.disabled && \"group-hover:bg-mari-surface-alt\",\n !cell.selected && cell.current && !full && \"font-semibold text-mari-primary ring-1 ring-mari-primary ring-inset\",\n cell.outside && !cell.selected && \"text-mari-muted\",\n cell.disabled && \"text-mari-disabled line-through\"\n )}\n >\n {full ? (\n <>\n <span aria-hidden className={cn(\"self-end\", cell.current && \"font-semibold text-mari-primary\")}>\n {cell.label}\n </span>\n <span className=\"sr-only\">{cell.fullLabel}</span>\n {content && <div className=\"min-h-0 flex-1 overflow-hidden text-xs\">{content}</div>}\n </>\n ) : (\n cell.label\n )}\n </div>\n </td>\n );\n}\n\n/** Ay ve yıl seçimi için 3 sütunlu APG ızgarası (roving tabindex). */\nexport function CellGrid({ cells, focusedIndex, onFocusIndex, onSelect, label, columns = 3, variant = \"compact\", cellRender, takeFocus = false, onPage, skeleton = false }: Readonly<CellGridProps>) {\n const tableRef = useRef<HTMLTableElement>(null);\n const full = variant === \"full\";\n // Klavyeyle gezinince odak yeni hücreye taşınır — ay/sayfa değişince eski hücre DOM'dan\n // kalkar ve odak <body>'ye düşerdi, `contains(activeElement)` bunu yakalayamazdı.\n const navigating = useRef(false);\n useEffect(() => {\n const table = tableRef.current;\n if (!table) return;\n if (!takeFocus && !navigating.current && !table.contains(document.activeElement)) return;\n navigating.current = false;\n table.querySelector<HTMLElement>('[tabindex=\"0\"]')?.focus();\n }, [focusedIndex, takeFocus]);\n\n const rows: GridCell[][] = [];\n for (let i = 0; i < cells.length; i += columns) rows.push(cells.slice(i, i + columns));\n\n const onKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n if (!cells[focusedIndex]?.disabled) onSelect(focusedIndex);\n return;\n }\n if ((e.key === \"PageUp\" || e.key === \"PageDown\") && onPage) {\n e.preventDefault();\n navigating.current = true;\n onPage(e.key === \"PageUp\" ? -1 : 1);\n return;\n }\n const next = cellGridKeyStep(focusedIndex, e.key, columns);\n if (next === null) return;\n e.preventDefault();\n navigating.current = true;\n onFocusIndex(next);\n };\n\n return (\n <table\n ref={tableRef}\n role={skeleton ? undefined : \"grid\"}\n aria-label={skeleton ? undefined : label}\n aria-hidden={skeleton || undefined}\n onKeyDown={skeleton ? undefined : onKeyDown}\n className=\"w-full border-collapse text-sm\"\n >\n <tbody>\n {rows.map((row, r) => (\n // Satırlar konumsal ve sabit (3×4).\n <tr key={r}>\n {row.map((cell, c) => {\n const index = r * columns + c;\n if (skeleton) {\n return (\n <td key={cell.key} className=\"p-1\">\n <div className={cn(\"flex rounded-md\", full ? \"h-24 flex-col border-t-2 border-mari-border p-1.5\" : \"h-9 items-center justify-center\")}>\n <span {...skeletonBoxProps(cn(\"rounded-sm\", full && \"self-end\"))}>{cell.label}</span>\n </div>\n </td>\n );\n }\n return (\n <GridCellView\n key={cell.key}\n cell={cell}\n focused={index === focusedIndex}\n full={full}\n content={cellRender?.(index)}\n onClick={() => {\n onFocusIndex(index);\n if (!cell.disabled) onSelect(index);\n }}\n />\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useRef } from \"react\";\nimport { cn } from \"@mari-ui/core\";\nimport { skeletonBoxProps } from \"../../lib/skeleton\";\nimport {\n dayGridKeyStep,\n fullDateLabel,\n getISOWeek,\n getMonthGrid,\n isSameDay,\n isSameMonth,\n weekdayNames,\n type WeekStart,\n} from \"../../lib/date\";\n\nexport type RangePosition = \"start\" | \"end\" | \"middle\" | \"single\";\n\nexport interface DayCellInfo {\n date: Date;\n selected: boolean;\n today: boolean;\n disabled: boolean;\n outside: boolean;\n range: RangePosition | null;\n}\n\nexport interface DayGridProps {\n /** Gösterilen ay (gün önemsiz). */\n view: Date;\n /** Klavye odağının (roving tabindex) bulunduğu gün. */\n focused: Date;\n onFocusChange: (date: Date) => void;\n isSelected: (date: Date) => boolean;\n /** Aralık seçiminde günün konumu (vurgu için). */\n rangeOf?: (date: Date) => RangePosition | null;\n isDisabled: (date: Date) => boolean;\n onSelect: (date: Date) => void;\n /** Fareyle üzerine gelinen gün (aralık önizlemesi). */\n onHover?: (date: Date | null) => void;\n weekStart?: WeekStart;\n locale?: string;\n /** `full`: büyük hücreler, içerik alanı (Calendar fullscreen). */\n variant?: \"compact\" | \"full\";\n showWeek?: boolean;\n /** Hücreye ek içerik (yalnız `full`). */\n cellRender?: (info: DayCellInfo) => React.ReactNode;\n /** Izgaranın adı — ör. \"Ekim 2026\". */\n label: string;\n /** Odak ızgaradaysa ya da `true` ise odaklanan gün DOM odağını alır. */\n takeFocus?: boolean;\n /** Aynı ızgara, gün numaraları iskelet blok; etkileşim yok, erişilebilirlik ağacından gizli. */\n skeleton?: boolean;\n}\n\nconst RANGE_BG: Record<RangePosition, string> = {\n start: \"before:absolute before:inset-y-0.5 before:left-1/2 before:right-0 before:bg-mari-primary-subtle\",\n end: \"before:absolute before:inset-y-0.5 before:left-0 before:right-1/2 before:bg-mari-primary-subtle\",\n middle: \"before:absolute before:inset-y-0.5 before:inset-x-0 before:bg-mari-primary-subtle\",\n single: \"\",\n};\n\nfunction compactDayClass(info: DayCellInfo) {\n const strong = info.selected || info.range === \"start\" || info.range === \"end\" || info.range === \"single\";\n return cn(\n \"relative z-10 mx-auto flex size-8 items-center justify-center rounded-md tabular-nums transition-colors\",\n strong && \"bg-mari-primary-solid font-medium text-mari-primary-solid-contrast\",\n !strong && info.today && \"font-semibold text-mari-primary ring-1 ring-mari-primary ring-inset\",\n !strong && !info.disabled && \"group-hover:bg-mari-surface-alt\",\n info.outside && !strong && \"text-mari-muted\",\n info.disabled && \"text-mari-disabled line-through decoration-mari-disabled/60\"\n );\n}\n\n/**\n * Tam ekran hücre: numara + `cellRender` içeriği. Dar ekranda (< sm) 7 sütuna\n * içerik sığmaz → hücre kısalır, içerik görsel olarak bir noktaya iner ama\n * ekran okuyucu için DOM'da kalır (`sr-only`); ayrıntı gün seçilince\n * gösterilir (mobil takvim kalıbı).\n */\nfunction FullDayContent({ info, locale, cellRender }: Readonly<{ info: DayCellInfo; locale?: string; cellRender?: (info: DayCellInfo) => React.ReactNode }>) {\n const content = cellRender?.(info);\n const hasContent = content !== undefined && content !== null && content !== false && content !== \"\";\n return (\n <div\n className={cn(\n \"m-0.5 flex h-24 flex-col gap-1 overflow-hidden rounded-md border-t-2 p-1.5 text-left transition-colors max-sm:h-12 max-sm:items-center max-sm:gap-0.5 max-sm:p-1\",\n info.selected ? \"border-mari-primary bg-mari-primary-subtle\" : \"border-mari-border\",\n !info.selected && !info.disabled && \"group-hover:bg-mari-surface-alt\",\n info.outside && \"text-mari-muted\",\n info.disabled && \"bg-mari-surface-alt text-mari-disabled\"\n )}\n >\n <span aria-hidden className={cn(\"self-end text-sm tabular-nums max-sm:self-center\", info.today && \"rounded-sm bg-mari-primary-solid px-1 font-semibold text-mari-primary-solid-contrast\")}>\n {info.date.getDate()}\n </span>\n <span className=\"sr-only\">{fullDateLabel(info.date, locale)}</span>\n {/* Kaydırılmaz (hücre içi kaydırma klavyeyle erişilemezdi): içerik özet olmalı, fazlası \"+N\". */}\n {hasContent && <div className=\"min-h-0 flex-1 overflow-hidden text-xs max-sm:sr-only\">{content}</div>}\n {hasContent && <span aria-hidden className=\"size-1.5 rounded-full bg-mari-primary sm:hidden\" />}\n </div>\n );\n}\n\n/** İskelet gün hücresi: gerçek hücreyle aynı kutu, numara yerine blok. */\nfunction SkeletonDay({ date, full }: Readonly<{ date: Date; full: boolean }>) {\n if (full) {\n return (\n <td className=\"p-0 align-top\">\n <div className=\"m-0.5 flex h-24 flex-col rounded-md border-t-2 border-mari-border p-1.5 max-sm:h-12\">\n <span {...skeletonBoxProps(\"self-end rounded-sm text-sm tabular-nums\")}>{date.getDate()}</span>\n </div>\n </td>\n );\n }\n return (\n <td className=\"p-0\">\n <div className=\"py-0.5 pointer-coarse:py-1.5\">\n <span {...skeletonBoxProps(\"mx-auto flex size-8 items-center justify-center rounded-md tabular-nums\")}>{date.getDate()}</span>\n </div>\n </td>\n );\n}\n\n/**\n * Faz 16.5 — APG \"date grid\": `<table role=\"grid\">`, sütun başlıkları gün\n * adları (tam adı `abbr`), hücreler roving tabindex (yalnız odaklı gün\n * sekme durağı). ←/→ gün, ↑/↓ hafta, Home/End hafta başı/sonu, PageUp/Down ay\n * (Shift ile yıl), Enter/Boşluk seçer. Ay dışına taşan odak `onFocusChange`\n * ile bildirilir — görünen ayı değiştirmek kapsayıcının işi.\n */\nexport function DayGrid({\n view,\n focused,\n onFocusChange,\n isSelected,\n rangeOf,\n isDisabled,\n onSelect,\n onHover,\n weekStart = 1,\n locale,\n variant = \"compact\",\n showWeek = false,\n cellRender,\n label,\n takeFocus = false,\n skeleton = false,\n}: Readonly<DayGridProps>) {\n const tableRef = useRef<HTMLTableElement>(null);\n const today = new Date();\n const weeks = getMonthGrid(view.getFullYear(), view.getMonth(), weekStart);\n // Türkçe dar adlar belirsiz (P/S/Ç/P/C/C/P — iki P, iki C) → her zaman kısa ad.\n const shortNames = weekdayNames(locale, weekStart, \"short\");\n const longNames = weekdayNames(locale, weekStart, \"long\");\n const full = variant === \"full\";\n\n // Odak ızgaranın içindeyken (klavye gezinmesi) ya da açılışta odaklı güne DOM odağı.\n // Klavyeyle gezinince odak yeni hücreye taşınır — ay/sayfa değişince eski hücre DOM'dan\n // kalkar ve odak <body>'ye düşerdi, `contains(activeElement)` bunu yakalayamazdı.\n const navigating = useRef(false);\n useEffect(() => {\n const table = tableRef.current;\n if (!table) return;\n if (!takeFocus && !navigating.current && !table.contains(document.activeElement)) return;\n navigating.current = false;\n table.querySelector<HTMLElement>('[tabindex=\"0\"]')?.focus();\n }, [focused, takeFocus]);\n\n const onKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n if (!isDisabled(focused)) onSelect(focused);\n return;\n }\n const next = dayGridKeyStep(focused, e.key, e.shiftKey, weekStart);\n if (!next) return;\n e.preventDefault();\n navigating.current = true;\n onFocusChange(next);\n };\n\n return (\n <table\n ref={tableRef}\n role={skeleton ? undefined : \"grid\"}\n aria-label={skeleton ? undefined : label}\n aria-hidden={skeleton || undefined}\n onKeyDown={skeleton ? undefined : onKeyDown}\n onMouseLeave={() => onHover?.(null)}\n className={cn(\"w-full border-collapse text-sm\", full ? \"table-fixed\" : \"\")}\n >\n <thead>\n <tr>\n {showWeek && (\n <th scope=\"col\" abbr=\"Hafta\" className=\"relative w-8 pb-1 text-xs font-normal text-mari-muted\">\n <span aria-hidden>Hf</span>\n <span className=\"sr-only\">Hafta</span>\n </th>\n )}\n {shortNames.map((name, i) => (\n <th key={longNames[i]} scope=\"col\" abbr={longNames[i]} className={cn(\"relative pb-1 text-xs font-normal text-mari-muted\", full ? \"pr-2 text-right\" : \"text-center\")}>\n <span aria-hidden>{name}</span>\n <span className=\"sr-only\">{longNames[i]}</span>\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {weeks.map((week) => (\n <tr key={week[0]!.toDateString()}>\n {showWeek && (\n <td className=\"relative text-center text-xs text-mari-muted tabular-nums\">\n {getISOWeek(week[3]!)}\n </td>\n )}\n {week.map((date) => {\n const info: DayCellInfo = {\n date,\n selected: isSelected(date),\n today: isSameDay(date, today),\n disabled: isDisabled(date),\n outside: !isSameMonth(date, view),\n range: rangeOf?.(date) ?? null,\n };\n const isFocused = !skeleton && isSameDay(date, focused);\n if (skeleton) return <SkeletonDay key={date.toDateString()} date={date} full={full} />;\n return (\n <td\n key={date.toDateString()}\n role=\"gridcell\"\n tabIndex={isFocused ? 0 : -1}\n // Kompakt hücrede ad = tam tarih. Tam ekranda aria-label hücre İÇERİĞİNİ (etkinlikler)\n // gizlerdi → ad içerikten: görünmez tam tarih + içerik.\n aria-label={full ? undefined : fullDateLabel(date, locale)}\n aria-selected={info.selected || info.range !== null}\n aria-disabled={info.disabled || undefined}\n aria-current={info.today ? \"date\" : undefined}\n onClick={() => {\n onFocusChange(date);\n if (!info.disabled) onSelect(date);\n }}\n onMouseEnter={() => onHover?.(date)}\n className={cn(\n \"group relative cursor-pointer p-0 outline-none\",\n info.disabled && \"cursor-not-allowed\",\n // Odak halkası hücrenin iç kutusunda (yuvarlak gün kutusu) görünsün.\n full\n ? \"[&:focus-visible>div]:outline-2 [&:focus-visible>div]:outline-offset-1 [&:focus-visible>div]:outline-mari-ring\"\n : \"[&:focus-visible>div>span]:outline-2 [&:focus-visible>div>span]:outline-offset-1 [&:focus-visible>div>span]:outline-mari-ring\",\n !full && info.range && RANGE_BG[info.range],\n full && \"align-top\"\n )}\n >\n {full ? (\n <FullDayContent info={info} locale={locale} cellRender={cellRender} />\n ) : (\n <div className=\"py-0.5 pointer-coarse:py-1.5\">\n <span className={compactDayClass(info)}>{date.getDate()}</span>\n </div>\n )}\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n"],"mappings":"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","names":["_","useEffect","useRef","cn","jsx","jsxs","cn","useRef","useEffect"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/SkeletonSlot.tsx"],"sourcesContent":["import React from \"react\";\nimport { cn } from \"@mari-ui/core\";\n\nexport interface SkeletonSlotProps {\n on: boolean;\n placeholder: React.ReactNode;\n /**\n * Bölgenin YÜKLÜ hâldeki akışı: flex bir ebeveynin (aksiyon hücresi, extra)\n * içeriği flex öğesidir, blok ebeveyninki satır kutusuna girer. Görünmez\n * kopya aynı akışta çizilmezse yükseklik 3-4px kayar (Card'da ölçüldü).\n */\n flow?: \"block\" | \"flex\";\n className?: string;\n children?: React.ReactNode;\n}\n\n/**\n * Faz 15 — iskelette bir bölgeyi yer tutucuya çevirir: gerçek içerik\n * `invisible` olarak aynı grid hücresinde kalır (yükseklik/genişlik korunur,\n * tab sırasından çıkar), yer tutucu üstüne biner. İçerik yoksa (veri henüz\n * gelmedi) kutuyu yer tutucu belirler — her iki durumda da yüklenince zıplama\n * olmaz. Serbest içerik taşıyan component'lerin (Card, Carousel…) ortak aracı.\n */\nexport function SkeletonSlot({ on, placeholder, flow = \"block\", className, children }: Readonly<SkeletonSlotProps>) {\n if (!on) return <>{children}</>;\n return (\n <div aria-hidden className={cn(\"grid\", className)}>\n <div className={cn(\"invisible min-w-0 [grid-area:1/1]\", flow === \"flex\" && \"flex items-center\")}>{children}</div>\n <div className=\"[grid-area:1/1]\">{placeholder}</div>\n </div>\n );\n}\n"],"mappings":";AACA,SAAS,UAAU;AAuBD,wBAEd,YAFc;AADX,SAAS,aAAa,EAAE,IAAI,aAAa,OAAO,SAAS,WAAW,SAAS,GAAgC;AAClH,MAAI,CAAC,GAAI,QAAO,gCAAG,UAAS;AAC5B,SACE,qBAAC,SAAI,eAAW,MAAC,WAAW,GAAG,QAAQ,SAAS,GAC9C;AAAA,wBAAC,SAAI,WAAW,GAAG,qCAAqC,SAAS,UAAU,mBAAmB,GAAI,UAAS;AAAA,IAC3G,oBAAC,SAAI,WAAU,mBAAmB,uBAAY;AAAA,KAChD;AAEJ;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/input/utils.ts"],"sourcesContent":["import type React from \"react\";\nimport { cn, type ColorRole, type Size } from \"@mari-ui/core\";\nimport { borderStrongColorClass } from \"../lib/colorClasses\";\nimport { sizeClass } from \"../lib/sizeClasses\";\nimport type { InputShape, InputVariant } from \"./types\";\n\n/**\n * Kendi `SIZE_CLASS`/`TEXTAREA_SIZE_CLASS` tabloları vardı — `lib.sizeClass`\n * ile SAYISAL OLARAK zaten birebir aynıydı (yükseklik/padding/font). Faz 13\n * gereği tek kaynağa bağlandı; rakip tablo silindi.\n */\nexport function getSizeClasses(size: Size): string {\n return sizeClass[size];\n}\n\n/** Textarea çok satırlı olduğu için sabit `h-*` almaz — geri kalan (padding/font/gap/radius) aynı ölçekten. */\nexport function getTextareaSizeClasses(size: Size): string {\n return cn(sizeClass[size], \"h-auto\");\n}\n\n/**\n * Odakta kenarlık ROL RENGİNE döner (Faz 15): eskiden açık `-border` tonuydu\n * (#93c6f6 ≈ 1.8:1 beyazda — WCAG 1.4.11'in 3:1'ini geçmiyordu; outline\n * Button'da bulunan sorunun aynısı). Ayrıca ofsetli outline yerine kenarlığa\n * yapışık yumuşak bir hale (`ring`) — modern form alanı görünümü, iki ayrı\n * çerçeve üst üste binmiyor. Literal tablo: pseudo-class önekleri runtime'da\n * string birleştirmesiyle kurulmaz (Tailwind taraması).\n */\nconst FOCUS_BORDER_CLASS: Record<ColorRole, string> = {\n primary: \"focus-within:border-mari-primary focus-within:ring-mari-primary/20\",\n accent: \"focus-within:border-mari-accent focus-within:ring-mari-accent/20\",\n success: \"focus-within:border-mari-success focus-within:ring-mari-success/20\",\n error: \"focus-within:border-mari-error focus-within:ring-mari-error/20\",\n warning: \"focus-within:border-mari-warning focus-within:ring-mari-warning/20\",\n info: \"focus-within:border-mari-info focus-within:ring-mari-info/20\",\n neutral: \"focus-within:border-mari-neutral focus-within:ring-mari-neutral/20\",\n};\n\n/** Kutu (wrapper) ortak sınıfları — Input ve Textarea. */\nexport const FIELD_BASE_CLASS = \"transition-[color,background-color,border-color,box-shadow] duration-150 focus-within:ring-3\";\n\n/**\n * Devre dışı: `pointer-events-none` KULLANILMAZ — imleci de kapatıp\n * `cursor-not-allowed`'ı hiç göstermiyordu. Yazmayı native `disabled` engeller.\n */\nexport const FIELD_DISABLED_CLASS = \"opacity-50 cursor-not-allowed [&_*]:cursor-not-allowed\";\n\n/**\n * iOS Safari 16px'ten küçük yazılı bir alana odaklanınca sayfayı yakınlaştırır\n * (ve geri uzaklaştırmaz). Dar ekranda alanın METNİ en az 16px olur; `sm` (640px)\n * ve üstünde boyut ölçeğinin kendi fontu geçerli.\n */\nexport const FIELD_MOBILE_TEXT_CLASS = \"max-sm:text-base\";\n\n/**\n * Kullanıcı geri bildirimi (Faz 13): `color` verilmediyse (yani gerçek bir\n * doğrulama durumu YOKSA) dinlenme halindeki kenarlık HER ZAMAN nötr/gri\n * olmalı (`border-mari-input` — Faz 13.0a'da tam bunun için eklenen ama o\n * zamana kadar hiç tüketilmeyen token) — eskiden varsayılan `\"primary\"`e\n * düşüp her input'u sürekli mavi gösteriyordu. Odaklanınca `primary`e döner.\n * `color` AÇIKÇA verildiyse (örn. `error`/`warning` doğrulama durumu) o renk\n * dinlenme halinde de kalıcıdır — odak beklemeden görünür olmalı.\n */\nexport function getVariantClasses(variant: InputVariant, color: ColorRole | undefined): string {\n // Açık renk (doğrulama durumu) → rol rengi; açık `-border` tonu beyazda\n // ~1.8:1 ile WCAG 1.4.11'in 3:1'ini geçmiyordu (Faz 15).\n const restBorderClass = color ? borderStrongColorClass[color] : \"border-mari-input\";\n const focusBorderClass = FOCUS_BORDER_CLASS[color ?? \"primary\"];\n\n switch (variant) {\n case \"outline\":\n return cn(\"border bg-mari-surface text-mari-foreground\", restBorderClass, focusBorderClass);\n case \"soft\":\n return cn(\"border bg-mari-surface-alt text-mari-foreground\", restBorderClass, focusBorderClass);\n case \"ghost\":\n // Kenarlık yok → odak göstergesi tek başına halka.\n return \"border-none bg-transparent focus-within:ring-mari-ring/40\";\n case \"underlined\":\n // Halkasız: alt çizgili alanın odağı çizginin kendisidir.\n return cn(\"border-b bg-transparent rounded-none focus-within:ring-0\", restBorderClass, focusBorderClass);\n }\n}\n\n/**\n * `underlined` her zaman köşesiz — eskiden `shape` sınıfı varyanttan SONRA\n * geldiği için `rounded-md` kazanıyor ve alt çizginin uçları bükülüyordu.\n */\nexport function getShapeClasses(shape: InputShape, variant?: InputVariant): string {\n if (variant === \"underlined\") return \"rounded-none\";\n return { square: \"rounded-none\", pill: \"rounded-full px-4\", default: \"rounded-md\" }[shape];\n}\n\nexport function isClearable(allowClear: boolean | { clearIcon?: React.ReactNode } | undefined): boolean {\n return typeof allowClear === \"boolean\" ? allowClear : !!allowClear;\n}\n\n/**\n * Temizle düğmesi alanı GERÇEK bir değişiklik olarak boşaltır: yerel değer\n * setter'ı + `input` olayı → React `onChange`'i gerçek bir ChangeEvent'le\n * çalışır. Eskiden yalnız iç state siliniyordu; kontrollü kullanımda\n * (`value` + `onChange`) `onChange` hiç çağrılmadığı için X hiçbir şey\n * silmiyordu (Tree arama story'sinde yakalandı).\n */\nexport function clearNativeValue(el: HTMLInputElement | HTMLTextAreaElement | null): void {\n if (!el) return;\n const proto = el instanceof HTMLTextAreaElement ? HTMLTextAreaElement.prototype : HTMLInputElement.prototype;\n Object.getOwnPropertyDescriptor(proto, \"value\")?.set?.call(el, \"\");\n el.dispatchEvent(new Event(\"input\", { bubbles: true }));\n}\n\n"],"mappings":";;;;;;;;AACA,SAAS,UAAqC;AAUvC,SAAS,eAAe,MAAoB;AACjD,SAAO,UAAU,IAAI;AACvB;AAGO,SAAS,uBAAuB,MAAoB;AACzD,SAAO,GAAG,UAAU,IAAI,GAAG,QAAQ;AACrC;AAUA,IAAM,qBAAgD;AAAA,EACpD,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AAAA,EACN,SAAS;AACX;AAGO,IAAM,mBAAmB;AAMzB,IAAM,uBAAuB;AAO7B,IAAM,0BAA0B;AAWhC,SAAS,kBAAkB,SAAuB,OAAsC;AAG7F,QAAM,kBAAkB,QAAQ,uBAAuB,KAAK,IAAI;AAChE,QAAM,mBAAmB,mBAAmB,SAAS,SAAS;AAE9D,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,aAAO,GAAG,+CAA+C,iBAAiB,gBAAgB;AAAA,IAC5F,KAAK;AACH,aAAO,GAAG,mDAAmD,iBAAiB,gBAAgB;AAAA,IAChG,KAAK;AAEH,aAAO;AAAA,IACT,KAAK;AAEH,aAAO,GAAG,4DAA4D,iBAAiB,gBAAgB;AAAA,EAC3G;AACF;AAMO,SAAS,gBAAgB,OAAmB,SAAgC;AACjF,MAAI,YAAY,aAAc,QAAO;AACrC,SAAO,EAAE,QAAQ,gBAAgB,MAAM,qBAAqB,SAAS,aAAa,EAAE,KAAK;AAC3F;AAEO,SAAS,YAAY,YAA4E;AACtG,SAAO,OAAO,eAAe,YAAY,aAAa,CAAC,CAAC;AAC1D;AASO,SAAS,iBAAiB,IAAyD;AACxF,MAAI,CAAC,GAAI;AACT,QAAM,QAAQ,cAAc,sBAAsB,oBAAoB,YAAY,iBAAiB;AACnG,SAAO,yBAAyB,OAAO,OAAO,GAAG,KAAK,KAAK,IAAI,EAAE;AACjE,KAAG,cAAc,IAAI,MAAM,SAAS,EAAE,SAAS,KAAK,CAAC,CAAC;AACxD;","names":[]}