@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
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/input-number/InputNumber.tsx","../src/input-number/utils.ts"],"sourcesContent":["\"use client\";\n\nimport React, { forwardRef, useEffect, useRef, useState } from \"react\";\nimport { ChevronDownIcon, ChevronUpIcon, MinusIcon, PlusIcon } from \"lucide-react\";\nimport { cn, useControllableState } from \"@mari-ui/core\";\nimport { FIELD_BASE_CLASS, FIELD_DISABLED_CLASS, FIELD_MOBILE_TEXT_CLASS, getShapeClasses, getVariantClasses } from \"../input/utils\";\nimport { useFieldControl } from \"../lib/fieldContext\";\nimport { skeletonBoxProps } from \"../lib/skeleton\";\nimport { sizeClass, touchTargetClass } from \"../lib/sizeClasses\";\nimport type { InputNumberProps } from \"./types\";\nimport { clamp, formatForEditing, formatNumber, isAllowedInput, parseNumber, roundTo, stepValue, type NumberFormatConfig } from \"./utils\";\n\nexport type { InputNumberProps };\n\nconst HOLD_DELAY_MS = 400;\nconst HOLD_INTERVAL_MS = 70;\n\n/** Basılı tutunca adım tekrarlanır (400ms bekle, sonra 70ms'de bir). */\nfunction useHoldRepeat(action: (direction: 1 | -1) => void) {\n const timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const actionRef = useRef(action);\n actionRef.current = action;\n const stop = () => clearTimeout(timer.current);\n useEffect(() => stop, []);\n const start = (direction: 1 | -1) => {\n stop();\n actionRef.current(direction);\n const repeat = () => {\n actionRef.current(direction);\n timer.current = setTimeout(repeat, HOLD_INTERVAL_MS);\n };\n timer.current = setTimeout(repeat, HOLD_DELAY_MS);\n };\n return { start, stop };\n}\n\n/**\n * Düğme sütunu boyuta göre ölçeklenir. `sm` kutunun iç yüksekliği 22px: iki\n * düğme + 1px ayraç 12px ikonla en az 25px istiyordu → düğmeler kutudan\n * taşıp alt ok kenarlığın üstüne biniyordu. İkon ve\n * genişlik boyutla birlikte küçülür; `min-h-0` düğmelerin paylaşımlı\n * yüksekliğe inmesine izin verir.\n */\nconst STEPPER_WIDTH: Record<NonNullable<InputNumberProps[\"size\"]>, string> = { sm: \"w-5\", md: \"w-6\", lg: \"w-7\" };\nconst STEPPER_ICON: Record<NonNullable<InputNumberProps[\"size\"]>, number> = { sm: 10, md: 12, lg: 14 };\n\nconst textOf = (node: React.ReactNode) => (typeof node === \"string\" || typeof node === \"number\" ? String(node) : \"\");\n\ninterface StepperProps {\n onStart: (direction: 1 | -1) => void;\n onStop: () => void;\n canIncrement: boolean;\n canDecrement: boolean;\n incrementLabel: string;\n decrementLabel: string;\n size: NonNullable<InputNumberProps[\"size\"]>;\n}\n\n/**\n * Fareyle: sağda üst üste ▲/▼. Dokunmatikte (pointer-coarse)\n * yan yana −/+ — üst üste 16px'lik iki düğme parmakla vurulamaz; yatayda\n * her biri tam yükseklik + görünmez 44px hedef. Düğmeler Tab sırasında\n * değil; `onPointerDown`\n * `preventDefault` ile odağı alandan almaz.\n */\nfunction Stepper({ onStart, onStop, canIncrement, canDecrement, incrementLabel, decrementLabel, size }: Readonly<StepperProps>) {\n const button = (direction: 1 | -1, enabled: boolean, label: string, fine: React.ReactNode, coarse: React.ReactNode) => (\n <button\n type=\"button\"\n tabIndex={-1}\n aria-label={label}\n disabled={!enabled}\n onPointerDown={(e) => {\n e.preventDefault();\n if (enabled) onStart(direction);\n }}\n onPointerUp={onStop}\n onPointerLeave={onStop}\n onPointerCancel={onStop}\n className={cn(\n \"relative flex min-h-0 flex-1 cursor-pointer items-center justify-center text-mari-muted transition-colors hover:bg-mari-surface-alt hover:text-mari-foreground disabled:cursor-not-allowed disabled:opacity-40 disabled:hover:bg-transparent\",\n \"pointer-coarse:w-8 pointer-coarse:flex-none\",\n touchTargetClass[size]\n )}\n >\n <span className=\"pointer-coarse:hidden\">{fine}</span>\n <span className=\"hidden pointer-coarse:inline\">{coarse}</span>\n </button>\n );\n return (\n // DOM sırası [azalt, artır]: masaüstünde col-reverse ile artır üstte, dokunmatikte satırda azalt solda.\n <div\n className={cn(\n \"flex shrink-0 flex-col-reverse self-stretch overflow-hidden border-l border-mari-input [border-bottom-right-radius:inherit] [border-top-right-radius:inherit] pointer-coarse:w-auto pointer-coarse:flex-row [&>button+button]:border-b [&>button+button]:border-mari-input pointer-coarse:[&>button+button]:border-b-0 pointer-coarse:[&>button+button]:border-l\",\n STEPPER_WIDTH[size]\n )}\n >\n {button(-1, canDecrement, decrementLabel, <ChevronDownIcon size={STEPPER_ICON[size]} aria-hidden />, <MinusIcon size={16} aria-hidden />)}\n {button(1, canIncrement, incrementLabel, <ChevronUpIcon size={STEPPER_ICON[size]} aria-hidden />, <PlusIcon size={16} aria-hidden />)}\n </div>\n );\n}\n\n/*\n * yapı ant.design InputNumber'dan; görünüm Input'la birebir.\n */\n/**\n * Metin alanı + `role=\"spinbutton\"`: odak dışında biçimli (\"1.234,56 ₺\"),\n * odakta düzenlemeye uygun (\"1234,56\") gösterir. Türkçe ondalık virgül,\n * alışkanlıkla yazılan \"12.5\" de anlaşılır (bkz. `parseNumber`). Harf hiç\n * girmez. min/max yazarken engellenmez (kullanıcı \"1\" yazıp \"15\"e giderken\n * min=10 araya girmesin) — alandan çıkınca/Enter'da sınıra çekilir.\n *\n * Klavye: ↑/↓ adım (Shift ×10), PageUp/PageDown ×10, Home/End min/max, Enter\n * onaylar. `aria-valuenow/min/max` + `aria-valuetext` (önek/sonekle, ör. \"1.234,50 ₺\").\n */\nexport const InputNumber = forwardRef<HTMLInputElement, InputNumberProps>(function InputNumber(outerProps, ref) {\n // Field içindeyse id / aria-describedby / hata / required / disabled oradan tamamlanır.\n return <InputNumberInner {...useFieldControl(outerProps)} forwardedRef={ref} />;\n});\n\nfunction InputNumberInner(\n {\n forwardedRef: ref,\n value,\n defaultValue = null,\n onChange,\n min,\n max,\n step = 1,\n precision,\n grouping = true,\n locale = \"tr-TR\",\n prefix,\n suffix,\n controls = true,\n incrementLabel = \"Artır\",\n decrementLabel = \"Azalt\",\n placeholder,\n disabled = false,\n readOnly = false,\n size = \"md\",\n variant = \"outline\",\n shape = \"default\",\n color,\n id,\n name,\n required,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n onBlur,\n onFocus,\n onPressEnter,\n className,\n skeleton = false,\n }: InputNumberProps & { forwardedRef: React.ForwardedRef<HTMLInputElement> }\n) {\n const config: NumberFormatConfig = { locale, precision, grouping };\n const [current, setCurrent] = useControllableState<number | null>({ value, defaultValue });\n const [focused, setFocused] = useState(false);\n const [text, setText] = useState(\"\");\n const innerRef = useRef<HTMLInputElement | null>(null);\n const interactive = !disabled && !readOnly;\n\n // En güncel değer — basılı tutarken adımlar render'lar arasında art arda gelebilir;\n // render kapanışındaki `current` eski kalır ve her adım aynı değerden hesaplanırdı.\n const latest = useRef(current);\n latest.current = current;\n\n const emit = (next: number | null) => {\n if (next === latest.current) return;\n latest.current = next;\n setCurrent(next);\n onChange?.(next);\n };\n\n /** Alandan çıkınca/Enter: metni sayıya çevir, yuvarla, sınıra çek; anlamsızsa son geçerli değere dön. */\n const normalize = (): number | null => {\n const parsed = parseNumber(text, locale);\n let next: number | null = current;\n if (parsed === null) next = null;\n else if (parsed !== undefined) next = clamp(roundTo(parsed, precision), min, max);\n emit(next);\n return next;\n };\n\n const applyStep = (direction: 1 | -1, multiplier = 1) => {\n if (!interactive) return;\n // Odaktaysa henüz onaylanmamış yazılan metin de hesaba katılır (yazıp ↑'a basınca oradan devam).\n const typed = focused ? parseNumber(text, locale) : undefined;\n const base = typed === undefined || typed === null ? latest.current : typed;\n const next = stepValue(base, direction, step * multiplier, min, max, precision);\n emit(next);\n if (focused) setText(formatForEditing(next, config));\n };\n const hold = useHoldRepeat((direction) => applyStep(direction));\n\n if (skeleton) {\n return <div {...skeletonBoxProps(cn(\"flex w-full items-center\", sizeClass[size], getShapeClasses(shape, variant), className))} />;\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n const steps: Record<string, [1 | -1, number]> = { ArrowUp: [1, e.shiftKey ? 10 : 1], ArrowDown: [-1, e.shiftKey ? 10 : 1], PageUp: [1, 10], PageDown: [-1, 10] };\n const stepKey = steps[e.key];\n if (stepKey) {\n e.preventDefault();\n applyStep(...stepKey);\n } else if ((e.key === \"Home\" && min !== undefined) || (e.key === \"End\" && max !== undefined)) {\n e.preventDefault();\n if (!interactive) return;\n const edge = e.key === \"Home\" ? min! : max!;\n emit(edge);\n setText(formatForEditing(edge, config));\n } else if (e.key === \"Enter\") {\n setText(formatForEditing(normalize(), config));\n onPressEnter?.(e);\n }\n };\n\n const formatted = formatNumber(current, config);\n const valueText = formatted ? [textOf(prefix), formatted, textOf(suffix)].filter(Boolean).join(\" \") : undefined;\n const canIncrement = interactive && (max === undefined || current === null || current < max);\n const canDecrement = interactive && (min === undefined || current === null || current > min);\n const adornment = \"flex shrink-0 items-center text-mari-muted\";\n\n return (\n // Kutunun boş alanına tıklamak alanı odaklar (Input'taki kısayol); klavye doğrudan alana gelir.\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n <div\n onMouseDown={(e) => {\n if (disabled || innerRef.current?.contains(e.target as Node) || (e.target as HTMLElement).closest(\"button\")) return;\n e.preventDefault();\n innerRef.current?.focus();\n }}\n className={cn(\n \"group relative flex w-full cursor-text items-center gap-2\",\n sizeClass[size],\n getShapeClasses(shape, variant),\n controls && \"py-0 pr-0\",\n // Dokunmatikte −/+ yan yana 64px yer kaplar: dar bir genişlik (w-24) rakamlara yer bırakmıyordu.\n controls && \"pointer-coarse:min-w-32\",\n touchTargetClass[size],\n FIELD_BASE_CLASS,\n getVariantClasses(variant, color),\n disabled && FIELD_DISABLED_CLASS,\n className\n )}\n >\n {prefix && <span className={adornment}>{prefix}</span>}\n <input\n ref={(el) => {\n innerRef.current = el;\n if (typeof ref === \"function\") ref(el);\n else if (ref) ref.current = el;\n }}\n id={id}\n name={name}\n type=\"text\"\n role=\"spinbutton\"\n inputMode={precision === 0 && (min === undefined || min >= 0) ? \"numeric\" : \"decimal\"}\n autoComplete=\"off\"\n required={required}\n disabled={disabled}\n readOnly={readOnly}\n placeholder={placeholder}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-describedby={ariaDescribedBy}\n aria-invalid={color === \"error\" || undefined}\n aria-valuenow={current ?? undefined}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuetext={valueText}\n value={focused ? text : formatted}\n onFocus={(e) => {\n setFocused(true);\n setText(formatForEditing(current, config));\n onFocus?.(e);\n }}\n onBlur={(e) => {\n normalize();\n setFocused(false);\n onBlur?.(e);\n }}\n onChange={(e) => {\n const next = e.target.value;\n if (!isAllowedInput(next, locale)) return;\n setText(next);\n const parsed = parseNumber(next, locale);\n if (parsed !== undefined) emit(parsed);\n }}\n onKeyDown={handleKeyDown}\n className={cn(\"w-full min-w-0 flex-1 bg-transparent tabular-nums placeholder:text-mari-muted focus:outline-none disabled:cursor-not-allowed\", FIELD_MOBILE_TEXT_CLASS)}\n />\n {suffix && <span className={cn(adornment, controls && \"pr-1\")}>{suffix}</span>}\n {controls && (\n <Stepper\n onStart={hold.start}\n onStop={hold.stop}\n canIncrement={canIncrement}\n canDecrement={canDecrement}\n incrementLabel={incrementLabel}\n decrementLabel={decrementLabel}\n size={size}\n />\n )}\n </div>\n );\n}\n","/**\n * InputNumber'ın saf sayı mantığı (DOM'suz, ayrıca test edilir).\n *\n * Neden `type=\"number\"` değil: tarayıcı Türkçe ondalık virgülü ve binlik\n * ayıracını (1.234,56) göstermez/kabul etmez, min/max'ı yazarken sınırlamaz,\n * bazı tarayıcılarda harf yazılabilir ve değer boşken `\"\"` ile \"geçersiz\"i\n * ayırt ettirmez. Burada metin alanı + kendi ayrıştırma/biçimlendirmemiz var.\n */\n\nexport interface NumberFormatConfig {\n locale: string;\n /** Ondalık basamak sayısı (sabit). Verilmezse değerin kendi basamakları (en fazla 20). */\n precision?: number;\n /** Binlik ayıracı. Varsayılan: `true`. */\n grouping: boolean;\n}\n\n/** Yerelin ondalık ve binlik karakterleri (tr-TR: \",\" ve \".\"). */\nexport function getSeparators(locale: string): { decimal: string; group: string } {\n const parts = new Intl.NumberFormat(locale).formatToParts(1234567.5);\n return {\n decimal: parts.find((p) => p.type === \"decimal\")?.value ?? \".\",\n group: parts.find((p) => p.type === \"group\")?.value ?? \",\",\n };\n}\n\n/** Kayan nokta artıklarını temizleyerek yuvarlar (0.1 + 0.2 → 0.3). */\nexport function roundTo(value: number, precision: number | undefined): number {\n if (precision === undefined) return Number.parseFloat(value.toPrecision(15));\n const factor = 10 ** precision;\n return Math.round((value + Number.EPSILON) * factor) / factor;\n}\n\nexport function clamp(value: number, min: number | undefined, max: number | undefined): number {\n if (min !== undefined && value < min) return min;\n if (max !== undefined && value > max) return max;\n return value;\n}\n\n/** Ekranda gösterilen biçim (odak dışı): \"1.234,56\". */\nexport function formatNumber(value: number | null, { locale, precision, grouping }: NumberFormatConfig): string {\n if (value === null || Number.isNaN(value)) return \"\";\n return new Intl.NumberFormat(locale, {\n useGrouping: grouping,\n minimumFractionDigits: precision ?? 0,\n maximumFractionDigits: precision ?? 20,\n }).format(value);\n}\n\n/** Düzenlerken gösterilen biçim (odakta): binlik ayıracı yok, yerelin ondalığı — \"1234,56\". */\nexport function formatForEditing(value: number | null, config: NumberFormatConfig): string {\n return formatNumber(value, { ...config, grouping: false });\n}\n\n/**\n * Kullanıcı metnini sayıya çevirir; boş → `null`, anlamsız → `undefined`.\n *\n * Türkçede \".\" binlik, \",\" ondalıktır — ama kullanıcı alışkanlıkla \"12.5\"\n * de yazar. Kural: metinde yerelin ondalığı (\",\") VARSA \".\" binlik sayılıp\n * atılır. Yoksa \".\" yalnız GEÇERLİ binlik gruplaması gibi duruyorsa\n * (\"1.234\", \"1.234.567\") binlik; aksi halde (\"12.5\", \"3.14\") ondalık kabul\n * edilir.\n */\nexport function parseNumber(text: string, locale: string): number | null | undefined {\n const { decimal, group } = getSeparators(locale);\n let s = text.replace(/[\\s\\u00a0\\u202f]/g, \"\");\n if (s === \"\" || s === \"-\" || s === \"+\") return null;\n\n if (decimal !== \".\" && s.includes(decimal)) {\n s = s.split(group).join(\"\").replace(decimal, \".\");\n } else if (decimal !== \".\" && group === \".\" && s.includes(\".\")) {\n const looksGrouped = /^[-+]?\\d{1,3}(\\.\\d{3})+$/.test(s);\n if (looksGrouped) s = s.split(\".\").join(\"\");\n } else if (decimal === \".\") {\n s = s.split(group).join(\"\");\n }\n\n // Doğrusal kontrol (geri izlemeli regex yerine): işaret + rakamlar + en fazla bir nokta, en az bir rakam.\n const body = s.replace(/^[-+]/, \"\");\n if (!/^[\\d.]+$/.test(body) || body.split(\".\").length > 2 || !/\\d/.test(body)) return undefined;\n const value = Number(s);\n return Number.isFinite(value) ? value : undefined;\n}\n\n/** Yazarken izin verilen karakterler (rakam, işaret, ayraçlar) — harf vb. hiç girmesin. */\nexport function isAllowedInput(text: string, locale: string): boolean {\n const { decimal, group } = getSeparators(locale);\n const escape = (c: string) => c.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(`^[-+]?[\\\\d${escape(decimal)}${escape(group)}.\\\\s]*$`).test(text);\n}\n\n/** `step` adımı sonrası değer: boş alanda min'den (yoksa 0'dan) başlar, sınırlar ve yuvarlar. */\nexport function stepValue(current: number | null, direction: 1 | -1, step: number, min: number | undefined, max: number | undefined, precision: number | undefined): number {\n const base = current ?? (direction === 1 ? (min ?? 0) - step : (max ?? 0) + step);\n // Adımın kendi ondalık basamağı kadar yuvarla ki 0.1 adımlar 0.30000000000000004 üretmesin.\n const stepDecimals = (String(step).split(\".\")[1] ?? \"\").length;\n const next = roundTo(base + direction * step, precision ?? Math.max(stepDecimals, decimals(base)));\n return clamp(next, min, max);\n}\n\nfunction decimals(value: number): number {\n return (String(value).split(\".\")[1] ?? \"\").length;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAEA,SAAgB,YAAY,WAAW,QAAQ,gBAAgB;AAC/D,SAAS,iBAAiB,eAAe,WAAW,gBAAgB;AACpE,SAAS,IAAI,4BAA4B;;;ACclC,SAAS,cAAc,QAAoD;AAChF,QAAM,QAAQ,IAAI,KAAK,aAAa,MAAM,EAAE,cAAc,WAAS;AACnE,SAAO;AAAA,IACL,SAAS,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,SAAS,GAAG,SAAS;AAAA,IAC3D,OAAO,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO,GAAG,SAAS;AAAA,EACzD;AACF;AAGO,SAAS,QAAQ,OAAe,WAAuC;AAC5E,MAAI,cAAc,OAAW,QAAO,OAAO,WAAW,MAAM,YAAY,EAAE,CAAC;AAC3E,QAAM,SAAS,MAAM;AACrB,SAAO,KAAK,OAAO,QAAQ,OAAO,WAAW,MAAM,IAAI;AACzD;AAEO,SAAS,MAAM,OAAe,KAAyB,KAAiC;AAC7F,MAAI,QAAQ,UAAa,QAAQ,IAAK,QAAO;AAC7C,MAAI,QAAQ,UAAa,QAAQ,IAAK,QAAO;AAC7C,SAAO;AACT;AAGO,SAAS,aAAa,OAAsB,EAAE,QAAQ,WAAW,SAAS,GAA+B;AAC9G,MAAI,UAAU,QAAQ,OAAO,MAAM,KAAK,EAAG,QAAO;AAClD,SAAO,IAAI,KAAK,aAAa,QAAQ;AAAA,IACnC,aAAa;AAAA,IACb,uBAAuB,aAAa;AAAA,IACpC,uBAAuB,aAAa;AAAA,EACtC,CAAC,EAAE,OAAO,KAAK;AACjB;AAGO,SAAS,iBAAiB,OAAsB,QAAoC;AACzF,SAAO,aAAa,OAAO,EAAE,GAAG,QAAQ,UAAU,MAAM,CAAC;AAC3D;AAWO,SAAS,YAAY,MAAc,QAA2C;AACnF,QAAM,EAAE,SAAS,MAAM,IAAI,cAAc,MAAM;AAC/C,MAAI,IAAI,KAAK,QAAQ,qBAAqB,EAAE;AAC5C,MAAI,MAAM,MAAM,MAAM,OAAO,MAAM,IAAK,QAAO;AAE/C,MAAI,YAAY,OAAO,EAAE,SAAS,OAAO,GAAG;AAC1C,QAAI,EAAE,MAAM,KAAK,EAAE,KAAK,EAAE,EAAE,QAAQ,SAAS,GAAG;AAAA,EAClD,WAAW,YAAY,OAAO,UAAU,OAAO,EAAE,SAAS,GAAG,GAAG;AAC9D,UAAM,eAAe,2BAA2B,KAAK,CAAC;AACtD,QAAI,aAAc,KAAI,EAAE,MAAM,GAAG,EAAE,KAAK,EAAE;AAAA,EAC5C,WAAW,YAAY,KAAK;AAC1B,QAAI,EAAE,MAAM,KAAK,EAAE,KAAK,EAAE;AAAA,EAC5B;AAGA,QAAM,OAAO,EAAE,QAAQ,SAAS,EAAE;AAClC,MAAI,CAAC,WAAW,KAAK,IAAI,KAAK,KAAK,MAAM,GAAG,EAAE,SAAS,KAAK,CAAC,KAAK,KAAK,IAAI,EAAG,QAAO;AACrF,QAAM,QAAQ,OAAO,CAAC;AACtB,SAAO,OAAO,SAAS,KAAK,IAAI,QAAQ;AAC1C;AAGO,SAAS,eAAe,MAAc,QAAyB;AACpE,QAAM,EAAE,SAAS,MAAM,IAAI,cAAc,MAAM;AAC/C,QAAM,SAAS,CAAC,MAAc,EAAE,QAAQ,uBAAuB,MAAM;AACrE,SAAO,IAAI,OAAO,aAAa,OAAO,OAAO,CAAC,GAAG,OAAO,KAAK,CAAC,SAAS,EAAE,KAAK,IAAI;AACpF;AAGO,SAAS,UAAU,SAAwB,WAAmB,MAAc,KAAyB,KAAyB,WAAuC;AAC1K,QAAM,OAAO,YAAY,cAAc,KAAK,OAAO,KAAK,QAAQ,OAAO,KAAK;AAE5E,QAAM,gBAAgB,OAAO,IAAI,EAAE,MAAM,GAAG,EAAE,CAAC,KAAK,IAAI;AACxD,QAAM,OAAO,QAAQ,OAAO,YAAY,MAAM,aAAa,KAAK,IAAI,cAAc,SAAS,IAAI,CAAC,CAAC;AACjG,SAAO,MAAM,MAAM,KAAK,GAAG;AAC7B;AAEA,SAAS,SAAS,OAAuB;AACvC,UAAQ,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE,CAAC,KAAK,IAAI;AAC7C;;;ADnCI,SAkBE,KAlBF;AArDJ,IAAM,gBAAgB;AACtB,IAAM,mBAAmB;AAGzB,SAAS,cAAc,QAAqC;AAC1D,QAAM,QAAQ,OAAkD,MAAS;AACzE,QAAM,YAAY,OAAO,MAAM;AAC/B,YAAU,UAAU;AACpB,QAAM,OAAO,MAAM,aAAa,MAAM,OAAO;AAC7C,YAAU,MAAM,MAAM,CAAC,CAAC;AACxB,QAAM,QAAQ,CAAC,cAAsB;AACnC,SAAK;AACL,cAAU,QAAQ,SAAS;AAC3B,UAAM,SAAS,MAAM;AACnB,gBAAU,QAAQ,SAAS;AAC3B,YAAM,UAAU,WAAW,QAAQ,gBAAgB;AAAA,IACrD;AACA,UAAM,UAAU,WAAW,QAAQ,aAAa;AAAA,EAClD;AACA,SAAO,EAAE,OAAO,KAAK;AACvB;AASA,IAAM,gBAAuE,EAAE,IAAI,OAAO,IAAI,OAAO,IAAI,MAAM;AAC/G,IAAM,eAAsE,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG;AAErG,IAAM,SAAS,CAAC,SAA2B,OAAO,SAAS,YAAY,OAAO,SAAS,WAAW,OAAO,IAAI,IAAI;AAmBjH,SAAS,QAAQ,EAAE,SAAS,QAAQ,cAAc,cAAc,gBAAgB,gBAAgB,KAAK,GAA2B;AAC9H,QAAM,SAAS,CAAC,WAAmB,SAAkB,OAAe,MAAuB,WACzF;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,UAAU;AAAA,MACV,cAAY;AAAA,MACZ,UAAU,CAAC;AAAA,MACX,eAAe,CAAC,MAAM;AACpB,UAAE,eAAe;AACjB,YAAI,QAAS,SAAQ,SAAS;AAAA,MAChC;AAAA,MACA,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,MACjB,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA,iBAAiB,IAAI;AAAA,MACvB;AAAA,MAEA;AAAA,4BAAC,UAAK,WAAU,yBAAyB,gBAAK;AAAA,QAC9C,oBAAC,UAAK,WAAU,gCAAgC,kBAAO;AAAA;AAAA;AAAA,EACzD;AAEF;AAAA;AAAA,IAEE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA,cAAc,IAAI;AAAA,QACpB;AAAA,QAEC;AAAA,iBAAO,IAAI,cAAc,gBAAgB,oBAAC,mBAAgB,MAAM,aAAa,IAAI,GAAG,eAAW,MAAC,GAAI,oBAAC,aAAU,MAAM,IAAI,eAAW,MAAC,CAAE;AAAA,UACvI,OAAO,GAAG,cAAc,gBAAgB,oBAAC,iBAAc,MAAM,aAAa,IAAI,GAAG,eAAW,MAAC,GAAI,oBAAC,YAAS,MAAM,IAAI,eAAW,MAAC,CAAE;AAAA;AAAA;AAAA,IACtI;AAAA;AAEJ;AAeO,IAAM,cAAc,WAA+C,SAASA,aAAY,YAAY,KAAK;AAE9G,SAAO,oBAAC,oBAAkB,GAAG,gBAAgB,UAAU,GAAG,cAAc,KAAK;AAC/E,CAAC;AAED,SAAS,iBACP;AAAA,EACE,cAAc;AAAA,EACd;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,WAAW;AAAA,EACX,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB;AAAA,EACA,WAAW;AAAA,EACX,WAAW;AAAA,EACX,OAAO;AAAA,EACP,UAAU;AAAA,EACV,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AACb,GACA;AACA,QAAM,SAA6B,EAAE,QAAQ,WAAW,SAAS;AACjE,QAAM,CAAC,SAAS,UAAU,IAAI,qBAAoC,EAAE,OAAO,aAAa,CAAC;AACzF,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,EAAE;AACnC,QAAM,WAAW,OAAgC,IAAI;AACrD,QAAM,cAAc,CAAC,YAAY,CAAC;AAIlC,QAAM,SAAS,OAAO,OAAO;AAC7B,SAAO,UAAU;AAEjB,QAAM,OAAO,CAAC,SAAwB;AACpC,QAAI,SAAS,OAAO,QAAS;AAC7B,WAAO,UAAU;AACjB,eAAW,IAAI;AACf,eAAW,IAAI;AAAA,EACjB;AAGA,QAAM,YAAY,MAAqB;AACrC,UAAM,SAAS,YAAY,MAAM,MAAM;AACvC,QAAI,OAAsB;AAC1B,QAAI,WAAW,KAAM,QAAO;AAAA,aACnB,WAAW,OAAW,QAAO,MAAM,QAAQ,QAAQ,SAAS,GAAG,KAAK,GAAG;AAChF,SAAK,IAAI;AACT,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,CAAC,WAAmB,aAAa,MAAM;AACvD,QAAI,CAAC,YAAa;AAElB,UAAM,QAAQ,UAAU,YAAY,MAAM,MAAM,IAAI;AACpD,UAAM,OAAO,UAAU,UAAa,UAAU,OAAO,OAAO,UAAU;AACtE,UAAM,OAAO,UAAU,MAAM,WAAW,OAAO,YAAY,KAAK,KAAK,SAAS;AAC9E,SAAK,IAAI;AACT,QAAI,QAAS,SAAQ,iBAAiB,MAAM,MAAM,CAAC;AAAA,EACrD;AACA,QAAM,OAAO,cAAc,CAAC,cAAc,UAAU,SAAS,CAAC;AAE9D,MAAI,UAAU;AACZ,WAAO,oBAAC,SAAK,GAAG,iBAAiB,GAAG,4BAA4B,UAAU,IAAI,GAAG,gBAAgB,OAAO,OAAO,GAAG,SAAS,CAAC,GAAG;AAAA,EACjI;AAEA,QAAM,gBAAgB,CAAC,MAA6C;AAClE,UAAM,QAA0C,EAAE,SAAS,CAAC,GAAG,EAAE,WAAW,KAAK,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,WAAW,KAAK,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,IAAI,EAAE,EAAE;AAC/J,UAAM,UAAU,MAAM,EAAE,GAAG;AAC3B,QAAI,SAAS;AACX,QAAE,eAAe;AACjB,gBAAU,GAAG,OAAO;AAAA,IACtB,WAAY,EAAE,QAAQ,UAAU,QAAQ,UAAe,EAAE,QAAQ,SAAS,QAAQ,QAAY;AAC5F,QAAE,eAAe;AACjB,UAAI,CAAC,YAAa;AAClB,YAAM,OAAO,EAAE,QAAQ,SAAS,MAAO;AACvC,WAAK,IAAI;AACT,cAAQ,iBAAiB,MAAM,MAAM,CAAC;AAAA,IACxC,WAAW,EAAE,QAAQ,SAAS;AAC5B,cAAQ,iBAAiB,UAAU,GAAG,MAAM,CAAC;AAC7C,qBAAe,CAAC;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,YAAY,aAAa,SAAS,MAAM;AAC9C,QAAM,YAAY,YAAY,CAAC,OAAO,MAAM,GAAG,WAAW,OAAO,MAAM,CAAC,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,IAAI;AACtG,QAAM,eAAe,gBAAgB,QAAQ,UAAa,YAAY,QAAQ,UAAU;AACxF,QAAM,eAAe,gBAAgB,QAAQ,UAAa,YAAY,QAAQ,UAAU;AACxF,QAAM,YAAY;AAElB;AAAA;AAAA;AAAA,IAGE;AAAA,MAAC;AAAA;AAAA,QACC,aAAa,CAAC,MAAM;AAClB,cAAI,YAAY,SAAS,SAAS,SAAS,EAAE,MAAc,KAAM,EAAE,OAAuB,QAAQ,QAAQ,EAAG;AAC7G,YAAE,eAAe;AACjB,mBAAS,SAAS,MAAM;AAAA,QAC1B;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA,UAAU,IAAI;AAAA,UACd,gBAAgB,OAAO,OAAO;AAAA,UAC9B,YAAY;AAAA;AAAA,UAEZ,YAAY;AAAA,UACZ,iBAAiB,IAAI;AAAA,UACrB;AAAA,UACA,kBAAkB,SAAS,KAAK;AAAA,UAChC,YAAY;AAAA,UACZ;AAAA,QACF;AAAA,QAEC;AAAA,oBAAU,oBAAC,UAAK,WAAW,WAAY,kBAAO;AAAA,UAC/C;AAAA,YAAC;AAAA;AAAA,cACC,KAAK,CAAC,OAAO;AACX,yBAAS,UAAU;AACnB,oBAAI,OAAO,QAAQ,WAAY,KAAI,EAAE;AAAA,yBAC5B,IAAK,KAAI,UAAU;AAAA,cAC9B;AAAA,cACA;AAAA,cACA;AAAA,cACA,MAAK;AAAA,cACL,MAAK;AAAA,cACL,WAAW,cAAc,MAAM,QAAQ,UAAa,OAAO,KAAK,YAAY;AAAA,cAC5E,cAAa;AAAA,cACb;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,cAAY;AAAA,cACZ,mBAAiB;AAAA,cACjB,oBAAkB;AAAA,cAClB,gBAAc,UAAU,WAAW;AAAA,cACnC,iBAAe,WAAW;AAAA,cAC1B,iBAAe;AAAA,cACf,iBAAe;AAAA,cACf,kBAAgB;AAAA,cAChB,OAAO,UAAU,OAAO;AAAA,cACxB,SAAS,CAAC,MAAM;AACd,2BAAW,IAAI;AACf,wBAAQ,iBAAiB,SAAS,MAAM,CAAC;AACzC,0BAAU,CAAC;AAAA,cACb;AAAA,cACA,QAAQ,CAAC,MAAM;AACb,0BAAU;AACV,2BAAW,KAAK;AAChB,yBAAS,CAAC;AAAA,cACZ;AAAA,cACA,UAAU,CAAC,MAAM;AACf,sBAAM,OAAO,EAAE,OAAO;AACtB,oBAAI,CAAC,eAAe,MAAM,MAAM,EAAG;AACnC,wBAAQ,IAAI;AACZ,sBAAM,SAAS,YAAY,MAAM,MAAM;AACvC,oBAAI,WAAW,OAAW,MAAK,MAAM;AAAA,cACvC;AAAA,cACA,WAAW;AAAA,cACX,WAAW,GAAG,gIAAgI,uBAAuB;AAAA;AAAA,UACvK;AAAA,UACC,UAAU,oBAAC,UAAK,WAAW,GAAG,WAAW,YAAY,MAAM,GAAI,kBAAO;AAAA,UACtE,YACC;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,KAAK;AAAA,cACd,QAAQ,KAAK;AAAA,cACb;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IAEJ;AAAA;AAEJ;","names":["InputNumber"]}
@@ -6,19 +6,19 @@ import {
6
6
  FLOATING_EDGE_PX,
7
7
  FLOATING_GAP_PX,
8
8
  FloatingArrow
9
- } from "./chunk-S66GKX2W.js";
9
+ } from "./chunk-OAWUZIIN.js";
10
10
  import {
11
11
  useFloatingPosition
12
- } from "./chunk-3ABWBQCS.js";
12
+ } from "./chunk-GTNCXOUL.js";
13
13
  import {
14
14
  elevationClass
15
- } from "./chunk-TCYDVNSU.js";
15
+ } from "./chunk-MT4VH7QV.js";
16
16
  import {
17
17
  colorVariantToClassName
18
- } from "./chunk-IP2J3BWY.js";
18
+ } from "./chunk-6AMBZXZJ.js";
19
19
  import {
20
20
  skeletonBoxProps
21
- } from "./chunk-54HHEXXD.js";
21
+ } from "./chunk-VKN374SD.js";
22
22
 
