@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/rate.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/rate/Rate.tsx","../src/rate/utils.ts"],"sourcesContent":["\"use client\";\n\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { Star } from \"lucide-react\";\nimport { cn, useControllableState } from \"@mari-ui/core\";\nimport { textClass } from \"../lib/colorClasses\";\nimport { skeletonBoxProps } from \"../lib/skeleton\";\nimport type { RateProps } from \"./types\";\nimport { handleClick, handleMouseEnter, handleMouseLeave } from \"./utils\";\n\nexport type { RateProps };\n\n/**\n * Eskiden `types.ts` tamamen boştu (bkz. plan denetimi). `value`/\n * `defaultValue` artık `useControllableState` ile yönetiliyor — eskiden\n * `isControlled = value !== undefined` elle hesaplanıp `handleClick`'e\n * ayrıca geçiriliyordu.\n */\n/**\n * Yıldız ikonları. Varsayılan palet (renk verilmedi): dolu = puan sarısı,\n * boş = dolgusuz sarı kontur. Rol/ham renk: dolu = o renk, boş = dolgusuz o\n * renkte kontur (`currentColor`, `tintEmpty` ile boyanır). Özel `character`\n * olduğu gibi kullanılır. Kullanıcı kararı: kontur her zaman dolgunun rengi.\n */\nfunction resolveStarIcons(\n character: RateProps[\"character\"],\n color: RateProps[\"color\"],\n characterColor: string | undefined,\n size: number | string\n): { filledIcon: React.ReactNode; emptyIcon: React.ReactNode; tintEmpty: boolean } {\n if (character !== undefined) {\n const icon = typeof character === \"function\" ? character({}) : character;\n return { filledIcon: icon, emptyIcon: icon, tintEmpty: false };\n }\n if (!color && !characterColor) {\n return {\n filledIcon: <Star size={size} fill=\"var(--mari-color-rating)\" stroke=\"var(--mari-color-rating-stroke)\" strokeWidth={1.5} />,\n emptyIcon: <Star size={size} fill=\"none\" stroke=\"var(--mari-color-rating-stroke)\" strokeWidth={1.5} />,\n tintEmpty: false,\n };\n }\n return {\n filledIcon: <Star size={size} fill=\"currentColor\" stroke=\"currentColor\" />,\n emptyIcon: <Star size={size} fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5} />,\n tintEmpty: true,\n };\n}\n\n/** Bir yıldızın dolu oranı (0–1). */\nfunction starFraction(value: number, index: number, allowHalf: boolean, exact: boolean): number {\n const raw = Math.min(1, Math.max(0, value - index));\n if (exact) return raw;\n if (raw >= 1) return 1;\n return allowHalf && raw >= 0.5 ? 0.5 : 0;\n}\n\nexport function Rate({\n allowClear = true,\n allowHalf = false,\n autoFocus = false,\n character,\n className,\n count = 5,\n defaultValue = 0,\n disabled = false,\n value,\n onBlur,\n onChange,\n onFocus,\n onHoverChange,\n onKeyDown,\n characterSize = \"1.5rem\",\n color,\n characterColor,\n \"aria-label\": ariaLabel = \"Puan\",\n readOnly = false,\n skeleton = false,\n}: Readonly<RateProps>) {\n const [hoverValue, setHoverValue] = useState<number | undefined>(undefined);\n const [displayValue, setDisplayValue] = useControllableState<number>({ value, defaultValue, onChange });\n const rootRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (autoFocus) rootRef.current?.focus();\n }, [autoFocus]);\n\n const colorClass = color ? textClass[color] : \"text-mari-rating\";\n const interactive = !disabled && !readOnly;\n\n if (skeleton) {\n return (\n <div aria-hidden className={cn(\"flex gap-1\", className)}>\n {Array.from({ length: count }, (_, i) => (\n <span key={i} {...skeletonBoxProps(\"rounded-sm\")} style={{ width: characterSize, height: characterSize }} />\n ))}\n </div>\n );\n }\n const step = allowHalf ? 0.5 : 1;\n\n /**\n * Eskiden kök `<div>` odaklanabilirdi (`tabIndex`) ama YALNIZCA fareyle\n * değiştirilebiliyordu — dahili hiçbir tuş işleyicisi yoktu, `onKeyDown`\n * salt tüketiciye ilettiği bir pass-through'du. Klavye kullanıcısı için\n * KULLANILAMAZ durumdaydı (AutoComplete'in Faz 13'te düzeltilen aynı\n * sınıf hatası). Ok Sağ/Yukarı artırır, Ok Sol/Aşağı azaltır, Home/End\n * uçlara atlar.\n */\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(e);\n if (disabled) return;\n if (![\"ArrowRight\", \"ArrowUp\", \"ArrowLeft\", \"ArrowDown\", \"Home\", \"End\"].includes(e.key)) return;\n e.preventDefault();\n // Fare daha önce üzerinde durup ayrılmadıysa `hoverValue` hâlâ set —\n // görsel önizleme `displayValue`nun önüne geçip klavyeyle yapılan\n // değişikliği MASKELİYORDU (aria-value* doğru ama yıldızlar eski\n // hover konumunda donuk kalıyordu). Klavyeyle her değişiklikte temizle.\n setHoverValue(undefined);\n if (e.key === \"ArrowRight\" || e.key === \"ArrowUp\") {\n setDisplayValue(Math.min(count, Math.round((displayValue + step) * 2) / 2));\n } else if (e.key === \"ArrowLeft\" || e.key === \"ArrowDown\") {\n setDisplayValue(Math.max(0, Math.round((displayValue - step) * 2) / 2));\n } else if (e.key === \"Home\") {\n setDisplayValue(0);\n } else if (e.key === \"End\") {\n setDisplayValue(count);\n }\n };\n\n const currentValue = hoverValue ?? displayValue;\n const { filledIcon, emptyIcon, tintEmpty } = resolveStarIcons(character, color, characterColor, characterSize);\n\n // Etkileşimsizken (disabled/readOnly) yıldızlar hiçbir olay dinlemez.\n const starHandlers = (i: number): React.HTMLAttributes<HTMLSpanElement> =>\n interactive\n ? {\n // `onChange` BİLİNÇLİ OLARAK geçirilmiyor: `setDisplayValue` zaten\n // kendi `onChange`'ini tetikliyor — ikisi birden ÇİFT çağırırdı.\n onClick: (e) => handleClick(e, i, { allowHalf, allowClear, displayValue, isControlled: false, setInternalValue: setDisplayValue }),\n onMouseEnter: (e) => handleMouseEnter(e, i, allowHalf, setHoverValue, onHoverChange),\n onMouseMove: (e) => handleMouseEnter(e, i, allowHalf, setHoverValue, onHoverChange),\n onMouseLeave: () => handleMouseLeave(setHoverValue, onHoverChange),\n }\n : {};\n\n const stars = Array.from({ length: count }, (_, i) => {\n // Yıldızın dolu oranı (0–1). Etkileşimli modda tam/yarım; salt gösterimde\n // gerçek ondalık oran (4,3 → 5. yıldızın %30'u).\n const fraction = starFraction(currentValue, i, allowHalf, readOnly);\n\n return (\n <span\n key={i}\n // Kök tek bir ARIA \"slider\" (ya da salt gösterimde \"img\"); bu span'lar\n // yalnızca görsel/tıklama hedefi, ekran okuyucudan gizli.\n aria-hidden=\"true\"\n {...starHandlers(i)}\n className={cn(\n \"relative inline-flex select-none items-center justify-center text-mari-input\",\n // Dokunmatikte her yıldız 44px yüksek, komşusuyla boşluksuz bir hedef.\n interactive && \"cursor-pointer pointer-coarse:before:absolute pointer-coarse:before:-inset-x-1 pointer-coarse:before:-inset-y-2.5\",\n disabled && \"cursor-not-allowed\"\n )}\n style={{ fontSize: characterSize }}\n >\n {/* Boş yıldız yer tutar; dolu yıldız üstte, orana göre KIRPILIR. */}\n <span className={cn(\"inline-flex\", tintEmpty && colorClass)} style={tintEmpty ? { color: characterColor } : undefined} aria-hidden>\n {emptyIcon}\n </span>\n {fraction > 0 && (\n <span\n // Kırpma kutusu `block` + içerik SABİT genişlikte: eskiden kutu\n // `inline-flex` idi, içindeki yıldız %50'lik kutuya sığmak için\n // KÜÇÜLÜYORDU (yarım yıldız yerine minik tam yıldız görünüyordu).\n className={cn(\"pointer-events-none absolute inset-y-0 left-0 block overflow-hidden\", colorClass)}\n style={{ width: `${Math.round(fraction * 1000) / 10}%`, color: characterColor }}\n aria-hidden\n >\n <span className=\"flex h-full shrink-0 items-center\" style={{ width: characterSize }}>\n {filledIcon}\n </span>\n </span>\n )}\n </span>\n );\n });\n\n const valueText = `${displayValue.toLocaleString(\"tr-TR\")} / ${count}`;\n\n if (readOnly) {\n return (\n <div role=\"img\" aria-label={`${ariaLabel}: ${valueText}`} className={cn(\"flex gap-1\", className)}>\n {stars}\n </div>\n );\n }\n\n return (\n <div\n ref={rootRef}\n className={cn(\n \"flex gap-1 rounded-sm focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-mari-ring pointer-coarse:gap-2\",\n className\n )}\n tabIndex={disabled ? -1 : 0}\n onFocus={onFocus}\n onBlur={onBlur}\n onKeyDown={handleKeyDown}\n role=\"slider\"\n aria-label={ariaLabel}\n aria-valuemin={0}\n aria-valuemax={count}\n aria-valuenow={displayValue}\n aria-valuetext={valueText}\n aria-disabled={disabled || undefined}\n >\n {stars}\n </div>\n );\n}\n","import React from \"react\";\n\nexport function getIsHalf(\n e: React.MouseEvent<HTMLSpanElement>,\n allowHalf: boolean\n): boolean {\n const { left, width } = e.currentTarget.getBoundingClientRect();\n return allowHalf && e.clientX - left < width / 2;\n}\n\ntype HandleClickOptions = {\n allowHalf: boolean;\n allowClear: boolean;\n displayValue: number;\n isControlled: boolean;\n setInternalValue: (v: number) => void;\n onChange?: (v: number) => void;\n};\n\nexport function handleClick(\n e: React.MouseEvent<HTMLSpanElement>,\n index: number,\n options: HandleClickOptions\n) {\n const {\n allowHalf,\n allowClear,\n displayValue,\n isControlled,\n setInternalValue,\n onChange,\n } = options;\n\n const isHalf = getIsHalf(e, allowHalf);\n let newValue = isHalf ? index + 0.5 : index + 1;\n\n if (allowClear && displayValue === newValue) {\n newValue = 0;\n }\n\n if (!isControlled) {\n setInternalValue(newValue);\n }\n\n onChange?.(newValue);\n}\n\nexport function handleMouseEnter(\n e: React.MouseEvent<HTMLSpanElement>,\n index: number,\n allowHalf: boolean,\n setHoverValue: (v: number) => void,\n onHoverChange?: (v: number) => void\n) {\n const isHalf = getIsHalf(e, allowHalf);\n const val = isHalf ? index + 0.5 : index + 1;\n setHoverValue(val);\n onHoverChange?.(val);\n}\n\nexport function handleMouseLeave(\n setHoverValue: (v: number | undefined) => void,\n onHoverChange?: (v: number) => void\n) {\n setHoverValue(undefined);\n onHoverChange?.(0);\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/rate/Rate.tsx","../src/rate/utils.ts"],"sourcesContent":["\"use client\";\n\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { Star } from \"lucide-react\";\nimport { cn, useControllableState } from \"@mari-ui/core\";\nimport { textClass } from \"../lib/colorClasses\";\nimport { skeletonBoxProps } from \"../lib/skeleton\";\nimport type { RateProps } from \"./types\";\nimport { handleClick, handleMouseEnter, handleMouseLeave } from \"./utils\";\n\nexport type { RateProps };\n\n/*\n * Eskiden `types.ts` tamamen boştu. `value`/\n * `defaultValue` artık `useControllableState` ile yönetiliyor — eskiden\n * `isControlled = value !== undefined` elle hesaplanıp `handleClick`'e\n * ayrıca geçiriliyordu.\n */\n/*\n * Yıldız ikonları. Varsayılan palet (renk verilmedi): dolu = puan sarısı,\n * boş = dolgusuz sarı kontur. Rol/ham renk: dolu = o renk, boş = dolgusuz o\n * renkte kontur (`currentColor`, `tintEmpty` ile boyanır). Özel `character`\n * olduğu gibi kullanılır. Kullanıcı kararı: kontur her zaman dolgunun rengi.\n */\nfunction resolveStarIcons(\n character: RateProps[\"character\"],\n color: RateProps[\"color\"],\n characterColor: string | undefined,\n size: number | string\n): { filledIcon: React.ReactNode; emptyIcon: React.ReactNode; tintEmpty: boolean } {\n if (character !== undefined) {\n const icon = typeof character === \"function\" ? character({}) : character;\n return { filledIcon: icon, emptyIcon: icon, tintEmpty: false };\n }\n if (!color && !characterColor) {\n return {\n filledIcon: <Star size={size} fill=\"var(--mari-color-rating)\" stroke=\"var(--mari-color-rating-stroke)\" strokeWidth={1.5} />,\n emptyIcon: <Star size={size} fill=\"none\" stroke=\"var(--mari-color-rating-stroke)\" strokeWidth={1.5} />,\n tintEmpty: false,\n };\n }\n return {\n filledIcon: <Star size={size} fill=\"currentColor\" stroke=\"currentColor\" />,\n emptyIcon: <Star size={size} fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5} />,\n tintEmpty: true,\n };\n}\n\n/** Bir yıldızın dolu oranı (0–1). */\nfunction starFraction(value: number, index: number, allowHalf: boolean, exact: boolean): number {\n const raw = Math.min(1, Math.max(0, value - index));\n if (exact) return raw;\n if (raw >= 1) return 1;\n return allowHalf && raw >= 0.5 ? 0.5 : 0;\n}\n\nexport function Rate({\n allowClear = true,\n allowHalf = false,\n autoFocus = false,\n character,\n className,\n count = 5,\n defaultValue = 0,\n disabled = false,\n value,\n onBlur,\n onChange,\n onFocus,\n onHoverChange,\n onKeyDown,\n characterSize = \"1.5rem\",\n color,\n characterColor,\n \"aria-label\": ariaLabel = \"Puan\",\n readOnly = false,\n skeleton = false,\n}: Readonly<RateProps>) {\n const [hoverValue, setHoverValue] = useState<number | undefined>(undefined);\n const [displayValue, setDisplayValue] = useControllableState<number>({ value, defaultValue, onChange });\n const rootRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (autoFocus) rootRef.current?.focus();\n }, [autoFocus]);\n\n const colorClass = color ? textClass[color] : \"text-mari-rating\";\n const interactive = !disabled && !readOnly;\n\n if (skeleton) {\n return (\n <div aria-hidden className={cn(\"flex gap-1\", className)}>\n {Array.from({ length: count }, (_, i) => (\n <span key={i} {...skeletonBoxProps(\"rounded-sm\")} style={{ width: characterSize, height: characterSize }} />\n ))}\n </div>\n );\n }\n const step = allowHalf ? 0.5 : 1;\n\n /*\n * Eskiden kök `<div>` odaklanabilirdi (`tabIndex`) ama YALNIZCA fareyle\n * değiştirilebiliyordu — dahili hiçbir tuş işleyicisi yoktu, `onKeyDown`\n * salt tüketiciye ilettiği bir pass-through'du. Klavye kullanıcısı için\n * KULLANILAMAZ durumdaydı (AutoComplete'in Faz 13'te düzeltilen aynı\n * sınıf hatası). Ok Sağ/Yukarı artırır, Ok Sol/Aşağı azaltır, Home/End\n * uçlara atlar.\n */\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(e);\n if (disabled) return;\n if (![\"ArrowRight\", \"ArrowUp\", \"ArrowLeft\", \"ArrowDown\", \"Home\", \"End\"].includes(e.key)) return;\n e.preventDefault();\n // Fare daha önce üzerinde durup ayrılmadıysa `hoverValue` hâlâ set —\n // görsel önizleme `displayValue`nun önüne geçip klavyeyle yapılan\n // değişikliği MASKELİYORDU (aria-value* doğru ama yıldızlar eski\n // hover konumunda donuk kalıyordu). Klavyeyle her değişiklikte temizle.\n setHoverValue(undefined);\n if (e.key === \"ArrowRight\" || e.key === \"ArrowUp\") {\n setDisplayValue(Math.min(count, Math.round((displayValue + step) * 2) / 2));\n } else if (e.key === \"ArrowLeft\" || e.key === \"ArrowDown\") {\n setDisplayValue(Math.max(0, Math.round((displayValue - step) * 2) / 2));\n } else if (e.key === \"Home\") {\n setDisplayValue(0);\n } else if (e.key === \"End\") {\n setDisplayValue(count);\n }\n };\n\n const currentValue = hoverValue ?? displayValue;\n const { filledIcon, emptyIcon, tintEmpty } = resolveStarIcons(character, color, characterColor, characterSize);\n\n // Etkileşimsizken (disabled/readOnly) yıldızlar hiçbir olay dinlemez.\n const starHandlers = (i: number): React.HTMLAttributes<HTMLSpanElement> =>\n interactive\n ? {\n // `onChange` BİLİNÇLİ OLARAK geçirilmiyor: `setDisplayValue` zaten\n // kendi `onChange`'ini tetikliyor — ikisi birden ÇİFT çağırırdı.\n onClick: (e) => handleClick(e, i, { allowHalf, allowClear, displayValue, isControlled: false, setInternalValue: setDisplayValue }),\n onMouseEnter: (e) => handleMouseEnter(e, i, allowHalf, setHoverValue, onHoverChange),\n onMouseMove: (e) => handleMouseEnter(e, i, allowHalf, setHoverValue, onHoverChange),\n onMouseLeave: () => handleMouseLeave(setHoverValue, onHoverChange),\n }\n : {};\n\n const stars = Array.from({ length: count }, (_, i) => {\n // Yıldızın dolu oranı (0–1). Etkileşimli modda tam/yarım; salt gösterimde\n // gerçek ondalık oran (4,3 → 5. yıldızın %30'u).\n const fraction = starFraction(currentValue, i, allowHalf, readOnly);\n\n return (\n <span\n key={i}\n // Kök tek bir ARIA \"slider\" (ya da salt gösterimde \"img\"); bu span'lar\n // yalnızca görsel/tıklama hedefi, ekran okuyucudan gizli.\n aria-hidden=\"true\"\n {...starHandlers(i)}\n className={cn(\n \"relative inline-flex select-none items-center justify-center text-mari-input\",\n // Dokunmatikte her yıldız 44px yüksek, komşusuyla boşluksuz bir hedef.\n interactive && \"cursor-pointer pointer-coarse:before:absolute pointer-coarse:before:-inset-x-1 pointer-coarse:before:-inset-y-2.5\",\n disabled && \"cursor-not-allowed\"\n )}\n style={{ fontSize: characterSize }}\n >\n {/* Boş yıldız yer tutar; dolu yıldız üstte, orana göre KIRPILIR. */}\n <span className={cn(\"inline-flex\", tintEmpty && colorClass)} style={tintEmpty ? { color: characterColor } : undefined} aria-hidden>\n {emptyIcon}\n </span>\n {fraction > 0 && (\n <span\n // Kırpma kutusu `block` + içerik SABİT genişlikte: eskiden kutu\n // `inline-flex` idi, içindeki yıldız %50'lik kutuya sığmak için\n // KÜÇÜLÜYORDU (yarım yıldız yerine minik tam yıldız görünüyordu).\n className={cn(\"pointer-events-none absolute inset-y-0 left-0 block overflow-hidden\", colorClass)}\n style={{ width: `${Math.round(fraction * 1000) / 10}%`, color: characterColor }}\n aria-hidden\n >\n <span className=\"flex h-full shrink-0 items-center\" style={{ width: characterSize }}>\n {filledIcon}\n </span>\n </span>\n )}\n </span>\n );\n });\n\n const valueText = `${displayValue.toLocaleString(\"tr-TR\")} / ${count}`;\n\n if (readOnly) {\n return (\n <div role=\"img\" aria-label={`${ariaLabel}: ${valueText}`} className={cn(\"flex gap-1\", className)}>\n {stars}\n </div>\n );\n }\n\n return (\n <div\n ref={rootRef}\n className={cn(\n \"flex gap-1 rounded-sm focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-mari-ring pointer-coarse:gap-2\",\n className\n )}\n tabIndex={disabled ? -1 : 0}\n onFocus={onFocus}\n onBlur={onBlur}\n onKeyDown={handleKeyDown}\n role=\"slider\"\n aria-label={ariaLabel}\n aria-valuemin={0}\n aria-valuemax={count}\n aria-valuenow={displayValue}\n aria-valuetext={valueText}\n aria-disabled={disabled || undefined}\n >\n {stars}\n </div>\n );\n}\n","import React from \"react\";\n\nexport function getIsHalf(\n e: React.MouseEvent<HTMLSpanElement>,\n allowHalf: boolean\n): boolean {\n const { left, width } = e.currentTarget.getBoundingClientRect();\n return allowHalf && e.clientX - left < width / 2;\n}\n\ntype HandleClickOptions = {\n allowHalf: boolean;\n allowClear: boolean;\n displayValue: number;\n isControlled: boolean;\n setInternalValue: (v: number) => void;\n onChange?: (v: number) => void;\n};\n\nexport function handleClick(\n e: React.MouseEvent<HTMLSpanElement>,\n index: number,\n options: HandleClickOptions\n) {\n const {\n allowHalf,\n allowClear,\n displayValue,\n isControlled,\n setInternalValue,\n onChange,\n } = options;\n\n const isHalf = getIsHalf(e, allowHalf);\n let newValue = isHalf ? index + 0.5 : index + 1;\n\n if (allowClear && displayValue === newValue) {\n newValue = 0;\n }\n\n if (!isControlled) {\n setInternalValue(newValue);\n }\n\n onChange?.(newValue);\n}\n\nexport function handleMouseEnter(\n e: React.MouseEvent<HTMLSpanElement>,\n index: number,\n allowHalf: boolean,\n setHoverValue: (v: number) => void,\n onHoverChange?: (v: number) => void\n) {\n const isHalf = getIsHalf(e, allowHalf);\n const val = isHalf ? index + 0.5 : index + 1;\n setHoverValue(val);\n onHoverChange?.(val);\n}\n\nexport function handleMouseLeave(\n setHoverValue: (v: number | undefined) => void,\n onHoverChange?: (v: number) => void\n) {\n setHoverValue(undefined);\n onHoverChange?.(0);\n}\n"],"mappings":"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","names":[]}
package/dist/segmented.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  Segmented
3
- } from "./chunk-LEOIKO7C.js";
4
- import "./chunk-LBQMEHK6.js";
5
- import "./chunk-FFXRFQSU.js";
6
- import "./chunk-54HHEXXD.js";
3
+ } from "./chunk-RLWP6NJU.js";
4
+ import "./chunk-NPFMPRII.js";
5
+ import "./chunk-POBOJBNJ.js";
6
+ import "./chunk-VKN374SD.js";
7
7
  export {
8
8
  Segmented
9
9
  };
