@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
package/README.md CHANGED
@@ -1,3 +1,873 @@
1
- # Temporary Holding Version
1
+ # @handijit/ui
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Erişilebilir, tema güdümlü React bileşen kütüphanesi. SCSS Modules üzerine
4
+ kurulu; tek çalışma zamanı bağımlılığı ikon seti (`react-bootstrap-icons`).
5
+
6
+ - **Tek CSS dosyası, iki tema.** Açık ve koyu hazır gelir, her token dışarıdan
7
+ ezilebilir.
8
+ - **Yönlendirici enjekte edilir.** `next/link`, `react-router`, ham `<a>` —
9
+ karar tüketicinin.
10
+ - **Metin dışarıdan, ama BİR KEZ.** Kütüphane hiçbir dilde metin uydurmaz;
11
+ kullanıcıya görünen dizeler sağlayıcıda tek yerde tanımlanır.
12
+ - **Yerel öğeler korunur.** `<dialog>`, `<input type="range">`,
13
+ `<input type="radio">` — odak tuzağı, klavye gezinmesi ve ekran okuyucu
14
+ duyurusu tarayıcıdan gelir.
15
+ - **Üç alt giriş, ana pakete sıfır bayt.** `@handijit/ui/chat` (sohbet ve
16
+ araç arayüzleri), `@handijit/ui/charts` (bağımlılıksız SVG grafikleri),
17
+ `@handijit/ui/scss` (token değişkenleri ve mixin'ler). Kullanmayan uygulama
18
+ onları indirmez.
19
+
20
+ ```bash
21
+ npm install @handijit/ui @handijit/utils react-bootstrap-icons
22
+ ```
23
+
24
+ `react`, `react-dom`, `@handijit/utils` ve `react-bootstrap-icons`
25
+ **peer** bağımlılıktır.
26
+
27
+ ---
28
+
29
+ ## Hızlı başlangıç
30
+
31
+ ```tsx
32
+ import { Button, Field, Input, UIVariant } from '@handijit/ui';
33
+
34
+ <Field label="E-posta" isRequired error={error}>
35
+ {props => <Input {...props} type="email" value={email} onChange={onChange} />}
36
+ </Field>
37
+
38
+ <Button variant={UIVariant.PRIMARY} isLoading={isSaving} onClick={save}>
39
+ Kaydet
40
+ </Button>;
41
+ ```
42
+
43
+ Sağlayıcı **zorunlu değil**: paket kurulup hiçbir yapılandırma yapılmadan
44
+ çalışır. Bağlantılar ham `<a>` olur, tema varsayılanlarda kalır.
45
+
46
+ **CSS tek dosya olarak alınır.** Uygulamanın kökünde bir kez:
47
+
48
+ ```tsx
49
+ import '@handijit/ui/styles.css';
50
+ ```
51
+
52
+ Alt küme isteyen tüketici `base.css` (token'lar, kutu modeli, `@keyframes`) ile
53
+ kullandığı bileşenlerin `components/<Ad>/style.css` dosyalarını **kendi
54
+ derlemesinde tek dosyaya** birleştirir:
55
+
56
+ ```scss
57
+ // styles/ui.scss — Sass düz CSS dosyalarını içine alır.
58
+ @use '@handijit/ui/base.css';
59
+ @use '@handijit/ui/components/Button/style.css';
60
+ @use '@handijit/ui/components/Chip/style.css';
61
+ ```
62
+
63
+ JS modülleri CSS içe aktarmaz; bu bilinçli: Turbopack'te her istemci sınırının
64
+ CSS'i ayrı dosyaya düşüyor ve render-blocking dosya sayısı LCP'yi bayttan çok
65
+ etkiliyordu (`CHANGELOG.md` → 1.0.0).
66
+
67
+ Her bileşenin alt yolu var — `@handijit/ui/button`, `/chip-group`,
68
+ `/combobox`… — ama cephe (`@handijit/ui`) saf yeniden dışa aktarım olduğu
69
+ için paketleyici ikisinden de aynı dosyaya iner.
70
+
71
+ ---
72
+
73
+ ## Tema
74
+
75
+ ### Tema seçimi `<html>` üzerinde taşınır
76
+
77
+ ```html
78
+ <html data-ui-theme="dark">
79
+ ```
80
+
81
+ Öznitelik yoksa `prefers-color-scheme` yedeği devreye girer — ama kullanıcının
82
+ **açık bir seçimi** varsa sistem tercihi onu ezmez.
83
+
84
+ ### İlk boyamadan önce yazın — `UiThemeScript`
85
+
86
+ ```tsx
87
+ // app/layout.tsx — sunucu düzeni, <head> içine.
88
+ import { UiThemeScript } from '@handijit/ui';
89
+
90
+ <head>
91
+ <UiThemeScript storageKey="theme" />
92
+ </head>;
93
+ ```
94
+
95
+ Kayıtlı açık seçimi (`light` / `dark`) `<html data-ui-theme>`e yazar; kayıt
96
+ yoksa sistem tercihi izlenir. Satır içi betik HTML ayrıştırılırken çalışır.
97
+
98
+ Bu iş sağlayıcıya bırakılamaz: sağlayıcı ağaç monte olduktan sonra çalışıyor ve
99
+ koyu tema seçmiş kullanıcı o ana kadar **bir kare beyaz ekran** görüyor.
100
+ ⚠ Bir **bileşen**, fonksiyon değil: paket `'use client'` taşıdığı için dışa
101
+ verilen düz bir fonksiyon Next'in sunucu düzeninde çağrılamıyor.
102
+
103
+ ### Token'ları ezmek
104
+
105
+ Yalnızca değiştirdiğiniz token'ı verin; gerisi varsayılanında kalır.
106
+
107
+ ```tsx
108
+ import { UiProvider } from '@handijit/ui';
109
+
110
+ const THEME = {
111
+ light: { link: '#0a58ca', 'ring-color': '#0d6efd' },
112
+ dark: { link: '#6ea8fe' },
113
+ fonts: { heading: 'Archivo, sans-serif', body: 'Inter, sans-serif' },
114
+ // Ölçüler tema başına DEĞİL: bir markanın yuvarlaklığı açık temada
115
+ // 12 px, koyu temada 8 px olmaz.
116
+ metrics: { 'radius-md': '2px', 'radius-lg': '4px', 'duration-normal': '120ms' },
117
+ };
118
+
119
+ <UiProvider theme={THEME} linkComponent={NextLink}>
120
+ <App />
121
+ </UiProvider>;
122
+ ```
123
+
124
+ Sağlayıcı ezmeyi çocuklarından önce bir `<style>` olarak **çizer**: sunucu
125
+ çıktısında da vardır, ilk boyamada uygulanır; hidrasyondan sonra hiçbir renk
126
+ değişmez. Bu yüzden sağlayıcı `<body>` içinde durur, `<html>`i saramaz.
127
+
128
+ Ezme `@layer ui` içindedir: aynı token'ı kendi CSS'inizde ezerseniz
129
+ (`html:has(.panel) { --ui-danger-solid: #dc2626 }`) sizinki özgüllüğe ve
130
+ sıraya bakılmaksızın kazanır. Açık temaya verilen değer koyu temaya sızmaz;
131
+ koyu temada da istiyorsanız `dark`a da yazın.
132
+
133
+ React'in dışından (Storybook'tan, stil sayfalarından sonra çalışan bir
134
+ betikten) aynı işi `initUi({ theme })` yapar; ezmeyi `<head>`in sonuna
135
+ yazar. ⚠ Stil sayfalarınızdan **önce** çağırmayın: `@layer ui` belgede ilk
136
+ kez orada görülürse katman sırası oradan kurulur ve sonra gelen
137
+ `@layer reset, @handijit/ui;` bildiriminiz `reset`i kütüphanenin üstüne koyar.
138
+
139
+ **Kütüphane font YÜKLEMEZ.** `fonts` yalnızca `font-family` dizesi; yüklemeyi
140
+ (`next/font`, `@font-face`, CDN) siz yaparsınız. Bir UI paketinin ağdan font
141
+ çekmesi, sizin ölçemediğiniz bir istek demek.
142
+
143
+ #### Ezilebilen ölçüler
144
+
145
+ `radius-*` · `space-0…9` · `font-size-2xs…4xl` · `leading-*` · `icon-xs…xl` ·
146
+ `duration-*` · `ease-*` — tam liste `METRIC_TOKENS` içinde ve dışa veriliyor.
147
+
148
+ Ezilemeyenler ve nedenleri: **kırılma noktaları** (`@media (max-width: var(--x))`
149
+ geçersiz CSS), **katman (`z-*`)** (yığılma sırası, marka kararı değil) ve
150
+ **dokunma hedefi** (44 px; yoğun kipte de küçülmemeli — WCAG 2.5.8).
151
+
152
+ ### Bilgi yoğunluğu
153
+
154
+ ```html
155
+ <html data-ui-density="compact"></html>
156
+ ```
157
+
158
+ Satır yüksekliği, dolgu ve punto bir kademe iner. Vitrin bir ekranda 8 satır,
159
+ operasyon paneli 80 satır gösteriyor; ikisini tek ölçekle karşılamanın yolu yok.
160
+ Kararı `initUi({ density: 'compact' })` da verebilir.
161
+
162
+ **Yarıçap değişmez** (yuvarlaklık yoğunluğun değil markanın işi) ve **dokunma
163
+ hedefi küçülmez**: görsel kutu daralır, `tap-target` örtüsü 44 px kalır.
164
+
165
+ ### CSS'imizi ezmek — `@layer ui`
166
+
167
+ Kütüphane CSS'inin tamamı `@layer ui` içinde — tema ezmeleri
168
+ (`UiProvider theme`, `initUi`) dahil. Katmanlı bir kural, katmansız
169
+ bir kurala **her zaman yenilir** — özgüllüğe ve sıraya bakılmaksızın:
170
+
171
+ ```css
172
+ /* Bu kadarı yeter; `!important` ya da `.app .card .card` gerekmez. */
173
+ .my-card {
174
+ padding: 0;
175
+ }
176
+ ```
177
+
178
+ Katman olmadan sizin sınıfınız ile bizimki aynı özgüllükte (0,1,0) yarışıyordu
179
+ ve kazananı **kaynak sırası** belirliyordu; o sıra da bundler'ınızın elinde —
180
+ geliştirme ile üretim aynı olmak zorunda değil.
181
+
182
+ ### Temayı değiştirmek
183
+
184
+ ```tsx
185
+ const { scheme, preference, setScheme, toggle, isReady } = useUiTheme();
186
+
187
+ useEffect(() => {
188
+ if (isReady) localStorage.setItem('theme', preference);
189
+ }, [preference, isReady]);
190
+ ```
191
+
192
+ | Alan | |
193
+ | --- | --- |
194
+ | `scheme` | **ÇÖZÜLMÜŞ** tema — ekranda çizili olan (`light` \| `dark`) |
195
+ | `preference` | kullanıcının **SEÇİMİ** (`light` \| `dark` \| `system`) |
196
+ | `setScheme` | `'system'` verildiğinde açık seçim SİLİNİR |
197
+
198
+ Üç durumlu bir anahtar (Açık / Koyu / Sistem) `preference` okur; `scheme`
199
+ okusaydı "Sistem" seçiliyken düğme "Koyu"yu işaretli gösterirdi. `system` bir
200
+ değer değil **değerin yokluğu**: öznitelik silinir ve
201
+ `:not([data-ui-theme])` sorgusu devreye girer.
202
+
203
+ Kalıcılık **kancanın işi değil**: seçimi `localStorage`a mı, sunucuda
204
+ okunabilsin diye bir çereze mi, kullanıcı profiline mi yazacağınız sizin
205
+ kararınız. Kütüphane `localStorage`a yazsaydı sunucu tarafı onu okuyamayacağı
206
+ için ilk boyama yine yanlış temada olurdu.
207
+
208
+ `isReady`: sunucu çıktısında ve hidrasyondan önceki ilk karede `false`. Tema
209
+ anahtarını çizmeden önce bekleyin — sunucu hangi temanın seçili olduğunu
210
+ bilmiyor ve bir tahminle çizilen anahtar, doğru tahmin edilse bile hidrasyonda
211
+ uyuşmazlık üretiyordu.
212
+
213
+ ### Token katmanları
214
+
215
+ ```
216
+ theme/palette.ts → ham hex (TEK hex kaynağı)
217
+ theme/tokens.ts → anlamsal token → değer
218
+ LIGHT_THEME / DARK_THEME (renk, temaya bağlı)
219
+ METRIC_TOKENS (ölçü, temadan bağımsız)
220
+ COMPACT_DENSITY (yoğun kipin ezdikleri)
221
+ styles/*.generated → yukarıdakinden ÜRETİLİR (npm run tokens)
222
+ ```
223
+
224
+ SCSS ve TypeScript tarafı elle tutulsaydı bir tarafta var olup diğerinde
225
+ olmayan bir token çıkardı — ve ayrışma sessiz: bileşen `var(--ui-yok)`
226
+ okuyup rengini kaybediyor, derleme yeşil dönüyor. Nöbetçi
227
+ `theme/__tests__/tokens.contract.test.ts`.
228
+
229
+ **Ölçüler CSS değişkeni olduğu için SCSS aritmetiği çalışmaz.**
230
+ `$space-8 - $space-2` derlenmez — ve Sass hata da vermez: ifadeyi olduğu gibi
231
+ geçirip tarayıcıya `var(--a)-var(--b)` yazar, tarayıcı bütün bildirimi atar.
232
+ Hesap `calc()` içinde yazılır, negatif değer dahil:
233
+
234
+ ```scss
235
+ padding-inline-start: calc(#{$space-8} - #{$space-2});
236
+ margin-inline: calc(-1 * #{$space-2});
237
+ ```
238
+
239
+ ---
240
+
241
+ ## Metinler
242
+
243
+ Kütüphane "Kapat" yazamaz: hangi dilde, hangi üslupta, hangi terimle
244
+ yazacağını bilmez. Ama aynı dizeyi yüz çağrı yerine dağıtmak da doğru değil —
245
+ biri değiştiğinde doksan dokuzu eski kalıyor. Metinler **bir kez**, sağlayıcıda
246
+ verilir:
247
+
248
+ ```tsx
249
+ <UiProvider
250
+ labels={{
251
+ close: 'Kapat',
252
+ cancel: 'Vazgeç',
253
+ submit: 'Kaydet',
254
+ loading: 'Yükleniyor',
255
+ required: '(zorunlu)',
256
+ filters: 'Filtreler',
257
+ breadcrumb: 'Konum',
258
+ directoryJump: 'Harfe göre atla',
259
+ selectPlaceholder: 'Seçiniz',
260
+ locale: 'tr',
261
+ currency: '₺',
262
+ combobox: {
263
+ searchPlaceholder: 'Ara…',
264
+ emptyMessage: 'Sonuç bulunamadı',
265
+ loadingMessage: 'Aranıyor…',
266
+ clearLabel: 'Seçimi temizle',
267
+ },
268
+ pagination: { label: 'Sayfalar', previous: 'Önceki sayfa', next: 'Sonraki sayfa' },
269
+ quantity: { label: 'Adet', decrease: 'Adeti azalt', increase: 'Adeti artır' },
270
+ range: { min: 'En az', max: 'En çok' },
271
+ dataTable: { empty: 'Kayıt bulunamadı.', loading: 'Yükleniyor…' },
272
+ copyField: {
273
+ copy: value => `${value} kopyala`,
274
+ copied: value => `${value} kopyalandı`,
275
+ announcement: 'Panoya kopyalandı',
276
+ },
277
+ rating: {
278
+ srLabel: (value, count) => `5 üzerinden ${value}${count ? `, ${count} değerlendirme` : ''}`,
279
+ starCount: star => `${star} yıldız`,
280
+ scale: { 1: 'Hiç memnun kalmadım', 2: 'Beklentimi karşılamadı', 3: 'İdare eder', 4: 'Memnun kaldım', 5: 'Çok memnun kaldım' },
281
+ },
282
+ }}
283
+ >
284
+ ```
285
+
286
+ **Çözümleme sırası: prop → config → geliştirme uyarısı.** Bir prop verilmişse o
287
+ kazanır; bağlama göre farklı olması gereken yerlerde (`closeLabel="Daha sonra"`)
288
+ hâlâ prop geçilir.
289
+
290
+ ### Config'e girmeyenler
291
+
292
+ Öğeye **özgü** hiçbir metin config'e girmez — her çağrı yerinde farklı olduğu
293
+ için bir uygulama düzeyinde varsayılanı olamaz:
294
+
295
+ `Modal.title` · `ConfirmDialog.confirmLabel` ("Sil" — eylemi tekrarlamak
296
+ zorunda; "Tamam" kullanıcıya neyi onayladığını söylemez) · `IconButton.label` ·
297
+ `Select.label` · `Combobox.labels.placeholder` · `TableCheckbox.label` ·
298
+ `ChipGroup.label` · `RatingInput.label`
299
+
300
+ ### Eksik metin nasıl görünür
301
+
302
+ TypeScript sağlayıcının çalışma zamanında ne taşıdığını göremiyor, o yüzden
303
+ prop'lar isteğe bağlı. Ne prop ne config varsa öğe adsız kalır ve bu geliştirme
304
+ kipinde konsola düşer:
305
+
306
+ ```
307
+ [@handijit/ui] Eksik metin: Modal.closeLabel. Prop olarak geçin ya da
308
+ <UiProvider labels={…}> içinde bir kez tanımlayın.
309
+ ```
310
+
311
+ Uyarı anahtar başına bir kez verilir; yirmi satırlık bir liste konsolu
312
+ doldurmaz.
313
+
314
+ ---
315
+
316
+ ## Yönlendirici
317
+
318
+ ```tsx
319
+ import NextLink from 'next/link';
320
+
321
+ <UiProvider linkComponent={NextLink}>…</UiProvider>;
322
+ ```
323
+
324
+ Bir bileşen kütüphanesi kendi yönlendiricisini **seçemez**: `next/link` import
325
+ etmek paketi Next'e bağlar, `react-router` import etmek başka bir uygulamayı
326
+ kırar.
327
+
328
+ Yönlendiriciye özgü props `linkProps` ile geçer:
329
+
330
+ ```tsx
331
+ <Pagination buildHref={page => `?sayfa=${page}`} linkProps={{ scroll: false }} … />
332
+ ```
333
+
334
+ ---
335
+
336
+ ## Sayfalamada başa dönme
337
+
338
+ Sayfa değiştiren tıklamadan sonra pencereyi başa almak bir **prop**tur; çağıran
339
+ tarafta kaydırma kodu yazılmaz:
340
+
341
+ ```tsx
342
+ <Pagination page={page} totalPages={totalPages} scrollTo="top" … />
343
+ ```
344
+
345
+ İki kipte de çalışır (`buildHref` ve `onPageChange`). Kaydırma anidir ve üç
346
+ durumda **yapılmaz**: etkin sayfaya basıldığında, yeni sekmede açan tıklamada
347
+ (Ctrl/Cmd/orta tuş) ve prop verilmediğinde.
348
+
349
+ ⚠ Sayfa içindeki bir listenin sayfalamasında (sekme içi değerlendirme listesi
350
+ gibi) **verilmez** — kullanıcıyı okuduğu bölümden sayfanın tepesine atar.
351
+
352
+ ---
353
+
354
+ ## Yapışkan başlık
355
+
356
+ Sayfa kaydırmasına yapışan bileşenler (`DirectoryGroup`, `DirectoryJump`,
357
+ kapaklı `DataTable`) offset'i `--ui-header-height`ten okur ve **varsayılanı
358
+ 0**. Kendi yapışkan bandınız varsa gerçek ölçüyü yazın:
359
+
360
+ ```tsx
361
+ useEffect(() => {
362
+ const observer = new ResizeObserver(([entry]) =>
363
+ document.documentElement.style.setProperty(
364
+ '--ui-header-height',
365
+ `${entry.contentRect.height}px`,
366
+ ),
367
+ );
368
+ observer.observe(headerRef.current!);
369
+ return () => observer.disconnect();
370
+ }, []);
371
+ ```
372
+
373
+ Sabit bir sayı yazmayın: bant mobilde arama kutusu kendi satırına düştüğünde
374
+ büyür, bir duyuru şeridi çıkıp kaybolduğunda değişir.
375
+
376
+ ---
377
+
378
+ ## Bileşen kataloğu
379
+
380
+ | Grup | Bileşenler |
381
+ | --- | --- |
382
+ | Eylem | `Button` · `IconButton` · `TextLink` · `Tooltip` · `Menu` · `ContextMenu` · `Popover` |
383
+ | Seçim | `Chip` · `ChipGroup` · `SegmentedControl` · `Select` · `Combobox` · `Checkbox` · `Switch` · `Radio` · `RadioCard` · `RangeSlider` · `RatingInput` · `QuantityStepper` · `TableCheckbox` |
384
+ | Girdi | `Input` · `PasswordInput` · `Textarea` · `TagInput` · `DateField` · `FileUpload` · `Field` |
385
+ | Yüzey | `Card` (+ `CardMedia`, `CardOverlay`, `CardBody`, `CardFooter`) · `SummaryCard` · `Panel` (+ `PanelForm`, `PanelRow`) · `PageHeader` · `SectionHeader` · `Tile` · `Directory` (+ `DirectoryGroup`, `DirectoryRow`, `DirectoryJump`) · `Carousel` · `ScrollArea` · `Disclosure` · `Accordion` · `Tabs` |
386
+ | Geri bild. | `Alert` · `Badge` · `StatusDot` · `CodeBadge` · `Kbd` · `EmptyState` · `Skeleton` (+ `SkeletonCard`, `SkeletonRows`, `SkeletonTable`) · `Spinner` · `Progress` · `Steps` · `Divider` · `Avatar` · `Rating` · `Price` · `Stat` · `CopyField` · `Breadcrumb` · `ToastHub` (+ `ToastPortal`) |
387
+ | Kipsel | `Modal` · `Drawer` · `BottomSheet` · `ConfirmDialog` · `PromptDialog` · `CommandPalette` |
388
+ | Veri | `Table` (+ `TableScroller`) · `DataTable` (+ `DataTableRow`) · `FilterBar` (+ `FilterBarField`) · `Pagination` · `Timeline` |
389
+ | Tema ve kancalar | `UiProvider` · `UiThemeScript` · `initUi` · `useUi` · `useUiTheme` · `useUiTokens` · `useAnnounce` · `useStickToBottom` · `usePositioning` · `useVirtualList` · `useListboxNavigation` · `hasOpenSurface` |
390
+ | Sohbet — `/chat` | `ChatThread` · `ChatMessage` · `PromptInput` · `PromptSuggestions` · `Prose` · `CodeBlock` · `ReasoningBlock` (+ `ReasoningText`) · `ToolCall` (+ `ToolCallSection`) · `TerminalOutput` · `SourceList` · `Citation` · `MessageActions` · `AppBar` · `ActionList` (+ `ActionListItem`) · `SegmentBar` · `Legend` · `DescriptionList` |
391
+ | Grafik — `/charts` | `LineChart` · `AreaChart` · `BarChart` · `ComposedChart` · `PieChart` · `ScatterPlot` · `Heatmap` · `BoxPlot` · `Histogram` · `RadarChart` |
392
+
393
+ Alt girişlerin stilleri ayrı dosyada ve `styles.css`ten **sonra** içe aktarılır:
394
+ `@handijit/ui/chat.css`, `@handijit/ui/charts.css`.
395
+
396
+ ### Seçenek sayısı öğeyi belirler
397
+
398
+ | Seçenek sayısı | Öğe |
399
+ | -------------- | ----------------------------------------------- |
400
+ | ≤7 | `ChipGroup` — hepsi ekranda, tek dokunuş |
401
+ | 5–20 | `Select` — aramasız liste; mobilde alt sayfa |
402
+ | 20+ | `Combobox` — yazarak ara |
403
+ | Aralık | `RangeSlider` (+ kesin değer için sayı girdisi) |
404
+ | Tekil aç/kapa | `Checkbox` |
405
+
406
+ Hepsini onay kutusu listesi yapmak tek tip ama kötü bir arayüzdür: 1121 markayı
407
+ da 3 seçeneği de aynı biçimde göstermek, ikisini de yanlış gösterir.
408
+
409
+ ---
410
+
411
+ ## Sistemin taşıdığı kararlar
412
+
413
+ **Zemin mürekkep ve kâğıt, yeşil eylemdir.** Nötrler sıcak mürekkep ekseninde
414
+ (açık sayfa `#faf9f5`, koyu sayfa `#141413`); markanın yeşili yalnızca birincil
415
+ eylemde, bağlantıda, odak halkasında ve marka işaretinde. Seçim — etkin sayfa,
416
+ seçili çip, sekme çizgisi, ilerleme, onay kutusu, anahtar — mürekkeptir.
417
+ Yeşilin yayılmasını `green-footprint.test.ts` derleme hatasına çevirir.
418
+
419
+ **Doygun dolgu = tıklanabilir.** Durum etiketleri **her zaman** tint zeminli
420
+ (`Badge`, `Alert`), eylemler **her zaman** dolgulu veya çerçeveli. Bu ayrım
421
+ bozulduğunda kullanıcı durum etiketine tıklamayı deniyor. `Badge`in `solid`
422
+ varyantı durum tonlarında bilinçli olarak `soft` ile aynı şeyi verir.
423
+
424
+ **Bir ekranda tek `PRIMARY`.** `UIVariant` bir vurgu hiyerarşisi: iki dolu düğme
425
+ yan yana durduğunda hiçbiri öne çıkmaz. `UIVariant.CART` ekrandaki en parlak
426
+ yeşil — dönüşüm eylemi; birincil eylemden (koyu çam) aydınlıkla ayrışır.
427
+
428
+ **Renk tek başına anlam taşımaz** (WCAG 1.4.1). Her durum bir metin, ikon veya
429
+ işaretle de bildirilir: `Alert`in her tonunun kendi ikonu var, `Field`in zorunlu
430
+ yıldızının yanında okunabilir bir metin, `RatingInput`in yıldızlarının altında
431
+ açıklama duruyor.
432
+
433
+ **İkonlar `react-bootstrap-icons`ten, DOLU sürümüyle.** Kabuk simgeleri
434
+ (`Modal`ın kapatma çarpısı, `Select`in oku, `Alert`in durum ikonu) bir zamanlar
435
+ kütüphanenin içinde elle çizilmiş yollardı; bir ikon setinin bakımını üstlenmek
436
+ hiçbir şey kazandırmıyordu — tüketici uygulamalar kendi içerik ikonlarını zaten
437
+ aynı setten alıyor ve paket `external`, yani ikinci bir kopya inmiyor. Dolu
438
+ (`*Fill`) sürüm kural: ince konturlu bir simge, tint zeminde ve küçük ölçüde
439
+ tek piksele inip kayboluyor. Fill eşi olmayan simgelerde (`X`, `Check`, `Plus`,
440
+ `Dash`) kalın `*Lg` sürümü kullanılır, chevron yerine dolu `Caret*Fill` —
441
+ böylece bütün kabuk aynı çizgi ağırlığında kalır. İçerik ikonları (kategori
442
+ simgesi, marka logosu) her zaman `ReactNode` prop'u olarak DIŞARIDAN gelir.
443
+
444
+ **İkon ölçüsü metin puntosundan ayrıdır.** İkonlar `1em` ile ölçeklenir ama
445
+ taşındıkları kutunun `font-size` değeri metin için seçilmiştir ve simge için
446
+ küçük kalır: 40 px'lik bir `IconButton`ın ortasındaki 16 px'lik simge tıklanabilir
447
+ görünmüyordu. Ölçek ayrı bir token dizisidir (`$icon-xs` … `$icon-xl`,
448
+ 14/16/18/20/24 px) ve ikon taşıyan her kutu puntosunu oradan alır.
449
+
450
+ **"Yüklenemedi" ile "boş" ayrı durumlardır.** `DataTable`da `error` verilmişken
451
+ boş mesajı **asla** çizilmez; bir ağ hatasını "kayıt kalmamış" diye okutmak
452
+ kullanıcıya yanlış karar verdirir.
453
+
454
+ **Yerel öğe, taklit öğeden iyidir.** `<dialog>`, `<input type="range">`,
455
+ `<input type="radio">` korunur. Tek istisna `<select>`: açılır listesinin içine
456
+ hiçbir biçimde girilemiyor ve mobil tekerleği uygulamanın geri kalanına hiç
457
+ benzemiyor. Bedeli (odak yönetimi, ok tuşları, `aria-activedescendant`) bir kez
458
+ ödenip tek bileşene kapatıldı.
459
+
460
+ **Dokunma hedefi en az 44×44 px** (WCAG 2.5.8). Görsel kutu daha küçük olabilir;
461
+ tıklanabilir alan görünmez bir örtüyle korunur.
462
+
463
+ **Geçişler 200 ms'yi geçmez** — tek istisna dipten açılan panel
464
+ (`duration-slow`, 320 ms) — ve `prefers-reduced-motion` her animasyonda
465
+ karşılanır.
466
+
467
+ **Odak halkası `:focus-visible` ile.** `:focus` fareyle tıklandığında da halka
468
+ gösterip görsel gürültü yaratıyor ve kullanıcılar bunu hata sanıyordu.
469
+
470
+ ---
471
+
472
+ ## Next.js App Router
473
+
474
+ Paket `'use client'` sınırını **kendi içinde ve dosya başına** çizer (6.0):
475
+ kanca kullanmayan bileşenler (`Button`, `Chip`, `Badge`, `Card`, `Panel`,
476
+ `Tile`, `TextLink`, `Kbd`, `Alert`, `EmptyState`, `IconButton`, `Progress`,
477
+ `Skeleton`, `StatusDot`, `SummaryCard`, `SectionHeader`, `PageHeader`,
478
+ `Divider`) sunucu bileşeni olarak çizilir ve istemciye JS indirmez; etkileşimli
479
+ olanlar kendi yönergesini taşır, `children` sunucuda çizilip aktarılır. İnce
480
+ `Client*` sarmalayıcıları gerekmez; `UIVariant`/`UISize` sunucuda da içe
481
+ aktarılır.
482
+
483
+ ```ts
484
+ // next.config.ts — cephe saf olduğu için içe aktarım bileşen dosyasına kısa devre yapılır.
485
+ experimental: { optimizePackageImports: ['@handijit/ui'] }
486
+ ```
487
+
488
+ ```tsx
489
+ // app/layout.tsx — sunucu bileşeni
490
+ import '@handijit/ui/styles.css';
491
+ import '@handijit/ui/chat.css'; // yalnızca /chat kullanılıyorsa
492
+ import '@handijit/ui/charts.css'; // yalnızca /charts kullanılıyorsa
493
+ import { UiProvider, UiThemeScript } from '@handijit/ui';
494
+ import NextLink from 'next/link';
495
+
496
+ export default function RootLayout({ children }: { children: React.ReactNode }) {
497
+ return (
498
+ <html lang="tr" suppressHydrationWarning>
499
+ <head>
500
+ <UiThemeScript storageKey="theme" />
501
+ </head>
502
+ <body>
503
+ <UiProvider linkComponent={NextLink}>{children}</UiProvider>
504
+ </body>
505
+ </html>
506
+ );
507
+ }
508
+ ```
509
+
510
+ `suppressHydrationWarning`: tema betiği `<html>`e sunucunun yazmadığı bir
511
+ öznitelik ekliyor; uyarı yalnızca o öğe için susturulur.
512
+
513
+ ---
514
+
515
+ ## Geliştirme
516
+
517
+ ```bash
518
+ nvm use # .nvmrc → 24
519
+ npm install
520
+ npm run verify # tokens → kontrast → typecheck → lint → kapsam → build → API → animasyon → boyut
521
+ npm run playground # bileşen galerisi → http://localhost:5273
522
+ ```
523
+
524
+ | Komut | |
525
+ | ------------------------- | --------------------------------------------------------------- |
526
+ | `npm run tokens` | SCSS token dosyalarını `theme/tokens.ts`ten üretir |
527
+ | `npm run build` | `build/` — ana giriş + `chat` + `charts` (ESM + CJS + `.d.ts` + CSS) ve `build/scss/` |
528
+ | `npm run test` | Jest + Testing Library + `jest-axe` |
529
+ | `npm run test:coverage` | kapsam kapısı — tüm `src/`: satır 89 · ifade 86 · fonksiyon 80 · dal 75 |
530
+ | `npm run test:visual` | görsel regresyon (Playwright); `verify` İÇİNDE DEĞİL, aşağı bkz. |
531
+ | `npm run test:device` | iOS (WebKit) + Android (Chromium) davranış nöbetçileri, aşağı bkz. |
532
+ | `npm run check:contrast` | WCAG kontrast ölçümü, iki temada 210 çift |
533
+ | `npm run check:palette` | palet tarifinin çıktısı mı + nötr chroma tavanı + tint ve kategori ayrışması |
534
+ | `npm run check:api` | genel API nöbetçisi — dört giriş, dört taban çizgisi (ana 176 · sohbet 30 · grafik 22 · SCSS 252 ad) |
535
+ | `npm run size` | paket boyutu bütçesi (`size-limit`) |
536
+ | `npm run exports` | `package.json` `exports` haritasını üretir (`check:exports` doğrular, `build`in son adımı) |
537
+ | `npm run playground` | bileşen galerisi (tema · RTL · yoğunluk anahtarı) |
538
+ | `npm run lint` | ESLint (TS) + stylelint (SCSS) |
539
+ | `npm run typecheck` | `tsc --noEmit` |
540
+
541
+ ### Nöbetçiler ne koruyor
542
+
543
+ - **Eksen taraması** — dışa verilen her bileşen, her anlamlı durumunda
544
+ (`components/__tests__/a11y.test.tsx`). Deftere girmeyen yeni bir bileşen
545
+ testi kırar.
546
+ - **Klavye sözleşmesi** — tuş matrisleri her bileşenin JSDoc'unda, nöbetçisi
547
+ `components/__tests__/keyboard.test.tsx`.
548
+ - **Kontrast** — metin ≥ 4,5:1, ikon ve odak halkası ≥ 3:1. Eşiği tutmayan bir
549
+ token derlemeyi kırar; düzeltme daima `palette.ts` düzeyinde yapılır.
550
+ - **Token sözleşmesi** — açık/koyu anahtar kümeleri ve üretilmiş SCSS kaynakla
551
+ eşleşir. Ayrışma bugüne kadar sessizdi.
552
+ - **Paket boyutu** — tek bileşen import eden bir uygulamanın ne indirdiği
553
+ ölçülür. Ölçülen (2026-10-10, `size-limit`): `Badge` **4,33 kB** · `Button`
554
+ **5,12 kB** · `styles.css` **23,07 kB** · tüm paket **42,05 kB** gzip. Alt
555
+ girişler ana pakette SAYILMAZ: sohbet **6,32 kB**, grafikler **14,02 kB**
556
+ (yalnızca `LineChart` **7,19 kB**).
557
+ ⚠ **Bütçeler `.size-limit.js`te** (paket 43 kB, `styles.css` 24 kB) ve
558
+ başlıkta kalan pay dar. Bu satır bir dönem
559
+ `Badge 2,7 / Button 3,4 / paket 22,2` diyordu — ölçüm değil, bayat bir
560
+ kopyaydı ve okuyana **%70 boş alan** olduğunu düşündürüyordu. Yeni bir
561
+ bileşen eklerken bütçenin fiilen dolu olduğu bilinerek girilir; `size-limit`
562
+ kırmızıya döndüğünde doğru tepki limiti yükseltmek değil, ne eklendiğini
563
+ ölçmektir (`npm run size`).
564
+ - **Genel API** — her girişin dışa aktarım kümesi kendi taban çizgisiyle
565
+ karşılaştırılır (`npm run check:api`): ana giriş `scripts/api-baseline.txt`
566
+ (176), `chat` (30), `charts` (22), `scss` (252 `$değişken` + `@mixin`). Düşen
567
+ bir ad **kırıcı**dır ve tüketiciler caret ile aldığı için bir sonraki
568
+ `npm install`da derleme hatası olarak çıkar. Bilinçli değişiklikte
569
+ `node scripts/check-api.mjs --update` + CLAUDE.md'ye gerekçe.
570
+ - **Alt giriş sınırı** — `chat` ve `charts` ana girişi yalnızca PAKET ADIYLA
571
+ alır (`subentry-boundary.test.ts`); göreli bir yol `UiProvider` bağlamının
572
+ ve kipsel yüzey yığınının ikinci bir kopyasını paketlerdi.
573
+ - **Yeşil ayak izi** — bileşen SCSS'inde yeşil token ailesine uzanan her
574
+ bileşen gerekçeli bir izin listesinde (`green-footprint.test.ts`).
575
+ - **Opacity ile soluklaştırma yasak** — `0`/`1` dışındaki her `opacity`
576
+ derlemeyi kırar (`passive-opacity.test.ts`); pasiflik token'larla çizilir.
577
+ - **iOS yakınlaştırması** — galerideki her metin girdisi dar ekranda ≥16px
578
+ (`e2e/mobile.spec.ts`, hesaplanmış stil).
579
+ - **Odak halkası ve hareket ölçeği** — stylelint, `focus-ring` mixin'i dışında
580
+ `outline` ve bileşen SCSS'inde ham süre değeri (`0.7s`) yazılmasını
581
+ engelliyor. Üç bileşen kendi halkasını, iki bileşen kendi süresini
582
+ yazıyordu.
583
+
584
+ ### Cihaz nöbetçileri — `npm run test:device`
585
+
586
+ ```bash
587
+ npm run test:device:install # WebKit + Chromium ikilileri (bir kez)
588
+ npm run test:device # ios (iPhone 14 · WebKit) + android (Pixel 7 · Chromium)
589
+ ```
590
+
591
+ Bu depodaki en pahalı hatalar masaüstünde **görünmüyordu**: alt sayfanın gövdesi
592
+ çöküyor, dip şerit klavyenin altında kalıyor, filtre seçenekleri maskenin
593
+ altında siliniyordu. Üçü de yerleşim/boyama hatası ve üçü de yalnızca gerçek bir
594
+ yerleşim motorunda ölçülebiliyor — jsdom bunları hiç hesaplamıyor.
595
+
596
+ **İki motor, çünkü bir motor yetmiyor.** iOS'taki her tarayıcı (Chrome dahil)
597
+ WebKit; Chromium'da doğru olan orada doğru olmak zorunda değil.
598
+
599
+ **Ekran görüntüsü değil sayı.** Bu koşu piksel karşılaştırmaz — yükseklik,
600
+ taşma, odak ve hesaplanmış CSS değeri ölçer. Yani platformdan bağımsız,
601
+ referans dosyası yok, `--update-snapshots` gerektirmiyor ve `test:visual`in
602
+ aksine **CI'da olduğu gibi koşabilir**.
603
+
604
+ **Emülasyonun dürüst sınırı.** Playwright'ın WebKit'i iOS Safari değil; çentik
605
+ payı (`env(safe-area-inset-*)` burada hep 0), ekran klavyesinin görünen alanı
606
+ daraltması, adres çubuğunun kaybolup gelmesi ve momentum kaydırma
607
+ yakalanmıyor. O sınırın altında kalanlar için savunma CSS'te taban değerlerde
608
+ (bkz. `bottom-sheet` mixin'i) ve onların nöbetçisi `e2e/bottom-sheet.spec.ts`.
609
+
610
+ **Görsel regresyon `verify` içinde değil**: ekran görüntüsü platforma bağlı
611
+ (yazı tipi tarama, alt piksel yumuşatma) ve macOS'te üretilmiş bir referans
612
+ ubuntu üzerinde koşan CI'da her dosyada kırmızı döner. Referanslar platform
613
+ başına saklanıyor (`e2e/__screenshots__/{platform}/`); CI'da açılacağı gün doğru
614
+ yol, Playwright'ın resmi konteynerinde koşup `linux` referanslarını orada
615
+ üretmek.
616
+
617
+ > ⚠ **Referansları yenilerken `--update-snapshots=all` yazın, çıplak
618
+ > `--update-snapshots` DEĞİL.** Ölçüldü (palet değişikliği turunda): çıplak
619
+ > bayrak yalnızca **eksik** referansı yazıyor; eşleşmeyeni ne yeniden üretiyor
620
+ > ne de kırıyor — koşu `40 passed` diyor, dosyalar eski renkte kalıyor ve
621
+ > ardından gelen doğrulama koşusu **eski referansı eski referansla**
622
+ > karşılaştırdığı için yeşil dönüyor. Yani sessizce yanlış bir "temiz" alınıyor.
623
+ > `=all` mod, pikseli değişen her dosyayı yazar (bayt bayt aynı olanlara
624
+ > dokunmaz, o yüzden dosya sayısı toplamdan az çıkabilir). Doğrulama:
625
+ > yenilemeden sonra bir referansın baskın renklerini örnekleyin.
626
+ > ⚠ `=changed` de yetmez: yalnızca eşiği (`maxDiffPixelRatio: 0.002`) aşan
627
+ > farkı yazar — iki küçük yazının kalktığı bir değişiklik eşiğin altında kalıp
628
+ > eski referans dosyada durur. Küçük bir değişiklikte bölümün referansını silip
629
+ > `=missing` ile yazdırın.
630
+
631
+ `master`a her push `npm publish` çalıştırır — **`package.json` sürümünü
632
+ yükseltmeyi unutmayın**, aynı sürüm ikinci kez yayımlanamaz ve iş akışı kırmızı
633
+ döner.
634
+
635
+ ## Sohbet bileşenleri — `@handijit/ui/chat`
636
+
637
+ Sohbet ve araç arayüzleri için ayrı bir giriş; ana paketi ve `styles.css`i
638
+ büyütmez.
639
+
640
+ ```tsx
641
+ import '@handijit/ui/styles.css';
642
+ import '@handijit/ui/chat.css'; // styles.css'TEN SONRA
643
+
644
+ import { UiProvider } from '@handijit/ui';
645
+ import { ChatMessage, ChatThread, PromptInput } from '@handijit/ui/chat';
646
+
647
+ <ChatThread
648
+ isStreaming={isStreaming}
649
+ dock={
650
+ <PromptInput
651
+ value={draft}
652
+ onChange={setDraft}
653
+ onSubmit={send}
654
+ onStop={stop}
655
+ isBusy={isStreaming}
656
+ placeholder="Mesajınızı yazın…"
657
+ />
658
+ }
659
+ >
660
+ {messages.map(message => (
661
+ <ChatMessage key={message.id} author={message.author}>
662
+ {message.content}
663
+ </ChatMessage>
664
+ ))}
665
+ </ChatThread>;
666
+ ```
667
+
668
+ Metinler aynı sağlayıcıdan, `labels.chat` altında:
669
+
670
+ ```tsx
671
+ <UiProvider
672
+ labels={{
673
+ chat: {
674
+ thread: 'Sohbet',
675
+ send: 'Gönder',
676
+ stop: 'Durdur',
677
+ scrollToLatest: 'En yeniye in',
678
+ replyReady: 'Yanıt hazır',
679
+ messageActions: 'Mesaj eylemleri',
680
+ sources: 'Kaynaklar',
681
+ citation: index => `Kaynak ${index}`,
682
+ stderr: 'hata çıktısı',
683
+ toolStatus: { running: 'çalışıyor', ok: 'tamamlandı', error: 'hata', aborted: 'durduruldu', interrupted: 'kesildi' },
684
+ codeCopy: language => `${language} kodunu kopyala`,
685
+ codeCopied: 'Kod kopyalandı',
686
+ },
687
+ }}
688
+ >
689
+ ```
690
+
691
+ `CodeBlock` kodu kendisi vurgular ve biçimlendirir — bağımlılık yok, renkler
692
+ temayla döner:
693
+
694
+ ```tsx
695
+ <CodeBlock language="json" code={JSON.stringify(payload)} />
696
+ ```
697
+
698
+ JSON iki boşlukla yeniden girintilenir (değerler metin olarak korunur: büyük
699
+ sayılar yuvarlanmaz), kenardaki boş satırlar atılır; başka dilde girintiye
700
+ dokunulmaz. 30'dan fazla dil tanınır (ts/tsx, json, bash, python, yaml, css,
701
+ html, sql, diff, go, rust…), tanınmayan dil düz çizilir. Kopyala düğmesi ekranda
702
+ görüneni kopyalar. Renkler `chat.css`teki `--ui-syntax-keyword`, `-string`,
703
+ `-number`, `-name`, `-type` değişkenleridir; CSS'te ezilir. Shiki düzeyinde
704
+ doğruluk isterseniz önceden vurgulanmış HTML'i `html` olarak verin (güvenliği
705
+ sizin) — yerleşik vurgulayıcının yerine geçer.
706
+
707
+ Markdown ayrıştırması tüketicide kalır: `Prose` yalnızca tipografi kabıdır.
708
+ Bileşen listesi ve kararlar: `CLAUDE.md` → "`@handijit/ui/chat`".
709
+
710
+ ## SCSS API — `@handijit/ui/scss`
711
+
712
+ Token değişkenleri ve mixin'ler kopyalanmadan alınır. Değişkenler
713
+ `var(--ui-…)` dizeleridir; tema çalışma zamanında döner. Modül kural basmaz;
714
+ `:root` token kuralları `base.css`tedir (bileşen modülleri onu kendileri getirir).
715
+
716
+ ```scss
717
+ @use '@handijit/ui/scss' as ui;
718
+
719
+ .panel {
720
+ padding: ui.$space-4;
721
+ border: 1px solid ui.$border;
722
+
723
+ @include ui.focus-ring;
724
+
725
+ @media (max-width: ui.$breakpoint-tablet-portrait) {
726
+ padding: ui.$space-3;
727
+ }
728
+ }
729
+ ```
730
+
731
+ Next.js (Turbopack ve webpack) paket `exports`'unu çözer. Başka bir derleyici
732
+ çözemezse yol `node_modules/@handijit/ui/build/scss` ile `loadPaths`e verilip
733
+ `@use 'index' as @handijit/ui` yazılabilir.
734
+
735
+ ## Grafikler — `@handijit/ui/charts`
736
+
737
+ On SVG grafiği, sıfır bağımlılık (çizim, ölçek ve istatistik kütüphanenin
738
+ kendisinde). Ana paketi ve `styles.css`i büyütmez.
739
+
740
+ ```tsx
741
+ import '@handijit/ui/styles.css';
742
+ import '@handijit/ui/charts.css'; // styles.css'TEN SONRA
743
+
744
+ import { BarChart, LineChart, PieChart } from '@handijit/ui/charts';
745
+
746
+ <LineChart
747
+ label="Aylık gelir ve gider"
748
+ description="Gelir ekimde zirve yaptı"
749
+ xKey="month"
750
+ data={[
751
+ { month: 'Oca', revenue: 120, cost: 90 },
752
+ { month: 'Şub', revenue: 180, cost: null }, // null = veri yok: çizgi KESİLİR
753
+ ]}
754
+ series={[
755
+ { key: 'revenue', label: 'Gelir' },
756
+ { key: 'cost', label: 'Gider', format: value => `${value} ₺` },
757
+ ]}
758
+ />;
759
+ ```
760
+
761
+ | Grafik | Ne zaman |
762
+ |---|---|
763
+ | `LineChart` · `AreaChart` | Zaman içinde eğilim; `AreaChart isStacked` toplamın parçaları |
764
+ | `BarChart` | Kategorileri karşılaştırma; `orientation="horizontal"` uzun adlar için |
765
+ | `ComposedChart` | Çubuk + çizgi; farklı birim `axis: 'right'` |
766
+ | `PieChart` | Bir bütünün ≤6 parçası (`variant="donut"` varsayılan) |
767
+ | `ScatterPlot` | İki değişkenin ilişkisi; `size` ile balon |
768
+ | `Heatmap` | İki kategorik eksende yoğunluk (gün × saat) |
769
+ | `BoxPlot` · `Histogram` | Dağılım: grupları karşılaştırma · tek değişkenin şekli |
770
+ | `RadarChart` | Birkaç seriyi aynı eksen takımında; eksenler AYNI ölçekte |
771
+
772
+ Her grafik tek bir sekme durağıdır: oklar öğeleri gezer (gelinen öğe
773
+ duyurulur), `Home`/`End` uçlara gider, `Escape` vurguyu kaldırır. Ekran okuyucu
774
+ grafiği gizli bir **veri tablosu** olarak da okur. Genişlik kapsayıcıdan ölçülür
775
+ (`width` ile sabitlenebilir), yükseklik `height`. Sayılar `labels.locale`
776
+ yereliyle biçimlenir; ipucu, duyuru ve tablo `formatValue` / `format` ile
777
+ ezilir. Eksen bölmeleri bunu KULLANMAZ: kısa gösterimde ("12 B", "0,005") ve
778
+ birimsiz kalır, basamak sayısı bölme adımından gelir. Renkler kategorik paletten
779
+ (`tone`: `cat-1`…`cat-5`, `series-1`, `series-2`, `muted`).
780
+
781
+ ## 1.0'a geçiş — `@ahmetilhn/hanui` 5.x'ten
782
+
783
+ 1.0 iki şeyi birden getirir: **yeni ad** (`@ahmetilhn/hanui` → `@handijit/ui`; CSS öneki `hanui-` →
784
+ `ui-`, token'lar `--hanui-*` → `--ui-*`, `@layer ui`, `data-ui-theme`, `UiProvider`/`useUi`/`initUi`;
785
+ peer `@ahmetilhn/handy-utils` → `@handijit/utils`) ve 6.0 olarak hazırlanmış **paketleme** değişiklikleri.
786
+ 6.0 bir **paketleme** sürümü: bileşen API'si değişmedi, kırılan şey paketin
787
+ dosya düzeni, `'use client'` sınırı ve CSS'in inişi. Tam liste `CHANGELOG.md`.
788
+
789
+ | 5.x | 6.0 |
790
+ |---|---|
791
+ | `import '@handijit/ui/styles.css'` | ESM'de **silinir** — bileşen modülleri `base.css` + kendi `style.css`ini getirir; CJS/paketleyicisiz kullanımda kalır |
792
+ | tek `build/index.js`, tamamı `'use client'` | `build/components/<Ad>/index.js`; 18 bileşen yönergesiz (sunucuda çizilir), alt yol `@handijit/ui/<kebab-ad>` |
793
+ | `build/index.d.ts` toplanmış | dosya başına `.d.ts`; `import type` aynı |
794
+ | `Combobox` tetikleyicisi `role="button"`, arama kutusu `role="combobox"` | tetikleyici `role="combobox"` (`aria-expanded`, `aria-controls`, `aria-invalid`, `aria-required`), arama kutusu metin kutusu |
795
+ | bağlantı `Button` pasifken `preventDefault` işleyicisi | `aria-disabled` + `tabIndex=-1` + `pointer-events: none`; işlev prop'u yok (sunucudan çizilebilir) |
796
+ | site ezmesi sınıf seçicisiyle | **bileşen değişkenleri** (aşağıda) |
797
+
798
+ ### Bileşen değişkenleri
799
+
800
+ Token sözleşmesinin (`--ui-page`, `--ui-text`… 110 ad) dışında, tek bir
801
+ bileşenin görünümünü tüketicinin `:root`ta ezdiği CSS özel özellikleri. Bileşen
802
+ `var(--ui-…, varsayılan)` ile okur; yazılmazsa varsayılan geçerlidir.
803
+
804
+ | Bileşen | Değişkenler |
805
+ |---|---|
806
+ | odak halkası | `--ui-ring-width` (2px) · `--ui-ring-offset` (2px; öğenin içine çekmek için `-2px`) |
807
+ | girdiler | `--ui-placeholder` (`text-3`) |
808
+ | kipsel perde | `--ui-scrim-blur` (3px) |
809
+ | `Button` | `--ui-button-radius` · `-weight` · `-tracking` · `-wrap` (`nowrap`) |
810
+ | `Chip` | `--ui-chip-bg` · `-line` · `-fg` · `-radius` · `-weight` · `-selected-bg` · `-selected-line` · `-selected-fg` · `-selected-weight` |
811
+ | `Badge` | `--ui-badge-font` · `-weight` · `-tracking` · `-transform` · `-radius` (+ `-bg` · `-line` · `-fg`, 5.x) |
812
+ | `Stat` | `--ui-stat-label-font/-size/-weight/-tracking/-transform` · `-value-font/-weight/-tracking` · `-unit-font/-size/-tracking/-transform` |
813
+ | `Tabs` | `--ui-tab-weight` |
814
+ | `RadioCard` | `--ui-radio-card-line` · `-radius` |
815
+
816
+ ```css
817
+ :root {
818
+ --ui-ring-offset: -2px;
819
+ --ui-button-weight: 500;
820
+ --ui-chip-radius: var(--ui-radius-pill);
821
+ --ui-badge-font: var(--ui-font-mono);
822
+ --ui-badge-transform: uppercase;
823
+ }
824
+ ```
825
+
826
+ ## 5.0'a geçiş
827
+
828
+ 5.0 bir **renk** sürümü: nötr eksen yeşilden sıcak mürekkebe geçti, yeşil
829
+ yalnızca eylem, bağlantı ve odakta kaldı. Bileşen API'si değişmedi; kırılan şey
830
+ token adları ve görünüm.
831
+
832
+ | 4.x token | 5.0 |
833
+ |---|---|
834
+ | `role`, `role-hover`, `role-active` | `selected`, `selected-hover`, `selected-active` (mürekkep) |
835
+ | `on-role` | `on-selected` |
836
+ | `role-tint` / `role-line` | `selected-tint` / `selected-line` |
837
+ | `role-text` | `link` (+ `link-hover`) |
838
+ | `shell*` | aynı ad, değer çamdan mürekkebe; yeni `on-shell`, `on-shell-2`, `on-shell-danger`, `shell-line` |
839
+ | — | `cat-1…5`, `series-1/2` (kategorik palet) |
840
+
841
+ Eski adlara takma ad **yok**. Kendi CSS'inizde `--ui-role*` okuyan ya da
842
+ `theme={{ light: { role: … } }}` ezmesi yazan yerler yeni adlara geçer.
843
+ Görünüm değişiklikleri: açık sayfa krem (`#faf9f5`), koyu sayfa sıcak siyah
844
+ (`#141413`), kart ve panel durgunken gölgesiz, `info` tonu nötr, `CodeBadge`
845
+ mürekkep. Ayrıntı ve ölçümler: `CLAUDE.md` → "Renk kararları (5.0)".
846
+
847
+ ## 5.1 – 5.6'da eklenenler
848
+
849
+ Hepsi ekleme; 5.0'ın token sözleşmesi dışında kırıcı değişiklik yok.
850
+
851
+ | Sürüm | Ne |
852
+ |---|---|
853
+ | 5.1 | `Disclosure`, `StatusDot`, `Kbd`; `useUiTokens`, `useStickToBottom`, `hasOpenSurface`; `Modal size="xl"`, `Button size={UISize.XSMALL}` + `shape="pill"`, `IconButton shape="round"`, `Textarea variant="bare"`, `Progress size="xs"`, etkileşimli `CodeBadge`, `Avatar` (`icon`, `shape="rounded"`, `tone="brand"`), `Stat variant="inline"`, `ScrollArea isFollowingEnd`; `CommandPalette` `hotkey` + komut kapanıştan SONRA çalışır |
854
+ | 5.2 | `UiThemeScript`; `@handijit/ui/chat` — 20 sohbet bileşeni |
855
+ | 5.3 | `@handijit/ui/charts` — 10 SVG grafiği; `@handijit/ui/scss`; `Input --technical` dar ekranda ≥16px; `QuantityStepper` ve `DataTable` pasif/dinlenme hâli opacity yerine token |
856
+ | 5.3.2 | Düzeltme: kaydırma kapları kapsayıcı blok (`ChatThread`, `ScrollArea`, `TerminalOutput`, `ActionList` ve 12 kab daha) — görsel olarak gizli metin kabın dışına taşıp atalarını kaydırılabilir yapmıyor; grafik ekseni 0,1'in altındaki adımda sıfıra çökmüyor |
857
+ | 5.4 | `CodeBlock` yerleşik vurgulayıcı ve biçimlendirici (bağımlılıksız, 30+ dil); sözdizimi renkleri `--ui-syntax-*` (yalnızca `chat.css`) |
858
+ | 5.5 | `Input`, `DateField`, `DateRange` `size="sm"` (36px — `Select sm` ve `Button` SMALL ile tek hiza); SCSS `input-sm` mixin'i; yerel sayısal `size` niteliği bu üç girdinin tipinden çıktı |
859
+ | 5.6 | `ContextMenu` — imleç noktasında açılan menü (sağ tık), `role="menu"` dışında başlık; `Menu` ile ortak yüzey; `usePositioning` öğesiz (nokta) çapayı da ölçer; düzeltme: `Menu` açılışta odağı gerçekten ilk öğeye taşır (gerçek tarayıcıda `<body>`de kalıyordu) |
860
+
861
+ Ayrıntı ve ölçülmüş gerekçeler: `CLAUDE.md` → "Göç ve `@deprecated` yollar",
862
+ "`@handijit/ui/chat`", "`@handijit/ui/charts`".
863
+
864
+ ## Tasarım sözleşmesi
865
+
866
+ Öğe seçimi (hangi durumda hangi bileşen), yüzey/yükseklik merdiveni, renk
867
+ kararları, durum tintleri, tipografi rolleri, erişilebilirlik eşikleri, hareket
868
+ ölçeği ve `@deprecated` göç yolları **`CLAUDE.md`** içindedir. O dosya
869
+ kütüphaneyi kullanan uygulamalar için de normatiftir.
870
+
871
+ ## Lisans
872
+
873
+ MIT