23
23
  // src/dropdown/Dropdown.tsx
24
24
  import { useEffect } from "react";
@@ -327,4 +327,4 @@ export {
327
327
  DropdownLabel,
328
328
  DropdownDivider
329
329
  };
330
- //# sourceMappingURL=chunk-FNJHS5KQ.js.map
330
+ //# sourceMappingURL=chunk-E5JTEQ4V.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/dropdown/Dropdown.tsx","../src/dropdown/useDropdown.tsx","../src/dropdown/utils.ts","../src/dropdown/_components/DropdownTrigger.tsx","../src/dropdown/_components/DropdownContent.tsx","../src/dropdown/_components/DropdownItem.tsx","../src/lib/linkBehavior.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useEffect } from \"react\";\nimport { cn } from \"@mari-ui/core\";\nimport type { DropdownProps } from \"./types\";\nimport { DropdownProvider, useDropdown } from \"./useDropdown\";\nimport { getFocusable, getRovingTarget } from \"./utils\";\n\nexport type { DropdownProps };\n\n/*\n * Faz 13.5 bulgusu: sarmalayıcı `role=\"menu\"` + `tabIndex={0}` taşıyordu ama\n * hem trigger'ı HEM de içeriği kapsıyordu — `DropdownContent`in çocukları\n * gerçek `menuitem`ler değil, tamamen keyfi içerik (bkz. Dropdown.stories.tsx),\n * yani `role=\"menu\"` semantik olarak yanlıştı ve `tabIndex={0}` anlamsız bir\n * ekstra tab durağı ekliyordu. İkisi de kaldırıldı — gerçek etkileşim zaten\n * `DropdownTrigger`in kendi `<button>`ı üzerinden klavyeyle erişilebilir.\n *\n * Eskiden ne Escape ile kapanma ne de dışarı tıklayınca kapanma vardı —\n * açık kalan bir dropdown'ı klavyeyle veya mouse'la kapatmanın tek yolu\n * trigger'a tekrar tıklamaktı. İkisi de eklendi.\n */\nfunction DropdownRoot({ children, hover = false, className }: Readonly<DropdownProps>) {\n const { visible, setVisible, anchorRef, panelRef, triggerRef, scheduleHoverClose, cancelHoverClose, skeleton } = useDropdown();\n\n useEffect(() => {\n if (!visible) return;\n\n // Faz 13.5 kullanıcı bulgusu (round 2): panel artık `document.body`'e\n // portal edildiğinden `anchorRef`in ALT AĞACINDA DEĞİL — bu kontrol\n // sadece `anchorRef`e bakıyor olsaydı panelin İÇİNE (örn. bir menü\n // öğesine) tıklamak bile \"dışarı tıklama\" sanılıp dropdown'ı ANINDA\n // kapatırdı, tıklamanın kendi `onClick`i hiç işlemeden. `panelRef` de\n // kontrol ediliyor.\n const handlePointerDown = (event: MouseEvent) => {\n const target = event.target as Node;\n if (anchorRef.current?.contains(target)) return;\n if (panelRef.current?.contains(target)) return;\n setVisible(false);\n };\n // Panel `body`'ye portal edildiğinden DOM sırasında tetikleyicinin\n // ardından gelmez: odak panelin İÇİNDEYKEN Escape ya da panelin\n // sınırından Tab/Shift+Tab, paneli kapatıp odağı tetikleyiciye geri verir\n // (aksi halde odak `body`nin sonunda kaybolurdu).\n const handleKeyDown = (event: KeyboardEvent) => {\n const panel = panelRef.current;\n const focusInPanel = !!panel && panel.contains(document.activeElement);\n\n if (event.key === \"Escape\") {\n setVisible(false);\n if (focusInPanel) triggerRef.current?.focus();\n return;\n }\n\n // Faz 15.5: panel içi ↑/↓/Home/End/harf gezinmesi (bkz. `getRovingTarget`).\n // Bir metin alanındaki (panel içi arama vb.) tuşlar o alana aittir.\n const typing = document.activeElement instanceof HTMLInputElement || document.activeElement instanceof HTMLTextAreaElement;\n if (focusInPanel && !typing && !event.metaKey && !event.ctrlKey && !event.altKey) {\n const target = getRovingTarget(getFocusable(panel), document.activeElement, event.key);\n if (target) {\n event.preventDefault();\n target.focus();\n return;\n }\n }\n\n if (event.key === \"Tab\" && focusInPanel) {\n const focusable = getFocusable(panel);\n const active = document.activeElement;\n const leavingForward = !event.shiftKey && (focusable.length === 0 || active === (focusable.at(-1) ?? null));\n const leavingBackward = event.shiftKey && (focusable.length === 0 || active === (focusable[0] ?? null) || active === panel);\n if (leavingForward || leavingBackward) {\n event.preventDefault();\n setVisible(false);\n triggerRef.current?.focus();\n }\n }\n };\n\n document.addEventListener(\"mousedown\", handlePointerDown);\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n document.removeEventListener(\"mousedown\", handlePointerDown);\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [visible, setVisible, anchorRef, panelRef, triggerRef]);\n\n // `anchorRef` artık sadece dışarı-tıklama tespiti için değil, aynı zamanda\n // `DropdownContent`in `position: fixed` konumunu hesapladığı referans kutu\n // (bkz. DropdownContent.tsx) — bu yüzden `useDropdown()`dan geliyor,\n // `DropdownContent` da aynı ref'e erişebilsin diye.\n //\n // Faz 13.5 kullanıcı bulgusu (round 2): `onMouseLeave` eskiden ANINDA\n // `setVisible(false)` çağırıyordu — panel artık tetikleyiciden `GAP_PX`\n // kadar uzakta VE ayrı bir DOM alt ağacında (portal) olduğundan, mouse\n // tetikleyiciden panele doğru hareket ederken bu boşluğu geçerken\n // `anchorRef`in dışına çıkıyor, kullanıcı paneli görmeye fırsat\n // bulamadan menü kapanıyordu. Artık kapatma `scheduleHoverClose` ile\n // GECİKMELİ planlanıyor; mouse panele ulaşırsa (bkz. DropdownContent.tsx)\n // `cancelHoverClose` bunu iptal ediyor.\n return (\n <div\n ref={anchorRef}\n className={cn(\"inline-block self-start\", className)}\n onMouseEnter={\n hover && !skeleton\n ? () => {\n cancelHoverClose();\n setVisible(true);\n }\n : undefined\n }\n onMouseLeave={hover ? scheduleHoverClose : undefined}\n >\n {children}\n </div>\n );\n}\n\n/** `DropdownProvider`ı kendi içine gömer — tüketicinin ayrıca sarması gerekmez. */\nexport function Dropdown(props: Readonly<DropdownProps>) {\n return (\n <DropdownProvider hover={props.hover} skeleton={props.skeleton}>\n <DropdownRoot {...props} />\n </DropdownProvider>\n );\n}\n","\"use client\";\n\nimport React, { createContext, useCallback, useContext, useId, useMemo, useRef } from \"react\";\nimport { useDisclosure } from \"@mari-ui/core\";\n\n/*\n * Faz 13.5 kullanıcı bulgusu (round 2): panel `document.body`'e portal\n * edildiğinden beri (kırpma düzeltmesi) tetikleyici ile panel arasında\n * `GAP_PX` kadar bir BOŞLUK var ve panel artık `anchorRef`in DOM alt ağacında\n * DEĞİL — mouse tetikleyiciden panele doğru hareket ederken bu boşluğu\n * geçerken `anchorRef`in dışına çıkıyor, `onMouseLeave` ANINDA kapatıyor.\n * Kullanıcı paneli görmeye bile fırsat bulamadan menü kapanıyordu. Standart\n * \"hover-intent\" çözümü: kapatma anında değil, kısa bir gecikmeyle\n * planlanır; mouse bu süre içinde tetikleyiciye VEYA panele (ikisi de aynı\n * `cancelHoverClose`i çağırıyor) geri dönerse iptal edilir.\n */\nconst HOVER_CLOSE_DELAY_MS = 200;\n\ninterface DropdownContextType {\n visible: boolean;\n setVisible: (val: boolean) => void;\n /** `DropdownContent`in `position: fixed` konumunu hesaplarken referans aldığı kutu — bkz. `Dropdown.tsx`. */\n anchorRef: React.RefObject<HTMLDivElement | null>;\n /*\n * Portal edilen panelin kendi DOM düğümü. `Dropdown.tsx`'teki dışarı-tıklama\n * algılaması eskiden sadece `anchorRef`i kontrol ediyordu — panel artık\n * `document.body`'e portal edildiğinden `anchorRef`in ALT AĞACINDA DEĞİL,\n * bu yüzden panelin İÇİNE (örn. bir menü öğesine) tıklamak bile \"dışarı\n * tıklama\" sanılıp dropdown'ı KAPATIYORDU. Bu ref ikisinin de kontrol\n * edilebilmesi için paylaşılıyor.\n */\n panelRef: React.RefObject<HTMLDivElement | null>;\n /** Tetikleyici `<button>` — Escape/Tab ile panelden çıkılınca odak buraya döner. */\n triggerRef: React.RefObject<HTMLButtonElement | null>;\n /** Panelin `id`si — tetikleyicinin `aria-controls`ü bunu gösterir. */\n panelId: string;\n /** Klavyeyle açıldıysa panel görünür olunca odağın gideceği uç (Enter/Boşluk/↓ → ilk öğe, ↑ → son öğe); `false` → odak taşınmaz. */\n focusPanelOnOpenRef: React.RefObject<false | \"first\" | \"last\">;\n /** `skeleton` açıkken tetikleyici yer tutucu çizer ve panel açılmaz. */\n skeleton: boolean;\n /** `hover` modundayken hem tetikleyici hem panel tarafından paylaşılan gecikmeli kapatma. */\n hoverMode: boolean;\n scheduleHoverClose: () => void;\n cancelHoverClose: () => void;\n}\n\nconst DropdownContext = createContext<DropdownContextType | null>(null);\n\n/*\n * Artık `@mari-ui/core`'un `useDisclosure` hook'u üzerine kurulu. Bu\n * Provider dışa aktarılmıyor (bkz. index.ts) — eskiden `DropdownProvider`\n * `useDropdown.tsx`'te tanımlıydı ama `index.ts`'te export EDİLMİYORDU,\n * yani tüketici `Dropdown`ı kullanabilmek için derin import yapmak zorunda\n * kalıyordu. Artık `Dropdown` component'i Provider'ı\n * kendi içine gömüyor; tüketicinin bundan haberi olmasına gerek yok.\n */\nexport function DropdownProvider({ children, hover = false, skeleton = false }: Readonly<{ children: React.ReactNode; hover?: boolean; skeleton?: boolean }>) {\n const { isOpen, open, close } = useDisclosure();\n const anchorRef = useRef<HTMLDivElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const focusPanelOnOpenRef = useRef<false | \"first\" | \"last\">(false);\n const panelId = useId();\n const closeTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const cancelHoverClose = useCallback(() => {\n if (closeTimeoutRef.current) {\n clearTimeout(closeTimeoutRef.current);\n closeTimeoutRef.current = null;\n }\n }, []);\n\n const scheduleHoverClose = useCallback(() => {\n cancelHoverClose();\n closeTimeoutRef.current = setTimeout(close, HOVER_CLOSE_DELAY_MS);\n }, [cancelHoverClose, close]);\n\n const value = useMemo<DropdownContextType>(\n () => ({ visible: isOpen, setVisible: (v: boolean) => (v ? open() : close()), anchorRef, panelRef, triggerRef, panelId, focusPanelOnOpenRef, hoverMode: hover, skeleton, scheduleHoverClose, cancelHoverClose }),\n [isOpen, open, close, hover, skeleton, scheduleHoverClose, cancelHoverClose, panelId]\n );\n return <DropdownContext.Provider value={value}>{children}</DropdownContext.Provider>;\n}\n\nexport function useDropdown(): DropdownContextType {\n const context = useContext(DropdownContext);\n if (!context) {\n throw new Error(\"useDropdown, <Dropdown> içinde kullanılmalı.\");\n }\n return context;\n}\n","import { cn, resolveColorVariant, type ColorRole, type Variant } from \"@mari-ui/core\";\nimport { colorVariantToClassName } from \"../lib/colorClasses\";\n\nexport { computePanelPosition, parsePlacement } from \"../lib/floating\";\n\nconst FOCUSABLE_SELECTOR = 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\nexport function getFocusable(root: HTMLElement | null): HTMLElement[] {\n // `tabIndex < 0`: seçici `a[href]`/`button` ile eşleşse de Tab sırasından bilerek çıkarılmış\n // (kapalı akordeonun satırları gibi) — ok tuşu gezinmesi de onları atlamalı.\n return root ? Array.from(root.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)).filter((el) => el.tabIndex >= 0) : [];\n}\n\n/**\n * Panel içi klavye gezinmesi (APG \"menu button\" tuş modeli). İçerik\n * keyfi olabildiği için `role=\"menu\"` verilmez; ama odaklanabilir öğeler\n * arasında ↑/↓ (sarar), Home/End ve harfle atlama (başlığı o harfle başlayan\n * sonraki öğe) çalışır. Hedef öğeyi döner, tuş bu modele ait değilse `null`.\n */\nexport function getRovingTarget(items: HTMLElement[], current: Element | null, key: string): HTMLElement | null {\n if (items.length === 0) return null;\n const index = current ? items.indexOf(current as HTMLElement) : -1;\n switch (key) {\n case \"ArrowDown\":\n return items[(index + 1) % items.length] ?? null;\n case \"ArrowUp\":\n return items[index <= 0 ? items.length - 1 : index - 1] ?? null;\n case \"Home\":\n return items[0] ?? null;\n case \"End\":\n return items[items.length - 1] ?? null;\n default: {\n if (key.length !== 1 || key === \" \") return null;\n const char = foldCase(key);\n for (let step = 1; step <= items.length; step++) {\n const candidate = items[(index + step) % items.length];\n if (candidate && foldCase(candidate.textContent?.trim() ?? \"\").startsWith(char)) return candidate;\n }\n return null;\n }\n }\n}\n\n/**\n * Harfle atlama için katlama. `toLocaleLowerCase(\"tr\")` Latin \"I\"yı \"ı\" yapar\n * (\"Info\" → \"ınfo\") ve \"i\" tuşu onu bulamaz. ı→i katlanır: i/ı/I/İ aynı harf\n * sayılır (Tree ve AutoComplete aramasıyla aynı kural).\n */\nfunction foldCase(text: string): string {\n return text.toLocaleLowerCase(\"tr\").replace(/ı/g, \"i\");\n}\n\n/** Renk/variant verilmemişse (eski `variant=\"none\"` varsayılanı) düz, renksiz bir trigger döner. */\nexport function getTriggerClasses(color: ColorRole | undefined, variant: Variant | undefined): string {\n if (!color || !variant) return \"\";\n return cn(colorVariantToClassName(resolveColorVariant(color, variant)), \"rounded-md px-3 py-1.5\");\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { cn } from \"@mari-ui/core\";\nimport type { DropdownTriggerProps } from \"../types\";\nimport { useDropdown } from \"../useDropdown\";\nimport { getTriggerClasses } from \"../utils\";\nimport { skeletonBoxProps } from \"../../lib/skeleton\";\n\nexport function DropdownTrigger({ children, className, color, variant, onClick, \"aria-label\": ariaLabel }: Readonly<DropdownTriggerProps>) {\n const { visible, setVisible, triggerRef, panelId, focusPanelOnOpenRef, hoverMode, skeleton } = useDropdown();\n const classes = cn(\"cursor-pointer\", getTriggerClasses(color, variant), className);\n\n // İskelet: tetikleyicinin kendi sınıfları (boyut, radius, flex düzeni) korunur,\n // içerik görünmez olarak yerinde kalır → yüklenince kutu zıplamaz; tıklanamaz.\n if (skeleton) {\n return (\n <span {...skeletonBoxProps(cn(\"inline-block\", classes, \"*:invisible\"))}>\n {children}\n </span>\n );\n }\n\n return (\n <button\n ref={triggerRef}\n type=\"button\"\n aria-label={ariaLabel}\n aria-expanded={visible}\n aria-controls={visible ? panelId : undefined}\n className={classes}\n onClick={(event) => {\n // `detail === 0`: click'i fare değil klavye (Enter/Boşluk) üretti.\n const fromKeyboard = event.detail === 0;\n if (!visible && fromKeyboard) focusPanelOnOpenRef.current = \"first\";\n // `hover` modunda fare zaten üzerine gelince açtı — ardından gelen\n // tıklama toggle etseydi menü kullanıcının gözü önünde KAPANIRDI.\n // Fare tıklaması orada sadece açık tutar; klavye toggle etmeye devam eder.\n setVisible(hoverMode && !fromKeyboard ? true : !visible);\n onClick?.(event);\n }}\n // APG menu button: ↓ açar ve ilk öğeye, ↑ açar ve son öğeye odaklanır.\n onKeyDown={(event) => {\n if (event.key !== \"ArrowDown\" && event.key !== \"ArrowUp\") return;\n event.preventDefault();\n focusPanelOnOpenRef.current = event.key === \"ArrowDown\" ? \"first\" : \"last\";\n setVisible(true);\n }}\n >\n {children}\n </button>\n );\n}\n","\"use client\";\n\nimport React, { useEffect } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"@mari-ui/core\";\nimport type { DropdownContentProps } from \"../types\";\nimport { useDropdown } from \"../useDropdown\";\nimport { elevationClass } from \"../../lib/elevationClass\";\nimport { FLOATING_ARROW_GAP_PX, FLOATING_ARROW_INSET_PX, FLOATING_EDGE_PX, FLOATING_GAP_PX, FloatingArrow } from \"../../lib/FloatingArrow\";\nimport { useFloatingPosition } from \"../../lib/useFloatingPosition\";\nimport { getFocusable } from \"../utils\";\n\n\n/**\n * Panel `document.body`'e portal edilip `position: fixed` ile konumlanır\n * (`overflow: hidden` atalar tarafından kırpılmasın diye). Konum tek seferlik\n * değil, panel AÇIK KALDIĞI SÜRECE her karede yeniden hesaplanır: içerik\n * asenkron yüklenip sayfa düzenini geç kaydırdığında ölçüm eskimesin. Hesabın\n * kendisi (yön, hiza, flip, kelepçeleme, ok) `computePanelPosition`da —\n * floating-ui gibi bir kütüphaneye geçilmedi.\n *\n * Yükseklik, foundations/Elevation'daki kurala göre `elevationClass.md`\n * (Dropdown/popover için `shadow-mari-md` + ince `border-mari-border`);\n * dikey yönlerde en az tetikleyici genişliğinde.\n */\nexport function DropdownContent({ placement = \"bottom-end\", children, className, customVisible, arrow, offset = 0 }: DropdownContentProps) {\n const { visible, anchorRef, panelRef, panelId, focusPanelOnOpenRef, hoverMode, scheduleHoverClose, cancelHoverClose } = useDropdown();\n const isVisible = customVisible ?? visible;\n const hasArrow = !!arrow;\n const pointAtCenter = typeof arrow === \"object\" && !!arrow.pointAtCenter;\n const coords = useFloatingPosition(isVisible, anchorRef, panelRef, {\n placement,\n gap: (hasArrow ? FLOATING_ARROW_GAP_PX : FLOATING_GAP_PX) + offset,\n edge: FLOATING_EDGE_PX,\n arrow: hasArrow ? { inset: FLOATING_ARROW_INSET_PX, pointAtCenter } : undefined,\n });\n\n // Panel `body`'nin sonuna portal edildiğinden Tab ile tetikleyiciden panele\n // DOM sırasıyla ulaşılamaz. Klavyeyle (Enter/Boşluk) açıldıysa odağı\n // panele biz taşırız — ama `invisible` (visibility: hidden) bir öğeye odak\n // verilemediğinden konum hesaplanana (`coords`) kadar beklenir.\n useEffect(() => {\n const edge = focusPanelOnOpenRef.current;\n if (!isVisible || !coords || !edge) return;\n focusPanelOnOpenRef.current = false;\n const panel = panelRef.current;\n const focusable = getFocusable(panel);\n const target = edge === \"last\" ? focusable.at(-1) : focusable[0];\n (target ?? panel)?.focus();\n }, [isVisible, coords, focusPanelOnOpenRef, panelRef]);\n\n if (!isVisible || typeof document === \"undefined\") return null;\n\n return createPortal(\n <div\n ref={panelRef}\n id={panelId}\n tabIndex={-1}\n // `hover` modundayken panel de tetikleyiciyle AYNI gecikmeli kapatma\n // mekanizmasını paylaşıyor — mouse tetikleyiciden panele geçerken\n // (bkz. useDropdown.tsx'teki açıklama) `cancelHoverClose` bekleyen\n // kapatmayı iptal ediyor, panelden ayrılınca `scheduleHoverClose`\n // yeniden planlıyor.\n onMouseEnter={hoverMode ? cancelHoverClose : undefined}\n onMouseLeave={hoverMode ? scheduleHoverClose : undefined}\n className={cn(\n // Genişlik viewport'tan 1rem dar kalır: 375px'te geniş bir panel ekrandan taşmaz.\n \"fixed text-wrap z-mari-dropdown w-max max-w-[min(42rem,calc(100vw-1rem))] text-sm p-1 rounded-lg bg-mari-surface outline-none\",\n elevationClass.md,\n !coords && \"invisible\",\n className\n )}\n style={{ top: coords?.top ?? 0, left: coords?.left ?? 0, minWidth: coords?.anchorWidth }}\n >\n {hasArrow && coords && <FloatingArrow side={coords.side} offset={coords.arrowOffset} />}\n {children}\n </div>,\n document.body\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { cn } from \"@mari-ui/core\";\nimport type { DropdownItemProps } from \"../types\";\nimport { useDropdown } from \"../useDropdown\";\nimport { NewTabHint, getLinkAttrs } from \"../../lib/linkBehavior\";\n\n/*\n * Yapı ant.design menü öğesinden: 32px yükseklik (5px/12px iç boşluk, 22px\n * satır yüksekliği), 4px yarıçap, ikon + metin, disabled durumu. Renkler kendi\n * token'larımızdan: hover'da hafif zemin, danger'da hafif kırmızı zemin.\n */\nexport function DropdownItem({ children, icon, extra, danger = false, disabled = false, href, target, onClick, className }: Readonly<DropdownItemProps>) {\n const { setVisible, triggerRef } = useDropdown();\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement | HTMLAnchorElement>) => {\n onClick?.(event);\n setVisible(false);\n // Link sayfadan çıkarır; odağı tetikleyiciye döndürmek yalnızca yerinde kalan eylemlerde anlamlı.\n if (!href) triggerRef.current?.focus();\n };\n\n const classes = cn(\n \"flex min-h-8 pointer-coarse:min-h-11 w-full cursor-pointer items-center gap-2 rounded-sm px-3 py-[0.3125rem] text-start text-sm leading-[1.375rem] focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-mari-ring disabled:cursor-not-allowed disabled:opacity-25\",\n danger\n ? \"text-mari-error hover:bg-mari-error-subtle disabled:hover:bg-transparent\"\n : \"text-mari-foreground hover:bg-mari-foreground/[0.04] disabled:hover:bg-transparent\",\n className\n );\n\n const content = (\n <>\n {icon && (\n <span aria-hidden=\"true\" className=\"inline-flex shrink-0 items-center [&_svg]:size-3.5\">\n {icon}\n </span>\n )}\n <span className=\"min-w-0 flex-1\">{children}</span>\n {href && <NewTabHint target={target} />}\n {extra && <span className=\"ms-4 shrink-0 text-xs text-mari-muted\">{extra}</span>}\n </>\n );\n\n // `href` → gerçek bir link (orta tık / yeni sekmede aç / adres önizlemesi çalışır).\n // Devre dışı öğe her durumda `disabled` bir düğmedir: `<a>`nın `disabled` özniteliği yok.\n if (href && !disabled) {\n return (\n <a href={href} {...getLinkAttrs(target)} onClick={handleClick} className={classes}>\n {content}\n </a>\n );\n }\n\n return (\n <button type=\"button\" disabled={disabled} onClick={handleClick} className={classes}>\n {content}\n </button>\n );\n}\n\n/** Grup başlığı (\"Hesap\", kullanıcı e-postası…): odaklanılamaz, soluk küçük metin. */\nexport function DropdownLabel({ children, className }: Readonly<{ children: React.ReactNode; className?: string }>) {\n return <div className={cn(\"px-3 pb-1 pt-1.5 text-xs text-mari-muted\", className)}>{children}</div>;\n}\n\n/** Menü ayırıcısı: 1px, dikeyde 4px boşluk, hafif çizgi. */\nexport function DropdownDivider({ className }: Readonly<{ className?: string }>) {\n return <div role=\"separator\" className={cn(\"my-1 h-px bg-mari-foreground/[0.06]\", className)} />;\n}\n","import React from \"react\";\nimport { ExternalLinkIcon } from \"lucide-react\";\n\n/** HTML `target` değerleri; isimli bir çerçeve/pencere adı da verilebilir. */\nexport type LinkTarget = \"_self\" | \"_blank\" | \"_parent\" | \"_top\" | (string & {});\n\n/**\n * Bir linkin router'a (`onNavigate`) devredilip devredilmeyeceğini\n * belirleyen ortak alanlar (menü öğeleri, Breadcrumb, DropdownItem).\n */\nexport interface LinkBehaviorProps {\n /** Linkin açılacağı yer. `_blank` → yeni sekme (`rel=\"noopener noreferrer\"` otomatik). */\n target?: LinkTarget;\n /**\n * Aynı sekmede ama router'ı ATLAYARAK tam sayfa yükleme: `onNavigate`\n * verilmiş olsa bile tarayıcı sayfayı baştan yükler. Aynı domain'de ama\n * uygulamanın parçası olmayan sayfalar (`/blog` ayrı bir site) ya da\n * sunucunun yönlendirdiği adresler (`/logout`) için.\n */\n reloadDocument?: boolean;\n}\n\n/** `https:`, `mailto:`, `tel:` gibi şemalı ya da `//` ile başlayan adresler — router bunlara gidemez. */\nexport function isExternalHref(href: string): boolean {\n return /^([a-z][a-z\\d+.-]*:|\\/\\/)/i.test(href);\n}\n\n/** Bu link tarayıcıya mı bırakılmalı (router'a devredilmemeli)? */\nexport function bypassesRouter(href: string, { target, reloadDocument }: LinkBehaviorProps): boolean {\n return !!reloadDocument || (!!target && target !== \"_self\") || isExternalHref(href);\n}\n\n/** Değiştirici tuşsuz, sol tuşla yapılan tıklama — yalnızca bu router'a devredilir (⌘/Ctrl/Shift/orta tık tarayıcının). */\nexport function isPlainLeftClick(event: React.MouseEvent): boolean {\n return event.button === 0 && !event.metaKey && !event.ctrlKey && !event.shiftKey && !event.altKey;\n}\n\n/** `<a>`ya yayılacak `target` + `rel` (yeni bağlamda açılan linkler açanın `window.opener`ına erişemesin). */\nexport function getLinkAttrs(target: LinkTarget | undefined): { target?: string; rel?: string } {\n if (!target || target === \"_self\") return {};\n return { target, rel: target === \"_blank\" ? \"noopener noreferrer\" : undefined };\n}\n\n/**\n * Yeni sekmede açılan linkin görsel + sesli işareti: küçük bir dış bağlantı\n * ikonu ve ekran okuyucu için \"(yeni sekmede açılır)\". WCAG 3.2.5 — bağlam\n * değişikliği önceden bildirilmeli.\n */\nexport function NewTabHint({ target }: Readonly<{ target?: LinkTarget }>) {\n if (target !== \"_blank\") return null;\n return (\n <>\n <ExternalLinkIcon aria-hidden=\"true\" className=\"size-3 shrink-0 opacity-60\" />\n <span className=\"sr-only\">(yeni sekmede açılır)</span>\n </>\n );\n}\n"],"mappings":"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","names":["cn","jsx","cn","cn","jsx","cn","useEffect","cn","jsx","useEffect","cn","cn","jsx","jsxs","Fragment","jsx","jsxs","cn"]}
@@ -2,7 +2,7 @@
2
2
 
