@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
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/statistic/Statistic.tsx","../src/statistic/utils.ts"],"sourcesContent":["\"use client\";\n\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { MinusIcon, PauseIcon, PlayIcon, RotateCcwIcon, TrendingDownIcon, TrendingUpIcon } from \"lucide-react\";\nimport { cn } from \"@mari-ui/core\";\nimport { Button } from \"../button\";\nimport { ContentSkeleton } from \"../lib/ContentSkeleton\";\nimport { SkeletonBlock } from \"../skeleton\";\nimport type { ClockProps, CountdownProps, StatisticProps, StopwatchProps } from \"./types\";\nimport { decimalPlaces, formatCountdown, formatStopwatch, formatValue, spokenDuration, trendTone, type TrendTone } from \"./utils\";\nimport { AnimatedText, useAnimatedValue, type ValueAnimation } from \"../lib/useAnimatedValue\";\n\nexport type { StatisticProps, CountdownProps, ClockProps, StopwatchProps };\n\nconst VALUE_SIZE = { sm: \"text-xl\", md: \"text-2xl\", lg: \"text-4xl\" } as const;\nconst TONE_CLASS: Record<TrendTone, string> = {\n good: \"text-mari-success\",\n bad: \"text-mari-error\",\n neutral: \"text-mari-muted\",\n};\nconst TONE_WORD: Record<TrendTone, string> = { good: \"olumlu\", bad: \"olumsuz\", neutral: \"değişmedi\" };\n\ninterface ShellProps {\n title?: React.ReactNode;\n prefix?: React.ReactNode;\n suffix?: React.ReactNode;\n description?: React.ReactNode;\n footer?: React.ReactNode;\n size: NonNullable<StatisticProps[\"size\"]>;\n skeleton: boolean;\n className?: string;\n /** Değerin kendisi (metin). */\n children: React.ReactNode;\n /** Değer kutusuna ek öznitelikler (role=\"timer\" vb.). */\n valueProps?: React.HTMLAttributes<HTMLElement> & { dateTime?: string };\n valueAs?: \"p\" | \"time\";\n}\n\n/** Ölçülecek içerik yoksa (yerleşimsiz ortam) genel yer tutucu: başlık, değer, alt satır. */\nconst PLACEHOLDER = (\n <div className=\"flex flex-col gap-2 py-0.5\">\n <SkeletonBlock active width=\"40%\" height=\"0.75rem\" radius=\"sm\" />\n <SkeletonBlock active width=\"60%\" height=\"1.5rem\" radius=\"sm\" />\n <SkeletonBlock active width=\"50%\" height=\"0.75rem\" radius=\"sm\" />\n </div>\n);\n\n/**\n * Ortak düzen: soluk başlık, büyük değer (önek/sonekle), altta trend ya da\n * açıklama. İskelet `ContentSkeleton` ile içeriğin KENDİ şeklinde: her metin\n * satırı ve ikon kendi genişliğinde blok, gerçek içerik görünmez olarak yerinde\n * (yükseklik zıplamaz). Eskiden bölgeleri tam genişlik çubuğa çevirip metni\n * saydam yapıyordu — kendi rengi olan önek/sonek (₺, %) ve trend (yeşil/kırmızı\n * metin, ikon) iskeletin üstünde görünür kalıyordu (kullanıcı bulgusu).\n */\nfunction StatisticShell({ title, prefix, suffix, description, footer, size, skeleton, className, children, valueProps, valueAs = \"p\" }: Readonly<ShellProps>) {\n const Value = valueAs;\n return (\n <div className={cn(\"min-w-0\", className)} aria-busy={skeleton || undefined}>\n <ContentSkeleton on={skeleton} fallback={PLACEHOLDER}>\n <div className=\"flex min-w-0 flex-col gap-1\">\n {title && <p className=\"text-sm text-mari-muted\">{title}</p>}\n <Value {...valueProps} className={cn(\"flex min-w-0 items-baseline gap-1 font-semibold tabular-nums tracking-tight text-mari-foreground\", VALUE_SIZE[size])}>\n {prefix && <span className=\"text-[0.6em] font-medium text-mari-muted\">{prefix}</span>}\n <span className=\"truncate\">{children}</span>\n {suffix && <span className=\"text-[0.6em] font-medium text-mari-muted\">{suffix}</span>}\n </Value>\n {/* Trend + açıklama bir CÜMLE gibi akar (\"▲ %12 geçen aya göre\"): dar kartta açıklama kelime\n kelime sarar. Eskiden flex öğeleriydi — 1px sığmayınca açıklamanın TAMAMI alt satıra atlıyordu. */}\n {(footer || description) && (\n <div className=\"text-sm leading-6\">\n {footer}\n {footer && description && \" \"}\n {description && <span className=\"text-mari-muted\">{description}</span>}\n </div>\n )}\n </div>\n </ContentSkeleton>\n </div>\n );\n}\n\n/** Trend oku yönünde kayarak gelir (yukarı ok aşağı-soldan, aşağı ok yukarı-soldan); yatay çizgi belirir. */\nconst TREND_ICON_ANIMATION = {\n up: \"animate-[mari-trend-up_500ms_var(--mari-easing-decelerate)_both] motion-reduce:animate-none\",\n down: \"animate-[mari-trend-down_500ms_var(--mari-easing-decelerate)_both] motion-reduce:animate-none\",\n flat: \"animate-[mari-fade-in_400ms_ease-out_both] motion-reduce:animate-none\",\n} as const;\n\ninterface TrendProps {\n trend: NonNullable<StatisticProps[\"trend\"]>;\n locale: string;\n animate: boolean;\n mode: ValueAnimation;\n}\n\nfunction Trend({ trend, locale, animate, mode }: Readonly<TrendProps>) {\n const tone = trendTone(trend.value, trend.goodWhen ?? \"up\");\n const nf = new Intl.NumberFormat(locale, { minimumFractionDigits: 0, maximumFractionDigits: 1 });\n const withUnit = (n: string) => (trend.unit === \"points\" ? `${n} puan` : `%${n}`);\n const text = withUnit(nf.format(Math.abs(trend.value)));\n const fixed = new Intl.NumberFormat(locale, { minimumFractionDigits: Number.isInteger(trend.value) ? 0 : 1, maximumFractionDigits: 1 });\n const shown = useAnimatedValue({ text, number: Math.abs(trend.value), format: (v) => withUnit(fixed.format(v)), mode, enabled: animate });\n let Icon = MinusIcon;\n let verb = \"değişmedi\";\n let direction: keyof typeof TREND_ICON_ANIMATION = \"flat\";\n if (trend.value > 0) {\n Icon = TrendingUpIcon;\n verb = \"artış\";\n direction = \"up\";\n } else if (trend.value < 0) {\n Icon = TrendingDownIcon;\n verb = \"düşüş\";\n direction = \"down\";\n }\n return (\n <span className={cn(\"mr-0.5 inline-flex items-center gap-1 align-top font-medium\", TONE_CLASS[tone])}>\n {/* key: yön değişince ok yeniden canlansın. */}\n <Icon key={direction} aria-hidden size={16} className={animate ? TREND_ICON_ANIMATION[direction] : undefined} />\n <AnimatedText text={text} shown={shown} />\n {/* Yön ve anlam ikon/renkte — ekran okuyucuya sözle. */}\n <span className=\"sr-only\">\n {trend.value === 0 ? verb : `${verb}, ${TONE_WORD[tone]}`}\n </span>\n </span>\n );\n}\n\n/**\n * Faz 16.2 — sayısal KPI (ant.design Statistic): başlık, tr-TR biçimli değer,\n * önek/sonek, trend. Trendin rengi yönden değil ANLAMdan (`goodWhen`):\n * maliyetin düşmesi yeşil. Yön ve anlam ekran okuyucuya sözle de söylenir.\n */\nexport function Statistic({\n title,\n value,\n precision,\n prefix,\n suffix,\n trend,\n description,\n locale = \"tr-TR\",\n size = \"md\",\n className,\n skeleton = false,\n animated = true,\n valueAnimation = \"count\",\n}: Readonly<StatisticProps>) {\n const text = formatValue(value, precision, locale);\n const animate = animated && !skeleton;\n // Sayarken ara değerler hedefin basamak sayısıyla — \"1.284.500,5\" sayarken 17 ondalık görünmesin.\n const decimals = typeof value === \"number\" ? (precision ?? decimalPlaces(value)) : 0;\n const shown = useAnimatedValue({\n text,\n number: typeof value === \"number\" ? value : undefined,\n format: (v) => new Intl.NumberFormat(locale, { minimumFractionDigits: decimals, maximumFractionDigits: decimals }).format(v),\n mode: valueAnimation,\n enabled: animate,\n });\n return (\n <StatisticShell\n title={title}\n prefix={prefix}\n suffix={suffix}\n description={description}\n footer={trend ? <Trend trend={trend} locale={locale} animate={animate} mode={valueAnimation} /> : undefined}\n size={size}\n skeleton={skeleton}\n className={className}\n >\n <AnimatedText text={text} shown={shown} />\n </StatisticShell>\n );\n}\n\n/**\n * Şimdiki zaman, `intervalMs`'de bir güncellenir. İlk render'da `null` —\n * sunucuda render edilen saat istemcidekiyle aynı olmaz (hidrasyon uyuşmazlığı),\n * bu yüzden değer ancak takıldıktan sonra çizilir.\n */\nfunction useNow(intervalMs: number, enabled = true): number | null {\n const [now, setNow] = useState<number | null>(null);\n useEffect(() => {\n if (!enabled) return;\n setNow(Date.now());\n const timer = setInterval(() => setNow(Date.now()), intervalMs);\n return () => clearInterval(timer);\n }, [intervalMs, enabled]);\n return now;\n}\n\n/**\n * Geri sayım. Her saniye güncellenir ama duyurulmaz (`role=\"timer\"` →\n * ekran okuyucu her saniye konuşmaz); kalan süre sözlü olarak\n * `aria-label`da, süre dolunca bir kez duyurulur.\n */\nexport function Countdown({ title, target, onFinish, showDays = true, finishedText = \"Süre doldu\", prefix, suffix, description, size = \"md\", className, skeleton = false }: Readonly<CountdownProps>) {\n const targetMs = typeof target === \"number\" ? target : target.getTime();\n const now = useNow(1000);\n const remaining = now === null ? null : Math.max(0, targetMs - now);\n const finished = remaining === 0;\n const finishedRef = useRef(false);\n const onFinishRef = useRef(onFinish);\n onFinishRef.current = onFinish;\n\n useEffect(() => {\n if (finished && !finishedRef.current) {\n finishedRef.current = true;\n onFinishRef.current?.();\n }\n if (!finished) finishedRef.current = false;\n }, [finished]);\n\n let display: React.ReactNode = \"--:--\";\n if (remaining !== null) display = finished ? finishedText : formatCountdown(remaining, { showDays });\n\n return (\n <>\n <StatisticShell\n title={title}\n prefix={finished ? undefined : prefix}\n suffix={finished ? undefined : suffix}\n description={description}\n size={size}\n skeleton={skeleton}\n className={className}\n valueProps={{ role: \"timer\", \"aria-label\": remaining === null || finished ? undefined : `Kalan süre: ${spokenDuration(remaining)}` }}\n >\n {display}\n </StatisticShell>\n <span role=\"status\" className=\"sr-only\">\n {finished && typeof finishedText === \"string\" ? finishedText : \"\"}\n </span>\n </>\n );\n}\n\n/** Canlı saat (`<time>`); saniyesiz modda dakikada bir değişir ama saniyede bir kontrol edilir (dakika kaçmasın). */\nexport function Clock({ title, timeZone, showSeconds = false, locale = \"tr-TR\", prefix, suffix, description, size = \"md\", className, skeleton = false }: Readonly<ClockProps>) {\n const now = useNow(1000);\n const date = now === null ? null : new Date(now);\n const text = date ? new Intl.DateTimeFormat(locale, { hour: \"2-digit\", minute: \"2-digit\", second: showSeconds ? \"2-digit\" : undefined, hour12: false, timeZone }).format(date) : \"--:--\";\n return (\n <StatisticShell\n title={title}\n prefix={prefix}\n suffix={suffix}\n description={description}\n size={size}\n skeleton={skeleton}\n className={className}\n valueAs=\"time\"\n valueProps={{ role: \"timer\", dateTime: date?.toISOString() }}\n >\n {text}\n </StatisticShell>\n );\n}\n\n/**\n * Kronometre: Başlat / Duraklat / Sıfırla. Salise görünür ama duyurulmaz\n * (`role=\"timer\"`); durdurulunca geçen süre sözlü olarak durum bölgesinde okunur.\n */\nexport function Stopwatch({ title, controls = true, autoStart = false, onStop, prefix, suffix, description, size = \"md\", className, skeleton = false }: Readonly<StopwatchProps>) {\n const [running, setRunning] = useState(autoStart);\n const [base, setBase] = useState(0);\n const startedAt = useRef<number | null>(autoStart ? Date.now() : null);\n const now = useNow(31, running);\n const elapsed = base + (running && startedAt.current !== null && now !== null ? now - startedAt.current : 0);\n const [announce, setAnnounce] = useState(\"\");\n\n const start = () => {\n startedAt.current = Date.now();\n setRunning(true);\n setAnnounce(\"\");\n };\n const pause = () => {\n const total = base + (startedAt.current === null ? 0 : Date.now() - startedAt.current);\n startedAt.current = null;\n setBase(total);\n setRunning(false);\n setAnnounce(`Durduruldu: ${spokenDuration(total)}`);\n onStop?.(total);\n };\n const reset = () => {\n if (running || base > 0) onStop?.(elapsed);\n startedAt.current = running ? Date.now() : null;\n setBase(0);\n setAnnounce(\"Sıfırlandı\");\n };\n\n // Açıklama (\"Hedef: 1 dakika\") değerin altında KENDİ satırında, düğmeler onun altında —\n // KPI'daki gibi aynı satırda düğmelerin yanına düşmesin.\n const descriptionLine = description ? <span className=\"block text-mari-muted\">{description}</span> : null;\n const footer = controls ? (\n <div className=\"mt-1 flex gap-2\">\n {running ? (\n <Button size=\"sm\" variant=\"outline\" color=\"neutral\" icon={<PauseIcon size={14} aria-hidden />} onClick={pause} disabled={skeleton}>\n Duraklat\n </Button>\n ) : (\n <Button size=\"sm\" icon={<PlayIcon size={14} aria-hidden />} onClick={start} disabled={skeleton}>\n {base > 0 ? \"Devam et\" : \"Başlat\"}\n </Button>\n )}\n <Button size=\"sm\" variant=\"ghost\" color=\"neutral\" icon={<RotateCcwIcon size={14} aria-hidden />} onClick={reset} disabled={skeleton || (!running && base === 0)}>\n Sıfırla\n </Button>\n </div>\n ) : undefined;\n\n return (\n <>\n <StatisticShell\n title={title}\n prefix={prefix}\n suffix={suffix}\n footer={\n descriptionLine || footer ? (\n <>\n {descriptionLine}\n {footer}\n </>\n ) : undefined\n }\n size={size}\n skeleton={skeleton}\n className={className}\n valueProps={{ role: \"timer\" }}\n >\n {formatStopwatch(elapsed)}\n </StatisticShell>\n <span role=\"status\" className=\"sr-only\">\n {announce}\n </span>\n </>\n );\n}\n","/**\n * Faz 16.2 — Statistic ailesinin saf yardımcıları (DOM'suz, ayrıca test edilir).\n */\n\n/** tr-TR sayı: `1234567.8` → \"1.234.567,8\"; `precision` sabit basamak. */\nexport function formatValue(value: number | string, precision: number | undefined, locale: string): string {\n if (typeof value === \"string\") return value;\n return new Intl.NumberFormat(locale, { minimumFractionDigits: precision ?? 0, maximumFractionDigits: precision ?? 20 }).format(value);\n}\n\n/** Sayının ondalık basamak sayısı (`1284500.5` → 1, `12` → 0); sayma animasyonunda ara değer biçimi için. */\nexport function decimalPlaces(value: number): number {\n if (!Number.isFinite(value) || Number.isInteger(value)) return 0;\n const [, fraction = \"\"] = String(value).split(\".\");\n return Math.min(fraction.length, 6);\n}\n\nexport interface DurationParts {\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n /** Yüzde saniye (kronometre). */\n centis: number;\n}\n\nexport function splitDuration(ms: number): DurationParts {\n const total = Math.max(0, Math.floor(ms));\n return {\n days: Math.floor(total / 86_400_000),\n hours: Math.floor(total / 3_600_000) % 24,\n minutes: Math.floor(total / 60_000) % 60,\n seconds: Math.floor(total / 1000) % 60,\n centis: Math.floor(total / 10) % 100,\n };\n}\n\nconst pad = (n: number) => String(n).padStart(2, \"0\");\n\n/**\n * Geri sayım: gün varsa \"2 gün 04:12:09\", yoksa \"04:12:09\"; saat de yoksa \"12:09\".\n * `showDays: false` günleri saate katar (\"52:12:09\").\n */\nexport function formatCountdown(ms: number, { showDays = true }: { showDays?: boolean } = {}): string {\n const p = splitDuration(ms);\n const hours = showDays ? p.hours : p.hours + p.days * 24;\n const clock = hours > 0 || (showDays && p.days > 0) ? `${pad(hours)}:${pad(p.minutes)}:${pad(p.seconds)}` : `${pad(p.minutes)}:${pad(p.seconds)}`;\n return showDays && p.days > 0 ? `${p.days} gün ${clock}` : clock;\n}\n\n/** Kronometre: \"05:07,42\" (dk:sn,salise); bir saati geçince \"1:05:07,42\". */\nexport function formatStopwatch(ms: number): string {\n const p = splitDuration(ms);\n const hours = p.hours + p.days * 24;\n const base = `${pad(p.minutes)}:${pad(p.seconds)},${pad(p.centis)}`;\n return hours > 0 ? `${hours}:${base}` : base;\n}\n\n/** Ekran okuyucu için sözlü süre: \"2 gün 4 saat 12 dakika 9 saniye\" (sıfır birimler atlanır). */\nexport function spokenDuration(ms: number): string {\n const p = splitDuration(ms);\n const parts = [\n [p.days, \"gün\"],\n [p.hours, \"saat\"],\n [p.minutes, \"dakika\"],\n [p.seconds, \"saniye\"],\n ] as const;\n const spoken = parts.filter(([n]) => n > 0).map(([n, unit]) => `${n} ${unit}`);\n return spoken.length ? spoken.join(\" \") : \"0 saniye\";\n}\n\nexport type TrendTone = \"good\" | \"bad\" | \"neutral\";\n\n/**\n * Trendin rengi yönden değil ANLAMdan: gelir artışı iyi, maliyet/iade artışı\n * kötü (`goodWhen=\"down\"`). 0 → nötr.\n */\nexport function trendTone(change: number, goodWhen: \"up\" | \"down\"): TrendTone {\n if (change === 0) return \"neutral\";\n const up = change > 0;\n return up === (goodWhen === \"up\") ? \"good\" : \"bad\";\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/statistic/Statistic.tsx","../src/statistic/utils.ts"],"sourcesContent":["\"use client\";\n\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { MinusIcon, PauseIcon, PlayIcon, RotateCcwIcon, TrendingDownIcon, TrendingUpIcon } from \"lucide-react\";\nimport { cn } from \"@mari-ui/core\";\nimport { Button } from \"../button\";\nimport { ContentSkeleton } from \"../lib/ContentSkeleton\";\nimport { SkeletonBlock } from \"../skeleton\";\nimport type { ClockProps, CountdownProps, StatisticProps, StopwatchProps } from \"./types\";\nimport { decimalPlaces, formatCountdown, formatStopwatch, formatValue, spokenDuration, trendTone, type TrendTone } from \"./utils\";\nimport { AnimatedText, useAnimatedValue, type ValueAnimation } from \"../lib/useAnimatedValue\";\n\nexport type { StatisticProps, CountdownProps, ClockProps, StopwatchProps };\n\nconst VALUE_SIZE = { sm: \"text-xl\", md: \"text-2xl\", lg: \"text-4xl\" } as const;\nconst TONE_CLASS: Record<TrendTone, string> = {\n good: \"text-mari-success\",\n bad: \"text-mari-error\",\n neutral: \"text-mari-muted\",\n};\nconst TONE_WORD: Record<TrendTone, string> = { good: \"olumlu\", bad: \"olumsuz\", neutral: \"değişmedi\" };\n\ninterface ShellProps {\n title?: React.ReactNode;\n prefix?: React.ReactNode;\n suffix?: React.ReactNode;\n description?: React.ReactNode;\n footer?: React.ReactNode;\n size: NonNullable<StatisticProps[\"size\"]>;\n skeleton: boolean;\n className?: string;\n /** Değerin kendisi (metin). */\n children: React.ReactNode;\n /** Değer kutusuna ek öznitelikler (role=\"timer\" vb.). */\n valueProps?: React.HTMLAttributes<HTMLElement> & { dateTime?: string };\n valueAs?: \"p\" | \"time\";\n}\n\n/** Ölçülecek içerik yoksa (yerleşimsiz ortam) genel yer tutucu: başlık, değer, alt satır. */\nconst PLACEHOLDER = (\n <div className=\"flex flex-col gap-2 py-0.5\">\n <SkeletonBlock active width=\"40%\" height=\"0.75rem\" radius=\"sm\" />\n <SkeletonBlock active width=\"60%\" height=\"1.5rem\" radius=\"sm\" />\n <SkeletonBlock active width=\"50%\" height=\"0.75rem\" radius=\"sm\" />\n </div>\n);\n\n/*\n * Ortak düzen: soluk başlık, büyük değer (önek/sonekle), altta trend ya da\n * açıklama. İskelet `ContentSkeleton` ile içeriğin KENDİ şeklinde: her metin\n * satırı ve ikon kendi genişliğinde blok, gerçek içerik görünmez olarak yerinde\n * (yükseklik zıplamaz). Eskiden bölgeleri tam genişlik çubuğa çevirip metni\n * saydam yapıyordu — kendi rengi olan önek/sonek (₺, %) ve trend (yeşil/kırmızı\n * metin, ikon) iskeletin üstünde görünür kalıyordu.\n */\nfunction StatisticShell({ title, prefix, suffix, description, footer, size, skeleton, className, children, valueProps, valueAs = \"p\" }: Readonly<ShellProps>) {\n const Value = valueAs;\n return (\n <div className={cn(\"min-w-0\", className)} aria-busy={skeleton || undefined}>\n <ContentSkeleton on={skeleton} fallback={PLACEHOLDER}>\n <div className=\"flex min-w-0 flex-col gap-1\">\n {title && <p className=\"text-sm text-mari-muted\">{title}</p>}\n <Value {...valueProps} className={cn(\"flex min-w-0 items-baseline gap-1 font-semibold tabular-nums tracking-tight text-mari-foreground\", VALUE_SIZE[size])}>\n {prefix && <span className=\"text-[0.6em] font-medium text-mari-muted\">{prefix}</span>}\n <span className=\"truncate\">{children}</span>\n {suffix && <span className=\"text-[0.6em] font-medium text-mari-muted\">{suffix}</span>}\n </Value>\n {/* Trend + açıklama bir CÜMLE gibi akar (\"▲ %12 geçen aya göre\"): dar kartta açıklama kelime\n kelime sarar. Eskiden flex öğeleriydi — 1px sığmayınca açıklamanın TAMAMI alt satıra atlıyordu. */}\n {(footer || description) && (\n <div className=\"text-sm leading-6\">\n {footer}\n {footer && description && \" \"}\n {description && <span className=\"text-mari-muted\">{description}</span>}\n </div>\n )}\n </div>\n </ContentSkeleton>\n </div>\n );\n}\n\n/** Trend oku yönünde kayarak gelir (yukarı ok aşağı-soldan, aşağı ok yukarı-soldan); yatay çizgi belirir. */\nconst TREND_ICON_ANIMATION = {\n up: \"animate-[mari-trend-up_500ms_var(--mari-easing-decelerate)_both] motion-reduce:animate-none\",\n down: \"animate-[mari-trend-down_500ms_var(--mari-easing-decelerate)_both] motion-reduce:animate-none\",\n flat: \"animate-[mari-fade-in_400ms_ease-out_both] motion-reduce:animate-none\",\n} as const;\n\ninterface TrendProps {\n trend: NonNullable<StatisticProps[\"trend\"]>;\n locale: string;\n animate: boolean;\n mode: ValueAnimation;\n}\n\nfunction Trend({ trend, locale, animate, mode }: Readonly<TrendProps>) {\n const tone = trendTone(trend.value, trend.goodWhen ?? \"up\");\n const nf = new Intl.NumberFormat(locale, { minimumFractionDigits: 0, maximumFractionDigits: 1 });\n const withUnit = (n: string) => (trend.unit === \"points\" ? `${n} puan` : `%${n}`);\n const text = withUnit(nf.format(Math.abs(trend.value)));\n const fixed = new Intl.NumberFormat(locale, { minimumFractionDigits: Number.isInteger(trend.value) ? 0 : 1, maximumFractionDigits: 1 });\n const shown = useAnimatedValue({ text, number: Math.abs(trend.value), format: (v) => withUnit(fixed.format(v)), mode, enabled: animate });\n let Icon = MinusIcon;\n let verb = \"değişmedi\";\n let direction: keyof typeof TREND_ICON_ANIMATION = \"flat\";\n if (trend.value > 0) {\n Icon = TrendingUpIcon;\n verb = \"artış\";\n direction = \"up\";\n } else if (trend.value < 0) {\n Icon = TrendingDownIcon;\n verb = \"düşüş\";\n direction = \"down\";\n }\n return (\n <span className={cn(\"mr-0.5 inline-flex items-center gap-1 align-top font-medium\", TONE_CLASS[tone])}>\n {/* key: yön değişince ok yeniden canlansın. */}\n <Icon key={direction} aria-hidden size={16} className={animate ? TREND_ICON_ANIMATION[direction] : undefined} />\n <AnimatedText text={text} shown={shown} />\n {/* Yön ve anlam ikon/renkte — ekran okuyucuya sözle. */}\n <span className=\"sr-only\">\n {trend.value === 0 ? verb : `${verb}, ${TONE_WORD[tone]}`}\n </span>\n </span>\n );\n}\n\n/**\n * Sayısal KPI: başlık, tr-TR biçimli değer,\n * önek/sonek, trend. Trendin rengi yönden değil ANLAMdan (`goodWhen`):\n * maliyetin düşmesi yeşil. Yön ve anlam ekran okuyucuya sözle de söylenir.\n */\nexport function Statistic({\n title,\n value,\n precision,\n prefix,\n suffix,\n trend,\n description,\n locale = \"tr-TR\",\n size = \"md\",\n className,\n skeleton = false,\n animated = true,\n valueAnimation = \"count\",\n}: Readonly<StatisticProps>) {\n const text = formatValue(value, precision, locale);\n const animate = animated && !skeleton;\n // Sayarken ara değerler hedefin basamak sayısıyla — \"1.284.500,5\" sayarken 17 ondalık görünmesin.\n const decimals = typeof value === \"number\" ? (precision ?? decimalPlaces(value)) : 0;\n const shown = useAnimatedValue({\n text,\n number: typeof value === \"number\" ? value : undefined,\n format: (v) => new Intl.NumberFormat(locale, { minimumFractionDigits: decimals, maximumFractionDigits: decimals }).format(v),\n mode: valueAnimation,\n enabled: animate,\n });\n return (\n <StatisticShell\n title={title}\n prefix={prefix}\n suffix={suffix}\n description={description}\n footer={trend ? <Trend trend={trend} locale={locale} animate={animate} mode={valueAnimation} /> : undefined}\n size={size}\n skeleton={skeleton}\n className={className}\n >\n <AnimatedText text={text} shown={shown} />\n </StatisticShell>\n );\n}\n\n/**\n * Şimdiki zaman, `intervalMs`'de bir güncellenir. İlk render'da `null` —\n * sunucuda render edilen saat istemcidekiyle aynı olmaz (hidrasyon uyuşmazlığı),\n * bu yüzden değer ancak takıldıktan sonra çizilir.\n */\nfunction useNow(intervalMs: number, enabled = true): number | null {\n const [now, setNow] = useState<number | null>(null);\n useEffect(() => {\n if (!enabled) return;\n setNow(Date.now());\n const timer = setInterval(() => setNow(Date.now()), intervalMs);\n return () => clearInterval(timer);\n }, [intervalMs, enabled]);\n return now;\n}\n\n/**\n * Geri sayım. Her saniye güncellenir ama duyurulmaz (`role=\"timer\"` →\n * ekran okuyucu her saniye konuşmaz); kalan süre sözlü olarak\n * `aria-label`da, süre dolunca bir kez duyurulur.\n */\nexport function Countdown({ title, target, onFinish, showDays = true, finishedText = \"Süre doldu\", prefix, suffix, description, size = \"md\", className, skeleton = false }: Readonly<CountdownProps>) {\n const targetMs = typeof target === \"number\" ? target : target.getTime();\n const now = useNow(1000);\n const remaining = now === null ? null : Math.max(0, targetMs - now);\n const finished = remaining === 0;\n const finishedRef = useRef(false);\n const onFinishRef = useRef(onFinish);\n onFinishRef.current = onFinish;\n\n useEffect(() => {\n if (finished && !finishedRef.current) {\n finishedRef.current = true;\n onFinishRef.current?.();\n }\n if (!finished) finishedRef.current = false;\n }, [finished]);\n\n let display: React.ReactNode = \"--:--\";\n if (remaining !== null) display = finished ? finishedText : formatCountdown(remaining, { showDays });\n\n return (\n <>\n <StatisticShell\n title={title}\n prefix={finished ? undefined : prefix}\n suffix={finished ? undefined : suffix}\n description={description}\n size={size}\n skeleton={skeleton}\n className={className}\n valueProps={{ role: \"timer\", \"aria-label\": remaining === null || finished ? undefined : `Kalan süre: ${spokenDuration(remaining)}` }}\n >\n {display}\n </StatisticShell>\n <span role=\"status\" className=\"sr-only\">\n {finished && typeof finishedText === \"string\" ? finishedText : \"\"}\n </span>\n </>\n );\n}\n\n/** Canlı saat (`<time>`); saniyesiz modda dakikada bir değişir ama saniyede bir kontrol edilir (dakika kaçmasın). */\nexport function Clock({ title, timeZone, showSeconds = false, locale = \"tr-TR\", prefix, suffix, description, size = \"md\", className, skeleton = false }: Readonly<ClockProps>) {\n const now = useNow(1000);\n const date = now === null ? null : new Date(now);\n const text = date ? new Intl.DateTimeFormat(locale, { hour: \"2-digit\", minute: \"2-digit\", second: showSeconds ? \"2-digit\" : undefined, hour12: false, timeZone }).format(date) : \"--:--\";\n return (\n <StatisticShell\n title={title}\n prefix={prefix}\n suffix={suffix}\n description={description}\n size={size}\n skeleton={skeleton}\n className={className}\n valueAs=\"time\"\n valueProps={{ role: \"timer\", dateTime: date?.toISOString() }}\n >\n {text}\n </StatisticShell>\n );\n}\n\n/**\n * Kronometre: Başlat / Duraklat / Sıfırla. Salise görünür ama duyurulmaz\n * (`role=\"timer\"`); durdurulunca geçen süre sözlü olarak durum bölgesinde okunur.\n */\nexport function Stopwatch({ title, controls = true, autoStart = false, onStop, prefix, suffix, description, size = \"md\", className, skeleton = false }: Readonly<StopwatchProps>) {\n const [running, setRunning] = useState(autoStart);\n const [base, setBase] = useState(0);\n const startedAt = useRef<number | null>(autoStart ? Date.now() : null);\n const now = useNow(31, running);\n const elapsed = base + (running && startedAt.current !== null && now !== null ? now - startedAt.current : 0);\n const [announce, setAnnounce] = useState(\"\");\n\n const start = () => {\n startedAt.current = Date.now();\n setRunning(true);\n setAnnounce(\"\");\n };\n const pause = () => {\n const total = base + (startedAt.current === null ? 0 : Date.now() - startedAt.current);\n startedAt.current = null;\n setBase(total);\n setRunning(false);\n setAnnounce(`Durduruldu: ${spokenDuration(total)}`);\n onStop?.(total);\n };\n const reset = () => {\n if (running || base > 0) onStop?.(elapsed);\n startedAt.current = running ? Date.now() : null;\n setBase(0);\n setAnnounce(\"Sıfırlandı\");\n };\n\n // Açıklama (\"Hedef: 1 dakika\") değerin altında KENDİ satırında, düğmeler onun altında —\n // KPI'daki gibi aynı satırda düğmelerin yanına düşmesin.\n const descriptionLine = description ? <span className=\"block text-mari-muted\">{description}</span> : null;\n const footer = controls ? (\n <div className=\"mt-1 flex gap-2\">\n {running ? (\n <Button size=\"sm\" variant=\"outline\" color=\"neutral\" icon={<PauseIcon size={14} aria-hidden />} onClick={pause} disabled={skeleton}>\n Duraklat\n </Button>\n ) : (\n <Button size=\"sm\" icon={<PlayIcon size={14} aria-hidden />} onClick={start} disabled={skeleton}>\n {base > 0 ? \"Devam et\" : \"Başlat\"}\n </Button>\n )}\n <Button size=\"sm\" variant=\"ghost\" color=\"neutral\" icon={<RotateCcwIcon size={14} aria-hidden />} onClick={reset} disabled={skeleton || (!running && base === 0)}>\n Sıfırla\n </Button>\n </div>\n ) : undefined;\n\n return (\n <>\n <StatisticShell\n title={title}\n prefix={prefix}\n suffix={suffix}\n footer={\n descriptionLine || footer ? (\n <>\n {descriptionLine}\n {footer}\n </>\n ) : undefined\n }\n size={size}\n skeleton={skeleton}\n className={className}\n valueProps={{ role: \"timer\" }}\n >\n {formatStopwatch(elapsed)}\n </StatisticShell>\n <span role=\"status\" className=\"sr-only\">\n {announce}\n </span>\n </>\n );\n}\n","/** Statistic ailesinin saf yardımcıları (DOM'suz, ayrıca test edilir). */\n\n/** Tr-TR sayı: `1234567.8` → \"1.234.567,8\"; `precision` sabit basamak. */\nexport function formatValue(value: number | string, precision: number | undefined, locale: string): string {\n if (typeof value === \"string\") return value;\n return new Intl.NumberFormat(locale, { minimumFractionDigits: precision ?? 0, maximumFractionDigits: precision ?? 20 }).format(value);\n}\n\n/** Sayının ondalık basamak sayısı (`1284500.5` → 1, `12` → 0); sayma animasyonunda ara değer biçimi için. */\nexport function decimalPlaces(value: number): number {\n if (!Number.isFinite(value) || Number.isInteger(value)) return 0;\n const [, fraction = \"\"] = String(value).split(\".\");\n return Math.min(fraction.length, 6);\n}\n\nexport interface DurationParts {\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n /** Yüzde saniye (kronometre). */\n centis: number;\n}\n\nexport function splitDuration(ms: number): DurationParts {\n const total = Math.max(0, Math.floor(ms));\n return {\n days: Math.floor(total / 86_400_000),\n hours: Math.floor(total / 3_600_000) % 24,\n minutes: Math.floor(total / 60_000) % 60,\n seconds: Math.floor(total / 1000) % 60,\n centis: Math.floor(total / 10) % 100,\n };\n}\n\nconst pad = (n: number) => String(n).padStart(2, \"0\");\n\n/**\n * Geri sayım: gün varsa \"2 gün 04:12:09\", yoksa \"04:12:09\"; saat de yoksa \"12:09\".\n * `showDays: false` günleri saate katar (\"52:12:09\").\n */\nexport function formatCountdown(ms: number, { showDays = true }: { showDays?: boolean } = {}): string {\n const p = splitDuration(ms);\n const hours = showDays ? p.hours : p.hours + p.days * 24;\n const clock = hours > 0 || (showDays && p.days > 0) ? `${pad(hours)}:${pad(p.minutes)}:${pad(p.seconds)}` : `${pad(p.minutes)}:${pad(p.seconds)}`;\n return showDays && p.days > 0 ? `${p.days} gün ${clock}` : clock;\n}\n\n/** Kronometre: \"05:07,42\" (dk:sn,salise); bir saati geçince \"1:05:07,42\". */\nexport function formatStopwatch(ms: number): string {\n const p = splitDuration(ms);\n const hours = p.hours + p.days * 24;\n const base = `${pad(p.minutes)}:${pad(p.seconds)},${pad(p.centis)}`;\n return hours > 0 ? `${hours}:${base}` : base;\n}\n\n/** Ekran okuyucu için sözlü süre: \"2 gün 4 saat 12 dakika 9 saniye\" (sıfır birimler atlanır). */\nexport function spokenDuration(ms: number): string {\n const p = splitDuration(ms);\n const parts = [\n [p.days, \"gün\"],\n [p.hours, \"saat\"],\n [p.minutes, \"dakika\"],\n [p.seconds, \"saniye\"],\n ] as const;\n const spoken = parts.filter(([n]) => n > 0).map(([n, unit]) => `${n} ${unit}`);\n return spoken.length ? spoken.join(\" \") : \"0 saniye\";\n}\n\nexport type TrendTone = \"good\" | \"bad\" | \"neutral\";\n\n/**\n * Trendin rengi yönden değil ANLAMdan: gelir artışı iyi, maliyet/iade artışı\n * kötü (`goodWhen=\"down\"`). 0 → nötr.\n */\nexport function trendTone(change: number, goodWhen: \"up\" | \"down\"): TrendTone {\n if (change === 0) return \"neutral\";\n const up = change > 0;\n return up === (goodWhen === \"up\") ? \"good\" : \"bad\";\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAEA,SAAgB,WAAW,QAAQ,gBAAgB;AACnD,SAAS,WAAW,WAAW,UAAU,eAAe,kBAAkB,sBAAsB;AAChG,SAAS,UAAU;;;ACDZ,SAAS,YAAY,OAAwB,WAA+B,QAAwB;AACzG,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,SAAO,IAAI,KAAK,aAAa,QAAQ,EAAE,uBAAuB,aAAa,GAAG,uBAAuB,aAAa,GAAG,CAAC,EAAE,OAAO,KAAK;AACtI;AAGO,SAAS,cAAc,OAAuB;AACnD,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,OAAO,UAAU,KAAK,EAAG,QAAO;AAC/D,QAAM,CAAC,EAAE,WAAW,EAAE,IAAI,OAAO,KAAK,EAAE,MAAM,GAAG;AACjD,SAAO,KAAK,IAAI,SAAS,QAAQ,CAAC;AACpC;AAWO,SAAS,cAAc,IAA2B;AACvD,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;AACxC,SAAO;AAAA,IACL,MAAM,KAAK,MAAM,QAAQ,KAAU;AAAA,IACnC,OAAO,KAAK,MAAM,QAAQ,IAAS,IAAI;AAAA,IACvC,SAAS,KAAK,MAAM,QAAQ,GAAM,IAAI;AAAA,IACtC,SAAS,KAAK,MAAM,QAAQ,GAAI,IAAI;AAAA,IACpC,QAAQ,KAAK,MAAM,QAAQ,EAAE,IAAI;AAAA,EACnC;AACF;AAEA,IAAM,MAAM,CAAC,MAAc,OAAO,CAAC,EAAE,SAAS,GAAG,GAAG;AAM7C,SAAS,gBAAgB,IAAY,EAAE,WAAW,KAAK,IAA4B,CAAC,GAAW;AACpG,QAAM,IAAI,cAAc,EAAE;AAC1B,QAAM,QAAQ,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO;AACtD,QAAM,QAAQ,QAAQ,KAAM,YAAY,EAAE,OAAO,IAAK,GAAG,IAAI,KAAK,CAAC,IAAI,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,OAAO,CAAC,KAAK,GAAG,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,OAAO,CAAC;AAC/I,SAAO,YAAY,EAAE,OAAO,IAAI,GAAG,EAAE,IAAI,WAAQ,KAAK,KAAK;AAC7D;AAGO,SAAS,gBAAgB,IAAoB;AAClD,QAAM,IAAI,cAAc,EAAE;AAC1B,QAAM,QAAQ,EAAE,QAAQ,EAAE,OAAO;AACjC,QAAM,OAAO,GAAG,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,MAAM,CAAC;AACjE,SAAO,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK;AAC1C;AAGO,SAAS,eAAe,IAAoB;AACjD,QAAM,IAAI,cAAc,EAAE;AAC1B,QAAM,QAAQ;AAAA,IACZ,CAAC,EAAE,MAAM,QAAK;AAAA,IACd,CAAC,EAAE,OAAO,MAAM;AAAA,IAChB,CAAC,EAAE,SAAS,QAAQ;AAAA,IACpB,CAAC,EAAE,SAAS,QAAQ;AAAA,EACtB;AACA,QAAM,SAAS,MAAM,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,MAAM,GAAG,CAAC,IAAI,IAAI,EAAE;AAC7E,SAAO,OAAO,SAAS,OAAO,KAAK,GAAG,IAAI;AAC5C;AAQO,SAAS,UAAU,QAAgB,UAAoC;AAC5E,MAAI,WAAW,EAAG,QAAO;AACzB,QAAM,KAAK,SAAS;AACpB,SAAO,QAAQ,aAAa,QAAQ,SAAS;AAC/C;;;ADvCE,SAiLE,UAhLA,KADF;AA1BF,IAAM,aAAa,EAAE,IAAI,WAAW,IAAI,YAAY,IAAI,WAAW;AACnE,IAAM,aAAwC;AAAA,EAC5C,MAAM;AAAA,EACN,KAAK;AAAA,EACL,SAAS;AACX;AACA,IAAM,YAAuC,EAAE,MAAM,UAAU,KAAK,WAAW,SAAS,sBAAY;AAmBpG,IAAM,cACJ,qBAAC,SAAI,WAAU,8BACb;AAAA,sBAAC,iBAAc,QAAM,MAAC,OAAM,OAAM,QAAO,WAAU,QAAO,MAAK;AAAA,EAC/D,oBAAC,iBAAc,QAAM,MAAC,OAAM,OAAM,QAAO,UAAS,QAAO,MAAK;AAAA,EAC9D,oBAAC,iBAAc,QAAM,MAAC,OAAM,OAAM,QAAO,WAAU,QAAO,MAAK;AAAA,GACjE;AAWF,SAAS,eAAe,EAAE,OAAO,QAAQ,QAAQ,aAAa,QAAQ,MAAM,UAAU,WAAW,UAAU,YAAY,UAAU,IAAI,GAAyB;AAC5J,QAAM,QAAQ;AACd,SACE,oBAAC,SAAI,WAAW,GAAG,WAAW,SAAS,GAAG,aAAW,YAAY,QAC/D,8BAAC,mBAAgB,IAAI,UAAU,UAAU,aACvC,+BAAC,SAAI,WAAU,+BACZ;AAAA,aAAS,oBAAC,OAAE,WAAU,2BAA2B,iBAAM;AAAA,IACxD,qBAAC,SAAO,GAAG,YAAY,WAAW,GAAG,oGAAoG,WAAW,IAAI,CAAC,GACtJ;AAAA,gBAAU,oBAAC,UAAK,WAAU,4CAA4C,kBAAO;AAAA,MAC9E,oBAAC,UAAK,WAAU,YAAY,UAAS;AAAA,MACpC,UAAU,oBAAC,UAAK,WAAU,4CAA4C,kBAAO;AAAA,OAChF;AAAA,KAGE,UAAU,gBACV,qBAAC,SAAI,WAAU,qBACZ;AAAA;AAAA,MACA,UAAU,eAAe;AAAA,MACzB,eAAe,oBAAC,UAAK,WAAU,mBAAmB,uBAAY;AAAA,OACjE;AAAA,KAEJ,GACF,GACF;AAEJ;AAGA,IAAM,uBAAuB;AAAA,EAC3B,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,MAAM;AACR;AASA,SAAS,MAAM,EAAE,OAAO,QAAQ,SAAS,KAAK,GAAyB;AACrE,QAAM,OAAO,UAAU,MAAM,OAAO,MAAM,YAAY,IAAI;AAC1D,QAAM,KAAK,IAAI,KAAK,aAAa,QAAQ,EAAE,uBAAuB,GAAG,uBAAuB,EAAE,CAAC;AAC/F,QAAM,WAAW,CAAC,MAAe,MAAM,SAAS,WAAW,GAAG,CAAC,UAAU,IAAI,CAAC;AAC9E,QAAM,OAAO,SAAS,GAAG,OAAO,KAAK,IAAI,MAAM,KAAK,CAAC,CAAC;AACtD,QAAM,QAAQ,IAAI,KAAK,aAAa,QAAQ,EAAE,uBAAuB,OAAO,UAAU,MAAM,KAAK,IAAI,IAAI,GAAG,uBAAuB,EAAE,CAAC;AACtI,QAAM,QAAQ,iBAAiB,EAAE,MAAM,QAAQ,KAAK,IAAI,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,SAAS,MAAM,OAAO,CAAC,CAAC,GAAG,MAAM,SAAS,QAAQ,CAAC;AACxI,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,YAA+C;AACnD,MAAI,MAAM,QAAQ,GAAG;AACnB,WAAO;AACP,WAAO;AACP,gBAAY;AAAA,EACd,WAAW,MAAM,QAAQ,GAAG;AAC1B,WAAO;AACP,WAAO;AACP,gBAAY;AAAA,EACd;AACA,SACE,qBAAC,UAAK,WAAW,GAAG,+DAA+D,WAAW,IAAI,CAAC,GAEjG;AAAA,wBAAC,QAAqB,eAAW,MAAC,MAAM,IAAI,WAAW,UAAU,qBAAqB,SAAS,IAAI,UAAxF,SAAmG;AAAA,IAC9G,oBAAC,gBAAa,MAAY,OAAc;AAAA,IAExC,oBAAC,UAAK,WAAU,WACb,gBAAM,UAAU,IAAI,OAAO,GAAG,IAAI,KAAK,UAAU,IAAI,CAAC,IACzD;AAAA,KACF;AAEJ;AAOO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT,OAAO;AAAA,EACP;AAAA,EACA,WAAW;AAAA,EACX,WAAW;AAAA,EACX,iBAAiB;AACnB,GAA6B;AAC3B,QAAM,OAAO,YAAY,OAAO,WAAW,MAAM;AACjD,QAAM,UAAU,YAAY,CAAC;AAE7B,QAAM,WAAW,OAAO,UAAU,WAAY,aAAa,cAAc,KAAK,IAAK;AACnF,QAAM,QAAQ,iBAAiB;AAAA,IAC7B;AAAA,IACA,QAAQ,OAAO,UAAU,WAAW,QAAQ;AAAA,IAC5C,QAAQ,CAAC,MAAM,IAAI,KAAK,aAAa,QAAQ,EAAE,uBAAuB,UAAU,uBAAuB,SAAS,CAAC,EAAE,OAAO,CAAC;AAAA,IAC3H,MAAM;AAAA,IACN,SAAS;AAAA,EACX,CAAC;AACD,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,QAAQ,oBAAC,SAAM,OAAc,QAAgB,SAAkB,MAAM,gBAAgB,IAAK;AAAA,MAClG;AAAA,MACA;AAAA,MACA;AAAA,MAEA,8BAAC,gBAAa,MAAY,OAAc;AAAA;AAAA,EAC1C;AAEJ;AAOA,SAAS,OAAO,YAAoB,UAAU,MAAqB;AACjE,QAAM,CAAC,KAAK,MAAM,IAAI,SAAwB,IAAI;AAClD,YAAU,MAAM;AACd,QAAI,CAAC,QAAS;AACd,WAAO,KAAK,IAAI,CAAC;AACjB,UAAM,QAAQ,YAAY,MAAM,OAAO,KAAK,IAAI,CAAC,GAAG,UAAU;AAC9D,WAAO,MAAM,cAAc,KAAK;AAAA,EAClC,GAAG,CAAC,YAAY,OAAO,CAAC;AACxB,SAAO;AACT;AAOO,SAAS,UAAU,EAAE,OAAO,QAAQ,UAAU,WAAW,MAAM,eAAe,iBAAc,QAAQ,QAAQ,aAAa,OAAO,MAAM,WAAW,WAAW,MAAM,GAA6B;AACpM,QAAM,WAAW,OAAO,WAAW,WAAW,SAAS,OAAO,QAAQ;AACtE,QAAM,MAAM,OAAO,GAAI;AACvB,QAAM,YAAY,QAAQ,OAAO,OAAO,KAAK,IAAI,GAAG,WAAW,GAAG;AAClE,QAAM,WAAW,cAAc;AAC/B,QAAM,cAAc,OAAO,KAAK;AAChC,QAAM,cAAc,OAAO,QAAQ;AACnC,cAAY,UAAU;AAEtB,YAAU,MAAM;AACd,QAAI,YAAY,CAAC,YAAY,SAAS;AACpC,kBAAY,UAAU;AACtB,kBAAY,UAAU;AAAA,IACxB;AACA,QAAI,CAAC,SAAU,aAAY,UAAU;AAAA,EACvC,GAAG,CAAC,QAAQ,CAAC;AAEb,MAAI,UAA2B;AAC/B,MAAI,cAAc,KAAM,WAAU,WAAW,eAAe,gBAAgB,WAAW,EAAE,SAAS,CAAC;AAEnG,SACE,iCACE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,QAAQ,WAAW,SAAY;AAAA,QAC/B,QAAQ,WAAW,SAAY;AAAA,QAC/B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY,EAAE,MAAM,SAAS,cAAc,cAAc,QAAQ,WAAW,SAAY,kBAAe,eAAe,SAAS,CAAC,GAAG;AAAA,QAElI;AAAA;AAAA,IACH;AAAA,IACA,oBAAC,UAAK,MAAK,UAAS,WAAU,WAC3B,sBAAY,OAAO,iBAAiB,WAAW,eAAe,IACjE;AAAA,KACF;AAEJ;AAGO,SAAS,MAAM,EAAE,OAAO,UAAU,cAAc,OAAO,SAAS,SAAS,QAAQ,QAAQ,aAAa,OAAO,MAAM,WAAW,WAAW,MAAM,GAAyB;AAC7K,QAAM,MAAM,OAAO,GAAI;AACvB,QAAM,OAAO,QAAQ,OAAO,OAAO,IAAI,KAAK,GAAG;AAC/C,QAAM,OAAO,OAAO,IAAI,KAAK,eAAe,QAAQ,EAAE,MAAM,WAAW,QAAQ,WAAW,QAAQ,cAAc,YAAY,QAAW,QAAQ,OAAO,SAAS,CAAC,EAAE,OAAO,IAAI,IAAI;AACjL,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAQ;AAAA,MACR,YAAY,EAAE,MAAM,SAAS,UAAU,MAAM,YAAY,EAAE;AAAA,MAE1D;AAAA;AAAA,EACH;AAEJ;AAMO,SAAS,UAAU,EAAE,OAAO,WAAW,MAAM,YAAY,OAAO,QAAQ,QAAQ,QAAQ,aAAa,OAAO,MAAM,WAAW,WAAW,MAAM,GAA6B;AAChL,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,SAAS;AAChD,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,CAAC;AAClC,QAAM,YAAY,OAAsB,YAAY,KAAK,IAAI,IAAI,IAAI;AACrE,QAAM,MAAM,OAAO,IAAI,OAAO;AAC9B,QAAM,UAAU,QAAQ,WAAW,UAAU,YAAY,QAAQ,QAAQ,OAAO,MAAM,UAAU,UAAU;AAC1G,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,EAAE;AAE3C,QAAM,QAAQ,MAAM;AAClB,cAAU,UAAU,KAAK,IAAI;AAC7B,eAAW,IAAI;AACf,gBAAY,EAAE;AAAA,EAChB;AACA,QAAM,QAAQ,MAAM;AAClB,UAAM,QAAQ,QAAQ,UAAU,YAAY,OAAO,IAAI,KAAK,IAAI,IAAI,UAAU;AAC9E,cAAU,UAAU;AACpB,YAAQ,KAAK;AACb,eAAW,KAAK;AAChB,gBAAY,eAAe,eAAe,KAAK,CAAC,EAAE;AAClD,aAAS,KAAK;AAAA,EAChB;AACA,QAAM,QAAQ,MAAM;AAClB,QAAI,WAAW,OAAO,EAAG,UAAS,OAAO;AACzC,cAAU,UAAU,UAAU,KAAK,IAAI,IAAI;AAC3C,YAAQ,CAAC;AACT,gBAAY,2BAAY;AAAA,EAC1B;AAIA,QAAM,kBAAkB,cAAc,oBAAC,UAAK,WAAU,yBAAyB,uBAAY,IAAU;AACrG,QAAM,SAAS,WACb,qBAAC,SAAI,WAAU,mBACZ;AAAA,cACC,oBAAC,UAAO,MAAK,MAAK,SAAQ,WAAU,OAAM,WAAU,MAAM,oBAAC,aAAU,MAAM,IAAI,eAAW,MAAC,GAAI,SAAS,OAAO,UAAU,UAAU,sBAEnI,IAEA,oBAAC,UAAO,MAAK,MAAK,MAAM,oBAAC,YAAS,MAAM,IAAI,eAAW,MAAC,GAAI,SAAS,OAAO,UAAU,UACnF,iBAAO,IAAI,aAAa,eAC3B;AAAA,IAEF,oBAAC,UAAO,MAAK,MAAK,SAAQ,SAAQ,OAAM,WAAU,MAAM,oBAAC,iBAAc,MAAM,IAAI,eAAW,MAAC,GAAI,SAAS,OAAO,UAAU,YAAa,CAAC,WAAW,SAAS,GAAI,+BAEjK;AAAA,KACF,IACE;AAEJ,SACE,iCACE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA,QACE,mBAAmB,SACjB,iCACG;AAAA;AAAA,UACA;AAAA,WACH,IACE;AAAA,QAEN;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY,EAAE,MAAM,QAAQ;AAAA,QAE3B,0BAAgB,OAAO;AAAA;AAAA,IAC1B;AAAA,IACA,oBAAC,UAAK,MAAK,UAAS,WAAU,WAC3B,oBACH;AAAA,KACF;AAEJ;","names":[]}
package/dist/steps.js CHANGED
@@ -2,18 +2,18 @@
2
2
 
