@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
package/dist/switch.js CHANGED
@@ -4,10 +4,10 @@ import {
4
4
  bgSolidClass,
5
5
  textClass,
6
6
  textSolidContrastClass
7
- } from "./chunk-IP2J3BWY.js";
7
+ } from "./chunk-6AMBZXZJ.js";
8
8
  import {
9
9
  skeletonBoxProps
10
- } from "./chunk-54HHEXXD.js";
10
+ } from "./chunk-VKN374SD.js";
11
11
 
12
12
  // src/switch/Switch.tsx
13
13
  import { useId } from "react";
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/switch/Switch.tsx","../src/switch/utils.ts"],"sourcesContent":["\"use client\";\n\nimport React, { useId } from \"react\";\nimport { Loader2Icon } from \"lucide-react\";\nimport { cn, useControllableState } from \"@mari-ui/core\";\nimport { textClass, textSolidContrastClass } from \"../lib/colorClasses\";\nimport { skeletonBoxProps } from \"../lib/skeleton\";\nimport type { SwitchProps } from \"./types\";\nimport { getBallClass, getSpinnerSize, getTrackClass, getTrackSizeClass, SWITCH_TOUCH_TARGET_CLASS } from \"./utils\";\n\nexport type { SwitchProps };\n\n/**\n * Eskiden `Button` component'inin üzerine `!p-0.5` gibi `!important`\n * override'larla bindiriliyordu (bkz. plan Faz 3 denetimi: \"Switch,\n * Button'ın kendi boyut class'larıyla savaşmak için `!important`\n * kullanıyor\"). Switch, Button'la aynı boyut/dolgu sözleşmesini\n * paylaşmadığı için (track genişliği Button'ın skalasında yok) bu hack\n * gerekiyordu. Artık bağımsız bir `<button>` render ediyor — override\n * savaşı ortadan kalktı.\n */\nexport function Switch({\n checked,\n defaultChecked = false,\n onChange,\n disabled = false,\n label,\n switchTrueLabel,\n switchFalseLabel,\n size = \"md\",\n color = \"primary\",\n loading,\n className,\n skeleton = false,\n \"aria-label\": ariaLabel,\n}: Readonly<SwitchProps>) {\n const [isChecked, setIsChecked] = useControllableState<boolean>({ value: checked, defaultValue: defaultChecked, onChange });\n // `label` eskiden salt dekoratif bir <span>'di — ne ekran okuyucuya\n // duyurulan bir isim ne de tıklanabilir bir etiket olarak switch'e\n // bağlıydı (Checkbox/Radio'nun aksine). `<label htmlFor>` hem\n // `aria-labelledby` gerektirmeden erişilebilir adı sağlar hem de metne\n // tıklamayı switch'i değiştirir.\n const switchId = useId();\n\n const hasLabel = Boolean(switchTrueLabel || switchFalseLabel);\n\n if (skeleton) {\n return (\n <div aria-hidden className=\"flex w-full items-center gap-2\">\n {label && <span {...skeletonBoxProps(\"rounded-sm text-sm\")}>{label}</span>}\n <span {...skeletonBoxProps(cn(\"inline-block shrink-0 rounded-full\", getTrackSizeClass(size, hasLabel), className))} />\n </div>\n );\n }\n\n return (\n <div className=\"flex items-center w-full gap-2\">\n {label && (\n <label htmlFor={switchId} className={cn(\"text-sm text-mari-foreground\", disabled && \"cursor-not-allowed text-mari-disabled\")}>\n {label}\n </label>\n )}\n <button\n type=\"button\"\n id={switchId}\n onClick={() => !disabled && !loading && setIsChecked(!isChecked)}\n disabled={disabled || loading}\n aria-checked={isChecked}\n aria-busy={loading || undefined}\n aria-label={label ? undefined : ariaLabel}\n role=\"switch\"\n className={cn(\n // `overflow-hidden` BURADA YOK — dokunmatik hedefin `::before`'unu\n // kırpardı. Kayan iç etiketler aşağıdaki ayrı kırpma katmanında.\n \"group relative inline-flex shrink-0 cursor-pointer items-center justify-start rounded-full transition-colors duration-200\",\n SWITCH_TOUCH_TARGET_CLASS[size],\n // Buton'daki (Faz 13.1) aynı odak halkası deseni — eskiden `focus:ring-0`\n // ile TAMAMEN kapatılmıştı, klavye kullanıcısı odağın nerede olduğunu göremiyordu.\n \"focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-mari-ring\",\n (disabled || loading) && \"opacity-50 cursor-not-allowed\",\n getTrackClass(size, color, isChecked, hasLabel),\n className\n )}\n >\n <span\n className={cn(\n // `shadow` — ant.design'ın topu da düz bir daire değil, hafif bir\n // gölgeyle (0 2px 4px) track'ten AYRIŞIR; eskiden gölgesiz düz\n // bir beyaz daireydi, track'e \"yapışık\" görünüyordu.\n \"absolute z-10 flex items-center justify-center rounded-full shadow transition-all duration-200\",\n // Basılıyken top hafif uzar (ant.design). Eskiden `group-focus:` idi —\n // fareyle tıklayınca buton odakta kaldığı için top UZAMIŞ HALDE takılı kalıyordu.\n isChecked ? \"group-active:scale-x-[1.166] group-active:origin-right\" : \"group-active:scale-x-[1.166] group-active:origin-left\",\n // Top HER ZAMAN beyaz (iOS/ant.design). Eskiden açıkken rengin\n // \"üstündeki metin\" kontrast rengiydi — success/info gibi açık\n // dolgularda o renk siyah çıkıyordu; kapalıyken de koyu `foreground`.\n \"bg-white\",\n getBallClass(size, isChecked)\n )}\n >\n {loading && (\n <Loader2Icon\n size={getSpinnerSize(size)}\n // Spinner rengi track'in rengini yansıtır (ant.design'ın deseni) —\n // eskiden sabit `text-black`ti, hangi renk/durumda olursa olsun\n // aynı görünüyordu.\n className={cn(\"animate-spin\", isChecked ? textClass[color] : \"text-mari-muted\")}\n />\n )}\n </span>\n {hasLabel && (\n <span aria-hidden className=\"absolute inset-0 overflow-hidden rounded-full\">\n {/* Kullanıcı geri bildirimi: etiket track kenarına çok bitişikti VE\n dikeyden ortalı değildi — sabit bir `top-1.5` (6px) her boyutta\n AYNI kalıyordu (sm/md/lg track yükseklikleri farklı olduğu için\n sadece birinde doğru olabilirdi). `inset-y-0 flex items-center`\n ile track'in GERÇEK yüksekliğine göre her zaman dikey ortalı;\n kenar payı da `1`(4px) → `1.5`(6px) yapıldı, thumb'a/kenara\n yapışık durmasın diye. */}\n <span\n className={cn(\n \"absolute inset-y-0 flex items-center text-xs leading-none whitespace-nowrap transition-all duration-300\",\n textSolidContrastClass[color],\n isChecked ? \"left-1.5\" : \"-left-20\"\n )}\n >\n {switchTrueLabel}\n </span>\n <span\n className={cn(\n \"absolute inset-y-0 flex items-center text-xs leading-none whitespace-nowrap transition-all duration-300\",\n textSolidContrastClass.neutral,\n !isChecked ? \"right-1.5\" : \"-right-20\"\n )}\n >\n {switchFalseLabel}\n </span>\n </span>\n )}\n </button>\n </div>\n );\n}\n","import { cn, type ColorRole, type Size } from \"@mari-ui/core\";\nimport { bgSolidClass } from \"../lib/colorClasses\";\n\n/**\n * Kullanıcı geri bildirimi (Faz 13): eskiden `md` bile 28×64px'ti (`lg`\n * 32×96px) — ant.design'ın switch'i referans alındığında (default 22×44px,\n * small 16×28px) çok büyük duruyordu. Track/thumb oranları ant'a hizalandı:\n * `sm`≈ant'ın small'ı, `md`=ant'ın default'u (birebir), `lg` orantılı\n * büyütülmüş bir üçüncü basamak (ant'ta yok).\n */\nconst TRACK_SIZE_CLASS: Record<Size, string> = {\n sm: \"h-4 w-8\",\n md: \"h-[1.375rem] w-11\", // 22×44px — ant.design'ın \"default\" boyutuyla birebir\n lg: \"h-7 w-14\",\n};\n\n/**\n * `switchTrueLabel`/`switchFalseLabel` verildiğinde (ant'ın \"Text & icon\"\n * örneğindeki gibi) normal track bu metne yer açamıyordu — \"Kapalı\" gibi\n * bir etiket track'in DIŞINA taşıp kesiliyordu (Faz 13 kullanıcı geri\n * bildirimi). Etiketli kullanım için daha geniş, ayrı bir preset.\n */\nconst TRACK_SIZE_WITH_LABEL_CLASS: Record<Size, string> = {\n sm: \"h-4 w-14\",\n md: \"h-[1.375rem] w-20\",\n lg: \"h-7 w-28\",\n};\n\n/**\n * Kullanıcı geri bildirimi: `lg` topu track'in kenarına tam oturmuyordu\n * (devtools'ta elle `calc(100% - 1.675rem)` denenince doğru görünmüştü).\n * Kök sebep: dikey kenar payı (`top-0.5` = 2px, üçü de aynı) ile yatay\n * kenar payı (`left-1` = 4px) TUTARSIZDI — top burada 2px'i, sağdaki/soldaki\n * ise 4px'i kullanıyordu, top hem tüm boyutlarda aynı hem de gerçek \"track\n * yüksekliği - thumb yüksekliği\" farkına (hep 4px, yarısı 2px) denk\n * geliyordu; yatay pay ise elle `1` (4px) yazılmış, aynı mantığı izlemiyordu.\n * Artık YATAY pay da `0.5` (2px) — dikeyle birebir aynı — ve \"açık\" konumdaki\n * `calc(100% - X)` değeri `thumb genişliği + 2px` olarak HESAPLANDI (elle\n * tahmin edilmedi): sm 0.75+0.125=0.875rem, md 1.125+0.125=1.25rem,\n * lg 1.5+0.125=1.625rem (kullanıcının devtools'ta bulduğu 1.675rem'e çok\n * yakın — aradaki fark elle sürükleyip bırakmanın hassasiyet payı).\n */\nconst BALL_SIZE_CLASS: Record<Size, string> = {\n sm: \"h-3 w-3 top-0.5\",\n md: \"h-[1.125rem] w-[1.125rem] top-0.5\", // 18px\n lg: \"h-6 w-6 top-0.5\",\n};\n\nconst BALL_LEFT_ON_CLASS: Record<Size, string> = {\n sm: \"left-[calc(100%-0.875rem)]\",\n md: \"left-[calc(100%-1.25rem)]\",\n lg: \"left-[calc(100%-1.625rem)]\",\n};\n\n// Yeni (küçültülmüş) thumb boyutlarına göre — sabit 24px'lik lucide\n// varsayılanı artık topun kendisinden büyük olurdu.\nconst SPINNER_SIZE: Record<Size, number> = { sm: 10, md: 14, lg: 20 };\n\n/**\n * Dokunmatik hedef: track yüksekliği sm 16 / md 22 / lg 28px → 44px'e tamamlar.\n * `sm` track'i (32px) yatayda da 44'e genişler.\n */\nexport const SWITCH_TOUCH_TARGET_CLASS: Record<Size, string> = {\n sm: \"pointer-coarse:before:absolute pointer-coarse:before:-inset-x-1.5 pointer-coarse:before:-inset-y-3.5\",\n md: \"pointer-coarse:before:absolute pointer-coarse:before:inset-x-0 pointer-coarse:before:-inset-y-2.5\",\n lg: \"pointer-coarse:before:absolute pointer-coarse:before:inset-x-0 pointer-coarse:before:-inset-y-2\",\n};\n\nexport function getTrackSizeClass(size: Size, hasLabel: boolean): string {\n return hasLabel ? TRACK_SIZE_WITH_LABEL_CLASS[size] : TRACK_SIZE_CLASS[size];\n}\n\nexport function getSpinnerSize(size: Size): number {\n return SPINNER_SIZE[size];\n}\n\nexport function getTrackClass(size: Size, color: ColorRole, checked: boolean, hasLabel: boolean): string {\n // Kapalı track'te KENARLIK YOK (Faz 15): 1px kenarlık iç kutuyu 2px\n // küçültüyor, top (track − 4px) kutuya sığmayıp alttan/soldan taşıyordu.\n // Kapalı hal her renkte aynı nötr gri — renk yalnızca \"açık\"ı anlatır.\n // İç etiketliyken kapalı track `neutral` dolgusu: `input` grisi üstünde ne\n // koyu (okunmuyordu) ne beyaz (3.6:1) metin yeterli; neutral dolgu + onun\n // kontrast rengi 5.6:1 (koyu temada otomatik tersine döner).\n let offTrack = \"bg-mari-input\";\n if (hasLabel) offTrack = bgSolidClass.neutral;\n return cn(hasLabel ? TRACK_SIZE_WITH_LABEL_CLASS[size] : TRACK_SIZE_CLASS[size], checked ? bgSolidClass[color] : offTrack);\n}\n\nexport function getBallClass(size: Size, checked: boolean): string {\n return cn(BALL_SIZE_CLASS[size], checked ? BALL_LEFT_ON_CLASS[size] : \"left-0.5\");\n}\n"],"mappings":"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","names":["cn","cn"]}
1
+ {"version":3,"sources":["../src/switch/Switch.tsx","../src/switch/utils.ts"],"sourcesContent":["\"use client\";\n\nimport React, { useId } from \"react\";\nimport { Loader2Icon } from \"lucide-react\";\nimport { cn, useControllableState } from \"@mari-ui/core\";\nimport { textClass, textSolidContrastClass } from \"../lib/colorClasses\";\nimport { skeletonBoxProps } from \"../lib/skeleton\";\nimport type { SwitchProps } from \"./types\";\nimport { getBallClass, getSpinnerSize, getTrackClass, getTrackSizeClass, SWITCH_TOUCH_TARGET_CLASS } from \"./utils\";\n\nexport type { SwitchProps };\n\n/*\n * Eskiden `Button` component'inin üzerine `!p-0.5` gibi `!important`\n * override'larla bindiriliyordu. Switch, Button'la aynı boyut/dolgu sözleşmesini\n * paylaşmadığı için (track genişliği Button'ın skalasında yok) bu hack\n * gerekiyordu. Artık bağımsız bir `<button>` render ediyor — override\n * savaşı ortadan kalktı.\n */\n/** Açma/kapama anahtarı (`role=\"switch\"`). `label` ile etiketlenir, `color` ile rengi seçilir. */\nexport function Switch({\n checked,\n defaultChecked = false,\n onChange,\n disabled = false,\n label,\n switchTrueLabel,\n switchFalseLabel,\n size = \"md\",\n color = \"primary\",\n loading,\n className,\n skeleton = false,\n \"aria-label\": ariaLabel,\n}: Readonly<SwitchProps>) {\n const [isChecked, setIsChecked] = useControllableState<boolean>({ value: checked, defaultValue: defaultChecked, onChange });\n // `label` eskiden salt dekoratif bir <span>'di — ne ekran okuyucuya\n // duyurulan bir isim ne de tıklanabilir bir etiket olarak switch'e\n // bağlıydı (Checkbox/Radio'nun aksine). `<label htmlFor>` hem\n // `aria-labelledby` gerektirmeden erişilebilir adı sağlar hem de metne\n // tıklamayı switch'i değiştirir.\n const switchId = useId();\n\n const hasLabel = Boolean(switchTrueLabel || switchFalseLabel);\n\n if (skeleton) {\n return (\n <div aria-hidden className=\"flex w-full items-center gap-2\">\n {label && <span {...skeletonBoxProps(\"rounded-sm text-sm\")}>{label}</span>}\n <span {...skeletonBoxProps(cn(\"inline-block shrink-0 rounded-full\", getTrackSizeClass(size, hasLabel), className))} />\n </div>\n );\n }\n\n return (\n <div className=\"flex items-center w-full gap-2\">\n {label && (\n <label htmlFor={switchId} className={cn(\"text-sm text-mari-foreground\", disabled && \"cursor-not-allowed text-mari-disabled\")}>\n {label}\n </label>\n )}\n <button\n type=\"button\"\n id={switchId}\n onClick={() => !disabled && !loading && setIsChecked(!isChecked)}\n disabled={disabled || loading}\n aria-checked={isChecked}\n aria-busy={loading || undefined}\n aria-label={label ? undefined : ariaLabel}\n role=\"switch\"\n className={cn(\n // `overflow-hidden` BURADA YOK — dokunmatik hedefin `::before`'unu\n // kırpardı. Kayan iç etiketler aşağıdaki ayrı kırpma katmanında.\n \"group relative inline-flex shrink-0 cursor-pointer items-center justify-start rounded-full transition-colors duration-200\",\n SWITCH_TOUCH_TARGET_CLASS[size],\n // Buton'daki (Faz 13.1) aynı odak halkası deseni — eskiden `focus:ring-0`\n // ile TAMAMEN kapatılmıştı, klavye kullanıcısı odağın nerede olduğunu göremiyordu.\n \"focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-mari-ring\",\n (disabled || loading) && \"opacity-50 cursor-not-allowed\",\n getTrackClass(size, color, isChecked, hasLabel),\n className\n )}\n >\n <span\n className={cn(\n // `shadow` — ant.design'ın topu da düz bir daire değil, hafif bir\n // gölgeyle (0 2px 4px) track'ten AYRIŞIR; eskiden gölgesiz düz\n // bir beyaz daireydi, track'e \"yapışık\" görünüyordu.\n \"absolute z-10 flex items-center justify-center rounded-full shadow transition-all duration-200\",\n // Basılıyken top hafif uzar (ant.design). Eskiden `group-focus:` idi —\n // fareyle tıklayınca buton odakta kaldığı için top UZAMIŞ HALDE takılı kalıyordu.\n isChecked ? \"group-active:scale-x-[1.166] group-active:origin-right\" : \"group-active:scale-x-[1.166] group-active:origin-left\",\n // Top HER ZAMAN beyaz (iOS/ant.design). Eskiden açıkken rengin\n // \"üstündeki metin\" kontrast rengiydi — success/info gibi açık\n // dolgularda o renk siyah çıkıyordu; kapalıyken de koyu `foreground`.\n \"bg-white\",\n getBallClass(size, isChecked)\n )}\n >\n {loading && (\n <Loader2Icon\n size={getSpinnerSize(size)}\n // Spinner rengi track'in rengini yansıtır (ant.design'ın deseni) —\n // eskiden sabit `text-black`ti, hangi renk/durumda olursa olsun\n // aynı görünüyordu.\n className={cn(\"animate-spin\", isChecked ? textClass[color] : \"text-mari-muted\")}\n />\n )}\n </span>\n {hasLabel && (\n <span aria-hidden className=\"absolute inset-0 overflow-hidden rounded-full\">\n {/* Kullanıcı geri bildirimi: etiket track kenarına çok bitişikti VE\n dikeyden ortalı değildi — sabit bir `top-1.5` (6px) her boyutta\n AYNI kalıyordu (sm/md/lg track yükseklikleri farklı olduğu için\n sadece birinde doğru olabilirdi). `inset-y-0 flex items-center`\n ile track'in GERÇEK yüksekliğine göre her zaman dikey ortalı;\n kenar payı da `1`(4px) → `1.5`(6px) yapıldı, thumb'a/kenara\n yapışık durmasın diye. */}\n <span\n className={cn(\n \"absolute inset-y-0 flex items-center text-xs leading-none whitespace-nowrap transition-all duration-300\",\n textSolidContrastClass[color],\n isChecked ? \"left-1.5\" : \"-left-20\"\n )}\n >\n {switchTrueLabel}\n </span>\n <span\n className={cn(\n \"absolute inset-y-0 flex items-center text-xs leading-none whitespace-nowrap transition-all duration-300\",\n textSolidContrastClass.neutral,\n !isChecked ? \"right-1.5\" : \"-right-20\"\n )}\n >\n {switchFalseLabel}\n </span>\n </span>\n )}\n </button>\n </div>\n );\n}\n","import { cn, type ColorRole, type Size } from \"@mari-ui/core\";\nimport { bgSolidClass } from \"../lib/colorClasses\";\n\n/*\n * Kullanıcı geri bildirimi: eskiden `md` bile 28×64px'ti (`lg`\n * 32×96px) — ant.design'ın switch'i referans alındığında (default 22×44px,\n * small 16×28px) çok büyük duruyordu. Track/thumb oranları ant'a hizalandı:\n * `sm`≈ant'ın small'ı, `md`=ant'ın default'u (birebir), `lg` orantılı\n * büyütülmüş bir üçüncü basamak (ant'ta yok).\n */\nconst TRACK_SIZE_CLASS: Record<Size, string> = {\n sm: \"h-4 w-8\",\n md: \"h-[1.375rem] w-11\", // 22×44px — ant.design'ın \"default\" boyutuyla birebir\n lg: \"h-7 w-14\",\n};\n\n/**\n * `switchTrueLabel`/`switchFalseLabel` verildiğinde (ant'ın \"Text & icon\"\n * örneğindeki gibi) normal track bu metne yer açamıyordu — \"Kapalı\" gibi\n * bir etiket track'in DIŞINA taşıp kesiliyordu. Etiketli kullanım için daha geniş, ayrı bir preset.\n */\nconst TRACK_SIZE_WITH_LABEL_CLASS: Record<Size, string> = {\n sm: \"h-4 w-14\",\n md: \"h-[1.375rem] w-20\",\n lg: \"h-7 w-28\",\n};\n\n/*\n * Kullanıcı geri bildirimi: `lg` topu track'in kenarına tam oturmuyordu\n * (devtools'ta elle `calc(100% - 1.675rem)` denenince doğru görünmüştü).\n * Kök sebep: dikey kenar payı (`top-0.5` = 2px, üçü de aynı) ile yatay\n * kenar payı (`left-1` = 4px) TUTARSIZDI — top burada 2px'i, sağdaki/soldaki\n * ise 4px'i kullanıyordu, top hem tüm boyutlarda aynı hem de gerçek \"track\n * yüksekliği - thumb yüksekliği\" farkına (hep 4px, yarısı 2px) denk\n * geliyordu; yatay pay ise elle `1` (4px) yazılmış, aynı mantığı izlemiyordu.\n * Artık YATAY pay da `0.5` (2px) — dikeyle birebir aynı — ve \"açık\" konumdaki\n * `calc(100% - X)` değeri `thumb genişliği + 2px` olarak HESAPLANDI (elle\n * tahmin edilmedi): sm 0.75+0.125=0.875rem, md 1.125+0.125=1.25rem,\n * lg 1.5+0.125=1.625rem (kullanıcının devtools'ta bulduğu 1.675rem'e çok\n * yakın — aradaki fark elle sürükleyip bırakmanın hassasiyet payı).\n */\nconst BALL_SIZE_CLASS: Record<Size, string> = {\n sm: \"h-3 w-3 top-0.5\",\n md: \"h-[1.125rem] w-[1.125rem] top-0.5\", // 18px\n lg: \"h-6 w-6 top-0.5\",\n};\n\nconst BALL_LEFT_ON_CLASS: Record<Size, string> = {\n sm: \"left-[calc(100%-0.875rem)]\",\n md: \"left-[calc(100%-1.25rem)]\",\n lg: \"left-[calc(100%-1.625rem)]\",\n};\n\n// Yeni (küçültülmüş) thumb boyutlarına göre — sabit 24px'lik lucide\n// varsayılanı artık topun kendisinden büyük olurdu.\nconst SPINNER_SIZE: Record<Size, number> = { sm: 10, md: 14, lg: 20 };\n\n/**\n * Dokunmatik hedef: track yüksekliği sm 16 / md 22 / lg 28px → 44px'e tamamlar.\n * `sm` track'i (32px) yatayda da 44'e genişler.\n */\nexport const SWITCH_TOUCH_TARGET_CLASS: Record<Size, string> = {\n sm: \"pointer-coarse:before:absolute pointer-coarse:before:-inset-x-1.5 pointer-coarse:before:-inset-y-3.5\",\n md: \"pointer-coarse:before:absolute pointer-coarse:before:inset-x-0 pointer-coarse:before:-inset-y-2.5\",\n lg: \"pointer-coarse:before:absolute pointer-coarse:before:inset-x-0 pointer-coarse:before:-inset-y-2\",\n};\n\nexport function getTrackSizeClass(size: Size, hasLabel: boolean): string {\n return hasLabel ? TRACK_SIZE_WITH_LABEL_CLASS[size] : TRACK_SIZE_CLASS[size];\n}\n\nexport function getSpinnerSize(size: Size): number {\n return SPINNER_SIZE[size];\n}\n\nexport function getTrackClass(size: Size, color: ColorRole, checked: boolean, hasLabel: boolean): string {\n // Kapalı track'te KENARLIK YOK (Faz 15): 1px kenarlık iç kutuyu 2px\n // küçültüyor, top (track − 4px) kutuya sığmayıp alttan/soldan taşıyordu.\n // Kapalı hal her renkte aynı nötr gri — renk yalnızca \"açık\"ı anlatır.\n // İç etiketliyken kapalı track `neutral` dolgusu: `input` grisi üstünde ne\n // koyu (okunmuyordu) ne beyaz (3.6:1) metin yeterli; neutral dolgu + onun\n // kontrast rengi 5.6:1 (koyu temada otomatik tersine döner).\n let offTrack = \"bg-mari-input\";\n if (hasLabel) offTrack = bgSolidClass.neutral;\n return cn(hasLabel ? TRACK_SIZE_WITH_LABEL_CLASS[size] : TRACK_SIZE_CLASS[size], checked ? bgSolidClass[color] : offTrack);\n}\n\nexport function getBallClass(size: Size, checked: boolean): string {\n return cn(BALL_SIZE_CLASS[size], checked ? BALL_LEFT_ON_CLASS[size] : \"left-0.5\");\n}\n"],"mappings":"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","names":["cn","cn"]}
package/dist/table.js CHANGED
@@ -2,43 +2,43 @@
2
2
 
