@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 @@
1
+ {"version":3,"file":"theme.helper.js","sources":["../../src/helpers/theme.helper.ts"],"sourcesContent":["import { isClient } from '@handijit/utils';\n\nimport { DARK_THEME, DEFAULT_FONTS, LIGHT_THEME } from '../theme/tokens';\nimport type { UiColorScheme, UiResolvedTokens, UiThemeConfig } from '@/types/theme.type';\n\n/** CSS özel özelliği öneki — `_tokens.generated.scss` ile aynı olmak zorunda. */\nexport const TOKEN_PREFIX = '--ui-';\n\n/** Ezme kurallarını taşıyan `<style>` etiketinin kimliği. */\nexport const THEME_STYLE_ID = 'ui-theme-overrides';\n\n/** Temanın taşındığı öznitelik. `<html data-ui-theme=\"dark\">`. */\nexport const THEME_ATTRIBUTE = 'data-ui-theme';\n\n/** Bilgi yoğunluğunun taşındığı öznitelik. `<html data-ui-density=\"compact\">`. */\nexport const DENSITY_ATTRIBUTE = 'data-ui-density';\n\n/** Geçiş animasyonlarını tek kare boyunca kapatan sınıf (bkz. `base.scss`). */\nexport const THEME_SWITCHING_CLASS = 'ui-theme-switching';\n\n/** Ezmelerin katmanı — `scripts/lib/postcss-ui-layer.mjs`in varsayılanıyla aynı olmak zorunda. */\nexport const THEME_LAYER = 'ui';\n\n/**\n * Ezme kurallarının kök seçicisi: `_tokens.generated.scss`teki karşılığından bir öğe (`html`) daha\n * özgül — (0,1,1) > (0,1,0), (0,2,1) > (0,2,0). Katman içinde ezme varsayılanı KAYNAK SIRASINDAN\n * bağımsız yener. Açık temanın `html:root`u (0,1,1) koyu varsayılanın `:root:not([…])`ına\n * (0,2,0) yenilir: açık ezme koyu temaya sızmaz.\n */\nconst THEME_ROOT = 'html:root';\n\n/** Verilen şemanın tam token eşlemesi — ezmeler uygulanmış hâliyle. */\nexport const resolveTokens = (scheme: UiColorScheme, config?: UiThemeConfig): UiResolvedTokens => {\n const base = scheme === 'dark' ? DARK_THEME : LIGHT_THEME;\n const overrides = (scheme === 'dark' ? config?.dark : config?.light) ?? {};\n\n return { ...base, ...overrides };\n};\n\n/**\n * Yapılandırmayı CSS metnine çevirir. Çıktının tamamı `@layer ui` içinde: tüketicinin katmansız\n * her kuralı ezmeyi özgüllükten ve sıradan bağımsız yener (README, \"CSS'imizi ezmek\").\n * ⚠ 5.6.2'ye kadar ezme katmansızdı: `:root:not([data-ui-theme])` (0,2,0) tüketicinin `<html>`e\n * yazdığı ezmeyi (`html:has(.panel)`, 0,1,1) hidrasyondan SONRA eziyordu — sunucu çiziminde\n * tüketicinin rengi, bir kare sonra temanınki (ölçüldü: panelin kırmızı sil düğmesi koyu temada\n * beyaza dönüyordu). Katmansız açık ezme koyu varsayılanı da yeniyor, koyu temaya sızıyordu.\n */\nexport const buildThemeCss = (config: UiThemeConfig): string => {\n const blocks: string[] = [];\n\n const declarations = (tokens: Record<string, string>, indent = ' ') =>\n Object.entries(tokens)\n .map(([name, value]) => `${indent}${TOKEN_PREFIX}${name}: ${value};`)\n .join('\\n');\n\n const fonts = config.fonts ?? {};\n const fontEntries = Object.entries(fonts).filter(([, value]) => Boolean(value)) as [\n keyof typeof DEFAULT_FONTS,\n string,\n ][];\n\n if (fontEntries.length > 0)\n blocks.push(\n `${THEME_ROOT} {\\n${fontEntries\n .map(([role, stack]) => ` ${TOKEN_PREFIX}font-${role}: ${stack};`)\n .join('\\n')}\\n}`,\n );\n\n /* OLCU EZMELERI TEMA BASINA DEGIL, TEK BLOKTA. */\n const metrics = config.metrics ?? {};\n\n if (Object.keys(metrics).length > 0) {\n const body = declarations(metrics as Record<string, string>);\n blocks.push(`${THEME_ROOT} {\\n${body}\\n}`);\n blocks.push(`${THEME_ROOT}[${DENSITY_ATTRIBUTE}='compact'] {\\n${body}\\n}`);\n }\n\n /*\n * Acik tema iki secicide birden yazilir: `html:root` (varsayilan) ve\n * `html:root[data-ui-theme='light']` (kullanicinin acik secimi).\n */\n if (config.light && Object.keys(config.light).length > 0) {\n const body = declarations(config.light);\n blocks.push(`${THEME_ROOT} {\\n${body}\\n}`);\n blocks.push(`${THEME_ROOT}[${THEME_ATTRIBUTE}='light'] {\\n${body}\\n}`);\n }\n\n if (config.dark && Object.keys(config.dark).length > 0) {\n const body = declarations(config.dark);\n blocks.push(`${THEME_ROOT}[${THEME_ATTRIBUTE}='dark'] {\\n${body}\\n}`);\n blocks.push(\n `@media (prefers-color-scheme: dark) {\\n ${THEME_ROOT}:not([${THEME_ATTRIBUTE}]) {\\n${declarations(\n config.dark,\n ' ',\n )}\\n }\\n}`,\n );\n }\n\n if (blocks.length === 0) return '';\n\n return `@layer ${THEME_LAYER} {\\n${blocks.join('\\n\\n').replace(/^(?=.)/gm, ' ')}\\n}`;\n};\n\n/**\n * `<style>` içine HTML olarak yazılacak CSS: `</style` dizisi etiketi kapatamaz. Değerler\n * yapılandırmadan (kiracının veritabanındaki marka rengi) gelebilir; `\\/` CSS'te `/` demek.\n */\nexport const toStyleHtml = (css: string): string => css.replace(/<\\/style/gi, '<\\\\/style');\n\n/**\n * Ezmeleri `<head>`in sonuna yazar — React dışındaki yol (`initUi`); sağlayıcı ezmeyi ağaçta\n * çizer.\n * ⚠ Stil sayfalarından SONRA çağrılmalı: `@layer ui` belgede ilk kez burada görülürse katman\n * sırası buradan kurulur ve tüketicinin sonra gelen `@layer reset, ui;` bildirimi `reset`i\n * `ui`nin üstüne koyar.\n */\nexport const applyThemeConfig = (config: UiThemeConfig | undefined): void => {\n if (!isClient()) return;\n\n const css = config ? buildThemeCss(config) : '';\n const existing = document.getElementById(THEME_STYLE_ID);\n\n if (css === '') {\n existing?.remove();\n return;\n }\n\n const element = existing ?? document.createElement('style');\n element.id = THEME_STYLE_ID;\n element.textContent = css;\n\n if (!existing) document.head.appendChild(element);\n};\n\n/**\n * İLK BOYAMADAN ÖNCE çalışacak tema betiği — `<head>` içine, React ağacından ÖNCE.\n * Kayıtlı açık seçimi (`light` / `dark`) `<html data-ui-theme>`e yazar; kayıt yoksa öznitelik\n * yazılmaz ve sistem tercihi izlenir.\n * ⚠ React ağacına konamaz: sağlayıcı ağaç monte olduktan sonra çalışıyor ve koyu tema seçmiş\n * kullanıcı o ana kadar bir kare beyaz ekran görüyordu. İki tüketici bu betiği ELLE yazıyordu.\n * ⚠ Depolama okunamazsa (gizli pencere, engellenmiş site verisi) sessizce sistem tercihine düşer.\n * @example <script dangerouslySetInnerHTML={{ __html: themeBootScript({ storageKey: 'theme' }) }} />\n */\nexport const themeBootScript = ({ storageKey }: { storageKey: string }): string =>\n `(function(){try{var t=localStorage.getItem(${JSON.stringify(storageKey)});` +\n `if(t===\"light\"||t===\"dark\")document.documentElement.setAttribute(\"${THEME_ATTRIBUTE}\",t)}` +\n `catch(e){}})()`;\n"],"names":["TOKEN_PREFIX","THEME_STYLE_ID","THEME_ATTRIBUTE","DENSITY_ATTRIBUTE","THEME_SWITCHING_CLASS","THEME_LAYER","THEME_ROOT","resolveTokens","scheme","config","base","DARK_THEME","LIGHT_THEME","overrides","buildThemeCss","blocks","declarations","tokens","indent","name","value","fonts","fontEntries","role","stack","metrics","body","toStyleHtml","css","applyThemeConfig","isClient","existing","element","themeBootScript","storageKey"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use client";"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const r=require("react"),o=require("@handijit/utils"),u="ui-live-region",s=t=>{if(!o.isClient())return null;const i=`${u}-${t}`,n=document.getElementById(i);if(n)return n;const e=document.createElement("div");return e.id=i,e.setAttribute("aria-live",t),e.setAttribute("aria-atomic","true"),e.className="ui-visually-hidden",document.body.appendChild(e),e},c=(t,i)=>{t.textContent="",window.requestAnimationFrame(()=>{t.textContent=i})},l=()=>r.useCallback((t,i="polite")=>{const n=t.trim();if(n==="")return;const e=s(i);e&&c(e,n)},[]);exports.default=l;
2
+ //# sourceMappingURL=useAnnounce.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAnnounce.cjs","sources":["../../src/hooks/useAnnounce.ts"],"sourcesContent":["'use client';\n\nimport { useCallback } from 'react';\n\nimport { isClient } from '@handijit/utils';\nimport { AnnouncePoliteness } from '@/types/hook.type';\n\n/**\n * EKRAN OKUYUCU DUYURU MERKEZİ.\n * @example const announce = useAnnounce(); announce(`${count} ürün bulundu`)\n */\n\nconst REGION_ID = 'ui-live-region';\n\n/** Bölgeyi bulur; yoksa oluşturur. */\nconst getRegion = (politeness: AnnouncePoliteness): HTMLElement | null => {\n if (!isClient()) return null;\n\n const id = `${REGION_ID}-${politeness}`;\n const existing = document.getElementById(id);\n if (existing) return existing;\n\n const region = document.createElement('div');\n region.id = id;\n region.setAttribute('aria-live', politeness);\n /* `aria-atomic` — bolge her degistiginde TAMAMI okunur. */\n region.setAttribute('aria-atomic', 'true');\n /*\n * Gorsel olarak gizli ama DOM'da: `display: none` ya da `hidden` bolgeyi erisilebilirlik\n * agacindan da cikarir ve hicbir sey duyurulmaz.\n */\n region.className = 'ui-visually-hidden';\n\n document.body.appendChild(region);\n return region;\n};\n\n/** AYNI metni arka arkaya duyurmak. */\nconst write = (region: HTMLElement, message: string): void => {\n region.textContent = '';\n\n window.requestAnimationFrame(() => {\n region.textContent = message;\n });\n};\n\n/** Duyuru fonksiyonu döndürür. */\nconst useAnnounce = (): ((message: string, politeness?: AnnouncePoliteness) => void) =>\n useCallback((message: string, politeness: AnnouncePoliteness = 'polite') => {\n const trimmed = message.trim();\n /* Bos duyuru bolgeyi temizler ve bir sonraki gercek duyuruyu bastirir. */\n if (trimmed === '') return;\n\n const region = getRegion(politeness);\n if (region) write(region, trimmed);\n }, []);\n\nexport default useAnnounce;\n"],"names":["REGION_ID","getRegion","politeness","isClient","id","existing","region","write","message","useAnnounce","useCallback","trimmed"],"mappings":"+KAWMA,EAAY,iBAGZC,EAAaC,GAAuD,CACxE,GAAI,CAACC,EAAAA,SAAA,EAAY,OAAO,KAExB,MAAMC,EAAK,GAAGJ,CAAS,IAAIE,CAAU,GAC/BG,EAAW,SAAS,eAAeD,CAAE,EAC3C,GAAIC,EAAU,OAAOA,EAErB,MAAMC,EAAS,SAAS,cAAc,KAAK,EAC3C,OAAAA,EAAO,GAAKF,EACZE,EAAO,aAAa,YAAaJ,CAAU,EAE3CI,EAAO,aAAa,cAAe,MAAM,EAKzCA,EAAO,UAAY,qBAEnB,SAAS,KAAK,YAAYA,CAAM,EACzBA,CACT,EAGMC,EAAQ,CAACD,EAAqBE,IAA0B,CAC5DF,EAAO,YAAc,GAErB,OAAO,sBAAsB,IAAM,CACjCA,EAAO,YAAcE,CACvB,CAAC,CACH,EAGMC,EAAc,IAClBC,EAAAA,YAAY,CAACF,EAAiBN,EAAiC,WAAa,CAC1E,MAAMS,EAAUH,EAAQ,KAAA,EAExB,GAAIG,IAAY,GAAI,OAEpB,MAAML,EAASL,EAAUC,CAAU,EAC/BI,GAAQC,EAAMD,EAAQK,CAAO,CACnC,EAAG,CAAA,CAAE"}
@@ -0,0 +1,4 @@
1
+ import { AnnouncePoliteness } from '../types/hook.type';
2
+ /** Duyuru fonksiyonu döndürür. */
3
+ declare const useAnnounce: () => ((message: string, politeness?: AnnouncePoliteness) => void);
4
+ export default useAnnounce;
@@ -0,0 +1,23 @@
1
+ "use client";
2
+ import { useCallback as o } from "react";
3
+ import { isClient as r } from "@handijit/utils";
4
+ const u = "ui-live-region", s = (e) => {
5
+ if (!r()) return null;
6
+ const n = `${u}-${e}`, i = document.getElementById(n);
7
+ if (i) return i;
8
+ const t = document.createElement("div");
9
+ return t.id = n, t.setAttribute("aria-live", e), t.setAttribute("aria-atomic", "true"), t.className = "ui-visually-hidden", document.body.appendChild(t), t;
10
+ }, c = (e, n) => {
11
+ e.textContent = "", window.requestAnimationFrame(() => {
12
+ e.textContent = n;
13
+ });
14
+ }, d = () => o((e, n = "polite") => {
15
+ const i = e.trim();
16
+ if (i === "") return;
17
+ const t = s(n);
18
+ t && c(t, i);
19
+ }, []);
20
+ export {
21
+ d as default
22
+ };
23
+ //# sourceMappingURL=useAnnounce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAnnounce.js","sources":["../../src/hooks/useAnnounce.ts"],"sourcesContent":["'use client';\n\nimport { useCallback } from 'react';\n\nimport { isClient } from '@handijit/utils';\nimport { AnnouncePoliteness } from '@/types/hook.type';\n\n/**\n * EKRAN OKUYUCU DUYURU MERKEZİ.\n * @example const announce = useAnnounce(); announce(`${count} ürün bulundu`)\n */\n\nconst REGION_ID = 'ui-live-region';\n\n/** Bölgeyi bulur; yoksa oluşturur. */\nconst getRegion = (politeness: AnnouncePoliteness): HTMLElement | null => {\n if (!isClient()) return null;\n\n const id = `${REGION_ID}-${politeness}`;\n const existing = document.getElementById(id);\n if (existing) return existing;\n\n const region = document.createElement('div');\n region.id = id;\n region.setAttribute('aria-live', politeness);\n /* `aria-atomic` — bolge her degistiginde TAMAMI okunur. */\n region.setAttribute('aria-atomic', 'true');\n /*\n * Gorsel olarak gizli ama DOM'da: `display: none` ya da `hidden` bolgeyi erisilebilirlik\n * agacindan da cikarir ve hicbir sey duyurulmaz.\n */\n region.className = 'ui-visually-hidden';\n\n document.body.appendChild(region);\n return region;\n};\n\n/** AYNI metni arka arkaya duyurmak. */\nconst write = (region: HTMLElement, message: string): void => {\n region.textContent = '';\n\n window.requestAnimationFrame(() => {\n region.textContent = message;\n });\n};\n\n/** Duyuru fonksiyonu döndürür. */\nconst useAnnounce = (): ((message: string, politeness?: AnnouncePoliteness) => void) =>\n useCallback((message: string, politeness: AnnouncePoliteness = 'polite') => {\n const trimmed = message.trim();\n /* Bos duyuru bolgeyi temizler ve bir sonraki gercek duyuruyu bastirir. */\n if (trimmed === '') return;\n\n const region = getRegion(politeness);\n if (region) write(region, trimmed);\n }, []);\n\nexport default useAnnounce;\n"],"names":["REGION_ID","getRegion","politeness","isClient","id","existing","region","write","message","useAnnounce","useCallback","trimmed"],"mappings":";;;AAWA,MAAMA,IAAY,kBAGZC,IAAY,CAACC,MAAuD;AACxE,MAAI,CAACC,EAAA,EAAY,QAAO;AAExB,QAAMC,IAAK,GAAGJ,CAAS,IAAIE,CAAU,IAC/BG,IAAW,SAAS,eAAeD,CAAE;AAC3C,MAAIC,EAAU,QAAOA;AAErB,QAAMC,IAAS,SAAS,cAAc,KAAK;AAC3C,SAAAA,EAAO,KAAKF,GACZE,EAAO,aAAa,aAAaJ,CAAU,GAE3CI,EAAO,aAAa,eAAe,MAAM,GAKzCA,EAAO,YAAY,sBAEnB,SAAS,KAAK,YAAYA,CAAM,GACzBA;AACT,GAGMC,IAAQ,CAACD,GAAqBE,MAA0B;AAC5D,EAAAF,EAAO,cAAc,IAErB,OAAO,sBAAsB,MAAM;AACjC,IAAAA,EAAO,cAAcE;AAAA,EACvB,CAAC;AACH,GAGMC,IAAc,MAClBC,EAAY,CAACF,GAAiBN,IAAiC,aAAa;AAC1E,QAAMS,IAAUH,EAAQ,KAAA;AAExB,MAAIG,MAAY,GAAI;AAEpB,QAAML,IAASL,EAAUC,CAAU;AACnC,EAAII,KAAQC,EAAMD,GAAQK,CAAO;AACnC,GAAG,CAAA,CAAE;"}
@@ -0,0 +1,2 @@
1
+ "use client";"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const o=require("react"),s=(t,r,u,n)=>{const e=o.useRef(u);e.current=u,o.useEffect(()=>{if(!r||!e.current)return;const i=window.setTimeout(()=>{var c;return(c=e.current)==null?void 0:c.call(e,t.trim())},n);return()=>window.clearTimeout(i)},[t,r,n])};exports.default=s;
2
+ //# sourceMappingURL=useAsyncSearch.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAsyncSearch.cjs","sources":["../../src/hooks/useAsyncSearch.ts"],"sourcesContent":["'use client';\n\nimport { useEffect, useRef } from 'react';\n\n/**\n * Arama terimini geciktirip DIŞARI bildirir — her tuşta istek atmamak için.\n * ⚠ `onSearch` bağımlılık listesine KONULAMAZ: çağıran taraf her render'da yeni bir kapanış\n * verebilir ve bağımlılığa konduğunda etki sonsuz…\n * @param term Ham arama terimi.\n * @param isActive Panel açık mı.\n * @param onSearch Yoksa kanca hiçbir şey yapmaz (yerel süzme yürürlüktedir).\n * @param delayMs Tuş vuruşları arasında beklenen süre.\n */\nconst useAsyncSearch = (\n term: string,\n isActive: boolean,\n onSearch: ((term: string) => void) | undefined,\n delayMs: number,\n): void => {\n const searchRef = useRef(onSearch);\n searchRef.current = onSearch;\n\n useEffect(() => {\n if (!isActive || !searchRef.current) return;\n\n const timer = window.setTimeout(() => searchRef.current?.(term.trim()), delayMs);\n return () => window.clearTimeout(timer);\n }, [term, isActive, delayMs]);\n};\n\nexport default useAsyncSearch;\n"],"names":["useAsyncSearch","term","isActive","onSearch","delayMs","searchRef","useRef","useEffect","timer","_a"],"mappings":"kJAYMA,EAAiB,CACrBC,EACAC,EACAC,EACAC,IACS,CACT,MAAMC,EAAYC,EAAAA,OAAOH,CAAQ,EACjCE,EAAU,QAAUF,EAEpBI,EAAAA,UAAU,IAAM,CACd,GAAI,CAACL,GAAY,CAACG,EAAU,QAAS,OAErC,MAAMG,EAAQ,OAAO,WAAW,IAAA,OAAM,OAAAC,EAAAJ,EAAU,UAAV,YAAAI,EAAA,KAAAJ,EAAoBJ,EAAK,SAASG,CAAO,EAC/E,MAAO,IAAM,OAAO,aAAaI,CAAK,CACxC,EAAG,CAACP,EAAMC,EAAUE,CAAO,CAAC,CAC9B"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Arama terimini geciktirip DIŞARI bildirir — her tuşta istek atmamak için.
3
+ * ⚠ `onSearch` bağımlılık listesine KONULAMAZ: çağıran taraf her render'da yeni bir kapanış
4
+ * verebilir ve bağımlılığa konduğunda etki sonsuz…
5
+ * @param term Ham arama terimi.
6
+ * @param isActive Panel açık mı.
7
+ * @param onSearch Yoksa kanca hiçbir şey yapmaz (yerel süzme yürürlüktedir).
8
+ * @param delayMs Tuş vuruşları arasında beklenen süre.
9
+ */
10
+ declare const useAsyncSearch: (term: string, isActive: boolean, onSearch: ((term: string) => void) | undefined, delayMs: number) => void;
11
+ export default useAsyncSearch;
@@ -0,0 +1,17 @@
1
+ "use client";
2
+ import { useRef as i, useEffect as s } from "react";
3
+ const m = (e, r, u, n) => {
4
+ const t = i(u);
5
+ t.current = u, s(() => {
6
+ if (!r || !t.current) return;
7
+ const c = window.setTimeout(() => {
8
+ var o;
9
+ return (o = t.current) == null ? void 0 : o.call(t, e.trim());
10
+ }, n);
11
+ return () => window.clearTimeout(c);
12
+ }, [e, r, n]);
13
+ };
14
+ export {
15
+ m as default
16
+ };
17
+ //# sourceMappingURL=useAsyncSearch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAsyncSearch.js","sources":["../../src/hooks/useAsyncSearch.ts"],"sourcesContent":["'use client';\n\nimport { useEffect, useRef } from 'react';\n\n/**\n * Arama terimini geciktirip DIŞARI bildirir — her tuşta istek atmamak için.\n * ⚠ `onSearch` bağımlılık listesine KONULAMAZ: çağıran taraf her render'da yeni bir kapanış\n * verebilir ve bağımlılığa konduğunda etki sonsuz…\n * @param term Ham arama terimi.\n * @param isActive Panel açık mı.\n * @param onSearch Yoksa kanca hiçbir şey yapmaz (yerel süzme yürürlüktedir).\n * @param delayMs Tuş vuruşları arasında beklenen süre.\n */\nconst useAsyncSearch = (\n term: string,\n isActive: boolean,\n onSearch: ((term: string) => void) | undefined,\n delayMs: number,\n): void => {\n const searchRef = useRef(onSearch);\n searchRef.current = onSearch;\n\n useEffect(() => {\n if (!isActive || !searchRef.current) return;\n\n const timer = window.setTimeout(() => searchRef.current?.(term.trim()), delayMs);\n return () => window.clearTimeout(timer);\n }, [term, isActive, delayMs]);\n};\n\nexport default useAsyncSearch;\n"],"names":["useAsyncSearch","term","isActive","onSearch","delayMs","searchRef","useRef","useEffect","timer","_a"],"mappings":";;AAYA,MAAMA,IAAiB,CACrBC,GACAC,GACAC,GACAC,MACS;AACT,QAAMC,IAAYC,EAAOH,CAAQ;AACjC,EAAAE,EAAU,UAAUF,GAEpBI,EAAU,MAAM;AACd,QAAI,CAACL,KAAY,CAACG,EAAU,QAAS;AAErC,UAAMG,IAAQ,OAAO,WAAW,MAAA;;AAAM,cAAAC,IAAAJ,EAAU,YAAV,gBAAAI,EAAA,KAAAJ,GAAoBJ,EAAK;OAASG,CAAO;AAC/E,WAAO,MAAM,OAAO,aAAaI,CAAK;AAAA,EACxC,GAAG,CAACP,GAAMC,GAAUE,CAAO,CAAC;AAC9B;"}
@@ -0,0 +1,2 @@
1
+ "use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react"),l=1600,f=n=>{const[i,o]=t.useState(!1),c=t.useRef(null),s=t.useRef(void 0);t.useEffect(()=>()=>window.clearTimeout(s.current),[]);const r=t.useCallback(()=>{const a=c.current;if(!a)return;const u=document.createRange();u.selectNodeContents(a);const e=window.getSelection();e==null||e.removeAllRanges(),e==null||e.addRange(u)},[]),d=t.useCallback(async()=>{try{await navigator.clipboard.writeText(n),o(!0),s.current=window.setTimeout(()=>o(!1),l)}catch{r()}},[n,r]);return{isCopied:i,copy:d,nodeRef:c}};exports.useCopyFeedback=f;
2
+ //# sourceMappingURL=useCopyFeedback.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCopyFeedback.cjs","sources":["../../src/hooks/useCopyFeedback.ts"],"sourcesContent":["'use client';\n\nimport { type RefObject, useCallback, useEffect, useRef, useState } from 'react';\n\n/** \"Kopyalandı\" geri bildiriminin ekranda kalma süresi (ms). */\nconst COPIED_FEEDBACK_MS = 1600;\n\ntype CopyFeedback = {\n isCopied: boolean;\n copy: () => Promise<void>;\n /** Değeri taşıyan düğüme bağlanır; pano izni yoksa içerik seçili bırakılır. */\n nodeRef: RefObject<HTMLSpanElement | null>;\n};\n\n/** Pano kopyalama + zamanlı geri bildirim — `CopyField` ile `CodeBadge`in ORTAK çekirdeği. */\nexport const useCopyFeedback = (value: string): CopyFeedback => {\n const [isCopied, setIsCopied] = useState(false);\n const nodeRef = useRef<HTMLSpanElement>(null);\n const timerRef = useRef<number | undefined>(undefined);\n\n // Bilesen sokulurse zamanlayici da gitmeli; aksi halde React \"unmounted component\" uyarisi\n // veriyor.\n useEffect(() => () => window.clearTimeout(timerRef.current), []);\n\n const selectValue = useCallback(() => {\n const node = nodeRef.current;\n if (!node) return;\n\n const range = document.createRange();\n range.selectNodeContents(node);\n const selection = window.getSelection();\n selection?.removeAllRanges();\n selection?.addRange(range);\n }, []);\n\n const copy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(value);\n setIsCopied(true);\n timerRef.current = window.setTimeout(() => setIsCopied(false), COPIED_FEEDBACK_MS);\n } catch {\n // Pano yoksa/izin verilmediyse en azindan secili birakilir.\n selectValue();\n }\n }, [value, selectValue]);\n\n return { isCopied, copy, nodeRef };\n};\n"],"names":["COPIED_FEEDBACK_MS","useCopyFeedback","value","isCopied","setIsCopied","useState","nodeRef","useRef","timerRef","useEffect","selectValue","useCallback","node","range","selection","copy"],"mappings":"sHAIMA,EAAqB,KAUdC,EAAmBC,GAAgC,CAC9D,KAAM,CAACC,EAAUC,CAAW,EAAIC,EAAAA,SAAS,EAAK,EACxCC,EAAUC,EAAAA,OAAwB,IAAI,EACtCC,EAAWD,EAAAA,OAA2B,MAAS,EAIrDE,EAAAA,UAAU,IAAM,IAAM,OAAO,aAAaD,EAAS,OAAO,EAAG,EAAE,EAE/D,MAAME,EAAcC,EAAAA,YAAY,IAAM,CACpC,MAAMC,EAAON,EAAQ,QACrB,GAAI,CAACM,EAAM,OAEX,MAAMC,EAAQ,SAAS,YAAA,EACvBA,EAAM,mBAAmBD,CAAI,EAC7B,MAAME,EAAY,OAAO,aAAA,EACzBA,GAAA,MAAAA,EAAW,kBACXA,GAAA,MAAAA,EAAW,SAASD,EACtB,EAAG,CAAA,CAAE,EAECE,EAAOJ,EAAAA,YAAY,SAAY,CACnC,GAAI,CACF,MAAM,UAAU,UAAU,UAAUT,CAAK,EACzCE,EAAY,EAAI,EAChBI,EAAS,QAAU,OAAO,WAAW,IAAMJ,EAAY,EAAK,EAAGJ,CAAkB,CACnF,MAAQ,CAENU,EAAA,CACF,CACF,EAAG,CAACR,EAAOQ,CAAW,CAAC,EAEvB,MAAO,CAAE,SAAAP,EAAU,KAAAY,EAAM,QAAAT,CAAA,CAC3B"}
@@ -0,0 +1,10 @@
1
+ import { RefObject } from 'react';
2
+ type CopyFeedback = {
3
+ isCopied: boolean;
4
+ copy: () => Promise<void>;
5
+ /** Değeri taşıyan düğüme bağlanır; pano izni yoksa içerik seçili bırakılır. */
6
+ nodeRef: RefObject<HTMLSpanElement | null>;
7
+ };
8
+ /** Pano kopyalama + zamanlı geri bildirim — `CopyField` ile `CodeBadge`in ORTAK çekirdeği. */
9
+ export declare const useCopyFeedback: (value: string) => CopyFeedback;
10
+ export {};
@@ -0,0 +1,25 @@
1
+ "use client";
2
+ import { useState as f, useRef as u, useEffect as w, useCallback as i } from "react";
3
+ const m = 1600, C = (t) => {
4
+ const [d, n] = f(!1), o = u(null), c = u(void 0);
5
+ w(() => () => window.clearTimeout(c.current), []);
6
+ const s = i(() => {
7
+ const r = o.current;
8
+ if (!r) return;
9
+ const a = document.createRange();
10
+ a.selectNodeContents(r);
11
+ const e = window.getSelection();
12
+ e == null || e.removeAllRanges(), e == null || e.addRange(a);
13
+ }, []), l = i(async () => {
14
+ try {
15
+ await navigator.clipboard.writeText(t), n(!0), c.current = window.setTimeout(() => n(!1), m);
16
+ } catch {
17
+ s();
18
+ }
19
+ }, [t, s]);
20
+ return { isCopied: d, copy: l, nodeRef: o };
21
+ };
22
+ export {
23
+ C as useCopyFeedback
24
+ };
25
+ //# sourceMappingURL=useCopyFeedback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCopyFeedback.js","sources":["../../src/hooks/useCopyFeedback.ts"],"sourcesContent":["'use client';\n\nimport { type RefObject, useCallback, useEffect, useRef, useState } from 'react';\n\n/** \"Kopyalandı\" geri bildiriminin ekranda kalma süresi (ms). */\nconst COPIED_FEEDBACK_MS = 1600;\n\ntype CopyFeedback = {\n isCopied: boolean;\n copy: () => Promise<void>;\n /** Değeri taşıyan düğüme bağlanır; pano izni yoksa içerik seçili bırakılır. */\n nodeRef: RefObject<HTMLSpanElement | null>;\n};\n\n/** Pano kopyalama + zamanlı geri bildirim — `CopyField` ile `CodeBadge`in ORTAK çekirdeği. */\nexport const useCopyFeedback = (value: string): CopyFeedback => {\n const [isCopied, setIsCopied] = useState(false);\n const nodeRef = useRef<HTMLSpanElement>(null);\n const timerRef = useRef<number | undefined>(undefined);\n\n // Bilesen sokulurse zamanlayici da gitmeli; aksi halde React \"unmounted component\" uyarisi\n // veriyor.\n useEffect(() => () => window.clearTimeout(timerRef.current), []);\n\n const selectValue = useCallback(() => {\n const node = nodeRef.current;\n if (!node) return;\n\n const range = document.createRange();\n range.selectNodeContents(node);\n const selection = window.getSelection();\n selection?.removeAllRanges();\n selection?.addRange(range);\n }, []);\n\n const copy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(value);\n setIsCopied(true);\n timerRef.current = window.setTimeout(() => setIsCopied(false), COPIED_FEEDBACK_MS);\n } catch {\n // Pano yoksa/izin verilmediyse en azindan secili birakilir.\n selectValue();\n }\n }, [value, selectValue]);\n\n return { isCopied, copy, nodeRef };\n};\n"],"names":["COPIED_FEEDBACK_MS","useCopyFeedback","value","isCopied","setIsCopied","useState","nodeRef","useRef","timerRef","useEffect","selectValue","useCallback","node","range","selection","copy"],"mappings":";;AAIA,MAAMA,IAAqB,MAUdC,IAAkB,CAACC,MAAgC;AAC9D,QAAM,CAACC,GAAUC,CAAW,IAAIC,EAAS,EAAK,GACxCC,IAAUC,EAAwB,IAAI,GACtCC,IAAWD,EAA2B,MAAS;AAIrD,EAAAE,EAAU,MAAM,MAAM,OAAO,aAAaD,EAAS,OAAO,GAAG,EAAE;AAE/D,QAAME,IAAcC,EAAY,MAAM;AACpC,UAAMC,IAAON,EAAQ;AACrB,QAAI,CAACM,EAAM;AAEX,UAAMC,IAAQ,SAAS,YAAA;AACvB,IAAAA,EAAM,mBAAmBD,CAAI;AAC7B,UAAME,IAAY,OAAO,aAAA;AACzB,IAAAA,KAAA,QAAAA,EAAW,mBACXA,KAAA,QAAAA,EAAW,SAASD;AAAA,EACtB,GAAG,CAAA,CAAE,GAECE,IAAOJ,EAAY,YAAY;AACnC,QAAI;AACF,YAAM,UAAU,UAAU,UAAUT,CAAK,GACzCE,EAAY,EAAI,GAChBI,EAAS,UAAU,OAAO,WAAW,MAAMJ,EAAY,EAAK,GAAGJ,CAAkB;AAAA,IACnF,QAAQ;AAEN,MAAAU,EAAA;AAAA,IACF;AAAA,EACF,GAAG,CAACR,GAAOQ,CAAW,CAAC;AAEvB,SAAO,EAAE,UAAAP,GAAU,MAAAY,GAAM,SAAAT,EAAA;AAC3B;"}
@@ -0,0 +1,2 @@
1
+ "use client";"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const c=require("react"),o=require("../helpers/focus.helper.cjs"),d=(e,t)=>{c.useEffect(()=>{if(!e)return;const{token:u,pop:s}=o.pushModal(),n=r=>{r.key==="Escape"&&o.isTopModal(u)&&(r.preventDefault(),t())};return document.addEventListener("keydown",n),()=>{document.removeEventListener("keydown",n),s()}},[e,t])};exports.default=d;
2
+ //# sourceMappingURL=useDismissOnEscape.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDismissOnEscape.cjs","sources":["../../src/hooks/useDismissOnEscape.ts"],"sourcesContent":["'use client';\n\nimport { useEffect } from 'react';\n\nimport { isTopModal, pushModal } from '../helpers/focus.helper';\n\n/**\n * `Escape` ile kapanma — dinleyici BELGE düzeyinde.\n * ⚠ YÜZEY YIĞINA KATILIR ve tuşu YALNIZCA EN ÜSTTEKİ tüketir.\n * ⚠ Tüketilen tuş `preventDefault` ile İŞARETLENİR: sayfa düzeyindeki dinleyici yüzeyi kapatan tuşu\n * kendi eylemine saymaz (bkz. `hasOpenSurface`).\n * ⚠ Kipsel yüzeyler (`Modal`, `Drawer`, `BottomSheet`) bu kancayı KULLANMAZ: onlar yerel `<dialog>`\n * üzerinden `cancel` olayını işler.\n * @param isActive Yüzey açık mı.\n * @param onDismiss Kapatma.\n */\nconst useDismissOnEscape = (isActive: boolean, onDismiss: () => void): void => {\n useEffect(() => {\n if (!isActive) return;\n\n const { token, pop } = pushModal();\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape') return;\n /* Yığının en üstünde değilsek tuş bizim değil. */\n if (!isTopModal(token)) return;\n /*\n * Yüzey bu tuş vuruşunda kapanır ve gerçek tarayıcıda React onu sonraki dinleyiciler koşmadan\n * yığından düşürür: onlara kalan tek kanıt bu işaret.\n */\n event.preventDefault();\n onDismiss();\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n pop();\n };\n }, [isActive, onDismiss]);\n};\n\nexport default useDismissOnEscape;\n"],"names":["useDismissOnEscape","isActive","onDismiss","useEffect","token","pop","pushModal","handleKeyDown","event","isTopModal"],"mappings":"2LAeMA,EAAqB,CAACC,EAAmBC,IAAgC,CAC7EC,EAAAA,UAAU,IAAM,CACd,GAAI,CAACF,EAAU,OAEf,KAAM,CAAE,MAAAG,EAAO,IAAAC,CAAA,EAAQC,YAAA,EAEjBC,EAAiBC,GAAyB,CAC1CA,EAAM,MAAQ,UAEbC,EAAAA,WAAWL,CAAK,IAKrBI,EAAM,eAAA,EACNN,EAAA,EACF,EAEA,gBAAS,iBAAiB,UAAWK,CAAa,EAC3C,IAAM,CACX,SAAS,oBAAoB,UAAWA,CAAa,EACrDF,EAAA,CACF,CACF,EAAG,CAACJ,EAAUC,CAAS,CAAC,CAC1B"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * `Escape` ile kapanma — dinleyici BELGE düzeyinde.
3
+ * ⚠ YÜZEY YIĞINA KATILIR ve tuşu YALNIZCA EN ÜSTTEKİ tüketir.
4
+ * ⚠ Tüketilen tuş `preventDefault` ile İŞARETLENİR: sayfa düzeyindeki dinleyici yüzeyi kapatan tuşu
5
+ * kendi eylemine saymaz (bkz. `hasOpenSurface`).
6
+ * ⚠ Kipsel yüzeyler (`Modal`, `Drawer`, `BottomSheet`) bu kancayı KULLANMAZ: onlar yerel `<dialog>`
7
+ * üzerinden `cancel` olayını işler.
8
+ * @param isActive Yüzey açık mı.
9
+ * @param onDismiss Kapatma.
10
+ */
11
+ declare const useDismissOnEscape: (isActive: boolean, onDismiss: () => void) => void;
12
+ export default useDismissOnEscape;
@@ -0,0 +1,18 @@
1
+ "use client";
2
+ import { useEffect as u } from "react";
3
+ import { pushModal as d, isTopModal as p } from "../helpers/focus.helper.js";
4
+ const c = (e, t) => {
5
+ u(() => {
6
+ if (!e) return;
7
+ const { token: r, pop: s } = d(), n = (o) => {
8
+ o.key === "Escape" && p(r) && (o.preventDefault(), t());
9
+ };
10
+ return document.addEventListener("keydown", n), () => {
11
+ document.removeEventListener("keydown", n), s();
12
+ };
13
+ }, [e, t]);
14
+ };
15
+ export {
16
+ c as default
17
+ };
18
+ //# sourceMappingURL=useDismissOnEscape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDismissOnEscape.js","sources":["../../src/hooks/useDismissOnEscape.ts"],"sourcesContent":["'use client';\n\nimport { useEffect } from 'react';\n\nimport { isTopModal, pushModal } from '../helpers/focus.helper';\n\n/**\n * `Escape` ile kapanma — dinleyici BELGE düzeyinde.\n * ⚠ YÜZEY YIĞINA KATILIR ve tuşu YALNIZCA EN ÜSTTEKİ tüketir.\n * ⚠ Tüketilen tuş `preventDefault` ile İŞARETLENİR: sayfa düzeyindeki dinleyici yüzeyi kapatan tuşu\n * kendi eylemine saymaz (bkz. `hasOpenSurface`).\n * ⚠ Kipsel yüzeyler (`Modal`, `Drawer`, `BottomSheet`) bu kancayı KULLANMAZ: onlar yerel `<dialog>`\n * üzerinden `cancel` olayını işler.\n * @param isActive Yüzey açık mı.\n * @param onDismiss Kapatma.\n */\nconst useDismissOnEscape = (isActive: boolean, onDismiss: () => void): void => {\n useEffect(() => {\n if (!isActive) return;\n\n const { token, pop } = pushModal();\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape') return;\n /* Yığının en üstünde değilsek tuş bizim değil. */\n if (!isTopModal(token)) return;\n /*\n * Yüzey bu tuş vuruşunda kapanır ve gerçek tarayıcıda React onu sonraki dinleyiciler koşmadan\n * yığından düşürür: onlara kalan tek kanıt bu işaret.\n */\n event.preventDefault();\n onDismiss();\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n pop();\n };\n }, [isActive, onDismiss]);\n};\n\nexport default useDismissOnEscape;\n"],"names":["useDismissOnEscape","isActive","onDismiss","useEffect","token","pop","pushModal","handleKeyDown","event","isTopModal"],"mappings":";;;AAeA,MAAMA,IAAqB,CAACC,GAAmBC,MAAgC;AAC7E,EAAAC,EAAU,MAAM;AACd,QAAI,CAACF,EAAU;AAEf,UAAM,EAAE,OAAAG,GAAO,KAAAC,EAAA,IAAQC,EAAA,GAEjBC,IAAgB,CAACC,MAAyB;AAC9C,MAAIA,EAAM,QAAQ,YAEbC,EAAWL,CAAK,MAKrBI,EAAM,eAAA,GACNN,EAAA;AAAA,IACF;AAEA,oBAAS,iBAAiB,WAAWK,CAAa,GAC3C,MAAM;AACX,eAAS,oBAAoB,WAAWA,CAAa,GACrDF,EAAA;AAAA,IACF;AAAA,EACF,GAAG,CAACJ,GAAUC,CAAS,CAAC;AAC1B;"}
@@ -0,0 +1,2 @@
1
+ "use client";"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const s=require("react"),p=require("../helpers/scroll.helper.cjs"),D=({count:a,isOpen:f,initialIndex:c=0,onSelect:b,onClose:u},{hasSpaceSelect:i=!1}={})=>{const[t,r]=s.useState(c),k=s.useRef(null);s.useEffect(()=>{f&&r(c)},[f,c]),s.useEffect(()=>{r(e=>e>=a?Math.max(0,a-1):e)},[a]),s.useEffect(()=>{var e;f&&p.scrollIntoViewIfPossible((e=k.current)==null?void 0:e.querySelector(`[data-index="${t}"]`),{block:"nearest"})},[t,f,a]);const d=s.useCallback(e=>{const o=a-1;switch(e.key){case"ArrowDown":e.preventDefault(),r(l=>l>=o?0:l+1);break;case"ArrowUp":e.preventDefault(),r(l=>l<=0?o:l-1);break;case"Home":e.preventDefault(),r(0);break;case"End":e.preventDefault(),r(o);break;case" ":case"Enter":{if(e.key===" "&&!i)break;e.preventDefault(),a>0&&b(t);break}case"Escape":e.preventDefault(),e.stopPropagation(),u();break;case"Tab":u();break}},[t,a,i,u,b]);return{activeIndex:t,setActiveIndex:r,listRef:k,handleKeyDown:d}};exports.default=D;
2
+ //# sourceMappingURL=useListboxNavigation.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useListboxNavigation.cjs","sources":["../../src/hooks/useListboxNavigation.ts"],"sourcesContent":["'use client';\n\nimport { type KeyboardEvent, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { scrollIntoViewIfPossible } from '../helpers/scroll.helper';\nimport type { ListboxNavigation, ListboxNavigationOptions } from '@/types/hook.type';\n\n/*\n * Govde `types/hook.type.ts`e tasindi (kardesleri `VirtualRange`, `AnnouncePoliteness`,\n * `ListboxNavigationOptions` zaten oradaydi)\n */\nexport type { ListboxNavigation } from '@/types/hook.type';\n\n/** LISTBOX KLAVYE GEZİNMESİ — `Select` ve `Combobox`ın ortak modeli. */\nconst useListboxNavigation = <T extends HTMLElement = HTMLElement>(\n { count, isOpen, initialIndex = 0, onSelect, onClose }: ListboxNavigationOptions,\n { hasSpaceSelect = false } = {},\n): ListboxNavigation<T> => {\n const [activeIndex, setActiveIndex] = useState(initialIndex);\n const listRef = useRef<T | null>(null);\n\n /*\n * Panel her acildiginda etkin secenek SECILI olandan baslar; kullanici listeyi bastan taramak\n * zorunda kalmaz.\n */\n useEffect(() => {\n if (isOpen) setActiveIndex(initialIndex);\n }, [isOpen, initialIndex]);\n\n /*\n * Liste SUZULDUGUNDE etkin dizin listenin disinda kalabiliyor: uc secenek gorunurken\n * `activeIndex` 7'de kaldiginda `Enter` hicbir sey secmiyordu.\n */\n useEffect(() => {\n setActiveIndex(current => (current >= count ? Math.max(0, count - 1) : current));\n }, [count]);\n\n /* Etkin secenek gorunur alanin disina cikmamali. */\n useEffect(() => {\n if (!isOpen) return;\n scrollIntoViewIfPossible(listRef.current?.querySelector(`[data-index=\"${activeIndex}\"]`), {\n block: 'nearest',\n });\n }, [activeIndex, isOpen, count]);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLElement>) => {\n const lastIndex = count - 1;\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n setActiveIndex(current => (current >= lastIndex ? 0 : current + 1));\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n setActiveIndex(current => (current <= 0 ? lastIndex : current - 1));\n break;\n\n case 'Home':\n event.preventDefault();\n setActiveIndex(0);\n break;\n\n case 'End':\n event.preventDefault();\n setActiveIndex(lastIndex);\n break;\n\n case ' ':\n case 'Enter': {\n /*\n * Arama kutusunda BOSLUK bir KARAKTER: onu secime cevirmek \"fren balatasi\" yazmayi\n * imkansiz kiliyordu. `Enter` her iki kipte de secer.\n */\n if (event.key === ' ' && !hasSpaceSelect) break;\n\n event.preventDefault();\n if (count > 0) onSelect(activeIndex);\n break;\n }\n\n case 'Escape':\n event.preventDefault();\n /*\n * React 17+ dinleyiciyi KOK KAPSAYICIYA bagliyor, yani sentetik olayda propagasyonu\n * durdurmak yerel olayin `document`e ulasmasini da engeller.\n * ⚠ `stopPropagation` ZORUNLU.\n */\n event.stopPropagation();\n onClose();\n break;\n\n case 'Tab':\n /* Kapatir ama varsayilan gezinme SURER. */\n onClose();\n break;\n\n default:\n break;\n }\n },\n [activeIndex, count, hasSpaceSelect, onClose, onSelect],\n );\n\n return { activeIndex, setActiveIndex, listRef, handleKeyDown };\n};\n\nexport default useListboxNavigation;\n"],"names":["useListboxNavigation","count","isOpen","initialIndex","onSelect","onClose","hasSpaceSelect","activeIndex","setActiveIndex","useState","listRef","useRef","useEffect","current","scrollIntoViewIfPossible","_a","handleKeyDown","useCallback","event","lastIndex"],"mappings":"4LAaMA,EAAuB,CAC3B,CAAE,MAAAC,EAAO,OAAAC,EAAQ,aAAAC,EAAe,EAAG,SAAAC,EAAU,QAAAC,CAAA,EAC7C,CAAE,eAAAC,EAAiB,EAAA,EAAU,CAAA,IACJ,CACzB,KAAM,CAACC,EAAaC,CAAc,EAAIC,EAAAA,SAASN,CAAY,EACrDO,EAAUC,EAAAA,OAAiB,IAAI,EAMrCC,EAAAA,UAAU,IAAM,CACVV,KAAuBC,CAAY,CACzC,EAAG,CAACD,EAAQC,CAAY,CAAC,EAMzBS,EAAAA,UAAU,IAAM,CACdJ,EAAeK,GAAYA,GAAWZ,EAAQ,KAAK,IAAI,EAAGA,EAAQ,CAAC,EAAIY,CAAQ,CACjF,EAAG,CAACZ,CAAK,CAAC,EAGVW,EAAAA,UAAU,IAAM,OACTV,GACLY,4BAAyBC,EAAAL,EAAQ,UAAR,YAAAK,EAAiB,cAAc,gBAAgBR,CAAW,MAAO,CACxF,MAAO,SAAA,CACR,CACH,EAAG,CAACA,EAAaL,EAAQD,CAAK,CAAC,EAE/B,MAAMe,EAAgBC,EAAAA,YACnBC,GAAsC,CACrC,MAAMC,EAAYlB,EAAQ,EAE1B,OAAQiB,EAAM,IAAA,CACZ,IAAK,YACHA,EAAM,eAAA,EACNV,EAAeK,GAAYA,GAAWM,EAAY,EAAIN,EAAU,CAAE,EAClE,MAEF,IAAK,UACHK,EAAM,eAAA,EACNV,EAAeK,GAAYA,GAAW,EAAIM,EAAYN,EAAU,CAAE,EAClE,MAEF,IAAK,OACHK,EAAM,eAAA,EACNV,EAAe,CAAC,EAChB,MAEF,IAAK,MACHU,EAAM,eAAA,EACNV,EAAeW,CAAS,EACxB,MAEF,IAAK,IACL,IAAK,QAAS,CAKZ,GAAID,EAAM,MAAQ,KAAO,CAACZ,EAAgB,MAE1CY,EAAM,eAAA,EACFjB,EAAQ,GAAGG,EAASG,CAAW,EACnC,KACF,CAEA,IAAK,SACHW,EAAM,eAAA,EAMNA,EAAM,gBAAA,EACNb,EAAA,EACA,MAEF,IAAK,MAEHA,EAAA,EACA,KAGA,CAEN,EACA,CAACE,EAAaN,EAAOK,EAAgBD,EAASD,CAAQ,CAAA,EAGxD,MAAO,CAAE,YAAAG,EAAa,eAAAC,EAAgB,QAAAE,EAAS,cAAAM,CAAA,CACjD"}
@@ -0,0 +1,7 @@
1
+ import { ListboxNavigation, ListboxNavigationOptions } from '../types/hook.type';
2
+ export type { ListboxNavigation } from '../types/hook.type';
3
+ /** LISTBOX KLAVYE GEZİNMESİ — `Select` ve `Combobox`ın ortak modeli. */
4
+ declare const useListboxNavigation: <T extends HTMLElement = HTMLElement>({ count, isOpen, initialIndex, onSelect, onClose }: ListboxNavigationOptions, { hasSpaceSelect }?: {
5
+ hasSpaceSelect?: boolean | undefined;
6
+ }) => ListboxNavigation<T>;
7
+ export default useListboxNavigation;
@@ -0,0 +1,53 @@
1
+ "use client";
2
+ import { useState as D, useRef as d, useEffect as c, useCallback as m } from "react";
3
+ import { scrollIntoViewIfPossible as w } from "../helpers/scroll.helper.js";
4
+ const E = ({ count: a, isOpen: f, initialIndex: l = 0, onSelect: k, onClose: o }, { hasSpaceSelect: i = !1 } = {}) => {
5
+ const [s, r] = D(l), p = d(null);
6
+ c(() => {
7
+ f && r(l);
8
+ }, [f, l]), c(() => {
9
+ r((e) => e >= a ? Math.max(0, a - 1) : e);
10
+ }, [a]), c(() => {
11
+ var e;
12
+ f && w((e = p.current) == null ? void 0 : e.querySelector(`[data-index="${s}"]`), {
13
+ block: "nearest"
14
+ });
15
+ }, [s, f, a]);
16
+ const u = m(
17
+ (e) => {
18
+ const b = a - 1;
19
+ switch (e.key) {
20
+ case "ArrowDown":
21
+ e.preventDefault(), r((t) => t >= b ? 0 : t + 1);
22
+ break;
23
+ case "ArrowUp":
24
+ e.preventDefault(), r((t) => t <= 0 ? b : t - 1);
25
+ break;
26
+ case "Home":
27
+ e.preventDefault(), r(0);
28
+ break;
29
+ case "End":
30
+ e.preventDefault(), r(b);
31
+ break;
32
+ case " ":
33
+ case "Enter": {
34
+ if (e.key === " " && !i) break;
35
+ e.preventDefault(), a > 0 && k(s);
36
+ break;
37
+ }
38
+ case "Escape":
39
+ e.preventDefault(), e.stopPropagation(), o();
40
+ break;
41
+ case "Tab":
42
+ o();
43
+ break;
44
+ }
45
+ },
46
+ [s, a, i, o, k]
47
+ );
48
+ return { activeIndex: s, setActiveIndex: r, listRef: p, handleKeyDown: u };
49
+ };
50
+ export {
51
+ E as default
52
+ };
53
+ //# sourceMappingURL=useListboxNavigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useListboxNavigation.js","sources":["../../src/hooks/useListboxNavigation.ts"],"sourcesContent":["'use client';\n\nimport { type KeyboardEvent, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { scrollIntoViewIfPossible } from '../helpers/scroll.helper';\nimport type { ListboxNavigation, ListboxNavigationOptions } from '@/types/hook.type';\n\n/*\n * Govde `types/hook.type.ts`e tasindi (kardesleri `VirtualRange`, `AnnouncePoliteness`,\n * `ListboxNavigationOptions` zaten oradaydi)\n */\nexport type { ListboxNavigation } from '@/types/hook.type';\n\n/** LISTBOX KLAVYE GEZİNMESİ — `Select` ve `Combobox`ın ortak modeli. */\nconst useListboxNavigation = <T extends HTMLElement = HTMLElement>(\n { count, isOpen, initialIndex = 0, onSelect, onClose }: ListboxNavigationOptions,\n { hasSpaceSelect = false } = {},\n): ListboxNavigation<T> => {\n const [activeIndex, setActiveIndex] = useState(initialIndex);\n const listRef = useRef<T | null>(null);\n\n /*\n * Panel her acildiginda etkin secenek SECILI olandan baslar; kullanici listeyi bastan taramak\n * zorunda kalmaz.\n */\n useEffect(() => {\n if (isOpen) setActiveIndex(initialIndex);\n }, [isOpen, initialIndex]);\n\n /*\n * Liste SUZULDUGUNDE etkin dizin listenin disinda kalabiliyor: uc secenek gorunurken\n * `activeIndex` 7'de kaldiginda `Enter` hicbir sey secmiyordu.\n */\n useEffect(() => {\n setActiveIndex(current => (current >= count ? Math.max(0, count - 1) : current));\n }, [count]);\n\n /* Etkin secenek gorunur alanin disina cikmamali. */\n useEffect(() => {\n if (!isOpen) return;\n scrollIntoViewIfPossible(listRef.current?.querySelector(`[data-index=\"${activeIndex}\"]`), {\n block: 'nearest',\n });\n }, [activeIndex, isOpen, count]);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLElement>) => {\n const lastIndex = count - 1;\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n setActiveIndex(current => (current >= lastIndex ? 0 : current + 1));\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n setActiveIndex(current => (current <= 0 ? lastIndex : current - 1));\n break;\n\n case 'Home':\n event.preventDefault();\n setActiveIndex(0);\n break;\n\n case 'End':\n event.preventDefault();\n setActiveIndex(lastIndex);\n break;\n\n case ' ':\n case 'Enter': {\n /*\n * Arama kutusunda BOSLUK bir KARAKTER: onu secime cevirmek \"fren balatasi\" yazmayi\n * imkansiz kiliyordu. `Enter` her iki kipte de secer.\n */\n if (event.key === ' ' && !hasSpaceSelect) break;\n\n event.preventDefault();\n if (count > 0) onSelect(activeIndex);\n break;\n }\n\n case 'Escape':\n event.preventDefault();\n /*\n * React 17+ dinleyiciyi KOK KAPSAYICIYA bagliyor, yani sentetik olayda propagasyonu\n * durdurmak yerel olayin `document`e ulasmasini da engeller.\n * ⚠ `stopPropagation` ZORUNLU.\n */\n event.stopPropagation();\n onClose();\n break;\n\n case 'Tab':\n /* Kapatir ama varsayilan gezinme SURER. */\n onClose();\n break;\n\n default:\n break;\n }\n },\n [activeIndex, count, hasSpaceSelect, onClose, onSelect],\n );\n\n return { activeIndex, setActiveIndex, listRef, handleKeyDown };\n};\n\nexport default useListboxNavigation;\n"],"names":["useListboxNavigation","count","isOpen","initialIndex","onSelect","onClose","hasSpaceSelect","activeIndex","setActiveIndex","useState","listRef","useRef","useEffect","current","scrollIntoViewIfPossible","_a","handleKeyDown","useCallback","event","lastIndex"],"mappings":";;;AAaA,MAAMA,IAAuB,CAC3B,EAAE,OAAAC,GAAO,QAAAC,GAAQ,cAAAC,IAAe,GAAG,UAAAC,GAAU,SAAAC,EAAA,GAC7C,EAAE,gBAAAC,IAAiB,GAAA,IAAU,CAAA,MACJ;AACzB,QAAM,CAACC,GAAaC,CAAc,IAAIC,EAASN,CAAY,GACrDO,IAAUC,EAAiB,IAAI;AAMrC,EAAAC,EAAU,MAAM;AACd,IAAIV,OAAuBC,CAAY;AAAA,EACzC,GAAG,CAACD,GAAQC,CAAY,CAAC,GAMzBS,EAAU,MAAM;AACd,IAAAJ,EAAe,CAAAK,MAAYA,KAAWZ,IAAQ,KAAK,IAAI,GAAGA,IAAQ,CAAC,IAAIY,CAAQ;AAAA,EACjF,GAAG,CAACZ,CAAK,CAAC,GAGVW,EAAU,MAAM;;AACd,IAAKV,KACLY,GAAyBC,IAAAL,EAAQ,YAAR,gBAAAK,EAAiB,cAAc,gBAAgBR,CAAW,OAAO;AAAA,MACxF,OAAO;AAAA,IAAA,CACR;AAAA,EACH,GAAG,CAACA,GAAaL,GAAQD,CAAK,CAAC;AAE/B,QAAMe,IAAgBC;AAAA,IACpB,CAACC,MAAsC;AACrC,YAAMC,IAAYlB,IAAQ;AAE1B,cAAQiB,EAAM,KAAA;AAAA,QACZ,KAAK;AACH,UAAAA,EAAM,eAAA,GACNV,EAAe,CAAAK,MAAYA,KAAWM,IAAY,IAAIN,IAAU,CAAE;AAClE;AAAA,QAEF,KAAK;AACH,UAAAK,EAAM,eAAA,GACNV,EAAe,CAAAK,MAAYA,KAAW,IAAIM,IAAYN,IAAU,CAAE;AAClE;AAAA,QAEF,KAAK;AACH,UAAAK,EAAM,eAAA,GACNV,EAAe,CAAC;AAChB;AAAA,QAEF,KAAK;AACH,UAAAU,EAAM,eAAA,GACNV,EAAeW,CAAS;AACxB;AAAA,QAEF,KAAK;AAAA,QACL,KAAK,SAAS;AAKZ,cAAID,EAAM,QAAQ,OAAO,CAACZ,EAAgB;AAE1C,UAAAY,EAAM,eAAA,GACFjB,IAAQ,KAAGG,EAASG,CAAW;AACnC;AAAA,QACF;AAAA,QAEA,KAAK;AACH,UAAAW,EAAM,eAAA,GAMNA,EAAM,gBAAA,GACNb,EAAA;AACA;AAAA,QAEF,KAAK;AAEH,UAAAA,EAAA;AACA;AAAA,MAGA;AAAA,IAEN;AAAA,IACA,CAACE,GAAaN,GAAOK,GAAgBD,GAASD,CAAQ;AAAA,EAAA;AAGxD,SAAO,EAAE,aAAAG,GAAa,gBAAAC,GAAgB,SAAAE,GAAS,eAAAM,EAAA;AACjD;"}
@@ -0,0 +1,2 @@
1
+ "use client";"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const l=require("react"),s=require("@handijit/utils"),o=require("../helpers/portal.helper.cjs"),c={},a={},i=(t,u,n)=>{const e=t&&s.isClient()?o.resolvePortalTarget(u.current):null,r=(e==null?void 0:e.needsTopLayer)??!1;return l.useEffect(()=>{if(!(!t||!r))return o.showTopLayer(n.current)},[t,r,n]),{container:(e==null?void 0:e.container)??null,attributes:r?{popover:"manual"}:c,style:r?o.POPOVER_RESET:a}};exports.default=i;
2
+ //# sourceMappingURL=usePortalSurface.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePortalSurface.cjs","sources":["../../src/hooks/usePortalSurface.ts"],"sourcesContent":["'use client';\n\nimport { useEffect } from 'react';\n\nimport { isClient } from '@handijit/utils';\n\nimport { POPOVER_RESET, resolvePortalTarget, showTopLayer } from '../helpers/portal.helper';\n\n/** Portallanan yüzeye yayılacak nitelik + stil parçaları. */\nexport type PortalSurface = {\n /** `null` iken yüzey ÇİZİLMEZ: hedef yalnızca açıkken ve istemcide çözülür. */\n container: HTMLElement | null;\n /** Üst katman gerekiyorsa `popover=\"manual\"`; gerekmiyorsa boş. */\n attributes: { popover?: 'manual' };\n /** UA'nın `inset: 0` + `margin: auto` çiftini geri alan sıfırlama. */\n style: typeof POPOVER_RESET | Record<string, never>;\n};\n\nconst NO_ATTRIBUTES: { popover?: 'manual' } = {};\nconst NO_STYLE: Record<string, never> = {};\n\n/**\n * ANKRAJLI YÜZEYİN PORTAL SÖZLEŞMESİ — `Menu`, `Popover`, `Tooltip`, `Combobox` ve `Select` için\n * TEK kaynak.\n * ⚠ `position: fixed` TEK BAŞINA \"viewport'a göre konumlan\" demek DEĞİL. `none` olmayan bir\n * `transform`/`translate`/`scale`/`rotate`, bir…\n * ⚠ Bu kancanın varlık sebebi DRY.\n */\nconst usePortalSurface = (\n isOpen: boolean,\n anchorRef: { current: HTMLElement | null },\n surfaceRef: { current: HTMLElement | null },\n): PortalSurface => {\n /*\n * Hedef HER RENDER'DA degil, yalnizca acikken cozulur. `closest` ucuzdur ama tetikleyicinin DOM\n * konumu acilistan sonra degismedigi icin tekrar…\n */\n const target = isOpen && isClient() ? resolvePortalTarget(anchorRef.current) : null;\n const needsTopLayer = target?.needsTopLayer ?? false;\n\n /*\n * ⚠ `popover` niteligi TEK BASINA yetmez: eleman `showPopover()` cagrilana kadar `display: none`\n * kalir.\n */\n useEffect(() => {\n if (!isOpen || !needsTopLayer) return;\n return showTopLayer(surfaceRef.current);\n }, [isOpen, needsTopLayer, surfaceRef]);\n\n return {\n container: target?.container ?? null,\n attributes: needsTopLayer ? { popover: 'manual' } : NO_ATTRIBUTES,\n style: needsTopLayer ? POPOVER_RESET : NO_STYLE,\n };\n};\n\nexport default usePortalSurface;\n"],"names":["NO_ATTRIBUTES","NO_STYLE","usePortalSurface","isOpen","anchorRef","surfaceRef","target","isClient","resolvePortalTarget","needsTopLayer","useEffect","showTopLayer","POPOVER_RESET"],"mappings":"yNAiBMA,EAAwC,CAAA,EACxCC,EAAkC,CAAA,EASlCC,EAAmB,CACvBC,EACAC,EACAC,IACkB,CAKlB,MAAMC,EAASH,GAAUI,EAAAA,SAAA,EAAaC,EAAAA,oBAAoBJ,EAAU,OAAO,EAAI,KACzEK,GAAgBH,GAAA,YAAAA,EAAQ,gBAAiB,GAM/CI,OAAAA,EAAAA,UAAU,IAAM,CACd,GAAI,GAACP,GAAU,CAACM,GAChB,OAAOE,EAAAA,aAAaN,EAAW,OAAO,CACxC,EAAG,CAACF,EAAQM,EAAeJ,CAAU,CAAC,EAE/B,CACL,WAAWC,GAAA,YAAAA,EAAQ,YAAa,KAChC,WAAYG,EAAgB,CAAE,QAAS,UAAaT,EACpD,MAAOS,EAAgBG,gBAAgBX,CAAA,CAE3C"}
@@ -0,0 +1,25 @@
1
+ import { POPOVER_RESET } from '../helpers/portal.helper';
2
+ /** Portallanan yüzeye yayılacak nitelik + stil parçaları. */
3
+ export type PortalSurface = {
4
+ /** `null` iken yüzey ÇİZİLMEZ: hedef yalnızca açıkken ve istemcide çözülür. */
5
+ container: HTMLElement | null;
6
+ /** Üst katman gerekiyorsa `popover="manual"`; gerekmiyorsa boş. */
7
+ attributes: {
8
+ popover?: 'manual';
9
+ };
10
+ /** UA'nın `inset: 0` + `margin: auto` çiftini geri alan sıfırlama. */
11
+ style: typeof POPOVER_RESET | Record<string, never>;
12
+ };
13
+ /**
14
+ * ANKRAJLI YÜZEYİN PORTAL SÖZLEŞMESİ — `Menu`, `Popover`, `Tooltip`, `Combobox` ve `Select` için
15
+ * TEK kaynak.
16
+ * ⚠ `position: fixed` TEK BAŞINA "viewport'a göre konumlan" demek DEĞİL. `none` olmayan bir
17
+ * `transform`/`translate`/`scale`/`rotate`, bir…
18
+ * ⚠ Bu kancanın varlık sebebi DRY.
19
+ */
20
+ declare const usePortalSurface: (isOpen: boolean, anchorRef: {
21
+ current: HTMLElement | null;
22
+ }, surfaceRef: {
23
+ current: HTMLElement | null;
24
+ }) => PortalSurface;
25
+ export default usePortalSurface;
@@ -0,0 +1,19 @@
1
+ "use client";
2
+ import { useEffect as s } from "react";
3
+ import { isClient as l } from "@handijit/utils";
4
+ import { resolvePortalTarget as u, showTopLayer as a, POPOVER_RESET as c } from "../helpers/portal.helper.js";
5
+ const T = {}, i = {}, E = (o, n, t) => {
6
+ const r = o && l() ? u(n.current) : null, e = (r == null ? void 0 : r.needsTopLayer) ?? !1;
7
+ return s(() => {
8
+ if (!(!o || !e))
9
+ return a(t.current);
10
+ }, [o, e, t]), {
11
+ container: (r == null ? void 0 : r.container) ?? null,
12
+ attributes: e ? { popover: "manual" } : T,
13
+ style: e ? c : i
14
+ };
15
+ };
16
+ export {
17
+ E as default
18
+ };
19
+ //# sourceMappingURL=usePortalSurface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePortalSurface.js","sources":["../../src/hooks/usePortalSurface.ts"],"sourcesContent":["'use client';\n\nimport { useEffect } from 'react';\n\nimport { isClient } from '@handijit/utils';\n\nimport { POPOVER_RESET, resolvePortalTarget, showTopLayer } from '../helpers/portal.helper';\n\n/** Portallanan yüzeye yayılacak nitelik + stil parçaları. */\nexport type PortalSurface = {\n /** `null` iken yüzey ÇİZİLMEZ: hedef yalnızca açıkken ve istemcide çözülür. */\n container: HTMLElement | null;\n /** Üst katman gerekiyorsa `popover=\"manual\"`; gerekmiyorsa boş. */\n attributes: { popover?: 'manual' };\n /** UA'nın `inset: 0` + `margin: auto` çiftini geri alan sıfırlama. */\n style: typeof POPOVER_RESET | Record<string, never>;\n};\n\nconst NO_ATTRIBUTES: { popover?: 'manual' } = {};\nconst NO_STYLE: Record<string, never> = {};\n\n/**\n * ANKRAJLI YÜZEYİN PORTAL SÖZLEŞMESİ — `Menu`, `Popover`, `Tooltip`, `Combobox` ve `Select` için\n * TEK kaynak.\n * ⚠ `position: fixed` TEK BAŞINA \"viewport'a göre konumlan\" demek DEĞİL. `none` olmayan bir\n * `transform`/`translate`/`scale`/`rotate`, bir…\n * ⚠ Bu kancanın varlık sebebi DRY.\n */\nconst usePortalSurface = (\n isOpen: boolean,\n anchorRef: { current: HTMLElement | null },\n surfaceRef: { current: HTMLElement | null },\n): PortalSurface => {\n /*\n * Hedef HER RENDER'DA degil, yalnizca acikken cozulur. `closest` ucuzdur ama tetikleyicinin DOM\n * konumu acilistan sonra degismedigi icin tekrar…\n */\n const target = isOpen && isClient() ? resolvePortalTarget(anchorRef.current) : null;\n const needsTopLayer = target?.needsTopLayer ?? false;\n\n /*\n * ⚠ `popover` niteligi TEK BASINA yetmez: eleman `showPopover()` cagrilana kadar `display: none`\n * kalir.\n */\n useEffect(() => {\n if (!isOpen || !needsTopLayer) return;\n return showTopLayer(surfaceRef.current);\n }, [isOpen, needsTopLayer, surfaceRef]);\n\n return {\n container: target?.container ?? null,\n attributes: needsTopLayer ? { popover: 'manual' } : NO_ATTRIBUTES,\n style: needsTopLayer ? POPOVER_RESET : NO_STYLE,\n };\n};\n\nexport default usePortalSurface;\n"],"names":["NO_ATTRIBUTES","NO_STYLE","usePortalSurface","isOpen","anchorRef","surfaceRef","target","isClient","resolvePortalTarget","needsTopLayer","useEffect","showTopLayer","POPOVER_RESET"],"mappings":";;;;AAiBA,MAAMA,IAAwC,CAAA,GACxCC,IAAkC,CAAA,GASlCC,IAAmB,CACvBC,GACAC,GACAC,MACkB;AAKlB,QAAMC,IAASH,KAAUI,EAAA,IAAaC,EAAoBJ,EAAU,OAAO,IAAI,MACzEK,KAAgBH,KAAA,gBAAAA,EAAQ,kBAAiB;AAM/C,SAAAI,EAAU,MAAM;AACd,QAAI,GAACP,KAAU,CAACM;AAChB,aAAOE,EAAaN,EAAW,OAAO;AAAA,EACxC,GAAG,CAACF,GAAQM,GAAeJ,CAAU,CAAC,GAE/B;AAAA,IACL,YAAWC,KAAA,gBAAAA,EAAQ,cAAa;AAAA,IAChC,YAAYG,IAAgB,EAAE,SAAS,aAAaT;AAAA,IACpD,OAAOS,IAAgBG,IAAgBX;AAAA,EAAA;AAE3C;"}
@@ -0,0 +1,2 @@
1
+ "use client";"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const m=require("react"),y=require("@handijit/utils"),E={top:"bottom",bottom:"top",left:"right",right:"left"},S=(t,o,e)=>e<o?o:Math.min(Math.max(t,o),e),b=(t,o,e,s,n)=>{const r=e==="top"||e==="bottom",v={top:t.top-o.height-n,bottom:t.top+t.height+n,left:t.left-o.width-n,right:t.left+t.width+n}[e],a=r?t.left:t.top,f=r?t.width:t.height,u=r?o.width:o.height,w={start:a,center:a+f/2-u/2,end:a+f-u}[s];return r?{top:v,left:w}:{top:w,left:v}},z=(t,o,e,s,n)=>({top:t.top>=s,bottom:t.top+o.height<=n.height-s,left:t.left>=s,right:t.left+o.width<=n.width-s})[e],M=(t,o,{side:e="top",align:s="center",offset:n=8,padding:r=8,isOpen:v})=>{const[a,f]=m.useState({style:{position:"fixed",top:0,left:0},side:e,anchorWidth:0,isPositioned:!1}),u=m.useRef(0),w=m.useCallback(()=>{const l=t.current,p=o.current;if(!l||!p)return;const h=l.getBoundingClientRect(),i=p.getBoundingClientRect(),d={width:window.innerWidth,height:window.innerHeight},P=b(h,i,e,s,n),L=z(P,i,e,r,d)?e:z(b(h,i,E[e],s,n),i,E[e],r,d)?E[e]:e,g=b(h,i,L,s,n);f({style:{position:"fixed",top:Math.round(S(g.top,r,d.height-i.height-r)),left:Math.round(S(g.left,r,d.width-i.width-r))},side:L,anchorWidth:h.width,isPositioned:!0})},[t,o,e,s,n,r]),c=m.useCallback(()=>{u.current||(u.current=window.requestAnimationFrame(()=>{u.current=0,w()}))},[w]);return(y.isClient()?m.useLayoutEffect:m.useEffect)(()=>{var p,h;if(!v){f(i=>i.isPositioned?{...i,isPositioned:!1}:i);return}w(),window.addEventListener("resize",c),(p=window.visualViewport)==null||p.addEventListener("resize",c),(h=window.visualViewport)==null||h.addEventListener("scroll",c),document.addEventListener("scroll",c,!0);const l=typeof ResizeObserver>"u"?null:new ResizeObserver(c);return l&&o.current&&l.observe(o.current),l&&t.current instanceof Element&&l.observe(t.current),()=>{var i,d;window.removeEventListener("resize",c),(i=window.visualViewport)==null||i.removeEventListener("resize",c),(d=window.visualViewport)==null||d.removeEventListener("scroll",c),document.removeEventListener("scroll",c,!0),l==null||l.disconnect(),u.current&&(window.cancelAnimationFrame(u.current),u.current=0)}},[v,w,c,t,o]),a};exports.default=M;
2
+ //# sourceMappingURL=usePositioning.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePositioning.cjs","sources":["../../src/hooks/usePositioning.ts"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';\n\nimport { isClient } from '@handijit/utils';\nimport {\n PositionAlign,\n PositionSide,\n PositioningOptions,\n PositioningRect,\n PositioningState,\n} from '@/types/positioning.type';\n\nconst OPPOSITE: Record<PositionSide, PositionSide> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n};\n\n/** Bir sayıyı [min, max] aralığına kırpar. */\n/**\n * Değeri aralığa sıkıştırır. Aralık geçersizse `min` kazanır: yüzey kenara yaslanır ve aşağı doğru\n * taşar.\n * ⚠ TERS ARALIK GÜVENLİ.\n */\nconst clamp = (value: number, min: number, max: number): number =>\n max < min ? min : Math.min(Math.max(value, min), max);\n\n/** Verilen kenarda yüzeyin sol-üst köşesi nereye düşer. */\nconst place = (\n anchor: PositioningRect,\n surface: { width: number; height: number },\n side: PositionSide,\n align: PositionAlign,\n offset: number,\n): { top: number; left: number } => {\n const isVertical = side === 'top' || side === 'bottom';\n\n /* Ana eksen: tetikleyicinin disinda, `offset` kadar uzakta. */\n const main = {\n top: anchor.top - surface.height - offset,\n bottom: anchor.top + anchor.height + offset,\n left: anchor.left - surface.width - offset,\n right: anchor.left + anchor.width + offset,\n }[side];\n\n /* Capraz eksen: hizalama. */\n const crossStart = isVertical ? anchor.left : anchor.top;\n const crossSize = isVertical ? anchor.width : anchor.height;\n const surfaceSize = isVertical ? surface.width : surface.height;\n\n const cross = {\n start: crossStart,\n center: crossStart + crossSize / 2 - surfaceSize / 2,\n end: crossStart + crossSize - surfaceSize,\n }[align];\n\n return isVertical ? { top: main, left: cross } : { top: cross, left: main };\n};\n\n/** Yüzey görünüm alanına sığıyor mu (yalnızca ana eksende). */\nconst fits = (\n position: { top: number; left: number },\n surface: { width: number; height: number },\n side: PositionSide,\n padding: number,\n viewport: { width: number; height: number },\n): boolean =>\n ({\n top: position.top >= padding,\n bottom: position.top + surface.height <= viewport.height - padding,\n left: position.left >= padding,\n right: position.left + surface.width <= viewport.width - padding,\n })[side];\n\n/**\n * ÇARPIŞMAYA DUYARLI KONUMLANDIRMA — `Tooltip`, `Popover`, `Menu` ve açılır listelerin ortak\n * temeli.\n */\nconst usePositioning = (\n /*\n * Capa yalniz OLCULUR: bir DOM ogesi (tetikleyici) ya da ogesi olmayan bir nokta (`ContextMenu`\n * imlec konumu — `{ getBoundingClientRect }`, 0×0 dikdortgen).\n */\n anchorRef: { current: { getBoundingClientRect: () => PositioningRect } | null },\n surfaceRef: { current: HTMLElement | null },\n { side = 'top', align = 'center', offset = 8, padding = 8, isOpen }: PositioningOptions,\n): PositioningState => {\n const [state, setState] = useState<PositioningState>({\n style: { position: 'fixed', top: 0, left: 0 },\n side,\n anchorWidth: 0,\n isPositioned: false,\n });\n\n /*\n * Olcum her karede yeniden planlanmasin: kaydirma sirasinda saniyede onlarca olay dusuyor ve her\n * biri bir yerlesim okumasi.\n */\n const frameRef = useRef(0);\n\n const measure = useCallback(() => {\n const anchor = anchorRef.current;\n const surface = surfaceRef.current;\n if (!anchor || !surface) return;\n\n const anchorRect = anchor.getBoundingClientRect();\n const surfaceRect = surface.getBoundingClientRect();\n const viewport = { width: window.innerWidth, height: window.innerHeight };\n\n /*\n * KENAR SECIMI: tercih edilen kenar sigmiyorsa KARSITI denenir; o da sigmiyorsa tercih edilene\n * donulur ve kirpma devreye girer.\n */\n const preferred = place(anchorRect, surfaceRect, side, align, offset);\n const resolvedSide = fits(preferred, surfaceRect, side, padding, viewport)\n ? side\n : fits(\n place(anchorRect, surfaceRect, OPPOSITE[side], align, offset),\n surfaceRect,\n OPPOSITE[side],\n padding,\n viewport,\n )\n ? OPPOSITE[side]\n : side;\n\n const placed = place(anchorRect, surfaceRect, resolvedSide, align, offset);\n\n /*\n * Capraz eksende KIRPMA: ekranin sag ucundaki bir tetikleyicinin balonu disari tasmak yerine\n * kenara yaslanir.\n */\n setState({\n style: {\n position: 'fixed',\n top: Math.round(clamp(placed.top, padding, viewport.height - surfaceRect.height - padding)),\n left: Math.round(clamp(placed.left, padding, viewport.width - surfaceRect.width - padding)),\n },\n side: resolvedSide,\n anchorWidth: anchorRect.width,\n isPositioned: true,\n });\n }, [anchorRef, surfaceRef, side, align, offset, padding]);\n\n const schedule = useCallback(() => {\n if (frameRef.current) return;\n frameRef.current = window.requestAnimationFrame(() => {\n frameRef.current = 0;\n measure();\n });\n }, [measure]);\n\n /*\n * `useLayoutEffect`: olcum BOYAMADAN once yapilmali. `useEffect` ile yuzey bir kare boyunca (0,\n * 0) noktasinda — ekranin sol ust kosesinde\n */\n const useIsomorphicLayoutEffect = isClient() ? useLayoutEffect : useEffect;\n\n useIsomorphicLayoutEffect(() => {\n if (!isOpen) {\n setState(current => (current.isPositioned ? { ...current, isPositioned: false } : current));\n return;\n }\n\n measure();\n\n window.addEventListener('resize', schedule);\n\n /* ⚠ `visualViewport` AYRICA dinlenir. */\n window.visualViewport?.addEventListener('resize', schedule);\n window.visualViewport?.addEventListener('scroll', schedule);\n /*\n * `capture: true` — kaydirma olayi BALONCUKLANMAZ; yakalama evresinde dinlemek, tetikleyicinin\n * kaydirilan HER atasini tek dinleyiciyle kapsar.\n */\n document.addEventListener('scroll', schedule, true);\n\n /*\n * Yuzeyin kendi olcusu degisebiliyor (icerik geldi, liste suzuldu) ve degistiginde konum yanlis\n * kalir.\n */\n const observer = typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(schedule);\n if (observer && surfaceRef.current) observer.observe(surfaceRef.current);\n /* `observe` oge ister: nokta capasi `TypeError` firlatirdi (boyutu da hic degismez). */\n if (observer && anchorRef.current instanceof Element) observer.observe(anchorRef.current);\n\n return () => {\n window.removeEventListener('resize', schedule);\n window.visualViewport?.removeEventListener('resize', schedule);\n window.visualViewport?.removeEventListener('scroll', schedule);\n document.removeEventListener('scroll', schedule, true);\n observer?.disconnect();\n\n if (frameRef.current) {\n window.cancelAnimationFrame(frameRef.current);\n frameRef.current = 0;\n }\n };\n }, [isOpen, measure, schedule, anchorRef, surfaceRef]);\n\n return state;\n};\n\nexport default usePositioning;\n"],"names":["OPPOSITE","clamp","value","min","max","place","anchor","surface","side","align","offset","isVertical","main","crossStart","crossSize","surfaceSize","cross","fits","position","padding","viewport","usePositioning","anchorRef","surfaceRef","isOpen","state","setState","useState","frameRef","useRef","measure","useCallback","anchorRect","surfaceRect","preferred","resolvedSide","placed","schedule","isClient","useLayoutEffect","useEffect","current","_a","_b","observer"],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { PositioningOptions, PositioningRect, PositioningState } from '../types/positioning.type';
2
+ /**
3
+ * ÇARPIŞMAYA DUYARLI KONUMLANDIRMA — `Tooltip`, `Popover`, `Menu` ve açılır listelerin ortak
4
+ * temeli.
5
+ */
6
+ declare const usePositioning: (anchorRef: {
7
+ current: {
8
+ getBoundingClientRect: () => PositioningRect;
9
+ } | null;
10
+ }, surfaceRef: {
11
+ current: HTMLElement | null;
12
+ }, { side, align, offset, padding, isOpen }: PositioningOptions) => PositioningState;
13
+ export default usePositioning;
@@ -0,0 +1,74 @@
1
+ "use client";
2
+ import { useState as y, useRef as V, useCallback as z, useLayoutEffect as C, useEffect as M } from "react";
3
+ import { isClient as x } from "@handijit/utils";
4
+ const E = {
5
+ top: "bottom",
6
+ bottom: "top",
7
+ left: "right",
8
+ right: "left"
9
+ }, g = (t, o, e) => e < o ? o : Math.min(Math.max(t, o), e), a = (t, o, e, s, n) => {
10
+ const r = e === "top" || e === "bottom", m = {
11
+ top: t.top - o.height - n,
12
+ bottom: t.top + t.height + n,
13
+ left: t.left - o.width - n,
14
+ right: t.left + t.width + n
15
+ }[e], v = r ? t.left : t.top, p = r ? t.width : t.height, u = r ? o.width : o.height, w = {
16
+ start: v,
17
+ center: v + p / 2 - u / 2,
18
+ end: v + p - u
19
+ }[s];
20
+ return r ? { top: m, left: w } : { top: w, left: m };
21
+ }, P = (t, o, e, s, n) => ({
22
+ top: t.top >= s,
23
+ bottom: t.top + o.height <= n.height - s,
24
+ left: t.left >= s,
25
+ right: t.left + o.width <= n.width - s
26
+ })[e], A = (t, o, { side: e = "top", align: s = "center", offset: n = 8, padding: r = 8, isOpen: m }) => {
27
+ const [v, p] = y({
28
+ style: { position: "fixed", top: 0, left: 0 },
29
+ side: e,
30
+ anchorWidth: 0,
31
+ isPositioned: !1
32
+ }), u = V(0), w = z(() => {
33
+ const l = t.current, f = o.current;
34
+ if (!l || !f) return;
35
+ const h = l.getBoundingClientRect(), i = f.getBoundingClientRect(), d = { width: window.innerWidth, height: window.innerHeight }, S = a(h, i, e, s, n), L = P(S, i, e, r, d) ? e : P(
36
+ a(h, i, E[e], s, n),
37
+ i,
38
+ E[e],
39
+ r,
40
+ d
41
+ ) ? E[e] : e, b = a(h, i, L, s, n);
42
+ p({
43
+ style: {
44
+ position: "fixed",
45
+ top: Math.round(g(b.top, r, d.height - i.height - r)),
46
+ left: Math.round(g(b.left, r, d.width - i.width - r))
47
+ },
48
+ side: L,
49
+ anchorWidth: h.width,
50
+ isPositioned: !0
51
+ });
52
+ }, [t, o, e, s, n, r]), c = z(() => {
53
+ u.current || (u.current = window.requestAnimationFrame(() => {
54
+ u.current = 0, w();
55
+ }));
56
+ }, [w]);
57
+ return (x() ? C : M)(() => {
58
+ var f, h;
59
+ if (!m) {
60
+ p((i) => i.isPositioned ? { ...i, isPositioned: !1 } : i);
61
+ return;
62
+ }
63
+ w(), window.addEventListener("resize", c), (f = window.visualViewport) == null || f.addEventListener("resize", c), (h = window.visualViewport) == null || h.addEventListener("scroll", c), document.addEventListener("scroll", c, !0);
64
+ const l = typeof ResizeObserver > "u" ? null : new ResizeObserver(c);
65
+ return l && o.current && l.observe(o.current), l && t.current instanceof Element && l.observe(t.current), () => {
66
+ var i, d;
67
+ window.removeEventListener("resize", c), (i = window.visualViewport) == null || i.removeEventListener("resize", c), (d = window.visualViewport) == null || d.removeEventListener("scroll", c), document.removeEventListener("scroll", c, !0), l == null || l.disconnect(), u.current && (window.cancelAnimationFrame(u.current), u.current = 0);
68
+ };
69
+ }, [m, w, c, t, o]), v;
70
+ };
71
+ export {
72
+ A as default
73
+ };
74
+ //# sourceMappingURL=usePositioning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePositioning.js","sources":["../../src/hooks/usePositioning.ts"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';\n\nimport { isClient } from '@handijit/utils';\nimport {\n PositionAlign,\n PositionSide,\n PositioningOptions,\n PositioningRect,\n PositioningState,\n} from '@/types/positioning.type';\n\nconst OPPOSITE: Record<PositionSide, PositionSide> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n};\n\n/** Bir sayıyı [min, max] aralığına kırpar. */\n/**\n * Değeri aralığa sıkıştırır. Aralık geçersizse `min` kazanır: yüzey kenara yaslanır ve aşağı doğru\n * taşar.\n * ⚠ TERS ARALIK GÜVENLİ.\n */\nconst clamp = (value: number, min: number, max: number): number =>\n max < min ? min : Math.min(Math.max(value, min), max);\n\n/** Verilen kenarda yüzeyin sol-üst köşesi nereye düşer. */\nconst place = (\n anchor: PositioningRect,\n surface: { width: number; height: number },\n side: PositionSide,\n align: PositionAlign,\n offset: number,\n): { top: number; left: number } => {\n const isVertical = side === 'top' || side === 'bottom';\n\n /* Ana eksen: tetikleyicinin disinda, `offset` kadar uzakta. */\n const main = {\n top: anchor.top - surface.height - offset,\n bottom: anchor.top + anchor.height + offset,\n left: anchor.left - surface.width - offset,\n right: anchor.left + anchor.width + offset,\n }[side];\n\n /* Capraz eksen: hizalama. */\n const crossStart = isVertical ? anchor.left : anchor.top;\n const crossSize = isVertical ? anchor.width : anchor.height;\n const surfaceSize = isVertical ? surface.width : surface.height;\n\n const cross = {\n start: crossStart,\n center: crossStart + crossSize / 2 - surfaceSize / 2,\n end: crossStart + crossSize - surfaceSize,\n }[align];\n\n return isVertical ? { top: main, left: cross } : { top: cross, left: main };\n};\n\n/** Yüzey görünüm alanına sığıyor mu (yalnızca ana eksende). */\nconst fits = (\n position: { top: number; left: number },\n surface: { width: number; height: number },\n side: PositionSide,\n padding: number,\n viewport: { width: number; height: number },\n): boolean =>\n ({\n top: position.top >= padding,\n bottom: position.top + surface.height <= viewport.height - padding,\n left: position.left >= padding,\n right: position.left + surface.width <= viewport.width - padding,\n })[side];\n\n/**\n * ÇARPIŞMAYA DUYARLI KONUMLANDIRMA — `Tooltip`, `Popover`, `Menu` ve açılır listelerin ortak\n * temeli.\n */\nconst usePositioning = (\n /*\n * Capa yalniz OLCULUR: bir DOM ogesi (tetikleyici) ya da ogesi olmayan bir nokta (`ContextMenu`\n * imlec konumu — `{ getBoundingClientRect }`, 0×0 dikdortgen).\n */\n anchorRef: { current: { getBoundingClientRect: () => PositioningRect } | null },\n surfaceRef: { current: HTMLElement | null },\n { side = 'top', align = 'center', offset = 8, padding = 8, isOpen }: PositioningOptions,\n): PositioningState => {\n const [state, setState] = useState<PositioningState>({\n style: { position: 'fixed', top: 0, left: 0 },\n side,\n anchorWidth: 0,\n isPositioned: false,\n });\n\n /*\n * Olcum her karede yeniden planlanmasin: kaydirma sirasinda saniyede onlarca olay dusuyor ve her\n * biri bir yerlesim okumasi.\n */\n const frameRef = useRef(0);\n\n const measure = useCallback(() => {\n const anchor = anchorRef.current;\n const surface = surfaceRef.current;\n if (!anchor || !surface) return;\n\n const anchorRect = anchor.getBoundingClientRect();\n const surfaceRect = surface.getBoundingClientRect();\n const viewport = { width: window.innerWidth, height: window.innerHeight };\n\n /*\n * KENAR SECIMI: tercih edilen kenar sigmiyorsa KARSITI denenir; o da sigmiyorsa tercih edilene\n * donulur ve kirpma devreye girer.\n */\n const preferred = place(anchorRect, surfaceRect, side, align, offset);\n const resolvedSide = fits(preferred, surfaceRect, side, padding, viewport)\n ? side\n : fits(\n place(anchorRect, surfaceRect, OPPOSITE[side], align, offset),\n surfaceRect,\n OPPOSITE[side],\n padding,\n viewport,\n )\n ? OPPOSITE[side]\n : side;\n\n const placed = place(anchorRect, surfaceRect, resolvedSide, align, offset);\n\n /*\n * Capraz eksende KIRPMA: ekranin sag ucundaki bir tetikleyicinin balonu disari tasmak yerine\n * kenara yaslanir.\n */\n setState({\n style: {\n position: 'fixed',\n top: Math.round(clamp(placed.top, padding, viewport.height - surfaceRect.height - padding)),\n left: Math.round(clamp(placed.left, padding, viewport.width - surfaceRect.width - padding)),\n },\n side: resolvedSide,\n anchorWidth: anchorRect.width,\n isPositioned: true,\n });\n }, [anchorRef, surfaceRef, side, align, offset, padding]);\n\n const schedule = useCallback(() => {\n if (frameRef.current) return;\n frameRef.current = window.requestAnimationFrame(() => {\n frameRef.current = 0;\n measure();\n });\n }, [measure]);\n\n /*\n * `useLayoutEffect`: olcum BOYAMADAN once yapilmali. `useEffect` ile yuzey bir kare boyunca (0,\n * 0) noktasinda — ekranin sol ust kosesinde\n */\n const useIsomorphicLayoutEffect = isClient() ? useLayoutEffect : useEffect;\n\n useIsomorphicLayoutEffect(() => {\n if (!isOpen) {\n setState(current => (current.isPositioned ? { ...current, isPositioned: false } : current));\n return;\n }\n\n measure();\n\n window.addEventListener('resize', schedule);\n\n /* ⚠ `visualViewport` AYRICA dinlenir. */\n window.visualViewport?.addEventListener('resize', schedule);\n window.visualViewport?.addEventListener('scroll', schedule);\n /*\n * `capture: true` — kaydirma olayi BALONCUKLANMAZ; yakalama evresinde dinlemek, tetikleyicinin\n * kaydirilan HER atasini tek dinleyiciyle kapsar.\n */\n document.addEventListener('scroll', schedule, true);\n\n /*\n * Yuzeyin kendi olcusu degisebiliyor (icerik geldi, liste suzuldu) ve degistiginde konum yanlis\n * kalir.\n */\n const observer = typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(schedule);\n if (observer && surfaceRef.current) observer.observe(surfaceRef.current);\n /* `observe` oge ister: nokta capasi `TypeError` firlatirdi (boyutu da hic degismez). */\n if (observer && anchorRef.current instanceof Element) observer.observe(anchorRef.current);\n\n return () => {\n window.removeEventListener('resize', schedule);\n window.visualViewport?.removeEventListener('resize', schedule);\n window.visualViewport?.removeEventListener('scroll', schedule);\n document.removeEventListener('scroll', schedule, true);\n observer?.disconnect();\n\n if (frameRef.current) {\n window.cancelAnimationFrame(frameRef.current);\n frameRef.current = 0;\n }\n };\n }, [isOpen, measure, schedule, anchorRef, surfaceRef]);\n\n return state;\n};\n\nexport default usePositioning;\n"],"names":["OPPOSITE","clamp","value","min","max","place","anchor","surface","side","align","offset","isVertical","main","crossStart","crossSize","surfaceSize","cross","fits","position","padding","viewport","usePositioning","anchorRef","surfaceRef","isOpen","state","setState","useState","frameRef","useRef","measure","useCallback","anchorRect","surfaceRect","preferred","resolvedSide","placed","schedule","isClient","useLayoutEffect","useEffect","current","_a","_b","observer"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use client";"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const i=require("react");let o=0,e=null;const r=()=>{if(typeof navigator>"u")return!1;const t=navigator.userAgent;return/iP(hone|ad|od)/.test(t)?!0:/Macintosh/.test(t)&&navigator.maxTouchPoints>1},d=()=>{if(o+=1,o>1)return;const{body:t,style:l}={body:document.body,style:document.documentElement.style},n=window.scrollY;e={overflow:t.style.overflow,position:t.style.position,top:t.style.top,width:t.style.width,paddingRight:t.style.paddingRight,scrollY:n};const s=window.innerWidth-document.documentElement.clientWidth;s>0&&(t.style.paddingRight=`${s}px`),l.setProperty("scrollbar-gutter","stable"),t.style.overflow="hidden",r()&&(t.style.position="fixed",t.style.top=`${-n}px`,t.style.width="100%")},u=()=>{if(o=Math.max(0,o-1),o>0||!e)return;const{body:t}=document,{scrollY:l}=e;t.style.overflow=e.overflow,t.style.position=e.position,t.style.top=e.top,t.style.width=e.width,t.style.paddingRight=e.paddingRight,document.documentElement.style.removeProperty("scrollbar-gutter"),e=null,window.scrollTo(0,l)},c=(t=!0)=>{i.useEffect(()=>{if(t)return d(),u},[t])};exports.default=c;
2
+ //# sourceMappingURL=useScrollLock.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useScrollLock.cjs","sources":["../../src/hooks/useScrollLock.ts"],"sourcesContent":["'use client';\n\nimport { useEffect } from 'react';\n\n/**\n * SAYFA KAYDIRMA KİLİDİ — sayaçlı, tek yerde.\n * @param isLocked Kilit bu örnek için etkin mi.\n */\n\n/* Kac tane acik panel var. */\nlet lockCount = 0;\n\n/** Kilit yazılmadan önceki hâl — SON kapanışta buradan geri yüklenir. */\nlet previous: {\n overflow: string;\n position: string;\n top: string;\n width: string;\n paddingRight: string;\n scrollY: number;\n} | null = null;\n\n/**\n * iOS Safari mi? `userAgent` üzerinden Apple dokunmatik cihazı testi hem kaldırılmamış hem daha\n * dar: iPadOS 13+ masaüstü UA'sı gönderdiği için…\n * ⚠ `navigator.platform` KULLANILMAZ — spesifikasyondan KALDIRILDI ve tarayıcılar onu\n * dondurulmuş/uydurma değerlerle döndürüyor.\n */\nconst isIOS = (): boolean => {\n if (typeof navigator === 'undefined') return false;\n\n const ua = navigator.userAgent;\n if (/iP(hone|ad|od)/.test(ua)) return true;\n\n /* iPadOS 13+ kendini masaüstü Safari gibi tanıtıyor. */\n return /Macintosh/.test(ua) && navigator.maxTouchPoints > 1;\n};\n\nconst lock = (): void => {\n lockCount += 1;\n if (lockCount > 1) return;\n\n const { body, style: rootStyle } = { body: document.body, style: document.documentElement.style };\n const scrollY = window.scrollY;\n\n previous = {\n overflow: body.style.overflow,\n position: body.style.position,\n top: body.style.top,\n width: body.style.width,\n paddingRight: body.style.paddingRight,\n scrollY,\n };\n\n /* Cubugun genisligi: `scrollbar-gutter` desteklenmiyorsa dolgu olarak yazilir. */\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\n if (scrollbarWidth > 0) body.style.paddingRight = `${scrollbarWidth}px`;\n\n rootStyle.setProperty('scrollbar-gutter', 'stable');\n body.style.overflow = 'hidden';\n\n if (isIOS()) {\n body.style.position = 'fixed';\n body.style.top = `${-scrollY}px`;\n body.style.width = '100%';\n }\n};\n\nconst unlock = (): void => {\n lockCount = Math.max(0, lockCount - 1);\n if (lockCount > 0 || !previous) return;\n\n const { body } = document;\n const { scrollY } = previous;\n\n body.style.overflow = previous.overflow;\n body.style.position = previous.position;\n body.style.top = previous.top;\n body.style.width = previous.width;\n body.style.paddingRight = previous.paddingRight;\n document.documentElement.style.removeProperty('scrollbar-gutter');\n\n previous = null;\n\n /*\n * Govde sabitlenmisken kaydirma konumu sifirlaniyor; geri yazilmazsa kullanici pencereyi\n * kapattiginda sayfanin en basina duser.\n */\n window.scrollTo(0, scrollY);\n};\n\nconst useScrollLock = (isLocked = true): void => {\n useEffect(() => {\n if (!isLocked) return;\n\n lock();\n return unlock;\n }, [isLocked]);\n};\n\nexport default useScrollLock;\n"],"names":["lockCount","previous","isIOS","ua","lock","body","rootStyle","scrollY","scrollbarWidth","unlock","useScrollLock","isLocked","useEffect"],"mappings":"kJASA,IAAIA,EAAY,EAGZC,EAOO,KAQX,MAAMC,EAAQ,IAAe,CAC3B,GAAI,OAAO,UAAc,IAAa,MAAO,GAE7C,MAAMC,EAAK,UAAU,UACrB,MAAI,iBAAiB,KAAKA,CAAE,EAAU,GAG/B,YAAY,KAAKA,CAAE,GAAK,UAAU,eAAiB,CAC5D,EAEMC,EAAO,IAAY,CAEvB,GADAJ,GAAa,EACTA,EAAY,EAAG,OAEnB,KAAM,CAAE,KAAAK,EAAM,MAAOC,CAAA,EAAc,CAAE,KAAM,SAAS,KAAM,MAAO,SAAS,gBAAgB,KAAA,EACpFC,EAAU,OAAO,QAEvBN,EAAW,CACT,SAAUI,EAAK,MAAM,SACrB,SAAUA,EAAK,MAAM,SACrB,IAAKA,EAAK,MAAM,IAChB,MAAOA,EAAK,MAAM,MAClB,aAAcA,EAAK,MAAM,aACzB,QAAAE,CAAA,EAIF,MAAMC,EAAiB,OAAO,WAAa,SAAS,gBAAgB,YAChEA,EAAiB,IAAGH,EAAK,MAAM,aAAe,GAAGG,CAAc,MAEnEF,EAAU,YAAY,mBAAoB,QAAQ,EAClDD,EAAK,MAAM,SAAW,SAElBH,MACFG,EAAK,MAAM,SAAW,QACtBA,EAAK,MAAM,IAAM,GAAG,CAACE,CAAO,KAC5BF,EAAK,MAAM,MAAQ,OAEvB,EAEMI,EAAS,IAAY,CAEzB,GADAT,EAAY,KAAK,IAAI,EAAGA,EAAY,CAAC,EACjCA,EAAY,GAAK,CAACC,EAAU,OAEhC,KAAM,CAAE,KAAAI,GAAS,SACX,CAAE,QAAAE,GAAYN,EAEpBI,EAAK,MAAM,SAAWJ,EAAS,SAC/BI,EAAK,MAAM,SAAWJ,EAAS,SAC/BI,EAAK,MAAM,IAAMJ,EAAS,IAC1BI,EAAK,MAAM,MAAQJ,EAAS,MAC5BI,EAAK,MAAM,aAAeJ,EAAS,aACnC,SAAS,gBAAgB,MAAM,eAAe,kBAAkB,EAEhEA,EAAW,KAMX,OAAO,SAAS,EAAGM,CAAO,CAC5B,EAEMG,EAAgB,CAACC,EAAW,KAAe,CAC/CC,EAAAA,UAAU,IAAM,CACd,GAAKD,EAEL,OAAAP,EAAA,EACOK,CACT,EAAG,CAACE,CAAQ,CAAC,CACf"}
@@ -0,0 +1,2 @@
1
+ declare const useScrollLock: (isLocked?: boolean) => void;
2
+ export default useScrollLock;