3
3
  import {
4
4
  Tag
5
- } from "./chunk-ZLPAXPDI.js";
5
+ } from "./chunk-GVJ4M63W.js";
6
6
  import {
7
7
  SelectPanel,
8
8
  buildSections,
@@ -12,7 +12,7 @@ import {
12
12
  nextEnabled,
13
13
  optionDomId,
14
14
  typeAheadMatch
15
- } from "./chunk-YZ7MDC6B.js";
15
+ } from "./chunk-LNL4TCGL.js";
16
16
  import {
17
17
  ClearButton
18
18
  } from "./chunk-KSPM2Z3T.js";
@@ -22,20 +22,20 @@ import {
22
22
  FIELD_MOBILE_TEXT_CLASS,
23
23
  getShapeClasses,
24
24
  getVariantClasses
25
- } from "./chunk-DUCIAQGR.js";
25
+ } from "./chunk-NENNFQEY.js";
26
26
  import {
27
27
  useFieldControl
28
- } from "./chunk-LBQMEHK6.js";
28
+ } from "./chunk-NPFMPRII.js";
29
29
  import {
30
30
  useFloatingPosition
31
- } from "./chunk-3ABWBQCS.js";
31
+ } from "./chunk-GTNCXOUL.js";
32
32
  import {
33
33
  sizeClass,
34
34
  touchTargetClass
35
- } from "./chunk-FFXRFQSU.js";
35
+ } from "./chunk-POBOJBNJ.js";
36
36
  import {
37
37
  skeletonBoxProps
38
- } from "./chunk-54HHEXXD.js";
38
+ } from "./chunk-VKN374SD.js";
39
39
 