3
3
  import {
4
4
  Tooltip
5
- } from "./chunk-ZMA7BT2L.js";
5
+ } from "./chunk-XWBJPA3D.js";
6
6
  import {
7
7
  Pagination
8
- } from "./chunk-TXRQCHOR.js";
8
+ } from "./chunk-ZAR3SCPV.js";
9
9
  import {
10
10
  Empty
11
- } from "./chunk-LBXIPDAB.js";
11
+ } from "./chunk-JXD5DW6E.js";
12
12
  import {
13
13
  Drawer
14
- } from "./chunk-KCYM2JXP.js";
14
+ } from "./chunk-FWSMUUZ5.js";
15
15
  import {
16
16
  useScrollable
17
17
  } from "./chunk-KG6A32KX.js";
18
- import "./chunk-JNZODUXP.js";
19
- import "./chunk-V7KDUUV6.js";
18
+ import "./chunk-OYDG6C54.js";
19
+ import "./chunk-RMNV2CE2.js";
20
20
  import {
21
21
  SkeletonBlock
22
- } from "./chunk-NPM7IDYV.js";
22
+ } from "./chunk-TSFAAREV.js";
23
23
  import {
24
24
  Input
25
- } from "./chunk-P7Z5BREP.js";
26
- import "./chunk-XUKVQO6M.js";
25
+ } from "./chunk-L6DBWUAB.js";
26
+ import "./chunk-6CSUVVFG.js";
27
27
  import {
28
28
  SkeletonSlot
29
- } from "./chunk-DKENCYHA.js";
30
- import "./chunk-YZ7MDC6B.js";
29
+ } from "./chunk-MXGY2ENX.js";
30
+ import "./chunk-LNL4TCGL.js";
31
31
  import "./chunk-KSPM2Z3T.js";
32
- import "./chunk-DUCIAQGR.js";
33
- import "./chunk-LBQMEHK6.js";
34
- import "./chunk-NS7FKOFI.js";
35
- import "./chunk-TCYDVNSU.js";
32
+ import "./chunk-NENNFQEY.js";
33
+ import "./chunk-NPFMPRII.js";
34
+ import "./chunk-NYXU5EFE.js";
35
+ import "./chunk-MT4VH7QV.js";
36
36
  import {
37
37
  Button
38
- } from "./chunk-2IEXY3OZ.js";
39
- import "./chunk-FFXRFQSU.js";
40
- import "./chunk-IP2J3BWY.js";
41
- import "./chunk-54HHEXXD.js";
38
+ } from "./chunk-CVKAGR3D.js";
39
+ import "./chunk-POBOJBNJ.js";
40
+ import "./chunk-6AMBZXZJ.js";
41
+ import "./chunk-VKN374SD.js";
42
42
 
43
43
  // src/table/Table.tsx
44
44
  import { useMemo, useRef as useRef2 } from "react";