package/dist/select.js CHANGED
@@ -1,17 +1,17 @@
1
1
  import {
2
2
  Select
3
- } from "./chunk-IO4346TF.js";
4
- import "./chunk-ZLPAXPDI.js";
5
- import "./chunk-YZ7MDC6B.js";
3
+ } from "./chunk-FC7T3INX.js";
4
+ import "./chunk-GVJ4M63W.js";
5
+ import "./chunk-LNL4TCGL.js";
6
6
  import "./chunk-KSPM2Z3T.js";
7
- import "./chunk-DUCIAQGR.js";
8
- import "./chunk-LBQMEHK6.js";
9
- import "./chunk-3ABWBQCS.js";
10
- import "./chunk-NS7FKOFI.js";
11
- import "./chunk-TCYDVNSU.js";
12
- import "./chunk-FFXRFQSU.js";
13
- import "./chunk-IP2J3BWY.js";
14
- import "./chunk-54HHEXXD.js";
7
+ import "./chunk-NENNFQEY.js";
8
+ import "./chunk-NPFMPRII.js";
9
+ import "./chunk-GTNCXOUL.js";
10
+ import "./chunk-NYXU5EFE.js";
11
+ import "./chunk-MT4VH7QV.js";
12
+ import "./chunk-POBOJBNJ.js";
13
+ import "./chunk-6AMBZXZJ.js";
14
+ import "./chunk-VKN374SD.js";
15
15
  export {
16
16
  Select
17
17
  };
package/dist/skeleton.js CHANGED
@@ -3,9 +3,9 @@ import {
3
3
  SkeletonBlock,
4
4
  SkeletonButton,
5
5
  SkeletonInput
6
- } from "./chunk-NPM7IDYV.js";
7
- import "./chunk-XUKVQO6M.js";
8
- import "./chunk-54HHEXXD.js";
6
+ } from "./chunk-TSFAAREV.js";
7
+ import "./chunk-6CSUVVFG.js";
8
+ import "./chunk-VKN374SD.js";
9
9
  export {
10
10
  Skeleton,
11
11
  SkeletonBlock,
package/dist/slider.js CHANGED
@@ -2,20 +2,20 @@
2
2
 
3
3
  import {
4
4
  Input
5
- } from "./chunk-P7Z5BREP.js";
6
- import "./chunk-YZ7MDC6B.js";
5
+ } from "./chunk-L6DBWUAB.js";
6
+ import "./chunk-LNL4TCGL.js";
7
7
  import "./chunk-KSPM2Z3T.js";
8
- import "./chunk-DUCIAQGR.js";
9
- import "./chunk-LBQMEHK6.js";
10
- import "./chunk-TCYDVNSU.js";
11
- import "./chunk-FFXRFQSU.js";
8
+ import "./chunk-NENNFQEY.js";
9
+ import "./chunk-NPFMPRII.js";
10
+ import "./chunk-MT4VH7QV.js";
11
+ import "./chunk-POBOJBNJ.js";
12
12
  import {
13
13
  bgSolidClass,
14
14
  textClass
15
- } from "./chunk-IP2J3BWY.js";
15
+ } from "./chunk-6AMBZXZJ.js";
16
16
  import {
17
17
  skeletonBoxProps
18
- } from "./chunk-54HHEXXD.js";
18
+ } from "./chunk-VKN374SD.js";
19
19
 
20
20
  // src/slider/Slider.tsx