3
3
  import {
4
4
  Button
5
- } from "./chunk-2IEXY3OZ.js";
6
- import "./chunk-FFXRFQSU.js";
5
+ } from "./chunk-CVKAGR3D.js";
6
+ import "./chunk-POBOJBNJ.js";
7
7
  import {
8
8
  bgSolidClass,
9
9
  bgSubtleClass,
10
10
  borderStrongColorClass,
11
11
  textClass,
12
12
  textSolidContrastClass
13
- } from "./chunk-IP2J3BWY.js";
13
+ } from "./chunk-6AMBZXZJ.js";
14
14
  import {
15
15
  skeletonFill
16
- } from "./chunk-54HHEXXD.js";
16
+ } from "./chunk-VKN374SD.js";
17
17
 
18
18
  // src/steps/Steps.tsx
19
19
  import { useEffect, useRef, useState } from "react";
package/dist/steps.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/steps/Steps.tsx","../src/steps/utils.ts","../src/steps/_components/StepsContent.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { CheckIcon, XIcon } from \"lucide-react\";\nimport { cn, type ColorRole } from \"@mari-ui/core\";\nimport { Button } from \"../button\";\nimport { skeletonFill } from \"../lib/skeleton\";\nimport type { StepItem, StepStatus, StepsProps, StepsSize } from \"./types\";\nimport {\n getDotClass,\n getIndicatorClass,\n getRailClass,\n getStepNumber,\n getTitleClass,\n resolveStepStatus,\n statusLabel,\n} from \"./utils\";\n\nexport type { StepsProps };\n\n/**\n * Faz 13.6 — yapı ant.design v6 Steps'ten, görünüm kendi token'larımızdan:\n * 32px (sm: 24px) daire gösterge, yatayda başlığın hemen yanından bir\n * sonraki adıma uzanan ince çizgi, dört durum (wait/process/finish/error),\n * filled/outlined, başlık-altı yerleşim, nokta, ilerleme halkası.\n *\n * Eski sürümde: gösterge dairesi yoktu (çıplak ikonlar), tamamlanan adım\n * sadece bazı modlarda tik gösteriyordu, çizgi başlığın altından geçiyordu,\n * dikey modda her adım arası sabit `min-h-32` boşluk vardı ve aktif adım\n * `scale-105` ile büyütülüp komşularını itiyordu.\n *\n * `\"use client\"`: `responsive` bir ResizeObserver kullanıyor.\n */\n\nconst indicatorSizeClass: Record<StepsSize, string> = {\n sm: \"size-6 text-xs\",\n md: \"size-8 text-sm\",\n};\nconst iconPx: Record<StepsSize, number> = { sm: 12, md: 16 };\nconst indicatorPx: Record<StepsSize, number> = { sm: 24, md: 32 };\nconst headerHeightClass: Record<StepsSize, string> = { sm: \"min-h-6\", md: \"min-h-8\" };\nconst titleSizeClass: Record<StepsSize, string> = { sm: \"text-sm\", md: \"text-base\" };\nconst descSizeClass: Record<StepsSize, string> = { sm: \"text-xs\", md: \"text-sm\" };\n\n// Tailwind derleme-zamanı tarayıcısı için literal tablo (bkz. lib/colorClasses).\nconst groupHoverTitleClass: Record<ColorRole, string> = {\n primary: \"group-hover:text-mari-primary\",\n accent: \"group-hover:text-mari-accent\",\n success: \"group-hover:text-mari-success\",\n error: \"group-hover:text-mari-error\",\n warning: \"group-hover:text-mari-warning\",\n info: \"group-hover:text-mari-info\",\n neutral: \"group-hover:text-mari-neutral\",\n};\n\ntype StepsLayout = \"inline\" | \"stacked\" | \"vertical\" | \"compact\";\n\n/**\n * İskelette metin: kendi satır kutusunda dolgu, harfler görünmez — başlığın/\n * açıklamanın gerçek genişliğini ve satır kırılmasını korur (sıfır zıplama).\n * `box-decoration-clone`: çok satırlı açıklamada her satır ayrı yuvarlanır.\n */\nconst skeletonTextClass = cn(\"rounded-sm text-transparent box-decoration-clone\", skeletonFill(true));\n/** İskelette gösterge: aynı daire, durum rengi/kenarlığı yok, içerik görünmez. */\nconst skeletonIndicatorClass = cn(\"border-transparent text-transparent [&_svg]:invisible\", skeletonFill(true));\n\n/**\n * inline: başlık göstergenin yanında; stacked: altında ortalı; vertical:\n * dikey liste; compact: dar ekranda sadece göstergeler + altta geçerli adımın\n * başlığı (\"Adım 2/4 · Teslimat\").\n */\nfunction resolveLayout(\n vertical: boolean,\n isNarrow: boolean,\n responsiveLayout: StepsProps[\"responsiveLayout\"],\n dot: boolean,\n labelPlacement: StepsProps[\"labelPlacement\"]\n): StepsLayout {\n if (vertical) return \"vertical\";\n if (isNarrow) return responsiveLayout === \"compact\" ? \"compact\" : \"vertical\";\n if (dot || labelPlacement === \"vertical\") return \"stacked\";\n return \"inline\";\n}\n\n/** Dairenin içi: hata → ×, tamamlandı → ✓ (özel ikon yoksa), yoksa ikon ya da numara. */\nfunction renderGlyph(item: StepItem, index: number, status: StepStatus, size: number): React.ReactNode {\n if (status === \"error\") return <XIcon size={size} strokeWidth={2.5} />;\n const Icon = item.icon;\n if (Icon) return <Icon size={size} />;\n if (status === \"finish\") return <CheckIcon size={size} strokeWidth={2.5} />;\n return getStepNumber(item, index);\n}\n\n/** Kapsayıcı genişliğini izler — `responsive` için. SSR'da `undefined`. */\nfunction useContainerWidth(enabled: boolean) {\n const ref = useRef<HTMLDivElement>(null);\n const [width, setWidth] = useState<number>();\n useEffect(() => {\n const el = ref.current;\n if (!enabled || !el || typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(([entry]) => entry && setWidth(entry.contentRect.width));\n observer.observe(el);\n return () => observer.disconnect();\n }, [enabled]);\n return [ref, width] as const;\n}\n\nexport function Steps({\n data,\n currentStep,\n status: currentStatus = \"process\",\n onChange,\n onComplete,\n showActions,\n color = \"primary\",\n variant = \"filled\",\n size = \"md\",\n vertical = false,\n labelPlacement = \"horizontal\",\n dot = false,\n percent,\n responsive = 520,\n responsiveLayout = \"vertical\",\n content,\n className,\n \"aria-label\": ariaLabel = \"İlerleme adımları\",\n skeleton = false,\n}: Readonly<StepsProps>) {\n const [rootRef, width] = useContainerWidth(!vertical && responsive !== false);\n const isNarrow = responsive !== false && width !== undefined && width < responsive;\n const layout = resolveLayout(vertical, isNarrow, responsiveLayout, dot, labelPlacement);\n\n const isInteractive = Boolean(onChange);\n const actionsVisible = showActions ?? isInteractive;\n const stepNumbers = data.map(getStepNumber);\n const lastStep = stepNumbers[stepNumbers.length - 1];\n const isLastStep = currentStep === lastStep;\n const isFirstStep = currentStep === stepNumbers[0];\n\n const renderIndicator = (item: StepItem, index: number, status: StepStatus) => {\n if (dot) {\n return (\n <span aria-hidden className={cn(\"flex shrink-0 items-center justify-center\", layout === \"stacked\" ? \"w-full\" : \"w-3\", headerHeightClass[size])}>\n <span\n className={cn(\n \"rounded-full transition-[background-color,transform] duration-200 motion-reduce:transition-none\",\n status === \"process\" || status === \"error\" ? \"size-2.5\" : \"size-2\",\n skeleton ? skeletonFill(true) : getDotClass(status, color)\n )}\n />\n </span>\n );\n }\n\n const glyph = renderGlyph(item, index, status, iconPx[size]);\n\n const hasRing = status === \"process\" && percent !== undefined;\n // İskelette halka çizilmez ama payı (`mx-1`) korunur — yüklenince kaymasın.\n const showRing = hasRing && !skeleton;\n // Halka ile daire arasında ~3px boşluk (ant.design ile aynı his).\n const ringSize = indicatorPx[size] + 10;\n const radius = ringSize / 2 - 1;\n const circumference = 2 * Math.PI * radius;\n const clamped = Math.min(100, Math.max(0, percent ?? 0));\n\n return (\n // Gösterge ekran okuyucudan gizli: sıra `<ol>`'dan, durum başlıktaki\n // sr-only ekten gelir — aksi halde ad \"3 Onay\" gibi okunuyordu.\n <span\n aria-hidden\n className={cn(\n \"relative inline-flex shrink-0 items-center justify-center rounded-full border font-semibold tabular-nums\",\n \"transition-colors duration-200 motion-reduce:transition-none\",\n indicatorSizeClass[size],\n skeleton ? skeletonIndicatorClass : getIndicatorClass(status, color, variant),\n // Halka 5px taşar — komşu çizgi/başlıkla çakışmasın.\n hasRing && \"mx-1\"\n )}\n >\n {glyph}\n {showRing && (\n <svg\n className=\"pointer-events-none absolute -rotate-90\"\n width={ringSize}\n height={ringSize}\n viewBox={`0 0 ${ringSize} ${ringSize}`}\n aria-hidden\n >\n <circle cx={ringSize / 2} cy={ringSize / 2} r={radius} fill=\"none\" strokeWidth={2} className=\"stroke-mari-border\" />\n <circle\n cx={ringSize / 2}\n cy={ringSize / 2}\n r={radius}\n fill=\"none\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={circumference * (1 - clamped / 100)}\n className={cn(ringStrokeClass[color], \"transition-[stroke-dashoffset] duration-300 motion-reduce:transition-none\")}\n />\n </svg>\n )}\n </span>\n );\n };\n\n // Kompakt modda geçerli adımın görünür özeti. Ekran okuyucu aynı bilgiyi\n // listeden (`aria-current` + sr-only başlıklar) aldığı için aria-hidden.\n const renderCompactCaption = () => {\n const index = stepNumbers.indexOf(currentStep);\n const item = data[index];\n if (!item) return null;\n const status = resolveStepStatus(item, index, currentStep, currentStatus);\n return (\n <div aria-hidden className=\"-mt-3 flex flex-col gap-0.5\">\n <p className={cn(\"flex flex-wrap items-baseline gap-x-2\", titleSizeClass[size])}>\n <span className={cn(\"text-mari-muted\", descSizeClass[size], skeleton && skeletonTextClass)}>\n Adım {index + 1}/{data.length}\n </span>\n <span className={cn(getTitleClass(status), skeleton && skeletonTextClass)}>{item.title}</span>\n {item.subTitle && <span className={cn(\"text-mari-muted\", descSizeClass[size], skeleton && skeletonTextClass)}>{item.subTitle}</span>}\n </p>\n {item.description && (\n <p className={cn(\"text-mari-muted\", descSizeClass[size])}>\n <span className={cn(skeleton && skeletonTextClass)}>{item.description}</span>\n </p>\n )}\n </div>\n );\n };\n\n const renderText = (item: StepItem, status: StepStatus, isCurrent: boolean, withRail: React.ReactNode) => (\n <span className={cn(\"flex min-w-0 flex-col\", layout === \"stacked\" ? \"items-center text-center\" : \"flex-1\")}>\n <span className={cn(\"flex min-w-0 items-center gap-2\", layout !== \"stacked\" && headerHeightClass[size])}>\n <span\n className={cn(\n \"leading-snug transition-colors motion-reduce:transition-none\",\n layout === \"inline\" && \"whitespace-nowrap\",\n titleSizeClass[size],\n getTitleClass(status),\n isInteractive && !item.disabled && !isCurrent && groupHoverTitleClass[color],\n skeleton && skeletonTextClass\n )}\n >\n {item.title}\n <span className=\"sr-only\">\n {\" \"}\n ({statusLabel[status]}\n {status === \"process\" && percent !== undefined ? `, %${Math.round(percent)}` : \"\"})\n </span>\n </span>\n {item.subTitle && <span className={cn(\"whitespace-nowrap text-mari-muted\", descSizeClass[size], skeleton && skeletonTextClass)}>{item.subTitle}</span>}\n {withRail}\n </span>\n {item.description && (\n // Bekleyen adımda da tam `muted`: `/80` açık zeminde 4.5:1'in altına düşüyordu (axe color-contrast).\n <span className={cn(\"mt-0.5 leading-relaxed text-mari-muted\", descSizeClass[size])}>\n {/* Dolgu iç `<span>`de: satır satır sarılsın (blok kutunun tamamı değil). */}\n <span className={cn(skeleton && skeletonTextClass)}>{item.description}</span>\n </span>\n )}\n </span>\n );\n\n /** Her yerleşimin ortak girdileri — `renderItem` yerleşim başına ayrı fonksiyonlara dağıtır (tek dev fonksiyon 38 karmaşıklıktaydı). */\n const itemContext = (item: StepItem, index: number) => {\n const step = getStepNumber(item, index);\n const status = resolveStepStatus(item, index, currentStep, currentStatus);\n const isCurrent = step === currentStep;\n const clickable = isInteractive && !item.disabled && !skeleton;\n return {\n item,\n index,\n step,\n status,\n isCurrent,\n isLast: index === data.length - 1,\n liCurrent: !isInteractive && isCurrent ? (\"step\" as const) : undefined,\n // İskelette çizgiler durum rengini taşımaz (henüz durum yok).\n railClass: cn(\"rounded-full transition-colors duration-200 motion-reduce:transition-none\", skeleton ? \"bg-mari-border\" : getRailClass(status, color)),\n // Etkileşimli ise gerçek <button> — Enter/Space/Tab tarayıcıdan gelir.\n Wrapper: (isInteractive ? \"button\" : \"div\") as \"button\" | \"div\",\n wrapperProps: isInteractive\n ? {\n type: \"button\" as const,\n disabled: item.disabled,\n tabIndex: skeleton ? -1 : undefined,\n \"aria-current\": isCurrent ? (\"step\" as const) : undefined,\n onClick: () => !skeleton && step !== currentStep && onChange?.(step),\n }\n : {},\n interactiveClass: cn(\n \"group rounded-md text-left\",\n clickable && \"cursor-pointer\",\n item.disabled && \"cursor-not-allowed opacity-50\",\n skeleton && \"pointer-events-none\",\n isInteractive && \"focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-mari-ring\"\n ),\n };\n };\n type ItemContext = ReturnType<typeof itemContext>;\n\n const renderCompactItem = ({ item, index, step, status, isLast, liCurrent, railClass, Wrapper, wrapperProps, interactiveClass }: ItemContext) => (\n <li key={step} aria-current={liCurrent} className={cn(\"flex min-w-0 items-center\", isLast ? \"flex-none\" : \"flex-1\")}>\n {/* Başlık görünmez ama erişilebilir ad olarak kalır. Dokunma hedefi\n için gösterge etrafında 6px pay (32px → 44px). */}\n <Wrapper {...wrapperProps} className={cn(interactiveClass, \"-m-1.5 shrink-0 rounded-full p-1.5\")}>\n {renderIndicator(item, index, status)}\n <span className=\"sr-only\">\n {item.title} ({statusLabel[status]})\n </span>\n </Wrapper>\n {!isLast && <span aria-hidden className={cn(\"mx-3 h-px min-w-3 flex-1\", railClass)} />}\n </li>\n );\n\n const renderVerticalItem = ({ item, index, step, status, isCurrent, isLast, liCurrent, railClass, Wrapper, wrapperProps, interactiveClass }: ItemContext) => (\n <li key={step} aria-current={liCurrent} className=\"flex\">\n <Wrapper {...wrapperProps} className={cn(interactiveClass, \"flex w-full gap-3\")}>\n <span className=\"flex flex-col items-center\">\n {renderIndicator(item, index, status)}\n {!isLast && <span className={cn(\"my-1.5 w-px min-h-6 flex-1\", dot && \"w-0.5\", railClass)} />}\n </span>\n <span className={cn(\"flex min-w-0 flex-1\", !isLast && (size === \"sm\" ? \"pb-4\" : \"pb-6\"))}>{renderText(item, status, isCurrent, null)}</span>\n </Wrapper>\n </li>\n );\n\n const renderStackedItem = ({ item, index, step, status, isCurrent, isLast, liCurrent, railClass, Wrapper, wrapperProps, interactiveClass }: ItemContext) => {\n const half = dot ? 5 : indicatorPx[size] / 2;\n const gap = dot ? 12 : 8;\n return (\n <li key={step} aria-current={liCurrent} className=\"relative min-w-0 flex-1\">\n {!isLast && (\n <span\n aria-hidden\n className={cn(\"absolute\", dot ? \"h-0.5\" : \"h-px\", railClass)}\n style={{\n top: indicatorPx[size] / 2 - (dot ? 1 : 0.5),\n left: `calc(50% + ${half + gap}px)`,\n width: `calc(100% - ${2 * (half + gap)}px)`,\n }}\n />\n )}\n <Wrapper {...wrapperProps} className={cn(interactiveClass, \"flex w-full flex-col items-center gap-2 px-2\")}>\n {renderIndicator(item, index, status)}\n {renderText(item, status, isCurrent, null)}\n </Wrapper>\n </li>\n );\n };\n\n const renderInlineItem = ({ item, index, step, status, isCurrent, isLast, liCurrent, railClass, Wrapper, wrapperProps, interactiveClass }: ItemContext) => (\n <li key={step} aria-current={liCurrent} className={cn(\"flex min-w-0\", isLast ? \"flex-none\" : \"flex-1\")}>\n <Wrapper {...wrapperProps} className={cn(interactiveClass, \"flex min-w-0 flex-1 items-start gap-3\")}>\n {renderIndicator(item, index, status)}\n {renderText(item, status, isCurrent, !isLast && <span aria-hidden className={cn(\"ml-1 mr-3 h-px min-w-6 flex-1\", railClass)} />)}\n </Wrapper>\n </li>\n );\n\n const layoutRenderer: Record<StepsLayout, (context: ItemContext) => React.ReactNode> = {\n compact: renderCompactItem,\n vertical: renderVerticalItem,\n stacked: renderStackedItem,\n inline: renderInlineItem,\n };\n const renderItem = (item: StepItem, index: number) => layoutRenderer[layout](itemContext(item, index));\n\n return (\n <div ref={rootRef} aria-busy={skeleton || undefined} className={cn(\"flex w-full flex-col gap-6\", className)}>\n <ol aria-label={ariaLabel} aria-hidden={skeleton || undefined} className={cn(\"flex w-full\", layout === \"vertical\" ? \"flex-col\" : \"flex-row items-start\")}>\n {data.map(renderItem)}\n </ol>\n {layout === \"compact\" && renderCompactCaption()}\n {content}\n {onChange && actionsVisible && (\n <div className=\"flex justify-between gap-4 border-t border-mari-border pt-6\">\n <Button skeleton={skeleton} color=\"neutral\" variant=\"outline\" disabled={isFirstStep} onClick={() => onChange(currentStep - 1)}>\n Geri\n </Button>\n {isLastStep ? (\n <Button skeleton={skeleton} color={color} disabled={!onComplete} onClick={onComplete}>\n Tamamla\n </Button>\n ) : (\n <Button skeleton={skeleton} color={color} onClick={() => onChange(currentStep + 1)}>\n İleri\n </Button>\n )}\n </div>\n )}\n </div>\n );\n}\n\nconst ringStrokeClass: Record<ColorRole, string> = {\n primary: \"stroke-mari-primary\",\n accent: \"stroke-mari-accent\",\n success: \"stroke-mari-success\",\n error: \"stroke-mari-error\",\n warning: \"stroke-mari-warning\",\n info: \"stroke-mari-info\",\n neutral: \"stroke-mari-neutral\",\n};\n","import { cn, type ColorRole } from \"@mari-ui/core\";\nimport {\n bgSolidClass,\n bgSubtleClass,\n borderStrongColorClass,\n textClass,\n textSolidContrastClass,\n} from \"../lib/colorClasses\";\nimport type { StepItem, StepStatus, StepsVariant } from \"./types\";\n\nexport function getStepNumber(item: StepItem, index: number): number {\n return item.step ?? index + 1;\n}\n\n/**\n * Adımın durumu: elle verilen `item.status` her zaman kazanır; yoksa\n * `currentStep`'e göre türetilir. Geçerli adımın durumu Steps'in `status`\n * prop'undan gelir (ör. `\"error\"`).\n */\nexport function resolveStepStatus(\n item: StepItem,\n index: number,\n currentStep: number,\n currentStatus: Exclude<StepStatus, \"wait\">\n): StepStatus {\n if (item.status) return item.status;\n const step = getStepNumber(item, index);\n if (step < currentStep) return \"finish\";\n if (step === currentStep) return currentStatus;\n return \"wait\";\n}\n\n/**\n * Gösterge dairesinin renkleri. Yapı ant.design v6'dan (filled: tamamlanan\n * = tonlu, geçerli = dolu, bekleyen = nötr tonlu; outlined: hepsi çerçeveli),\n * renkler kendi token'larımızdan. Hata her zaman `error` rolüyle çizilir.\n */\nexport function getIndicatorClass(status: StepStatus, color: ColorRole, variant: StepsVariant): string {\n const role: ColorRole = status === \"error\" ? \"error\" : color;\n if (variant === \"outlined\") {\n switch (status) {\n case \"process\":\n return cn(bgSubtleClass[role], borderStrongColorClass[role], textClass[role]);\n case \"finish\":\n case \"error\":\n return cn(\"bg-mari-surface\", borderStrongColorClass[role], textClass[role]);\n default:\n return \"bg-mari-surface border-mari-border text-mari-muted\";\n }\n }\n switch (status) {\n case \"process\":\n case \"error\":\n return cn(\"border-transparent\", bgSolidClass[role], textSolidContrastClass[role]);\n case \"finish\":\n return cn(\"border-transparent\", bgSubtleClass[role], textClass[role]);\n default:\n return \"border-transparent bg-mari-neutral-subtle text-mari-muted\";\n }\n}\n\nexport function getDotClass(status: StepStatus, color: ColorRole): string {\n if (status === \"wait\") return \"bg-mari-border\";\n return bgSolidClass[status === \"error\" ? \"error\" : color];\n}\n\nexport function getTitleClass(status: StepStatus): string {\n switch (status) {\n case \"process\":\n return \"text-mari-foreground font-semibold\";\n case \"finish\":\n return \"text-mari-foreground\";\n case \"error\":\n return \"text-mari-error font-medium\";\n default:\n return \"text-mari-muted\";\n }\n}\n\n/**\n * Bir adımdan sonrakine uzanan çizgi, SONRAKİ adıma varılmışsa renklidir\n * (yani bu adım tamamlanmışsa) — ant.design ile aynı.\n */\nexport function getRailClass(status: StepStatus, color: ColorRole): string {\n return status === \"finish\" ? bgSolidClass[color] : \"bg-mari-border\";\n}\n\n/** Ekran okuyucu için durum eki — renk/ikon tek başına anlam taşımasın. */\nexport const statusLabel: Record<StepStatus, string> = {\n wait: \"bekliyor\",\n process: \"devam ediyor\",\n finish: \"tamamlandı\",\n error: \"hata\",\n};\n","import React from \"react\";\nimport { cn } from \"@mari-ui/core\";\n\nexport interface StepsContentProps {\n value: number;\n currentSteps: number;\n children: React.ReactNode;\n className?: string;\n}\n\n/**\n * Faz 13.5 kullanıcı bulgusu: eskiden `border-dashed` + `bg-mari-primary-subtle`\n * + `w-fit` taşıyordu — bir WIREFRAME/DEBUG yer tutucusu gibi görünüyordu,\n * gerçek bir uygulamada kullanılabilecek bir içerik kutusu gibi değil.\n * İçerik keyfi olduğundan (bir form, özet, herhangi bir şey olabilir) artık\n * hiçbir görsel kutu dayatmıyor — sadece tam genişlik + Steps'in gösterge\n * satırından ayrışsın diye üst boşluk sağlıyor.\n *\n * Hook yok, browser API yok — saf sunum, \"use client\" gerekmiyor.\n */\nexport function StepsContent({ value, currentSteps, children, className }: StepsContentProps) {\n return currentSteps === value && <div className={cn(\"w-full\", className)} data-value={value}>{children}</div>;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAEA,SAAgB,WAAW,QAAQ,gBAAgB;AACnD,SAAS,WAAW,aAAa;AACjC,SAAS,MAAAA,WAA0B;;;ACJnC,SAAS,UAA0B;AAU5B,SAAS,cAAc,MAAgB,OAAuB;AACnE,SAAO,KAAK,QAAQ,QAAQ;AAC9B;AAOO,SAAS,kBACd,MACA,OACA,aACA,eACY;AACZ,MAAI,KAAK,OAAQ,QAAO,KAAK;AAC7B,QAAM,OAAO,cAAc,MAAM,KAAK;AACtC,MAAI,OAAO,YAAa,QAAO;AAC/B,MAAI,SAAS,YAAa,QAAO;AACjC,SAAO;AACT;AAOO,SAAS,kBAAkB,QAAoB,OAAkB,SAA+B;AACrG,QAAM,OAAkB,WAAW,UAAU,UAAU;AACvD,MAAI,YAAY,YAAY;AAC1B,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH,eAAO,GAAG,cAAc,IAAI,GAAG,uBAAuB,IAAI,GAAG,UAAU,IAAI,CAAC;AAAA,MAC9E,KAAK;AAAA,MACL,KAAK;AACH,eAAO,GAAG,mBAAmB,uBAAuB,IAAI,GAAG,UAAU,IAAI,CAAC;AAAA,MAC5E;AACE,eAAO;AAAA,IACX;AAAA,EACF;AACA,UAAQ,QAAQ;AAAA,IACd,KAAK;AAAA,IACL,KAAK;AACH,aAAO,GAAG,sBAAsB,aAAa,IAAI,GAAG,uBAAuB,IAAI,CAAC;AAAA,IAClF,KAAK;AACH,aAAO,GAAG,sBAAsB,cAAc,IAAI,GAAG,UAAU,IAAI,CAAC;AAAA,IACtE;AACE,aAAO;AAAA,EACX;AACF;AAEO,SAAS,YAAY,QAAoB,OAA0B;AACxE,MAAI,WAAW,OAAQ,QAAO;AAC9B,SAAO,aAAa,WAAW,UAAU,UAAU,KAAK;AAC1D;AAEO,SAAS,cAAc,QAA4B;AACxD,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAMO,SAAS,aAAa,QAAoB,OAA0B;AACzE,SAAO,WAAW,WAAW,aAAa,KAAK,IAAI;AACrD;AAGO,IAAM,cAA0C;AAAA,EACrD,MAAM;AAAA,EACN,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,OAAO;AACT;;;ADPiC,cA+FvB,YA/FuB;AApDjC,IAAM,qBAAgD;AAAA,EACpD,IAAI;AAAA,EACJ,IAAI;AACN;AACA,IAAM,SAAoC,EAAE,IAAI,IAAI,IAAI,GAAG;AAC3D,IAAM,cAAyC,EAAE,IAAI,IAAI,IAAI,GAAG;AAChE,IAAM,oBAA+C,EAAE,IAAI,WAAW,IAAI,UAAU;AACpF,IAAM,iBAA4C,EAAE,IAAI,WAAW,IAAI,YAAY;AACnF,IAAM,gBAA2C,EAAE,IAAI,WAAW,IAAI,UAAU;AAGhF,IAAM,uBAAkD;AAAA,EACtD,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AAAA,EACN,SAAS;AACX;AASA,IAAM,oBAAoBC,IAAG,oDAAoD,aAAa,IAAI,CAAC;AAEnG,IAAM,yBAAyBA,IAAG,yDAAyD,aAAa,IAAI,CAAC;AAO7G,SAAS,cACP,UACA,UACA,kBACA,KACA,gBACa;AACb,MAAI,SAAU,QAAO;AACrB,MAAI,SAAU,QAAO,qBAAqB,YAAY,YAAY;AAClE,MAAI,OAAO,mBAAmB,WAAY,QAAO;AACjD,SAAO;AACT;AAGA,SAAS,YAAY,MAAgB,OAAe,QAAoB,MAA+B;AACrG,MAAI,WAAW,QAAS,QAAO,oBAAC,SAAM,MAAY,aAAa,KAAK;AACpE,QAAM,OAAO,KAAK;AAClB,MAAI,KAAM,QAAO,oBAAC,QAAK,MAAY;AACnC,MAAI,WAAW,SAAU,QAAO,oBAAC,aAAU,MAAY,aAAa,KAAK;AACzE,SAAO,cAAc,MAAM,KAAK;AAClC;AAGA,SAAS,kBAAkB,SAAkB;AAC3C,QAAM,MAAM,OAAuB,IAAI;AACvC,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAiB;AAC3C,YAAU,MAAM;AACd,UAAM,KAAK,IAAI;AACf,QAAI,CAAC,WAAW,CAAC,MAAM,OAAO,mBAAmB,YAAa;AAC9D,UAAM,WAAW,IAAI,eAAe,CAAC,CAAC,KAAK,MAAM,SAAS,SAAS,MAAM,YAAY,KAAK,CAAC;AAC3F,aAAS,QAAQ,EAAE;AACnB,WAAO,MAAM,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,OAAO,CAAC;AACZ,SAAO,CAAC,KAAK,KAAK;AACpB;AAEO,SAAS,MAAM;AAAA,EACpB;AAAA,EACA;AAAA,EACA,QAAQ,gBAAgB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO;AAAA,EACP,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,MAAM;AAAA,EACN;AAAA,EACA,aAAa;AAAA,EACb,mBAAmB;AAAA,EACnB;AAAA,EACA;AAAA,EACA,cAAc,YAAY;AAAA,EAC1B,WAAW;AACb,GAAyB;AACvB,QAAM,CAAC,SAAS,KAAK,IAAI,kBAAkB,CAAC,YAAY,eAAe,KAAK;AAC5E,QAAM,WAAW,eAAe,SAAS,UAAU,UAAa,QAAQ;AACxE,QAAM,SAAS,cAAc,UAAU,UAAU,kBAAkB,KAAK,cAAc;AAEtF,QAAM,gBAAgB,QAAQ,QAAQ;AACtC,QAAM,iBAAiB,eAAe;AACtC,QAAM,cAAc,KAAK,IAAI,aAAa;AAC1C,QAAM,WAAW,YAAY,YAAY,SAAS,CAAC;AACnD,QAAM,aAAa,gBAAgB;AACnC,QAAM,cAAc,gBAAgB,YAAY,CAAC;AAEjD,QAAM,kBAAkB,CAAC,MAAgB,OAAe,WAAuB;AAC7E,QAAI,KAAK;AACP,aACE,oBAAC,UAAK,eAAW,MAAC,WAAWA,IAAG,6CAA6C,WAAW,YAAY,WAAW,OAAO,kBAAkB,IAAI,CAAC,GAC3I;AAAA,QAAC;AAAA;AAAA,UACC,WAAWA;AAAA,YACT;AAAA,YACA,WAAW,aAAa,WAAW,UAAU,aAAa;AAAA,YAC1D,WAAW,aAAa,IAAI,IAAI,YAAY,QAAQ,KAAK;AAAA,UAC3D;AAAA;AAAA,MACF,GACF;AAAA,IAEJ;AAEA,UAAM,QAAQ,YAAY,MAAM,OAAO,QAAQ,OAAO,IAAI,CAAC;AAE3D,UAAM,UAAU,WAAW,aAAa,YAAY;AAEpD,UAAM,WAAW,WAAW,CAAC;AAE7B,UAAM,WAAW,YAAY,IAAI,IAAI;AACrC,UAAM,SAAS,WAAW,IAAI;AAC9B,UAAM,gBAAgB,IAAI,KAAK,KAAK;AACpC,UAAM,UAAU,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,WAAW,CAAC,CAAC;AAEvD;AAAA;AAAA;AAAA,MAGE;AAAA,QAAC;AAAA;AAAA,UACC,eAAW;AAAA,UACX,WAAWA;AAAA,YACT;AAAA,YACA;AAAA,YACA,mBAAmB,IAAI;AAAA,YACvB,WAAW,yBAAyB,kBAAkB,QAAQ,OAAO,OAAO;AAAA;AAAA,YAE5E,WAAW;AAAA,UACb;AAAA,UAEC;AAAA;AAAA,YACA,YACC;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,SAAS,OAAO,QAAQ,IAAI,QAAQ;AAAA,gBACpC,eAAW;AAAA,gBAEX;AAAA,sCAAC,YAAO,IAAI,WAAW,GAAG,IAAI,WAAW,GAAG,GAAG,QAAQ,MAAK,QAAO,aAAa,GAAG,WAAU,sBAAqB;AAAA,kBAClH;AAAA,oBAAC;AAAA;AAAA,sBACC,IAAI,WAAW;AAAA,sBACf,IAAI,WAAW;AAAA,sBACf,GAAG;AAAA,sBACH,MAAK;AAAA,sBACL,aAAa;AAAA,sBACb,eAAc;AAAA,sBACd,iBAAiB;AAAA,sBACjB,kBAAkB,iBAAiB,IAAI,UAAU;AAAA,sBACjD,WAAWA,IAAG,gBAAgB,KAAK,GAAG,2EAA2E;AAAA;AAAA,kBACnH;AAAA;AAAA;AAAA,YACF;AAAA;AAAA;AAAA,MAEJ;AAAA;AAAA,EAEJ;AAIA,QAAM,uBAAuB,MAAM;AACjC,UAAM,QAAQ,YAAY,QAAQ,WAAW;AAC7C,UAAM,OAAO,KAAK,KAAK;AACvB,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,SAAS,kBAAkB,MAAM,OAAO,aAAa,aAAa;AACxE,WACE,qBAAC,SAAI,eAAW,MAAC,WAAU,+BACzB;AAAA,2BAAC,OAAE,WAAWA,IAAG,yCAAyC,eAAe,IAAI,CAAC,GAC5E;AAAA,6BAAC,UAAK,WAAWA,IAAG,mBAAmB,cAAc,IAAI,GAAG,YAAY,iBAAiB,GAAG;AAAA;AAAA,UACpF,QAAQ;AAAA,UAAE;AAAA,UAAE,KAAK;AAAA,WACzB;AAAA,QACA,oBAAC,UAAK,WAAWA,IAAG,cAAc,MAAM,GAAG,YAAY,iBAAiB,GAAI,eAAK,OAAM;AAAA,QACtF,KAAK,YAAY,oBAAC,UAAK,WAAWA,IAAG,mBAAmB,cAAc,IAAI,GAAG,YAAY,iBAAiB,GAAI,eAAK,UAAS;AAAA,SAC/H;AAAA,MACC,KAAK,eACJ,oBAAC,OAAE,WAAWA,IAAG,mBAAmB,cAAc,IAAI,CAAC,GACrD,8BAAC,UAAK,WAAWA,IAAG,YAAY,iBAAiB,GAAI,eAAK,aAAY,GACxE;AAAA,OAEJ;AAAA,EAEJ;AAEA,QAAM,aAAa,CAAC,MAAgB,QAAoB,WAAoB,aAC1E,qBAAC,UAAK,WAAWA,IAAG,yBAAyB,WAAW,YAAY,6BAA6B,QAAQ,GACvG;AAAA,yBAAC,UAAK,WAAWA,IAAG,mCAAmC,WAAW,aAAa,kBAAkB,IAAI,CAAC,GACpG;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAWA;AAAA,YACT;AAAA,YACA,WAAW,YAAY;AAAA,YACvB,eAAe,IAAI;AAAA,YACnB,cAAc,MAAM;AAAA,YACpB,iBAAiB,CAAC,KAAK,YAAY,CAAC,aAAa,qBAAqB,KAAK;AAAA,YAC3E,YAAY;AAAA,UACd;AAAA,UAEC;AAAA,iBAAK;AAAA,YACN,qBAAC,UAAK,WAAU,WACb;AAAA;AAAA,cAAI;AAAA,cACH,YAAY,MAAM;AAAA,cACnB,WAAW,aAAa,YAAY,SAAY,MAAM,KAAK,MAAM,OAAO,CAAC,KAAK;AAAA,cAAG;AAAA,eACpF;AAAA;AAAA;AAAA,MACF;AAAA,MACC,KAAK,YAAY,oBAAC,UAAK,WAAWA,IAAG,qCAAqC,cAAc,IAAI,GAAG,YAAY,iBAAiB,GAAI,eAAK,UAAS;AAAA,MAC9I;AAAA,OACH;AAAA,IACC,KAAK;AAAA,IAEJ,oBAAC,UAAK,WAAWA,IAAG,0CAA0C,cAAc,IAAI,CAAC,GAE/E,8BAAC,UAAK,WAAWA,IAAG,YAAY,iBAAiB,GAAI,eAAK,aAAY,GACxE;AAAA,KAEJ;AAIF,QAAM,cAAc,CAAC,MAAgB,UAAkB;AACrD,UAAM,OAAO,cAAc,MAAM,KAAK;AACtC,UAAM,SAAS,kBAAkB,MAAM,OAAO,aAAa,aAAa;AACxE,UAAM,YAAY,SAAS;AAC3B,UAAM,YAAY,iBAAiB,CAAC,KAAK,YAAY,CAAC;AACtD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,UAAU,KAAK,SAAS;AAAA,MAChC,WAAW,CAAC,iBAAiB,YAAa,SAAmB;AAAA;AAAA,MAE7D,WAAWA,IAAG,6EAA6E,WAAW,mBAAmB,aAAa,QAAQ,KAAK,CAAC;AAAA;AAAA,MAEpJ,SAAU,gBAAgB,WAAW;AAAA,MACrC,cAAc,gBACV;AAAA,QACE,MAAM;AAAA,QACN,UAAU,KAAK;AAAA,QACf,UAAU,WAAW,KAAK;AAAA,QAC1B,gBAAgB,YAAa,SAAmB;AAAA,QAChD,SAAS,MAAM,CAAC,YAAY,SAAS,eAAe,WAAW,IAAI;AAAA,MACrE,IACA,CAAC;AAAA,MACL,kBAAkBA;AAAA,QAChB;AAAA,QACA,aAAa;AAAA,QACb,KAAK,YAAY;AAAA,QACjB,YAAY;AAAA,QACZ,iBAAiB;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAGA,QAAM,oBAAoB,CAAC,EAAE,MAAM,OAAO,MAAM,QAAQ,QAAQ,WAAW,WAAW,SAAS,cAAc,iBAAiB,MAC5H,qBAAC,QAAc,gBAAc,WAAW,WAAWA,IAAG,6BAA6B,SAAS,cAAc,QAAQ,GAGhH;AAAA,yBAAC,WAAS,GAAG,cAAc,WAAWA,IAAG,kBAAkB,oCAAoC,GAC5F;AAAA,sBAAgB,MAAM,OAAO,MAAM;AAAA,MACpC,qBAAC,UAAK,WAAU,WACb;AAAA,aAAK;AAAA,QAAM;AAAA,QAAG,YAAY,MAAM;AAAA,QAAE;AAAA,SACrC;AAAA,OACF;AAAA,IACC,CAAC,UAAU,oBAAC,UAAK,eAAW,MAAC,WAAWA,IAAG,4BAA4B,SAAS,GAAG;AAAA,OAT7E,IAUT;AAGF,QAAM,qBAAqB,CAAC,EAAE,MAAM,OAAO,MAAM,QAAQ,WAAW,QAAQ,WAAW,WAAW,SAAS,cAAc,iBAAiB,MACxI,oBAAC,QAAc,gBAAc,WAAW,WAAU,QAChD,+BAAC,WAAS,GAAG,cAAc,WAAWA,IAAG,kBAAkB,mBAAmB,GAC5E;AAAA,yBAAC,UAAK,WAAU,8BACb;AAAA,sBAAgB,MAAM,OAAO,MAAM;AAAA,MACnC,CAAC,UAAU,oBAAC,UAAK,WAAWA,IAAG,8BAA8B,OAAO,SAAS,SAAS,GAAG;AAAA,OAC5F;AAAA,IACA,oBAAC,UAAK,WAAWA,IAAG,uBAAuB,CAAC,WAAW,SAAS,OAAO,SAAS,OAAO,GAAI,qBAAW,MAAM,QAAQ,WAAW,IAAI,GAAE;AAAA,KACvI,KAPO,IAQT;AAGF,QAAM,oBAAoB,CAAC,EAAE,MAAM,OAAO,MAAM,QAAQ,WAAW,QAAQ,WAAW,WAAW,SAAS,cAAc,iBAAiB,MAAmB;AAC1J,UAAM,OAAO,MAAM,IAAI,YAAY,IAAI,IAAI;AAC3C,UAAM,MAAM,MAAM,KAAK;AACvB,WACE,qBAAC,QAAc,gBAAc,WAAW,WAAU,2BAC/C;AAAA,OAAC,UACA;AAAA,QAAC;AAAA;AAAA,UACC,eAAW;AAAA,UACX,WAAWA,IAAG,YAAY,MAAM,UAAU,QAAQ,SAAS;AAAA,UAC3D,OAAO;AAAA,YACL,KAAK,YAAY,IAAI,IAAI,KAAK,MAAM,IAAI;AAAA,YACxC,MAAM,cAAc,OAAO,GAAG;AAAA,YAC9B,OAAO,eAAe,KAAK,OAAO,IAAI;AAAA,UACxC;AAAA;AAAA,MACF;AAAA,MAEF,qBAAC,WAAS,GAAG,cAAc,WAAWA,IAAG,kBAAkB,8CAA8C,GACtG;AAAA,wBAAgB,MAAM,OAAO,MAAM;AAAA,QACnC,WAAW,MAAM,QAAQ,WAAW,IAAI;AAAA,SAC3C;AAAA,SAfO,IAgBT;AAAA,EAEJ;AAEA,QAAM,mBAAmB,CAAC,EAAE,MAAM,OAAO,MAAM,QAAQ,WAAW,QAAQ,WAAW,WAAW,SAAS,cAAc,iBAAiB,MACtI,oBAAC,QAAc,gBAAc,WAAW,WAAWA,IAAG,gBAAgB,SAAS,cAAc,QAAQ,GACnG,+BAAC,WAAS,GAAG,cAAc,WAAWA,IAAG,kBAAkB,uCAAuC,GAC/F;AAAA,oBAAgB,MAAM,OAAO,MAAM;AAAA,IACnC,WAAW,MAAM,QAAQ,WAAW,CAAC,UAAU,oBAAC,UAAK,eAAW,MAAC,WAAWA,IAAG,iCAAiC,SAAS,GAAG,CAAE;AAAA,KACjI,KAJO,IAKT;AAGF,QAAM,iBAAiF;AAAA,IACrF,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AACA,QAAM,aAAa,CAAC,MAAgB,UAAkB,eAAe,MAAM,EAAE,YAAY,MAAM,KAAK,CAAC;AAErG,SACE,qBAAC,SAAI,KAAK,SAAS,aAAW,YAAY,QAAW,WAAWA,IAAG,8BAA8B,SAAS,GACxG;AAAA,wBAAC,QAAG,cAAY,WAAW,eAAa,YAAY,QAAW,WAAWA,IAAG,eAAe,WAAW,aAAa,aAAa,sBAAsB,GACpJ,eAAK,IAAI,UAAU,GACtB;AAAA,IACC,WAAW,aAAa,qBAAqB;AAAA,IAC7C;AAAA,IACA,YAAY,kBACX,qBAAC,SAAI,WAAU,+DACb;AAAA,0BAAC,UAAO,UAAoB,OAAM,WAAU,SAAQ,WAAU,UAAU,aAAa,SAAS,MAAM,SAAS,cAAc,CAAC,GAAG,kBAE/H;AAAA,MACC,aACC,oBAAC,UAAO,UAAoB,OAAc,UAAU,CAAC,YAAY,SAAS,YAAY,qBAEtF,IAEA,oBAAC,UAAO,UAAoB,OAAc,SAAS,MAAM,SAAS,cAAc,CAAC,GAAG,wBAEpF;AAAA,OAEJ;AAAA,KAEJ;AAEJ;AAEA,IAAM,kBAA6C;AAAA,EACjD,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AAAA,EACN,SAAS;AACX;;;AEnZA,SAAS,MAAAC,WAAU;AAoBgB,gBAAAC,YAAA;AAD5B,SAAS,aAAa,EAAE,OAAO,cAAc,UAAU,UAAU,GAAsB;AAC5F,SAAO,iBAAiB,SAAS,gBAAAA,KAAC,SAAI,WAAWD,IAAG,UAAU,SAAS,GAAG,cAAY,OAAQ,UAAS;AACzG;","names":["cn","cn","cn","jsx"]}
1
+ {"version":3,"sources":["../src/steps/Steps.tsx","../src/steps/utils.ts","../src/steps/_components/StepsContent.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { CheckIcon, XIcon } from \"lucide-react\";\nimport { cn, type ColorRole } from \"@mari-ui/core\";\nimport { Button } from \"../button\";\nimport { skeletonFill } from \"../lib/skeleton\";\nimport type { StepItem, StepStatus, StepsProps, StepsSize } from \"./types\";\nimport {\n getDotClass,\n getIndicatorClass,\n getRailClass,\n getStepNumber,\n getTitleClass,\n resolveStepStatus,\n statusLabel,\n} from \"./utils\";\n\nexport type { StepsProps };\n\n/**\n * 32px (sm: 24px) daire gösterge, yatayda başlığın hemen yanından bir\n * sonraki adıma uzanan ince çizgi, dört durum (wait/process/finish/error),\n * filled/outlined, başlık-altı yerleşim, nokta, ilerleme halkası.\n *\n * Eski sürümde: gösterge dairesi yoktu (çıplak ikonlar), tamamlanan adım\n * sadece bazı modlarda tik gösteriyordu, çizgi başlığın altından geçiyordu,\n * dikey modda her adım arası sabit `min-h-32` boşluk vardı ve aktif adım\n * `scale-105` ile büyütülüp komşularını itiyordu.\n *\n * `\"use client\"`: `responsive` bir ResizeObserver kullanıyor.\n */\n\nconst indicatorSizeClass: Record<StepsSize, string> = {\n sm: \"size-6 text-xs\",\n md: \"size-8 text-sm\",\n};\nconst iconPx: Record<StepsSize, number> = { sm: 12, md: 16 };\nconst indicatorPx: Record<StepsSize, number> = { sm: 24, md: 32 };\nconst headerHeightClass: Record<StepsSize, string> = { sm: \"min-h-6\", md: \"min-h-8\" };\nconst titleSizeClass: Record<StepsSize, string> = { sm: \"text-sm\", md: \"text-base\" };\nconst descSizeClass: Record<StepsSize, string> = { sm: \"text-xs\", md: \"text-sm\" };\n\n// Tailwind derleme-zamanı tarayıcısı için literal tablo (bkz. lib/colorClasses).\nconst groupHoverTitleClass: Record<ColorRole, string> = {\n primary: \"group-hover:text-mari-primary\",\n accent: \"group-hover:text-mari-accent\",\n success: \"group-hover:text-mari-success\",\n error: \"group-hover:text-mari-error\",\n warning: \"group-hover:text-mari-warning\",\n info: \"group-hover:text-mari-info\",\n neutral: \"group-hover:text-mari-neutral\",\n};\n\ntype StepsLayout = \"inline\" | \"stacked\" | \"vertical\" | \"compact\";\n\n/**\n * İskelette metin: kendi satır kutusunda dolgu, harfler görünmez — başlığın/\n * açıklamanın gerçek genişliğini ve satır kırılmasını korur (sıfır zıplama).\n * `box-decoration-clone`: çok satırlı açıklamada her satır ayrı yuvarlanır.\n */\nconst skeletonTextClass = cn(\"rounded-sm text-transparent box-decoration-clone\", skeletonFill(true));\n/** İskelette gösterge: aynı daire, durum rengi/kenarlığı yok, içerik görünmez. */\nconst skeletonIndicatorClass = cn(\"border-transparent text-transparent [&_svg]:invisible\", skeletonFill(true));\n\n/**\n * İnline: başlık göstergenin yanında; stacked: altında ortalı; vertical:\n * dikey liste; compact: dar ekranda sadece göstergeler + altta geçerli adımın\n * başlığı (\"Adım 2/4 · Teslimat\").\n */\nfunction resolveLayout(\n vertical: boolean,\n isNarrow: boolean,\n responsiveLayout: StepsProps[\"responsiveLayout\"],\n dot: boolean,\n labelPlacement: StepsProps[\"labelPlacement\"]\n): StepsLayout {\n if (vertical) return \"vertical\";\n if (isNarrow) return responsiveLayout === \"compact\" ? \"compact\" : \"vertical\";\n if (dot || labelPlacement === \"vertical\") return \"stacked\";\n return \"inline\";\n}\n\n/** Dairenin içi: hata → ×, tamamlandı → ✓ (özel ikon yoksa), yoksa ikon ya da numara. */\nfunction renderGlyph(item: StepItem, index: number, status: StepStatus, size: number): React.ReactNode {\n if (status === \"error\") return <XIcon size={size} strokeWidth={2.5} />;\n const Icon = item.icon;\n if (Icon) return <Icon size={size} />;\n if (status === \"finish\") return <CheckIcon size={size} strokeWidth={2.5} />;\n return getStepNumber(item, index);\n}\n\n/** Kapsayıcı genişliğini izler — `responsive` için. SSR'da `undefined`. */\nfunction useContainerWidth(enabled: boolean) {\n const ref = useRef<HTMLDivElement>(null);\n const [width, setWidth] = useState<number>();\n useEffect(() => {\n const el = ref.current;\n if (!enabled || !el || typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(([entry]) => entry && setWidth(entry.contentRect.width));\n observer.observe(el);\n return () => observer.disconnect();\n }, [enabled]);\n return [ref, width] as const;\n}\n\nexport function Steps({\n data,\n currentStep,\n status: currentStatus = \"process\",\n onChange,\n onComplete,\n showActions,\n color = \"primary\",\n variant = \"filled\",\n size = \"md\",\n vertical = false,\n labelPlacement = \"horizontal\",\n dot = false,\n percent,\n responsive = 520,\n responsiveLayout = \"vertical\",\n content,\n className,\n \"aria-label\": ariaLabel = \"İlerleme adımları\",\n skeleton = false,\n}: Readonly<StepsProps>) {\n const [rootRef, width] = useContainerWidth(!vertical && responsive !== false);\n const isNarrow = responsive !== false && width !== undefined && width < responsive;\n const layout = resolveLayout(vertical, isNarrow, responsiveLayout, dot, labelPlacement);\n\n const isInteractive = Boolean(onChange);\n const actionsVisible = showActions ?? isInteractive;\n const stepNumbers = data.map(getStepNumber);\n const lastStep = stepNumbers[stepNumbers.length - 1];\n const isLastStep = currentStep === lastStep;\n const isFirstStep = currentStep === stepNumbers[0];\n\n const renderIndicator = (item: StepItem, index: number, status: StepStatus) => {\n if (dot) {\n return (\n <span aria-hidden className={cn(\"flex shrink-0 items-center justify-center\", layout === \"stacked\" ? \"w-full\" : \"w-3\", headerHeightClass[size])}>\n <span\n className={cn(\n \"rounded-full transition-[background-color,transform] duration-200 motion-reduce:transition-none\",\n status === \"process\" || status === \"error\" ? \"size-2.5\" : \"size-2\",\n skeleton ? skeletonFill(true) : getDotClass(status, color)\n )}\n />\n </span>\n );\n }\n\n const glyph = renderGlyph(item, index, status, iconPx[size]);\n\n const hasRing = status === \"process\" && percent !== undefined;\n // İskelette halka çizilmez ama payı (`mx-1`) korunur — yüklenince kaymasın.\n const showRing = hasRing && !skeleton;\n // Halka ile daire arasında ~3px boşluk (ant.design ile aynı his).\n const ringSize = indicatorPx[size] + 10;\n const radius = ringSize / 2 - 1;\n const circumference = 2 * Math.PI * radius;\n const clamped = Math.min(100, Math.max(0, percent ?? 0));\n\n return (\n // Gösterge ekran okuyucudan gizli: sıra `<ol>`'dan, durum başlıktaki\n // sr-only ekten gelir — aksi halde ad \"3 Onay\" gibi okunuyordu.\n <span\n aria-hidden\n className={cn(\n \"relative inline-flex shrink-0 items-center justify-center rounded-full border font-semibold tabular-nums\",\n \"transition-colors duration-200 motion-reduce:transition-none\",\n indicatorSizeClass[size],\n skeleton ? skeletonIndicatorClass : getIndicatorClass(status, color, variant),\n // Halka 5px taşar — komşu çizgi/başlıkla çakışmasın.\n hasRing && \"mx-1\"\n )}\n >\n {glyph}\n {showRing && (\n <svg\n className=\"pointer-events-none absolute -rotate-90\"\n width={ringSize}\n height={ringSize}\n viewBox={`0 0 ${ringSize} ${ringSize}`}\n aria-hidden\n >\n <circle cx={ringSize / 2} cy={ringSize / 2} r={radius} fill=\"none\" strokeWidth={2} className=\"stroke-mari-border\" />\n <circle\n cx={ringSize / 2}\n cy={ringSize / 2}\n r={radius}\n fill=\"none\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={circumference * (1 - clamped / 100)}\n className={cn(ringStrokeClass[color], \"transition-[stroke-dashoffset] duration-300 motion-reduce:transition-none\")}\n />\n </svg>\n )}\n </span>\n );\n };\n\n // Kompakt modda geçerli adımın görünür özeti. Ekran okuyucu aynı bilgiyi\n // listeden (`aria-current` + sr-only başlıklar) aldığı için aria-hidden.\n const renderCompactCaption = () => {\n const index = stepNumbers.indexOf(currentStep);\n const item = data[index];\n if (!item) return null;\n const status = resolveStepStatus(item, index, currentStep, currentStatus);\n return (\n <div aria-hidden className=\"-mt-3 flex flex-col gap-0.5\">\n <p className={cn(\"flex flex-wrap items-baseline gap-x-2\", titleSizeClass[size])}>\n <span className={cn(\"text-mari-muted\", descSizeClass[size], skeleton && skeletonTextClass)}>\n Adım {index + 1}/{data.length}\n </span>\n <span className={cn(getTitleClass(status), skeleton && skeletonTextClass)}>{item.title}</span>\n {item.subTitle && <span className={cn(\"text-mari-muted\", descSizeClass[size], skeleton && skeletonTextClass)}>{item.subTitle}</span>}\n </p>\n {item.description && (\n <p className={cn(\"text-mari-muted\", descSizeClass[size])}>\n <span className={cn(skeleton && skeletonTextClass)}>{item.description}</span>\n </p>\n )}\n </div>\n );\n };\n\n const renderText = (item: StepItem, status: StepStatus, isCurrent: boolean, withRail: React.ReactNode) => (\n <span className={cn(\"flex min-w-0 flex-col\", layout === \"stacked\" ? \"items-center text-center\" : \"flex-1\")}>\n <span className={cn(\"flex min-w-0 items-center gap-2\", layout !== \"stacked\" && headerHeightClass[size])}>\n <span\n className={cn(\n \"leading-snug transition-colors motion-reduce:transition-none\",\n layout === \"inline\" && \"whitespace-nowrap\",\n titleSizeClass[size],\n getTitleClass(status),\n isInteractive && !item.disabled && !isCurrent && groupHoverTitleClass[color],\n skeleton && skeletonTextClass\n )}\n >\n {item.title}\n <span className=\"sr-only\">\n {\" \"}\n ({statusLabel[status]}\n {status === \"process\" && percent !== undefined ? `, %${Math.round(percent)}` : \"\"})\n </span>\n </span>\n {item.subTitle && <span className={cn(\"whitespace-nowrap text-mari-muted\", descSizeClass[size], skeleton && skeletonTextClass)}>{item.subTitle}</span>}\n {withRail}\n </span>\n {item.description && (\n // Bekleyen adımda da tam `muted`: `/80` açık zeminde 4.5:1'in altına düşüyordu (axe color-contrast).\n <span className={cn(\"mt-0.5 leading-relaxed text-mari-muted\", descSizeClass[size])}>\n {/* Dolgu iç `<span>`de: satır satır sarılsın (blok kutunun tamamı değil). */}\n <span className={cn(skeleton && skeletonTextClass)}>{item.description}</span>\n </span>\n )}\n </span>\n );\n\n /** Her yerleşimin ortak girdileri — `renderItem` yerleşim başına ayrı fonksiyonlara dağıtır (tek dev fonksiyon 38 karmaşıklıktaydı). */\n const itemContext = (item: StepItem, index: number) => {\n const step = getStepNumber(item, index);\n const status = resolveStepStatus(item, index, currentStep, currentStatus);\n const isCurrent = step === currentStep;\n const clickable = isInteractive && !item.disabled && !skeleton;\n return {\n item,\n index,\n step,\n status,\n isCurrent,\n isLast: index === data.length - 1,\n liCurrent: !isInteractive && isCurrent ? (\"step\" as const) : undefined,\n // İskelette çizgiler durum rengini taşımaz (henüz durum yok).\n railClass: cn(\"rounded-full transition-colors duration-200 motion-reduce:transition-none\", skeleton ? \"bg-mari-border\" : getRailClass(status, color)),\n // Etkileşimli ise gerçek <button> — Enter/Space/Tab tarayıcıdan gelir.\n Wrapper: (isInteractive ? \"button\" : \"div\") as \"button\" | \"div\",\n wrapperProps: isInteractive\n ? {\n type: \"button\" as const,\n disabled: item.disabled,\n tabIndex: skeleton ? -1 : undefined,\n \"aria-current\": isCurrent ? (\"step\" as const) : undefined,\n onClick: () => !skeleton && step !== currentStep && onChange?.(step),\n }\n : {},\n interactiveClass: cn(\n \"group rounded-md text-left\",\n clickable && \"cursor-pointer\",\n item.disabled && \"cursor-not-allowed opacity-50\",\n skeleton && \"pointer-events-none\",\n isInteractive && \"focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-mari-ring\"\n ),\n };\n };\n type ItemContext = ReturnType<typeof itemContext>;\n\n const renderCompactItem = ({ item, index, step, status, isLast, liCurrent, railClass, Wrapper, wrapperProps, interactiveClass }: ItemContext) => (\n <li key={step} aria-current={liCurrent} className={cn(\"flex min-w-0 items-center\", isLast ? \"flex-none\" : \"flex-1\")}>\n {/* Başlık görünmez ama erişilebilir ad olarak kalır. Dokunma hedefi\n için gösterge etrafında 6px pay (32px → 44px). */}\n <Wrapper {...wrapperProps} className={cn(interactiveClass, \"-m-1.5 shrink-0 rounded-full p-1.5\")}>\n {renderIndicator(item, index, status)}\n <span className=\"sr-only\">\n {item.title} ({statusLabel[status]})\n </span>\n </Wrapper>\n {!isLast && <span aria-hidden className={cn(\"mx-3 h-px min-w-3 flex-1\", railClass)} />}\n </li>\n );\n\n const renderVerticalItem = ({ item, index, step, status, isCurrent, isLast, liCurrent, railClass, Wrapper, wrapperProps, interactiveClass }: ItemContext) => (\n <li key={step} aria-current={liCurrent} className=\"flex\">\n <Wrapper {...wrapperProps} className={cn(interactiveClass, \"flex w-full gap-3\")}>\n <span className=\"flex flex-col items-center\">\n {renderIndicator(item, index, status)}\n {!isLast && <span className={cn(\"my-1.5 w-px min-h-6 flex-1\", dot && \"w-0.5\", railClass)} />}\n </span>\n <span className={cn(\"flex min-w-0 flex-1\", !isLast && (size === \"sm\" ? \"pb-4\" : \"pb-6\"))}>{renderText(item, status, isCurrent, null)}</span>\n </Wrapper>\n </li>\n );\n\n const renderStackedItem = ({ item, index, step, status, isCurrent, isLast, liCurrent, railClass, Wrapper, wrapperProps, interactiveClass }: ItemContext) => {\n const half = dot ? 5 : indicatorPx[size] / 2;\n const gap = dot ? 12 : 8;\n return (\n <li key={step} aria-current={liCurrent} className=\"relative min-w-0 flex-1\">\n {!isLast && (\n <span\n aria-hidden\n className={cn(\"absolute\", dot ? \"h-0.5\" : \"h-px\", railClass)}\n style={{\n top: indicatorPx[size] / 2 - (dot ? 1 : 0.5),\n left: `calc(50% + ${half + gap}px)`,\n width: `calc(100% - ${2 * (half + gap)}px)`,\n }}\n />\n )}\n <Wrapper {...wrapperProps} className={cn(interactiveClass, \"flex w-full flex-col items-center gap-2 px-2\")}>\n {renderIndicator(item, index, status)}\n {renderText(item, status, isCurrent, null)}\n </Wrapper>\n </li>\n );\n };\n\n const renderInlineItem = ({ item, index, step, status, isCurrent, isLast, liCurrent, railClass, Wrapper, wrapperProps, interactiveClass }: ItemContext) => (\n <li key={step} aria-current={liCurrent} className={cn(\"flex min-w-0\", isLast ? \"flex-none\" : \"flex-1\")}>\n <Wrapper {...wrapperProps} className={cn(interactiveClass, \"flex min-w-0 flex-1 items-start gap-3\")}>\n {renderIndicator(item, index, status)}\n {renderText(item, status, isCurrent, !isLast && <span aria-hidden className={cn(\"ml-1 mr-3 h-px min-w-6 flex-1\", railClass)} />)}\n </Wrapper>\n </li>\n );\n\n const layoutRenderer: Record<StepsLayout, (context: ItemContext) => React.ReactNode> = {\n compact: renderCompactItem,\n vertical: renderVerticalItem,\n stacked: renderStackedItem,\n inline: renderInlineItem,\n };\n const renderItem = (item: StepItem, index: number) => layoutRenderer[layout](itemContext(item, index));\n\n return (\n <div ref={rootRef} aria-busy={skeleton || undefined} className={cn(\"flex w-full flex-col gap-6\", className)}>\n <ol aria-label={ariaLabel} aria-hidden={skeleton || undefined} className={cn(\"flex w-full\", layout === \"vertical\" ? \"flex-col\" : \"flex-row items-start\")}>\n {data.map(renderItem)}\n </ol>\n {layout === \"compact\" && renderCompactCaption()}\n {content}\n {onChange && actionsVisible && (\n <div className=\"flex justify-between gap-4 border-t border-mari-border pt-6\">\n <Button skeleton={skeleton} color=\"neutral\" variant=\"outline\" disabled={isFirstStep} onClick={() => onChange(currentStep - 1)}>\n Geri\n </Button>\n {isLastStep ? (\n <Button skeleton={skeleton} color={color} disabled={!onComplete} onClick={onComplete}>\n Tamamla\n </Button>\n ) : (\n <Button skeleton={skeleton} color={color} onClick={() => onChange(currentStep + 1)}>\n İleri\n </Button>\n )}\n </div>\n )}\n </div>\n );\n}\n\nconst ringStrokeClass: Record<ColorRole, string> = {\n primary: \"stroke-mari-primary\",\n accent: \"stroke-mari-accent\",\n success: \"stroke-mari-success\",\n error: \"stroke-mari-error\",\n warning: \"stroke-mari-warning\",\n info: \"stroke-mari-info\",\n neutral: \"stroke-mari-neutral\",\n};\n","import { cn, type ColorRole } from \"@mari-ui/core\";\nimport {\n bgSolidClass,\n bgSubtleClass,\n borderStrongColorClass,\n textClass,\n textSolidContrastClass,\n} from \"../lib/colorClasses\";\nimport type { StepItem, StepStatus, StepsVariant } from \"./types\";\n\nexport function getStepNumber(item: StepItem, index: number): number {\n return item.step ?? index + 1;\n}\n\n/**\n * Adımın durumu: elle verilen `item.status` her zaman kazanır; yoksa\n * `currentStep`'e göre türetilir. Geçerli adımın durumu Steps'in `status`\n * prop'undan gelir (ör. `\"error\"`).\n */\nexport function resolveStepStatus(\n item: StepItem,\n index: number,\n currentStep: number,\n currentStatus: Exclude<StepStatus, \"wait\">\n): StepStatus {\n if (item.status) return item.status;\n const step = getStepNumber(item, index);\n if (step < currentStep) return \"finish\";\n if (step === currentStep) return currentStatus;\n return \"wait\";\n}\n\n/*\n * Gösterge dairesinin renkleri. Yapı ant.design v6'dan (filled: tamamlanan\n * = tonlu, geçerli = dolu, bekleyen = nötr tonlu; outlined: hepsi çerçeveli),\n * renkler kendi token'larımızdan. Hata her zaman `error` rolüyle çizilir.\n */\nexport function getIndicatorClass(status: StepStatus, color: ColorRole, variant: StepsVariant): string {\n const role: ColorRole = status === \"error\" ? \"error\" : color;\n if (variant === \"outlined\") {\n switch (status) {\n case \"process\":\n return cn(bgSubtleClass[role], borderStrongColorClass[role], textClass[role]);\n case \"finish\":\n case \"error\":\n return cn(\"bg-mari-surface\", borderStrongColorClass[role], textClass[role]);\n default:\n return \"bg-mari-surface border-mari-border text-mari-muted\";\n }\n }\n switch (status) {\n case \"process\":\n case \"error\":\n return cn(\"border-transparent\", bgSolidClass[role], textSolidContrastClass[role]);\n case \"finish\":\n return cn(\"border-transparent\", bgSubtleClass[role], textClass[role]);\n default:\n return \"border-transparent bg-mari-neutral-subtle text-mari-muted\";\n }\n}\n\nexport function getDotClass(status: StepStatus, color: ColorRole): string {\n if (status === \"wait\") return \"bg-mari-border\";\n return bgSolidClass[status === \"error\" ? \"error\" : color];\n}\n\nexport function getTitleClass(status: StepStatus): string {\n switch (status) {\n case \"process\":\n return \"text-mari-foreground font-semibold\";\n case \"finish\":\n return \"text-mari-foreground\";\n case \"error\":\n return \"text-mari-error font-medium\";\n default:\n return \"text-mari-muted\";\n }\n}\n\n/*\n * Bir adımdan sonrakine uzanan çizgi, SONRAKİ adıma varılmışsa renklidir\n * (yani bu adım tamamlanmışsa) — ant.design ile aynı.\n */\nexport function getRailClass(status: StepStatus, color: ColorRole): string {\n return status === \"finish\" ? bgSolidClass[color] : \"bg-mari-border\";\n}\n\n/** Ekran okuyucu için durum eki — renk/ikon tek başına anlam taşımasın. */\nexport const statusLabel: Record<StepStatus, string> = {\n wait: \"bekliyor\",\n process: \"devam ediyor\",\n finish: \"tamamlandı\",\n error: \"hata\",\n};\n","import React from \"react\";\nimport { cn } from \"@mari-ui/core\";\n\nexport interface StepsContentProps {\n value: number;\n currentSteps: number;\n children: React.ReactNode;\n className?: string;\n}\n\n/*\n * Faz 13.5 kullanıcı bulgusu: eskiden `border-dashed` + `bg-mari-primary-subtle`\n * + `w-fit` taşıyordu — bir WIREFRAME/DEBUG yer tutucusu gibi görünüyordu,\n * gerçek bir uygulamada kullanılabilecek bir içerik kutusu gibi değil.\n * İçerik keyfi olduğundan (bir form, özet, herhangi bir şey olabilir) artık\n * hiçbir görsel kutu dayatmıyor — sadece tam genişlik + Steps'in gösterge\n * satırından ayrışsın diye üst boşluk sağlıyor.\n */\n/** Hook yok, browser API yok — saf sunum, \"use client\" gerekmiyor. */\nexport function StepsContent({ value, currentSteps, children, className }: StepsContentProps) {\n return currentSteps === value && <div className={cn(\"w-full\", className)} data-value={value}>{children}</div>;\n}\n"],"mappings":"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","names":["cn","cn","cn","jsx"]}