package/dist/table.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/table/Table.tsx","../src/table/_components/TableAccordion.tsx","../src/table/utils.ts","../src/table/_components/TableCellSkeleton.tsx","../src/table/_components/TableInfoValue.tsx","../src/table/_components/TableRowActions.tsx","../src/table/_components/TableEditDrawer.tsx","../src/table/_components/TableBody.tsx","../src/table/_components/TableHeader.tsx","../src/table/_components/TablePagination.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useMemo, useRef } from \"react\";\nimport { cn } from \"@mari-ui/core\";\nimport { useScrollable } from \"../lib/useScrollable\";\nimport { TableAccordion } from \"./_components/TableAccordion\";\nimport { TableBody } from \"./_components/TableBody\";\nimport { TableHeader } from \"./_components/TableHeader\";\nimport { TablePagination } from \"./_components/TablePagination\";\nimport type { TableProps } from \"./types\";\n\nexport type { TableProps };\n\n/**\n * Eskiden `tableHeader: string[]` ve `tableBody: ColumnProps<T>[]` İKİ AYRI\n * paralel diziydi, elle senkron tutuluyordu (bkz. plan denetimi). Artık tek\n * bir `columns` dizisi.\n *\n * Kullanıcı bulgularına göre (bkz. plan/sohbet) tamamen elden geçirildi:\n * - Sütun hizalaması artık DOM index'ine göre değil `col.align`'a göre\n * (varsayılan sola hizalı, hepsi tutarlı).\n * - `loading` prop'u KALDIRILDI — anlamsız bir spinner gösteriyordu; gerçek\n * skeleton yapısı ileride TÜM component'ler için birlikte gelecek.\n * - Veri boşken artık gerçek `Empty` component'i (bkz. `TableBody`).\n * - İşlemler sütunu tablo yatay kaydırıldığında sağda `sticky` kalır\n * (`overflow-x-auto` + `<td>`/`<th>`'de `sticky right-0`).\n * - `responsive=\"accordion\"` dar ekranda (`md` altı) satırları tablo yerine\n * açılır/kapanır kartlar olarak gösterir (bkz. `TableAccordion`).\n * - `pagination` verilirse altta sayfalama kontrolleri render edilir;\n * `paginationMode=\"client\"` iken `Table` kendi diler, `\"server\"`\n * (varsayılan) iken `data`'nın zaten o sayfaya ait dilim olduğu varsayılır.\n */\nexport function Table<T extends { id: string }>({\n data,\n columns,\n className,\n emptyState,\n responsive = \"scroll\",\n pagination,\n paginationMode = \"server\",\n label,\n skeleton = false,\n}: Readonly<TableProps<T>>) {\n // Yatay kaydırılan bölge klavyeyle de kaydırılabilmeli (axe\n // `scrollable-region-focusable`): SADECE gerçekten taşarken tab durağı olur —\n // sığan bir tabloya boşuna bir durak eklemesin.\n const scrollRef = useRef<HTMLDivElement>(null);\n const scrollable = useScrollable(scrollRef, \"x\");\n\n const pageData = useMemo(() => {\n if (!pagination || paginationMode !== \"client\") return data;\n const start = (pagination.page - 1) * pagination.pageSize;\n return data.slice(start, start + pagination.pageSize);\n }, [data, pagination, paginationMode]);\n\n return (\n // Kullanıcı bulgusu: eskiden tablo dolu, kalın bir kutu (`border` + `bg-\n // mari-neutral-subtle` başlık) içindeydi — \"çok irrite duruyor\" tepkisi\n // aldı. Modern dashboard tabloları (Linear/Stripe/Vercel tarzı) ağır bir\n // kutu yerine sadece satır ayırıcılarına güvenir; sınır artık `rounded-lg`\n // + tek bir ince kenarlıkla (kutu değil) daha sessiz bir çerçeve çiziyor.\n <div className={cn(\"rounded-lg border border-mari-border\", className)} aria-busy={skeleton || undefined}>\n <div\n ref={scrollRef}\n className={cn(\n // `relative`: içerideki `sr-only` (position:absolute) öğelerin taşıyıcısı\n // olsun — yoksa kaydırma kutusundan kaçıp sayfayı yatay taşırıyorlardı (375px'te ölçüldü).\n \"relative overflow-x-auto rounded-lg focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-mari-ring\",\n responsive === \"accordion\" && \"hidden md:block\"\n )}\n {...(scrollable ? { role: \"region\", \"aria-label\": label ?? \"Tablo\", tabIndex: 0 } : {})}\n >\n <table className=\"w-full min-w-[36rem]\">\n {label && <caption className=\"sr-only\">{label}</caption>}\n <TableHeader columns={columns} skeleton={skeleton} />\n <TableBody data={pageData} columns={columns} emptyState={emptyState} skeleton={skeleton} pageSize={pagination?.pageSize} />\n </table>\n </div>\n {responsive === \"accordion\" && (\n <TableAccordion\n data={pageData}\n columns={columns}\n emptyState={emptyState}\n skeleton={skeleton}\n pageSize={pagination?.pageSize}\n className=\"block border-0 md:hidden\"\n />\n )}\n {pagination && <TablePagination pagination={pagination} skeleton={skeleton} />}\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { ChevronDownIcon } from \"lucide-react\";\nimport { cn } from \"@mari-ui/core\";\nimport { Empty } from \"../../empty\";\nimport { Input } from \"../../input\";\nimport { SkeletonSlot } from \"../../lib/SkeletonSlot\";\nimport { clearRowDraft, getRowLabel, setRowDraftValue, skeletonRowCount, skeletonWidth } from \"../utils\";\nimport { TableCellSkeleton } from \"./TableCellSkeleton\";\nimport type { ColumnDef, TableEmptyStateConfig } from \"../types\";\nimport { TableInfoValue } from \"./TableInfoValue\";\nimport { TableRowActions } from \"./TableRowActions\";\n\nexport interface TableAccordionProps<T extends { id: string }> {\n data: T[];\n columns: ColumnDef<T>[];\n emptyState?: TableEmptyStateConfig;\n className?: string;\n skeleton?: boolean;\n pageSize?: number;\n}\n\n/**\n * `responsive=\"accordion\"` iken dar ekranda (`md` altı) `Table`'ın normal\n * tablo görünümü YERİNE render edilir — kullanıcı bulgusu: \"responsive'de\n * tablo görünümünden ziyade accordionlu bir şekilde satırları göstermek\n * isteyebilir\". İlk (aksiyon olmayan) sütun satır başlığı olarak, geri\n * kalanı açılınca `<dl>` etiket/değer listesi olarak gösterilir. Satır içi\n * düzenleme (`editRowInInline`) masaüstü tablodakiyle AYNI mekanizmayı\n * kullanır (`clearRowDraft`/`setRowDraftValue`) — ikisi CSS breakpoint'iyle\n * gizlenip gösterildiği için aynı anda ikisi de DOM'da, ama her biri kendi\n * taslak state'ini tutar (bir satırı bir görünümde düzenlemeye başlayıp\n * ekran boyutunu ortasında değiştirmek taslağı sıfırlar — kabul edilen bir\n * kenar durumu).\n */\nfunction renderTitle<T extends { id: string }>(column: ColumnDef<T> | undefined, value: T[keyof T] | undefined, item: T, rowIndex: number): React.ReactNode {\n if (column?.render) return column.render(value, item, rowIndex);\n return value != null ? String(value) : \"-\";\n}\n\nfunction renderValue<T extends { id: string }>(col: ColumnDef<T>, value: T[keyof T] | undefined, item: T, rowIndex: number): React.ReactNode {\n if (col.render) return col.render(value, item, rowIndex);\n return <TableInfoValue info={col.info} value={value != null ? String(value) : \"-\"} />;\n}\n\nexport function TableAccordion<T extends { id: string }>({ data, columns, emptyState, className, skeleton = false, pageSize }: Readonly<TableAccordionProps<T>>) {\n const [openId, setOpenId] = useState<string | null>(null);\n const [editingRowId, setEditingRowId] = useState<string | null>(null);\n const [drafts, setDrafts] = useState<Record<string, Partial<T>>>({});\n\n const actionsColumn = columns.find((c) => c.actions);\n const fieldColumns = columns.filter((c) => !c.actions);\n const [titleColumn, ...restColumns] = fieldColumns;\n\n if (skeleton && data.length === 0) {\n // Veri henüz yok: kapalı satır başlıklarıyla aynı yükseklikte sahte satırlar.\n return (\n <div aria-hidden className={cn(\"flex flex-col divide-y divide-mari-border rounded-md border border-mari-border\", className)}>\n {Array.from({ length: skeletonRowCount(pageSize) }, (_, i) => (\n // h-6 = başlık düğmesinin satır yüksekliği, h-8 = `sm` eylem düğmesi.\n <div key={i} className=\"flex items-center gap-2 px-3 py-2.5\">\n <TableCellSkeleton width={skeletonWidth(0, i)} className=\"h-6 flex-1\" />\n {actionsColumn && <TableCellSkeleton width=\"3rem\" className=\"h-8 w-16 justify-end\" />}\n </div>\n ))}\n </div>\n );\n }\n\n if (data.length === 0) {\n return (\n <div className={cn(\"rounded-md border border-mari-border\", className)}>\n <Empty size=\"sm\" title={emptyState?.title ?? \"Veri Bulunamadı\"} description={emptyState?.description} />\n </div>\n );\n }\n\n return (\n <div className={cn(\"flex flex-col divide-y divide-mari-border rounded-md border border-mari-border\", className)}>\n {data.map((item, rowIndex) => {\n const isOpen = !skeleton && openId === item.id;\n const isEditing = !skeleton && editingRowId === item.id;\n const draft: Partial<T> = drafts[item.id] ?? {};\n const titleValue = titleColumn?.columnName ? item[titleColumn.columnName] : undefined;\n const displayTitle = renderTitle(titleColumn, titleValue, item, rowIndex);\n const panelId = `table-accordion-panel-${item.id}`;\n\n return (\n <div key={item.id}>\n <div className=\"flex items-center gap-2 px-3 py-2.5\">\n <SkeletonSlot on={skeleton} className=\"min-w-0 flex-1 items-center\" placeholder={<TableCellSkeleton width={skeletonWidth(0, rowIndex)} className=\"h-6\" />}>\n {/* Faz 15: odak halkası yoktu (klavyede hangi satırda olunduğu görünmüyordu). */}\n <button\n type=\"button\"\n onClick={() => setOpenId(isOpen ? null : item.id)}\n aria-expanded={isOpen}\n aria-controls={panelId}\n className=\"flex min-w-0 flex-1 items-center gap-2 rounded-sm text-start font-medium text-mari-foreground focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-mari-ring\"\n >\n <ChevronDownIcon aria-hidden className={cn(\"h-4 w-4 shrink-0 text-mari-muted transition-transform\", isOpen && \"rotate-180\")} />\n <span className=\"min-w-0\">{displayTitle}</span>\n </button>\n </SkeletonSlot>\n {actionsColumn?.actions && (\n <SkeletonSlot on={skeleton} flow=\"flex\" className=\"items-center justify-items-end\" placeholder={<TableCellSkeleton width=\"3rem\" className=\"h-8 justify-end\" />}>\n <TableRowActions\n actions={actionsColumn.actions}\n item={item}\n rowLabel={getRowLabel(columns, item)}\n isInlineEditing={isEditing}\n onStartInlineEdit={() => {\n setEditingRowId(item.id);\n setOpenId(item.id);\n }}\n onSaveInlineEdit={() => {\n actionsColumn.actions?.editRowInInline?.onChange({ ...item, ...draft });\n setEditingRowId(null);\n clearRowDraft(setDrafts, item.id);\n }}\n onCancelInlineEdit={() => {\n setEditingRowId(null);\n clearRowDraft(setDrafts, item.id);\n }}\n />\n </SkeletonSlot>\n )}\n </div>\n {isOpen && restColumns.length > 0 && (\n <dl id={panelId} className=\"grid grid-cols-[auto_1fr] gap-x-4 gap-y-2 border-t border-mari-border bg-mari-surface-alt/40 px-3 py-3 text-sm\">\n {restColumns.map((col, idx) => {\n const columnName = col.columnName;\n const rawValue = columnName ? item[columnName] : undefined;\n const displayValue = rawValue != null ? String(rawValue) : \"-\";\n const draftValue = columnName ? draft[columnName] : undefined;\n\n return (\n <React.Fragment key={idx}>\n <dt className=\"text-mari-muted\">{col.header}</dt>\n <dd className=\"text-mari-foreground\">\n {isEditing && columnName ? (\n <Input\n aria-label={typeof col.header === \"string\" ? col.header : undefined}\n value={draftValue !== undefined ? String(draftValue) : displayValue}\n onChange={(e) => {\n const nextValue = e.target.value as T[typeof columnName];\n setRowDraftValue(setDrafts, item.id, columnName, nextValue);\n }}\n />\n ) : (\n renderValue(col, rawValue, item, rowIndex)\n )}\n </dd>\n </React.Fragment>\n );\n })}\n </dl>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n","import type React from \"react\";\nimport type { ColumnDef, TableColumnAlign } from \"./types\";\n\nexport type DraftsSetter<T> = React.Dispatch<React.SetStateAction<Record<string, Partial<T>>>>;\n\n/**\n * `TableBody` ve `TableAccordion` (aynı satır içi düzenleme davranışını\n * responsive/accordion görünümünde de desteklemek için) ortak kullanır.\n * Modül seviyesinde tanımlı — `setDrafts((prev) => {...})` çağrıları render\n * fonksiyonu İÇİNE gömülü kalırsa SonarJS `no-nested-functions` sınırını\n * (4) aşıyordu (Faz 8'de yakalandı).\n */\nexport function clearRowDraft<T>(setDrafts: DraftsSetter<T>, id: string) {\n setDrafts((prev) => {\n const next = { ...prev };\n delete next[id];\n return next;\n });\n}\n\nexport function setRowDraftValue<T>(setDrafts: DraftsSetter<T>, id: string, columnName: keyof T, value: T[keyof T]) {\n setDrafts((prev) => {\n // TS, jenerik bir `keyof T` anahtarıyla computed-property atamasını\n // statik olarak doğrulayamıyor (bilinen bir TS kısıtı) — tek satırlık\n // bir cast ile çözülüyor, `columnName`/`value` zaten çağıranda tam tipli.\n const rowDraft = { ...prev[id], [columnName]: value } as Partial<T>;\n return { ...prev, [id]: rowDraft };\n });\n}\n\n/**\n * Eskiden hizalama DOM index'ine göre otomatikti (ilk sütun sol, son sütun\n * sağ, ortadakiler merkez) — kullanıcı bulgusu: aynı tablodaki her sütun\n * farklı hizalanıyordu, tutarsız görünüyordu. Artık `ColumnDef.align`'dan\n * okunur, verilmezse sola hizalı.\n */\nconst ALIGN_CLASS: Record<TableColumnAlign, string> = {\n start: \"text-start\",\n center: \"text-center\",\n end: \"text-end\",\n};\n\nexport function getAlignClass(align: TableColumnAlign | undefined): string {\n return ALIGN_CLASS[align ?? \"start\"];\n}\n\n/**\n * İşlemler hücresi bir `<div className=\"flex ...\">` (bkz. `TableRowActions`)\n * döndürür — BLOK bir kutu, `text-align`/`getAlignClass` onu yok sayar (sadece\n * satır içi içeriği hizalar). Bu yüzden hizalama burada `justify-*` ile\n * bloğun kendisine uygulanır.\n */\nconst ACTIONS_JUSTIFY_CLASS: Record<TableColumnAlign, string> = {\n start: \"justify-start\",\n center: \"justify-center\",\n end: \"justify-end\",\n};\n\nexport function getActionsJustifyClass(align: TableColumnAlign | undefined): string {\n return ACTIONS_JUSTIFY_CLASS[align ?? \"start\"];\n}\n\n/**\n * Satırın okunur adı — satır eylem düğmelerinin erişilebilir adında kullanılır\n * (\"Sil: Aykut Yılmaz\"). Eskiden her satırın düğmesi aynı \"Sil\" adını\n * taşıyordu; ekran okuyucu kullanıcısı hangi satırı sildiğini bilemiyordu.\n * İlk veri sütununun değeri, yoksa `id`.\n */\nexport function getRowLabel<T extends { id: string }>(columns: ColumnDef<T>[], item: T): string {\n const first = columns.find((c) => !c.actions && c.columnName);\n const value = first?.columnName ? item[first.columnName] : undefined;\n const text = value == null ? \"\" : String(value);\n return text || item.id;\n}\n\n/** İskelet çubuk genişlikleri — sütuna göre değişken, deterministik (gerçek veri gibi dalgalı görünsün). */\nconst SKELETON_WIDTHS = [\"70%\", \"45%\", \"60%\", \"85%\", \"50%\", \"75%\"];\nexport function skeletonWidth(columnIndex: number, rowIndex = 0): string {\n return SKELETON_WIDTHS[(columnIndex + rowIndex) % SKELETON_WIDTHS.length]!;\n}\n\n/** Veri yokken iskelette çizilecek satır sayısı: sayfa boyu (en çok 10), yoksa 5. */\nexport function skeletonRowCount(pageSize?: number): number {\n return Math.min(pageSize ?? 5, 10);\n}\n","import React from \"react\";\nimport { cn } from \"@mari-ui/core\";\nimport { SkeletonBlock } from \"../../skeleton\";\n\n/**\n * Tek satırlık hücre yer tutucusu. Kutu `h-5` = gövdenin `text-sm` satır\n * yüksekliği (20px): veri yokken çizilen sahte satırlar gerçek tek satırlık\n * bir satırla aynı yükseklikte olur. `justify` hücre hizasını izler.\n */\nexport function TableCellSkeleton({ width, height = \"0.75rem\", className }: Readonly<{ width: string; height?: string; className?: string }>) {\n return (\n <div className={cn(\"flex h-5 items-center\", className)}>\n <SkeletonBlock active width={width} height={height} radius=\"sm\" />\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { Tooltip } from \"../../tooltip\";\n\nexport interface TableInfoValueProps {\n info?: boolean;\n value: string;\n}\n\n/**\n * Kullanıcı bulgusu: `line-clamp-2` bir telefon numarasını (\"0532 111\n * 22...\") ortasından kesiyordu — `info` prop'u verilmediği sürece kullanıcının\n * tam değeri okumasının HİÇBİR yolu yoktu. Artık `info` (her zaman tooltip)\n * dışında, metnin GERÇEKTEN kırpılıp kırpılmadığı `scrollHeight`/\n * `clientHeight` karşılaştırmasıyla otomatik tespit ediliyor — sığan bir\n * değer (örn. \"Aktif\") tooltip almaz, kırpılan her değer (`info`\n * verilmemiş olsa bile) otomatik olarak tooltip'e düşer. Sütun genişliğini\n * elle ayarlamaya gerek kalmadan hiçbir değer artık \"okunamaz\" kalmıyor.\n */\nexport function TableInfoValue({ info, value }: TableInfoValueProps) {\n const ref = useRef<HTMLSpanElement>(null);\n const [isTruncated, setIsTruncated] = useState(false);\n\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n setIsTruncated(el.scrollHeight > el.clientHeight + 1);\n }, [value]);\n\n const showTooltip = info || isTruncated;\n\n // `tabIndex={0}` KASITLI: bu bir düz `<span>`, doğal olarak odaklanılabilir\n // değil — tooltip'e sadece hover'la değil `Tab`'la da ulaşılabilmesi\n // gerekiyor (aksi hâlde klavye kullanıcıları kırpılan değeri hiç okuyamaz).\n const content = (\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- kasıtlı: bu span tıklanabilir değil, TEK amacı kırpılan değerin tooltip'ini klavyeyle de erişilebilir kılmak (bkz. yukarıdaki not).\n <span ref={ref} tabIndex={showTooltip ? 0 : undefined} className=\"text-pretty line-clamp-2\">\n {value}\n </span>\n );\n\n // Kullanıcı bulgusu: `w-2xs` SABİT bir genişlikti (16rem/256px) — kısa bir\n // değer (örn. bir telefon numarası) bile balonu gereksiz yere 256px'e\n // geriyordu (\"çok geniş\" tepkisi). `max-w-2xs`'e çevrildi: sadece UZUN\n // değerler bu sınıra çarpar, kısa değerler kendi içeriğine göre (Tooltip'in\n // `w-max` varsayılanıyla) doğal genişlikte kalır. Ayrıca burada `soft` +\n // `neutral` — koyu/dolu bir balon yerine soluk gri bir ipucu (kullanıcı\n // bulgusu: \"rengi neutral gri olmalı, font-size küçülmeli\") ve `text-xs`\n // (12px, genel Tooltip'in `text-sm`/14px varsayılanından küçük).\n return showTooltip ? (\n <Tooltip color=\"neutral\" variant=\"soft\" className=\"max-w-2xs text-xs\" placement=\"bottom\" trigger={content} content={<span>{value}</span>} />\n ) : (\n content\n );\n}\n","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { CheckIcon, ChevronRightIcon, PencilIcon, Trash2Icon, XIcon } from \"lucide-react\";\nimport { Button } from \"../../button\";\nimport { TableEditDrawer } from \"./TableEditDrawer\";\nimport type { ActionProps } from \"../types\";\n\nexport interface TableRowActionsProps<T> {\n actions: ActionProps<T>;\n item: T;\n /** Satırın okunur adı — düğme adlarına eklenir (\"Sil: Aykut Yılmaz\"). */\n rowLabel: string;\n isInlineEditing: boolean;\n onStartInlineEdit: () => void;\n onSaveInlineEdit: () => void;\n onCancelInlineEdit: () => void;\n}\n\n/**\n * Eskiden `_hook/useTableBody.tsx` diye adlandırılmış bir \"hook\" bu JSX'i\n * üretiyordu — ama hiçbir React hook kuralı taşımıyordu, düz bir JSX\n * factory'siydi (bkz. plan denetimi: \"hook değil, component'e\n * dönüştürülecek\"). Artık gerçek bir component.\n */\nexport function TableRowActions<T extends { id: string }>({\n actions,\n item,\n rowLabel,\n isInlineEditing,\n onStartInlineEdit,\n onSaveInlineEdit,\n onCancelInlineEdit,\n}: Readonly<TableRowActionsProps<T>>) {\n const [drawerOpen, setDrawerOpen] = useState(false);\n\n // Faz 15: her satırın düğmesi eskiden aynı adı (\"Sil\") taşıyordu — ekran\n // okuyucuda hangi satırın silineceği belli değildi. Silme ikonu da bir\n // silgiydi (Eraser); evrensel karşılığı çöp kutusu. Düzenle/detay nötr,\n // sadece yıkıcı eylem renkli (her ikonun mavi olması satırı kalabalıklaştırıyordu).\n const name = (action: string) => `${action}: ${rowLabel}`;\n return (\n <div className=\"flex items-center gap-1\">\n {actions.editRowInInline &&\n (isInlineEditing ? (\n <>\n <Button variant=\"ghost\" color=\"success\" size=\"sm\" onClick={onSaveInlineEdit} icon={<CheckIcon size={16} aria-hidden />} aria-label={name(\"Kaydet\")} />\n <Button variant=\"ghost\" color=\"neutral\" size=\"sm\" onClick={onCancelInlineEdit} icon={<XIcon size={16} aria-hidden />} aria-label={name(\"Vazgeç\")} />\n </>\n ) : (\n <Button variant=\"ghost\" color=\"neutral\" size=\"sm\" onClick={onStartInlineEdit} icon={<PencilIcon size={16} aria-hidden />} aria-label={name(\"Düzenle\")} />\n ))}\n {actions.onEditWithDrawer && (\n <>\n <Button variant=\"ghost\" color=\"neutral\" size=\"sm\" onClick={() => setDrawerOpen(true)} icon={<PencilIcon size={16} aria-hidden />} aria-label={name(\"Düzenle\")} />\n <TableEditDrawer title={actions.onEditWithDrawer.title} description={actions.onEditWithDrawer.description} open={drawerOpen} onClose={() => setDrawerOpen(false)}>\n <actions.onEditWithDrawer.form refetch={actions.refetch ?? (() => {})} initialData={item} closeModal={() => setDrawerOpen(false)} />\n </TableEditDrawer>\n </>\n )}\n {actions.navigateRow && (\n <Button variant=\"ghost\" color=\"neutral\" size=\"sm\" onClick={() => actions.navigateRow?.(item.id)} icon={<ChevronRightIcon size={16} aria-hidden />} aria-label={name(\"Detaya git\")} />\n )}\n {actions.deleteRow && (\n <Button variant=\"ghost\" color=\"error\" size=\"sm\" onClick={() => actions.deleteRow?.(item.id)} icon={<Trash2Icon size={16} aria-hidden />} aria-label={name(\"Sil\")} />\n )}\n </div>\n );\n}\n","import React from \"react\";\nimport { Drawer } from \"../../drawer\";\n\nexport interface TableEditDrawerProps {\n title?: string;\n description?: string;\n open: boolean;\n onClose: () => void;\n children: React.ReactNode;\n}\n\n/**\n * Eskiden `_hook/useItemDrawer.tsx` içinde tanımlıydı, `AddNewItem` adını\n * taşıyordu (yanıltıcı — \"yeni ekleme\" değil \"düzenleme\" çekmecesi) ve\n * dosyanın kendisi bir `useItemDrawer()` hook'u da export ediyordu — ama bu\n * hook'un döndürdüğü `open`/`setOpen` HİÇBİR YERDE kullanılmıyordu\n * (`useTableBody` kendi `openRowId` state'ini ayrı tutuyordu). Ölü hook\n * silindi, gerçek component `_components/`e taşındı ve doğru adını aldı.\n */\nexport function TableEditDrawer({ title, description, open, onClose, children }: Readonly<TableEditDrawerProps>) {\n return (\n // Faz 13.6: eskiden `header`'a yan yana iki <span> veriliyordu (başlık ve\n // açıklama arasında boşluk bile yoktu, ortalanmıştı). Artık Drawer'ın\n // kendi `title`/`description`'ı — dialog'un erişilebilir adı da başlık.\n <Drawer open={open} onClose={onClose} title={title} description={description} aria-label={title ? undefined : \"Kaydı düzenle\"}>\n {children}\n </Drawer>\n );\n}\n","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { cn } from \"@mari-ui/core\";\nimport { Input } from \"../../input\";\nimport { Empty } from \"../../empty\";\nimport { SkeletonSlot } from \"../../lib/SkeletonSlot\";\nimport {\n clearRowDraft,\n getActionsJustifyClass,\n getAlignClass,\n getRowLabel,\n setRowDraftValue,\n skeletonRowCount,\n skeletonWidth,\n type DraftsSetter,\n} from \"../utils\";\nimport type { ColumnDef, TableEmptyStateConfig } from \"../types\";\nimport { TableCellSkeleton } from \"./TableCellSkeleton\";\nimport { TableInfoValue } from \"./TableInfoValue\";\nimport { TableRowActions } from \"./TableRowActions\";\n\nexport interface TableBodyProps<T extends { id: string }> {\n data: T[];\n columns: ColumnDef<T>[];\n emptyState?: TableEmptyStateConfig;\n skeleton?: boolean;\n /** Veri yokken iskelette kaç sahte satır çizileceği (sayfa boyu). */\n pageSize?: number;\n}\n\n/**\n * İşlemler hücresi. `text-align` (bkz. `getAlignClass`) sadece SATIR İÇİ\n * içeriği hizalar — `TableRowActions`'ın bloğu onu yok sayıyordu, bu yüzden\n * hizalama `justify-*` ile bloğun KENDİSİNE uygulanır. Sütun ikonlara göre dar\n * (`w-px whitespace-nowrap`) ve yatay kaydırmada sağda `sticky`.\n */\nconst ACTIONS_CELL_CLASS = \"sticky right-0 w-px whitespace-nowrap border-l border-mari-border bg-mari-surface px-4 py-2.5\";\n\n/**\n * Veri hücresi. `max-w-64` KASITLI: `table-auto`'da sütun serbestçe\n * büyüyüp `line-clamp-2` hiç tetiklenmiyordu (kullanıcı bulgusu: \"iki satıra\n * düşsün, horizontal scroll olacak\"). `text-sm`: başlıktan (text-xs) orantılı.\n */\nconst DATA_CELL_CLASS = \"max-w-64 px-4 py-2.5 text-sm break-words\";\n\ninterface DataCellProps<T extends { id: string }> {\n col: ColumnDef<T>;\n item: T;\n rowIndex: number;\n columnIndex: number;\n isEditing: boolean;\n draft: Partial<T>;\n setDrafts: DraftsSetter<T>;\n skeleton: boolean;\n}\n\nfunction DataCell<T extends { id: string }>({ col, item, rowIndex, columnIndex, isEditing, draft, setDrafts, skeleton }: Readonly<DataCellProps<T>>) {\n const columnName = col.columnName;\n const rawValue = columnName ? item[columnName] : undefined;\n // `0`/`false`/`\"\"` geçerli değerlerdir — sadece null/undefined \"-\" olur.\n const displayValue = rawValue != null ? String(rawValue) : \"-\";\n\n let content: React.ReactNode;\n if (isEditing && columnName) {\n const draftValue = draft[columnName];\n content = (\n <Input\n aria-label={typeof col.header === \"string\" ? col.header : undefined}\n // Değeri kesmeden gösterecek asgari genişlik — tablo zaten yatay kayabiliyor.\n className=\"min-w-36\"\n value={draftValue !== undefined ? String(draftValue) : displayValue}\n onChange={(e) => setRowDraftValue(setDrafts, item.id, columnName, e.target.value as T[typeof columnName])}\n />\n );\n } else if (col.render) {\n content = col.render(rawValue, item, rowIndex);\n } else {\n content = <TableInfoValue info={col.info} value={displayValue} />;\n }\n\n return (\n <td className={cn(DATA_CELL_CLASS, getAlignClass(col.align))}>\n <SkeletonSlot\n on={skeleton}\n className=\"items-center\"\n placeholder={<TableCellSkeleton width={skeletonWidth(columnIndex, rowIndex)} className={getActionsJustifyClass(col.align)} />}\n >\n {content}\n </SkeletonSlot>\n </td>\n );\n}\n\n/** Veri henüz yokken (`skeleton` + boş `data`) çizilen sahte satırlar — gerçek tek satırlık satırla aynı yükseklik. */\nfunction PlaceholderRows<T extends { id: string }>({ columns, count }: Readonly<{ columns: ColumnDef<T>[]; count: number }>) {\n return (\n <tbody aria-hidden>\n {Array.from({ length: count }, (_, rowIndex) => (\n <tr key={rowIndex} className=\"border-b border-mari-border last:border-b-0\">\n {columns.map((col, columnIndex) =>\n col.actions ? (\n <td key={columnIndex} className={ACTIONS_CELL_CLASS}>\n <TableCellSkeleton width=\"3rem\" className={getActionsJustifyClass(col.align)} />\n </td>\n ) : (\n <td key={columnIndex} className={DATA_CELL_CLASS}>\n <TableCellSkeleton width={skeletonWidth(columnIndex, rowIndex)} className={getActionsJustifyClass(col.align)} />\n </td>\n )\n )}\n </tr>\n ))}\n </tbody>\n );\n}\n\nexport function TableBody<T extends { id: string }>({ data, columns, emptyState, skeleton = false, pageSize }: Readonly<TableBodyProps<T>>) {\n // Satır içi düzenleme durumu satır seviyesinde: aksiyon hücresindeki\n // \"düzenle\" AYNI satırdaki veri hücrelerini de <Input>'a çeviriyor.\n const [editingRowId, setEditingRowId] = useState<string | null>(null);\n const [drafts, setDrafts] = useState<Record<string, Partial<T>>>({});\n\n if (skeleton && data.length === 0) return <PlaceholderRows columns={columns} count={skeletonRowCount(pageSize)} />;\n\n if (data.length === 0) {\n // `text-start` açıkça: colSpan hücresi hizayı miras almıyordu (kullanıcı bulgusu).\n return (\n <tbody>\n <tr>\n <td colSpan={columns.length} className=\"p-0 text-start\">\n <Empty size=\"sm\" title={emptyState?.title ?? \"Veri Bulunamadı\"} description={emptyState?.description} />\n </td>\n </tr>\n </tbody>\n );\n }\n\n return (\n <tbody>\n {data.map((item, rowIndex) => {\n const draft: Partial<T> = drafts[item.id] ?? {};\n const isEditing = !skeleton && editingRowId === item.id;\n return (\n <tr key={item.id} className={cn(\"border-b border-mari-border last:border-b-0\", !skeleton && \"transition-colors hover:bg-mari-surface-alt/50\")}>\n {columns.map((col, columnIndex) =>\n col.actions ? (\n <td key={columnIndex} className={ACTIONS_CELL_CLASS}>\n <SkeletonSlot on={skeleton} flow=\"flex\" className=\"items-center\" placeholder={<TableCellSkeleton width=\"3rem\" className={getActionsJustifyClass(col.align)} />}>\n <div className={cn(\"flex\", getActionsJustifyClass(col.align))}>\n <TableRowActions\n actions={col.actions}\n item={item}\n rowLabel={getRowLabel(columns, item)}\n isInlineEditing={isEditing}\n onStartInlineEdit={() => setEditingRowId(item.id)}\n onSaveInlineEdit={() => {\n col.actions?.editRowInInline?.onChange({ ...item, ...draft });\n setEditingRowId(null);\n clearRowDraft(setDrafts, item.id);\n }}\n onCancelInlineEdit={() => {\n setEditingRowId(null);\n clearRowDraft(setDrafts, item.id);\n }}\n />\n </div>\n </SkeletonSlot>\n </td>\n ) : (\n <DataCell\n key={columnIndex}\n col={col}\n item={item}\n rowIndex={rowIndex}\n columnIndex={columnIndex}\n isEditing={isEditing}\n draft={draft}\n setDrafts={setDrafts}\n skeleton={skeleton}\n />\n )\n )}\n </tr>\n );\n })}\n </tbody>\n );\n}\n","import React from \"react\";\nimport { cn } from \"@mari-ui/core\";\nimport type { ColumnDef } from \"../types\";\nimport { getActionsJustifyClass, getAlignClass, skeletonWidth } from \"../utils\";\nimport { SkeletonSlot } from \"../../lib/SkeletonSlot\";\nimport { TableCellSkeleton } from \"./TableCellSkeleton\";\n\nexport interface TableHeaderProps<T extends { id: string }> {\n columns: ColumnDef<T>[];\n skeleton?: boolean;\n}\n\n/**\n * Kullanıcı bulgusu: eskiden başlık dolu bir `bg-mari-neutral-subtle` bloğu +\n * kalın (`font-semibold`), gövdeyle aynı boyutta metin kullanıyordu — \"çok\n * irrite duruyor\" tepkisi aldı. Modern dashboard tabloları (Linear/Stripe/\n * Vercel tarzı) başlığı sessiz tutar: dolgu arka plan YOK, küçük/soluk/geniş\n * harf aralıklı metin — göze asıl çarpması gereken VERİ, başlık değil.\n */\nexport function TableHeader<T extends { id: string }>({ columns, skeleton = false }: Readonly<TableHeaderProps<T>>) {\n return (\n <thead>\n <tr className=\"w-full\">\n {columns.map((col, index) => (\n <th\n key={index}\n scope=\"col\"\n className={cn(\n \"px-4 py-2.5 text-xs font-medium tracking-wide text-mari-muted uppercase border-b border-mari-border whitespace-nowrap\",\n getAlignClass(col.align),\n // İşlemler sütunu içeriğe (ikonlara) göre DAR kalır, kalan\n // boşluğu almaz — kullanıcı bulgusu: eskiden sütun gereksiz\n // yere genişti, başlık metniyle ikonlar aynı hizada değildi\n // (`text-align` blok/flex bir elemanı değil sadece satır-içi\n // içeriği hizalar — bkz. `TableBody`'deki asıl düzeltme).\n col.actions && \"sticky right-0 w-px bg-mari-surface border-l border-mari-border\"\n )}\n >\n <SkeletonSlot\n on={skeleton}\n className=\"items-center\"\n // Başlık satırı `text-xs` (16px satır) — yer tutucu da o yükseklikte.\n placeholder={<TableCellSkeleton width={col.actions ? \"2.5rem\" : skeletonWidth(index + 2)} height=\"0.625rem\" className={cn(\"h-4\", getActionsJustifyClass(col.align))} />}\n >\n {col.header}\n </SkeletonSlot>\n {/* Sütun adı veriye bağlı değil: görsel olarak iskelet, ama ekran okuyucu\n için başlık boş kalmasın (axe `empty-table-header`). */}\n {skeleton && <span className=\"sr-only\">{col.header}</span>}\n </th>\n ))}\n </tr>\n </thead>\n );\n}\n","import React from \"react\";\nimport { cn } from \"@mari-ui/core\";\nimport { Pagination } from \"../../pagination\";\nimport type { TablePaginationConfig } from \"../types\";\n\nexport interface TablePaginationProps {\n pagination: TablePaginationConfig;\n className?: string;\n skeleton?: boolean;\n}\n\n/**\n * Faz 13.5 kullanıcı isteği (\"diğer component'lerde kullandığımız şeyleri\n * burada da uygulayalım\"): eskiden burada, `../../pagination`'daki paylaşılan\n * `Pagination` component'iyle NEREDEYSE BİREBİR AYNI bir sayfa-numarası/\n * ellipsis üretme mantığı tekrar uygulanmıştı (iki ayrı `getPageList`/\n * `getGeneratePageNumbers` fonksiyonu, iki ayrı buton render döngüsü). Artık\n * `TablePagination` sadece bir ince sarmalayıcı — tüm gerçek mantık paylaşılan\n * `Pagination`'da yaşıyor, `Table.tsx`'in kendi `TablePaginationConfig`\n * sözleşmesini (`page`/`pageSize`/`total` — `Pagination`'ın `currentPage`/\n * `pageSize`/`totalItems` isimlendirmesinden farklı, Table'ın kendi API'si\n * korunuyor) `Pagination`'ın prop'larına eşliyor.\n */\nexport function TablePagination({ pagination, className, skeleton = false }: Readonly<TablePaginationProps>) {\n const { page, pageSize, total, pageSizeOptions, onPageChange, onPageSizeChange } = pagination;\n\n return (\n <div className={cn(\"border-t border-mari-border px-3 py-2.5\", className)}>\n {/* Faz 15.5: Pagination'ın kendi iskeleti — her düğme kendi kare kutusunda, yaklaşık bloklar değil. */}\n <Pagination\n skeleton={skeleton}\n currentPage={page}\n pageSize={pageSize}\n totalItems={total}\n // Table'ın kendi sözleşmesi tek argümanlı — Pagination'ın ek `pageSize`/`page` argümanları sızmasın.\n onPageChange={(next) => onPageChange(next)}\n onPageSizeChange={onPageSizeChange && ((next) => onPageSizeChange(next))}\n pageSizeOptions={pageSizeOptions}\n showTotal\n />\n </div>\n );\n}\n"],"mappings":"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","names":["useRef","cn","React","useState","cn","jsx","useState","jsx","jsx","useState","jsx","jsxs","useState","cn","React","useState","cn","jsx","cn","useState","cn","jsx","jsxs","cn","cn","jsx","cn","jsx","jsxs","useRef","cn"]}
1
+ {"version":3,"sources":["../src/table/Table.tsx","../src/table/_components/TableAccordion.tsx","../src/table/utils.ts","../src/table/_components/TableCellSkeleton.tsx","../src/table/_components/TableInfoValue.tsx","../src/table/_components/TableRowActions.tsx","../src/table/_components/TableEditDrawer.tsx","../src/table/_components/TableBody.tsx","../src/table/_components/TableHeader.tsx","../src/table/_components/TablePagination.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useMemo, useRef } from \"react\";\nimport { cn } from \"@mari-ui/core\";\nimport { useScrollable } from \"../lib/useScrollable\";\nimport { TableAccordion } from \"./_components/TableAccordion\";\nimport { TableBody } from \"./_components/TableBody\";\nimport { TableHeader } from \"./_components/TableHeader\";\nimport { TablePagination } from \"./_components/TablePagination\";\nimport type { TableProps } from \"./types\";\n\nexport type { TableProps };\n\n/*\n * Eskiden `tableHeader: string[]` ve `tableBody: ColumnProps<T>[]` İKİ AYRI\n * paralel diziydi, elle senkron tutuluyordu. Artık tek\n * bir `columns` dizisi.\n */\n/**\n * Kullanıcı bulgularına göre tamamen elden geçirildi:\n * - Sütun hizalaması artık DOM index'ine göre değil `col.align`'a göre\n * (varsayılan sola hizalı, hepsi tutarlı).\n * - `loading` prop'u KALDIRILDI — anlamsız bir spinner gösteriyordu; gerçek\n * skeleton yapısı ileride TÜM component'ler için birlikte gelecek.\n * - Veri boşken artık gerçek `Empty` component'i (bkz. `TableBody`).\n * - İşlemler sütunu tablo yatay kaydırıldığında sağda `sticky` kalır\n * (`overflow-x-auto` + `<td>`/`<th>`'de `sticky right-0`).\n * - `responsive=\"accordion\"` dar ekranda (`md` altı) satırları tablo yerine\n * açılır/kapanır kartlar olarak gösterir (bkz. `TableAccordion`).\n * - `pagination` verilirse altta sayfalama kontrolleri render edilir;\n * `paginationMode=\"client\"` iken `Table` kendi diler, `\"server\"`\n * (varsayılan) iken `data`'nın zaten o sayfaya ait dilim olduğu varsayılır.\n */\nexport function Table<T extends { id: string }>({\n data,\n columns,\n className,\n emptyState,\n responsive = \"scroll\",\n pagination,\n paginationMode = \"server\",\n label,\n skeleton = false,\n}: Readonly<TableProps<T>>) {\n // Yatay kaydırılan bölge klavyeyle de kaydırılabilmeli (axe\n // `scrollable-region-focusable`): SADECE gerçekten taşarken tab durağı olur —\n // sığan bir tabloya boşuna bir durak eklemesin.\n const scrollRef = useRef<HTMLDivElement>(null);\n const scrollable = useScrollable(scrollRef, \"x\");\n\n const pageData = useMemo(() => {\n if (!pagination || paginationMode !== \"client\") return data;\n const start = (pagination.page - 1) * pagination.pageSize;\n return data.slice(start, start + pagination.pageSize);\n }, [data, pagination, paginationMode]);\n\n return (\n // Kullanıcı bulgusu: eskiden tablo dolu, kalın bir kutu (`border` + `bg-\n // mari-neutral-subtle` başlık) içindeydi — \"çok irrite duruyor\" tepkisi\n // aldı. Modern dashboard tabloları (Linear/Stripe/Vercel tarzı) ağır bir\n // kutu yerine sadece satır ayırıcılarına güvenir; sınır artık `rounded-lg`\n // + tek bir ince kenarlıkla (kutu değil) daha sessiz bir çerçeve çiziyor.\n <div className={cn(\"rounded-lg border border-mari-border\", className)} aria-busy={skeleton || undefined}>\n <div\n ref={scrollRef}\n className={cn(\n // `relative`: içerideki `sr-only` (position:absolute) öğelerin taşıyıcısı\n // olsun — yoksa kaydırma kutusundan kaçıp sayfayı yatay taşırıyorlardı (375px'te ölçüldü).\n \"relative overflow-x-auto rounded-lg focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-mari-ring\",\n responsive === \"accordion\" && \"hidden md:block\"\n )}\n {...(scrollable ? { role: \"region\", \"aria-label\": label ?? \"Tablo\", tabIndex: 0 } : {})}\n >\n <table className=\"w-full min-w-[36rem]\">\n {label && <caption className=\"sr-only\">{label}</caption>}\n <TableHeader columns={columns} skeleton={skeleton} />\n <TableBody data={pageData} columns={columns} emptyState={emptyState} skeleton={skeleton} pageSize={pagination?.pageSize} />\n </table>\n </div>\n {responsive === \"accordion\" && (\n <TableAccordion\n data={pageData}\n columns={columns}\n emptyState={emptyState}\n skeleton={skeleton}\n pageSize={pagination?.pageSize}\n className=\"block border-0 md:hidden\"\n />\n )}\n {pagination && <TablePagination pagination={pagination} skeleton={skeleton} />}\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { ChevronDownIcon } from \"lucide-react\";\nimport { cn } from \"@mari-ui/core\";\nimport { Empty } from \"../../empty\";\nimport { Input } from \"../../input\";\nimport { SkeletonSlot } from \"../../lib/SkeletonSlot\";\nimport { clearRowDraft, getRowLabel, setRowDraftValue, skeletonRowCount, skeletonWidth } from \"../utils\";\nimport { TableCellSkeleton } from \"./TableCellSkeleton\";\nimport type { ColumnDef, TableEmptyStateConfig } from \"../types\";\nimport { TableInfoValue } from \"./TableInfoValue\";\nimport { TableRowActions } from \"./TableRowActions\";\n\nexport interface TableAccordionProps<T extends { id: string }> {\n data: T[];\n columns: ColumnDef<T>[];\n emptyState?: TableEmptyStateConfig;\n className?: string;\n skeleton?: boolean;\n pageSize?: number;\n}\n\n/*\n * `responsive=\"accordion\"` iken dar ekranda (`md` altı) `Table`'ın normal\n * tablo görünümü YERİNE render edilir — kullanıcı bulgusu: \"responsive'de\n * tablo görünümünden ziyade accordionlu bir şekilde satırları göstermek\n * isteyebilir\". İlk (aksiyon olmayan) sütun satır başlığı olarak, geri\n * kalanı açılınca `<dl>` etiket/değer listesi olarak gösterilir. Satır içi\n * düzenleme (`editRowInInline`) masaüstü tablodakiyle AYNI mekanizmayı\n * kullanır (`clearRowDraft`/`setRowDraftValue`) — ikisi CSS breakpoint'iyle\n * gizlenip gösterildiği için aynı anda ikisi de DOM'da, ama her biri kendi\n * taslak state'ini tutar (bir satırı bir görünümde düzenlemeye başlayıp\n * ekran boyutunu ortasında değiştirmek taslağı sıfırlar — kabul edilen bir\n * kenar durumu).\n */\nfunction renderTitle<T extends { id: string }>(column: ColumnDef<T> | undefined, value: T[keyof T] | undefined, item: T, rowIndex: number): React.ReactNode {\n if (column?.render) return column.render(value, item, rowIndex);\n return value != null ? String(value) : \"-\";\n}\n\nfunction renderValue<T extends { id: string }>(col: ColumnDef<T>, value: T[keyof T] | undefined, item: T, rowIndex: number): React.ReactNode {\n if (col.render) return col.render(value, item, rowIndex);\n return <TableInfoValue info={col.info} value={value != null ? String(value) : \"-\"} />;\n}\n\nexport function TableAccordion<T extends { id: string }>({ data, columns, emptyState, className, skeleton = false, pageSize }: Readonly<TableAccordionProps<T>>) {\n const [openId, setOpenId] = useState<string | null>(null);\n const [editingRowId, setEditingRowId] = useState<string | null>(null);\n const [drafts, setDrafts] = useState<Record<string, Partial<T>>>({});\n\n const actionsColumn = columns.find((c) => c.actions);\n const fieldColumns = columns.filter((c) => !c.actions);\n const [titleColumn, ...restColumns] = fieldColumns;\n\n if (skeleton && data.length === 0) {\n // Veri henüz yok: kapalı satır başlıklarıyla aynı yükseklikte sahte satırlar.\n return (\n <div aria-hidden className={cn(\"flex flex-col divide-y divide-mari-border rounded-md border border-mari-border\", className)}>\n {Array.from({ length: skeletonRowCount(pageSize) }, (_, i) => (\n // h-6 = başlık düğmesinin satır yüksekliği, h-8 = `sm` eylem düğmesi.\n <div key={i} className=\"flex items-center gap-2 px-3 py-2.5\">\n <TableCellSkeleton width={skeletonWidth(0, i)} className=\"h-6 flex-1\" />\n {actionsColumn && <TableCellSkeleton width=\"3rem\" className=\"h-8 w-16 justify-end\" />}\n </div>\n ))}\n </div>\n );\n }\n\n if (data.length === 0) {\n return (\n <div className={cn(\"rounded-md border border-mari-border\", className)}>\n <Empty size=\"sm\" title={emptyState?.title ?? \"Veri Bulunamadı\"} description={emptyState?.description} />\n </div>\n );\n }\n\n return (\n <div className={cn(\"flex flex-col divide-y divide-mari-border rounded-md border border-mari-border\", className)}>\n {data.map((item, rowIndex) => {\n const isOpen = !skeleton && openId === item.id;\n const isEditing = !skeleton && editingRowId === item.id;\n const draft: Partial<T> = drafts[item.id] ?? {};\n const titleValue = titleColumn?.columnName ? item[titleColumn.columnName] : undefined;\n const displayTitle = renderTitle(titleColumn, titleValue, item, rowIndex);\n const panelId = `table-accordion-panel-${item.id}`;\n\n return (\n <div key={item.id}>\n <div className=\"flex items-center gap-2 px-3 py-2.5\">\n <SkeletonSlot on={skeleton} className=\"min-w-0 flex-1 items-center\" placeholder={<TableCellSkeleton width={skeletonWidth(0, rowIndex)} className=\"h-6\" />}>\n {/* Faz 15: odak halkası yoktu (klavyede hangi satırda olunduğu görünmüyordu). */}\n <button\n type=\"button\"\n onClick={() => setOpenId(isOpen ? null : item.id)}\n aria-expanded={isOpen}\n aria-controls={panelId}\n className=\"flex min-w-0 flex-1 items-center gap-2 rounded-sm text-start font-medium text-mari-foreground focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-mari-ring\"\n >\n <ChevronDownIcon aria-hidden className={cn(\"h-4 w-4 shrink-0 text-mari-muted transition-transform\", isOpen && \"rotate-180\")} />\n <span className=\"min-w-0\">{displayTitle}</span>\n </button>\n </SkeletonSlot>\n {actionsColumn?.actions && (\n <SkeletonSlot on={skeleton} flow=\"flex\" className=\"items-center justify-items-end\" placeholder={<TableCellSkeleton width=\"3rem\" className=\"h-8 justify-end\" />}>\n <TableRowActions\n actions={actionsColumn.actions}\n item={item}\n rowLabel={getRowLabel(columns, item)}\n isInlineEditing={isEditing}\n onStartInlineEdit={() => {\n setEditingRowId(item.id);\n setOpenId(item.id);\n }}\n onSaveInlineEdit={() => {\n actionsColumn.actions?.editRowInInline?.onChange({ ...item, ...draft });\n setEditingRowId(null);\n clearRowDraft(setDrafts, item.id);\n }}\n onCancelInlineEdit={() => {\n setEditingRowId(null);\n clearRowDraft(setDrafts, item.id);\n }}\n />\n </SkeletonSlot>\n )}\n </div>\n {isOpen && restColumns.length > 0 && (\n <dl id={panelId} className=\"grid grid-cols-[auto_1fr] gap-x-4 gap-y-2 border-t border-mari-border bg-mari-surface-alt/40 px-3 py-3 text-sm\">\n {restColumns.map((col, idx) => {\n const columnName = col.columnName;\n const rawValue = columnName ? item[columnName] : undefined;\n const displayValue = rawValue != null ? String(rawValue) : \"-\";\n const draftValue = columnName ? draft[columnName] : undefined;\n\n return (\n <React.Fragment key={idx}>\n <dt className=\"text-mari-muted\">{col.header}</dt>\n <dd className=\"text-mari-foreground\">\n {isEditing && columnName ? (\n <Input\n aria-label={typeof col.header === \"string\" ? col.header : undefined}\n value={draftValue !== undefined ? String(draftValue) : displayValue}\n onChange={(e) => {\n const nextValue = e.target.value as T[typeof columnName];\n setRowDraftValue(setDrafts, item.id, columnName, nextValue);\n }}\n />\n ) : (\n renderValue(col, rawValue, item, rowIndex)\n )}\n </dd>\n </React.Fragment>\n );\n })}\n </dl>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n","import type React from \"react\";\nimport type { ColumnDef, TableColumnAlign } from \"./types\";\n\nexport type DraftsSetter<T> = React.Dispatch<React.SetStateAction<Record<string, Partial<T>>>>;\n\n/**\n * `TableBody` ve `TableAccordion` (aynı satır içi düzenleme davranışını\n * responsive/accordion görünümünde de desteklemek için) ortak kullanır.\n * Modül seviyesinde tanımlı — `setDrafts((prev) => {...})` çağrıları render\n * fonksiyonu İÇİNE gömülü kalırsa SonarJS `no-nested-functions` sınırını\n * (4) aşıyordu.\n */\nexport function clearRowDraft<T>(setDrafts: DraftsSetter<T>, id: string) {\n setDrafts((prev) => {\n const next = { ...prev };\n delete next[id];\n return next;\n });\n}\n\nexport function setRowDraftValue<T>(setDrafts: DraftsSetter<T>, id: string, columnName: keyof T, value: T[keyof T]) {\n setDrafts((prev) => {\n // TS, jenerik bir `keyof T` anahtarıyla computed-property atamasını\n // statik olarak doğrulayamıyor (bilinen bir TS kısıtı) — tek satırlık\n // bir cast ile çözülüyor, `columnName`/`value` zaten çağıranda tam tipli.\n const rowDraft = { ...prev[id], [columnName]: value } as Partial<T>;\n return { ...prev, [id]: rowDraft };\n });\n}\n\n/*\n * Eskiden hizalama DOM index'ine göre otomatikti (ilk sütun sol, son sütun\n * sağ, ortadakiler merkez) — kullanıcı bulgusu: aynı tablodaki her sütun\n * farklı hizalanıyordu, tutarsız görünüyordu. Artık `ColumnDef.align`'dan\n * okunur, verilmezse sola hizalı.\n */\nconst ALIGN_CLASS: Record<TableColumnAlign, string> = {\n start: \"text-start\",\n center: \"text-center\",\n end: \"text-end\",\n};\n\nexport function getAlignClass(align: TableColumnAlign | undefined): string {\n return ALIGN_CLASS[align ?? \"start\"];\n}\n\n/**\n * İşlemler hücresi bir `<div className=\"flex ...\">` (bkz. `TableRowActions`)\n * döndürür — BLOK bir kutu, `text-align`/`getAlignClass` onu yok sayar (sadece\n * satır içi içeriği hizalar). Bu yüzden hizalama burada `justify-*` ile\n * bloğun kendisine uygulanır.\n */\nconst ACTIONS_JUSTIFY_CLASS: Record<TableColumnAlign, string> = {\n start: \"justify-start\",\n center: \"justify-center\",\n end: \"justify-end\",\n};\n\nexport function getActionsJustifyClass(align: TableColumnAlign | undefined): string {\n return ACTIONS_JUSTIFY_CLASS[align ?? \"start\"];\n}\n\n/*\n * Satırın okunur adı — satır eylem düğmelerinin erişilebilir adında kullanılır\n * (\"Sil: Aykut Yılmaz\"). Eskiden her satırın düğmesi aynı \"Sil\" adını\n * taşıyordu; ekran okuyucu kullanıcısı hangi satırı sildiğini bilemiyordu.\n * İlk veri sütununun değeri, yoksa `id`.\n */\nexport function getRowLabel<T extends { id: string }>(columns: ColumnDef<T>[], item: T): string {\n const first = columns.find((c) => !c.actions && c.columnName);\n const value = first?.columnName ? item[first.columnName] : undefined;\n const text = value == null ? \"\" : String(value);\n return text || item.id;\n}\n\n/** İskelet çubuk genişlikleri — sütuna göre değişken, deterministik (gerçek veri gibi dalgalı görünsün). */\nconst SKELETON_WIDTHS = [\"70%\", \"45%\", \"60%\", \"85%\", \"50%\", \"75%\"];\nexport function skeletonWidth(columnIndex: number, rowIndex = 0): string {\n return SKELETON_WIDTHS[(columnIndex + rowIndex) % SKELETON_WIDTHS.length]!;\n}\n\n/** Veri yokken iskelette çizilecek satır sayısı: sayfa boyu (en çok 10), yoksa 5. */\nexport function skeletonRowCount(pageSize?: number): number {\n return Math.min(pageSize ?? 5, 10);\n}\n","import React from \"react\";\nimport { cn } from \"@mari-ui/core\";\nimport { SkeletonBlock } from \"../../skeleton\";\n\n/**\n * Tek satırlık hücre yer tutucusu. Kutu `h-5` = gövdenin `text-sm` satır\n * yüksekliği (20px): veri yokken çizilen sahte satırlar gerçek tek satırlık\n * bir satırla aynı yükseklikte olur. `justify` hücre hizasını izler.\n */\nexport function TableCellSkeleton({ width, height = \"0.75rem\", className }: Readonly<{ width: string; height?: string; className?: string }>) {\n return (\n <div className={cn(\"flex h-5 items-center\", className)}>\n <SkeletonBlock active width={width} height={height} radius=\"sm\" />\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { Tooltip } from \"../../tooltip\";\n\nexport interface TableInfoValueProps {\n info?: boolean;\n value: string;\n}\n\n/*\n * Kullanıcı bulgusu: `line-clamp-2` bir telefon numarasını (\"0532 111\n * 22...\") ortasından kesiyordu — `info` prop'u verilmediği sürece kullanıcının\n * tam değeri okumasının HİÇBİR yolu yoktu. Artık `info` (her zaman tooltip)\n * dışında, metnin GERÇEKTEN kırpılıp kırpılmadığı `scrollHeight`/\n * `clientHeight` karşılaştırmasıyla otomatik tespit ediliyor — sığan bir\n * değer (örn. \"Aktif\") tooltip almaz, kırpılan her değer (`info`\n * verilmemiş olsa bile) otomatik olarak tooltip'e düşer. Sütun genişliğini\n * elle ayarlamaya gerek kalmadan hiçbir değer artık \"okunamaz\" kalmıyor.\n */\nexport function TableInfoValue({ info, value }: TableInfoValueProps) {\n const ref = useRef<HTMLSpanElement>(null);\n const [isTruncated, setIsTruncated] = useState(false);\n\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n setIsTruncated(el.scrollHeight > el.clientHeight + 1);\n }, [value]);\n\n const showTooltip = info || isTruncated;\n\n // `tabIndex={0}` KASITLI: bu bir düz `<span>`, doğal olarak odaklanılabilir\n // değil — tooltip'e sadece hover'la değil `Tab`'la da ulaşılabilmesi\n // gerekiyor (aksi hâlde klavye kullanıcıları kırpılan değeri hiç okuyamaz).\n const content = (\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- kasıtlı: bu span tıklanabilir değil, TEK amacı kırpılan değerin tooltip'ini klavyeyle de erişilebilir kılmak (bkz. yukarıdaki not).\n <span ref={ref} tabIndex={showTooltip ? 0 : undefined} className=\"text-pretty line-clamp-2\">\n {value}\n </span>\n );\n\n // Kullanıcı bulgusu: `w-2xs` SABİT bir genişlikti (16rem/256px) — kısa bir\n // değer (örn. bir telefon numarası) bile balonu gereksiz yere 256px'e\n // geriyordu (\"çok geniş\" tepkisi). `max-w-2xs`'e çevrildi: sadece UZUN\n // değerler bu sınıra çarpar, kısa değerler kendi içeriğine göre (Tooltip'in\n // `w-max` varsayılanıyla) doğal genişlikte kalır. Ayrıca burada `soft` +\n // `neutral` — koyu/dolu bir balon yerine soluk gri bir ipucu (kullanıcı\n // bulgusu: \"rengi neutral gri olmalı, font-size küçülmeli\") ve `text-xs`\n // (12px, genel Tooltip'in `text-sm`/14px varsayılanından küçük).\n return showTooltip ? (\n <Tooltip color=\"neutral\" variant=\"soft\" className=\"max-w-2xs text-xs\" placement=\"bottom\" trigger={content} content={<span>{value}</span>} />\n ) : (\n content\n );\n}\n","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { CheckIcon, ChevronRightIcon, PencilIcon, Trash2Icon, XIcon } from \"lucide-react\";\nimport { Button } from \"../../button\";\nimport { TableEditDrawer } from \"./TableEditDrawer\";\nimport type { ActionProps } from \"../types\";\n\nexport interface TableRowActionsProps<T> {\n actions: ActionProps<T>;\n item: T;\n /** Satırın okunur adı — düğme adlarına eklenir (\"Sil: Aykut Yılmaz\"). */\n rowLabel: string;\n isInlineEditing: boolean;\n onStartInlineEdit: () => void;\n onSaveInlineEdit: () => void;\n onCancelInlineEdit: () => void;\n}\n\n/*\n * Eskiden `_hook/useTableBody.tsx` diye adlandırılmış bir \"hook\" bu JSX'i\n * üretiyordu — ama hiçbir React hook kuralı taşımıyordu, düz bir JSX\n * factory'siydi. Artık gerçek bir component.\n */\nexport function TableRowActions<T extends { id: string }>({\n actions,\n item,\n rowLabel,\n isInlineEditing,\n onStartInlineEdit,\n onSaveInlineEdit,\n onCancelInlineEdit,\n}: Readonly<TableRowActionsProps<T>>) {\n const [drawerOpen, setDrawerOpen] = useState(false);\n\n // Faz 15: her satırın düğmesi eskiden aynı adı (\"Sil\") taşıyordu — ekran\n // okuyucuda hangi satırın silineceği belli değildi. Silme ikonu da bir\n // silgiydi (Eraser); evrensel karşılığı çöp kutusu. Düzenle/detay nötr,\n // sadece yıkıcı eylem renkli (her ikonun mavi olması satırı kalabalıklaştırıyordu).\n const name = (action: string) => `${action}: ${rowLabel}`;\n return (\n <div className=\"flex items-center gap-1\">\n {actions.editRowInInline &&\n (isInlineEditing ? (\n <>\n <Button variant=\"ghost\" color=\"success\" size=\"sm\" onClick={onSaveInlineEdit} icon={<CheckIcon size={16} aria-hidden />} aria-label={name(\"Kaydet\")} />\n <Button variant=\"ghost\" color=\"neutral\" size=\"sm\" onClick={onCancelInlineEdit} icon={<XIcon size={16} aria-hidden />} aria-label={name(\"Vazgeç\")} />\n </>\n ) : (\n <Button variant=\"ghost\" color=\"neutral\" size=\"sm\" onClick={onStartInlineEdit} icon={<PencilIcon size={16} aria-hidden />} aria-label={name(\"Düzenle\")} />\n ))}\n {actions.onEditWithDrawer && (\n <>\n <Button variant=\"ghost\" color=\"neutral\" size=\"sm\" onClick={() => setDrawerOpen(true)} icon={<PencilIcon size={16} aria-hidden />} aria-label={name(\"Düzenle\")} />\n <TableEditDrawer title={actions.onEditWithDrawer.title} description={actions.onEditWithDrawer.description} open={drawerOpen} onClose={() => setDrawerOpen(false)}>\n <actions.onEditWithDrawer.form refetch={actions.refetch ?? (() => {})} initialData={item} closeModal={() => setDrawerOpen(false)} />\n </TableEditDrawer>\n </>\n )}\n {actions.navigateRow && (\n <Button variant=\"ghost\" color=\"neutral\" size=\"sm\" onClick={() => actions.navigateRow?.(item.id)} icon={<ChevronRightIcon size={16} aria-hidden />} aria-label={name(\"Detaya git\")} />\n )}\n {actions.deleteRow && (\n <Button variant=\"ghost\" color=\"error\" size=\"sm\" onClick={() => actions.deleteRow?.(item.id)} icon={<Trash2Icon size={16} aria-hidden />} aria-label={name(\"Sil\")} />\n )}\n </div>\n );\n}\n","import React from \"react\";\nimport { Drawer } from \"../../drawer\";\n\nexport interface TableEditDrawerProps {\n title?: string;\n description?: string;\n open: boolean;\n onClose: () => void;\n children: React.ReactNode;\n}\n\n/*\n * Eskiden `_hook/useItemDrawer.tsx` içinde tanımlıydı, `AddNewItem` adını\n * taşıyordu (yanıltıcı — \"yeni ekleme\" değil \"düzenleme\" çekmecesi) ve\n * dosyanın kendisi bir `useItemDrawer()` hook'u da export ediyordu — ama bu\n * hook'un döndürdüğü `open`/`setOpen` HİÇBİR YERDE kullanılmıyordu\n * (`useTableBody` kendi `openRowId` state'ini ayrı tutuyordu). Ölü hook\n * silindi, gerçek component `_components/`e taşındı ve doğru adını aldı.\n */\nexport function TableEditDrawer({ title, description, open, onClose, children }: Readonly<TableEditDrawerProps>) {\n return (\n // Faz 13.6: eskiden `header`'a yan yana iki <span> veriliyordu (başlık ve\n // açıklama arasında boşluk bile yoktu, ortalanmıştı). Artık Drawer'ın\n // kendi `title`/`description`'ı — dialog'un erişilebilir adı da başlık.\n <Drawer open={open} onClose={onClose} title={title} description={description} aria-label={title ? undefined : \"Kaydı düzenle\"}>\n {children}\n </Drawer>\n );\n}\n","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { cn } from \"@mari-ui/core\";\nimport { Input } from \"../../input\";\nimport { Empty } from \"../../empty\";\nimport { SkeletonSlot } from \"../../lib/SkeletonSlot\";\nimport {\n clearRowDraft,\n getActionsJustifyClass,\n getAlignClass,\n getRowLabel,\n setRowDraftValue,\n skeletonRowCount,\n skeletonWidth,\n type DraftsSetter,\n} from \"../utils\";\nimport type { ColumnDef, TableEmptyStateConfig } from \"../types\";\nimport { TableCellSkeleton } from \"./TableCellSkeleton\";\nimport { TableInfoValue } from \"./TableInfoValue\";\nimport { TableRowActions } from \"./TableRowActions\";\n\nexport interface TableBodyProps<T extends { id: string }> {\n data: T[];\n columns: ColumnDef<T>[];\n emptyState?: TableEmptyStateConfig;\n skeleton?: boolean;\n /** Veri yokken iskelette kaç sahte satır çizileceği (sayfa boyu). */\n pageSize?: number;\n}\n\n/**\n * İşlemler hücresi. `text-align` (bkz. `getAlignClass`) sadece SATIR İÇİ\n * içeriği hizalar — `TableRowActions`'ın bloğu onu yok sayıyordu, bu yüzden\n * hizalama `justify-*` ile bloğun KENDİSİNE uygulanır. Sütun ikonlara göre dar\n * (`w-px whitespace-nowrap`) ve yatay kaydırmada sağda `sticky`.\n */\nconst ACTIONS_CELL_CLASS = \"sticky right-0 w-px whitespace-nowrap border-l border-mari-border bg-mari-surface px-4 py-2.5\";\n\n/**\n * Veri hücresi. `max-w-64` KASITLI: `table-auto`'da sütun serbestçe\n * büyüyüp `line-clamp-2` hiç tetiklenmiyordu. `text-sm`: başlıktan (text-xs) orantılı.\n */\nconst DATA_CELL_CLASS = \"max-w-64 px-4 py-2.5 text-sm break-words\";\n\ninterface DataCellProps<T extends { id: string }> {\n col: ColumnDef<T>;\n item: T;\n rowIndex: number;\n columnIndex: number;\n isEditing: boolean;\n draft: Partial<T>;\n setDrafts: DraftsSetter<T>;\n skeleton: boolean;\n}\n\nfunction DataCell<T extends { id: string }>({ col, item, rowIndex, columnIndex, isEditing, draft, setDrafts, skeleton }: Readonly<DataCellProps<T>>) {\n const columnName = col.columnName;\n const rawValue = columnName ? item[columnName] : undefined;\n // `0`/`false`/`\"\"` geçerli değerlerdir — sadece null/undefined \"-\" olur.\n const displayValue = rawValue != null ? String(rawValue) : \"-\";\n\n let content: React.ReactNode;\n if (isEditing && columnName) {\n const draftValue = draft[columnName];\n content = (\n <Input\n aria-label={typeof col.header === \"string\" ? col.header : undefined}\n // Değeri kesmeden gösterecek asgari genişlik — tablo zaten yatay kayabiliyor.\n className=\"min-w-36\"\n value={draftValue !== undefined ? String(draftValue) : displayValue}\n onChange={(e) => setRowDraftValue(setDrafts, item.id, columnName, e.target.value as T[typeof columnName])}\n />\n );\n } else if (col.render) {\n content = col.render(rawValue, item, rowIndex);\n } else {\n content = <TableInfoValue info={col.info} value={displayValue} />;\n }\n\n return (\n <td className={cn(DATA_CELL_CLASS, getAlignClass(col.align))}>\n <SkeletonSlot\n on={skeleton}\n className=\"items-center\"\n placeholder={<TableCellSkeleton width={skeletonWidth(columnIndex, rowIndex)} className={getActionsJustifyClass(col.align)} />}\n >\n {content}\n </SkeletonSlot>\n </td>\n );\n}\n\n/** Veri henüz yokken (`skeleton` + boş `data`) çizilen sahte satırlar — gerçek tek satırlık satırla aynı yükseklik. */\nfunction PlaceholderRows<T extends { id: string }>({ columns, count }: Readonly<{ columns: ColumnDef<T>[]; count: number }>) {\n return (\n <tbody aria-hidden>\n {Array.from({ length: count }, (_, rowIndex) => (\n <tr key={rowIndex} className=\"border-b border-mari-border last:border-b-0\">\n {columns.map((col, columnIndex) =>\n col.actions ? (\n <td key={columnIndex} className={ACTIONS_CELL_CLASS}>\n <TableCellSkeleton width=\"3rem\" className={getActionsJustifyClass(col.align)} />\n </td>\n ) : (\n <td key={columnIndex} className={DATA_CELL_CLASS}>\n <TableCellSkeleton width={skeletonWidth(columnIndex, rowIndex)} className={getActionsJustifyClass(col.align)} />\n </td>\n )\n )}\n </tr>\n ))}\n </tbody>\n );\n}\n\nexport function TableBody<T extends { id: string }>({ data, columns, emptyState, skeleton = false, pageSize }: Readonly<TableBodyProps<T>>) {\n // Satır içi düzenleme durumu satır seviyesinde: aksiyon hücresindeki\n // \"düzenle\" AYNI satırdaki veri hücrelerini de <Input>'a çeviriyor.\n const [editingRowId, setEditingRowId] = useState<string | null>(null);\n const [drafts, setDrafts] = useState<Record<string, Partial<T>>>({});\n\n if (skeleton && data.length === 0) return <PlaceholderRows columns={columns} count={skeletonRowCount(pageSize)} />;\n\n if (data.length === 0) {\n // `text-start` açıkça: colSpan hücresi hizayı miras almıyordu (kullanıcı bulgusu).\n return (\n <tbody>\n <tr>\n <td colSpan={columns.length} className=\"p-0 text-start\">\n <Empty size=\"sm\" title={emptyState?.title ?? \"Veri Bulunamadı\"} description={emptyState?.description} />\n </td>\n </tr>\n </tbody>\n );\n }\n\n return (\n <tbody>\n {data.map((item, rowIndex) => {\n const draft: Partial<T> = drafts[item.id] ?? {};\n const isEditing = !skeleton && editingRowId === item.id;\n return (\n <tr key={item.id} className={cn(\"border-b border-mari-border last:border-b-0\", !skeleton && \"transition-colors hover:bg-mari-surface-alt/50\")}>\n {columns.map((col, columnIndex) =>\n col.actions ? (\n <td key={columnIndex} className={ACTIONS_CELL_CLASS}>\n <SkeletonSlot on={skeleton} flow=\"flex\" className=\"items-center\" placeholder={<TableCellSkeleton width=\"3rem\" className={getActionsJustifyClass(col.align)} />}>\n <div className={cn(\"flex\", getActionsJustifyClass(col.align))}>\n <TableRowActions\n actions={col.actions}\n item={item}\n rowLabel={getRowLabel(columns, item)}\n isInlineEditing={isEditing}\n onStartInlineEdit={() => setEditingRowId(item.id)}\n onSaveInlineEdit={() => {\n col.actions?.editRowInInline?.onChange({ ...item, ...draft });\n setEditingRowId(null);\n clearRowDraft(setDrafts, item.id);\n }}\n onCancelInlineEdit={() => {\n setEditingRowId(null);\n clearRowDraft(setDrafts, item.id);\n }}\n />\n </div>\n </SkeletonSlot>\n </td>\n ) : (\n <DataCell\n key={columnIndex}\n col={col}\n item={item}\n rowIndex={rowIndex}\n columnIndex={columnIndex}\n isEditing={isEditing}\n draft={draft}\n setDrafts={setDrafts}\n skeleton={skeleton}\n />\n )\n )}\n </tr>\n );\n })}\n </tbody>\n );\n}\n","import React from \"react\";\nimport { cn } from \"@mari-ui/core\";\nimport type { ColumnDef } from \"../types\";\nimport { getActionsJustifyClass, getAlignClass, skeletonWidth } from \"../utils\";\nimport { SkeletonSlot } from \"../../lib/SkeletonSlot\";\nimport { TableCellSkeleton } from \"./TableCellSkeleton\";\n\nexport interface TableHeaderProps<T extends { id: string }> {\n columns: ColumnDef<T>[];\n skeleton?: boolean;\n}\n\n/*\n * Kullanıcı bulgusu: eskiden başlık dolu bir `bg-mari-neutral-subtle` bloğu +\n * kalın (`font-semibold`), gövdeyle aynı boyutta metin kullanıyordu — \"çok\n * irrite duruyor\" tepkisi aldı. Modern dashboard tabloları (Linear/Stripe/\n * Vercel tarzı) başlığı sessiz tutar: dolgu arka plan YOK, küçük/soluk/geniş\n * harf aralıklı metin — göze asıl çarpması gereken VERİ, başlık değil.\n */\nexport function TableHeader<T extends { id: string }>({ columns, skeleton = false }: Readonly<TableHeaderProps<T>>) {\n return (\n <thead>\n <tr className=\"w-full\">\n {columns.map((col, index) => (\n <th\n key={index}\n scope=\"col\"\n className={cn(\n \"px-4 py-2.5 text-xs font-medium tracking-wide text-mari-muted uppercase border-b border-mari-border whitespace-nowrap\",\n getAlignClass(col.align),\n // İşlemler sütunu içeriğe (ikonlara) göre DAR kalır, kalan\n // boşluğu almaz — kullanıcı bulgusu: eskiden sütun gereksiz\n // yere genişti, başlık metniyle ikonlar aynı hizada değildi\n // (`text-align` blok/flex bir elemanı değil sadece satır-içi\n // içeriği hizalar — bkz. `TableBody`'deki asıl düzeltme).\n col.actions && \"sticky right-0 w-px bg-mari-surface border-l border-mari-border\"\n )}\n >\n <SkeletonSlot\n on={skeleton}\n className=\"items-center\"\n // Başlık satırı `text-xs` (16px satır) — yer tutucu da o yükseklikte.\n placeholder={<TableCellSkeleton width={col.actions ? \"2.5rem\" : skeletonWidth(index + 2)} height=\"0.625rem\" className={cn(\"h-4\", getActionsJustifyClass(col.align))} />}\n >\n {col.header}\n </SkeletonSlot>\n {/* Sütun adı veriye bağlı değil: görsel olarak iskelet, ama ekran okuyucu\n için başlık boş kalmasın (axe `empty-table-header`). */}\n {skeleton && <span className=\"sr-only\">{col.header}</span>}\n </th>\n ))}\n </tr>\n </thead>\n );\n}\n","import React from \"react\";\nimport { cn } from \"@mari-ui/core\";\nimport { Pagination } from \"../../pagination\";\nimport type { TablePaginationConfig } from \"../types\";\n\nexport interface TablePaginationProps {\n pagination: TablePaginationConfig;\n className?: string;\n skeleton?: boolean;\n}\n\n/*\n * Faz 13.5 kullanıcı isteği (\"diğer component'lerde kullandığımız şeyleri\n * burada da uygulayalım\"): eskiden burada, `../../pagination`'daki paylaşılan\n * `Pagination` component'iyle NEREDEYSE BİREBİR AYNI bir sayfa-numarası/\n * ellipsis üretme mantığı tekrar uygulanmıştı (iki ayrı `getPageList`/\n * `getGeneratePageNumbers` fonksiyonu, iki ayrı buton render döngüsü). Artık\n * `TablePagination` sadece bir ince sarmalayıcı — tüm gerçek mantık paylaşılan\n * `Pagination`'da yaşıyor, `Table.tsx`'in kendi `TablePaginationConfig`\n * sözleşmesini (`page`/`pageSize`/`total` — `Pagination`'ın `currentPage`/\n * `pageSize`/`totalItems` isimlendirmesinden farklı, Table'ın kendi API'si\n * korunuyor) `Pagination`'ın prop'larına eşliyor.\n */\nexport function TablePagination({ pagination, className, skeleton = false }: Readonly<TablePaginationProps>) {\n const { page, pageSize, total, pageSizeOptions, onPageChange, onPageSizeChange } = pagination;\n\n return (\n <div className={cn(\"border-t border-mari-border px-3 py-2.5\", className)}>\n {/* Faz 15.5: Pagination'ın kendi iskeleti — her düğme kendi kare kutusunda, yaklaşık bloklar değil. */}\n <Pagination\n skeleton={skeleton}\n currentPage={page}\n pageSize={pageSize}\n totalItems={total}\n // Table'ın kendi sözleşmesi tek argümanlı — Pagination'ın ek `pageSize`/`page` argümanları sızmasın.\n onPageChange={(next) => onPageChange(next)}\n onPageSizeChange={onPageSizeChange && ((next) => onPageSizeChange(next))}\n pageSizeOptions={pageSizeOptions}\n showTotal\n />\n </div>\n );\n}\n"],"mappings":"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","names":["useRef","cn","React","useState","cn","jsx","useState","jsx","jsx","useState","jsx","jsxs","useState","cn","React","useState","cn","jsx","cn","useState","cn","jsx","jsxs","cn","cn","jsx","cn","jsx","jsxs","useRef","cn"]}
package/dist/tabs.js CHANGED
@@ -5,10 +5,10 @@ import {
5
5
  bgSubtleClass,
6
6
  textClass,
7
7
  textSubtleContrastClass
8
- } from "./chunk-IP2J3BWY.js";
8
+ } from "./chunk-6AMBZXZJ.js";
9
9
  import {
10
10
  skeletonFill
11
- } from "./chunk-54HHEXXD.js";
11
+ } from "./chunk-VKN374SD.js";
12
12
 