21
21
  import React, { useRef, useState } from "react";
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/slider/Slider.tsx","../src/slider/utils.ts"],"sourcesContent":["\"use client\";\n\nimport React, { useRef, useState } from \"react\";\nimport { skeletonBoxProps } from \"../lib/skeleton\";\nimport { cn, useControllableState, type ColorRole, type Size } from \"@mari-ui/core\";\nimport { Input } from \"../input\";\nimport { bgSolidClass, textClass } from \"../lib/colorClasses\";\nimport type { SliderProps, SliderValue } from \"./types\";\nimport { getVerticalLength, nearestThumb, snap, THUMB_SIZE, toPercent, TRACK_HEIGHT, valueFromKey, valueFromPointer } from \"./utils\";\n\nexport type { SliderProps };\n\n/**\n * Faz 13.6 — yapı ant.design Slider'ından, görünüm kendi token'larımızdan.\n *\n * Eski sürüm görünmez tek bir native `<input type=\"range\">`ın üstüne çizilmiş\n * ray/tutamaçtan ibaretti:\n * - `SliderValue` `[number, number]` kabul ettiği halde ARALIK HİÇ\n * ÇALIŞMIYORDU — sadece ilk değer çiziliyordu (koddaki eski not bunu\n * itiraf ediyordu). Üst üste iki tam boyutlu görünmez input'ta tıklamayı\n * yalnız üstteki alacağı için o mimaride düzgün eklenemezdi.\n * - `step` yoktu; dikey mod bütün bileşeni `-rotate-90` ile döndürüyordu.\n *\n * Artık tutamaçlar `role=\"slider\"` (tam ARIA: valuenow/valuetext/min/max/\n * orientation), sürükleme Pointer Events + pointer capture ile, klavye\n * WAI-ARIA Slider desenine göre (oklar, PageUp/Down, Home/End). Aralıkta\n * tutamaçlar birbirini geçmez; raya basınca en yakın tutamaç gelir.\n */\n\n// Tutamaç halkası rengi rol başına — Tailwind tarayıcısı için literal.\nconst thumbBorderClass: Record<ColorRole, string> = {\n primary: \"border-mari-primary-solid\",\n accent: \"border-mari-accent-solid\",\n success: \"border-mari-success-solid\",\n error: \"border-mari-error-solid\",\n warning: \"border-mari-warning-solid\",\n info: \"border-mari-info-solid\",\n neutral: \"border-mari-neutral-solid\",\n};\n\nfunction toArray(value: SliderValue): number[] {\n return typeof value === \"number\" ? [value] : [value[0], value[1]];\n}\n\n/** Ortalanmış işaret; uçtakiler içeri hizalı. */\nfunction markAlign(v: number, min: number, max: number, vertical: boolean): string {\n if (vertical) {\n if (v <= min) return \"translate-y-0\";\n return v >= max ? \"translate-y-full\" : \"translate-y-1/2\";\n }\n if (v <= min) return \"translate-x-0\";\n return v >= max ? \"-translate-x-full\" : \"-translate-x-1/2\";\n}\n\nfunction formatText(format: SliderProps[\"formatValue\"], value: number): string | undefined {\n if (!format) return undefined;\n const out = format(value);\n return typeof out === \"string\" || typeof out === \"number\" ? String(out) : undefined;\n}\n\n/** Bir tutamacın gidebileceği aralık — aralıkta diğer tutamacı geçemez. */\nfunction thumbBounds(vals: number[], index: number, isRange: boolean, min: number, max: number): [number, number] {\n if (!isRange) return [min, max];\n return index === 0 ? [min, vals[1] ?? max] : [vals[0] ?? min, max];\n}\n\n/** Dokunmatikte ray alanı görünmez biçimde 44px'e genişler (tutamaç ve ray aynı kalır). */\nconst TRACK_TOUCH_TARGET_CLASS = {\n horizontal: \"pointer-coarse:before:absolute pointer-coarse:before:inset-x-0 pointer-coarse:before:-inset-y-2.5\",\n vertical: \"pointer-coarse:before:absolute pointer-coarse:before:inset-y-0 pointer-coarse:before:-inset-x-2.5\",\n} as const;\n\n/** Dolu kısmın [başlangıç, bitiş] yüzdesi — tekte 0'dan tutamaca, aralıkta iki tutamaç arası. */\nfunction fillRange(percents: number[], isRange: boolean): [number, number] {\n if (isRange) return [percents[0] ?? 0, percents[1] ?? 0];\n return [0, percents[0] ?? 0];\n}\n\nfunction resolveThumbLabels(thumbLabels: [string, string] | undefined, ariaLabel: string | undefined): [string, string] | undefined {\n if (thumbLabels) return thumbLabels;\n return ariaLabel ? [`${ariaLabel} en az`, `${ariaLabel} en çok`] : undefined;\n}\n\n/** Ray + tek tutamaç yer tutucusu — gerçek ray kutusuyla aynı kalınlıkta. */\nfunction SliderSkeleton({ size, vertical, className }: Readonly<{ size: Size; vertical: boolean; className?: string }>) {\n const thumb = THUMB_SIZE[size];\n const cross = `max(${thumb}, 1.5rem)`;\n return (\n <div aria-hidden className={cn(\"relative flex items-center justify-center\", vertical ? \"\" : \"w-full\", className)} style={vertical ? { width: cross, height: getVerticalLength(size) } : { height: cross }}>\n <span {...skeletonBoxProps(cn(\"rounded-full\", vertical ? \"h-full\" : \"w-full\"))} style={vertical ? { width: TRACK_HEIGHT[size] } : { height: TRACK_HEIGHT[size] }} />\n <span {...skeletonBoxProps(\"absolute rounded-full\")} style={{ width: thumb, height: thumb, ...(vertical ? { bottom: \"40%\" } : { left: \"40%\" }) }} />\n </div>\n );\n}\n\nfunction getBubbleClass(vertical: boolean, visible: boolean): string {\n return cn(\n \"pointer-events-none absolute whitespace-nowrap rounded-md bg-mari-neutral-solid px-2 py-1 text-xs font-medium tabular-nums text-mari-neutral-solid-contrast shadow-mari-sm\",\n \"transition-opacity duration-150 motion-reduce:transition-none\",\n vertical ? \"left-full top-1/2 ml-3 -translate-y-1/2\" : \"bottom-full left-1/2 mb-2 -translate-x-1/2\",\n visible ? \"opacity-100\" : \"opacity-0 group-hover/thumb:opacity-100 group-focus-visible/thumb:opacity-100\"\n );\n}\n\nexport function Slider({\n value,\n defaultValue = 0,\n size = \"md\",\n min = 0,\n max = 100,\n step = 1,\n vertical = false,\n disabled = false,\n color = \"primary\",\n tooltipVisible,\n tooltipAlwaysVisible,\n formatValue,\n marks,\n iconList = [],\n iconPosition = \"bottom\",\n showInput = false,\n onChange,\n onChangeEnd,\n \"aria-label\": ariaLabel,\n thumbLabels,\n className,\n skeleton = false,\n}: Readonly<SliderProps>) {\n const [current, setCurrent] = useControllableState<SliderValue>({ value, defaultValue, onChange });\n const values = toArray(current);\n const isRange = values.length === 2;\n\n const areaRef = useRef<HTMLDivElement>(null);\n const thumbRefs = useRef<(HTMLDivElement | null)[]>([]);\n const latest = useRef(values);\n latest.current = values;\n const keyChanged = useRef(false);\n const [dragging, setDragging] = useState<number | null>(null);\n\n const emit = (vals: number[]): SliderValue => (isRange ? [vals[0] ?? min, vals[1] ?? max] : (vals[0] ?? min));\n\n const boundsOf = (vals: number[], index: number) => thumbBounds(vals, index, isRange, min, max);\n\n /** Tutamacı taşır; aralıkta diğer tutamacı geçemez. Değişmediyse onChange çağrılmaz. */\n const moveThumb = (index: number, raw: number) => {\n const vals = [...latest.current];\n const [lo, hi] = boundsOf(vals, index);\n const next = Math.min(hi, Math.max(lo, snap(raw, min, max, step)));\n if (next === vals[index]) return;\n vals[index] = next;\n latest.current = vals;\n setCurrent(emit(vals));\n };\n\n const readPointer = (event: React.PointerEvent) => {\n const rect = areaRef.current?.getBoundingClientRect();\n return rect ? valueFromPointer(event.clientX, event.clientY, rect, min, max, vertical) : null;\n };\n\n const handlePointerDown = (event: React.PointerEvent<HTMLDivElement>) => {\n if (disabled || event.button !== 0) return;\n const raw = readPointer(event);\n if (raw === null) return;\n const index = isRange ? nearestThumb(latest.current, raw) : 0;\n event.preventDefault(); // metin seçimini ve odağın raya kaçmasını engelle\n areaRef.current?.setPointerCapture?.(event.pointerId);\n setDragging(index);\n moveThumb(index, raw);\n thumbRefs.current[index]?.focus({ preventScroll: true });\n };\n\n const handlePointerMove = (event: React.PointerEvent<HTMLDivElement>) => {\n if (dragging === null) return;\n const raw = readPointer(event);\n if (raw !== null) moveThumb(dragging, raw);\n };\n\n const endDrag = () => {\n if (dragging === null) return;\n setDragging(null);\n onChangeEnd?.(emit(latest.current));\n };\n\n const handleKeyDown = (index: number) => (event: React.KeyboardEvent<HTMLDivElement>) => {\n const vals = latest.current;\n const [lo, hi] = boundsOf(vals, index);\n const next = valueFromKey(event.key, vals[index] ?? min, lo, hi, step, min, max);\n if (next === null) return;\n event.preventDefault();\n keyChanged.current = true;\n moveThumb(index, next);\n };\n\n const handleKeyUp = () => {\n if (!keyChanged.current) return;\n keyChanged.current = false;\n onChangeEnd?.(emit(latest.current));\n };\n\n if (skeleton) return <SliderSkeleton size={size} vertical={vertical} className={className} />;\n\n const percents = values.map((v) => toPercent(v, min, max));\n const [fillStart, fillEnd] = fillRange(percents, isRange);\n const thumbSize = THUMB_SIZE[size];\n const trackHeight = TRACK_HEIGHT[size];\n const length = getVerticalLength(size);\n const labels = resolveThumbLabels(thumbLabels, ariaLabel);\n const showBubble = tooltipVisible !== false;\n\n // Ray kutusu en az 24px kalın — küçük tutamaçta da dokunma hedefi yeterli olsun.\n const crossSize = `max(${thumbSize}, 1.5rem)`;\n\n const renderThumb = (v: number, index: number) => {\n const percent = percents[index] ?? 0;\n const label = isRange ? labels?.[index] : ariaLabel;\n const display = formatValue ? formatValue(v) : v;\n const isActive = dragging === index;\n return (\n <div\n key={index}\n ref={(el) => {\n thumbRefs.current[index] = el;\n }}\n role=\"slider\"\n tabIndex={disabled ? -1 : 0}\n aria-label={label}\n aria-valuemin={boundsOf(values, index)[0]}\n aria-valuemax={boundsOf(values, index)[1]}\n aria-valuenow={v}\n aria-valuetext={formatText(formatValue, v)}\n aria-orientation={vertical ? \"vertical\" : \"horizontal\"}\n aria-disabled={disabled || undefined}\n onKeyDown={disabled ? undefined : handleKeyDown(index)}\n onKeyUp={handleKeyUp}\n className={cn(\n \"group/thumb absolute rounded-full border-2 bg-mari-surface shadow-mari-sm outline-none\",\n \"transition-[scale,box-shadow] duration-150 motion-reduce:transition-none\",\n \"focus-visible:ring-2 focus-visible:ring-mari-ring focus-visible:ring-offset-2 focus-visible:ring-offset-mari-surface\",\n thumbBorderClass[color],\n vertical ? \"left-1/2 -translate-x-1/2 translate-y-1/2\" : \"top-1/2 -translate-x-1/2 -translate-y-1/2\",\n !disabled && \"cursor-grab hover:scale-110\",\n isActive && \"scale-110 cursor-grabbing\",\n // Üst üste binen aralık tutamaçlarında sürüklenen üstte kalsın.\n isActive ? \"z-20\" : \"z-10\"\n )}\n style={{ width: thumbSize, height: thumbSize, ...(vertical ? { bottom: `${percent}%` } : { left: `${percent}%` }) }}\n >\n {showBubble && (\n <span\n aria-hidden\n className={getBubbleClass(vertical, Boolean(tooltipAlwaysVisible) || isActive)}\n >\n {display}\n </span>\n )}\n </div>\n );\n };\n\n const markEntries = marks ? Object.entries(marks).map(([k, node]) => [Number(k), node] as const) : [];\n const inRange = (v: number) => (isRange ? v >= (values[0] ?? min) && v <= (values[1] ?? max) : v <= (values[0] ?? min));\n\n const track = (\n <div\n ref={areaRef}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={endDrag}\n onPointerCancel={endDrag}\n className={cn(\n \"relative touch-none select-none\",\n TRACK_TOUCH_TARGET_CLASS[vertical ? \"vertical\" : \"horizontal\"],\n disabled ? \"cursor-not-allowed opacity-50\" : \"cursor-pointer\"\n )}\n style={vertical ? { width: crossSize, height: length } : { width: \"100%\", height: crossSize }}\n >\n {/* Ray + dolu kısım — salt görsel. */}\n <div\n aria-hidden\n className={cn(\"absolute rounded-full bg-mari-border\", vertical ? \"inset-y-0 left-1/2 -translate-x-1/2\" : \"inset-x-0 top-1/2 -translate-y-1/2\")}\n style={vertical ? { width: trackHeight } : { height: trackHeight }}\n >\n <div\n className={cn(\"absolute rounded-full\", bgSolidClass[color], vertical ? \"inset-x-0\" : \"inset-y-0\")}\n style={vertical ? { bottom: `${fillStart}%`, height: `${fillEnd - fillStart}%` } : { left: `${fillStart}%`, width: `${fillEnd - fillStart}%` }}\n />\n </div>\n {values.map(renderThumb)}\n </div>\n );\n\n const markers = (markEntries.length > 0 || iconList.length > 0) && (\n <div aria-hidden className={cn(\"relative\", vertical ? \"ml-2 h-full w-12\" : \"h-6 w-full\")}>\n {markEntries.map(([v, node]) => (\n <span\n key={`m-${v}`}\n className={cn(\n \"absolute whitespace-nowrap text-xs\",\n // Uçtaki etiketler ortalanırsa rayın dışına taşar (yanındaki\n // sayı girişine biner) — uçlarda içeri doğru hizala.\n vertical ? \"left-0\" : \"top-1\",\n markAlign(v, min, max, vertical),\n inRange(v) ? \"text-mari-foreground\" : \"text-mari-muted\"\n )}\n style={vertical ? { bottom: `${toPercent(v, min, max)}%` } : { left: `${toPercent(v, min, max)}%` }}\n >\n {node}\n </span>\n ))}\n {iconList.map((item, i) => (\n <span\n key={`i-${i}`}\n className={cn(\n \"absolute transition-opacity\",\n vertical ? \"left-0 translate-y-1/2\" : \"top-1 -translate-x-1/2\",\n inRange(item.value) ? cn(\"opacity-100\", textClass[color]) : \"text-mari-muted opacity-50\"\n )}\n style={vertical ? { bottom: `${toPercent(item.value, min, max)}%` } : { left: `${toPercent(item.value, min, max)}%` }}\n >\n {item.icon}\n </span>\n ))}\n </div>\n );\n\n const inputWidth = `calc(${Math.max(String(min).length, String(max).length, String(step).length)}ch + 1.5rem)`;\n const inputs = showInput && (\n <div className=\"flex items-center gap-1.5\">\n {values.map((v, i) => (\n <React.Fragment key={i}>\n {i === 1 && (\n <span aria-hidden className=\"text-mari-muted\">\n –\n </span>\n )}\n <Input\n type=\"number\"\n size=\"sm\"\n // Genişlik en uzun değerin hane sayısından (eskiden sabit w-16 —\n // \"10000\" sığmıyordu). Tarayıcının sayı okları gizli: yer kaplıyor,\n // klavye Ok tuşları yine çalışır.\n style={{ width: inputWidth }}\n classNames={{ input: \"tabular-nums [appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none\" }}\n value={String(v)}\n disabled={disabled}\n min={min}\n max={max}\n aria-label={`${(isRange ? labels?.[i] : ariaLabel) ?? \"Değer\"} (sayısal giriş)`}\n onChange={(e) => {\n const n = Number(e.target.value);\n if (Number.isFinite(n)) moveThumb(i, n);\n }}\n />\n </React.Fragment>\n ))}\n </div>\n );\n\n const markersFirst = iconPosition === \"top\" && !vertical;\n\n return (\n // Yatayda yer yetmezse (mobil + showInput) sayı girişleri alt satıra iner —\n // ray en az 10rem kalır, işaret etiketleri üst üste binmez.\n <div className={cn(\"flex gap-x-3 gap-y-2\", vertical ? \"items-start\" : \"w-full flex-wrap items-center\", className)}>\n {vertical ? (\n <div className=\"flex\" style={{ height: length }}>\n {track}\n {markers}\n </div>\n ) : (\n // Yatay: kapsayıcının tam genişliği (ant.design gibi) — eskiden `size`\n // uzunluğu da sabitliyordu (16rem vb.), formda genişletmek için hile gerekiyordu.\n <div className=\"flex min-w-40 flex-1 flex-col\">\n {markersFirst && markers}\n {track}\n {!markersFirst && markers}\n </div>\n )}\n {inputs}\n </div>\n );\n}\n","import type { Size } from \"@mari-ui/core\";\n\n/**\n * Dikey slider'ın yüksekliği. Yatay slider kapsayıcının tam genişliğini alır\n * (Faz 13.6'ya kadar `size` yatay uzunluğu da 10/16/24rem'e sabitliyordu).\n */\nconst VERTICAL_LENGTH: Record<Size, string> = {\n sm: \"10rem\",\n md: \"14rem\",\n lg: \"16rem\",\n};\n\nexport function getVerticalLength(size: Size): string {\n return VERTICAL_LENGTH[size];\n}\n\n/** ant.design rail/handle oranlarına yakın: sm≈4/12px, md≈6/16px, lg≈8/20px. */\nexport const TRACK_HEIGHT: Record<Size, string> = {\n sm: \"0.25rem\",\n md: \"0.375rem\",\n lg: \"0.5rem\",\n};\n\nexport const THUMB_SIZE: Record<Size, string> = {\n sm: \"0.75rem\",\n md: \"1rem\",\n lg: \"1.25rem\",\n};\n\n/** `step`'in ondalık basamak sayısı — 0.1 + 0.2 gibi kayan nokta artıklarını temizlemek için. */\nfunction decimals(step: number): number {\n const text = String(step);\n const dot = text.indexOf(\".\");\n return dot === -1 ? 0 : text.length - dot - 1;\n}\n\n/** Değeri `[min, max]`e sıkıştırır ve `min`den başlayan `step` ızgarasına oturtur. */\nexport function snap(value: number, min: number, max: number, step: number): number {\n const safeStep = step > 0 ? step : 1;\n const snapped = Math.round((value - min) / safeStep) * safeStep + min;\n const clamped = Math.min(max, Math.max(min, snapped));\n return Number(clamped.toFixed(decimals(safeStep)));\n}\n\nexport function toPercent(value: number, min: number, max: number): number {\n if (max === min) return 0;\n return ((value - min) / (max - min)) * 100;\n}\n\n/** İşaretçi konumundan (ray kutusuna göre) ham değer. Dikeyde aşağıdan yukarı artar. */\nexport function valueFromPointer(clientX: number, clientY: number, rect: DOMRect, min: number, max: number, vertical: boolean): number {\n const ratio = vertical ? (rect.bottom - clientY) / rect.height : (clientX - rect.left) / rect.width;\n const clamped = Math.min(1, Math.max(0, Number.isFinite(ratio) ? ratio : 0));\n return min + clamped * (max - min);\n}\n\n/** Aralıkta işaretçiye en yakın tutamaç; eşit uzaklıkta, işaretçinin yönündeki. */\nexport function nearestThumb(values: number[], target: number): number {\n if (values.length < 2) return 0;\n const [a = 0, b = 0] = values;\n if (a === b) return target > b ? 1 : 0;\n return Math.abs(target - a) <= Math.abs(target - b) ? 0 : 1;\n}\n\n/** Klavye tuşuna göre yeni değer (sınırlar tutamacın kendi aralığı). `null`: ilgisiz tuş. */\nexport function valueFromKey(key: string, current: number, lo: number, hi: number, step: number, fullMin: number, fullMax: number): number | null {\n const big = Math.max(step, (fullMax - fullMin) / 10);\n switch (key) {\n case \"ArrowRight\":\n case \"ArrowUp\":\n return Math.min(hi, current + step);\n case \"ArrowLeft\":\n case \"ArrowDown\":\n return Math.max(lo, current - step);\n case \"PageUp\":\n return Math.min(hi, current + big);\n case \"PageDown\":\n return Math.max(lo, current - big);\n case \"Home\":\n return lo;\n case \"End\":\n return hi;\n default:\n return null;\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/slider/Slider.tsx","../src/slider/utils.ts"],"sourcesContent":["\"use client\";\n\nimport React, { useRef, useState } from \"react\";\nimport { skeletonBoxProps } from \"../lib/skeleton\";\nimport { cn, useControllableState, type ColorRole, type Size } from \"@mari-ui/core\";\nimport { Input } from \"../input\";\nimport { bgSolidClass, textClass } from \"../lib/colorClasses\";\nimport type { SliderProps, SliderValue } from \"./types\";\nimport { getVerticalLength, nearestThumb, snap, THUMB_SIZE, toPercent, TRACK_HEIGHT, valueFromKey, valueFromPointer } from \"./utils\";\n\nexport type { SliderProps };\n\n/**\n * Eski sürüm görünmez tek bir native `<input type=\"range\">`ın üstüne çizilmiş\n * ray/tutamaçtan ibaretti:\n * - `SliderValue` `[number, number]` kabul ettiği halde ARALIK HİÇ\n * ÇALIŞMIYORDU — sadece ilk değer çiziliyordu (koddaki eski not bunu\n * itiraf ediyordu). Üst üste iki tam boyutlu görünmez input'ta tıklamayı\n * yalnız üstteki alacağı için o mimaride düzgün eklenemezdi.\n * - `step` yoktu; dikey mod bütün bileşeni `-rotate-90` ile döndürüyordu.\n *\n * Artık tutamaçlar `role=\"slider\"` (tam ARIA: valuenow/valuetext/min/max/\n * orientation), sürükleme Pointer Events + pointer capture ile, klavye\n * WAI-ARIA Slider desenine göre (oklar, PageUp/Down, Home/End). Aralıkta\n * tutamaçlar birbirini geçmez; raya basınca en yakın tutamaç gelir.\n */\n\n// Tutamaç halkası rengi rol başına — Tailwind tarayıcısı için literal.\nconst thumbBorderClass: Record<ColorRole, string> = {\n primary: \"border-mari-primary-solid\",\n accent: \"border-mari-accent-solid\",\n success: \"border-mari-success-solid\",\n error: \"border-mari-error-solid\",\n warning: \"border-mari-warning-solid\",\n info: \"border-mari-info-solid\",\n neutral: \"border-mari-neutral-solid\",\n};\n\nfunction toArray(value: SliderValue): number[] {\n return typeof value === \"number\" ? [value] : [value[0], value[1]];\n}\n\n/** Ortalanmış işaret; uçtakiler içeri hizalı. */\nfunction markAlign(v: number, min: number, max: number, vertical: boolean): string {\n if (vertical) {\n if (v <= min) return \"translate-y-0\";\n return v >= max ? \"translate-y-full\" : \"translate-y-1/2\";\n }\n if (v <= min) return \"translate-x-0\";\n return v >= max ? \"-translate-x-full\" : \"-translate-x-1/2\";\n}\n\nfunction formatText(format: SliderProps[\"formatValue\"], value: number): string | undefined {\n if (!format) return undefined;\n const out = format(value);\n return typeof out === \"string\" || typeof out === \"number\" ? String(out) : undefined;\n}\n\n/** Bir tutamacın gidebileceği aralık — aralıkta diğer tutamacı geçemez. */\nfunction thumbBounds(vals: number[], index: number, isRange: boolean, min: number, max: number): [number, number] {\n if (!isRange) return [min, max];\n return index === 0 ? [min, vals[1] ?? max] : [vals[0] ?? min, max];\n}\n\n/** Dokunmatikte ray alanı görünmez biçimde 44px'e genişler (tutamaç ve ray aynı kalır). */\nconst TRACK_TOUCH_TARGET_CLASS = {\n horizontal: \"pointer-coarse:before:absolute pointer-coarse:before:inset-x-0 pointer-coarse:before:-inset-y-2.5\",\n vertical: \"pointer-coarse:before:absolute pointer-coarse:before:inset-y-0 pointer-coarse:before:-inset-x-2.5\",\n} as const;\n\n/** Dolu kısmın [başlangıç, bitiş] yüzdesi — tekte 0'dan tutamaca, aralıkta iki tutamaç arası. */\nfunction fillRange(percents: number[], isRange: boolean): [number, number] {\n if (isRange) return [percents[0] ?? 0, percents[1] ?? 0];\n return [0, percents[0] ?? 0];\n}\n\nfunction resolveThumbLabels(thumbLabels: [string, string] | undefined, ariaLabel: string | undefined): [string, string] | undefined {\n if (thumbLabels) return thumbLabels;\n return ariaLabel ? [`${ariaLabel} en az`, `${ariaLabel} en çok`] : undefined;\n}\n\n/** Ray + tek tutamaç yer tutucusu — gerçek ray kutusuyla aynı kalınlıkta. */\nfunction SliderSkeleton({ size, vertical, className }: Readonly<{ size: Size; vertical: boolean; className?: string }>) {\n const thumb = THUMB_SIZE[size];\n const cross = `max(${thumb}, 1.5rem)`;\n return (\n <div aria-hidden className={cn(\"relative flex items-center justify-center\", vertical ? \"\" : \"w-full\", className)} style={vertical ? { width: cross, height: getVerticalLength(size) } : { height: cross }}>\n <span {...skeletonBoxProps(cn(\"rounded-full\", vertical ? \"h-full\" : \"w-full\"))} style={vertical ? { width: TRACK_HEIGHT[size] } : { height: TRACK_HEIGHT[size] }} />\n <span {...skeletonBoxProps(\"absolute rounded-full\")} style={{ width: thumb, height: thumb, ...(vertical ? { bottom: \"40%\" } : { left: \"40%\" }) }} />\n </div>\n );\n}\n\nfunction getBubbleClass(vertical: boolean, visible: boolean): string {\n return cn(\n \"pointer-events-none absolute whitespace-nowrap rounded-md bg-mari-neutral-solid px-2 py-1 text-xs font-medium tabular-nums text-mari-neutral-solid-contrast shadow-mari-sm\",\n \"transition-opacity duration-150 motion-reduce:transition-none\",\n vertical ? \"left-full top-1/2 ml-3 -translate-y-1/2\" : \"bottom-full left-1/2 mb-2 -translate-x-1/2\",\n visible ? \"opacity-100\" : \"opacity-0 group-hover/thumb:opacity-100 group-focus-visible/thumb:opacity-100\"\n );\n}\n\nexport function Slider({\n value,\n defaultValue = 0,\n size = \"md\",\n min = 0,\n max = 100,\n step = 1,\n vertical = false,\n disabled = false,\n color = \"primary\",\n tooltipVisible,\n tooltipAlwaysVisible,\n formatValue,\n marks,\n iconList = [],\n iconPosition = \"bottom\",\n showInput = false,\n onChange,\n onChangeEnd,\n \"aria-label\": ariaLabel,\n thumbLabels,\n className,\n skeleton = false,\n}: Readonly<SliderProps>) {\n const [current, setCurrent] = useControllableState<SliderValue>({ value, defaultValue, onChange });\n const values = toArray(current);\n const isRange = values.length === 2;\n\n const areaRef = useRef<HTMLDivElement>(null);\n const thumbRefs = useRef<(HTMLDivElement | null)[]>([]);\n const latest = useRef(values);\n latest.current = values;\n const keyChanged = useRef(false);\n const [dragging, setDragging] = useState<number | null>(null);\n\n const emit = (vals: number[]): SliderValue => (isRange ? [vals[0] ?? min, vals[1] ?? max] : (vals[0] ?? min));\n\n const boundsOf = (vals: number[], index: number) => thumbBounds(vals, index, isRange, min, max);\n\n /** Tutamacı taşır; aralıkta diğer tutamacı geçemez. Değişmediyse onChange çağrılmaz. */\n const moveThumb = (index: number, raw: number) => {\n const vals = [...latest.current];\n const [lo, hi] = boundsOf(vals, index);\n const next = Math.min(hi, Math.max(lo, snap(raw, min, max, step)));\n if (next === vals[index]) return;\n vals[index] = next;\n latest.current = vals;\n setCurrent(emit(vals));\n };\n\n const readPointer = (event: React.PointerEvent) => {\n const rect = areaRef.current?.getBoundingClientRect();\n return rect ? valueFromPointer(event.clientX, event.clientY, rect, min, max, vertical) : null;\n };\n\n const handlePointerDown = (event: React.PointerEvent<HTMLDivElement>) => {\n if (disabled || event.button !== 0) return;\n const raw = readPointer(event);\n if (raw === null) return;\n const index = isRange ? nearestThumb(latest.current, raw) : 0;\n event.preventDefault(); // metin seçimini ve odağın raya kaçmasını engelle\n areaRef.current?.setPointerCapture?.(event.pointerId);\n setDragging(index);\n moveThumb(index, raw);\n thumbRefs.current[index]?.focus({ preventScroll: true });\n };\n\n const handlePointerMove = (event: React.PointerEvent<HTMLDivElement>) => {\n if (dragging === null) return;\n const raw = readPointer(event);\n if (raw !== null) moveThumb(dragging, raw);\n };\n\n const endDrag = () => {\n if (dragging === null) return;\n setDragging(null);\n onChangeEnd?.(emit(latest.current));\n };\n\n const handleKeyDown = (index: number) => (event: React.KeyboardEvent<HTMLDivElement>) => {\n const vals = latest.current;\n const [lo, hi] = boundsOf(vals, index);\n const next = valueFromKey(event.key, vals[index] ?? min, lo, hi, step, min, max);\n if (next === null) return;\n event.preventDefault();\n keyChanged.current = true;\n moveThumb(index, next);\n };\n\n const handleKeyUp = () => {\n if (!keyChanged.current) return;\n keyChanged.current = false;\n onChangeEnd?.(emit(latest.current));\n };\n\n if (skeleton) return <SliderSkeleton size={size} vertical={vertical} className={className} />;\n\n const percents = values.map((v) => toPercent(v, min, max));\n const [fillStart, fillEnd] = fillRange(percents, isRange);\n const thumbSize = THUMB_SIZE[size];\n const trackHeight = TRACK_HEIGHT[size];\n const length = getVerticalLength(size);\n const labels = resolveThumbLabels(thumbLabels, ariaLabel);\n const showBubble = tooltipVisible !== false;\n\n // Ray kutusu en az 24px kalın — küçük tutamaçta da dokunma hedefi yeterli olsun.\n const crossSize = `max(${thumbSize}, 1.5rem)`;\n\n const renderThumb = (v: number, index: number) => {\n const percent = percents[index] ?? 0;\n const label = isRange ? labels?.[index] : ariaLabel;\n const display = formatValue ? formatValue(v) : v;\n const isActive = dragging === index;\n return (\n <div\n key={index}\n ref={(el) => {\n thumbRefs.current[index] = el;\n }}\n role=\"slider\"\n tabIndex={disabled ? -1 : 0}\n aria-label={label}\n aria-valuemin={boundsOf(values, index)[0]}\n aria-valuemax={boundsOf(values, index)[1]}\n aria-valuenow={v}\n aria-valuetext={formatText(formatValue, v)}\n aria-orientation={vertical ? \"vertical\" : \"horizontal\"}\n aria-disabled={disabled || undefined}\n onKeyDown={disabled ? undefined : handleKeyDown(index)}\n onKeyUp={handleKeyUp}\n className={cn(\n \"group/thumb absolute rounded-full border-2 bg-mari-surface shadow-mari-sm outline-none\",\n \"transition-[scale,box-shadow] duration-150 motion-reduce:transition-none\",\n \"focus-visible:ring-2 focus-visible:ring-mari-ring focus-visible:ring-offset-2 focus-visible:ring-offset-mari-surface\",\n thumbBorderClass[color],\n vertical ? \"left-1/2 -translate-x-1/2 translate-y-1/2\" : \"top-1/2 -translate-x-1/2 -translate-y-1/2\",\n !disabled && \"cursor-grab hover:scale-110\",\n isActive && \"scale-110 cursor-grabbing\",\n // Üst üste binen aralık tutamaçlarında sürüklenen üstte kalsın.\n isActive ? \"z-20\" : \"z-10\"\n )}\n style={{ width: thumbSize, height: thumbSize, ...(vertical ? { bottom: `${percent}%` } : { left: `${percent}%` }) }}\n >\n {showBubble && (\n <span\n aria-hidden\n className={getBubbleClass(vertical, Boolean(tooltipAlwaysVisible) || isActive)}\n >\n {display}\n </span>\n )}\n </div>\n );\n };\n\n const markEntries = marks ? Object.entries(marks).map(([k, node]) => [Number(k), node] as const) : [];\n const inRange = (v: number) => (isRange ? v >= (values[0] ?? min) && v <= (values[1] ?? max) : v <= (values[0] ?? min));\n\n const track = (\n <div\n ref={areaRef}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={endDrag}\n onPointerCancel={endDrag}\n className={cn(\n \"relative touch-none select-none\",\n TRACK_TOUCH_TARGET_CLASS[vertical ? \"vertical\" : \"horizontal\"],\n disabled ? \"cursor-not-allowed opacity-50\" : \"cursor-pointer\"\n )}\n style={vertical ? { width: crossSize, height: length } : { width: \"100%\", height: crossSize }}\n >\n {/* Ray + dolu kısım — salt görsel. */}\n <div\n aria-hidden\n className={cn(\"absolute rounded-full bg-mari-border\", vertical ? \"inset-y-0 left-1/2 -translate-x-1/2\" : \"inset-x-0 top-1/2 -translate-y-1/2\")}\n style={vertical ? { width: trackHeight } : { height: trackHeight }}\n >\n <div\n className={cn(\"absolute rounded-full\", bgSolidClass[color], vertical ? \"inset-x-0\" : \"inset-y-0\")}\n style={vertical ? { bottom: `${fillStart}%`, height: `${fillEnd - fillStart}%` } : { left: `${fillStart}%`, width: `${fillEnd - fillStart}%` }}\n />\n </div>\n {values.map(renderThumb)}\n </div>\n );\n\n const markers = (markEntries.length > 0 || iconList.length > 0) && (\n <div aria-hidden className={cn(\"relative\", vertical ? \"ml-2 h-full w-12\" : \"h-6 w-full\")}>\n {markEntries.map(([v, node]) => (\n <span\n key={`m-${v}`}\n className={cn(\n \"absolute whitespace-nowrap text-xs\",\n // Uçtaki etiketler ortalanırsa rayın dışına taşar (yanındaki\n // sayı girişine biner) — uçlarda içeri doğru hizala.\n vertical ? \"left-0\" : \"top-1\",\n markAlign(v, min, max, vertical),\n inRange(v) ? \"text-mari-foreground\" : \"text-mari-muted\"\n )}\n style={vertical ? { bottom: `${toPercent(v, min, max)}%` } : { left: `${toPercent(v, min, max)}%` }}\n >\n {node}\n </span>\n ))}\n {iconList.map((item, i) => (\n <span\n key={`i-${i}`}\n className={cn(\n \"absolute transition-opacity\",\n vertical ? \"left-0 translate-y-1/2\" : \"top-1 -translate-x-1/2\",\n inRange(item.value) ? cn(\"opacity-100\", textClass[color]) : \"text-mari-muted opacity-50\"\n )}\n style={vertical ? { bottom: `${toPercent(item.value, min, max)}%` } : { left: `${toPercent(item.value, min, max)}%` }}\n >\n {item.icon}\n </span>\n ))}\n </div>\n );\n\n const inputWidth = `calc(${Math.max(String(min).length, String(max).length, String(step).length)}ch + 1.5rem)`;\n const inputs = showInput && (\n <div className=\"flex items-center gap-1.5\">\n {values.map((v, i) => (\n <React.Fragment key={i}>\n {i === 1 && (\n <span aria-hidden className=\"text-mari-muted\">\n –\n </span>\n )}\n <Input\n type=\"number\"\n size=\"sm\"\n // Genişlik en uzun değerin hane sayısından (eskiden sabit w-16 —\n // \"10000\" sığmıyordu). Tarayıcının sayı okları gizli: yer kaplıyor,\n // klavye Ok tuşları yine çalışır.\n style={{ width: inputWidth }}\n classNames={{ input: \"tabular-nums [appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none\" }}\n value={String(v)}\n disabled={disabled}\n min={min}\n max={max}\n aria-label={`${(isRange ? labels?.[i] : ariaLabel) ?? \"Değer\"} (sayısal giriş)`}\n onChange={(e) => {\n const n = Number(e.target.value);\n if (Number.isFinite(n)) moveThumb(i, n);\n }}\n />\n </React.Fragment>\n ))}\n </div>\n );\n\n const markersFirst = iconPosition === \"top\" && !vertical;\n\n return (\n // Yatayda yer yetmezse (mobil + showInput) sayı girişleri alt satıra iner —\n // ray en az 10rem kalır, işaret etiketleri üst üste binmez.\n <div className={cn(\"flex gap-x-3 gap-y-2\", vertical ? \"items-start\" : \"w-full flex-wrap items-center\", className)}>\n {vertical ? (\n <div className=\"flex\" style={{ height: length }}>\n {track}\n {markers}\n </div>\n ) : (\n // Yatay: kapsayıcının tam genişliği (ant.design gibi) — eskiden `size`\n // uzunluğu da sabitliyordu (16rem vb.), formda genişletmek için hile gerekiyordu.\n <div className=\"flex min-w-40 flex-1 flex-col\">\n {markersFirst && markers}\n {track}\n {!markersFirst && markers}\n </div>\n )}\n {inputs}\n </div>\n );\n}\n","import type { Size } from \"@mari-ui/core\";\n\n/** Dikey slider'ın yüksekliği. Yatay slider kapsayıcının tam genişliğini alır. */\nconst VERTICAL_LENGTH: Record<Size, string> = {\n sm: \"10rem\",\n md: \"14rem\",\n lg: \"16rem\",\n};\n\nexport function getVerticalLength(size: Size): string {\n return VERTICAL_LENGTH[size];\n}\n\n/*\n * ant.design rail/handle oranlarına yakın: sm≈4/12px, md≈6/16px, lg≈8/20px.\n */\nexport const TRACK_HEIGHT: Record<Size, string> = {\n sm: \"0.25rem\",\n md: \"0.375rem\",\n lg: \"0.5rem\",\n};\n\nexport const THUMB_SIZE: Record<Size, string> = {\n sm: \"0.75rem\",\n md: \"1rem\",\n lg: \"1.25rem\",\n};\n\n/** `step`'in ondalık basamak sayısı — 0.1 + 0.2 gibi kayan nokta artıklarını temizlemek için. */\nfunction decimals(step: number): number {\n const text = String(step);\n const dot = text.indexOf(\".\");\n return dot === -1 ? 0 : text.length - dot - 1;\n}\n\n/** Değeri `[min, max]`e sıkıştırır ve `min`den başlayan `step` ızgarasına oturtur. */\nexport function snap(value: number, min: number, max: number, step: number): number {\n const safeStep = step > 0 ? step : 1;\n const snapped = Math.round((value - min) / safeStep) * safeStep + min;\n const clamped = Math.min(max, Math.max(min, snapped));\n return Number(clamped.toFixed(decimals(safeStep)));\n}\n\nexport function toPercent(value: number, min: number, max: number): number {\n if (max === min) return 0;\n return ((value - min) / (max - min)) * 100;\n}\n\n/** İşaretçi konumundan (ray kutusuna göre) ham değer. Dikeyde aşağıdan yukarı artar. */\nexport function valueFromPointer(clientX: number, clientY: number, rect: DOMRect, min: number, max: number, vertical: boolean): number {\n const ratio = vertical ? (rect.bottom - clientY) / rect.height : (clientX - rect.left) / rect.width;\n const clamped = Math.min(1, Math.max(0, Number.isFinite(ratio) ? ratio : 0));\n return min + clamped * (max - min);\n}\n\n/** Aralıkta işaretçiye en yakın tutamaç; eşit uzaklıkta, işaretçinin yönündeki. */\nexport function nearestThumb(values: number[], target: number): number {\n if (values.length < 2) return 0;\n const [a = 0, b = 0] = values;\n if (a === b) return target > b ? 1 : 0;\n return Math.abs(target - a) <= Math.abs(target - b) ? 0 : 1;\n}\n\n/** Klavye tuşuna göre yeni değer (sınırlar tutamacın kendi aralığı). `null`: ilgisiz tuş. */\nexport function valueFromKey(key: string, current: number, lo: number, hi: number, step: number, fullMin: number, fullMax: number): number | null {\n const big = Math.max(step, (fullMax - fullMin) / 10);\n switch (key) {\n case \"ArrowRight\":\n case \"ArrowUp\":\n return Math.min(hi, current + step);\n case \"ArrowLeft\":\n case \"ArrowDown\":\n return Math.max(lo, current - step);\n case \"PageUp\":\n return Math.min(hi, current + big);\n case \"PageDown\":\n return Math.max(lo, current - big);\n case \"Home\":\n return lo;\n case \"End\":\n return hi;\n default:\n return null;\n }\n}\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/splitter/Splitter.tsx","../src/splitter/utils.ts"],"sourcesContent":["\"use client\";\n\nimport React, { Children, isValidElement, useCallback, useEffect, useId, useLayoutEffect, useRef, useState } from \"react\";\nimport { ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon } from \"lucide-react\";\nimport { cn } from \"@mari-ui/core\";\nimport type { SplitterPanelProps, SplitterProps } from \"./types\";\nimport { initialSizes, limitsOf, moveHandle, parseStored, setPanelSize, type PanelLimits } from \"./utils\";\n\nexport type { SplitterProps, SplitterPanelProps };\n\nconst useIsomorphicLayoutEffect = typeof window === \"undefined\" ? useEffect : useLayoutEffect;\n\n/** Klavye adımı (px); Shift ile 4 katı. */\nconst KEY_STEP = 16;\n/** Daraltılmış sayılma eşiği (oran). */\nconst COLLAPSED = 0.001;\n\n// Tailwind derleme tarayıcısı için literal sınıflar.\nconst STACK_DIRECTION = { sm: \"flex-col sm:flex-row\", md: \"flex-col md:flex-row\", lg: \"flex-col lg:flex-row\", none: \"flex-row\" } as const;\nconst STACK_PANEL_FLEX = { sm: \"sm:[flex:var(--mari-split)]\", md: \"md:[flex:var(--mari-split)]\", lg: \"lg:[flex:var(--mari-split)]\", none: \"[flex:var(--mari-split)]\" } as const;\nconst STACK_HANDLE = { sm: \"hidden sm:flex\", md: \"hidden md:flex\", lg: \"hidden lg:flex\", none: \"flex\" } as const;\n\n/**\n * Panel — `Splitter`ın çocuğu. Kendisi bir şey çizmez; Splitter props'larını\n * okuyup paneli kendi kapsayıcısıyla çizer (boyut Splitter'ın durumunda).\n */\nexport function SplitterPanel(props: Readonly<SplitterPanelProps>) {\n return <>{props.children}</>;\n}\n\n/**\n * Bölünmüş görünüm (ant.design Splitter yapısı): paneller arasındaki\n * tutamaç sürüklenerek ya da klavyeyle boyut değiştirir. Liste + detay,\n * düzenleyici + önizleme gibi iş ekranları için.\n *\n * - Tutamaç APG \"window splitter\": `role=\"separator\"`, odaklanır; ←/→ (dikeyde\n * ↑/↓) 16px, Shift ile 64px; Home/End min/max; Enter daraltılabilir paneli\n * kapatır/açar. Değer: önceki panelin yüzdesi.\n * - Yalnız iki komşu panel değişir; min/max her zaman korunur.\n * - Mobil: `stackBelow` altında paneller alt alta, tutamaçlar gizli (saf CSS).\n * - `storageKey`: kullanıcının ayarladığı düzen hatırlanır.\n */\nexport function Splitter({ orientation = \"horizontal\", stackBelow = \"md\", storageKey, onResize, onResizeEnd, children, className, style }: Readonly<SplitterProps>) {\n const panels = Children.toArray(children).filter((c): c is React.ReactElement<SplitterPanelProps> => isValidElement(c));\n const count = panels.length;\n const horizontal = orientation === \"horizontal\";\n const stack = horizontal ? stackBelow : \"none\";\n const baseId = useId();\n const rootRef = useRef<HTMLDivElement>(null);\n // `null`: henüz ölçülmedi — ilk çıktı varsayılan boyutlara göre CSS ile (SSR).\n const [sizes, setSizes] = useState<number[] | null>(null);\n const sizesRef = useRef<number[] | null>(null);\n sizesRef.current = sizes;\n /** Daraltmadan önceki oranlar (açınca geri dönülür). */\n const restore = useRef<Record<number, number>>({});\n const [dragging, setDragging] = useState<number | null>(null);\n\n /** Tutamaçlar hariç kullanılabilir alan (px). */\n const available = useCallback(() => {\n const root = rootRef.current;\n if (!root) return 0;\n const total = horizontal ? root.clientWidth : root.clientHeight;\n const handles = Array.from(root.children).filter((c) => (c as HTMLElement).dataset.splitterHandle !== undefined);\n const handleSize = handles.reduce((sum, h) => sum + (horizontal ? (h as HTMLElement).offsetWidth : (h as HTMLElement).offsetHeight), 0);\n return Math.max(0, total - handleSize);\n }, [horizontal]);\n\n const limits = useCallback((): PanelLimits[] => panels.map((p) => limitsOf(p.props.min, p.props.max, available())), [panels, available]);\n\n // İlk ölçüm (boyamadan önce): kayıtlı düzen ya da varsayılan boyutlar → oran.\n useIsomorphicLayoutEffect(() => {\n const stored = storageKey && typeof localStorage !== \"undefined\" ? parseStored(safeRead(storageKey), count) : null;\n setSizes(stored ?? initialSizes(panels.map((p) => p.props.defaultSize), available()));\n }, [count, storageKey]);\n\n const commit = useCallback(\n (next: number[]) => {\n if (storageKey) safeWrite(storageKey, JSON.stringify(next));\n onResizeEnd?.(next);\n },\n [storageKey, onResizeEnd]\n );\n\n const update = (next: number[]) => {\n setSizes(next);\n onResize?.(next);\n };\n\n /** Tutamaç `index`in daraltacağı panel: önce soldaki/üstteki, o değilse sağdaki/alttaki. */\n const collapseTarget = (index: number): number | null => {\n if (panels[index]?.props.collapsible) return index;\n if (panels[index + 1]?.props.collapsible) return index + 1;\n return null;\n };\n\n const toggleCollapse = (index: number) => {\n const current = sizesRef.current;\n const target = collapseTarget(index);\n if (!current || target === null) return;\n const neighbor = target === index ? index + 1 : index;\n let next: number[];\n if (current[target]! <= COLLAPSED) {\n next = setPanelSize(current, target, neighbor, restore.current[target] ?? 1 / count);\n } else {\n restore.current[target] = current[target]!;\n next = setPanelSize(current, target, neighbor, 0);\n }\n update(next);\n commit(next);\n };\n\n /** Daraltılabilir panel sürüklemede min'in altına inebilir (0'a kapanır). */\n const dragLimits = (index: number) => {\n const all = limits();\n const target = collapseTarget(index);\n if (target !== null) all[target] = { ...all[target]!, min: 0 };\n return all;\n };\n\n const onPointerDown = (index: number) => (e: React.PointerEvent<HTMLDivElement>) => {\n if (e.button !== 0 || !sizesRef.current) return;\n e.preventDefault();\n const handle = e.currentTarget;\n handle.setPointerCapture(e.pointerId);\n const start = horizontal ? e.clientX : e.clientY;\n const startSizes = sizesRef.current;\n const avail = available();\n const lim = dragLimits(index);\n setDragging(index);\n let last = startSizes;\n const move = (ev: PointerEvent) => {\n const delta = ((horizontal ? ev.clientX : ev.clientY) - start) / (avail || 1);\n last = moveHandle(startSizes, index, delta, lim);\n update(last);\n };\n const up = () => {\n handle.removeEventListener(\"pointermove\", move);\n handle.removeEventListener(\"pointerup\", up);\n handle.removeEventListener(\"pointercancel\", up);\n setDragging(null);\n commit(last);\n };\n handle.addEventListener(\"pointermove\", move);\n handle.addEventListener(\"pointerup\", up);\n handle.addEventListener(\"pointercancel\", up);\n };\n\n const onKeyDown = (index: number) => (e: React.KeyboardEvent<HTMLDivElement>) => {\n const current = sizesRef.current;\n if (!current) return;\n const avail = available() || 1;\n const step = (KEY_STEP * (e.shiftKey ? 4 : 1)) / avail;\n const back = horizontal ? \"ArrowLeft\" : \"ArrowUp\";\n const forward = horizontal ? \"ArrowRight\" : \"ArrowDown\";\n const lim = limits();\n let next: number[] | null = null;\n if (e.key === back) next = moveHandle(current, index, -step, lim);\n else if (e.key === forward) next = moveHandle(current, index, step, lim);\n else if (e.key === \"Home\") next = moveHandle(current, index, -1, lim);\n else if (e.key === \"End\") next = moveHandle(current, index, 1, lim);\n else if (e.key === \"Enter\" && collapseTarget(index) !== null) {\n e.preventDefault();\n toggleCollapse(index);\n return;\n }\n if (!next) return;\n e.preventDefault();\n update(next);\n commit(next);\n };\n\n return (\n <div\n ref={rootRef}\n data-orientation={orientation}\n className={cn(\"flex min-h-0 min-w-0\", horizontal ? STACK_DIRECTION[stack] : \"flex-col\", dragging !== null && \"select-none\", className)}\n style={style}\n >\n {panels.map((panel, i) => {\n const size = sizes?.[i];\n const collapsed = size !== undefined && size <= COLLAPSED;\n const next = panels[i + 1];\n const target = collapseTarget(i);\n const lim = sizes ? limits()[i] : undefined;\n return (\n <React.Fragment key={panel.key ?? i}>\n <div\n id={`${baseId}-panel-${i}`}\n data-splitter-panel=\"\"\n inert={collapsed || undefined}\n className={cn(\"min-h-0 min-w-0 overflow-auto\", STACK_PANEL_FLEX[stack], collapsed && \"overflow-hidden\", panel.props.className)}\n style={{ ...panel.props.style, [\"--mari-split\" as string]: panelFlex(size, panel.props.defaultSize) }}\n >\n {panel.props.children}\n </div>\n {next && (\n <SplitterHandle\n horizontal={horizontal}\n stack={stack}\n label={panelLabel(panel, i)}\n controls={`${baseId}-panel-${i}`}\n percent={size !== undefined ? Math.round(size * 100) : undefined}\n limits={lim}\n resizable={panel.props.resizable !== false && next.props.resizable !== false}\n active={dragging === i}\n onPointerDown={onPointerDown(i)}\n onKeyDown={onKeyDown(i)}\n collapse={\n target === null\n ? undefined\n : {\n label: panelLabel(panels[target]!, target),\n collapsed: (sizes?.[target] ?? 1) <= COLLAPSED,\n isStart: target === i,\n onToggle: () => toggleCollapse(i),\n }\n }\n />\n )}\n </React.Fragment>\n );\n })}\n </div>\n );\n}\n\n/** Ölçümden önce (SSR / ilk kare): px varsayılan sabit, yüzde sabit, verilmeyen esner; sonra oran. */\nfunction panelFlex(size: number | undefined, defaultSize: SplitterPanelProps[\"defaultSize\"]): string {\n if (size !== undefined) return `${size} 1 0px`;\n if (typeof defaultSize === \"number\") return `0 0 ${defaultSize}px`;\n if (defaultSize) return `0 0 ${defaultSize}`;\n return \"1 1 0px\";\n}\n\nconst panelLabel = (panel: React.ReactElement<SplitterPanelProps>, index: number) => panel.props.label ?? `Panel ${index + 1}`;\n\ninterface SplitterHandleProps {\n horizontal: boolean;\n stack: keyof typeof STACK_HANDLE;\n label: string;\n controls: string;\n percent?: number;\n limits?: PanelLimits;\n resizable: boolean;\n active: boolean;\n onPointerDown: React.PointerEventHandler<HTMLDivElement>;\n onKeyDown: React.KeyboardEventHandler<HTMLDivElement>;\n collapse?: { label: string; collapsed: boolean; isStart: boolean; onToggle: () => void };\n}\n\n/**\n * Tutamaç — APG \"window splitter\": odaklanabilir `separator` bir ARIA widget'ıdır\n * (değer taşır, klavyeyle değişir); lint eklentisi bunu etkileşimsiz sanıyor.\n */\nfunction SplitterHandle({ horizontal, stack, label, controls, percent, limits: lim, resizable, active, onPointerDown, onKeyDown, collapse }: Readonly<SplitterHandleProps>) {\n return (\n // Sarmalayıcı: 1px'lik yer + ortak hover grubu. Daraltma düğmesi tutamacın İÇİNDE değil kardeşi\n // (separator içinde düğme = iç içe etkileşimli öğe, axe nested-interactive).\n <div data-splitter-handle=\"\" className={cn(\"group/handle relative z-10 shrink-0 items-center justify-center\", STACK_HANDLE[stack], horizontal ? \"w-px flex-col\" : \"h-px flex-row\")}>\n {/* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- odaklanabilir separator = ARIA widget (window splitter) */}\n <div\n role=\"separator\"\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- APG window splitter: tutamaç klavyeyle odaklanır\n tabIndex={resizable ? 0 : undefined}\n aria-orientation={horizontal ? \"vertical\" : \"horizontal\"}\n aria-label={`${label} panelini yeniden boyutlandır`}\n aria-controls={controls}\n aria-valuenow={percent}\n aria-valuemin={lim ? Math.round(lim.min * 100) : undefined}\n aria-valuemax={lim ? Math.round(lim.max * 100) : undefined}\n aria-disabled={resizable ? undefined : true}\n onPointerDown={resizable ? onPointerDown : undefined}\n onKeyDown={resizable ? onKeyDown : undefined}\n className={cn(\n // Görünen çizgi 1px; tıklama alanı ::before ile her yana 4px (dokunmatikte 10px).\n \"peer/separator absolute inset-0 bg-mari-border outline-none\",\n \"before:absolute before:content-['']\",\n horizontal ? \"before:inset-y-0 before:-inset-x-1 pointer-coarse:before:-inset-x-2.5\" : \"before:inset-x-0 before:-inset-y-1 pointer-coarse:before:-inset-y-2.5\",\n // Odak halkası çizginin etrafında (1px çizgiye outline görünmez kalır).\n \"focus-visible:ring-2 focus-visible:ring-mari-ring\",\n resizable && (horizontal ? \"cursor-col-resize\" : \"cursor-row-resize\"),\n resizable && \"transition-colors group-hover/handle:bg-mari-primary-solid focus-visible:bg-mari-primary-solid motion-reduce:transition-none\",\n active && \"bg-mari-primary-solid\"\n )}\n />\n {collapse && resizable && (\n <CollapseButton\n horizontal={horizontal}\n // Ok, daraltılacak panele doğru; kapalıyken ters (açılacak yöne).\n towardStart={collapse.isStart !== collapse.collapsed}\n collapsed={collapse.collapsed}\n label={collapse.label}\n onClick={collapse.onToggle}\n />\n )}\n </div>\n );\n}\n\nfunction CollapseButton({ horizontal, towardStart, collapsed, label, onClick }: Readonly<{ horizontal: boolean; towardStart: boolean; collapsed: boolean; label: string; onClick: () => void }>) {\n let Icon = towardStart ? ChevronUpIcon : ChevronDownIcon;\n if (horizontal) Icon = towardStart ? ChevronLeftIcon : ChevronRightIcon;\n return (\n <button\n type=\"button\"\n // Tutamacın sürüklemesini başlatmasın.\n onPointerDown={(e) => e.stopPropagation()}\n onClick={onClick}\n tabIndex={-1}\n aria-label={collapsed ? `${label} panelini aç` : `${label} panelini kapat`}\n className={cn(\n \"absolute z-10 grid size-5 cursor-pointer place-items-center rounded-full border border-mari-border bg-mari-surface text-mari-muted shadow-mari-sm\",\n \"opacity-0 transition-opacity group-hover/handle:opacity-100 peer-focus-visible/separator:opacity-100 hover:text-mari-foreground motion-reduce:transition-none\",\n collapsed && \"opacity-100\"\n )}\n >\n <Icon aria-hidden className=\"size-3.5\" />\n </button>\n );\n}\n\nfunction safeRead(key: string): string | null {\n try {\n return localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nfunction safeWrite(key: string, value: string) {\n try {\n localStorage.setItem(key, value);\n } catch {\n // Gizli pencere / dolu depo: düzen yalnız bu oturumda kalır.\n }\n}\n","import type { SplitterSize } from \"./types\";\n\n/**\n * Splitter'ın saf boyut hesabı (DOM'suz, ayrıca test edilir). Boyutlar\n * panellerin kullanılabilir alana ORANI (toplam 1) olarak tutulur — kapsayıcı\n * büyüyüp küçülünce paneller orantılı kalır. Piksel min/max her hesapta o anki\n * kullanılabilir alana göre orana çevrilir.\n */\n\n/** `280` → 280 / available, `\"30%\"` → 0.3. */\nexport function toFraction(size: SplitterSize | undefined, available: number): number | undefined {\n if (size === undefined) return undefined;\n if (typeof size === \"number\") return available > 0 ? size / available : 0;\n return Number.parseFloat(size) / 100;\n}\n\nexport interface PanelLimits {\n min: number;\n max: number;\n}\n\nexport function limitsOf(min: SplitterSize | undefined, max: SplitterSize | undefined, available: number): PanelLimits {\n return { min: toFraction(min, available) ?? 0, max: Math.min(1, toFraction(max, available) ?? 1) };\n}\n\n/**\n * İlk oranlar: verilen boyutlar alınır, verilmeyenler kalanı eşit paylaşır,\n * sonra toplam 1'e ölçeklenir (fazla verilmişse orantılı küçülür).\n */\nexport function initialSizes(defaults: Array<SplitterSize | undefined>, available: number): number[] {\n const given = defaults.map((d) => toFraction(d, available));\n const used = given.reduce<number>((sum, f) => sum + (f ?? 0), 0);\n const free = given.filter((f) => f === undefined).length;\n const share = free > 0 ? Math.max(0, 1 - used) / free : 0;\n const raw = given.map((f) => f ?? share);\n const total = raw.reduce((a, b) => a + b, 0) || 1;\n return raw.map((f) => f / total);\n}\n\nconst clamp = (v: number, lo: number, hi: number) => Math.min(hi, Math.max(lo, v));\n\n/**\n * Tutamaç `index` (panel `index` ile `index + 1` arasında) `delta` oranı kadar\n * kaydırılır. Yalnız iki komşu panel değişir; ikisinin toplamı korunur, her\n * biri kendi min/max'ında kalır.\n */\nexport function moveHandle(sizes: number[], index: number, delta: number, limits: PanelLimits[]): number[] {\n const a = sizes[index]!;\n const b = sizes[index + 1]!;\n const pair = a + b;\n const la = limits[index]!;\n const lb = limits[index + 1]!;\n // a'nın gidebileceği aralık: kendi sınırları ve b'nin sınırlarının izin verdiği.\n const lo = Math.max(la.min, pair - lb.max);\n const hi = Math.min(la.max, pair - lb.min);\n const nextA = clamp(a + delta, lo, Math.max(lo, hi));\n const next = sizes.slice();\n next[index] = nextA;\n next[index + 1] = pair - nextA;\n return next;\n}\n\n/**\n * Daraltma: `panel` 0'a iner, alanı tutamacın öbür yanındaki komşuya geçer.\n * Açarken `restore` (daraltmadan önceki oran) komşudan geri alınır.\n */\nexport function setPanelSize(sizes: number[], panel: number, neighbor: number, value: number): number[] {\n const next = sizes.slice();\n const pair = sizes[panel]! + sizes[neighbor]!;\n next[panel] = clamp(value, 0, pair);\n next[neighbor] = pair - next[panel]!;\n return next;\n}\n\n/** Kayıtlı oranlar panel sayısıyla uyuşuyor ve geçerliyse döner. */\nexport function parseStored(raw: string | null, count: number): number[] | null {\n if (!raw) return null;\n try {\n const value: unknown = JSON.parse(raw);\n if (!Array.isArray(value) || value.length !== count || !value.every((v) => typeof v === \"number\" && v >= 0)) return null;\n const total = value.reduce((a: number, b: number) => a + b, 0);\n return total > 0 ? value.map((v: number) => v / total) : null;\n } catch {\n return null;\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/splitter/Splitter.tsx","../src/splitter/utils.ts"],"sourcesContent":["\"use client\";\n\nimport React, { Children, isValidElement, useCallback, useEffect, useId, useLayoutEffect, useRef, useState } from \"react\";\nimport { ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon } from \"lucide-react\";\nimport { cn } from \"@mari-ui/core\";\nimport type { SplitterPanelProps, SplitterProps } from \"./types\";\nimport { initialSizes, limitsOf, moveHandle, parseStored, setPanelSize, type PanelLimits } from \"./utils\";\n\nexport type { SplitterProps, SplitterPanelProps };\n\nconst useIsomorphicLayoutEffect = typeof window === \"undefined\" ? useEffect : useLayoutEffect;\n\n/** Klavye adımı (px); Shift ile 4 katı. */\nconst KEY_STEP = 16;\n/** Daraltılmış sayılma eşiği (oran). */\nconst COLLAPSED = 0.001;\n\n// Tailwind derleme tarayıcısı için literal sınıflar.\nconst STACK_DIRECTION = { sm: \"flex-col sm:flex-row\", md: \"flex-col md:flex-row\", lg: \"flex-col lg:flex-row\", none: \"flex-row\" } as const;\nconst STACK_PANEL_FLEX = { sm: \"sm:[flex:var(--mari-split)]\", md: \"md:[flex:var(--mari-split)]\", lg: \"lg:[flex:var(--mari-split)]\", none: \"[flex:var(--mari-split)]\" } as const;\nconst STACK_HANDLE = { sm: \"hidden sm:flex\", md: \"hidden md:flex\", lg: \"hidden lg:flex\", none: \"flex\" } as const;\n\n/**\n * Panel — `Splitter`ın çocuğu. Kendisi bir şey çizmez; Splitter props'larını\n * okuyup paneli kendi kapsayıcısıyla çizer (boyut Splitter'ın durumunda).\n */\nexport function SplitterPanel(props: Readonly<SplitterPanelProps>) {\n return <>{props.children}</>;\n}\n\n/**\n * Bölünmüş görünüm: paneller arasındaki\n * tutamaç sürüklenerek ya da klavyeyle boyut değiştirir. Liste + detay,\n * düzenleyici + önizleme gibi iş ekranları için.\n *\n * Tutamaç APG \"window splitter\": `role=\"separator\"`, odaklanır; ←/→ (dikeyde\n * ↑/↓) 16px, Shift ile 64px; Home/End min/max; Enter daraltılabilir paneli\n * kapatır/açar. Değer: önceki panelin yüzdesi.\n * - Yalnız iki komşu panel değişir; min/max her zaman korunur.\n * - Mobil: `stackBelow` altında paneller alt alta, tutamaçlar gizli (saf CSS).\n * - `storageKey`: kullanıcının ayarladığı düzen hatırlanır.\n */\nexport function Splitter({ orientation = \"horizontal\", stackBelow = \"md\", storageKey, onResize, onResizeEnd, children, className, style }: Readonly<SplitterProps>) {\n const panels = Children.toArray(children).filter((c): c is React.ReactElement<SplitterPanelProps> => isValidElement(c));\n const count = panels.length;\n const horizontal = orientation === \"horizontal\";\n const stack = horizontal ? stackBelow : \"none\";\n const baseId = useId();\n const rootRef = useRef<HTMLDivElement>(null);\n // `null`: henüz ölçülmedi — ilk çıktı varsayılan boyutlara göre CSS ile (SSR).\n const [sizes, setSizes] = useState<number[] | null>(null);\n const sizesRef = useRef<number[] | null>(null);\n sizesRef.current = sizes;\n /** Daraltmadan önceki oranlar (açınca geri dönülür). */\n const restore = useRef<Record<number, number>>({});\n const [dragging, setDragging] = useState<number | null>(null);\n\n /** Tutamaçlar hariç kullanılabilir alan (px). */\n const available = useCallback(() => {\n const root = rootRef.current;\n if (!root) return 0;\n const total = horizontal ? root.clientWidth : root.clientHeight;\n const handles = Array.from(root.children).filter((c) => (c as HTMLElement).dataset.splitterHandle !== undefined);\n const handleSize = handles.reduce((sum, h) => sum + (horizontal ? (h as HTMLElement).offsetWidth : (h as HTMLElement).offsetHeight), 0);\n return Math.max(0, total - handleSize);\n }, [horizontal]);\n\n const limits = useCallback((): PanelLimits[] => panels.map((p) => limitsOf(p.props.min, p.props.max, available())), [panels, available]);\n\n // İlk ölçüm (boyamadan önce): kayıtlı düzen ya da varsayılan boyutlar → oran.\n useIsomorphicLayoutEffect(() => {\n const stored = storageKey && typeof localStorage !== \"undefined\" ? parseStored(safeRead(storageKey), count) : null;\n setSizes(stored ?? initialSizes(panels.map((p) => p.props.defaultSize), available()));\n }, [count, storageKey]);\n\n const commit = useCallback(\n (next: number[]) => {\n if (storageKey) safeWrite(storageKey, JSON.stringify(next));\n onResizeEnd?.(next);\n },\n [storageKey, onResizeEnd]\n );\n\n const update = (next: number[]) => {\n setSizes(next);\n onResize?.(next);\n };\n\n /** Tutamaç `index`in daraltacağı panel: önce soldaki/üstteki, o değilse sağdaki/alttaki. */\n const collapseTarget = (index: number): number | null => {\n if (panels[index]?.props.collapsible) return index;\n if (panels[index + 1]?.props.collapsible) return index + 1;\n return null;\n };\n\n const toggleCollapse = (index: number) => {\n const current = sizesRef.current;\n const target = collapseTarget(index);\n if (!current || target === null) return;\n const neighbor = target === index ? index + 1 : index;\n let next: number[];\n if (current[target]! <= COLLAPSED) {\n next = setPanelSize(current, target, neighbor, restore.current[target] ?? 1 / count);\n } else {\n restore.current[target] = current[target]!;\n next = setPanelSize(current, target, neighbor, 0);\n }\n update(next);\n commit(next);\n };\n\n /** Daraltılabilir panel sürüklemede min'in altına inebilir (0'a kapanır). */\n const dragLimits = (index: number) => {\n const all = limits();\n const target = collapseTarget(index);\n if (target !== null) all[target] = { ...all[target]!, min: 0 };\n return all;\n };\n\n const onPointerDown = (index: number) => (e: React.PointerEvent<HTMLDivElement>) => {\n if (e.button !== 0 || !sizesRef.current) return;\n e.preventDefault();\n const handle = e.currentTarget;\n handle.setPointerCapture(e.pointerId);\n const start = horizontal ? e.clientX : e.clientY;\n const startSizes = sizesRef.current;\n const avail = available();\n const lim = dragLimits(index);\n setDragging(index);\n let last = startSizes;\n const move = (ev: PointerEvent) => {\n const delta = ((horizontal ? ev.clientX : ev.clientY) - start) / (avail || 1);\n last = moveHandle(startSizes, index, delta, lim);\n update(last);\n };\n const up = () => {\n handle.removeEventListener(\"pointermove\", move);\n handle.removeEventListener(\"pointerup\", up);\n handle.removeEventListener(\"pointercancel\", up);\n setDragging(null);\n commit(last);\n };\n handle.addEventListener(\"pointermove\", move);\n handle.addEventListener(\"pointerup\", up);\n handle.addEventListener(\"pointercancel\", up);\n };\n\n const onKeyDown = (index: number) => (e: React.KeyboardEvent<HTMLDivElement>) => {\n const current = sizesRef.current;\n if (!current) return;\n const avail = available() || 1;\n const step = (KEY_STEP * (e.shiftKey ? 4 : 1)) / avail;\n const back = horizontal ? \"ArrowLeft\" : \"ArrowUp\";\n const forward = horizontal ? \"ArrowRight\" : \"ArrowDown\";\n const lim = limits();\n let next: number[] | null = null;\n if (e.key === back) next = moveHandle(current, index, -step, lim);\n else if (e.key === forward) next = moveHandle(current, index, step, lim);\n else if (e.key === \"Home\") next = moveHandle(current, index, -1, lim);\n else if (e.key === \"End\") next = moveHandle(current, index, 1, lim);\n else if (e.key === \"Enter\" && collapseTarget(index) !== null) {\n e.preventDefault();\n toggleCollapse(index);\n return;\n }\n if (!next) return;\n e.preventDefault();\n update(next);\n commit(next);\n };\n\n return (\n <div\n ref={rootRef}\n data-orientation={orientation}\n className={cn(\"flex min-h-0 min-w-0\", horizontal ? STACK_DIRECTION[stack] : \"flex-col\", dragging !== null && \"select-none\", className)}\n style={style}\n >\n {panels.map((panel, i) => {\n const size = sizes?.[i];\n const collapsed = size !== undefined && size <= COLLAPSED;\n const next = panels[i + 1];\n const target = collapseTarget(i);\n const lim = sizes ? limits()[i] : undefined;\n return (\n <React.Fragment key={panel.key ?? i}>\n <div\n id={`${baseId}-panel-${i}`}\n data-splitter-panel=\"\"\n inert={collapsed || undefined}\n className={cn(\"min-h-0 min-w-0 overflow-auto\", STACK_PANEL_FLEX[stack], collapsed && \"overflow-hidden\", panel.props.className)}\n style={{ ...panel.props.style, [\"--mari-split\" as string]: panelFlex(size, panel.props.defaultSize) }}\n >\n {panel.props.children}\n </div>\n {next && (\n <SplitterHandle\n horizontal={horizontal}\n stack={stack}\n label={panelLabel(panel, i)}\n controls={`${baseId}-panel-${i}`}\n percent={size !== undefined ? Math.round(size * 100) : undefined}\n limits={lim}\n resizable={panel.props.resizable !== false && next.props.resizable !== false}\n active={dragging === i}\n onPointerDown={onPointerDown(i)}\n onKeyDown={onKeyDown(i)}\n collapse={\n target === null\n ? undefined\n : {\n label: panelLabel(panels[target]!, target),\n collapsed: (sizes?.[target] ?? 1) <= COLLAPSED,\n isStart: target === i,\n onToggle: () => toggleCollapse(i),\n }\n }\n />\n )}\n </React.Fragment>\n );\n })}\n </div>\n );\n}\n\n/** Ölçümden önce (SSR / ilk kare): px varsayılan sabit, yüzde sabit, verilmeyen esner; sonra oran. */\nfunction panelFlex(size: number | undefined, defaultSize: SplitterPanelProps[\"defaultSize\"]): string {\n if (size !== undefined) return `${size} 1 0px`;\n if (typeof defaultSize === \"number\") return `0 0 ${defaultSize}px`;\n if (defaultSize) return `0 0 ${defaultSize}`;\n return \"1 1 0px\";\n}\n\nconst panelLabel = (panel: React.ReactElement<SplitterPanelProps>, index: number) => panel.props.label ?? `Panel ${index + 1}`;\n\ninterface SplitterHandleProps {\n horizontal: boolean;\n stack: keyof typeof STACK_HANDLE;\n label: string;\n controls: string;\n percent?: number;\n limits?: PanelLimits;\n resizable: boolean;\n active: boolean;\n onPointerDown: React.PointerEventHandler<HTMLDivElement>;\n onKeyDown: React.KeyboardEventHandler<HTMLDivElement>;\n collapse?: { label: string; collapsed: boolean; isStart: boolean; onToggle: () => void };\n}\n\n/**\n * Tutamaç — APG \"window splitter\": odaklanabilir `separator` bir ARIA widget'ıdır\n * (değer taşır, klavyeyle değişir); lint eklentisi bunu etkileşimsiz sanıyor.\n */\nfunction SplitterHandle({ horizontal, stack, label, controls, percent, limits: lim, resizable, active, onPointerDown, onKeyDown, collapse }: Readonly<SplitterHandleProps>) {\n return (\n // Sarmalayıcı: 1px'lik yer + ortak hover grubu. Daraltma düğmesi tutamacın İÇİNDE değil kardeşi\n // (separator içinde düğme = iç içe etkileşimli öğe, axe nested-interactive).\n <div data-splitter-handle=\"\" className={cn(\"group/handle relative z-10 shrink-0 items-center justify-center\", STACK_HANDLE[stack], horizontal ? \"w-px flex-col\" : \"h-px flex-row\")}>\n {/* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- odaklanabilir separator = ARIA widget (window splitter) */}\n <div\n role=\"separator\"\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- APG window splitter: tutamaç klavyeyle odaklanır\n tabIndex={resizable ? 0 : undefined}\n aria-orientation={horizontal ? \"vertical\" : \"horizontal\"}\n aria-label={`${label} panelini yeniden boyutlandır`}\n aria-controls={controls}\n aria-valuenow={percent}\n aria-valuemin={lim ? Math.round(lim.min * 100) : undefined}\n aria-valuemax={lim ? Math.round(lim.max * 100) : undefined}\n aria-disabled={resizable ? undefined : true}\n onPointerDown={resizable ? onPointerDown : undefined}\n onKeyDown={resizable ? onKeyDown : undefined}\n className={cn(\n // Görünen çizgi 1px; tıklama alanı ::before ile her yana 4px (dokunmatikte 10px).\n \"peer/separator absolute inset-0 bg-mari-border outline-none\",\n \"before:absolute before:content-['']\",\n horizontal ? \"before:inset-y-0 before:-inset-x-1 pointer-coarse:before:-inset-x-2.5\" : \"before:inset-x-0 before:-inset-y-1 pointer-coarse:before:-inset-y-2.5\",\n // Odak halkası çizginin etrafında (1px çizgiye outline görünmez kalır).\n \"focus-visible:ring-2 focus-visible:ring-mari-ring\",\n resizable && (horizontal ? \"cursor-col-resize\" : \"cursor-row-resize\"),\n resizable && \"transition-colors group-hover/handle:bg-mari-primary-solid focus-visible:bg-mari-primary-solid motion-reduce:transition-none\",\n active && \"bg-mari-primary-solid\"\n )}\n />\n {collapse && resizable && (\n <CollapseButton\n horizontal={horizontal}\n // Ok, daraltılacak panele doğru; kapalıyken ters (açılacak yöne).\n towardStart={collapse.isStart !== collapse.collapsed}\n collapsed={collapse.collapsed}\n label={collapse.label}\n onClick={collapse.onToggle}\n />\n )}\n </div>\n );\n}\n\nfunction CollapseButton({ horizontal, towardStart, collapsed, label, onClick }: Readonly<{ horizontal: boolean; towardStart: boolean; collapsed: boolean; label: string; onClick: () => void }>) {\n let Icon = towardStart ? ChevronUpIcon : ChevronDownIcon;\n if (horizontal) Icon = towardStart ? ChevronLeftIcon : ChevronRightIcon;\n return (\n <button\n type=\"button\"\n // Tutamacın sürüklemesini başlatmasın.\n onPointerDown={(e) => e.stopPropagation()}\n onClick={onClick}\n tabIndex={-1}\n aria-label={collapsed ? `${label} panelini aç` : `${label} panelini kapat`}\n className={cn(\n \"absolute z-10 grid size-5 cursor-pointer place-items-center rounded-full border border-mari-border bg-mari-surface text-mari-muted shadow-mari-sm\",\n \"opacity-0 transition-opacity group-hover/handle:opacity-100 peer-focus-visible/separator:opacity-100 hover:text-mari-foreground motion-reduce:transition-none\",\n collapsed && \"opacity-100\"\n )}\n >\n <Icon aria-hidden className=\"size-3.5\" />\n </button>\n );\n}\n\nfunction safeRead(key: string): string | null {\n try {\n return localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nfunction safeWrite(key: string, value: string) {\n try {\n localStorage.setItem(key, value);\n } catch {\n // Gizli pencere / dolu depo: düzen yalnız bu oturumda kalır.\n }\n}\n","import type { SplitterSize } from \"./types\";\n\n/**\n * Splitter'ın saf boyut hesabı (DOM'suz, ayrıca test edilir). Boyutlar\n * panellerin kullanılabilir alana ORANI (toplam 1) olarak tutulur — kapsayıcı\n * büyüyüp küçülünce paneller orantılı kalır. Piksel min/max her hesapta o anki\n * kullanılabilir alana göre orana çevrilir.\n */\n\n/** `280` → 280 / available, `\"30%\"` → 0.3. */\nexport function toFraction(size: SplitterSize | undefined, available: number): number | undefined {\n if (size === undefined) return undefined;\n if (typeof size === \"number\") return available > 0 ? size / available : 0;\n return Number.parseFloat(size) / 100;\n}\n\nexport interface PanelLimits {\n min: number;\n max: number;\n}\n\nexport function limitsOf(min: SplitterSize | undefined, max: SplitterSize | undefined, available: number): PanelLimits {\n return { min: toFraction(min, available) ?? 0, max: Math.min(1, toFraction(max, available) ?? 1) };\n}\n\n/**\n * İlk oranlar: verilen boyutlar alınır, verilmeyenler kalanı eşit paylaşır,\n * sonra toplam 1'e ölçeklenir (fazla verilmişse orantılı küçülür).\n */\nexport function initialSizes(defaults: Array<SplitterSize | undefined>, available: number): number[] {\n const given = defaults.map((d) => toFraction(d, available));\n const used = given.reduce<number>((sum, f) => sum + (f ?? 0), 0);\n const free = given.filter((f) => f === undefined).length;\n const share = free > 0 ? Math.max(0, 1 - used) / free : 0;\n const raw = given.map((f) => f ?? share);\n const total = raw.reduce((a, b) => a + b, 0) || 1;\n return raw.map((f) => f / total);\n}\n\nconst clamp = (v: number, lo: number, hi: number) => Math.min(hi, Math.max(lo, v));\n\n/**\n * Tutamaç `index` (panel `index` ile `index + 1` arasında) `delta` oranı kadar\n * kaydırılır. Yalnız iki komşu panel değişir; ikisinin toplamı korunur, her\n * biri kendi min/max'ında kalır.\n */\nexport function moveHandle(sizes: number[], index: number, delta: number, limits: PanelLimits[]): number[] {\n const a = sizes[index]!;\n const b = sizes[index + 1]!;\n const pair = a + b;\n const la = limits[index]!;\n const lb = limits[index + 1]!;\n // a'nın gidebileceği aralık: kendi sınırları ve b'nin sınırlarının izin verdiği.\n const lo = Math.max(la.min, pair - lb.max);\n const hi = Math.min(la.max, pair - lb.min);\n const nextA = clamp(a + delta, lo, Math.max(lo, hi));\n const next = sizes.slice();\n next[index] = nextA;\n next[index + 1] = pair - nextA;\n return next;\n}\n\n/**\n * Daraltma: `panel` 0'a iner, alanı tutamacın öbür yanındaki komşuya geçer.\n * Açarken `restore` (daraltmadan önceki oran) komşudan geri alınır.\n */\nexport function setPanelSize(sizes: number[], panel: number, neighbor: number, value: number): number[] {\n const next = sizes.slice();\n const pair = sizes[panel]! + sizes[neighbor]!;\n next[panel] = clamp(value, 0, pair);\n next[neighbor] = pair - next[panel]!;\n return next;\n}\n\n/** Kayıtlı oranlar panel sayısıyla uyuşuyor ve geçerliyse döner. */\nexport function parseStored(raw: string | null, count: number): number[] | null {\n if (!raw) return null;\n try {\n const value: unknown = JSON.parse(raw);\n if (!Array.isArray(value) || value.length !== count || !value.every((v) => typeof v === \"number\" && v >= 0)) return null;\n const total = value.reduce((a: number, b: number) => a + b, 0);\n return total > 0 ? value.map((v: number) => v / total) : null;\n } catch {\n return null;\n }\n}\n"],"mappings":"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","names":[]}
package/dist/statistic.js CHANGED
@@ -6,17 +6,17 @@ import {
6
6
  } from "./chunk-RAS77O7N.js";
7
7
  import {
8
8
  ContentSkeleton
9
- } from "./chunk-V7KDUUV6.js";
9
+ } from "./chunk-RMNV2CE2.js";
10
10
  import {
11
11
  SkeletonBlock
12
- } from "./chunk-NPM7IDYV.js";
13
- import "./chunk-XUKVQO6M.js";
12
+ } from "./chunk-TSFAAREV.js";
13
+ import "./chunk-6CSUVVFG.js";
14
14
  import {
15
15
  Button
16
- } from "./chunk-2IEXY3OZ.js";
17
- import "./chunk-FFXRFQSU.js";
18
- import "./chunk-IP2J3BWY.js";
19
- import "./chunk-54HHEXXD.js";
16
+ } from "./chunk-CVKAGR3D.js";
17
+ import "./chunk-POBOJBNJ.js";
18
+ import "./chunk-6AMBZXZJ.js";
19
+ import "./chunk-VKN374SD.js";
20
20
 
21
21
  // src/statistic/Statistic.tsx
22
22
  import { useEffect, useRef, useState } from "react";