40
40
  // src/select/Select.tsx
41
41
  import React, { useId, useRef as useRef2 } from "react";
@@ -389,4 +389,4 @@ function Select(outerProps) {
389
389
  export {
390
390
  Select
391
391
  };
392
- //# sourceMappingURL=chunk-IO4346TF.js.map
392
+ //# sourceMappingURL=chunk-FC7T3INX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/select/Select.tsx","../src/select/useSelectState.ts"],"sourcesContent":["\"use client\";\n\nimport React, { useId, useRef } from \"react\";\nimport { ChevronDownIcon, Loader2Icon } from \"lucide-react\";\nimport { cn } from \"@mari-ui/core\";\nimport { ClearButton } from \"../input/_components/FieldAdornments\";\nimport { FIELD_BASE_CLASS, FIELD_DISABLED_CLASS, FIELD_MOBILE_TEXT_CLASS, getShapeClasses, getVariantClasses } from \"../input/utils\";\nimport { useFieldControl } from \"../lib/fieldContext\";\nimport { skeletonBoxProps } from \"../lib/skeleton\";\nimport { sizeClass, touchTargetClass } from \"../lib/sizeClasses\";\nimport { useFloatingPosition } from \"../lib/useFloatingPosition\";\nimport { Tag } from \"../tag\";\nimport { optionDomId, SelectPanel } from \"./_components/SelectPanel\";\nimport type { SelectMultipleProps, SelectOption, SelectProps } from \"./types\";\nimport { useSelectState, type SelectState } from \"./useSelectState\";\n\nexport type { SelectProps };\n\nconst GAP_PX = 4;\n\n/** Çoklu modda kutu sabit yükseklik değil, en az o yükseklik — etiketler satırlara sarar. */\nconst MULTI_HEIGHT_CLASS = { sm: \"h-auto min-h-6 py-0.5\", md: \"h-auto min-h-8 py-1\", lg: \"h-auto min-h-10 py-1.5\" } as const;\n\nfunction optionLabel(option: SelectOption): React.ReactNode {\n return option.label ?? option.value;\n}\n\n/** Aramasız tetikleyicide görünen metin: seçilen (tekli), hiç seçim yokken yer tutucu; çokluda etiketler kendini gösterir. */\nfunction buttonText(single: SelectOption | undefined, hasValue: boolean, placeholder: string): React.ReactNode {\n if (single) return optionLabel(single);\n if (!hasValue) return <span className=\"truncate text-mari-muted\">{placeholder}</span>;\n return null;\n}\n\ntype KeyHandler = (e: React.KeyboardEvent, state: SelectState, searchable: boolean) => void;\n\nconst onArrow: KeyHandler = (e, state) => {\n e.preventDefault();\n const down = e.key === \"ArrowDown\";\n if (!state.open) state.openAt(!down && !e.altKey ? \"last\" : \"selected\");\n else state.move(down ? 1 : -1);\n};\n\nconst onEdge: KeyHandler = (e, state, searchable) => {\n // Arama kutusunda Home/End imleci taşır.\n if (!state.open || searchable) return;\n e.preventDefault();\n state.setActiveIndex(e.key === \"Home\" ? state.visibleOptions.findIndex((o) => !o.disabled) : state.visibleOptions.length - 1);\n};\n\nconst onConfirm: KeyHandler = (e, state, searchable) => {\n // Arama kutusunda boşluk bir karakterdir.\n if (e.key === \" \" && searchable) return;\n e.preventDefault();\n if (!state.open) state.openAt();\n else if (state.activeOption) state.pick(state.activeOption);\n};\n\nconst onEscape: KeyHandler = (e, state) => {\n if (!state.open) return;\n e.preventDefault();\n state.setOpen(false);\n};\n\n// APG: Tab tekli seçimde aktif seçeneği onaylar ve listeyi kapatır; odak normal akışla ilerler.\nconst onTab: KeyHandler = (_e, state) => {\n if (!state.open) return;\n if (!state.multiple && state.activeOption) state.pick(state.activeOption);\n else state.setOpen(false);\n};\n\nconst onBackspace: KeyHandler = (_e, state, searchable) => {\n if (searchable && state.multiple && !state.search && state.values.length > 0) state.removeValue(state.values.at(-1)!);\n};\n\nconst KEY_HANDLERS: Partial<Record<string, KeyHandler>> = {\n ArrowDown: onArrow,\n ArrowUp: onArrow,\n Home: onEdge,\n End: onEdge,\n Enter: onConfirm,\n \" \": onConfirm,\n Escape: onEscape,\n Tab: onTab,\n Backspace: onBackspace,\n};\n\n/** Tetikleyicideki tuşlar (APG combobox). Arama kutusu varsa harfler kutuya yazılır, yoksa harfle atlama. */\nfunction handleTriggerKey(e: React.KeyboardEvent, state: SelectState, searchable: boolean) {\n const handler = KEY_HANDLERS[e.key];\n if (handler) handler(e, state, searchable);\n else if (!searchable && e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey) state.typeChar(e.key);\n}\n\nfunction SelectTags({ state, maxTagCount, disabled }: Readonly<{ state: SelectState; maxTagCount?: number; disabled: boolean }>) {\n const shown = maxTagCount === undefined ? state.selectedOptions : state.selectedOptions.slice(0, maxTagCount);\n const hidden = state.selectedOptions.length - shown.length;\n return (\n <>\n {shown.map((option) => {\n const label = optionLabel(option);\n return (\n <Tag\n key={String(option.value)}\n onClose={disabled ? undefined : () => state.removeValue(option.value)}\n closeLabel={typeof label === \"string\" ? `${label} seçimini kaldır` : \"Seçimi kaldır\"}\n className=\"max-w-full\"\n >\n {label}\n </Tag>\n );\n })}\n {hidden > 0 && <Tag>+{hidden}</Tag>}\n </>\n );\n}\n\nfunction SelectSuffix({ loading, open }: Readonly<{ loading: boolean; open: boolean }>) {\n return (\n <span aria-hidden className=\"flex shrink-0 items-center text-mari-muted\">\n {loading ? (\n <Loader2Icon size={16} className=\"animate-spin motion-reduce:animate-[spin_2s_linear_infinite]\" />\n ) : (\n <ChevronDownIcon size={16} className={cn(\"transition-transform duration-150 motion-reduce:transition-none\", open && \"rotate-180\")} />\n )}\n </span>\n );\n}\n\n/*\n * yapı/davranış ant.design Select'ten, görünüm Input'la birebir\n * aynı (boyut, varyant, kenarlık, odak halkası, dokunma hedefi `lib`\n * paylaşımlı). Tekli ve çoklu (`mode=\"multiple\"`, etiketler) seçim, gruplar,\n * arama (`showSearch`, Türkçe/aksansız), temizleme, yükleniyor, `skeleton`.\n */\n/**\n * Erişilebilirlik (APG combobox): arama yoksa tetikleyici `<button\n * role=\"combobox\">` (label `htmlFor` ile bağlanabilir, native disabled),\n * aramada `<input role=\"combobox\">`. Odak HİÇ listeye geçmez; aktif seçenek\n * `aria-activedescendant`. ↑/↓/Home/End, Enter/Boşluk, Escape, Tab (seçip\n * geçer), harfle atlama; çokluda Backspace son etiketi siler.\n */\nexport function Select(outerProps: SelectProps) {\n // Field içindeyse id / aria-describedby / hata / required / disabled oradan tamamlanır.\n const props = useFieldControl(outerProps) as SelectProps;\n const {\n placeholder = \"Seçin\",\n showSearch = false,\n allowClear = false,\n clearLabel = \"Temizle\",\n loading = false,\n notFoundContent = \"Sonuç bulunamadı\",\n disabled = false,\n size = \"md\",\n variant = \"outline\",\n shape = \"default\",\n color,\n placement = \"bottom-start\",\n listHeight = \"16rem\",\n optionRender,\n id,\n name,\n required,\n className,\n skeleton = false,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n } = props;\n const maxTagCount = props.mode === \"multiple\" ? (props as SelectMultipleProps).maxTagCount : undefined;\n\n const state = useSelectState(props);\n const { multiple, open, values, selectedOptions, search } = state;\n const anchorRef = useRef<HTMLDivElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const controlRef = useRef<HTMLButtonElement & HTMLInputElement>(null);\n const listboxId = useId();\n const coords = useFloatingPosition(open, anchorRef, panelRef, { placement, gap: GAP_PX });\n\n // Klavyeyle gezinirken aktif satır listenin görünür alanında kalsın.\n React.useEffect(() => {\n if (open && state.activeOption) document.getElementById(optionDomId(listboxId, state.activeOption))?.scrollIntoView?.({ block: \"nearest\" });\n }, [open, state.activeOption, listboxId]);\n\n const geometry = cn(\"flex w-full items-center gap-2\", sizeClass[size], multiple && MULTI_HEIGHT_CLASS[size], getShapeClasses(shape, variant));\n if (skeleton) return <div {...skeletonBoxProps(cn(geometry, className))} />;\n\n const hasValue = values.length > 0;\n const showClear = allowClear && hasValue && !disabled;\n const single = multiple ? undefined : selectedOptions[0];\n\n const comboboxProps = {\n id,\n role: \"combobox\" as const,\n \"aria-expanded\": open,\n \"aria-controls\": open ? listboxId : undefined,\n \"aria-haspopup\": \"listbox\" as const,\n \"aria-activedescendant\": open && state.activeOption ? optionDomId(listboxId, state.activeOption) : undefined,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-required\": required || undefined,\n \"aria-invalid\": color === \"error\" || undefined,\n disabled,\n onKeyDown: (e: React.KeyboardEvent) => handleTriggerKey(e, state, showSearch),\n onBlur: (e: React.FocusEvent) => {\n // Odak kutunun içindeki bir düğmeye (temizle, etiket sil) geçtiyse kapatma.\n if (!anchorRef.current?.contains(e.relatedTarget as Node | null)) state.setOpen(false);\n },\n };\n\n // Kutunun herhangi bir yerine tıklamak odaklar ve açar/kapatır; iç düğmeler kendi işini yapar.\n const handleBoxMouseDown = (e: React.MouseEvent) => {\n if (disabled || (e.target as HTMLElement).closest(\"button:not([role=combobox])\")) return;\n e.preventDefault();\n controlRef.current?.focus();\n if (open) state.setOpen(false);\n else state.openAt();\n };\n\n return (\n <>\n {/* Fare kısayolu; klavye kullanıcısı doğrudan combobox'a sekmeyle gelir. */}\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions */}\n <div\n ref={anchorRef}\n onMouseDown={handleBoxMouseDown}\n className={cn(\n geometry,\n \"group relative cursor-pointer\",\n touchTargetClass[size],\n FIELD_BASE_CLASS,\n getVariantClasses(variant, color),\n disabled && FIELD_DISABLED_CLASS,\n className\n )}\n >\n <div className={cn(\"flex min-w-0 flex-1 items-center gap-1\", multiple && \"flex-wrap\")}>\n {multiple && <SelectTags state={state} maxTagCount={maxTagCount} disabled={disabled} />}\n {showSearch ? (\n <span className=\"relative flex min-w-[4ch] flex-1 items-center\">\n {/* Tekli seçimde seçili değer, yazmaya başlayınca kaybolur. Yer tutucu native `placeholder`\n (Input gibi) — ayrı bir span olsaydı devre dışı alanda axe onu kontrast ihlali sayıyordu. */}\n {!search && single && (\n <span aria-hidden className=\"pointer-events-none absolute inset-x-0 truncate\">\n {optionLabel(single)}\n </span>\n )}\n <input\n ref={controlRef}\n {...comboboxProps}\n type=\"text\"\n aria-autocomplete=\"list\"\n autoComplete=\"off\"\n placeholder={hasValue ? undefined : placeholder}\n value={search}\n onChange={(e) => {\n state.setSearch(e.target.value);\n state.setOpen(true);\n }}\n className={cn(\"w-full min-w-0 bg-transparent placeholder:text-mari-muted focus:outline-none disabled:cursor-not-allowed\", FIELD_MOBILE_TEXT_CLASS)}\n />\n </span>\n ) : (\n <button ref={controlRef} type=\"button\" {...comboboxProps} className={cn(\"min-w-0 flex-1 truncate text-left focus:outline-none\", FIELD_MOBILE_TEXT_CLASS)}>\n {buttonText(single, hasValue, placeholder)}\n </button>\n )}\n </div>\n\n {allowClear && (\n <ClearButton\n visible={showClear}\n label={clearLabel}\n onClear={() => {\n state.clear();\n controlRef.current?.focus();\n }}\n />\n )}\n <SelectSuffix loading={loading} open={open} />\n\n {name && (multiple ? values : values.slice(0, 1)).map((v) => <input key={String(v)} type=\"hidden\" name={name} value={String(v)} />)}\n </div>\n\n {open && (\n <SelectPanel\n ref={panelRef}\n listboxId={listboxId}\n coords={coords}\n sections={state.sections}\n flatOptions={state.visibleOptions}\n activeIndex={state.activeIndex}\n isSelected={state.isSelected}\n multiple={multiple}\n loading={loading}\n notFoundContent={notFoundContent}\n listHeight={listHeight}\n optionRender={optionRender}\n labelledBy={ariaLabelledBy}\n label={ariaLabel}\n onPick={(option) => {\n state.pick(option);\n controlRef.current?.focus();\n }}\n onHover={state.setActiveIndex}\n />\n )}\n </>\n );\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useControllableState } from \"@mari-ui/core\";\nimport type { SelectOption, SelectProps, SelectValue } from \"./types\";\nimport { buildSections, firstEnabled, flattenOptions, lastEnabled, nextEnabled, typeAheadMatch } from \"./utils\";\n\nconst TYPE_AHEAD_RESET_MS = 500;\n\n/**\n * Select'in durumu: seçili değer(ler), açık/kapalı, arama metni, aktif\n * (klavyeyle/fareyle üzerinde durulan) seçenek ve bunları değiştiren\n * eylemler. Tekli ve çoklu mod içeride aynı dizi olarak tutulur.\n */\nexport function useSelectState(props: SelectProps) {\n const multiple = props.mode === \"multiple\";\n const toArray = (v: SelectValue | SelectValue[] | null | undefined): SelectValue[] | undefined => {\n if (v === undefined) return undefined;\n if (v === null) return [];\n return Array.isArray(v) ? v : [v];\n };\n\n const allOptions = useMemo(() => flattenOptions(props.options), [props.options]);\n const findOption = (value: SelectValue) => allOptions.find((o) => o.value === value);\n\n const [values, setValuesState] = useControllableState<SelectValue[]>({\n value: toArray(props.value),\n defaultValue: toArray(props.defaultValue) ?? [],\n });\n const [open, setOpenState] = useControllableState<boolean>({ value: props.open, defaultValue: false, onChange: props.onOpenChange });\n const [search, setSearchState] = useState(\"\");\n const [activeIndex, setActiveIndex] = useState(-1);\n\n const sections = useMemo(() => buildSections(props.options, props.showSearch ? search : \"\"), [props.options, props.showSearch, search]);\n const visibleOptions = useMemo(() => sections.flatMap((s) => s.options), [sections]);\n const activeOption = activeIndex >= 0 ? visibleOptions[activeIndex] : undefined;\n\n // Yazdıkça aktif satır ilk eşleşme olur (Enter onu seçer); liste kısalınca sınır dışına düşmesin.\n useEffect(() => {\n if (search) setActiveIndex(firstEnabled(visibleOptions));\n // eslint-disable-next-line react-hooks/exhaustive-deps -- yalnız arama metni değişince\n }, [search]);\n useEffect(() => {\n if (activeIndex >= visibleOptions.length) setActiveIndex(firstEnabled(visibleOptions));\n }, [visibleOptions, activeIndex]);\n\n const commit = (next: SelectValue[]) => {\n setValuesState(next);\n if (multiple) {\n const onChange = props.onChange as ((v: SelectValue[], o: SelectOption[]) => void) | undefined;\n onChange?.(next, next.map(findOption).filter((o): o is SelectOption => !!o));\n } else {\n const onChange = props.onChange as ((v: SelectValue | null, o: SelectOption | null) => void) | undefined;\n const value = next[0] ?? null;\n onChange?.(value, value === null ? null : (findOption(value) ?? null));\n }\n };\n\n const setSearch = (text: string) => {\n setSearchState(text);\n props.onSearch?.(text);\n };\n\n const setOpen = (next: boolean) => {\n if (next === open) return;\n setOpenState(next);\n if (!next) {\n setActiveIndex(-1);\n if (search) setSearch(\"\");\n }\n };\n\n /** Açarken aktif satır: seçili olan (tekli) ya da ilk seçilebilir. */\n const openAt = (edge: \"selected\" | \"first\" | \"last\" = \"selected\") => {\n const selectedIndex = visibleOptions.findIndex((o) => values.includes(o.value));\n if (edge === \"last\") setActiveIndex(lastEnabled(visibleOptions));\n else if (edge === \"selected\" && selectedIndex >= 0 && !multiple) setActiveIndex(selectedIndex);\n else setActiveIndex(firstEnabled(visibleOptions));\n setOpen(true);\n };\n\n const pick = (option: SelectOption) => {\n if (option.disabled) return;\n if (!multiple) {\n commit([option.value]);\n setOpen(false);\n return;\n }\n const has = values.includes(option.value);\n commit(has ? values.filter((v) => v !== option.value) : [...values, option.value]);\n // Çoklu seçimde liste açık kalır; arama temizlenir ki sonraki seçim kolay olsun.\n if (search) setSearch(\"\");\n };\n\n const move = (step: 1 | -1) => {\n // Henüz etkin seçenek yoksa yukarı ok sondan, aşağı ok baştan başlar.\n const edge = step === -1 ? lastEnabled : firstEnabled;\n setActiveIndex((i) => (i < 0 ? edge(visibleOptions) : nextEnabled(visibleOptions, i, step)));\n };\n\n // Harfle atlama (arama kutusu yokken): art arda harfler 500ms içinde birikir.\n const typeAhead = useRef({ buffer: \"\", timer: 0 as ReturnType<typeof setTimeout> | 0 });\n useEffect(() => () => clearTimeout(typeAhead.current.timer || undefined), []);\n const typeChar = (char: string) => {\n const state = typeAhead.current;\n state.buffer += char;\n clearTimeout(state.timer || undefined);\n state.timer = setTimeout(() => (state.buffer = \"\"), TYPE_AHEAD_RESET_MS);\n const match = typeAheadMatch(visibleOptions, activeIndex, state.buffer);\n if (match < 0) return;\n setActiveIndex(match);\n setOpen(true);\n };\n\n const removeValue = (value: SelectValue) => commit(values.filter((v) => v !== value));\n const clear = () => commit([]);\n\n return {\n multiple,\n values,\n selectedOptions: values.map((v) => findOption(v) ?? { value: v }),\n open,\n setOpen,\n openAt,\n search,\n setSearch,\n sections,\n visibleOptions,\n activeIndex,\n setActiveIndex,\n activeOption,\n pick,\n move,\n typeChar,\n removeValue,\n clear,\n isSelected: (option: SelectOption) => values.includes(option.value),\n };\n}\n\nexport type SelectState = ReturnType<typeof useSelectState>;\n"],"mappings":"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","names":["useRef","useRef"]}
@@ -9,17 +9,17 @@ import {
9
9
  useModalBehavior,
10
10
  usePresence,
11
11
  useRefocusAfterSkeleton
12
- } from "./chunk-JNZODUXP.js";
12
+ } from "./chunk-OYDG6C54.js";
13
13
  import {
14
14
  ContentSkeleton
15
- } from "./chunk-V7KDUUV6.js";
15
+ } from "./chunk-RMNV2CE2.js";
16
16
  import {
17
17
  Skeleton,
18
18
  SkeletonBlock
19
- } from "./chunk-NPM7IDYV.js";
19
+ } from "./chunk-TSFAAREV.js";
20
20
  import {
21
21
  touchTargetSquareClass
22
- } from "./chunk-FFXRFQSU.js";
22
+ } from "./chunk-POBOJBNJ.js";
23
23
 
