@handijit/ui 0.0.0-stage → 1.0.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 (658) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +872 -2
  3. package/build/base.css +1 -0
  4. package/build/charts.cjs +2 -0
  5. package/build/charts.cjs.map +1 -0
  6. package/build/charts.css +1 -0
  7. package/build/charts.js +1865 -0
  8. package/build/charts.js.map +1 -0
  9. package/build/chat.cjs +4 -0
  10. package/build/chat.cjs.map +1 -0
  11. package/build/chat.css +1 -0
  12. package/build/chat.js +1120 -0
  13. package/build/chat.js.map +1 -0
  14. package/build/components/Accordion/index.cjs +2 -0
  15. package/build/components/Accordion/index.cjs.map +1 -0
  16. package/build/components/Accordion/index.d.ts +29 -0
  17. package/build/components/Accordion/index.js +42 -0
  18. package/build/components/Accordion/index.js.map +1 -0
  19. package/build/components/Accordion/style.css +1 -0
  20. package/build/components/Alert/index.cjs +2 -0
  21. package/build/components/Alert/index.cjs.map +1 -0
  22. package/build/components/Alert/index.d.ts +15 -0
  23. package/build/components/Alert/index.js +30 -0
  24. package/build/components/Alert/index.js.map +1 -0
  25. package/build/components/Alert/style.css +1 -0
  26. package/build/components/Avatar/index.cjs +2 -0
  27. package/build/components/Avatar/index.cjs.map +1 -0
  28. package/build/components/Avatar/index.d.ts +26 -0
  29. package/build/components/Avatar/index.js +57 -0
  30. package/build/components/Avatar/index.js.map +1 -0
  31. package/build/components/Avatar/style.css +1 -0
  32. package/build/components/Badge/index.cjs +2 -0
  33. package/build/components/Badge/index.cjs.map +1 -0
  34. package/build/components/Badge/index.d.ts +26 -0
  35. package/build/components/Badge/index.js +26 -0
  36. package/build/components/Badge/index.js.map +1 -0
  37. package/build/components/Badge/style.css +1 -0
  38. package/build/components/BottomSheet/index.cjs +2 -0
  39. package/build/components/BottomSheet/index.cjs.map +1 -0
  40. package/build/components/BottomSheet/index.d.ts +21 -0
  41. package/build/components/BottomSheet/index.js +85 -0
  42. package/build/components/BottomSheet/index.js.map +1 -0
  43. package/build/components/BottomSheet/style.css +1 -0
  44. package/build/components/Breadcrumb/index.cjs +2 -0
  45. package/build/components/Breadcrumb/index.cjs.map +1 -0
  46. package/build/components/Breadcrumb/index.d.ts +20 -0
  47. package/build/components/Breadcrumb/index.js +31 -0
  48. package/build/components/Breadcrumb/index.js.map +1 -0
  49. package/build/components/Breadcrumb/style.css +1 -0
  50. package/build/components/Button/index.cjs +2 -0
  51. package/build/components/Button/index.cjs.map +1 -0
  52. package/build/components/Button/index.d.ts +32 -0
  53. package/build/components/Button/index.js +88 -0
  54. package/build/components/Button/index.js.map +1 -0
  55. package/build/components/Button/style.css +1 -0
  56. package/build/components/Card/index.cjs +2 -0
  57. package/build/components/Card/index.cjs.map +1 -0
  58. package/build/components/Card/index.d.ts +51 -0
  59. package/build/components/Card/index.js +58 -0
  60. package/build/components/Card/index.js.map +1 -0
  61. package/build/components/Card/style.css +1 -0
  62. package/build/components/Carousel/index.cjs +2 -0
  63. package/build/components/Carousel/index.cjs.map +1 -0
  64. package/build/components/Carousel/index.d.ts +24 -0
  65. package/build/components/Carousel/index.js +111 -0
  66. package/build/components/Carousel/index.js.map +1 -0
  67. package/build/components/Carousel/style.css +1 -0
  68. package/build/components/Checkbox/index.cjs +2 -0
  69. package/build/components/Checkbox/index.cjs.map +1 -0
  70. package/build/components/Checkbox/index.d.ts +10 -0
  71. package/build/components/Checkbox/index.js +33 -0
  72. package/build/components/Checkbox/index.js.map +1 -0
  73. package/build/components/Checkbox/style.css +1 -0
  74. package/build/components/Chip/index.cjs +2 -0
  75. package/build/components/Chip/index.cjs.map +1 -0
  76. package/build/components/Chip/index.d.ts +27 -0
  77. package/build/components/Chip/index.js +67 -0
  78. package/build/components/Chip/index.js.map +1 -0
  79. package/build/components/Chip/style.css +1 -0
  80. package/build/components/ChipGroup/index.cjs +2 -0
  81. package/build/components/ChipGroup/index.cjs.map +1 -0
  82. package/build/components/ChipGroup/index.d.ts +34 -0
  83. package/build/components/ChipGroup/index.js +64 -0
  84. package/build/components/ChipGroup/index.js.map +1 -0
  85. package/build/components/ChipGroup/style.css +1 -0
  86. package/build/components/CodeBadge/index.cjs +2 -0
  87. package/build/components/CodeBadge/index.cjs.map +1 -0
  88. package/build/components/CodeBadge/index.d.ts +36 -0
  89. package/build/components/CodeBadge/index.js +62 -0
  90. package/build/components/CodeBadge/index.js.map +1 -0
  91. package/build/components/CodeBadge/style.css +1 -0
  92. package/build/components/Combobox/index.cjs +2 -0
  93. package/build/components/Combobox/index.cjs.map +1 -0
  94. package/build/components/Combobox/index.d.ts +6 -0
  95. package/build/components/Combobox/index.js +302 -0
  96. package/build/components/Combobox/index.js.map +1 -0
  97. package/build/components/Combobox/style.css +1 -0
  98. package/build/components/CommandPalette/index.cjs +2 -0
  99. package/build/components/CommandPalette/index.cjs.map +1 -0
  100. package/build/components/CommandPalette/index.d.ts +37 -0
  101. package/build/components/CommandPalette/index.js +181 -0
  102. package/build/components/CommandPalette/index.js.map +1 -0
  103. package/build/components/CommandPalette/style.css +1 -0
  104. package/build/components/ConfirmDialog/index.cjs +2 -0
  105. package/build/components/ConfirmDialog/index.cjs.map +1 -0
  106. package/build/components/ConfirmDialog/index.d.ts +34 -0
  107. package/build/components/ConfirmDialog/index.js +85 -0
  108. package/build/components/ConfirmDialog/index.js.map +1 -0
  109. package/build/components/CopyField/index.cjs +2 -0
  110. package/build/components/CopyField/index.cjs.map +1 -0
  111. package/build/components/CopyField/index.d.ts +20 -0
  112. package/build/components/CopyField/index.js +44 -0
  113. package/build/components/CopyField/index.js.map +1 -0
  114. package/build/components/CopyField/style.css +1 -0
  115. package/build/components/DataTable/index.cjs +2 -0
  116. package/build/components/DataTable/index.cjs.map +1 -0
  117. package/build/components/DataTable/index.d.ts +60 -0
  118. package/build/components/DataTable/index.js +109 -0
  119. package/build/components/DataTable/index.js.map +1 -0
  120. package/build/components/DataTable/style.css +1 -0
  121. package/build/components/DateField/index.cjs +2 -0
  122. package/build/components/DateField/index.cjs.map +1 -0
  123. package/build/components/DateField/index.d.ts +44 -0
  124. package/build/components/DateField/index.js +79 -0
  125. package/build/components/DateField/index.js.map +1 -0
  126. package/build/components/DateField/style.css +1 -0
  127. package/build/components/Directory/index.cjs +2 -0
  128. package/build/components/Directory/index.cjs.map +1 -0
  129. package/build/components/Directory/index.d.ts +51 -0
  130. package/build/components/Directory/index.js +46 -0
  131. package/build/components/Directory/index.js.map +1 -0
  132. package/build/components/Directory/style.css +1 -0
  133. package/build/components/Disclosure/index.cjs +2 -0
  134. package/build/components/Disclosure/index.cjs.map +1 -0
  135. package/build/components/Disclosure/index.d.ts +34 -0
  136. package/build/components/Disclosure/index.js +64 -0
  137. package/build/components/Disclosure/index.js.map +1 -0
  138. package/build/components/Disclosure/style.css +1 -0
  139. package/build/components/Divider/index.cjs +2 -0
  140. package/build/components/Divider/index.cjs.map +1 -0
  141. package/build/components/Divider/index.d.ts +10 -0
  142. package/build/components/Divider/index.js +24 -0
  143. package/build/components/Divider/index.js.map +1 -0
  144. package/build/components/Divider/style.css +1 -0
  145. package/build/components/Drawer/index.cjs +2 -0
  146. package/build/components/Drawer/index.cjs.map +1 -0
  147. package/build/components/Drawer/index.d.ts +22 -0
  148. package/build/components/Drawer/index.js +88 -0
  149. package/build/components/Drawer/index.js.map +1 -0
  150. package/build/components/Drawer/style.css +1 -0
  151. package/build/components/EmptyState/index.cjs +2 -0
  152. package/build/components/EmptyState/index.cjs.map +1 -0
  153. package/build/components/EmptyState/index.d.ts +19 -0
  154. package/build/components/EmptyState/index.js +35 -0
  155. package/build/components/EmptyState/index.js.map +1 -0
  156. package/build/components/EmptyState/style.css +1 -0
  157. package/build/components/Field/index.cjs +2 -0
  158. package/build/components/Field/index.cjs.map +1 -0
  159. package/build/components/Field/index.d.ts +31 -0
  160. package/build/components/Field/index.js +52 -0
  161. package/build/components/Field/index.js.map +1 -0
  162. package/build/components/Field/style.css +1 -0
  163. package/build/components/FileUpload/index.cjs +2 -0
  164. package/build/components/FileUpload/index.cjs.map +1 -0
  165. package/build/components/FileUpload/index.d.ts +42 -0
  166. package/build/components/FileUpload/index.js +145 -0
  167. package/build/components/FileUpload/index.js.map +1 -0
  168. package/build/components/FileUpload/style.css +1 -0
  169. package/build/components/FilterBar/index.cjs +2 -0
  170. package/build/components/FilterBar/index.cjs.map +1 -0
  171. package/build/components/FilterBar/index.d.ts +28 -0
  172. package/build/components/FilterBar/index.js +35 -0
  173. package/build/components/FilterBar/index.js.map +1 -0
  174. package/build/components/FilterBar/style.css +1 -0
  175. package/build/components/IconButton/index.cjs +2 -0
  176. package/build/components/IconButton/index.cjs.map +1 -0
  177. package/build/components/IconButton/index.d.ts +22 -0
  178. package/build/components/IconButton/index.js +61 -0
  179. package/build/components/IconButton/index.js.map +1 -0
  180. package/build/components/IconButton/style.css +1 -0
  181. package/build/components/Input/index.cjs +2 -0
  182. package/build/components/Input/index.cjs.map +1 -0
  183. package/build/components/Input/index.d.ts +15 -0
  184. package/build/components/Input/index.js +52 -0
  185. package/build/components/Input/index.js.map +1 -0
  186. package/build/components/Input/style.css +1 -0
  187. package/build/components/Kbd/index.cjs +2 -0
  188. package/build/components/Kbd/index.cjs.map +1 -0
  189. package/build/components/Kbd/index.d.ts +12 -0
  190. package/build/components/Kbd/index.js +13 -0
  191. package/build/components/Kbd/index.js.map +1 -0
  192. package/build/components/Kbd/style.css +1 -0
  193. package/build/components/Link/index.cjs +2 -0
  194. package/build/components/Link/index.cjs.map +1 -0
  195. package/build/components/Link/index.d.ts +5 -0
  196. package/build/components/Link/index.js +11 -0
  197. package/build/components/Link/index.js.map +1 -0
  198. package/build/components/Menu/index.cjs +2 -0
  199. package/build/components/Menu/index.cjs.map +1 -0
  200. package/build/components/Menu/index.d.ts +46 -0
  201. package/build/components/Menu/index.js +241 -0
  202. package/build/components/Menu/index.js.map +1 -0
  203. package/build/components/Menu/style.css +1 -0
  204. package/build/components/Modal/index.cjs +2 -0
  205. package/build/components/Modal/index.cjs.map +1 -0
  206. package/build/components/Modal/index.d.ts +28 -0
  207. package/build/components/Modal/index.js +92 -0
  208. package/build/components/Modal/index.js.map +1 -0
  209. package/build/components/Modal/style.css +1 -0
  210. package/build/components/PageHeader/index.cjs +2 -0
  211. package/build/components/PageHeader/index.cjs.map +1 -0
  212. package/build/components/PageHeader/index.d.ts +24 -0
  213. package/build/components/PageHeader/index.js +34 -0
  214. package/build/components/PageHeader/index.js.map +1 -0
  215. package/build/components/PageHeader/style.css +1 -0
  216. package/build/components/Pagination/index.cjs +2 -0
  217. package/build/components/Pagination/index.cjs.map +1 -0
  218. package/build/components/Pagination/index.d.ts +39 -0
  219. package/build/components/Pagination/index.js +128 -0
  220. package/build/components/Pagination/index.js.map +1 -0
  221. package/build/components/Pagination/style.css +1 -0
  222. package/build/components/Panel/index.cjs +2 -0
  223. package/build/components/Panel/index.cjs.map +1 -0
  224. package/build/components/Panel/index.d.ts +43 -0
  225. package/build/components/Panel/index.js +55 -0
  226. package/build/components/Panel/index.js.map +1 -0
  227. package/build/components/Panel/style.css +1 -0
  228. package/build/components/PasswordInput/index.cjs +2 -0
  229. package/build/components/PasswordInput/index.cjs.map +1 -0
  230. package/build/components/PasswordInput/index.d.ts +14 -0
  231. package/build/components/PasswordInput/index.js +40 -0
  232. package/build/components/PasswordInput/index.js.map +1 -0
  233. package/build/components/PasswordInput/style.css +1 -0
  234. package/build/components/Popover/index.cjs +2 -0
  235. package/build/components/Popover/index.cjs.map +1 -0
  236. package/build/components/Popover/index.d.ts +20 -0
  237. package/build/components/Popover/index.js +91 -0
  238. package/build/components/Popover/index.js.map +1 -0
  239. package/build/components/Popover/style.css +1 -0
  240. package/build/components/Price/index.cjs +2 -0
  241. package/build/components/Price/index.cjs.map +1 -0
  242. package/build/components/Price/index.d.ts +22 -0
  243. package/build/components/Price/index.js +46 -0
  244. package/build/components/Price/index.js.map +1 -0
  245. package/build/components/Price/style.css +1 -0
  246. package/build/components/Progress/index.cjs +2 -0
  247. package/build/components/Progress/index.cjs.map +1 -0
  248. package/build/components/Progress/index.d.ts +49 -0
  249. package/build/components/Progress/index.js +120 -0
  250. package/build/components/Progress/index.js.map +1 -0
  251. package/build/components/Progress/style.css +1 -0
  252. package/build/components/PromptDialog/index.cjs +2 -0
  253. package/build/components/PromptDialog/index.cjs.map +1 -0
  254. package/build/components/PromptDialog/index.d.ts +36 -0
  255. package/build/components/PromptDialog/index.js +119 -0
  256. package/build/components/PromptDialog/index.js.map +1 -0
  257. package/build/components/PromptDialog/style.css +1 -0
  258. package/build/components/QuantityStepper/index.cjs +2 -0
  259. package/build/components/QuantityStepper/index.cjs.map +1 -0
  260. package/build/components/QuantityStepper/index.d.ts +21 -0
  261. package/build/components/QuantityStepper/index.js +106 -0
  262. package/build/components/QuantityStepper/index.js.map +1 -0
  263. package/build/components/QuantityStepper/style.css +1 -0
  264. package/build/components/Radio/index.cjs +2 -0
  265. package/build/components/Radio/index.cjs.map +1 -0
  266. package/build/components/Radio/index.d.ts +12 -0
  267. package/build/components/Radio/index.js +35 -0
  268. package/build/components/Radio/index.js.map +1 -0
  269. package/build/components/Radio/style.css +1 -0
  270. package/build/components/RadioCard/index.cjs +2 -0
  271. package/build/components/RadioCard/index.cjs.map +1 -0
  272. package/build/components/RadioCard/index.d.ts +16 -0
  273. package/build/components/RadioCard/index.js +48 -0
  274. package/build/components/RadioCard/index.js.map +1 -0
  275. package/build/components/RadioCard/style.css +1 -0
  276. package/build/components/RangeSlider/index.cjs +2 -0
  277. package/build/components/RangeSlider/index.cjs.map +1 -0
  278. package/build/components/RangeSlider/index.d.ts +26 -0
  279. package/build/components/RangeSlider/index.js +102 -0
  280. package/build/components/RangeSlider/index.js.map +1 -0
  281. package/build/components/RangeSlider/style.css +1 -0
  282. package/build/components/Rating/index.cjs +2 -0
  283. package/build/components/Rating/index.cjs.map +1 -0
  284. package/build/components/Rating/index.d.ts +16 -0
  285. package/build/components/Rating/index.js +29 -0
  286. package/build/components/Rating/index.js.map +1 -0
  287. package/build/components/Rating/style.css +1 -0
  288. package/build/components/RatingInput/index.cjs +2 -0
  289. package/build/components/RatingInput/index.cjs.map +1 -0
  290. package/build/components/RatingInput/index.d.ts +21 -0
  291. package/build/components/RatingInput/index.js +75 -0
  292. package/build/components/RatingInput/index.js.map +1 -0
  293. package/build/components/RatingInput/style.css +1 -0
  294. package/build/components/ScrollArea/index.cjs +2 -0
  295. package/build/components/ScrollArea/index.cjs.map +1 -0
  296. package/build/components/ScrollArea/index.d.ts +23 -0
  297. package/build/components/ScrollArea/index.js +65 -0
  298. package/build/components/ScrollArea/index.js.map +1 -0
  299. package/build/components/ScrollArea/style.css +1 -0
  300. package/build/components/SectionHeader/index.cjs +2 -0
  301. package/build/components/SectionHeader/index.cjs.map +1 -0
  302. package/build/components/SectionHeader/index.d.ts +17 -0
  303. package/build/components/SectionHeader/index.js +25 -0
  304. package/build/components/SectionHeader/index.js.map +1 -0
  305. package/build/components/SectionHeader/style.css +1 -0
  306. package/build/components/SegmentedControl/index.cjs +2 -0
  307. package/build/components/SegmentedControl/index.cjs.map +1 -0
  308. package/build/components/SegmentedControl/index.d.ts +24 -0
  309. package/build/components/SegmentedControl/index.js +69 -0
  310. package/build/components/SegmentedControl/index.js.map +1 -0
  311. package/build/components/SegmentedControl/style.css +1 -0
  312. package/build/components/Select/index.cjs +2 -0
  313. package/build/components/Select/index.cjs.map +1 -0
  314. package/build/components/Select/index.d.ts +39 -0
  315. package/build/components/Select/index.js +179 -0
  316. package/build/components/Select/index.js.map +1 -0
  317. package/build/components/Select/style.css +1 -0
  318. package/build/components/Skeleton/index.cjs +2 -0
  319. package/build/components/Skeleton/index.cjs.map +1 -0
  320. package/build/components/Skeleton/index.d.ts +25 -0
  321. package/build/components/Skeleton/index.js +50 -0
  322. package/build/components/Skeleton/index.js.map +1 -0
  323. package/build/components/Skeleton/style.css +1 -0
  324. package/build/components/Spinner/index.cjs +2 -0
  325. package/build/components/Spinner/index.cjs.map +1 -0
  326. package/build/components/Spinner/index.d.ts +11 -0
  327. package/build/components/Spinner/index.js +15 -0
  328. package/build/components/Spinner/index.js.map +1 -0
  329. package/build/components/Spinner/style.css +1 -0
  330. package/build/components/Stat/index.cjs +2 -0
  331. package/build/components/Stat/index.cjs.map +1 -0
  332. package/build/components/Stat/index.d.ts +34 -0
  333. package/build/components/Stat/index.js +72 -0
  334. package/build/components/Stat/index.js.map +1 -0
  335. package/build/components/Stat/style.css +1 -0
  336. package/build/components/StatusDot/index.cjs +2 -0
  337. package/build/components/StatusDot/index.cjs.map +1 -0
  338. package/build/components/StatusDot/index.d.ts +23 -0
  339. package/build/components/StatusDot/index.js +23 -0
  340. package/build/components/StatusDot/index.js.map +1 -0
  341. package/build/components/StatusDot/style.css +1 -0
  342. package/build/components/Steps/index.cjs +2 -0
  343. package/build/components/Steps/index.cjs.map +1 -0
  344. package/build/components/Steps/index.d.ts +23 -0
  345. package/build/components/Steps/index.js +69 -0
  346. package/build/components/Steps/index.js.map +1 -0
  347. package/build/components/Steps/style.css +1 -0
  348. package/build/components/SummaryCard/index.cjs +2 -0
  349. package/build/components/SummaryCard/index.cjs.map +1 -0
  350. package/build/components/SummaryCard/index.d.ts +24 -0
  351. package/build/components/SummaryCard/index.js +33 -0
  352. package/build/components/SummaryCard/index.js.map +1 -0
  353. package/build/components/SummaryCard/style.css +1 -0
  354. package/build/components/Switch/index.cjs +2 -0
  355. package/build/components/Switch/index.cjs.map +1 -0
  356. package/build/components/Switch/index.d.ts +16 -0
  357. package/build/components/Switch/index.js +42 -0
  358. package/build/components/Switch/index.js.map +1 -0
  359. package/build/components/Switch/style.css +1 -0
  360. package/build/components/Table/index.cjs +2 -0
  361. package/build/components/Table/index.cjs.map +1 -0
  362. package/build/components/Table/index.d.ts +28 -0
  363. package/build/components/Table/index.js +58 -0
  364. package/build/components/Table/index.js.map +1 -0
  365. package/build/components/Table/style.css +1 -0
  366. package/build/components/TableCheckbox/index.cjs +2 -0
  367. package/build/components/TableCheckbox/index.cjs.map +1 -0
  368. package/build/components/TableCheckbox/index.d.ts +15 -0
  369. package/build/components/TableCheckbox/index.js +31 -0
  370. package/build/components/TableCheckbox/index.js.map +1 -0
  371. package/build/components/TableCheckbox/style.css +1 -0
  372. package/build/components/Tabs/index.cjs +2 -0
  373. package/build/components/Tabs/index.cjs.map +1 -0
  374. package/build/components/Tabs/index.d.ts +27 -0
  375. package/build/components/Tabs/index.js +102 -0
  376. package/build/components/Tabs/index.js.map +1 -0
  377. package/build/components/Tabs/style.css +1 -0
  378. package/build/components/TagInput/index.cjs +2 -0
  379. package/build/components/TagInput/index.cjs.map +1 -0
  380. package/build/components/TagInput/index.d.ts +25 -0
  381. package/build/components/TagInput/index.js +124 -0
  382. package/build/components/TagInput/index.js.map +1 -0
  383. package/build/components/TagInput/style.css +1 -0
  384. package/build/components/TextLink/index.cjs +2 -0
  385. package/build/components/TextLink/index.cjs.map +1 -0
  386. package/build/components/TextLink/index.d.ts +16 -0
  387. package/build/components/TextLink/index.js +32 -0
  388. package/build/components/TextLink/index.js.map +1 -0
  389. package/build/components/TextLink/style.css +1 -0
  390. package/build/components/Textarea/index.cjs +2 -0
  391. package/build/components/Textarea/index.cjs.map +1 -0
  392. package/build/components/Textarea/index.d.ts +20 -0
  393. package/build/components/Textarea/index.js +68 -0
  394. package/build/components/Textarea/index.js.map +1 -0
  395. package/build/components/Textarea/style.css +1 -0
  396. package/build/components/Tile/index.cjs +2 -0
  397. package/build/components/Tile/index.cjs.map +1 -0
  398. package/build/components/Tile/index.d.ts +19 -0
  399. package/build/components/Tile/index.js +24 -0
  400. package/build/components/Tile/index.js.map +1 -0
  401. package/build/components/Tile/style.css +1 -0
  402. package/build/components/Timeline/index.cjs +2 -0
  403. package/build/components/Timeline/index.cjs.map +1 -0
  404. package/build/components/Timeline/index.d.ts +24 -0
  405. package/build/components/Timeline/index.js +56 -0
  406. package/build/components/Timeline/index.js.map +1 -0
  407. package/build/components/Timeline/style.css +1 -0
  408. package/build/components/Toast/index.cjs +2 -0
  409. package/build/components/Toast/index.cjs.map +1 -0
  410. package/build/components/Toast/index.d.ts +43 -0
  411. package/build/components/Toast/index.js +136 -0
  412. package/build/components/Toast/index.js.map +1 -0
  413. package/build/components/Toast/style.css +1 -0
  414. package/build/components/ToastPortal/index.cjs +2 -0
  415. package/build/components/ToastPortal/index.cjs.map +1 -0
  416. package/build/components/ToastPortal/index.d.ts +8 -0
  417. package/build/components/ToastPortal/index.js +15 -0
  418. package/build/components/ToastPortal/index.js.map +1 -0
  419. package/build/components/Tooltip/index.cjs +2 -0
  420. package/build/components/Tooltip/index.cjs.map +1 -0
  421. package/build/components/Tooltip/index.d.ts +23 -0
  422. package/build/components/Tooltip/index.js +116 -0
  423. package/build/components/Tooltip/index.js.map +1 -0
  424. package/build/components/Tooltip/style.css +1 -0
  425. package/build/constants/breakpoint.constants.cjs +2 -0
  426. package/build/constants/breakpoint.constants.cjs.map +1 -0
  427. package/build/constants/breakpoint.constants.d.ts +8 -0
  428. package/build/constants/breakpoint.constants.js +9 -0
  429. package/build/constants/breakpoint.constants.js.map +1 -0
  430. package/build/constants/combobox.constants.cjs +2 -0
  431. package/build/constants/combobox.constants.cjs.map +1 -0
  432. package/build/constants/combobox.constants.d.ts +11 -0
  433. package/build/constants/combobox.constants.js +7 -0
  434. package/build/constants/combobox.constants.js.map +1 -0
  435. package/build/constants/scroll.constants.cjs +2 -0
  436. package/build/constants/scroll.constants.cjs.map +1 -0
  437. package/build/constants/scroll.constants.d.ts +7 -0
  438. package/build/constants/scroll.constants.js +5 -0
  439. package/build/constants/scroll.constants.js.map +1 -0
  440. package/build/enums/ui-size.enum.cjs +2 -0
  441. package/build/enums/ui-size.enum.cjs.map +1 -0
  442. package/build/enums/ui-size.enum.d.ts +9 -0
  443. package/build/enums/ui-size.enum.js +5 -0
  444. package/build/enums/ui-size.enum.js.map +1 -0
  445. package/build/enums/ui-variant.enum.cjs +2 -0
  446. package/build/enums/ui-variant.enum.cjs.map +1 -0
  447. package/build/enums/ui-variant.enum.d.ts +20 -0
  448. package/build/enums/ui-variant.enum.js +5 -0
  449. package/build/enums/ui-variant.enum.js.map +1 -0
  450. package/build/helpers/class-name.helper.cjs +2 -0
  451. package/build/helpers/class-name.helper.cjs.map +1 -0
  452. package/build/helpers/class-name.helper.d.ts +3 -0
  453. package/build/helpers/class-name.helper.js +10 -0
  454. package/build/helpers/class-name.helper.js.map +1 -0
  455. package/build/helpers/component.helper.cjs +2 -0
  456. package/build/helpers/component.helper.cjs.map +1 -0
  457. package/build/helpers/component.helper.d.ts +13 -0
  458. package/build/helpers/component.helper.js +5 -0
  459. package/build/helpers/component.helper.js.map +1 -0
  460. package/build/helpers/focus.helper.cjs +2 -0
  461. package/build/helpers/focus.helper.cjs.map +1 -0
  462. package/build/helpers/focus.helper.d.ts +42 -0
  463. package/build/helpers/focus.helper.js +65 -0
  464. package/build/helpers/focus.helper.js.map +1 -0
  465. package/build/helpers/label.helper.cjs +2 -0
  466. package/build/helpers/label.helper.cjs.map +1 -0
  467. package/build/helpers/label.helper.d.ts +11 -0
  468. package/build/helpers/label.helper.js +11 -0
  469. package/build/helpers/label.helper.js.map +1 -0
  470. package/build/helpers/portal.helper.cjs +2 -0
  471. package/build/helpers/portal.helper.cjs.map +1 -0
  472. package/build/helpers/portal.helper.d.ts +28 -0
  473. package/build/helpers/portal.helper.js +36 -0
  474. package/build/helpers/portal.helper.js.map +1 -0
  475. package/build/helpers/scroll.helper.cjs +2 -0
  476. package/build/helpers/scroll.helper.cjs.map +1 -0
  477. package/build/helpers/scroll.helper.d.ts +8 -0
  478. package/build/helpers/scroll.helper.js +11 -0
  479. package/build/helpers/scroll.helper.js.map +1 -0
  480. package/build/helpers/text.helper.cjs +2 -0
  481. package/build/helpers/text.helper.cjs.map +1 -0
  482. package/build/helpers/text.helper.d.ts +5 -0
  483. package/build/helpers/text.helper.js +6 -0
  484. package/build/helpers/text.helper.js.map +1 -0
  485. package/build/helpers/theme.helper.cjs +24 -0
  486. package/build/helpers/theme.helper.cjs.map +1 -0
  487. package/build/helpers/theme.helper.d.ts +49 -0
  488. package/build/helpers/theme.helper.js +75 -0
  489. package/build/helpers/theme.helper.js.map +1 -0
  490. package/build/hooks/useAnnounce.cjs +2 -0
  491. package/build/hooks/useAnnounce.cjs.map +1 -0
  492. package/build/hooks/useAnnounce.d.ts +4 -0
  493. package/build/hooks/useAnnounce.js +23 -0
  494. package/build/hooks/useAnnounce.js.map +1 -0
  495. package/build/hooks/useAsyncSearch.cjs +2 -0
  496. package/build/hooks/useAsyncSearch.cjs.map +1 -0
  497. package/build/hooks/useAsyncSearch.d.ts +11 -0
  498. package/build/hooks/useAsyncSearch.js +17 -0
  499. package/build/hooks/useAsyncSearch.js.map +1 -0
  500. package/build/hooks/useCopyFeedback.cjs +2 -0
  501. package/build/hooks/useCopyFeedback.cjs.map +1 -0
  502. package/build/hooks/useCopyFeedback.d.ts +10 -0
  503. package/build/hooks/useCopyFeedback.js +25 -0
  504. package/build/hooks/useCopyFeedback.js.map +1 -0
  505. package/build/hooks/useDismissOnEscape.cjs +2 -0
  506. package/build/hooks/useDismissOnEscape.cjs.map +1 -0
  507. package/build/hooks/useDismissOnEscape.d.ts +12 -0
  508. package/build/hooks/useDismissOnEscape.js +18 -0
  509. package/build/hooks/useDismissOnEscape.js.map +1 -0
  510. package/build/hooks/useListboxNavigation.cjs +2 -0
  511. package/build/hooks/useListboxNavigation.cjs.map +1 -0
  512. package/build/hooks/useListboxNavigation.d.ts +7 -0
  513. package/build/hooks/useListboxNavigation.js +53 -0
  514. package/build/hooks/useListboxNavigation.js.map +1 -0
  515. package/build/hooks/usePortalSurface.cjs +2 -0
  516. package/build/hooks/usePortalSurface.cjs.map +1 -0
  517. package/build/hooks/usePortalSurface.d.ts +25 -0
  518. package/build/hooks/usePortalSurface.js +19 -0
  519. package/build/hooks/usePortalSurface.js.map +1 -0
  520. package/build/hooks/usePositioning.cjs +2 -0
  521. package/build/hooks/usePositioning.cjs.map +1 -0
  522. package/build/hooks/usePositioning.d.ts +13 -0
  523. package/build/hooks/usePositioning.js +74 -0
  524. package/build/hooks/usePositioning.js.map +1 -0
  525. package/build/hooks/useScrollLock.cjs +2 -0
  526. package/build/hooks/useScrollLock.cjs.map +1 -0
  527. package/build/hooks/useScrollLock.d.ts +2 -0
  528. package/build/hooks/useScrollLock.js +34 -0
  529. package/build/hooks/useScrollLock.js.map +1 -0
  530. package/build/hooks/useSheetViewport.cjs +2 -0
  531. package/build/hooks/useSheetViewport.cjs.map +1 -0
  532. package/build/hooks/useSheetViewport.d.ts +6 -0
  533. package/build/hooks/useSheetViewport.js +29 -0
  534. package/build/hooks/useSheetViewport.js.map +1 -0
  535. package/build/hooks/useStickToBottom.cjs +2 -0
  536. package/build/hooks/useStickToBottom.cjs.map +1 -0
  537. package/build/hooks/useStickToBottom.d.ts +12 -0
  538. package/build/hooks/useStickToBottom.js +39 -0
  539. package/build/hooks/useStickToBottom.js.map +1 -0
  540. package/build/hooks/useUiTheme.cjs +2 -0
  541. package/build/hooks/useUiTheme.cjs.map +1 -0
  542. package/build/hooks/useUiTheme.d.ts +7 -0
  543. package/build/hooks/useUiTheme.js +36 -0
  544. package/build/hooks/useUiTheme.js.map +1 -0
  545. package/build/hooks/useUiTokens.cjs +2 -0
  546. package/build/hooks/useUiTokens.cjs.map +1 -0
  547. package/build/hooks/useUiTokens.d.ts +11 -0
  548. package/build/hooks/useUiTokens.js +39 -0
  549. package/build/hooks/useUiTokens.js.map +1 -0
  550. package/build/hooks/useVirtualList.cjs +2 -0
  551. package/build/hooks/useVirtualList.cjs.map +1 -0
  552. package/build/hooks/useVirtualList.d.ts +13 -0
  553. package/build/hooks/useVirtualList.js +41 -0
  554. package/build/hooks/useVirtualList.js.map +1 -0
  555. package/build/index.cjs +2 -0
  556. package/build/index.cjs.map +1 -0
  557. package/build/index.d.ts +95 -0
  558. package/build/index.js +207 -0
  559. package/build/index.js.map +1 -0
  560. package/build/scss/_colors.generated.scss +119 -0
  561. package/build/scss/_index.scss +6 -0
  562. package/build/scss/_metrics.generated.scss +49 -0
  563. package/build/scss/_mixins.scss +710 -0
  564. package/build/scss/_variables.scss +51 -0
  565. package/build/styles/base.d.ts +0 -0
  566. package/build/styles.css +133 -0
  567. package/build/theme/UiProvider.cjs +2 -0
  568. package/build/theme/UiProvider.cjs.map +1 -0
  569. package/build/theme/UiProvider.d.ts +22 -0
  570. package/build/theme/UiProvider.js +30 -0
  571. package/build/theme/UiProvider.js.map +1 -0
  572. package/build/theme/UiThemeScript.cjs +2 -0
  573. package/build/theme/UiThemeScript.cjs.map +1 -0
  574. package/build/theme/UiThemeScript.d.ts +19 -0
  575. package/build/theme/UiThemeScript.js +8 -0
  576. package/build/theme/UiThemeScript.js.map +1 -0
  577. package/build/theme/context.cjs +2 -0
  578. package/build/theme/context.cjs.map +1 -0
  579. package/build/theme/context.d.ts +5 -0
  580. package/build/theme/context.js +8 -0
  581. package/build/theme/context.js.map +1 -0
  582. package/build/theme/initUi.cjs +2 -0
  583. package/build/theme/initUi.cjs.map +1 -0
  584. package/build/theme/initUi.d.ts +7 -0
  585. package/build/theme/initUi.js +10 -0
  586. package/build/theme/initUi.js.map +1 -0
  587. package/build/theme/palette.cjs +2 -0
  588. package/build/theme/palette.cjs.map +1 -0
  589. package/build/theme/palette.d.ts +219 -0
  590. package/build/theme/palette.js +148 -0
  591. package/build/theme/palette.js.map +1 -0
  592. package/build/theme/tokens.cjs +2 -0
  593. package/build/theme/tokens.cjs.map +1 -0
  594. package/build/theme/tokens.d.ts +225 -0
  595. package/build/theme/tokens.js +384 -0
  596. package/build/theme/tokens.js.map +1 -0
  597. package/build/types/charts/AreaChart/index.d.ts +14 -0
  598. package/build/types/charts/BarChart/index.d.ts +16 -0
  599. package/build/types/charts/BoxPlot/index.d.ts +43 -0
  600. package/build/types/charts/ComposedChart/index.d.ts +16 -0
  601. package/build/types/charts/Heatmap/index.d.ts +30 -0
  602. package/build/types/charts/Histogram/index.d.ts +29 -0
  603. package/build/types/charts/LineChart/index.d.ts +14 -0
  604. package/build/types/charts/PieChart/index.d.ts +36 -0
  605. package/build/types/charts/RadarChart/index.d.ts +40 -0
  606. package/build/types/charts/ScatterPlot/index.d.ts +41 -0
  607. package/build/types/charts/core/CartesianChart.d.ts +43 -0
  608. package/build/types/charts/core/ChartFrame.d.ts +55 -0
  609. package/build/types/charts/core/axes.d.ts +37 -0
  610. package/build/types/charts/core/cartesian.d.ts +80 -0
  611. package/build/types/charts/core/format.d.ts +19 -0
  612. package/build/types/charts/core/margins.d.ts +9 -0
  613. package/build/types/charts/core/palette.d.ts +13 -0
  614. package/build/types/charts/core/path.d.ts +24 -0
  615. package/build/types/charts/core/scale.d.ts +40 -0
  616. package/build/types/charts/core/series.d.ts +11 -0
  617. package/build/types/charts/core/spatial.d.ts +12 -0
  618. package/build/types/charts/core/stats.d.ts +34 -0
  619. package/build/types/charts/core/types.d.ts +31 -0
  620. package/build/types/charts/core/useChartWidth.d.ts +7 -0
  621. package/build/types/charts/index.d.ts +21 -0
  622. package/build/types/chat/ActionList/index.d.ts +46 -0
  623. package/build/types/chat/AppBar/index.d.ts +21 -0
  624. package/build/types/chat/ChatMessage/index.d.ts +24 -0
  625. package/build/types/chat/ChatThread/index.d.ts +24 -0
  626. package/build/types/chat/Citation/index.d.ts +15 -0
  627. package/build/types/chat/CodeBlock/format.d.ts +7 -0
  628. package/build/types/chat/CodeBlock/grammars.d.ts +44 -0
  629. package/build/types/chat/CodeBlock/highlight.d.ts +22 -0
  630. package/build/types/chat/CodeBlock/index.d.ts +33 -0
  631. package/build/types/chat/DescriptionList/index.d.ts +16 -0
  632. package/build/types/chat/Legend/index.d.ts +20 -0
  633. package/build/types/chat/MessageActions/index.d.ts +21 -0
  634. package/build/types/chat/PromptInput/index.d.ts +47 -0
  635. package/build/types/chat/PromptSuggestions/index.d.ts +25 -0
  636. package/build/types/chat/Prose/index.d.ts +15 -0
  637. package/build/types/chat/ReasoningBlock/index.d.ts +24 -0
  638. package/build/types/chat/ReasoningText/index.d.ts +14 -0
  639. package/build/types/chat/SegmentBar/index.d.ts +46 -0
  640. package/build/types/chat/SourceList/index.d.ts +25 -0
  641. package/build/types/chat/TerminalOutput/index.d.ts +25 -0
  642. package/build/types/chat/ToolCall/index.d.ts +41 -0
  643. package/build/types/chat/index.d.ts +26 -0
  644. package/build/types/combobox.type.d.ts +49 -0
  645. package/build/types/common-element-props.type.d.ts +8 -0
  646. package/build/types/helpers/class-name.helper.d.ts +3 -0
  647. package/build/types/helpers/component.helper.d.ts +13 -0
  648. package/build/types/helpers/label.helper.d.ts +12 -0
  649. package/build/types/hook.type.d.ts +36 -0
  650. package/build/types/link.type.d.ts +14 -0
  651. package/build/types/positioning.type.d.ts +38 -0
  652. package/build/types/theme/palette.d.ts +219 -0
  653. package/build/types/theme/tokens.d.ts +225 -0
  654. package/build/types/theme.type.d.ts +223 -0
  655. package/build/types/types/common-element-props.type.d.ts +8 -0
  656. package/build/types/types/link.type.d.ts +14 -0
  657. package/build/types/types/theme.type.d.ts +223 -0
  658. package/package.json +487 -4