13
13
  // src/tabs/Tabs.tsx
14
14
  import { useEffect, useRef, useState as useState2 } from "react";
package/dist/tabs.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tabs/Tabs.tsx","../src/tabs/useTabs.tsx","../src/tabs/_components/TabsList.tsx","../src/tabs/utils.ts","../src/tabs/_components/TabsTrigger.tsx","../src/tabs/_components/TabsContent.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { cn } from \"@mari-ui/core\";\nimport type { TabsProps } from \"./types\";\nimport { TabsProvider } from \"./useTabs\";\n\nexport type { TabsProps };\n\n/** Kapsayıcı genişliği — dikey Tabs'ın dar ekranda yataya dönmesi için. SSR'da `undefined`. */\nfunction useContainerWidth(enabled: boolean) {\n const ref = useRef<HTMLDivElement>(null);\n const [width, setWidth] = useState<number>();\n useEffect(() => {\n const el = ref.current;\n if (!enabled || !el || typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(([entry]) => entry && setWidth(entry.contentRect.width));\n observer.observe(el);\n return () => observer.disconnect();\n }, [enabled]);\n return [ref, width] as const;\n}\n\n/**\n * Compound API: `<Tabs><TabsList><TabsTrigger/></TabsList><TabsContent/></Tabs>`.\n *\n * Faz 13.6 — yapı ant.design Tabs'tan, görünüm kendi token'larımızdan:\n * `line` / `card` / `pills`, üç boyut, dikey yön (dar kapsayıcıda yataya\n * döner), `fill`, `align`, `keepMounted`, WAI-ARIA ok tuşu gezinmesi, taşan\n * sekmelerde yatay kaydırma. Bkz. `_components/TabsList.tsx`.\n */\nexport function Tabs({ className, children, orientation = \"horizontal\", responsive = 640, ...providerProps }: Readonly<TabsProps>) {\n const watch = orientation === \"vertical\" && responsive !== false;\n const [rootRef, width] = useContainerWidth(watch);\n const narrow = watch && width !== undefined && width < (responsive as number);\n const effective = narrow ? \"horizontal\" : orientation;\n const vertical = effective === \"vertical\";\n\n return (\n <TabsProvider {...providerProps} orientation={effective}>\n <div\n ref={rootRef}\n aria-busy={providerProps.skeleton || undefined}\n data-orientation={effective}\n className={cn(\"flex min-w-0\", vertical ? \"flex-row gap-6\" : \"flex-col\", className)}\n >\n {children}\n </div>\n </TabsProvider>\n );\n}\n","\"use client\";\n\nimport React, { createContext, useCallback, useContext, useId, useMemo, useState } from \"react\";\nimport { useControllableState } from \"@mari-ui/core\";\nimport type { TabsContextType, TabsProps } from \"./types\";\n\nexport const TabsContext = createContext<TabsContextType | null>(null);\n\ntype TabsProviderProps = Omit<TabsProps, \"className\" | \"responsive\">;\n\nexport function TabsProvider({\n defaultActiveTab = \"\",\n activeTab,\n onChange,\n color = \"primary\",\n variant = \"line\",\n size = \"md\",\n orientation = \"horizontal\",\n fill = false,\n align = \"start\",\n keepMounted = false,\n activationMode = \"automatic\",\n skeleton = false,\n children,\n}: Readonly<TabsProviderProps>) {\n const [resolvedActiveTab, setActiveTab] = useControllableState<string>({\n value: activeTab,\n defaultValue: defaultActiveTab,\n onChange,\n });\n const baseId = useId();\n const isControlled = activeTab !== undefined;\n\n // `aria-controls` var olmayan bir id'yi gösteremez (axe aria-valid-attr-value):\n // Tabs yalnız filtre çubuğu olarak (paneli olmadan) kullanılabilir, pasif\n // paneller de `keepMounted` yoksa DOM'da değildir.\n const [mountedPanels, setMountedPanels] = useState<ReadonlySet<string>>(() => new Set());\n const registerPanel = useCallback((panel: string) => {\n setMountedPanels((prev) => (prev.has(panel) ? prev : new Set(prev).add(panel)));\n return () =>\n setMountedPanels((prev) => {\n const next = new Set(prev);\n next.delete(panel);\n return next;\n });\n }, []);\n\n const value = useMemo<TabsContextType>(\n () => ({\n activeTab: resolvedActiveTab,\n setActiveTab,\n isControlled,\n baseId,\n color,\n variant,\n size,\n orientation,\n fill,\n align,\n keepMounted,\n activationMode,\n skeleton,\n mountedPanels,\n registerPanel,\n }),\n [resolvedActiveTab, setActiveTab, isControlled, baseId, color, variant, size, orientation, fill, align, keepMounted, activationMode, skeleton, mountedPanels, registerPanel]\n );\n\n return <TabsContext.Provider value={value}>{children}</TabsContext.Provider>;\n}\n\nexport function useTabs(): TabsContextType {\n const context = useContext(TabsContext);\n if (!context) {\n throw new Error(\"useTabs, <Tabs> içinde kullanılmalı.\");\n }\n return context;\n}\n\n/** `value` → DOM id. Değerdeki boşluk vb. id'yi bozmasın. */\nexport function getTabId(baseId: string, value: string, kind: \"tab\" | \"panel\"): string {\n return `${baseId}-${kind}-${value.replace(/\\s+/g, \"-\")}`;\n}\n","\"use client\";\n\nimport React, { useCallback, useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport { cn } from \"@mari-ui/core\";\nimport { useTabs } from \"../useTabs\";\nimport { getBarClass, getIndicatorClass, getListClass } from \"../utils\";\nimport type { TabsListProps } from \"../types\";\n\n// SSR'da useLayoutEffect uyarı verir; tarayıcıda ölçümü boyamadan önce yap.\nconst useIsomorphicLayoutEffect = typeof window === \"undefined\" ? useEffect : useLayoutEffect;\n\nconst FADE = 24;\n\nfunction getEnabledTabs(list: HTMLElement): HTMLButtonElement[] {\n return Array.from(list.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]:not(:disabled)'));\n}\n\nfunction getActiveTab(list: HTMLElement): HTMLElement | null {\n return list.querySelector<HTMLElement>('[role=\"tab\"][aria-selected=\"true\"]');\n}\n\n/** Ana eksen (offset/length) + çapraz eksen (pills zemini için). */\ninterface IndicatorRect {\n offset: number;\n length: number;\n crossOffset: number;\n cross: number;\n}\n\nfunction measureTab(tab: HTMLElement, vertical: boolean): IndicatorRect {\n if (vertical) return { offset: tab.offsetTop, length: tab.offsetHeight, crossOffset: tab.offsetLeft, cross: tab.offsetWidth };\n return { offset: tab.offsetLeft, length: tab.offsetWidth, crossOffset: tab.offsetTop, cross: tab.offsetHeight };\n}\n\nfunction getIndicatorStyle(rect: IndicatorRect | null, vertical: boolean, pills: boolean): React.CSSProperties | undefined {\n if (!rect) return undefined;\n const main = vertical ? { top: rect.offset, height: rect.length } : { left: rect.offset, width: rect.length };\n if (!pills) return main;\n const cross = vertical ? { left: rect.crossOffset, width: rect.cross } : { top: rect.crossOffset, height: rect.cross };\n return { ...main, ...cross };\n}\n\n/** Kaydırılabilir yönlerde kenarı soldurur. */\nfunction getMaskImage(fade: { start: boolean; end: boolean }): string | undefined {\n if (!fade.start && !fade.end) return undefined;\n const from = fade.start ? \"transparent\" : \"#000\";\n const to = fade.end ? \"transparent\" : \"#000\";\n return `linear-gradient(to right, ${from}, #000 ${FADE}px, #000 calc(100% - ${FADE}px), ${to})`;\n}\n\n/** Şeridi (sayfayı değil) aktif sekme görünecek kadar kaydırır. */\nfunction scrollIntoStrip(scroller: HTMLElement, tab: HTMLElement) {\n const start = tab.offsetLeft - FADE;\n const end = tab.offsetLeft + tab.offsetWidth + FADE;\n if (start < scroller.scrollLeft) scroller.scrollLeft = start;\n else if (end > scroller.scrollLeft + scroller.clientWidth) scroller.scrollLeft = end - scroller.clientWidth;\n}\n\nconst navKeys = {\n horizontal: { prev: \"ArrowLeft\", next: \"ArrowRight\" },\n vertical: { prev: \"ArrowUp\", next: \"ArrowDown\" },\n} as const;\n\n/** Klavye tuşuna göre odaklanacak sekme (döngüsel). */\nfunction getKeyTarget(key: string, tabs: HTMLButtonElement[], index: number, vertical: boolean): HTMLButtonElement | undefined {\n const keys = navKeys[vertical ? \"vertical\" : \"horizontal\"];\n switch (key) {\n case keys.prev:\n return tabs[(index - 1 + tabs.length) % tabs.length];\n case keys.next:\n return tabs[(index + 1) % tabs.length];\n case \"Home\":\n return tabs[0];\n case \"End\":\n return tabs[tabs.length - 1];\n default:\n return undefined;\n }\n}\n\n/**\n * Eski sürümdeki sorunlar (Faz 13.6'da giderildi):\n * - Gösterge sadece `activeTab` değişince ölçülüyordu — pencere/yazı tipi\n * yüklenince yanlış yerde kalıyordu. Artık ResizeObserver ile.\n * - Taşan sekmeler sayfayı yatayda taşırıyordu (mobilde son sekme kartın\n * dışına çıkıyordu). Artık kaydırılabilir şerit + kenar solması, aktif\n * sekme görünür alana kaydırılıyor.\n * - Ok tuşu gezinmesi yoktu; her sekme ayrı bir Tab durağıydı. Artık\n * WAI-ARIA Tabs deseni: roving tabindex, ←/→ (dikeyde ↑/↓), Home/End.\n * - `cloneElement` + ref dizisi ile sekme bulunuyordu (sarmalanmış bir\n * TabsTrigger'ı kaçırıyordu). Artık DOM'dan `[aria-selected=true]`.\n */\nexport function TabsList({ children, extra, className, \"aria-label\": ariaLabel }: Readonly<TabsListProps>) {\n const { activeTab, setActiveTab, isControlled, variant, orientation, size, fill, align, color, activationMode, skeleton } = useTabs();\n const vertical = orientation === \"vertical\";\n\n const scrollerRef = useRef<HTMLDivElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const [indicator, setIndicator] = useState<IndicatorRect | null>(null);\n const [animate, setAnimate] = useState(false);\n const [fade, setFade] = useState({ start: false, end: false });\n\n const measure = useCallback(() => {\n const list = listRef.current;\n const scroller = scrollerRef.current;\n if (!list || !scroller) return;\n\n const active = getActiveTab(list);\n setIndicator(active ? measureTab(active, vertical) : null);\n\n if (!vertical) {\n const { scrollLeft, scrollWidth, clientWidth } = scroller;\n setFade({ start: scrollLeft > 1, end: scrollLeft + clientWidth < scrollWidth - 1 });\n }\n }, [vertical]);\n\n // Aktif sekme değişince: ölç + görünür alana kaydır (sayfayı değil, sadece şeridi).\n useIsomorphicLayoutEffect(() => {\n measure();\n const active = listRef.current && getActiveTab(listRef.current);\n if (!vertical && scrollerRef.current && active) scrollIntoStrip(scrollerRef.current, active);\n }, [activeTab, measure, variant, size, children]);\n\n // Yön/varyant değişince (ör. dikey Tabs dar ekranda yataya döndü) geçişi\n // kapat: gösterge dikey çubuktan yatay çizgiye 300ms boyunca MORFLANIYOR,\n // ekranda bir leke gibi görünüyordu. Yeni yerine anında otursun.\n const layoutKey = `${orientation}:${variant}`;\n const prevLayoutKey = useRef(layoutKey);\n useIsomorphicLayoutEffect(() => {\n if (prevLayoutKey.current !== layoutKey) {\n prevLayoutKey.current = layoutKey;\n setAnimate(false);\n }\n }, [layoutKey]);\n\n // İlk ölçümden SONRA geçişi aç — gösterge 0'dan kayarak gelmesin.\n useEffect(() => {\n if (indicator && !animate) {\n const id = requestAnimationFrame(() => setAnimate(true));\n return () => cancelAnimationFrame(id);\n }\n }, [indicator, animate]);\n\n // Kapsayıcı/sekme boyutu değişince (pencere, yazı tipi yüklemesi) yeniden ölç.\n useEffect(() => {\n const list = listRef.current;\n const scroller = scrollerRef.current;\n if (!list || !scroller || typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(() => measure());\n observer.observe(list);\n observer.observe(scroller);\n return () => observer.disconnect();\n }, [measure]);\n\n // Uncontrolled ve hiçbir sekme aktif değilse (ör. defaultActiveTab\n // verilmemiş) ilk etkin sekmeyi seç — ant.design ile aynı. Controlled\n // modda tüketicinin değerine dokunmuyoruz.\n useIsomorphicLayoutEffect(() => {\n const list = listRef.current;\n if (!list || isControlled || getActiveTab(list)) return;\n const first = getEnabledTabs(list)[0];\n if (first?.dataset.value) setActiveTab(first.dataset.value);\n }, [activeTab, isControlled]);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n const list = listRef.current;\n if (!list) return;\n const tabs = getEnabledTabs(list);\n const index = tabs.indexOf(document.activeElement as HTMLButtonElement);\n if (index === -1) return;\n\n const target = getKeyTarget(event.key, tabs, index, vertical);\n if (!target) return;\n\n event.preventDefault();\n target.focus();\n if (activationMode === \"automatic\" && target.dataset.value) setActiveTab(target.dataset.value);\n };\n\n const maskImage = getMaskImage(fade);\n const indicatorStyle = getIndicatorStyle(indicator, vertical, variant === \"pills\");\n\n return (\n <div aria-hidden={skeleton || undefined} className={cn(\"flex min-w-0\", vertical ? \"shrink-0 flex-col\" : \"items-end\", getBarClass(variant, orientation), className)}>\n <div\n ref={scrollerRef}\n onScroll={measure}\n className={cn(\n \"flex min-w-0\",\n vertical ? \"flex-col\" : \"flex-1 overflow-x-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\",\n variant === \"pills\" && !vertical && \"py-0.5\"\n )}\n style={maskImage ? { maskImage, WebkitMaskImage: maskImage } : undefined}\n >\n {/* Odak tablist'te değil, içindeki role=\"tab\" düğmelerinde (roving\n tabindex); ok tuşu olayları buraya kabarcıklanır. */}\n {/* eslint-disable-next-line jsx-a11y/interactive-supports-focus */}\n <div\n ref={listRef}\n role=\"tablist\"\n aria-label={ariaLabel}\n aria-orientation={orientation}\n onKeyDown={handleKeyDown}\n className={cn(getListClass(variant, orientation, size, fill), align === \"center\" && !vertical && \"mx-auto\")}\n >\n {children}\n <span\n aria-hidden\n className={cn(\n \"pointer-events-none absolute\",\n getIndicatorClass(variant, orientation, color),\n animate && \"transition-[left,top,width,height] duration-300 ease-out motion-reduce:transition-none\",\n // İskelette aktif sekme henüz anlamlı değil — gösterge gizli.\n (!indicator || skeleton) && \"opacity-0\"\n )}\n style={indicatorStyle}\n />\n </div>\n </div>\n {extra && <div className={cn(\"shrink-0\", vertical ? \"mt-4\" : \"ml-4 self-center\")}>{extra}</div>}\n </div>\n );\n}\n","import { cn, type ColorRole, type Size } from \"@mari-ui/core\";\nimport { bgSolidClass, bgSubtleClass, textClass, textSubtleContrastClass } from \"../lib/colorClasses\";\nimport type { TabsOrientation, TabsVariant } from \"./types\";\n\n/**\n * Yapı ant.design Tabs'tan (çizgili: 12px dikey dolgu, 32px aralık, 2px\n * gösterge, 1px taban; kart: 8/16px dolgu, 2px aralık, üst köşeler 8px),\n * görünüm kendi token'larımızdan. Tüm class'lar literal — Tailwind tarayıcısı\n * için (bkz. lib/colorClasses).\n */\n\nconst lineSize: Record<Size, string> = {\n sm: \"py-2 text-sm\",\n md: \"py-3 text-sm\",\n lg: \"py-4 text-base\",\n};\nconst lineVerticalSize: Record<Size, string> = {\n sm: \"px-4 py-1.5 text-sm\",\n md: \"px-5 py-2 text-sm\",\n lg: \"px-6 py-2.5 text-base\",\n};\nconst cardSize: Record<Size, string> = {\n sm: \"px-3 py-1.5 text-sm\",\n md: \"px-4 py-2 text-sm\",\n lg: \"px-5 py-2.5 text-base\",\n};\nconst pillsSize: Record<Size, string> = {\n sm: \"px-2.5 py-1 text-xs\",\n md: \"px-3 py-1.5 text-sm\",\n lg: \"px-4 py-2 text-base\",\n};\n\nconst lineGap: Record<Size, string> = { sm: \"gap-6\", md: \"gap-8\", lg: \"gap-8\" };\n\nexport function getListClass(variant: TabsVariant, orientation: TabsOrientation, size: Size, fill: boolean): string {\n const vertical = orientation === \"vertical\";\n return cn(\n \"relative flex\",\n vertical ? \"flex-col items-stretch\" : \"items-center\",\n fill && !vertical && \"w-full\",\n variant === \"line\" && (vertical ? \"gap-1\" : lineGap[size]),\n variant === \"card\" && \"gap-0.5\",\n variant === \"pills\" && \"gap-1 rounded-lg bg-mari-surface-alt p-1\"\n );\n}\n\n/**\n * Taban çizgisi dış kapsayıcıda `inset` gölge olarak çiziliyor (border değil):\n * inset gölge çocukların ALTINDA boyanır, böylece gösterge (line) ve aktif\n * kartın alt kenarı (card) çizginin ÜSTÜNE biner — ant.design ile aynı.\n */\nexport function getBarClass(variant: TabsVariant, orientation: TabsOrientation): string {\n if (variant === \"pills\") return \"\";\n return orientation === \"vertical\"\n ? \"shadow-[inset_-1px_0_0_var(--color-mari-border)]\"\n : \"shadow-[inset_0_-1px_0_var(--color-mari-border)]\";\n}\n\nfunction triggerJustify(vertical: boolean, fill: boolean): string {\n if (vertical) return \"justify-start\";\n return fill ? \"flex-1 justify-center\" : \"justify-center\";\n}\n\nexport function getTriggerClass(opts: {\n active: boolean;\n variant: TabsVariant;\n orientation: TabsOrientation;\n size: Size;\n color: ColorRole;\n fill: boolean;\n}): string {\n const { active, variant, orientation, size, color, fill } = opts;\n const vertical = orientation === \"vertical\";\n const base = cn(\n \"relative inline-flex shrink-0 select-none items-center gap-2 whitespace-nowrap font-medium\",\n \"transition-colors duration-150 motion-reduce:transition-none\",\n \"disabled:cursor-not-allowed disabled:opacity-40\",\n \"focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-mari-ring\",\n triggerJustify(vertical, fill)\n );\n\n if (variant === \"card\") {\n return cn(\n base,\n cardSize[size],\n \"border border-mari-border\",\n vertical ? \"rounded-l-lg border-r-0\" : \"rounded-t-lg border-b-0\",\n active\n ? cn(\"bg-mari-surface\", textClass[color], vertical && \"-mr-px\")\n : \"bg-mari-surface-alt text-mari-muted enabled:hover:text-mari-foreground\"\n );\n }\n\n if (variant === \"pills\") {\n return cn(\n base,\n pillsSize[size],\n \"z-10 rounded-md\",\n active ? \"text-mari-foreground\" : \"text-mari-muted enabled:hover:text-mari-foreground\"\n );\n }\n\n return cn(\n base,\n vertical ? lineVerticalSize[size] : lineSize[size],\n vertical && \"rounded-l-md\",\n active ? textClass[color] : \"text-mari-muted enabled:hover:text-mari-foreground\"\n );\n}\n\nexport function getIndicatorClass(variant: TabsVariant, orientation: TabsOrientation, color: ColorRole): string {\n if (variant === \"pills\") return \"rounded-md bg-mari-surface shadow-mari-sm ring-1 ring-mari-border/60\";\n if (variant === \"card\") return \"hidden\";\n return cn(bgSolidClass[color], orientation === \"vertical\" ? \"right-0 w-0.5\" : \"bottom-0 h-0.5\", \"rounded-full\");\n}\n\nexport function getCountClass(active: boolean, color: ColorRole): string {\n return cn(\n \"inline-flex min-w-5 items-center justify-center rounded-full px-1.5 text-xs font-medium tabular-nums leading-5\",\n active ? cn(bgSubtleClass[color], textSubtleContrastClass[color]) : \"bg-mari-neutral-subtle text-mari-muted\"\n );\n}\n","\"use client\";\n\nimport React, { forwardRef } from \"react\";\nimport { cn } from \"@mari-ui/core\";\nimport { getTabId, useTabs } from \"../useTabs\";\nimport { getCountClass, getTriggerClass } from \"../utils\";\nimport type { TabsTriggerProps } from \"../types\";\nimport { skeletonFill } from \"../../lib/skeleton\";\n\n/** İskelette etiket: kendi metin kutusunda dolgu, harfler görünmez (genişlik korunur). */\nconst skeletonTextClass = cn(\"rounded-sm text-transparent\", skeletonFill(true));\n\n/**\n * Faz 13.6: artık `Button`'ı sarmalamıyor — Button'ın `h-8` sabit yüksekliği\n * ve kendi `px-*` dolgusu sekme ölçüleriyle çakışıyor, ikonla etiket ALT\n * ALTA düşüyordu. Yerel `<button role=\"tab\">`:\n * - roving tabindex (yalnız aktif sekme Tab durağı; diğerlerine ok tuşları),\n * - `useId` tabanlı id'ler (iki Tabs aynı `value`'yu kullanınca çakışıyordu),\n * - `icon` / `count` / `disabled`.\n */\nexport const TabsTrigger = forwardRef<HTMLButtonElement, TabsTriggerProps>(({ children, value, icon, count, disabled, className }, ref) => {\n const { activeTab, setActiveTab, baseId, color, variant, orientation, size, fill, skeleton, mountedPanels } = useTabs();\n const active = activeTab === value;\n\n return (\n <button\n ref={ref}\n type=\"button\"\n role=\"tab\"\n id={getTabId(baseId, value, \"tab\")}\n aria-selected={active}\n aria-controls={mountedPanels.has(value) ? getTabId(baseId, value, \"panel\") : undefined}\n tabIndex={active && !skeleton ? 0 : -1}\n disabled={disabled}\n data-value={value}\n data-state={active ? \"active\" : \"inactive\"}\n onClick={() => !skeleton && setActiveTab(value)}\n // İskelette sekme kutusu (dolgu, kenarlık, kart zemini) aynı kalır; yalnız içerik yer tutucu olur.\n className={cn(getTriggerClass({ active, variant, orientation, size, color, fill }), skeleton && \"pointer-events-none\", className)}\n >\n {icon && (\n <span aria-hidden className={cn(\"inline-flex shrink-0 [&>svg]:size-4\", skeleton && cn(\"rounded-sm [&>svg]:invisible\", skeletonFill(true)))}>\n {icon}\n </span>\n )}\n <span className={cn(skeleton && skeletonTextClass)}>{children}</span>\n {count !== undefined && <span className={cn(getCountClass(active, color), skeleton && skeletonTextClass)}>{count}</span>}\n </button>\n );\n});\n\nTabsTrigger.displayName = \"TabsTrigger\";\n","\"use client\";\n\nimport React, { useEffect } from \"react\";\nimport { cn } from \"@mari-ui/core\";\nimport { getTabId, useTabs } from \"../useTabs\";\nimport type { TabsContentProps } from \"../types\";\nimport { skeletonFill } from \"../../lib/skeleton\";\n\n/**\n * Panel `tabIndex=0` taşır (WAI-ARIA: içinde odaklanabilir öğe olmayan bir\n * panel de klavyeyle erişilebilsin). Eskiden sabit `p-2` dolgu dayatıyordu —\n * artık sadece sekme çubuğundan ayıran üst boşluk (ant.design: 16px).\n */\nexport function TabsContent({ children, value, forceMount = false, className }: Readonly<TabsContentProps>) {\n const { activeTab, baseId, keepMounted, orientation, skeleton, registerPanel } = useTabs();\n const active = activeTab === value;\n const mounted = active || keepMounted || forceMount;\n useEffect(() => (mounted ? registerPanel(value) : undefined), [mounted, value, registerPanel]);\n if (!mounted) return null;\n\n // İskelet: gerçek içerik görünmez olarak akışta kalır ve paneli O boyar (yüklenince zıplamaz);\n // satır çubukları üstüne biner, sığmayanlar kırpılır. İçerik boşsa en az bir satırlık yer.\n const body = skeleton ? (\n <div aria-hidden className=\"relative min-h-5\">\n <div className=\"invisible\">{children}</div>\n <span className=\"absolute inset-0 flex flex-col gap-2.5 overflow-hidden pt-1\">\n {[\"w-full\", \"w-11/12\", \"w-3/5\"].map((width) => (\n <span key={width} className={cn(\"block h-3 shrink-0 rounded-sm\", width, skeletonFill(true))} />\n ))}\n </span>\n </div>\n ) : (\n children\n );\n\n return (\n <div\n role=\"tabpanel\"\n id={getTabId(baseId, value, \"panel\")}\n aria-labelledby={getTabId(baseId, value, \"tab\")}\n tabIndex={skeleton ? -1 : 0}\n hidden={!active}\n data-value={value}\n className={cn(\n \"rounded-md focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-mari-ring\",\n orientation === \"vertical\" ? \"min-w-0 flex-1\" : \"pt-4\",\n className\n )}\n >\n {body}\n </div>\n );\n}\n"],"mappings":"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","names":["useState","jsx","useState","useCallback","useEffect","useRef","useState","cn","cn","cn","jsx","useEffect","useRef","useState","useCallback","cn","cn","jsx","jsxs","cn","useEffect","cn","jsx","jsxs","useEffect","cn"]}
1
+ {"version":3,"sources":["../src/tabs/Tabs.tsx","../src/tabs/useTabs.tsx","../src/tabs/_components/TabsList.tsx","../src/tabs/utils.ts","../src/tabs/_components/TabsTrigger.tsx","../src/tabs/_components/TabsContent.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { cn } from \"@mari-ui/core\";\nimport type { TabsProps } from \"./types\";\nimport { TabsProvider } from \"./useTabs\";\n\nexport type { TabsProps };\n\n/** Kapsayıcı genişliği — dikey Tabs'ın dar ekranda yataya dönmesi için. SSR'da `undefined`. */\nfunction useContainerWidth(enabled: boolean) {\n const ref = useRef<HTMLDivElement>(null);\n const [width, setWidth] = useState<number>();\n useEffect(() => {\n const el = ref.current;\n if (!enabled || !el || typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(([entry]) => entry && setWidth(entry.contentRect.width));\n observer.observe(el);\n return () => observer.disconnect();\n }, [enabled]);\n return [ref, width] as const;\n}\n\n/**\n * Compound API: `<Tabs><TabsList><TabsTrigger/></TabsList><TabsContent/></Tabs>`.\n *\n * `line` / `card` / `pills`, üç boyut, dikey yön (dar kapsayıcıda yataya\n * döner), `fill`, `align`, `keepMounted`, WAI-ARIA ok tuşu gezinmesi, taşan\n * sekmelerde yatay kaydırma. Bkz. `_components/TabsList.tsx`.\n */\nexport function Tabs({ className, children, orientation = \"horizontal\", responsive = 640, ...providerProps }: Readonly<TabsProps>) {\n const watch = orientation === \"vertical\" && responsive !== false;\n const [rootRef, width] = useContainerWidth(watch);\n const narrow = watch && width !== undefined && width < (responsive as number);\n const effective = narrow ? \"horizontal\" : orientation;\n const vertical = effective === \"vertical\";\n\n return (\n <TabsProvider {...providerProps} orientation={effective}>\n <div\n ref={rootRef}\n aria-busy={providerProps.skeleton || undefined}\n data-orientation={effective}\n className={cn(\"flex min-w-0\", vertical ? \"flex-row gap-6\" : \"flex-col\", className)}\n >\n {children}\n </div>\n </TabsProvider>\n );\n}\n","\"use client\";\n\nimport React, { createContext, useCallback, useContext, useId, useMemo, useState } from \"react\";\nimport { useControllableState } from \"@mari-ui/core\";\nimport type { TabsContextType, TabsProps } from \"./types\";\n\nexport const TabsContext = createContext<TabsContextType | null>(null);\n\ntype TabsProviderProps = Omit<TabsProps, \"className\" | \"responsive\">;\n\nexport function TabsProvider({\n defaultActiveTab = \"\",\n activeTab,\n onChange,\n color = \"primary\",\n variant = \"line\",\n size = \"md\",\n orientation = \"horizontal\",\n fill = false,\n align = \"start\",\n keepMounted = false,\n activationMode = \"automatic\",\n skeleton = false,\n children,\n}: Readonly<TabsProviderProps>) {\n const [resolvedActiveTab, setActiveTab] = useControllableState<string>({\n value: activeTab,\n defaultValue: defaultActiveTab,\n onChange,\n });\n const baseId = useId();\n const isControlled = activeTab !== undefined;\n\n // `aria-controls` var olmayan bir id'yi gösteremez (axe aria-valid-attr-value):\n // Tabs yalnız filtre çubuğu olarak (paneli olmadan) kullanılabilir, pasif\n // paneller de `keepMounted` yoksa DOM'da değildir.\n const [mountedPanels, setMountedPanels] = useState<ReadonlySet<string>>(() => new Set());\n const registerPanel = useCallback((panel: string) => {\n setMountedPanels((prev) => (prev.has(panel) ? prev : new Set(prev).add(panel)));\n return () =>\n setMountedPanels((prev) => {\n const next = new Set(prev);\n next.delete(panel);\n return next;\n });\n }, []);\n\n const value = useMemo<TabsContextType>(\n () => ({\n activeTab: resolvedActiveTab,\n setActiveTab,\n isControlled,\n baseId,\n color,\n variant,\n size,\n orientation,\n fill,\n align,\n keepMounted,\n activationMode,\n skeleton,\n mountedPanels,\n registerPanel,\n }),\n [resolvedActiveTab, setActiveTab, isControlled, baseId, color, variant, size, orientation, fill, align, keepMounted, activationMode, skeleton, mountedPanels, registerPanel]\n );\n\n return <TabsContext.Provider value={value}>{children}</TabsContext.Provider>;\n}\n\nexport function useTabs(): TabsContextType {\n const context = useContext(TabsContext);\n if (!context) {\n throw new Error(\"useTabs, <Tabs> içinde kullanılmalı.\");\n }\n return context;\n}\n\n/** `value` → DOM id. Değerdeki boşluk vb. id'yi bozmasın. */\nexport function getTabId(baseId: string, value: string, kind: \"tab\" | \"panel\"): string {\n return `${baseId}-${kind}-${value.replace(/\\s+/g, \"-\")}`;\n}\n","\"use client\";\n\nimport React, { useCallback, useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport { cn } from \"@mari-ui/core\";\nimport { useTabs } from \"../useTabs\";\nimport { getBarClass, getIndicatorClass, getListClass } from \"../utils\";\nimport type { TabsListProps } from \"../types\";\n\n// SSR'da useLayoutEffect uyarı verir; tarayıcıda ölçümü boyamadan önce yap.\nconst useIsomorphicLayoutEffect = typeof window === \"undefined\" ? useEffect : useLayoutEffect;\n\nconst FADE = 24;\n\nfunction getEnabledTabs(list: HTMLElement): HTMLButtonElement[] {\n return Array.from(list.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]:not(:disabled)'));\n}\n\nfunction getActiveTab(list: HTMLElement): HTMLElement | null {\n return list.querySelector<HTMLElement>('[role=\"tab\"][aria-selected=\"true\"]');\n}\n\n/** Ana eksen (offset/length) + çapraz eksen (pills zemini için). */\ninterface IndicatorRect {\n offset: number;\n length: number;\n crossOffset: number;\n cross: number;\n}\n\nfunction measureTab(tab: HTMLElement, vertical: boolean): IndicatorRect {\n if (vertical) return { offset: tab.offsetTop, length: tab.offsetHeight, crossOffset: tab.offsetLeft, cross: tab.offsetWidth };\n return { offset: tab.offsetLeft, length: tab.offsetWidth, crossOffset: tab.offsetTop, cross: tab.offsetHeight };\n}\n\nfunction getIndicatorStyle(rect: IndicatorRect | null, vertical: boolean, pills: boolean): React.CSSProperties | undefined {\n if (!rect) return undefined;\n const main = vertical ? { top: rect.offset, height: rect.length } : { left: rect.offset, width: rect.length };\n if (!pills) return main;\n const cross = vertical ? { left: rect.crossOffset, width: rect.cross } : { top: rect.crossOffset, height: rect.cross };\n return { ...main, ...cross };\n}\n\n/** Kaydırılabilir yönlerde kenarı soldurur. */\nfunction getMaskImage(fade: { start: boolean; end: boolean }): string | undefined {\n if (!fade.start && !fade.end) return undefined;\n const from = fade.start ? \"transparent\" : \"#000\";\n const to = fade.end ? \"transparent\" : \"#000\";\n return `linear-gradient(to right, ${from}, #000 ${FADE}px, #000 calc(100% - ${FADE}px), ${to})`;\n}\n\n/** Şeridi (sayfayı değil) aktif sekme görünecek kadar kaydırır. */\nfunction scrollIntoStrip(scroller: HTMLElement, tab: HTMLElement) {\n const start = tab.offsetLeft - FADE;\n const end = tab.offsetLeft + tab.offsetWidth + FADE;\n if (start < scroller.scrollLeft) scroller.scrollLeft = start;\n else if (end > scroller.scrollLeft + scroller.clientWidth) scroller.scrollLeft = end - scroller.clientWidth;\n}\n\nconst navKeys = {\n horizontal: { prev: \"ArrowLeft\", next: \"ArrowRight\" },\n vertical: { prev: \"ArrowUp\", next: \"ArrowDown\" },\n} as const;\n\n/** Klavye tuşuna göre odaklanacak sekme (döngüsel). */\nfunction getKeyTarget(key: string, tabs: HTMLButtonElement[], index: number, vertical: boolean): HTMLButtonElement | undefined {\n const keys = navKeys[vertical ? \"vertical\" : \"horizontal\"];\n switch (key) {\n case keys.prev:\n return tabs[(index - 1 + tabs.length) % tabs.length];\n case keys.next:\n return tabs[(index + 1) % tabs.length];\n case \"Home\":\n return tabs[0];\n case \"End\":\n return tabs[tabs.length - 1];\n default:\n return undefined;\n }\n}\n\n/**\n * Eski sürümdeki sorunlar:\n * - Gösterge sadece `activeTab` değişince ölçülüyordu — pencere/yazı tipi\n * yüklenince yanlış yerde kalıyordu. Artık ResizeObserver ile.\n * - Taşan sekmeler sayfayı yatayda taşırıyordu (mobilde son sekme kartın\n * dışına çıkıyordu). Artık kaydırılabilir şerit + kenar solması, aktif\n * sekme görünür alana kaydırılıyor.\n * - Ok tuşu gezinmesi yoktu; her sekme ayrı bir Tab durağıydı. Artık\n * WAI-ARIA Tabs deseni: roving tabindex, ←/→ (dikeyde ↑/↓), Home/End.\n * - `cloneElement` + ref dizisi ile sekme bulunuyordu (sarmalanmış bir\n * TabsTrigger'ı kaçırıyordu). Artık DOM'dan `[aria-selected=true]`.\n */\nexport function TabsList({ children, extra, className, \"aria-label\": ariaLabel }: Readonly<TabsListProps>) {\n const { activeTab, setActiveTab, isControlled, variant, orientation, size, fill, align, color, activationMode, skeleton } = useTabs();\n const vertical = orientation === \"vertical\";\n\n const scrollerRef = useRef<HTMLDivElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const [indicator, setIndicator] = useState<IndicatorRect | null>(null);\n const [animate, setAnimate] = useState(false);\n const [fade, setFade] = useState({ start: false, end: false });\n\n const measure = useCallback(() => {\n const list = listRef.current;\n const scroller = scrollerRef.current;\n if (!list || !scroller) return;\n\n const active = getActiveTab(list);\n setIndicator(active ? measureTab(active, vertical) : null);\n\n if (!vertical) {\n const { scrollLeft, scrollWidth, clientWidth } = scroller;\n setFade({ start: scrollLeft > 1, end: scrollLeft + clientWidth < scrollWidth - 1 });\n }\n }, [vertical]);\n\n // Aktif sekme değişince: ölç + görünür alana kaydır (sayfayı değil, sadece şeridi).\n useIsomorphicLayoutEffect(() => {\n measure();\n const active = listRef.current && getActiveTab(listRef.current);\n if (!vertical && scrollerRef.current && active) scrollIntoStrip(scrollerRef.current, active);\n }, [activeTab, measure, variant, size, children]);\n\n // Yön/varyant değişince (ör. dikey Tabs dar ekranda yataya döndü) geçişi\n // kapat: gösterge dikey çubuktan yatay çizgiye 300ms boyunca MORFLANIYOR,\n // ekranda bir leke gibi görünüyordu. Yeni yerine anında otursun.\n const layoutKey = `${orientation}:${variant}`;\n const prevLayoutKey = useRef(layoutKey);\n useIsomorphicLayoutEffect(() => {\n if (prevLayoutKey.current !== layoutKey) {\n prevLayoutKey.current = layoutKey;\n setAnimate(false);\n }\n }, [layoutKey]);\n\n // İlk ölçümden SONRA geçişi aç — gösterge 0'dan kayarak gelmesin.\n useEffect(() => {\n if (indicator && !animate) {\n const id = requestAnimationFrame(() => setAnimate(true));\n return () => cancelAnimationFrame(id);\n }\n }, [indicator, animate]);\n\n // Kapsayıcı/sekme boyutu değişince (pencere, yazı tipi yüklemesi) yeniden ölç.\n useEffect(() => {\n const list = listRef.current;\n const scroller = scrollerRef.current;\n if (!list || !scroller || typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(() => measure());\n observer.observe(list);\n observer.observe(scroller);\n return () => observer.disconnect();\n }, [measure]);\n\n // Uncontrolled ve hiçbir sekme aktif değilse (ör. defaultActiveTab\n // verilmemiş) ilk etkin sekmeyi seç — ant.design ile aynı. Controlled\n // modda tüketicinin değerine dokunmuyoruz.\n useIsomorphicLayoutEffect(() => {\n const list = listRef.current;\n if (!list || isControlled || getActiveTab(list)) return;\n const first = getEnabledTabs(list)[0];\n if (first?.dataset.value) setActiveTab(first.dataset.value);\n }, [activeTab, isControlled]);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n const list = listRef.current;\n if (!list) return;\n const tabs = getEnabledTabs(list);\n const index = tabs.indexOf(document.activeElement as HTMLButtonElement);\n if (index === -1) return;\n\n const target = getKeyTarget(event.key, tabs, index, vertical);\n if (!target) return;\n\n event.preventDefault();\n target.focus();\n if (activationMode === \"automatic\" && target.dataset.value) setActiveTab(target.dataset.value);\n };\n\n const maskImage = getMaskImage(fade);\n const indicatorStyle = getIndicatorStyle(indicator, vertical, variant === \"pills\");\n\n return (\n <div aria-hidden={skeleton || undefined} className={cn(\"flex min-w-0\", vertical ? \"shrink-0 flex-col\" : \"items-end\", getBarClass(variant, orientation), className)}>\n <div\n ref={scrollerRef}\n onScroll={measure}\n className={cn(\n \"flex min-w-0\",\n vertical ? \"flex-col\" : \"flex-1 overflow-x-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\",\n variant === \"pills\" && !vertical && \"py-0.5\"\n )}\n style={maskImage ? { maskImage, WebkitMaskImage: maskImage } : undefined}\n >\n {/* Odak tablist'te değil, içindeki role=\"tab\" düğmelerinde (roving\n tabindex); ok tuşu olayları buraya kabarcıklanır. */}\n {/* eslint-disable-next-line jsx-a11y/interactive-supports-focus */}\n <div\n ref={listRef}\n role=\"tablist\"\n aria-label={ariaLabel}\n aria-orientation={orientation}\n onKeyDown={handleKeyDown}\n className={cn(getListClass(variant, orientation, size, fill), align === \"center\" && !vertical && \"mx-auto\")}\n >\n {children}\n <span\n aria-hidden\n className={cn(\n \"pointer-events-none absolute\",\n getIndicatorClass(variant, orientation, color),\n animate && \"transition-[left,top,width,height] duration-300 ease-out motion-reduce:transition-none\",\n // İskelette aktif sekme henüz anlamlı değil — gösterge gizli.\n (!indicator || skeleton) && \"opacity-0\"\n )}\n style={indicatorStyle}\n />\n </div>\n </div>\n {extra && <div className={cn(\"shrink-0\", vertical ? \"mt-4\" : \"ml-4 self-center\")}>{extra}</div>}\n </div>\n );\n}\n","import { cn, type ColorRole, type Size } from \"@mari-ui/core\";\nimport { bgSolidClass, bgSubtleClass, textClass, textSubtleContrastClass } from \"../lib/colorClasses\";\nimport type { TabsOrientation, TabsVariant } from \"./types\";\n\n/*\n * Yapı ant.design Tabs'tan (çizgili: 12px dikey dolgu, 32px aralık, 2px\n * gösterge, 1px taban; kart: 8/16px dolgu, 2px aralık, üst köşeler 8px),\n * görünüm kendi token'larımızdan. Tüm class'lar literal — Tailwind tarayıcısı\n * için (bkz. lib/colorClasses).\n */\n\nconst lineSize: Record<Size, string> = {\n sm: \"py-2 text-sm\",\n md: \"py-3 text-sm\",\n lg: \"py-4 text-base\",\n};\nconst lineVerticalSize: Record<Size, string> = {\n sm: \"px-4 py-1.5 text-sm\",\n md: \"px-5 py-2 text-sm\",\n lg: \"px-6 py-2.5 text-base\",\n};\nconst cardSize: Record<Size, string> = {\n sm: \"px-3 py-1.5 text-sm\",\n md: \"px-4 py-2 text-sm\",\n lg: \"px-5 py-2.5 text-base\",\n};\nconst pillsSize: Record<Size, string> = {\n sm: \"px-2.5 py-1 text-xs\",\n md: \"px-3 py-1.5 text-sm\",\n lg: \"px-4 py-2 text-base\",\n};\n\nconst lineGap: Record<Size, string> = { sm: \"gap-6\", md: \"gap-8\", lg: \"gap-8\" };\n\nexport function getListClass(variant: TabsVariant, orientation: TabsOrientation, size: Size, fill: boolean): string {\n const vertical = orientation === \"vertical\";\n return cn(\n \"relative flex\",\n vertical ? \"flex-col items-stretch\" : \"items-center\",\n fill && !vertical && \"w-full\",\n variant === \"line\" && (vertical ? \"gap-1\" : lineGap[size]),\n variant === \"card\" && \"gap-0.5\",\n variant === \"pills\" && \"gap-1 rounded-lg bg-mari-surface-alt p-1\"\n );\n}\n\n/*\n * Taban çizgisi dış kapsayıcıda `inset` gölge olarak çiziliyor (border değil):\n * inset gölge çocukların ALTINDA boyanır, böylece gösterge (line) ve aktif\n * kartın alt kenarı (card) çizginin ÜSTÜNE biner — ant.design ile aynı.\n */\nexport function getBarClass(variant: TabsVariant, orientation: TabsOrientation): string {\n if (variant === \"pills\") return \"\";\n return orientation === \"vertical\"\n ? \"shadow-[inset_-1px_0_0_var(--color-mari-border)]\"\n : \"shadow-[inset_0_-1px_0_var(--color-mari-border)]\";\n}\n\nfunction triggerJustify(vertical: boolean, fill: boolean): string {\n if (vertical) return \"justify-start\";\n return fill ? \"flex-1 justify-center\" : \"justify-center\";\n}\n\nexport function getTriggerClass(opts: {\n active: boolean;\n variant: TabsVariant;\n orientation: TabsOrientation;\n size: Size;\n color: ColorRole;\n fill: boolean;\n}): string {\n const { active, variant, orientation, size, color, fill } = opts;\n const vertical = orientation === \"vertical\";\n const base = cn(\n \"relative inline-flex shrink-0 select-none items-center gap-2 whitespace-nowrap font-medium\",\n \"transition-colors duration-150 motion-reduce:transition-none\",\n \"disabled:cursor-not-allowed disabled:opacity-40\",\n \"focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-mari-ring\",\n triggerJustify(vertical, fill)\n );\n\n if (variant === \"card\") {\n return cn(\n base,\n cardSize[size],\n \"border border-mari-border\",\n vertical ? \"rounded-l-lg border-r-0\" : \"rounded-t-lg border-b-0\",\n active\n ? cn(\"bg-mari-surface\", textClass[color], vertical && \"-mr-px\")\n : \"bg-mari-surface-alt text-mari-muted enabled:hover:text-mari-foreground\"\n );\n }\n\n if (variant === \"pills\") {\n return cn(\n base,\n pillsSize[size],\n \"z-10 rounded-md\",\n active ? \"text-mari-foreground\" : \"text-mari-muted enabled:hover:text-mari-foreground\"\n );\n }\n\n return cn(\n base,\n vertical ? lineVerticalSize[size] : lineSize[size],\n vertical && \"rounded-l-md\",\n active ? textClass[color] : \"text-mari-muted enabled:hover:text-mari-foreground\"\n );\n}\n\nexport function getIndicatorClass(variant: TabsVariant, orientation: TabsOrientation, color: ColorRole): string {\n if (variant === \"pills\") return \"rounded-md bg-mari-surface shadow-mari-sm ring-1 ring-mari-border/60\";\n if (variant === \"card\") return \"hidden\";\n return cn(bgSolidClass[color], orientation === \"vertical\" ? \"right-0 w-0.5\" : \"bottom-0 h-0.5\", \"rounded-full\");\n}\n\nexport function getCountClass(active: boolean, color: ColorRole): string {\n return cn(\n \"inline-flex min-w-5 items-center justify-center rounded-full px-1.5 text-xs font-medium tabular-nums leading-5\",\n active ? cn(bgSubtleClass[color], textSubtleContrastClass[color]) : \"bg-mari-neutral-subtle text-mari-muted\"\n );\n}\n","\"use client\";\n\nimport React, { forwardRef } from \"react\";\nimport { cn } from \"@mari-ui/core\";\nimport { getTabId, useTabs } from \"../useTabs\";\nimport { getCountClass, getTriggerClass } from \"../utils\";\nimport type { TabsTriggerProps } from \"../types\";\nimport { skeletonFill } from \"../../lib/skeleton\";\n\n/** İskelette etiket: kendi metin kutusunda dolgu, harfler görünmez (genişlik korunur). */\nconst skeletonTextClass = cn(\"rounded-sm text-transparent\", skeletonFill(true));\n\n/**\n * Artık `Button`'ı sarmalamıyor — Button'ın `h-8` sabit yüksekliği\n * ve kendi `px-*` dolgusu sekme ölçüleriyle çakışıyor, ikonla etiket ALT\n * ALTA düşüyordu. Yerel `<button role=\"tab\">`:\n * - roving tabindex (yalnız aktif sekme Tab durağı; diğerlerine ok tuşları),\n * - `useId` tabanlı id'ler (iki Tabs aynı `value`'yu kullanınca çakışıyordu),\n * - `icon` / `count` / `disabled`.\n */\nexport const TabsTrigger = forwardRef<HTMLButtonElement, TabsTriggerProps>(({ children, value, icon, count, disabled, className }, ref) => {\n const { activeTab, setActiveTab, baseId, color, variant, orientation, size, fill, skeleton, mountedPanels } = useTabs();\n const active = activeTab === value;\n\n return (\n <button\n ref={ref}\n type=\"button\"\n role=\"tab\"\n id={getTabId(baseId, value, \"tab\")}\n aria-selected={active}\n aria-controls={mountedPanels.has(value) ? getTabId(baseId, value, \"panel\") : undefined}\n tabIndex={active && !skeleton ? 0 : -1}\n disabled={disabled}\n data-value={value}\n data-state={active ? \"active\" : \"inactive\"}\n onClick={() => !skeleton && setActiveTab(value)}\n // İskelette sekme kutusu (dolgu, kenarlık, kart zemini) aynı kalır; yalnız içerik yer tutucu olur.\n className={cn(getTriggerClass({ active, variant, orientation, size, color, fill }), skeleton && \"pointer-events-none\", className)}\n >\n {icon && (\n <span aria-hidden className={cn(\"inline-flex shrink-0 [&>svg]:size-4\", skeleton && cn(\"rounded-sm [&>svg]:invisible\", skeletonFill(true)))}>\n {icon}\n </span>\n )}\n <span className={cn(skeleton && skeletonTextClass)}>{children}</span>\n {count !== undefined && <span className={cn(getCountClass(active, color), skeleton && skeletonTextClass)}>{count}</span>}\n </button>\n );\n});\n\nTabsTrigger.displayName = \"TabsTrigger\";\n","\"use client\";\n\nimport React, { useEffect } from \"react\";\nimport { cn } from \"@mari-ui/core\";\nimport { getTabId, useTabs } from \"../useTabs\";\nimport type { TabsContentProps } from \"../types\";\nimport { skeletonFill } from \"../../lib/skeleton\";\n\n/*\n * Panel `tabIndex=0` taşır (WAI-ARIA: içinde odaklanabilir öğe olmayan bir\n * panel de klavyeyle erişilebilsin). Eskiden sabit `p-2` dolgu dayatıyordu —\n * artık sadece sekme çubuğundan ayıran üst boşluk.\n */\nexport function TabsContent({ children, value, forceMount = false, className }: Readonly<TabsContentProps>) {\n const { activeTab, baseId, keepMounted, orientation, skeleton, registerPanel } = useTabs();\n const active = activeTab === value;\n const mounted = active || keepMounted || forceMount;\n useEffect(() => (mounted ? registerPanel(value) : undefined), [mounted, value, registerPanel]);\n if (!mounted) return null;\n\n // İskelet: gerçek içerik görünmez olarak akışta kalır ve paneli O boyar (yüklenince zıplamaz);\n // satır çubukları üstüne biner, sığmayanlar kırpılır. İçerik boşsa en az bir satırlık yer.\n const body = skeleton ? (\n <div aria-hidden className=\"relative min-h-5\">\n <div className=\"invisible\">{children}</div>\n <span className=\"absolute inset-0 flex flex-col gap-2.5 overflow-hidden pt-1\">\n {[\"w-full\", \"w-11/12\", \"w-3/5\"].map((width) => (\n <span key={width} className={cn(\"block h-3 shrink-0 rounded-sm\", width, skeletonFill(true))} />\n ))}\n </span>\n </div>\n ) : (\n children\n );\n\n return (\n <div\n role=\"tabpanel\"\n id={getTabId(baseId, value, \"panel\")}\n aria-labelledby={getTabId(baseId, value, \"tab\")}\n tabIndex={skeleton ? -1 : 0}\n hidden={!active}\n data-value={value}\n className={cn(\n \"rounded-md focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-mari-ring\",\n orientation === \"vertical\" ? \"min-w-0 flex-1\" : \"pt-4\",\n className\n )}\n >\n {body}\n </div>\n );\n}\n"],"mappings":"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","names":["useState","jsx","useState","useCallback","useEffect","useRef","useState","cn","cn","cn","jsx","useEffect","useRef","useState","useCallback","cn","cn","jsx","jsxs","cn","useEffect","cn","jsx","jsxs","useEffect","cn"]}