24
24
  // src/drawer/Drawer.tsx
25
25
  import { useId, useRef } from "react";
@@ -199,4 +199,4 @@ function Drawer({
199
199
  export {
200
200
  Drawer
201
201
  };
202
- //# sourceMappingURL=chunk-KCYM2JXP.js.map
202
+ //# sourceMappingURL=chunk-FWSMUUZ5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/drawer/Drawer.tsx","../src/drawer/utils.ts"],"sourcesContent":["\"use client\";\n\nimport React, { useId, useRef } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { XIcon } from \"lucide-react\";\nimport { cn } from \"@mari-ui/core\";\nimport { Skeleton, SkeletonBlock } from \"../skeleton\";\nimport { ContentSkeleton } from \"../lib/ContentSkeleton\";\nimport { useScrollable } from \"../lib/useScrollable\";\nimport { touchTargetSquareClass } from \"../lib/sizeClasses\";\nimport { findAutofocus, firstFocusable, useModalBehavior, usePresence, useRefocusAfterSkeleton } from \"../lib/overlay\";\nimport type { DrawerProps } from \"./types\";\nimport { getPanelClass, getTranslateClass, isSide } from \"./utils\";\n\nexport type { DrawerProps };\n\nconst EXIT_MS = 300;\n\n/*\n * Açılışta odak sırası: `[data-autofocus]` → gövdedeki ilk alan → Kapat →\n * panel. Başlıktaki `extra` aksiyonlarına ASLA ilk odak verilmez — Faz 13.6\n * incelemesinde yükleniyor durumunda açılan düzenleme çekmecesinde ilk odak\n * \"Sil\" düğmesine gidiyordu (Enter'a basan kullanıcı kaydı silebilirdi).\n */\nfunction getDrawerInitialFocus(panel: HTMLElement): HTMLElement | null {\n const body = panel.querySelector<HTMLElement>(\"[data-drawer-body]\");\n return findAutofocus(panel) ?? (body && firstFocusable(body)) ?? panel.querySelector<HTMLElement>(\"[data-drawer-close]\");\n}\n\n/*\n * Ölçülecek içerik yoksa (başlık/alt çubuk da veriden geliyor ya da\n * yerleşimsiz ortam) gösterilen genel yer tutucular.\n */\nconst TITLE_PLACEHOLDER = (\n <div className=\"flex flex-col gap-2 py-1\">\n <SkeletonBlock active width=\"45%\" height=\"1rem\" radius=\"sm\" />\n </div>\n);\n\n/** Alt çubuğun genel iskeleti: en yaygın düzen sağa yaslı İptal / Kaydet. */\nconst FOOTER_PLACEHOLDER = (\n <div className=\"flex h-full items-center justify-end gap-2\">\n <SkeletonBlock active width=\"4.5rem\" height=\"2rem\" />\n <SkeletonBlock active width=\"4.5rem\" height=\"2rem\" />\n </div>\n);\n\n/** Özel `width`/`height` — yine de ekranı taşmasın. */\nfunction getCustomSizeStyle(side: boolean, custom: boolean, width?: number | string, height?: number | string): React.CSSProperties | undefined {\n if (!custom) return undefined;\n return side ? { width, maxWidth: \"calc(100vw - 3rem)\" } : { height, maxHeight: \"90dvh\" };\n}\n\n/**\n * ; overlay davranışı\n * `lib/overlay.ts`'te NavDrawer ile ortak.\n *\n * Eski sürümdeki sorunlar:\n * - `role=\"dialog\"`/`aria-modal`/erişilebilir ad yoktu; odak içeri\n * taşınmıyor, Tab sayfaya kaçıyor, Escape kapatmıyordu.\n * - Kapalıyken DOM'da kalıyordu (sadece opacity) — içindeki düğmeler Tab ile\n * odaklanabiliyordu. Artık kapanış animasyonundan sonra unmount.\n * - Sayfa kaydırması kilitlenmiyordu; portal yoktu (overflow/transform'lu bir\n * atanın içinde kırpılabiliyordu).\n * - Başlık ortalıydı; yan çekmece mobilde ekranı taşıyordu (`w-96` sabit).\n * - `loading` düz \"Yükleniyor...\" metniydi.\n *\n * `skeleton` artık yalnız gövdeyi değil\n * başlık/açıklama/extra/alt çubuğu da iskelete çevirir; Kapat düğmesi canlı\n * kalır. Her bölge `ContentSkeleton` ile içeriğin kendi şeklinde (satır satır\n * metin, alan alan form, düğme düğme alt çubuk) iskelete döner; gerçek içerik\n * görünmez olarak yerinde kalır → yükseklik zıplamaz.\n * Görünmez kopyalar `aria-hidden` bölgede — odak tuzağı onları atlar.\n */\nexport function Drawer({\n open,\n onClose,\n position = \"right\",\n size = \"md\",\n width,\n height,\n title,\n description,\n extra,\n footer,\n children,\n showCloseButton = true,\n closeButtonPosition = \"right\",\n skeleton = false,\n mask = true,\n maskClosable = true,\n keyboard = true,\n \"aria-label\": ariaLabel,\n className,\n bodyClassName,\n}: DrawerProps) {\n const panelRef = useRef<HTMLDivElement>(null);\n const titleId = useId();\n const descriptionId = useId();\n const present = usePresence(open, EXIT_MS);\n const bodyRef = useRef<HTMLDivElement>(null);\n const bodyScrollable = useScrollable(bodyRef, \"y\", [children, skeleton, present]);\n useModalBehavior(open, panelRef, onClose, { closeOnEscape: keyboard, getInitialFocus: getDrawerInitialFocus });\n\n // İskelet → içerik geldi: odak hâlâ Kapat'ta/panelde ise forma taşı.\n useRefocusAfterSkeleton(open, skeleton, panelRef, getDrawerInitialFocus, \"[data-drawer-close]\");\n\n if (!present || typeof document === \"undefined\") return null;\n\n const side = isSide(position);\n const customSize = side ? width !== undefined : height !== undefined;\n const sizeStyle = getCustomSizeStyle(side, customSize, width, height);\n const hasHeader = Boolean(title || extra || showCloseButton);\n\n const closeButton = showCloseButton && (\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Kapat\"\n data-drawer-close\n className={cn(\n \"relative inline-flex size-8 shrink-0 cursor-pointer items-center justify-center rounded-md text-mari-muted transition-colors\",\n \"hover:bg-mari-surface-alt hover:text-mari-foreground focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-mari-ring\",\n touchTargetSquareClass.md,\n closeButtonPosition === \"left\" ? \"-ml-1.5\" : \"-mr-1.5\"\n )}\n >\n <XIcon size={18} aria-hidden />\n </button>\n );\n\n return createPortal(\n <div className={cn(\"fixed inset-0 z-mari-drawer\", !open && \"pointer-events-none\")}>\n {mask && (\n <div\n aria-hidden\n onClick={maskClosable ? onClose : undefined}\n className={cn(\n \"absolute inset-0 bg-mari-scrim transition-opacity duration-300 motion-reduce:transition-none starting:opacity-0\",\n open ? \"opacity-100\" : \"opacity-0\"\n )}\n />\n )}\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n aria-label={title ? undefined : ariaLabel}\n aria-describedby={description ? descriptionId : undefined}\n aria-busy={skeleton || undefined}\n tabIndex={-1}\n style={sizeStyle}\n className={cn(getPanelClass(position, size, customSize), getTranslateClass(position, open), className)}\n >\n {position === \"bottom\" && (\n <div aria-hidden className=\"flex justify-center pt-2.5\">\n <span className=\"h-1 w-10 rounded-full bg-mari-border\" />\n </div>\n )}\n\n {hasHeader && (\n <div className={cn(\"flex shrink-0 items-start gap-3 border-b border-mari-border px-4 py-4 sm:px-6\", position === \"bottom\" && \"pt-2\")}>\n {closeButtonPosition === \"left\" && closeButton}\n <ContentSkeleton on={skeleton} fallback={TITLE_PLACEHOLDER} className=\"min-w-0 flex-1 self-center\">\n <div className=\"min-w-0 flex-1 self-center\">\n {title && (\n <h2 id={titleId} className=\"truncate text-base font-semibold leading-6 text-mari-foreground\">\n {title}\n </h2>\n )}\n {description && (\n <p id={descriptionId} className=\"mt-0.5 text-sm text-mari-muted\">\n {description}\n </p>\n )}\n </div>\n </ContentSkeleton>\n {extra && (\n <ContentSkeleton on={skeleton} fallback={null} className=\"shrink-0 self-center\">\n <div className=\"flex shrink-0 items-center gap-2 self-center\">{extra}</div>\n </ContentSkeleton>\n )}\n {closeButtonPosition === \"right\" && closeButton}\n </div>\n )}\n\n <div\n ref={bodyRef}\n data-drawer-body\n // Taşan ve içinde odaklanabilir öğe olmayan gövde de klavyeyle kaydırılabilsin (axe scrollable-region-focusable).\n tabIndex={bodyScrollable && !skeleton ? 0 : undefined}\n className={cn(\n \"min-h-0 flex-1 overflow-y-auto overscroll-contain p-4 sm:p-6\",\n \"focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-mari-ring\",\n bodyClassName\n )}\n >\n <ContentSkeleton on={skeleton} fallback={<Skeleton active paragraph={{ rows: 6 }} />}>\n {children}\n </ContentSkeleton>\n </div>\n\n {footer && (\n <div className=\"shrink-0 border-t border-mari-border px-4 py-3 sm:px-6\">\n <ContentSkeleton on={skeleton} fallback={FOOTER_PLACEHOLDER}>\n {footer}\n </ContentSkeleton>\n </div>\n )}\n </div>\n </div>,\n document.body\n );\n}\n","import { cn } from \"@mari-ui/core\";\nimport type { DrawerPosition, DrawerSize } from \"./types\";\n\n/**\n * Yan çekmece genişliği / üst-alt yüksekliği. Yan çekmece dar ekranda\n * `100vw - 3rem`i aşmaz — solda örtüden bir şerit kalır, dokunarak\n * kapatılabilir ve kullanıcı hâlâ sayfada olduğunu görür.\n */\nconst SIDE_WIDTH: Record<DrawerSize, string> = {\n sm: \"w-[min(20rem,calc(100vw-3rem))]\",\n md: \"w-[min(25rem,calc(100vw-3rem))]\",\n lg: \"w-[min(40rem,calc(100vw-3rem))]\",\n};\nconst EDGE_HEIGHT: Record<DrawerSize, string> = {\n sm: \"h-[min(16rem,85dvh)]\",\n md: \"h-[min(28rem,85dvh)]\",\n lg: \"h-[min(40rem,90dvh)]\",\n};\n\nexport const isSide = (position: DrawerPosition) => position === \"left\" || position === \"right\";\n\nexport function getPanelClass(position: DrawerPosition, size: DrawerSize, custom: boolean): string {\n const side = isSide(position);\n return cn(\n \"absolute flex flex-col bg-mari-surface text-mari-foreground shadow-mari-xl outline-none\",\n \"transition-transform duration-300 ease-[cubic-bezier(0.32,0.72,0,1)] motion-reduce:transition-none\",\n position === \"right\" && \"inset-y-0 right-0 border-l border-mari-border\",\n position === \"left\" && \"inset-y-0 left-0 border-r border-mari-border\",\n position === \"top\" && \"inset-x-0 top-0 rounded-b-xl border-b border-mari-border\",\n // Alt çekmece = mobil \"bottom sheet\": yuvarlak üst köşeler + tutamaç.\n position === \"bottom\" && \"inset-x-0 bottom-0 rounded-t-xl border-t border-mari-border pb-[env(safe-area-inset-bottom)]\",\n !custom && (side ? SIDE_WIDTH[size] : EDGE_HEIGHT[size])\n );\n}\n\n/**\n * Açıkken yerinde; `starting:` (@starting-style) ilk boyamada kapalı\n * konumdan başlatır → mount anında kayarak girer. Kapanışta panel\n * `usePresence` süresi boyunca DOM'da kalıp dışarı kayar.\n */\nconst OPEN: Record<DrawerPosition, string> = {\n right: \"translate-x-0 starting:translate-x-full\",\n left: \"translate-x-0 starting:-translate-x-full\",\n top: \"translate-y-0 starting:-translate-y-full\",\n bottom: \"translate-y-0 starting:translate-y-full\",\n};\nconst CLOSED: Record<DrawerPosition, string> = {\n right: \"translate-x-full\",\n left: \"-translate-x-full\",\n top: \"-translate-y-full\",\n bottom: \"translate-y-full\",\n};\n\nexport function getTranslateClass(position: DrawerPosition, open: boolean): string {\n return open ? OPEN[position] : CLOSED[position];\n}\n"],"mappings":"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","names":["cn","cn"]}
@@ -2,7 +2,7 @@
2
2
 
3
3
  import {
4
4
  computePanelPosition
5
- } from "./chunk-NS7FKOFI.js";
5
+ } from "./chunk-NYXU5EFE.js";
6
6
 
7
7
  // src/lib/useFloatingPosition.ts
8
8
  import { useEffect, useState } from "react";
@@ -46,4 +46,4 @@ function useFloatingPosition(open, anchorRef, panelRef, { placement, gap, edge =
46
46
  export {
47
47
  useFloatingPosition
48
48
  };
49
- //# sourceMappingURL=chunk-3ABWBQCS.js.map
49
+ //# sourceMappingURL=chunk-GTNCXOUL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/useFloatingPosition.ts"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState, type RefObject } from \"react\";\nimport type { Placement } from \"@mari-ui/core\";\nimport { computePanelPosition, type ArrowOptions, type Side } from \"./floating\";\n\nexport interface FloatingCoords {\n top: number;\n left: number;\n side: Side;\n arrowOffset: number;\n /** Üst/alt yönlerde tetikleyicinin genişliği (panel en az o kadar geniş olur); yanlarda `undefined`. */\n anchorWidth: number | undefined;\n}\n\nexport interface FloatingOptions {\n placement: Placement;\n /** Tetikleyici ile panel arası (px). */\n gap: number;\n /** Panelin viewport kenarından en az uzaklığı (px). Varsayılan: 8. */\n edge?: number;\n arrow?: ArrowOptions;\n}\n\n/**\n * `document.body`'ye portal edilmiş, `position: fixed` bir panelin\n * konumu. Dropdown'da vardı, Select de aynısına ihtiyaç duyunca buraya\n * taşındı. Konum tek seferlik değil, panel AÇIK KALDIĞI SÜRECE her karede\n * yeniden hesaplanır: sayfa kaydırılınca, sticky bir çubuk hareket edince ya\n * da içerik asenkron yüklenip düzen kayınca ölçüm eskimesin. Değişmeyen\n * karelerde state güncellenmez (gereksiz render yok).\n *\n * Kapalıyken `null` döner; ilk ölçüm gelene kadar da `null` — panel o ana\n * kadar `invisible` çizilmeli (boyutu ölçülebilsin, ama sol-üstte parlamasın).\n */\nexport function useFloatingPosition(\n open: boolean,\n anchorRef: RefObject<HTMLElement | null>,\n panelRef: RefObject<HTMLElement | null>,\n { placement, gap, edge = 8, arrow }: FloatingOptions\n): FloatingCoords | null {\n const [coords, setCoords] = useState<FloatingCoords | null>(null);\n const arrowInset = arrow?.inset;\n const pointAtCenter = arrow?.pointAtCenter;\n\n useEffect(() => {\n if (!open) {\n setCoords(null);\n return;\n }\n let frameId: number;\n const update = () => {\n const anchorEl = anchorRef.current;\n if (anchorEl) {\n const rect = anchorEl.getBoundingClientRect();\n const panelRect = panelRef.current?.getBoundingClientRect();\n const { top, left, side, arrowOffset } = computePanelPosition(\n { top: rect.top, left: rect.left, width: rect.width, height: rect.height },\n { width: panelRect?.width ?? 0, height: panelRect?.height ?? 0 },\n placement,\n { width: window.innerWidth, height: window.innerHeight },\n gap,\n edge,\n arrowInset === undefined ? undefined : { inset: arrowInset, pointAtCenter: !!pointAtCenter }\n );\n const anchorWidth = side === \"top\" || side === \"bottom\" ? rect.width : undefined;\n setCoords((prev) =>\n prev && prev.top === top && prev.left === left && prev.side === side && prev.arrowOffset === arrowOffset && prev.anchorWidth === anchorWidth\n ? prev\n : { top, left, side, arrowOffset, anchorWidth }\n );\n }\n frameId = requestAnimationFrame(update);\n };\n frameId = requestAnimationFrame(update);\n return () => cancelAnimationFrame(frameId);\n }, [open, placement, gap, edge, arrowInset, pointAtCenter, anchorRef, panelRef]);\n\n return coords;\n}\n"],"mappings":";;;;;AAEA,SAAS,WAAW,gBAAgC;AAiC7C,SAAS,oBACd,MACA,WACA,UACA,EAAE,WAAW,KAAK,OAAO,GAAG,MAAM,GACX;AACvB,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAgC,IAAI;AAChE,QAAM,aAAa,OAAO;AAC1B,QAAM,gBAAgB,OAAO;AAE7B,YAAU,MAAM;AACd,QAAI,CAAC,MAAM;AACT,gBAAU,IAAI;AACd;AAAA,IACF;AACA,QAAI;AACJ,UAAM,SAAS,MAAM;AACnB,YAAM,WAAW,UAAU;AAC3B,UAAI,UAAU;AACZ,cAAM,OAAO,SAAS,sBAAsB;AAC5C,cAAM,YAAY,SAAS,SAAS,sBAAsB;AAC1D,cAAM,EAAE,KAAK,MAAM,MAAM,YAAY,IAAI;AAAA,UACvC,EAAE,KAAK,KAAK,KAAK,MAAM,KAAK,MAAM,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAO;AAAA,UACzE,EAAE,OAAO,WAAW,SAAS,GAAG,QAAQ,WAAW,UAAU,EAAE;AAAA,UAC/D;AAAA,UACA,EAAE,OAAO,OAAO,YAAY,QAAQ,OAAO,YAAY;AAAA,UACvD;AAAA,UACA;AAAA,UACA,eAAe,SAAY,SAAY,EAAE,OAAO,YAAY,eAAe,CAAC,CAAC,cAAc;AAAA,QAC7F;AACA,cAAM,cAAc,SAAS,SAAS,SAAS,WAAW,KAAK,QAAQ;AACvE;AAAA,UAAU,CAAC,SACT,QAAQ,KAAK,QAAQ,OAAO,KAAK,SAAS,QAAQ,KAAK,SAAS,QAAQ,KAAK,gBAAgB,eAAe,KAAK,gBAAgB,cAC7H,OACA,EAAE,KAAK,MAAM,MAAM,aAAa,YAAY;AAAA,QAClD;AAAA,MACF;AACA,gBAAU,sBAAsB,MAAM;AAAA,IACxC;AACA,cAAU,sBAAsB,MAAM;AACtC,WAAO,MAAM,qBAAqB,OAAO;AAAA,EAC3C,GAAG,CAAC,MAAM,WAAW,KAAK,MAAM,YAAY,eAAe,WAAW,QAAQ,CAAC;AAE/E,SAAO;AACT;","names":[]}
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  colorVariantToClassName
3
- } from "./chunk-IP2J3BWY.js";
3
+ } from "./chunk-6AMBZXZJ.js";
4
4
  import {
5
5
  skeletonBoxProps
6
- } from "./chunk-54HHEXXD.js";
6
+ } from "./chunk-VKN374SD.js";
7
7
 