@@ -0,0 +1,11 @@
1
+ "use client";
2
+ import { jsx as i } from "react/jsx-runtime";
3
+ import { useUi as e } from "../../theme/context.js";
4
+ const p = ({ children: n, ...o }) => {
5
+ const { linkComponent: t } = e();
6
+ return t ? /* @__PURE__ */ i(t, { ...o, children: n }) : /* @__PURE__ */ i("a", { ...o, children: n });
7
+ };
8
+ export {
9
+ p as default
10
+ };
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/Link/index.tsx"],"sourcesContent":["'use client';\n\nimport type { AnchorHTMLAttributes, FC } from 'react';\n\nimport { useUi } from '../../theme/context';\nimport type { UiLinkProps } from '../../types/link.type';\n\n/** Kütüphanenin İÇ bağlantı öğesi. */\nconst UiLink: FC<UiLinkProps> = ({ children, ...rest }) => {\n const { linkComponent: LinkComponent } = useUi();\n\n if (LinkComponent) return <LinkComponent {...(rest as UiLinkProps)}>{children}</LinkComponent>;\n\n /*\n * Yonlendirici yoksa ham `<a>`. `rest` indeks imzasi tasiyor (yonlendiriciye ozgu props icin);\n * DOM'a giderken anchor sozlesmesine daraltilir\n */\n return <a {...(rest as AnchorHTMLAttributes<HTMLAnchorElement>)}>{children}</a>;\n};\n\nexport default UiLink;\n"],"names":["UiLink","children","rest","LinkComponent","useUi","jsx"],"mappings":";;;AAOA,MAAMA,IAA0B,CAAC,EAAE,UAAAC,GAAU,GAAGC,QAAW;AACzD,QAAM,EAAE,eAAeC,EAAA,IAAkBC,EAAA;AAEzC,SAAID,IAAsB,gBAAAE,EAACF,GAAA,EAAe,GAAID,GAAuB,UAAAD,GAAS,IAMvE,gBAAAI,EAAC,KAAA,EAAG,GAAIH,GAAmD,UAAAD,EAAA,CAAS;AAC7E;"}
@@ -0,0 +1,2 @@
1
+ "use client";"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const o=require("react/jsx-runtime"),t=require("react"),$=require("react-dom"),R=require("../../helpers/class-name.helper.cjs"),F=require("../../helpers/component.helper.cjs"),T=require("../../helpers/focus.helper.cjs"),B=require("../../hooks/usePortalSurface.cjs"),U=require("../../hooks/usePositioning.cjs"),D={default:{"menu":"ui-menu-1x-FU","menu--top":"ui-menu--top-gpo39","menu--bottom":"ui-menu--bottom-6sL7b","menu--left":"ui-menu--left-4w-O8","menu--right":"ui-menu--right-XmM8G","menu__header":"ui-menu__header--yAhp","menu__list":"ui-menu__list-9nZDG","menu__item":"ui-menu__item-d1iil","menu__item--danger":"ui-menu__item--danger-lIINY","menu__icon":"ui-menu__icon-kzLV2"}},C=s=>s.map((c,f)=>c.isDisabled?-1:f).filter(c=>c>=0),A=({id:s,items:c,label:f,anchorRef:k,ownerRef:p,side:j,align:v,offset:w,initial:x,header:r,className:m,testId:b,onClose:u,onContextMenu:E})=>{const h=t.useRef(null),_=t.useRef({text:"",at:0}),a=C(c),[l,g]=t.useState(()=>x==="first"?a[0]:a[a.length-1]),n=U.default(k,h,{side:j,align:v,offset:w,isOpen:!0}),d=B.default(!0,p,h),{isPositioned:S}=n;t.useEffect(()=>{var e,i;S&&((i=(e=h.current)==null?void 0:e.querySelector(`[data-index="${l}"]`))==null||i.focus({preventScroll:!0}))},[l,S]),t.useEffect(()=>{const e=i=>{var M,q;const y=i.target;(M=h.current)!=null&&M.contains(y)||(q=p.current)!=null&&q.contains(y)||u()};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[p,u]);const I=e=>{const y=(a.indexOf(l)+e+a.length)%a.length;g(a[y])},P=e=>{const i=Date.now(),y=i-_.current.at>500?e:_.current.text+e;_.current={text:y,at:i};const M=a.find(q=>c[q].label.toLocaleLowerCase("tr").startsWith(y.toLocaleLowerCase("tr")));M!==void 0&&g(M)},K=e=>{switch(e.key){case"ArrowDown":e.preventDefault(),I(1);break;case"ArrowUp":e.preventDefault(),I(-1);break;case"Home":e.preventDefault(),g(a[0]);break;case"End":e.preventDefault(),g(a[a.length-1]);break;case"Escape":e.preventDefault(),u();break;case"Tab":u();break;default:e.key.length===1&&!e.metaKey&&!e.ctrlKey&&P(e.key)}};if(!d.container)return null;const L=c.map((e,i)=>o.jsxs("button",{type:"button",role:"menuitem","data-index":i,tabIndex:i===l?0:-1,disabled:e.isDisabled,className:R.cx(D.default.menu__item,e.isDanger&&D.default["menu__item--danger"]),onClick:()=>{e.onSelect(),u()},children:[e.icon&&o.jsx("span",{className:D.default.menu__icon,"aria-hidden":!0,children:e.icon}),e.label]},e.id)),N={ref:h,...d.attributes,className:R.cx(D.default.menu,D.default[`menu--${n.side}`],m),style:{...n.style,...d.style,visibility:n.isPositioned?"visible":"hidden"},"data-testid":b,onContextMenu:E},O=`${s}-header`;return $.createPortal(r?o.jsxs("div",{...N,children:[o.jsx("div",{id:O,className:D.default.menu__header,children:r}),o.jsx("div",{id:s,role:"menu","aria-label":f,"aria-describedby":O,className:D.default.menu__list,onKeyDown:K,children:L})]}):o.jsx("div",{...N,id:s,role:"menu","aria-label":f,onKeyDown:K,children:L}),d.container)},H=({trigger:s,items:c,label:f,side:k="bottom",align:p="start",className:j,testId:v})=>{const w=t.useId(),x=t.useRef(null),r=t.useRef(null),[m,b]=t.useState(null),u=m!==null,E=C(c),h=t.useCallback(n=>{E.length!==0&&(r.current=T.captureFocus(),b(n))},[E]),_=t.useCallback(()=>{var n;b(null),(n=r.current)==null||n.call(r),r.current=null},[]);t.useEffect(()=>()=>{var n;(n=r.current)==null||n.call(r),r.current=null},[]);const a=n=>{if(n.key==="ArrowUp"){n.preventDefault(),h("last");return}["ArrowDown","Enter"," "].includes(n.key)&&(n.preventDefault(),h("first"))};if(!t.isValidElement(s))return null;const l=s.props,g=t.cloneElement(s,{ref:x,"aria-haspopup":"menu","aria-expanded":u,"aria-controls":u?w:void 0,onClick:n=>{var d;(d=l.onClick)==null||d.call(l,n),u?_():h("first")},onKeyDown:n=>{var d;(d=l.onKeyDown)==null||d.call(l,n),u||a(n)}});return o.jsxs(o.Fragment,{children:[g,m&&o.jsx(A,{id:w,items:c,label:f,anchorRef:x,ownerRef:x,side:k,align:p,initial:m,className:j,testId:v,onClose:_})]})},V=t.memo(F.named(H,"Menu")),W=2,z=s=>s.preventDefault(),G=({point:s,onClose:c,items:f,label:k,header:p,className:j,testId:v})=>{const w=t.useId(),x=t.useRef(null),r=s!==null&&C(f).length>0,m=(s==null?void 0:s.x)??0,b=(s==null?void 0:s.y)??0,u=t.useMemo(()=>({current:{getBoundingClientRect:()=>({top:b,left:m,width:0,height:0})}}),[m,b]);return t.useLayoutEffect(()=>{if(r)return T.captureFocus()},[r]),o.jsxs(o.Fragment,{children:[o.jsx("span",{ref:x,hidden:!0}),r&&o.jsx(A,{id:w,items:f,label:k,anchorRef:u,ownerRef:x,side:"bottom",align:"start",offset:W,initial:"first",header:p,className:j,testId:v,onClose:c,onContextMenu:z},`${m}:${b}`)]})},J=F.named(t.memo(G),"ContextMenu");exports.ContextMenu=J;exports.default=V;
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../../../src/components/Menu/index.tsx"],"sourcesContent":["'use client';\n\nimport {\n cloneElement,\n isValidElement,\n type KeyboardEvent,\n memo,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { captureFocus } from '../../helpers/focus.helper';\nimport usePortalSurface from '../../hooks/usePortalSurface';\nimport usePositioning from '../../hooks/usePositioning';\n\nimport styles from './index.module.scss';\nimport type { PositionAlign, PositionSide, PositioningRect } from '@/types/positioning.type';\n\nexport type MenuItem = {\n id: string;\n label: string;\n icon?: ReactNode;\n onSelect: () => void;\n isDisabled?: boolean;\n /** Geri alınamaz eylem: yıkıcı tonda çizilir. */\n isDanger?: boolean;\n};\n\ntype Props = {\n /** Tetikleyici. */\n trigger: ReactElement;\n items: MenuItem[];\n /** Menünün erişilebilir adı (\"Satır eylemleri\"). */\n label: string;\n side?: PositionSide;\n align?: PositionAlign;\n className?: string;\n testId?: string;\n};\n\n/** Pasif olmayan seçeneklerin dizinleri. */\nconst enabledIndexes = (items: MenuItem[]): number[] =>\n items.map((item, index) => (item.isDisabled ? -1 : index)).filter(index => index >= 0);\n\ntype SurfaceProps = {\n id: string;\n items: MenuItem[];\n label: string;\n /** Konumun ÖLÇÜLDÜĞÜ çapa: tetikleyici ya da imleç noktası. */\n anchorRef: { current: { getBoundingClientRect: () => PositioningRect } | null };\n /** Ağaçtaki sahip: portal hedefi (en yakın `<dialog>`) ve dışarı-tıklama istisnası. */\n ownerRef: { current: HTMLElement | null };\n side: PositionSide;\n align: PositionAlign;\n offset?: number;\n /** Açılışta odaklanan uç. */\n initial: 'first' | 'last';\n header?: ReactNode;\n className?: string;\n testId?: string;\n onClose: () => void;\n onContextMenu?: (event: MouseEvent) => void;\n};\n\n/**\n * MENÜ YÜZEYİ — `Menu` ve `ContextMenu`nün ortak gövdesi: konum, portal, odak, klavye ve\n * dışarı-tıklama TEK yerde. Yalnızca AÇIKKEN takılır; kapanış sökülmedir.\n */\nconst MenuSurface = ({\n id,\n items,\n label,\n anchorRef,\n ownerRef,\n side,\n align,\n offset,\n initial,\n header,\n className,\n testId,\n onClose,\n onContextMenu,\n}: SurfaceProps) => {\n const surfaceRef = useRef<HTMLDivElement>(null);\n /* Harfe atlama tamponu: art arda basilan harfler tek bir arama olur. */\n const typedRef = useRef({ text: '', at: 0 });\n const enabled = enabledIndexes(items);\n\n const [activeIndex, setActiveIndex] = useState(() =>\n initial === 'first' ? enabled[0] : enabled[enabled.length - 1],\n );\n\n const positioning = usePositioning(anchorRef, surfaceRef, { side, align, offset, isOpen: true });\n\n /*\n * Portal hedefi HER RENDER'DA degil, yalnizca acikken cozulur. `closest` ucuzdur ama\n * tetikleyicinin DOM konumu acilistan sonra degismedigi icin tekrar…\n */\n const portal = usePortalSurface(true, ownerRef, surfaceRef);\n\n /*\n * Etkin oge GERCEKTEN odaklanir (APG menu deseni).\n * ⚠ KONUM OLCULDUKTEN SONRA: yuzey o ana kadar `visibility: hidden` tasir ve gizli oge odak ALMAZ.\n * Olcum `useLayoutEffect`te durum yazar, ama ayrik olayda (tik, sag tik) React bu commit'in pasif\n * etkilerini yeniden cizimden ONCE bosaltiyor — odak gizli yuzeye gidip sessizce dusuyordu ve\n * odak `<body>`de kaliyordu (olculdu: chromium, 5.5.0 `Menu` dahil). jsdom gorunurlugu bilmedigi\n * icin birim testleri bunu goremiyordu; nobetci `anchored-panel.spec.ts` \"menü açılışında odak\".\n */\n const { isPositioned } = positioning;\n\n useEffect(() => {\n if (!isPositioned) return;\n surfaceRef.current\n ?.querySelector<HTMLElement>(`[data-index=\"${activeIndex}\"]`)\n ?.focus({ preventScroll: true });\n }, [activeIndex, isPositioned]);\n\n useEffect(() => {\n const handlePointerDown = (event: globalThis.MouseEvent) => {\n const target = event.target as Node;\n if (surfaceRef.current?.contains(target) || ownerRef.current?.contains(target)) return;\n onClose();\n };\n\n document.addEventListener('mousedown', handlePointerDown);\n return () => document.removeEventListener('mousedown', handlePointerDown);\n }, [ownerRef, onClose]);\n\n const step = (offsetBy: number) => {\n const position = enabled.indexOf(activeIndex);\n const next = (position + offsetBy + enabled.length) % enabled.length;\n setActiveIndex(enabled[next]);\n };\n\n /** Harfe atlama: 500 ms içinde basılan harfler tek bir arama. */\n const jumpToLetter = (key: string) => {\n const now = Date.now();\n const buffer = now - typedRef.current.at > 500 ? key : typedRef.current.text + key;\n typedRef.current = { text: buffer, at: now };\n\n const match = enabled.find(index =>\n items[index].label.toLocaleLowerCase('tr').startsWith(buffer.toLocaleLowerCase('tr')),\n );\n\n if (match !== undefined) setActiveIndex(match);\n };\n\n const handleMenuKeyDown = (event: KeyboardEvent) => {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n step(1);\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n step(-1);\n break;\n\n case 'Home':\n event.preventDefault();\n setActiveIndex(enabled[0]);\n break;\n\n case 'End':\n event.preventDefault();\n setActiveIndex(enabled[enabled.length - 1]);\n break;\n\n case 'Escape':\n /*\n * `preventDefault` SAYFAYA \"bu Escape islendi\" der: `window`da Escape dinleyen kod\n * (`event.defaultPrevented`) menuyu kapatan tusla kendi eylemini de calistirmaz.\n */\n event.preventDefault();\n onClose();\n break;\n\n case 'Tab':\n /*\n * Menu KAPANIR ama gezinme SURER: kullanici menuden cikip sayfaya devam ediyor.\n * `preventDefault` yok.\n */\n onClose();\n break;\n\n default:\n if (event.key.length === 1 && !event.metaKey && !event.ctrlKey) jumpToLetter(event.key);\n }\n };\n\n if (!portal.container) return null;\n\n const buttons = items.map((item, index) => (\n <button\n key={item.id}\n type=\"button\"\n role=\"menuitem\"\n data-index={index}\n /* DONEN `tabindex`: menu Tab sirasinda TEK durak. */\n tabIndex={index === activeIndex ? 0 : -1}\n disabled={item.isDisabled}\n className={cx(styles.menu__item, item.isDanger && styles['menu__item--danger'])}\n onClick={() => {\n item.onSelect();\n onClose();\n }}\n /*\n * ⚠ `onMouseEnter` KALDIRILDI. Eskiden fare bir ogenin uzerine\n * geldiginde `setActiveIndex` cagriliyordu; asagidaki etki de\n * `activeIndex` degisince `.focus()` cagirdigi icin sonuc\n * **farenin klavye odagini calmasi** oluyordu: kullanici ok\n * tuslariyla gezinirken imlecin durdugu yer ya da menunun\n * imlecin altinda kaymasi odagi geri firlatiyordu.\n *\n * Kaldirilan yorumun gerekcesi \"iki ayri vurgu kullaniciyi\n * sasirtiyordu\" idi; o sorun VURGULARI AYIRARAK cozuldu:\n * hover = arka plan, klavye odagi = halka (`index.module.scss`).\n * Ikisi artik farkli sey soyluyor, cakismiyor.\n */\n >\n {item.icon && (\n <span className={styles.menu__icon} aria-hidden>\n {item.icon}\n </span>\n )}\n {item.label}\n </button>\n ));\n\n const surface = {\n ref: surfaceRef,\n /* ⚠ Modalin ICINDEN acildiginda yuzey UST KATMANA cikmak ZORUNDA. */\n ...portal.attributes,\n className: cx(styles.menu, styles[`menu--${positioning.side}`], className),\n style: {\n ...positioning.style,\n ...portal.style,\n visibility: positioning.isPositioned ? ('visible' as const) : ('hidden' as const),\n },\n 'data-testid': testId,\n onContextMenu,\n };\n\n const headerId = `${id}-header`;\n\n return createPortal(\n /*\n * BASLIK `role=\"menu\"`nun DISINDA: menu yalniz `menuitem` tasir. Baslik menuye\n * `aria-describedby` ile baglanir — ok tuslari ogeler arasinda gezerken baglam okunur.\n */\n header ? (\n <div {...surface}>\n <div id={headerId} className={styles.menu__header}>\n {header}\n </div>\n <div\n id={id}\n role=\"menu\"\n aria-label={label}\n aria-describedby={headerId}\n className={styles.menu__list}\n onKeyDown={handleMenuKeyDown}\n >\n {buttons}\n </div>\n </div>\n ) : (\n <div {...surface} id={id} role=\"menu\" aria-label={label} onKeyDown={handleMenuKeyDown}>\n {buttons}\n </div>\n ),\n portal.container,\n );\n};\n\n/** Menü — bir listeden EYLEM seçme. */\nconst Menu = ({\n trigger,\n items,\n label,\n side = 'bottom',\n align = 'start',\n className,\n testId,\n}: Props) => {\n const id = useId();\n const anchorRef = useRef<HTMLElement>(null);\n const restoreRef = useRef<(() => void) | null>(null);\n\n /* Acilisin hangi uca odaklanacagi; `null` = kapali. */\n const [opening, setOpening] = useState<'first' | 'last' | null>(null);\n const isOpen = opening !== null;\n const enabled = enabledIndexes(items);\n\n const open = useCallback(\n (target: 'first' | 'last') => {\n if (enabled.length === 0) return;\n restoreRef.current = captureFocus();\n setOpening(target);\n },\n [enabled],\n );\n\n const close = useCallback(() => {\n setOpening(null);\n /*\n * Odak TETIKLEYICIYE doner: donmezse `<body>`ye duser ve klavye kullanicisi sayfanin en basina\n * giderdi.\n */\n restoreRef.current?.();\n restoreRef.current = null;\n }, []);\n\n /*\n * Geri yukleme YALNIZCA `close()` icindeydi, yani menu ACIKKEN sokuldugunde hic calismiyordu.\n * ⚠ SOKULME de bir kapanistir.\n */\n useEffect(\n () => () => {\n restoreRef.current?.();\n restoreRef.current = null;\n },\n [],\n );\n\n const handleTriggerKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n open('last');\n return;\n }\n\n if (['ArrowDown', 'Enter', ' '].includes(event.key)) {\n event.preventDefault();\n open('first');\n }\n };\n\n if (!isValidElement(trigger)) return null;\n\n const triggerProps = trigger.props as Record<string, unknown>;\n\n const anchor = cloneElement(trigger as ReactElement<Record<string, unknown>>, {\n ref: anchorRef,\n 'aria-haspopup': 'menu',\n 'aria-expanded': isOpen,\n 'aria-controls': isOpen ? id : undefined,\n onClick: (event: MouseEvent) => {\n (triggerProps.onClick as ((event: MouseEvent) => void) | undefined)?.(event);\n if (isOpen) close();\n else open('first');\n },\n onKeyDown: (event: KeyboardEvent) => {\n (triggerProps.onKeyDown as ((event: KeyboardEvent) => void) | undefined)?.(event);\n if (!isOpen) handleTriggerKeyDown(event);\n },\n });\n\n return (\n <>\n {anchor}\n\n {opening && (\n <MenuSurface\n id={id}\n items={items}\n label={label}\n anchorRef={anchorRef}\n ownerRef={anchorRef}\n side={side}\n align={align}\n initial={opening}\n className={className}\n testId={testId}\n onClose={close}\n />\n )}\n </>\n );\n};\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Menu, 'Menu')) as typeof Menu;\n\ntype ContextMenuProps = {\n /**\n * Açılış noktası — `contextmenu` olayının `clientX` / `clientY`si (görünüm alanı koordinatı).\n * `null` iken menü kapalı.\n */\n point: { x: number; y: number } | null;\n /** Escape, Tab, dışarı tıklama ya da seçilen eylemden sonra çağrılır; çağıran `point`i `null` yapar. */\n onClose: () => void;\n items: MenuItem[];\n /** Menünün erişilebilir adı (\"Seçim seçenekleri\"). */\n label: string;\n /** Eylemlerin ÜSTÜNDE okunan bağlam (seçimin özeti, ölçümler) — `role=\"menu\"`nün DIŞINDA. */\n header?: ReactNode;\n className?: string;\n testId?: string;\n};\n\n/* Nokta ile menu arasindaki bosluk: imlecin ucu ilk ogenin kenarini ortmesin. */\nconst POINT_OFFSET = 2;\n\n/* Menunun ICINDE sag tik tarayicinin menusunu acmaz. */\nconst preventNativeMenu = (event: MouseEvent) => event.preventDefault();\n\n/**\n * Bağlam menüsü — `Menu`nün imleç noktasında açılanı (sağ tık). Çağıran `contextmenu` olayında\n * `preventDefault()` çağırıp `point` yazar; menü noktanın sağ altına açılır, sığmazsa üste döner ve\n * görünüm alanına kırpılır. Odak açılışta ilk etkin öğeye gider, kapanışta önceki öğeye döner.\n */\nconst ContextMenuBase = ({\n point,\n onClose,\n items,\n label,\n header,\n className,\n testId,\n}: ContextMenuProps) => {\n const id = useId();\n /*\n * Agactaki SAHIP: noktanin DOM ogesi yok, ama portal hedefi (en yakin acik `<dialog>`) agactaki\n * konumdan cozulur — modalin icindeki menu govdeye portallanirsa ust katmanin ALTINDA kalirdi.\n */\n const ownerRef = useRef<HTMLSpanElement>(null);\n const isOpen = point !== null && enabledIndexes(items).length > 0;\n\n const x = point?.x ?? 0;\n const y = point?.y ?? 0;\n const anchorRef = useMemo(\n () => ({\n current: { getBoundingClientRect: () => ({ top: y, left: x, width: 0, height: 0 }) },\n }),\n [x, y],\n );\n\n /*\n * Odak YAKALAMA yuzeyin odagi tasimasindan ONCE olmali: yuzeyin `useEffect`i (ilk ogeye odak)\n * cocukta, bu `useLayoutEffect` ise tum pasif etkilerden once kosar. Temizlik = geri yukleme\n * (kapanis da sokulme de).\n */\n useLayoutEffect(() => {\n if (!isOpen) return;\n return captureFocus();\n }, [isOpen]);\n\n return (\n <>\n <span ref={ownerRef} hidden />\n\n {isOpen && (\n <MenuSurface\n /* Yeni nokta = yeni acilis: konum yeniden olculur, odak ilk ogeye doner. */\n key={`${x}:${y}`}\n id={id}\n items={items}\n label={label}\n anchorRef={anchorRef}\n ownerRef={ownerRef}\n side=\"bottom\"\n align=\"start\"\n offset={POINT_OFFSET}\n initial=\"first\"\n header={header}\n className={className}\n testId={testId}\n onClose={onClose}\n onContextMenu={preventNativeMenu}\n />\n )}\n </>\n );\n};\n\nexport const ContextMenu = /*#__PURE__*/ named(/*#__PURE__*/ memo(ContextMenuBase), 'ContextMenu');\n"],"names":["enabledIndexes","items","item","index","MenuSurface","id","label","anchorRef","ownerRef","side","align","offset","initial","header","className","testId","onClose","onContextMenu","surfaceRef","useRef","typedRef","enabled","activeIndex","setActiveIndex","useState","positioning","usePositioning","portal","usePortalSurface","isPositioned","useEffect","_b","_a","handlePointerDown","event","target","step","offsetBy","next","jumpToLetter","key","now","buffer","match","handleMenuKeyDown","buttons","jsxs","cx","styles","surface","headerId","createPortal","jsx","Menu","trigger","useId","restoreRef","opening","setOpening","isOpen","open","useCallback","captureFocus","close","handleTriggerKeyDown","isValidElement","triggerProps","anchor","cloneElement","Fragment","memo","named","POINT_OFFSET","preventNativeMenu","ContextMenuBase","point","x","y","useMemo","useLayoutEffect","ContextMenu"],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { ReactElement, ReactNode } from 'react';
2
+ import { PositionAlign, PositionSide } from '../../types/positioning.type';
3
+ export type MenuItem = {
4
+ id: string;
5
+ label: string;
6
+ icon?: ReactNode;
7
+ onSelect: () => void;
8
+ isDisabled?: boolean;
9
+ /** Geri alınamaz eylem: yıkıcı tonda çizilir. */
10
+ isDanger?: boolean;
11
+ };
12
+ type Props = {
13
+ /** Tetikleyici. */
14
+ trigger: ReactElement;
15
+ items: MenuItem[];
16
+ /** Menünün erişilebilir adı ("Satır eylemleri"). */
17
+ label: string;
18
+ side?: PositionSide;
19
+ align?: PositionAlign;
20
+ className?: string;
21
+ testId?: string;
22
+ };
23
+ /** Menü — bir listeden EYLEM seçme. */
24
+ declare const Menu: ({ trigger, items, label, side, align, className, testId, }: Props) => import("react").JSX.Element | null;
25
+ declare const _default: typeof Menu;
26
+ export default _default;
27
+ type ContextMenuProps = {
28
+ /**
29
+ * Açılış noktası — `contextmenu` olayının `clientX` / `clientY`si (görünüm alanı koordinatı).
30
+ * `null` iken menü kapalı.
31
+ */
32
+ point: {
33
+ x: number;
34
+ y: number;
35
+ } | null;
36
+ /** Escape, Tab, dışarı tıklama ya da seçilen eylemden sonra çağrılır; çağıran `point`i `null` yapar. */
37
+ onClose: () => void;
38
+ items: MenuItem[];
39
+ /** Menünün erişilebilir adı ("Seçim seçenekleri"). */
40
+ label: string;
41
+ /** Eylemlerin ÜSTÜNDE okunan bağlam (seçimin özeti, ölçümler) — `role="menu"`nün DIŞINDA. */
42
+ header?: ReactNode;
43
+ className?: string;
44
+ testId?: string;
45
+ };
46
+ export declare const ContextMenu: import('react').MemoExoticComponent<({ point, onClose, items, label, header, className, testId, }: ContextMenuProps) => import("react").JSX.Element>;
@@ -0,0 +1,241 @@
1
+ "use client";
2
+ import { jsxs as L, Fragment as R, jsx as x } from "react/jsx-runtime";
3
+ import { memo as B, useId as U, useRef as M, useMemo as G, useLayoutEffect as J, useState as q, useCallback as P, useEffect as I, isValidElement as Q, cloneElement as X } from "react";
4
+ import { createPortal as Y } from "react-dom";
5
+ import { cx as j } from "../../helpers/class-name.helper.js";
6
+ import { named as H } from "../../helpers/component.helper.js";
7
+ import { captureFocus as V } from "../../helpers/focus.helper.js";
8
+ import Z from "../../hooks/usePortalSurface.js";
9
+ import ee from "../../hooks/usePositioning.js";
10
+ const y = {"menu":"ui-menu-1x-FU","menu--top":"ui-menu--top-gpo39","menu--bottom":"ui-menu--bottom-6sL7b","menu--left":"ui-menu--left-4w-O8","menu--right":"ui-menu--right-XmM8G","menu__header":"ui-menu__header--yAhp","menu__list":"ui-menu__list-9nZDG","menu__item":"ui-menu__item-d1iil","menu__item--danger":"ui-menu__item--danger-lIINY","menu__icon":"ui-menu__icon-kzLV2"};
11
+ const N = (t) => t.map((s, u) => s.isDisabled ? -1 : u).filter((s) => s >= 0), W = ({
12
+ id: t,
13
+ items: s,
14
+ label: u,
15
+ anchorRef: g,
16
+ ownerRef: h,
17
+ side: v,
18
+ align: _,
19
+ offset: w,
20
+ initial: m,
21
+ header: r,
22
+ className: d,
23
+ testId: p,
24
+ onClose: a,
25
+ onContextMenu: C
26
+ }) => {
27
+ const f = M(null), D = M({ text: "", at: 0 }), o = N(s), [c, k] = q(
28
+ () => m === "first" ? o[0] : o[o.length - 1]
29
+ ), n = ee(g, f, { side: v, align: _, offset: w, isOpen: !0 }), l = Z(!0, h, f), { isPositioned: O } = n;
30
+ I(() => {
31
+ var e, i;
32
+ O && ((i = (e = f.current) == null ? void 0 : e.querySelector(`[data-index="${c}"]`)) == null || i.focus({ preventScroll: !0 }));
33
+ }, [c, O]), I(() => {
34
+ const e = (i) => {
35
+ var E, K;
36
+ const b = i.target;
37
+ (E = f.current) != null && E.contains(b) || (K = h.current) != null && K.contains(b) || a();
38
+ };
39
+ return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
40
+ }, [h, a]);
41
+ const S = (e) => {
42
+ const b = (o.indexOf(c) + e + o.length) % o.length;
43
+ k(o[b]);
44
+ }, z = (e) => {
45
+ const i = Date.now(), b = i - D.current.at > 500 ? e : D.current.text + e;
46
+ D.current = { text: b, at: i };
47
+ const E = o.find(
48
+ (K) => s[K].label.toLocaleLowerCase("tr").startsWith(b.toLocaleLowerCase("tr"))
49
+ );
50
+ E !== void 0 && k(E);
51
+ }, A = (e) => {
52
+ switch (e.key) {
53
+ case "ArrowDown":
54
+ e.preventDefault(), S(1);
55
+ break;
56
+ case "ArrowUp":
57
+ e.preventDefault(), S(-1);
58
+ break;
59
+ case "Home":
60
+ e.preventDefault(), k(o[0]);
61
+ break;
62
+ case "End":
63
+ e.preventDefault(), k(o[o.length - 1]);
64
+ break;
65
+ case "Escape":
66
+ e.preventDefault(), a();
67
+ break;
68
+ case "Tab":
69
+ a();
70
+ break;
71
+ default:
72
+ e.key.length === 1 && !e.metaKey && !e.ctrlKey && z(e.key);
73
+ }
74
+ };
75
+ if (!l.container) return null;
76
+ const T = s.map((e, i) => /* @__PURE__ */ L(
77
+ "button",
78
+ {
79
+ type: "button",
80
+ role: "menuitem",
81
+ "data-index": i,
82
+ tabIndex: i === c ? 0 : -1,
83
+ disabled: e.isDisabled,
84
+ className: j(y.menu__item, e.isDanger && y["menu__item--danger"]),
85
+ onClick: () => {
86
+ e.onSelect(), a();
87
+ },
88
+ children: [
89
+ e.icon && /* @__PURE__ */ x("span", { className: y.menu__icon, "aria-hidden": !0, children: e.icon }),
90
+ e.label
91
+ ]
92
+ },
93
+ e.id
94
+ )), $ = {
95
+ ref: f,
96
+ /* ⚠ Modalin ICINDEN acildiginda yuzey UST KATMANA cikmak ZORUNDA. */
97
+ ...l.attributes,
98
+ className: j(y.menu, y[`menu--${n.side}`], d),
99
+ style: {
100
+ ...n.style,
101
+ ...l.style,
102
+ visibility: n.isPositioned ? "visible" : "hidden"
103
+ },
104
+ "data-testid": p,
105
+ onContextMenu: C
106
+ }, F = `${t}-header`;
107
+ return Y(
108
+ /*
109
+ * BASLIK `role="menu"`nun DISINDA: menu yalniz `menuitem` tasir. Baslik menuye
110
+ * `aria-describedby` ile baglanir — ok tuslari ogeler arasinda gezerken baglam okunur.
111
+ */
112
+ r ? /* @__PURE__ */ L("div", { ...$, children: [
113
+ /* @__PURE__ */ x("div", { id: F, className: y.menu__header, children: r }),
114
+ /* @__PURE__ */ x(
115
+ "div",
116
+ {
117
+ id: t,
118
+ role: "menu",
119
+ "aria-label": u,
120
+ "aria-describedby": F,
121
+ className: y.menu__list,
122
+ onKeyDown: A,
123
+ children: T
124
+ }
125
+ )
126
+ ] }) : /* @__PURE__ */ x("div", { ...$, id: t, role: "menu", "aria-label": u, onKeyDown: A, children: T }),
127
+ l.container
128
+ );
129
+ }, ne = ({
130
+ trigger: t,
131
+ items: s,
132
+ label: u,
133
+ side: g = "bottom",
134
+ align: h = "start",
135
+ className: v,
136
+ testId: _
137
+ }) => {
138
+ const w = U(), m = M(null), r = M(null), [d, p] = q(null), a = d !== null, C = N(s), f = P(
139
+ (n) => {
140
+ C.length !== 0 && (r.current = V(), p(n));
141
+ },
142
+ [C]
143
+ ), D = P(() => {
144
+ var n;
145
+ p(null), (n = r.current) == null || n.call(r), r.current = null;
146
+ }, []);
147
+ I(
148
+ () => () => {
149
+ var n;
150
+ (n = r.current) == null || n.call(r), r.current = null;
151
+ },
152
+ []
153
+ );
154
+ const o = (n) => {
155
+ if (n.key === "ArrowUp") {
156
+ n.preventDefault(), f("last");
157
+ return;
158
+ }
159
+ ["ArrowDown", "Enter", " "].includes(n.key) && (n.preventDefault(), f("first"));
160
+ };
161
+ if (!Q(t)) return null;
162
+ const c = t.props, k = X(t, {
163
+ ref: m,
164
+ "aria-haspopup": "menu",
165
+ "aria-expanded": a,
166
+ "aria-controls": a ? w : void 0,
167
+ onClick: (n) => {
168
+ var l;
169
+ (l = c.onClick) == null || l.call(c, n), a ? D() : f("first");
170
+ },
171
+ onKeyDown: (n) => {
172
+ var l;
173
+ (l = c.onKeyDown) == null || l.call(c, n), a || o(n);
174
+ }
175
+ });
176
+ return /* @__PURE__ */ L(R, { children: [
177
+ k,
178
+ d && /* @__PURE__ */ x(
179
+ W,
180
+ {
181
+ id: w,
182
+ items: s,
183
+ label: u,
184
+ anchorRef: m,
185
+ ownerRef: m,
186
+ side: g,
187
+ align: h,
188
+ initial: d,
189
+ className: v,
190
+ testId: _,
191
+ onClose: D
192
+ }
193
+ )
194
+ ] });
195
+ }, pe = /* @__PURE__ */ B(/* @__PURE__ */ H(ne, "Menu")), te = 2, re = (t) => t.preventDefault(), oe = ({
196
+ point: t,
197
+ onClose: s,
198
+ items: u,
199
+ label: g,
200
+ header: h,
201
+ className: v,
202
+ testId: _
203
+ }) => {
204
+ const w = U(), m = M(null), r = t !== null && N(u).length > 0, d = (t == null ? void 0 : t.x) ?? 0, p = (t == null ? void 0 : t.y) ?? 0, a = G(
205
+ () => ({
206
+ current: { getBoundingClientRect: () => ({ top: p, left: d, width: 0, height: 0 }) }
207
+ }),
208
+ [d, p]
209
+ );
210
+ return J(() => {
211
+ if (r)
212
+ return V();
213
+ }, [r]), /* @__PURE__ */ L(R, { children: [
214
+ /* @__PURE__ */ x("span", { ref: m, hidden: !0 }),
215
+ r && /* @__PURE__ */ x(
216
+ W,
217
+ {
218
+ id: w,
219
+ items: u,
220
+ label: g,
221
+ anchorRef: a,
222
+ ownerRef: m,
223
+ side: "bottom",
224
+ align: "start",
225
+ offset: te,
226
+ initial: "first",
227
+ header: h,
228
+ className: v,
229
+ testId: _,
230
+ onClose: s,
231
+ onContextMenu: re
232
+ },
233
+ `${d}:${p}`
234
+ )
235
+ ] });
236
+ }, he = /* @__PURE__ */ H(/* @__PURE__ */ B(oe), "ContextMenu");
237
+ export {
238
+ he as ContextMenu,
239
+ pe as default
240
+ };
241
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/Menu/index.tsx"],"sourcesContent":["'use client';\n\nimport {\n cloneElement,\n isValidElement,\n type KeyboardEvent,\n memo,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport { named } from '../../helpers/component.helper';\nimport { captureFocus } from '../../helpers/focus.helper';\nimport usePortalSurface from '../../hooks/usePortalSurface';\nimport usePositioning from '../../hooks/usePositioning';\n\nimport styles from './index.module.scss';\nimport type { PositionAlign, PositionSide, PositioningRect } from '@/types/positioning.type';\n\nexport type MenuItem = {\n id: string;\n label: string;\n icon?: ReactNode;\n onSelect: () => void;\n isDisabled?: boolean;\n /** Geri alınamaz eylem: yıkıcı tonda çizilir. */\n isDanger?: boolean;\n};\n\ntype Props = {\n /** Tetikleyici. */\n trigger: ReactElement;\n items: MenuItem[];\n /** Menünün erişilebilir adı (\"Satır eylemleri\"). */\n label: string;\n side?: PositionSide;\n align?: PositionAlign;\n className?: string;\n testId?: string;\n};\n\n/** Pasif olmayan seçeneklerin dizinleri. */\nconst enabledIndexes = (items: MenuItem[]): number[] =>\n items.map((item, index) => (item.isDisabled ? -1 : index)).filter(index => index >= 0);\n\ntype SurfaceProps = {\n id: string;\n items: MenuItem[];\n label: string;\n /** Konumun ÖLÇÜLDÜĞÜ çapa: tetikleyici ya da imleç noktası. */\n anchorRef: { current: { getBoundingClientRect: () => PositioningRect } | null };\n /** Ağaçtaki sahip: portal hedefi (en yakın `<dialog>`) ve dışarı-tıklama istisnası. */\n ownerRef: { current: HTMLElement | null };\n side: PositionSide;\n align: PositionAlign;\n offset?: number;\n /** Açılışta odaklanan uç. */\n initial: 'first' | 'last';\n header?: ReactNode;\n className?: string;\n testId?: string;\n onClose: () => void;\n onContextMenu?: (event: MouseEvent) => void;\n};\n\n/**\n * MENÜ YÜZEYİ — `Menu` ve `ContextMenu`nün ortak gövdesi: konum, portal, odak, klavye ve\n * dışarı-tıklama TEK yerde. Yalnızca AÇIKKEN takılır; kapanış sökülmedir.\n */\nconst MenuSurface = ({\n id,\n items,\n label,\n anchorRef,\n ownerRef,\n side,\n align,\n offset,\n initial,\n header,\n className,\n testId,\n onClose,\n onContextMenu,\n}: SurfaceProps) => {\n const surfaceRef = useRef<HTMLDivElement>(null);\n /* Harfe atlama tamponu: art arda basilan harfler tek bir arama olur. */\n const typedRef = useRef({ text: '', at: 0 });\n const enabled = enabledIndexes(items);\n\n const [activeIndex, setActiveIndex] = useState(() =>\n initial === 'first' ? enabled[0] : enabled[enabled.length - 1],\n );\n\n const positioning = usePositioning(anchorRef, surfaceRef, { side, align, offset, isOpen: true });\n\n /*\n * Portal hedefi HER RENDER'DA degil, yalnizca acikken cozulur. `closest` ucuzdur ama\n * tetikleyicinin DOM konumu acilistan sonra degismedigi icin tekrar…\n */\n const portal = usePortalSurface(true, ownerRef, surfaceRef);\n\n /*\n * Etkin oge GERCEKTEN odaklanir (APG menu deseni).\n * ⚠ KONUM OLCULDUKTEN SONRA: yuzey o ana kadar `visibility: hidden` tasir ve gizli oge odak ALMAZ.\n * Olcum `useLayoutEffect`te durum yazar, ama ayrik olayda (tik, sag tik) React bu commit'in pasif\n * etkilerini yeniden cizimden ONCE bosaltiyor — odak gizli yuzeye gidip sessizce dusuyordu ve\n * odak `<body>`de kaliyordu (olculdu: chromium, 5.5.0 `Menu` dahil). jsdom gorunurlugu bilmedigi\n * icin birim testleri bunu goremiyordu; nobetci `anchored-panel.spec.ts` \"menü açılışında odak\".\n */\n const { isPositioned } = positioning;\n\n useEffect(() => {\n if (!isPositioned) return;\n surfaceRef.current\n ?.querySelector<HTMLElement>(`[data-index=\"${activeIndex}\"]`)\n ?.focus({ preventScroll: true });\n }, [activeIndex, isPositioned]);\n\n useEffect(() => {\n const handlePointerDown = (event: globalThis.MouseEvent) => {\n const target = event.target as Node;\n if (surfaceRef.current?.contains(target) || ownerRef.current?.contains(target)) return;\n onClose();\n };\n\n document.addEventListener('mousedown', handlePointerDown);\n return () => document.removeEventListener('mousedown', handlePointerDown);\n }, [ownerRef, onClose]);\n\n const step = (offsetBy: number) => {\n const position = enabled.indexOf(activeIndex);\n const next = (position + offsetBy + enabled.length) % enabled.length;\n setActiveIndex(enabled[next]);\n };\n\n /** Harfe atlama: 500 ms içinde basılan harfler tek bir arama. */\n const jumpToLetter = (key: string) => {\n const now = Date.now();\n const buffer = now - typedRef.current.at > 500 ? key : typedRef.current.text + key;\n typedRef.current = { text: buffer, at: now };\n\n const match = enabled.find(index =>\n items[index].label.toLocaleLowerCase('tr').startsWith(buffer.toLocaleLowerCase('tr')),\n );\n\n if (match !== undefined) setActiveIndex(match);\n };\n\n const handleMenuKeyDown = (event: KeyboardEvent) => {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n step(1);\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n step(-1);\n break;\n\n case 'Home':\n event.preventDefault();\n setActiveIndex(enabled[0]);\n break;\n\n case 'End':\n event.preventDefault();\n setActiveIndex(enabled[enabled.length - 1]);\n break;\n\n case 'Escape':\n /*\n * `preventDefault` SAYFAYA \"bu Escape islendi\" der: `window`da Escape dinleyen kod\n * (`event.defaultPrevented`) menuyu kapatan tusla kendi eylemini de calistirmaz.\n */\n event.preventDefault();\n onClose();\n break;\n\n case 'Tab':\n /*\n * Menu KAPANIR ama gezinme SURER: kullanici menuden cikip sayfaya devam ediyor.\n * `preventDefault` yok.\n */\n onClose();\n break;\n\n default:\n if (event.key.length === 1 && !event.metaKey && !event.ctrlKey) jumpToLetter(event.key);\n }\n };\n\n if (!portal.container) return null;\n\n const buttons = items.map((item, index) => (\n <button\n key={item.id}\n type=\"button\"\n role=\"menuitem\"\n data-index={index}\n /* DONEN `tabindex`: menu Tab sirasinda TEK durak. */\n tabIndex={index === activeIndex ? 0 : -1}\n disabled={item.isDisabled}\n className={cx(styles.menu__item, item.isDanger && styles['menu__item--danger'])}\n onClick={() => {\n item.onSelect();\n onClose();\n }}\n /*\n * ⚠ `onMouseEnter` KALDIRILDI. Eskiden fare bir ogenin uzerine\n * geldiginde `setActiveIndex` cagriliyordu; asagidaki etki de\n * `activeIndex` degisince `.focus()` cagirdigi icin sonuc\n * **farenin klavye odagini calmasi** oluyordu: kullanici ok\n * tuslariyla gezinirken imlecin durdugu yer ya da menunun\n * imlecin altinda kaymasi odagi geri firlatiyordu.\n *\n * Kaldirilan yorumun gerekcesi \"iki ayri vurgu kullaniciyi\n * sasirtiyordu\" idi; o sorun VURGULARI AYIRARAK cozuldu:\n * hover = arka plan, klavye odagi = halka (`index.module.scss`).\n * Ikisi artik farkli sey soyluyor, cakismiyor.\n */\n >\n {item.icon && (\n <span className={styles.menu__icon} aria-hidden>\n {item.icon}\n </span>\n )}\n {item.label}\n </button>\n ));\n\n const surface = {\n ref: surfaceRef,\n /* ⚠ Modalin ICINDEN acildiginda yuzey UST KATMANA cikmak ZORUNDA. */\n ...portal.attributes,\n className: cx(styles.menu, styles[`menu--${positioning.side}`], className),\n style: {\n ...positioning.style,\n ...portal.style,\n visibility: positioning.isPositioned ? ('visible' as const) : ('hidden' as const),\n },\n 'data-testid': testId,\n onContextMenu,\n };\n\n const headerId = `${id}-header`;\n\n return createPortal(\n /*\n * BASLIK `role=\"menu\"`nun DISINDA: menu yalniz `menuitem` tasir. Baslik menuye\n * `aria-describedby` ile baglanir — ok tuslari ogeler arasinda gezerken baglam okunur.\n */\n header ? (\n <div {...surface}>\n <div id={headerId} className={styles.menu__header}>\n {header}\n </div>\n <div\n id={id}\n role=\"menu\"\n aria-label={label}\n aria-describedby={headerId}\n className={styles.menu__list}\n onKeyDown={handleMenuKeyDown}\n >\n {buttons}\n </div>\n </div>\n ) : (\n <div {...surface} id={id} role=\"menu\" aria-label={label} onKeyDown={handleMenuKeyDown}>\n {buttons}\n </div>\n ),\n portal.container,\n );\n};\n\n/** Menü — bir listeden EYLEM seçme. */\nconst Menu = ({\n trigger,\n items,\n label,\n side = 'bottom',\n align = 'start',\n className,\n testId,\n}: Props) => {\n const id = useId();\n const anchorRef = useRef<HTMLElement>(null);\n const restoreRef = useRef<(() => void) | null>(null);\n\n /* Acilisin hangi uca odaklanacagi; `null` = kapali. */\n const [opening, setOpening] = useState<'first' | 'last' | null>(null);\n const isOpen = opening !== null;\n const enabled = enabledIndexes(items);\n\n const open = useCallback(\n (target: 'first' | 'last') => {\n if (enabled.length === 0) return;\n restoreRef.current = captureFocus();\n setOpening(target);\n },\n [enabled],\n );\n\n const close = useCallback(() => {\n setOpening(null);\n /*\n * Odak TETIKLEYICIYE doner: donmezse `<body>`ye duser ve klavye kullanicisi sayfanin en basina\n * giderdi.\n */\n restoreRef.current?.();\n restoreRef.current = null;\n }, []);\n\n /*\n * Geri yukleme YALNIZCA `close()` icindeydi, yani menu ACIKKEN sokuldugunde hic calismiyordu.\n * ⚠ SOKULME de bir kapanistir.\n */\n useEffect(\n () => () => {\n restoreRef.current?.();\n restoreRef.current = null;\n },\n [],\n );\n\n const handleTriggerKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n open('last');\n return;\n }\n\n if (['ArrowDown', 'Enter', ' '].includes(event.key)) {\n event.preventDefault();\n open('first');\n }\n };\n\n if (!isValidElement(trigger)) return null;\n\n const triggerProps = trigger.props as Record<string, unknown>;\n\n const anchor = cloneElement(trigger as ReactElement<Record<string, unknown>>, {\n ref: anchorRef,\n 'aria-haspopup': 'menu',\n 'aria-expanded': isOpen,\n 'aria-controls': isOpen ? id : undefined,\n onClick: (event: MouseEvent) => {\n (triggerProps.onClick as ((event: MouseEvent) => void) | undefined)?.(event);\n if (isOpen) close();\n else open('first');\n },\n onKeyDown: (event: KeyboardEvent) => {\n (triggerProps.onKeyDown as ((event: KeyboardEvent) => void) | undefined)?.(event);\n if (!isOpen) handleTriggerKeyDown(event);\n },\n });\n\n return (\n <>\n {anchor}\n\n {opening && (\n <MenuSurface\n id={id}\n items={items}\n label={label}\n anchorRef={anchorRef}\n ownerRef={anchorRef}\n side={side}\n align={align}\n initial={opening}\n className={className}\n testId={testId}\n onClose={close}\n />\n )}\n </>\n );\n};\n\nexport default /*#__PURE__*/ memo(/*#__PURE__*/ named(Menu, 'Menu')) as typeof Menu;\n\ntype ContextMenuProps = {\n /**\n * Açılış noktası — `contextmenu` olayının `clientX` / `clientY`si (görünüm alanı koordinatı).\n * `null` iken menü kapalı.\n */\n point: { x: number; y: number } | null;\n /** Escape, Tab, dışarı tıklama ya da seçilen eylemden sonra çağrılır; çağıran `point`i `null` yapar. */\n onClose: () => void;\n items: MenuItem[];\n /** Menünün erişilebilir adı (\"Seçim seçenekleri\"). */\n label: string;\n /** Eylemlerin ÜSTÜNDE okunan bağlam (seçimin özeti, ölçümler) — `role=\"menu\"`nün DIŞINDA. */\n header?: ReactNode;\n className?: string;\n testId?: string;\n};\n\n/* Nokta ile menu arasindaki bosluk: imlecin ucu ilk ogenin kenarini ortmesin. */\nconst POINT_OFFSET = 2;\n\n/* Menunun ICINDE sag tik tarayicinin menusunu acmaz. */\nconst preventNativeMenu = (event: MouseEvent) => event.preventDefault();\n\n/**\n * Bağlam menüsü — `Menu`nün imleç noktasında açılanı (sağ tık). Çağıran `contextmenu` olayında\n * `preventDefault()` çağırıp `point` yazar; menü noktanın sağ altına açılır, sığmazsa üste döner ve\n * görünüm alanına kırpılır. Odak açılışta ilk etkin öğeye gider, kapanışta önceki öğeye döner.\n */\nconst ContextMenuBase = ({\n point,\n onClose,\n items,\n label,\n header,\n className,\n testId,\n}: ContextMenuProps) => {\n const id = useId();\n /*\n * Agactaki SAHIP: noktanin DOM ogesi yok, ama portal hedefi (en yakin acik `<dialog>`) agactaki\n * konumdan cozulur — modalin icindeki menu govdeye portallanirsa ust katmanin ALTINDA kalirdi.\n */\n const ownerRef = useRef<HTMLSpanElement>(null);\n const isOpen = point !== null && enabledIndexes(items).length > 0;\n\n const x = point?.x ?? 0;\n const y = point?.y ?? 0;\n const anchorRef = useMemo(\n () => ({\n current: { getBoundingClientRect: () => ({ top: y, left: x, width: 0, height: 0 }) },\n }),\n [x, y],\n );\n\n /*\n * Odak YAKALAMA yuzeyin odagi tasimasindan ONCE olmali: yuzeyin `useEffect`i (ilk ogeye odak)\n * cocukta, bu `useLayoutEffect` ise tum pasif etkilerden once kosar. Temizlik = geri yukleme\n * (kapanis da sokulme de).\n */\n useLayoutEffect(() => {\n if (!isOpen) return;\n return captureFocus();\n }, [isOpen]);\n\n return (\n <>\n <span ref={ownerRef} hidden />\n\n {isOpen && (\n <MenuSurface\n /* Yeni nokta = yeni acilis: konum yeniden olculur, odak ilk ogeye doner. */\n key={`${x}:${y}`}\n id={id}\n items={items}\n label={label}\n anchorRef={anchorRef}\n ownerRef={ownerRef}\n side=\"bottom\"\n align=\"start\"\n offset={POINT_OFFSET}\n initial=\"first\"\n header={header}\n className={className}\n testId={testId}\n onClose={onClose}\n onContextMenu={preventNativeMenu}\n />\n )}\n </>\n );\n};\n\nexport const ContextMenu = /*#__PURE__*/ named(/*#__PURE__*/ memo(ContextMenuBase), 'ContextMenu');\n"],"names":["enabledIndexes","items","item","index","MenuSurface","id","label","anchorRef","ownerRef","side","align","offset","initial","header","className","testId","onClose","onContextMenu","surfaceRef","useRef","typedRef","enabled","activeIndex","setActiveIndex","useState","positioning","usePositioning","portal","usePortalSurface","isPositioned","useEffect","_b","_a","handlePointerDown","event","target","step","offsetBy","next","jumpToLetter","key","now","buffer","match","handleMenuKeyDown","buttons","jsxs","cx","styles","surface","headerId","createPortal","jsx","Menu","trigger","useId","restoreRef","opening","setOpening","isOpen","open","useCallback","captureFocus","close","handleTriggerKeyDown","isValidElement","triggerProps","anchor","cloneElement","Fragment","memo","named","POINT_OFFSET","preventNativeMenu","ContextMenuBase","point","x","y","useMemo","useLayoutEffect","ContextMenu"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ @layer ui{.ui-menu-1x-FU{display:flex;flex-direction:column;gap:2px;z-index:200;min-width:180px;max-width:min(320px,100vw - var(--ui-space-6));max-height:min(60dvh,420px);overflow-y:auto;padding:var(--ui-space-1);border-radius:var(--ui-radius-md);background-color:var(--ui-surface);border:1px solid var(--ui-border);box-shadow:var(--ui-shadow-lg);scrollbar-width:thin;scrollbar-color:var(--ui-border-strong) transparent}.ui-menu-1x-FU::-webkit-scrollbar{width:8px;height:8px}.ui-menu-1x-FU::-webkit-scrollbar-track{background:transparent}.ui-menu-1x-FU::-webkit-scrollbar-thumb{background-color:var(--ui-border-strong);border-radius:var(--ui-radius-pill);border:2px solid transparent;background-clip:content-box}.ui-menu-1x-FU::-webkit-scrollbar-thumb:hover{background-color:var(--ui-text-3)}.ui-menu--top-gpo39{animation:var(--ui-anim-fade-in-up) var(--ui-duration-fast) var(--ui-ease-out)}.ui-menu--bottom-6sL7b{animation:var(--ui-anim-fade-in-down) var(--ui-duration-fast) var(--ui-ease-out)}.ui-menu--left-4w-O8,.ui-menu--right-XmM8G{animation:var(--ui-anim-fade-in) var(--ui-duration-fast) var(--ui-ease-out)}@media (prefers-reduced-motion: reduce){.ui-menu-1x-FU{animation:none}}@media (forced-colors: active){.ui-menu-1x-FU{border-color:CanvasText}}.ui-menu__header--yAhp{padding:var(--ui-space-2) var(--ui-space-3);margin-bottom:var(--ui-space-1);border-bottom:1px solid var(--ui-border);font-family:var(--ui-font-body);font-size:var(--ui-font-size-sm);color:var(--ui-text-2)}.ui-menu__list-9nZDG{display:flex;flex-direction:column;gap:2px}.ui-menu__item-d1iil{display:flex;align-items:center;gap:var(--ui-space-2);width:100%;min-height:40px;padding:var(--ui-space-2) var(--ui-space-3);border:none;border-radius:var(--ui-radius-sm);background:none;cursor:pointer;text-align:start;font-family:var(--ui-font-body);font-size:var(--ui-font-size-sm);color:var(--ui-text);background-color:transparent;transition:background-color var(--ui-duration-fast) var(--ui-ease-out),translate var(--ui-duration-instant) var(--ui-ease-out)}.ui-menu__item-d1iil:hover:not(:disabled):not([aria-disabled=true]){background-color:var(--ui-surface-2)}.ui-menu__item-d1iil:active:not(:disabled):not([aria-disabled=true]){background-color:var(--ui-surface-3);translate:0 1px}@media (prefers-reduced-motion: reduce){.ui-menu__item-d1iil{transition:none}.ui-menu__item-d1iil:active:not(:disabled):not([aria-disabled=true]){translate:none}}.ui-menu__item-d1iil:focus{outline:none}.ui-menu__item-d1iil:focus-visible{outline:var(--ui-ring-width, 2px) solid var(--ui-ring-color);outline-offset:var(--ui-ring-offset, -2px)}.ui-menu__item-d1iil:focus-visible{background-color:var(--ui-surface-2)}.ui-menu__item-d1iil:disabled{color:var(--ui-text-3);cursor:not-allowed}.ui-menu__item--danger-lIINY{color:var(--ui-bad-fg)}.ui-menu__item--danger-lIINY:hover:not(:disabled),.ui-menu__item--danger-lIINY:focus-visible{background-color:var(--ui-bad-bg)}@media (prefers-reduced-motion: reduce){.ui-menu__item-d1iil{transition:none}}@media (forced-colors: active){.ui-menu__item-d1iil:focus-visible{outline:var(--ui-ring-width, 2px) solid Highlight;outline-offset:var(--ui-ring-offset, -2px)}}.ui-menu__icon-kzLV2{display:inline-flex;flex-shrink:0;font-size:var(--ui-icon-sm);color:var(--ui-text-2)}}
@@ -0,0 +1,2 @@
1
+ "use client";"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const a=require("react/jsx-runtime"),l=require("react"),I=require("react-bootstrap-icons"),v=require("../../helpers/class-name.helper.cjs"),o=require("../../helpers/focus.helper.cjs"),R=require("../../helpers/label.helper.cjs"),E=require("../../hooks/useScrollLock.cjs"),$=require("../../theme/context.cjs"),F=require("../IconButton/index.cjs"),t={default:{"modal":"ui-modal-3IDi9","modal--sm":"ui-modal--sm-A7WsS","modal--lg":"ui-modal--lg-z99Em","modal--xl":"ui-modal--xl-g3d6F","modal__panel":"ui-modal__panel--qLSz","modal__header":"ui-modal__header-meWm6","modal__icon":"ui-modal__icon-df2dd","modal__icon--neutral":"ui-modal__icon--neutral-QSL7c","modal__icon--danger":"ui-modal__icon--danger-6V90a","modal__icon--warning":"ui-modal__icon--warning-a--FX","modal__icon--success":"ui-modal__icon--success-YWxZs","modal__icon--info":"ui-modal__icon--info-WRLah","modal__heading":"ui-modal__heading-PwDS8","modal__title":"ui-modal__title-80Sh6","modal__description":"ui-modal__description-fsCHI","modal__close":"ui-modal__close-vFPbw","modal__body":"ui-modal__body-PDF12","modal__footer":"ui-modal__footer-CCCkx"}},S=({isOpen:u,onClose:r,title:g,closeLabel:N,children:_,description:i,footer:h,icon:x,tone:q="neutral",size:M="md",isDismissable:c=!0,className:b,testId:k})=>{const{labels:f}=$.useUi(),d=l.useRef(null),n=l.useRef(null),p=l.useId(),j=l.useId();l.useEffect(()=>{const e=d.current;if(!e)return;if(!u){e.open&&e.close();return}const s=o.captureFocus();e.open||e.showModal(),o.focusFirstMeaningful(e,`.${t.default.modal__close}`),o.preventAutoKeyboard(e);const{token:m,pop:y}=o.pushModal();return n.current=m,()=>{y(),n.current=null,s()}},[u]),E.default(u),l.useEffect(()=>{const e=d.current;if(!e)return;const s=m=>{m.preventDefault(),c&&(n.current&&!o.isTopModal(n.current)||r())};return e.addEventListener("cancel",s),()=>e.removeEventListener("cancel",s)},[r,c]);const L=l.useCallback(e=>{c&&e.target===d.current&&r()},[c,r]);return a.jsx("dialog",{ref:d,className:v.cx(t.default.modal,t.default[`modal--${M}`],b),"aria-labelledby":p,"aria-describedby":i?j:void 0,"data-testid":k,onClick:L,children:a.jsxs("div",{className:t.default.modal__panel,children:[a.jsxs("header",{className:t.default.modal__header,children:[x&&a.jsx("span",{className:v.cx(t.default.modal__icon,t.default[`modal__icon--${q}`]),children:x}),a.jsxs("div",{className:t.default.modal__heading,children:[a.jsx("h2",{id:p,className:t.default.modal__title,children:g}),i&&a.jsx("p",{id:j,className:t.default.modal__description,children:i})]}),c&&a.jsx(F.default,{icon:a.jsx(I.XLg,{"aria-hidden":!0}),label:R.resolveLabel("Modal.closeLabel",N,f==null?void 0:f.close),variant:"ghost",size:"sm",className:t.default.modal__close,onClick:r})]}),_&&a.jsx("div",{className:t.default.modal__body,children:_}),h&&a.jsx("footer",{className:t.default.modal__footer,children:h})]})})},B=l.memo(S);exports.default=B;
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../../../src/components/Modal/index.tsx"],"sourcesContent":["'use client';\n\nimport {\n memo,\n type MouseEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useRef,\n} from 'react';\n\nimport { XLg } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport {\n captureFocus,\n focusFirstMeaningful,\n isTopModal,\n preventAutoKeyboard,\n pushModal,\n} from '../../helpers/focus.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport useScrollLock from '../../hooks/useScrollLock';\nimport { useUi } from '../../theme/context';\nimport IconButton from '../IconButton';\n\nimport styles from './index.module.scss';\n\nexport type ModalTone = 'neutral' | 'danger' | 'warning' | 'success' | 'info';\n\ntype Props = {\n isOpen: boolean;\n onClose: () => void;\n title: string;\n /** Kapatma düğmesinin erişilebilir adı. */\n closeLabel?: string;\n children?: ReactNode;\n /** Başlığın altındaki bir cümlelik açıklama. */\n description?: ReactNode;\n /** Altta duran eylemler. */\n footer?: ReactNode;\n /** Başlığın solunda duran ikon madalyonu; `tone` rengini alır. */\n icon?: ReactNode;\n /** İkon madalyonunun tonu. */\n tone?: ModalTone;\n /** `xl` (≈1040 px) sekmeli, tablolu panolar için; dar ekranda diğerleri gibi tam genişlik. */\n size?: 'sm' | 'md' | 'lg' | 'xl';\n /** `false` iken arka plana tıklama, Escape ve kapatma düğmesi kapatmaz. */\n isDismissable?: boolean;\n className?: string;\n testId?: string;\n};\n\n/** Kip pencere (modal). */\nconst Modal = ({\n isOpen,\n onClose,\n title,\n closeLabel,\n children,\n description,\n footer,\n icon,\n tone = 'neutral',\n size = 'md',\n isDismissable = true,\n className,\n testId,\n}: Props) => {\n const { labels } = useUi();\n const dialogRef = useRef<HTMLDialogElement>(null);\n /* Yigindaki yerimiz: */\n const tokenRef = useRef<symbol | null>(null);\n const titleId = useId();\n const descriptionId = useId();\n\n /* ACILIS: `showModal()` + odak + yigina katilma. */\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n if (!isOpen) {\n if (dialog.open) dialog.close();\n return;\n }\n\n const restoreFocus = captureFocus();\n if (!dialog.open) dialog.showModal();\n\n /*\n * Odak KAPATMA DUGMESINE degil ilk anlamli ogeye. `showModal()` DOM sirasindaki ilk\n * odaklanabilir ogeye gidiyor ve o neredeyse her zaman basliktaki…\n */\n focusFirstMeaningful(dialog, `.${styles.modal__close}`);\n /*\n * Odak bir metin alanina dustuyse geri alinir: telefonda ekran klavyesi kullanici istemeden\n * aciliyordu (bkz. `helpers/focus.helper`).\n */\n preventAutoKeyboard(dialog);\n\n const { token, pop } = pushModal();\n tokenRef.current = token;\n\n return () => {\n pop();\n tokenRef.current = null;\n restoreFocus();\n };\n }, [isOpen]);\n\n /*\n * Arka plan kaydirmasi kilitlenir. `showModal()` arka plani etkilesime kapatir ama kaydirmayi her\n * tarayicida engellemiyor: kullanici pencereyi…\n */\n useScrollLock(isOpen);\n\n /*\n * Escape'i tarayici isliyor ama React durumu bundan haberdar olmuyor; `cancel` olayi yakalanmazsa\n * pencere kapanip `isOpen` true kaliyor ve bir daha…\n */\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n const handleCancel = (event: Event) => {\n /*\n * Varsayilan HER ZAMAN engellenir: kapanis karari React'te veriliyor ve tarayicinin pencereyi\n * kendi basina kapatmasi durumu `isOpen: true` birakiyordu.\n */\n event.preventDefault();\n if (!isDismissable) return;\n\n /* Yalnizca EN USTTEKI panel kapanir. */\n if (tokenRef.current && !isTopModal(tokenRef.current)) return;\n\n onClose();\n };\n\n dialog.addEventListener('cancel', handleCancel);\n return () => dialog.removeEventListener('cancel', handleCancel);\n }, [onClose, isDismissable]);\n\n const handleBackdropClick = useCallback(\n (event: MouseEvent<HTMLDialogElement>) => {\n if (!isDismissable) return;\n // Hedef dialog'un KENDISI ise arka plana tiklanmistir; panel degil.\n if (event.target === dialogRef.current) onClose();\n },\n [isDismissable, onClose],\n );\n\n return (\n <dialog\n ref={dialogRef}\n className={cx(styles.modal, styles[`modal--${size}`], className)}\n aria-labelledby={titleId}\n aria-describedby={description ? descriptionId : undefined}\n data-testid={testId}\n onClick={handleBackdropClick}\n >\n <div className={styles.modal__panel}>\n <header className={styles.modal__header}>\n {icon && (\n <span className={cx(styles.modal__icon, styles[`modal__icon--${tone}`])}>{icon}</span>\n )}\n\n <div className={styles.modal__heading}>\n <h2 id={titleId} className={styles.modal__title}>\n {title}\n </h2>\n {description && (\n <p id={descriptionId} className={styles.modal__description}>\n {description}\n </p>\n )}\n </div>\n\n {isDismissable && (\n <IconButton\n icon={<XLg aria-hidden />}\n label={resolveLabel('Modal.closeLabel', closeLabel, labels?.close)}\n variant=\"ghost\"\n size=\"sm\"\n className={styles.modal__close}\n onClick={onClose}\n />\n )}\n </header>\n\n {/*\n Gövde yalnızca içerik VARSA çizilir: onay pencerelerinin çoğunda soru\n başlıkta ve açıklamada duruyor, gövde boş kalıyor ve boş bir kutu\n 40 px'lik bir boşluk bırakıyordu.\n */}\n {children && <div className={styles.modal__body}>{children}</div>}\n\n {footer && <footer className={styles.modal__footer}>{footer}</footer>}\n </div>\n </dialog>\n );\n};\n\nexport default /*#__PURE__*/ memo(Modal) as typeof Modal;\n"],"names":["Modal","isOpen","onClose","title","closeLabel","children","description","footer","icon","tone","size","isDismissable","className","testId","labels","useUi","dialogRef","useRef","tokenRef","titleId","useId","descriptionId","useEffect","dialog","restoreFocus","captureFocus","focusFirstMeaningful","styles","preventAutoKeyboard","token","pop","pushModal","useScrollLock","handleCancel","event","isTopModal","handleBackdropClick","useCallback","jsx","cx","jsxs","IconButton","XLg","resolveLabel"],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { ReactNode } from 'react';
2
+ export type ModalTone = 'neutral' | 'danger' | 'warning' | 'success' | 'info';
3
+ type Props = {
4
+ isOpen: boolean;
5
+ onClose: () => void;
6
+ title: string;
7
+ /** Kapatma düğmesinin erişilebilir adı. */
8
+ closeLabel?: string;
9
+ children?: ReactNode;
10
+ /** Başlığın altındaki bir cümlelik açıklama. */
11
+ description?: ReactNode;
12
+ /** Altta duran eylemler. */
13
+ footer?: ReactNode;
14
+ /** Başlığın solunda duran ikon madalyonu; `tone` rengini alır. */
15
+ icon?: ReactNode;
16
+ /** İkon madalyonunun tonu. */
17
+ tone?: ModalTone;
18
+ /** `xl` (≈1040 px) sekmeli, tablolu panolar için; dar ekranda diğerleri gibi tam genişlik. */
19
+ size?: 'sm' | 'md' | 'lg' | 'xl';
20
+ /** `false` iken arka plana tıklama, Escape ve kapatma düğmesi kapatmaz. */
21
+ isDismissable?: boolean;
22
+ className?: string;
23
+ testId?: string;
24
+ };
25
+ /** Kip pencere (modal). */
26
+ declare const Modal: ({ isOpen, onClose, title, closeLabel, children, description, footer, icon, tone, size, isDismissable, className, testId, }: Props) => import("react").JSX.Element;
27
+ declare const _default: typeof Modal;
28
+ export default _default;
@@ -0,0 +1,92 @@
1
+ "use client";
2
+ import { jsx as o, jsxs as u } from "react/jsx-runtime";
3
+ import { memo as R, useRef as N, useId as g, useEffect as k, useCallback as j } from "react";
4
+ import { XLg as B } from "react-bootstrap-icons";
5
+ import { cx as M } from "../../helpers/class-name.helper.js";
6
+ import { focusFirstMeaningful as w, preventAutoKeyboard as z, pushModal as A, captureFocus as C, isTopModal as K } from "../../helpers/focus.helper.js";
7
+ import { resolveLabel as S } from "../../helpers/label.helper.js";
8
+ import T from "../../hooks/useScrollLock.js";
9
+ import { useUi as U } from "../../theme/context.js";
10
+ import X from "../IconButton/index.js";
11
+ const r = {"modal":"ui-modal-3IDi9","modal--sm":"ui-modal--sm-A7WsS","modal--lg":"ui-modal--lg-z99Em","modal--xl":"ui-modal--xl-g3d6F","modal__panel":"ui-modal__panel--qLSz","modal__header":"ui-modal__header-meWm6","modal__icon":"ui-modal__icon-df2dd","modal__icon--neutral":"ui-modal__icon--neutral-QSL7c","modal__icon--danger":"ui-modal__icon--danger-6V90a","modal__icon--warning":"ui-modal__icon--warning-a--FX","modal__icon--success":"ui-modal__icon--success-YWxZs","modal__icon--info":"ui-modal__icon--info-WRLah","modal__heading":"ui-modal__heading-PwDS8","modal__title":"ui-modal__title-80Sh6","modal__description":"ui-modal__description-fsCHI","modal__close":"ui-modal__close-vFPbw","modal__body":"ui-modal__body-PDF12","modal__footer":"ui-modal__footer-CCCkx"};
12
+ const q = ({
13
+ isOpen: d,
14
+ onClose: a,
15
+ title: L,
16
+ closeLabel: b,
17
+ children: f,
18
+ description: i,
19
+ footer: p,
20
+ icon: _,
21
+ tone: y = "neutral",
22
+ size: x = "md",
23
+ isDismissable: t = !0,
24
+ className: I,
25
+ testId: $
26
+ }) => {
27
+ const { labels: s } = U(), l = N(null), c = N(null), h = g(), v = g();
28
+ k(() => {
29
+ const e = l.current;
30
+ if (!e) return;
31
+ if (!d) {
32
+ e.open && e.close();
33
+ return;
34
+ }
35
+ const n = C();
36
+ e.open || e.showModal(), w(e, `.${r.modal__close}`), z(e);
37
+ const { token: m, pop: F } = A();
38
+ return c.current = m, () => {
39
+ F(), c.current = null, n();
40
+ };
41
+ }, [d]), T(d), k(() => {
42
+ const e = l.current;
43
+ if (!e) return;
44
+ const n = (m) => {
45
+ m.preventDefault(), t && (c.current && !K(c.current) || a());
46
+ };
47
+ return e.addEventListener("cancel", n), () => e.removeEventListener("cancel", n);
48
+ }, [a, t]);
49
+ const E = j(
50
+ (e) => {
51
+ t && e.target === l.current && a();
52
+ },
53
+ [t, a]
54
+ );
55
+ return /* @__PURE__ */ o(
56
+ "dialog",
57
+ {
58
+ ref: l,
59
+ className: M(r.modal, r[`modal--${x}`], I),
60
+ "aria-labelledby": h,
61
+ "aria-describedby": i ? v : void 0,
62
+ "data-testid": $,
63
+ onClick: E,
64
+ children: /* @__PURE__ */ u("div", { className: r.modal__panel, children: [
65
+ /* @__PURE__ */ u("header", { className: r.modal__header, children: [
66
+ _ && /* @__PURE__ */ o("span", { className: M(r.modal__icon, r[`modal__icon--${y}`]), children: _ }),
67
+ /* @__PURE__ */ u("div", { className: r.modal__heading, children: [
68
+ /* @__PURE__ */ o("h2", { id: h, className: r.modal__title, children: L }),
69
+ i && /* @__PURE__ */ o("p", { id: v, className: r.modal__description, children: i })
70
+ ] }),
71
+ t && /* @__PURE__ */ o(
72
+ X,
73
+ {
74
+ icon: /* @__PURE__ */ o(B, { "aria-hidden": !0 }),
75
+ label: S("Modal.closeLabel", b, s == null ? void 0 : s.close),
76
+ variant: "ghost",
77
+ size: "sm",
78
+ className: r.modal__close,
79
+ onClick: a
80
+ }
81
+ )
82
+ ] }),
83
+ f && /* @__PURE__ */ o("div", { className: r.modal__body, children: f }),
84
+ p && /* @__PURE__ */ o("footer", { className: r.modal__footer, children: p })
85
+ ] })
86
+ }
87
+ );
88
+ }, D = /* @__PURE__ */ R(q);
89
+ export {
90
+ D as default
91
+ };
92
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/Modal/index.tsx"],"sourcesContent":["'use client';\n\nimport {\n memo,\n type MouseEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useRef,\n} from 'react';\n\nimport { XLg } from 'react-bootstrap-icons';\n\nimport { cx } from '../../helpers/class-name.helper';\nimport {\n captureFocus,\n focusFirstMeaningful,\n isTopModal,\n preventAutoKeyboard,\n pushModal,\n} from '../../helpers/focus.helper';\nimport { resolveLabel } from '../../helpers/label.helper';\nimport useScrollLock from '../../hooks/useScrollLock';\nimport { useUi } from '../../theme/context';\nimport IconButton from '../IconButton';\n\nimport styles from './index.module.scss';\n\nexport type ModalTone = 'neutral' | 'danger' | 'warning' | 'success' | 'info';\n\ntype Props = {\n isOpen: boolean;\n onClose: () => void;\n title: string;\n /** Kapatma düğmesinin erişilebilir adı. */\n closeLabel?: string;\n children?: ReactNode;\n /** Başlığın altındaki bir cümlelik açıklama. */\n description?: ReactNode;\n /** Altta duran eylemler. */\n footer?: ReactNode;\n /** Başlığın solunda duran ikon madalyonu; `tone` rengini alır. */\n icon?: ReactNode;\n /** İkon madalyonunun tonu. */\n tone?: ModalTone;\n /** `xl` (≈1040 px) sekmeli, tablolu panolar için; dar ekranda diğerleri gibi tam genişlik. */\n size?: 'sm' | 'md' | 'lg' | 'xl';\n /** `false` iken arka plana tıklama, Escape ve kapatma düğmesi kapatmaz. */\n isDismissable?: boolean;\n className?: string;\n testId?: string;\n};\n\n/** Kip pencere (modal). */\nconst Modal = ({\n isOpen,\n onClose,\n title,\n closeLabel,\n children,\n description,\n footer,\n icon,\n tone = 'neutral',\n size = 'md',\n isDismissable = true,\n className,\n testId,\n}: Props) => {\n const { labels } = useUi();\n const dialogRef = useRef<HTMLDialogElement>(null);\n /* Yigindaki yerimiz: */\n const tokenRef = useRef<symbol | null>(null);\n const titleId = useId();\n const descriptionId = useId();\n\n /* ACILIS: `showModal()` + odak + yigina katilma. */\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n if (!isOpen) {\n if (dialog.open) dialog.close();\n return;\n }\n\n const restoreFocus = captureFocus();\n if (!dialog.open) dialog.showModal();\n\n /*\n * Odak KAPATMA DUGMESINE degil ilk anlamli ogeye. `showModal()` DOM sirasindaki ilk\n * odaklanabilir ogeye gidiyor ve o neredeyse her zaman basliktaki…\n */\n focusFirstMeaningful(dialog, `.${styles.modal__close}`);\n /*\n * Odak bir metin alanina dustuyse geri alinir: telefonda ekran klavyesi kullanici istemeden\n * aciliyordu (bkz. `helpers/focus.helper`).\n */\n preventAutoKeyboard(dialog);\n\n const { token, pop } = pushModal();\n tokenRef.current = token;\n\n return () => {\n pop();\n tokenRef.current = null;\n restoreFocus();\n };\n }, [isOpen]);\n\n /*\n * Arka plan kaydirmasi kilitlenir. `showModal()` arka plani etkilesime kapatir ama kaydirmayi her\n * tarayicida engellemiyor: kullanici pencereyi…\n */\n useScrollLock(isOpen);\n\n /*\n * Escape'i tarayici isliyor ama React durumu bundan haberdar olmuyor; `cancel` olayi yakalanmazsa\n * pencere kapanip `isOpen` true kaliyor ve bir daha…\n */\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n const handleCancel = (event: Event) => {\n /*\n * Varsayilan HER ZAMAN engellenir: kapanis karari React'te veriliyor ve tarayicinin pencereyi\n * kendi basina kapatmasi durumu `isOpen: true` birakiyordu.\n */\n event.preventDefault();\n if (!isDismissable) return;\n\n /* Yalnizca EN USTTEKI panel kapanir. */\n if (tokenRef.current && !isTopModal(tokenRef.current)) return;\n\n onClose();\n };\n\n dialog.addEventListener('cancel', handleCancel);\n return () => dialog.removeEventListener('cancel', handleCancel);\n }, [onClose, isDismissable]);\n\n const handleBackdropClick = useCallback(\n (event: MouseEvent<HTMLDialogElement>) => {\n if (!isDismissable) return;\n // Hedef dialog'un KENDISI ise arka plana tiklanmistir; panel degil.\n if (event.target === dialogRef.current) onClose();\n },\n [isDismissable, onClose],\n );\n\n return (\n <dialog\n ref={dialogRef}\n className={cx(styles.modal, styles[`modal--${size}`], className)}\n aria-labelledby={titleId}\n aria-describedby={description ? descriptionId : undefined}\n data-testid={testId}\n onClick={handleBackdropClick}\n >\n <div className={styles.modal__panel}>\n <header className={styles.modal__header}>\n {icon && (\n <span className={cx(styles.modal__icon, styles[`modal__icon--${tone}`])}>{icon}</span>\n )}\n\n <div className={styles.modal__heading}>\n <h2 id={titleId} className={styles.modal__title}>\n {title}\n </h2>\n {description && (\n <p id={descriptionId} className={styles.modal__description}>\n {description}\n </p>\n )}\n </div>\n\n {isDismissable && (\n <IconButton\n icon={<XLg aria-hidden />}\n label={resolveLabel('Modal.closeLabel', closeLabel, labels?.close)}\n variant=\"ghost\"\n size=\"sm\"\n className={styles.modal__close}\n onClick={onClose}\n />\n )}\n </header>\n\n {/*\n Gövde yalnızca içerik VARSA çizilir: onay pencerelerinin çoğunda soru\n başlıkta ve açıklamada duruyor, gövde boş kalıyor ve boş bir kutu\n 40 px'lik bir boşluk bırakıyordu.\n */}\n {children && <div className={styles.modal__body}>{children}</div>}\n\n {footer && <footer className={styles.modal__footer}>{footer}</footer>}\n </div>\n </dialog>\n );\n};\n\nexport default /*#__PURE__*/ memo(Modal) as typeof Modal;\n"],"names":["Modal","isOpen","onClose","title","closeLabel","children","description","footer","icon","tone","size","isDismissable","className","testId","labels","useUi","dialogRef","useRef","tokenRef","titleId","useId","descriptionId","useEffect","dialog","restoreFocus","captureFocus","focusFirstMeaningful","styles","preventAutoKeyboard","token","pop","pushModal","useScrollLock","handleCancel","event","isTopModal","handleBackdropClick","useCallback","jsx","cx","jsxs","IconButton","XLg","resolveLabel","Modal$1"],"mappings":"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"}