8
8
  // src/tag/Tag.tsx
9
9
  import { X } from "lucide-react";
@@ -66,4 +66,4 @@ function Tag({
66
66
  export {
67
67
  Tag
68
68
  };
69
- //# sourceMappingURL=chunk-ZLPAXPDI.js.map
69
+ //# sourceMappingURL=chunk-GVJ4M63W.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tag/Tag.tsx","../src/tag/utils.ts"],"sourcesContent":["import React from \"react\";\nimport { X } from \"lucide-react\";\nimport { cn } from \"@mari-ui/core\";\nimport type { TagProps } from \"./types\";\nimport { skeletonBoxProps } from \"../lib/skeleton\";\nimport { getTagClass, TAG_GEOMETRY_CLASS } from \"./utils\";\n\nexport type { TagProps };\n\n// Hook yok, browser API yok — saf sunum, \"use client\" gerekmiyor.\nexport function Tag({\n children,\n color = \"neutral\",\n variant = \"soft\",\n icon,\n closeIcon,\n bordered = false,\n onClose,\n closeLabel,\n skeleton = false,\n className,\n}: Readonly<TagProps>) {\n if (skeleton) {\n return (\n <span {...skeletonBoxProps(cn(TAG_GEOMETRY_CLASS, (variant === \"outline\" || bordered) && \"border border-transparent\", className))}>\n {icon && <span className=\"inline-flex items-center\">{icon}</span>}\n <span className=\"min-w-0 truncate\">{children}</span>\n {(onClose || closeIcon) && <span className=\"-mr-1 size-4 shrink-0\" />}\n </span>\n );\n }\n\n const tagClass = getTagClass(color, variant, bordered, className);\n\n // Eski davranış her Tag'de varsayılan olarak bir X gösteriyordu — `onClose`\n // verilmese bile. Artık kapatılabilirlik `onClose` VEYA açık `closeIcon`\n // varlığına bağlı; aksi halde işlevsiz bir buton render edilmez.\n const showCloseButton = closeIcon !== false && (closeIcon !== undefined || Boolean(onClose));\n const closeIconEl = closeIcon === true || closeIcon === undefined || closeIcon === false ? <X size={12} aria-hidden /> : closeIcon;\n const resolvedCloseLabel = closeLabel ?? (typeof children === \"string\" ? `${children} etiketini kaldır` : \"Kaldır\");\n\n return (\n <span className={tagClass}>\n {icon && <span className=\"inline-flex items-center\">{icon}</span>}\n <span className=\"min-w-0 truncate\">{children}</span>\n {showCloseButton && (\n <button\n type=\"button\"\n onClick={onClose}\n aria-label={resolvedCloseLabel}\n // 16px görünür kutu + `before` ile 24px'e genişleyen tıklama alanı\n // (eskiden 10px'lik ikonun kendisi hedefti — dokunmatikte ıskalanıyordu).\n className=\"relative -mr-1 inline-flex size-4 shrink-0 cursor-pointer items-center justify-center rounded-sm opacity-70 transition-[opacity,background-color] duration-150 before:absolute before:-inset-1 hover:bg-current/15 hover:opacity-100 focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-mari-ring\"\n >\n {closeIconEl}\n </button>\n )}\n </span>\n );\n}\n","import { cn, resolveColorVariant, type ColorRole, type Variant } from \"@mari-ui/core\";\nimport { colorVariantToClassName } from \"../lib/colorClasses\";\n\n/**\n * ant.design'ın gerçek Tag'i (`getComputedStyle`, ant.design/components/tag)\n * bir hap (pill) DEĞİL, 4px yuvarlatılmış küçük bir dikdörtgen: `border-radius:\n * 4px`, `padding: 0 7px`, `font-size: 12px`, `line-height: 20px`. Eskiden\n * `rounded-full px-3 py-0.5 text-sm` kullanılıyordu — bu, Badge/Chip'e daha\n * yakın tamamen farklı bir şekildi. `px` yasak kuralı (Faz 13.0c) gereği 7px\n * hardcoded değil `rem` karşılığıyla yazılır.\n */\n/** Geometri — iskeletle ortak (yüklenince kutu zıplamasın). Uzun metin tek satırda kalır, sığmazsa kısalır. */\nexport const TAG_GEOMETRY_CLASS = \"inline-flex max-w-full items-center gap-1 whitespace-nowrap rounded-sm px-[0.4375rem] leading-5 text-xs font-medium\";\n\nexport function getTagClass(\n color: ColorRole,\n variant: Extract<Variant, \"solid\" | \"soft\" | \"outline\">,\n bordered: boolean | undefined,\n className: string | undefined\n): string {\n const colorClasses = colorVariantToClassName(resolveColorVariant(color, variant));\n return cn(\n TAG_GEOMETRY_CLASS,\n colorClasses,\n bordered && variant !== \"outline\" && \"border\",\n className\n );\n}\n"],"mappings":";;;;;;;;AACA,SAAS,SAAS;AAClB,SAAS,MAAAA,WAAU;;;ACFnB,SAAS,IAAI,2BAAyD;AAY/D,IAAM,qBAAqB;AAE3B,SAAS,YACd,OACA,SACA,UACA,WACQ;AACR,QAAM,eAAe,wBAAwB,oBAAoB,OAAO,OAAO,CAAC;AAChF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,YAAY,YAAY,aAAa;AAAA,IACrC;AAAA,EACF;AACF;;;ADHM,SACW,KADX;AAdC,SAAS,IAAI;AAAA,EAClB;AAAA,EACA,QAAQ;AAAA,EACR,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AACF,GAAuB;AACrB,MAAI,UAAU;AACZ,WACE,qBAAC,UAAM,GAAG,iBAAiBC,IAAG,qBAAqB,YAAY,aAAa,aAAa,6BAA6B,SAAS,CAAC,GAC7H;AAAA,cAAQ,oBAAC,UAAK,WAAU,4BAA4B,gBAAK;AAAA,MAC1D,oBAAC,UAAK,WAAU,oBAAoB,UAAS;AAAA,OAC3C,WAAW,cAAc,oBAAC,UAAK,WAAU,yBAAwB;AAAA,OACrE;AAAA,EAEJ;AAEA,QAAM,WAAW,YAAY,OAAO,SAAS,UAAU,SAAS;AAKhE,QAAM,kBAAkB,cAAc,UAAU,cAAc,UAAa,QAAQ,OAAO;AAC1F,QAAM,cAAc,cAAc,QAAQ,cAAc,UAAa,cAAc,QAAQ,oBAAC,KAAE,MAAM,IAAI,eAAW,MAAC,IAAK;AACzH,QAAM,qBAAqB,eAAe,OAAO,aAAa,WAAW,GAAG,QAAQ,2BAAsB;AAE1G,SACE,qBAAC,UAAK,WAAW,UACd;AAAA,YAAQ,oBAAC,UAAK,WAAU,4BAA4B,gBAAK;AAAA,IAC1D,oBAAC,UAAK,WAAU,oBAAoB,UAAS;AAAA,IAC5C,mBACC;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS;AAAA,QACT,cAAY;AAAA,QAGZ,WAAU;AAAA,QAET;AAAA;AAAA,IACH;AAAA,KAEJ;AAEJ;","names":["cn","cn"]}
1
+ {"version":3,"sources":["../src/tag/Tag.tsx","../src/tag/utils.ts"],"sourcesContent":["import React from \"react\";\nimport { X } from \"lucide-react\";\nimport { cn } from \"@mari-ui/core\";\nimport type { TagProps } from \"./types\";\nimport { skeletonBoxProps } from \"../lib/skeleton\";\nimport { getTagClass, TAG_GEOMETRY_CLASS } from \"./utils\";\n\nexport type { TagProps };\n\n// Hook yok, browser API yok — saf sunum, \"use client\" gerekmiyor.\nexport function Tag({\n children,\n color = \"neutral\",\n variant = \"soft\",\n icon,\n closeIcon,\n bordered = false,\n onClose,\n closeLabel,\n skeleton = false,\n className,\n}: Readonly<TagProps>) {\n if (skeleton) {\n return (\n <span {...skeletonBoxProps(cn(TAG_GEOMETRY_CLASS, (variant === \"outline\" || bordered) && \"border border-transparent\", className))}>\n {icon && <span className=\"inline-flex items-center\">{icon}</span>}\n <span className=\"min-w-0 truncate\">{children}</span>\n {(onClose || closeIcon) && <span className=\"-mr-1 size-4 shrink-0\" />}\n </span>\n );\n }\n\n const tagClass = getTagClass(color, variant, bordered, className);\n\n // Eski davranış her Tag'de varsayılan olarak bir X gösteriyordu — `onClose`\n // verilmese bile. Artık kapatılabilirlik `onClose` VEYA açık `closeIcon`\n // varlığına bağlı; aksi halde işlevsiz bir buton render edilmez.\n const showCloseButton = closeIcon !== false && (closeIcon !== undefined || Boolean(onClose));\n const closeIconEl = closeIcon === true || closeIcon === undefined || closeIcon === false ? <X size={12} aria-hidden /> : closeIcon;\n const resolvedCloseLabel = closeLabel ?? (typeof children === \"string\" ? `${children} etiketini kaldır` : \"Kaldır\");\n\n return (\n <span className={tagClass}>\n {icon && <span className=\"inline-flex items-center\">{icon}</span>}\n <span className=\"min-w-0 truncate\">{children}</span>\n {showCloseButton && (\n <button\n type=\"button\"\n onClick={onClose}\n aria-label={resolvedCloseLabel}\n // 16px görünür kutu + `before` ile 24px'e genişleyen tıklama alanı\n // (eskiden 10px'lik ikonun kendisi hedefti — dokunmatikte ıskalanıyordu).\n className=\"relative -mr-1 inline-flex size-4 shrink-0 cursor-pointer items-center justify-center rounded-sm opacity-70 transition-[opacity,background-color] duration-150 before:absolute before:-inset-1 hover:bg-current/15 hover:opacity-100 focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-mari-ring\"\n >\n {closeIconEl}\n </button>\n )}\n </span>\n );\n}\n","import { cn, resolveColorVariant, type ColorRole, type Variant } from \"@mari-ui/core\";\nimport { colorVariantToClassName } from \"../lib/colorClasses\";\n\n/*\n * ant.design'ın gerçek Tag'i\n * bir hap (pill) DEĞİL, 4px yuvarlatılmış küçük bir dikdörtgen: `border-radius:\n * 4px`, `padding: 0 7px`, `font-size: 12px`, `line-height: 20px`. Eskiden\n * `rounded-full px-3 py-0.5 text-sm` kullanılıyordu — bu, Badge/Chip'e daha\n * yakın tamamen farklı bir şekildi. `px` yasak kuralı gereği 7px\n * hardcoded değil `rem` karşılığıyla yazılır.\n */\n/** Geometri — iskeletle ortak (yüklenince kutu zıplamasın). Uzun metin tek satırda kalır, sığmazsa kısalır. */\nexport const TAG_GEOMETRY_CLASS = \"inline-flex max-w-full items-center gap-1 whitespace-nowrap rounded-sm px-[0.4375rem] leading-5 text-xs font-medium\";\n\nexport function getTagClass(\n color: ColorRole,\n variant: Extract<Variant, \"solid\" | \"soft\" | \"outline\">,\n bordered: boolean | undefined,\n className: string | undefined\n): string {\n const colorClasses = colorVariantToClassName(resolveColorVariant(color, variant));\n return cn(\n TAG_GEOMETRY_CLASS,\n colorClasses,\n bordered && variant !== \"outline\" && \"border\",\n className\n );\n}\n"],"mappings":";;;;;;;;AACA,SAAS,SAAS;AAClB,SAAS,MAAAA,WAAU;;;ACFnB,SAAS,IAAI,2BAAyD;AAY/D,IAAM,qBAAqB;AAE3B,SAAS,YACd,OACA,SACA,UACA,WACQ;AACR,QAAM,eAAe,wBAAwB,oBAAoB,OAAO,OAAO,CAAC;AAChF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,YAAY,YAAY,aAAa;AAAA,IACrC;AAAA,EACF;AACF;;;ADHM,SACW,KADX;AAdC,SAAS,IAAI;AAAA,EAClB;AAAA,EACA,QAAQ;AAAA,EACR,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AACF,GAAuB;AACrB,MAAI,UAAU;AACZ,WACE,qBAAC,UAAM,GAAG,iBAAiBC,IAAG,qBAAqB,YAAY,aAAa,aAAa,6BAA6B,SAAS,CAAC,GAC7H;AAAA,cAAQ,oBAAC,UAAK,WAAU,4BAA4B,gBAAK;AAAA,MAC1D,oBAAC,UAAK,WAAU,oBAAoB,UAAS;AAAA,OAC3C,WAAW,cAAc,oBAAC,UAAK,WAAU,yBAAwB;AAAA,OACrE;AAAA,EAEJ;AAEA,QAAM,WAAW,YAAY,OAAO,SAAS,UAAU,SAAS;AAKhE,QAAM,kBAAkB,cAAc,UAAU,cAAc,UAAa,QAAQ,OAAO;AAC1F,QAAM,cAAc,cAAc,QAAQ,cAAc,UAAa,cAAc,QAAQ,oBAAC,KAAE,MAAM,IAAI,eAAW,MAAC,IAAK;AACzH,QAAM,qBAAqB,eAAe,OAAO,aAAa,WAAW,GAAG,QAAQ,2BAAsB;AAE1G,SACE,qBAAC,UAAK,WAAW,UACd;AAAA,YAAQ,oBAAC,UAAK,WAAU,4BAA4B,gBAAK;AAAA,IAC1D,oBAAC,UAAK,WAAU,oBAAoB,UAAS;AAAA,IAC5C,mBACC;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS;AAAA,QACT,cAAY;AAAA,QAGZ,WAAU;AAAA,QAET;AAAA;AAAA,IACH;AAAA,KAEJ;AAEJ;","names":["cn","cn"]}
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  Button
3
- } from "./chunk-2IEXY3OZ.js";
3
+ } from "./chunk-CVKAGR3D.js";
4
4
  import {
5
5
  skeletonBoxProps
6
- } from "./chunk-54HHEXXD.js";
6
+ } from "./chunk-VKN374SD.js";
7
7
 
8
8
  // src/empty/Empty.tsx
9
9
  import { InboxIcon } from "lucide-react";
@@ -47,4 +47,4 @@ function Empty({
47
47
  export {
48
48
  Empty
49
49
  };
50
- //# sourceMappingURL=chunk-LBXIPDAB.js.map
50
+ //# sourceMappingURL=chunk-JXD5DW6E.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/empty/Empty.tsx"],"sourcesContent":["import React from \"react\";\nimport { InboxIcon } from \"lucide-react\";\nimport { cn } from \"@mari-ui/core\";\nimport { Button } from \"../button\";\nimport { skeletonBoxProps, type SkeletonableProps } from \"../lib/skeleton\";\n\nexport interface EmptyProps extends SkeletonableProps {\n title: string;\n description?: React.ReactNode;\n /** Tek birincil eylem. `onClick` (ya da `href`) olmadan buton çizilmez. */\n buttonText?: string;\n onClick?: () => void;\n /** Butonu bağlantı olarak çizer (başka sayfaya götüren eylem). */\n href?: string;\n icon?: React.ReactNode;\n buttonIcon?: React.ReactNode;\n /** Birden çok ya da özel eylem (ör. birincil + ikincil buton). Verilirse `buttonText` yok sayılır. */\n actions?: React.ReactNode;\n /** `md` (varsayılan): sayfa/bölüm. `sm`: kart, tablo, liste içi — daha az boşluk, küçük ikon. */\n size?: \"sm\" | \"md\";\n /*\n * Başlığın etiketi. Varsayılan `p`: boş durum bir belge BÖLÜMÜ değildir —\n * eskiden sabit `<h2>`'ydi, kart/tablo içinde başlık hiyerarşisini bozuyordu.\n * Sayfanın ana içeriği boşsa uygun bir başlık seviyesi verin.\n */\n titleAs?: \"p\" | \"h2\" | \"h3\" | \"h4\";\n className?: string;\n}\n\nconst SIZE = {\n sm: { root: \"py-8 px-4 gap-1.5\", icon: \"size-10 [&_svg]:size-5\", title: \"text-sm\", description: \"text-xs\", actionGap: \"mt-3\" },\n md: { root: \"py-16 px-4 gap-2\", icon: \"size-14 [&_svg]:size-7\", title: \"text-lg\", description: \"text-sm\", actionGap: \"mt-4\" },\n} as const;\n\n/**\n * Varsayılan ikon `FileWarning` idi — boş durum bir HATA değil\n * (`InboxIcon`). İkon yumuşak bir daire içinde; başlık `h2` yerine `p`\n * (`titleAs`); `onClick` olmadan `buttonText` verilince işe yaramaz, devre dışı\n * bir buton çiziliyordu — artık buton yalnızca bir eylem varsa çıkar.\n */\n// Hook yok, browser API yok — saf sunum, \"use client\" gerekmiyor.\nexport function Empty({\n title,\n description,\n buttonText,\n onClick,\n href,\n icon,\n buttonIcon,\n actions,\n size = \"md\",\n titleAs: TitleTag = \"p\",\n className,\n skeleton = false,\n}: Readonly<EmptyProps>) {\n const s = SIZE[size];\n\n if (skeleton) {\n return (\n <div aria-hidden className={cn(\"flex flex-col items-center justify-center text-center\", s.root, className)}>\n <span {...skeletonBoxProps(cn(\"rounded-full\", s.icon))} />\n <span {...skeletonBoxProps(cn(\"mt-1 h-4 w-40 rounded-sm\"))} />\n {description && <span {...skeletonBoxProps(\"h-3 w-56 max-w-full rounded-sm\")} />}\n </div>\n );\n }\n\n const hasButton = Boolean(buttonText && (onClick || href));\n\n return (\n <div className={cn(\"flex flex-col items-center justify-center text-center\", s.root, className)}>\n <div aria-hidden className={cn(\"mb-1 flex items-center justify-center rounded-full bg-mari-surface-alt text-mari-muted\", s.icon)}>\n {icon ?? <InboxIcon />}\n </div>\n <TitleTag className={cn(\"font-semibold text-balance text-mari-foreground\", s.title)}>{title}</TitleTag>\n {description && <p className={cn(\"max-w-md text-pretty text-mari-muted\", s.description)}>{description}</p>}\n {actions ? (\n <div className={cn(\"flex flex-wrap items-center justify-center gap-2\", s.actionGap)}>{actions}</div>\n ) : (\n hasButton && (\n <div className={s.actionGap}>\n <Button color=\"primary\" size={size === \"sm\" ? \"sm\" : \"md\"} onClick={onClick} href={href} icon={buttonIcon}>\n {buttonText}\n </Button>\n </div>\n )\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;AACA,SAAS,iBAAiB;AAC1B,SAAS,UAAU;AAyDb,SACE,KADF;AA9BN,IAAM,OAAO;AAAA,EACX,IAAI,EAAE,MAAM,qBAAqB,MAAM,0BAA0B,OAAO,WAAW,aAAa,WAAW,WAAW,OAAO;AAAA,EAC7H,IAAI,EAAE,MAAM,oBAAoB,MAAM,0BAA0B,OAAO,WAAW,aAAa,WAAW,WAAW,OAAO;AAC9H;AASO,SAAS,MAAM;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,SAAS,WAAW;AAAA,EACpB;AAAA,EACA,WAAW;AACb,GAAyB;AACvB,QAAM,IAAI,KAAK,IAAI;AAEnB,MAAI,UAAU;AACZ,WACE,qBAAC,SAAI,eAAW,MAAC,WAAW,GAAG,yDAAyD,EAAE,MAAM,SAAS,GACvG;AAAA,0BAAC,UAAM,GAAG,iBAAiB,GAAG,gBAAgB,EAAE,IAAI,CAAC,GAAG;AAAA,MACxD,oBAAC,UAAM,GAAG,iBAAiB,GAAG,0BAA0B,CAAC,GAAG;AAAA,MAC3D,eAAe,oBAAC,UAAM,GAAG,iBAAiB,gCAAgC,GAAG;AAAA,OAChF;AAAA,EAEJ;AAEA,QAAM,YAAY,QAAQ,eAAe,WAAW,KAAK;AAEzD,SACE,qBAAC,SAAI,WAAW,GAAG,yDAAyD,EAAE,MAAM,SAAS,GAC3F;AAAA,wBAAC,SAAI,eAAW,MAAC,WAAW,GAAG,0FAA0F,EAAE,IAAI,GAC5H,kBAAQ,oBAAC,aAAU,GACtB;AAAA,IACA,oBAAC,YAAS,WAAW,GAAG,mDAAmD,EAAE,KAAK,GAAI,iBAAM;AAAA,IAC3F,eAAe,oBAAC,OAAE,WAAW,GAAG,wCAAwC,EAAE,WAAW,GAAI,uBAAY;AAAA,IACrG,UACC,oBAAC,SAAI,WAAW,GAAG,oDAAoD,EAAE,SAAS,GAAI,mBAAQ,IAE9F,aACE,oBAAC,SAAI,WAAW,EAAE,WAChB,8BAAC,UAAO,OAAM,WAAU,MAAM,SAAS,OAAO,OAAO,MAAM,SAAkB,MAAY,MAAM,YAC5F,sBACH,GACF;AAAA,KAGN;AAEJ;","names":[]}
@@ -4,7 +4,7 @@ import {
4
4
  SelectPanel,
5
5
  foldForSearch,
6
6
  optionDomId
7
- } from "./chunk-YZ7MDC6B.js";
7
+ } from "./chunk-LNL4TCGL.js";
8
8
  import {
9
9
  ClearButton,
10
10
  PasswordToggle,
@@ -20,19 +20,19 @@ import {
20
20
  getTextareaSizeClasses,
21
21
  getVariantClasses,
22
22
  isClearable
23
- } from "./chunk-DUCIAQGR.js";
23
+ } from "./chunk-NENNFQEY.js";
24
24
  import {
25
25
  FieldContext,
26
26
  useFieldControl,
27
27
  useFieldGroup,
28
28
  useFieldSkeleton
29
- } from "./chunk-LBQMEHK6.js";
29
+ } from "./chunk-NPFMPRII.js";
30
30
  import {
31
31
  touchTargetClass
32
- } from "./chunk-FFXRFQSU.js";
32
+ } from "./chunk-POBOJBNJ.js";
33
33
  import {
34
34
  skeletonBoxProps
35
- } from "./chunk-54HHEXXD.js";
35
+ } from "./chunk-VKN374SD.js";
36
36
 
37
37
  // src/input/Input.tsx
38
38
  import React, { forwardRef, useState as useState2 } from "react";
@@ -932,4 +932,4 @@ export {
932
932
  OtpInput,
933
933
  SearchInput
934
934
  };
935
- //# sourceMappingURL=chunk-P7Z5BREP.js.map
935
+ //# sourceMappingURL=chunk-L6DBWUAB.js.map