@intlayer/design-system 6.1.5 → 6.1.6

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 (336) hide show
  1. package/dist/.vite/manifest.json +13 -9
  2. package/dist/Form-CriPBaZk.js.map +1 -1
  3. package/dist/Form-DJrUK3mm.cjs.map +1 -1
  4. package/dist/components/Accordion/Accordion.cjs +51 -15
  5. package/dist/components/Accordion/Accordion.cjs.map +1 -1
  6. package/dist/components/Accordion/Accordion.d.ts +44 -5
  7. package/dist/components/Accordion/Accordion.d.ts.map +1 -1
  8. package/dist/components/Accordion/Accordion.mjs +52 -16
  9. package/dist/components/Accordion/Accordion.mjs.map +1 -1
  10. package/dist/components/Avatar/index.cjs +114 -31
  11. package/dist/components/Avatar/index.cjs.map +1 -1
  12. package/dist/components/Avatar/index.d.ts +46 -2
  13. package/dist/components/Avatar/index.d.ts.map +1 -1
  14. package/dist/components/Avatar/index.mjs +115 -32
  15. package/dist/components/Avatar/index.mjs.map +1 -1
  16. package/dist/components/Badge/index.cjs +88 -9
  17. package/dist/components/Badge/index.cjs.map +1 -1
  18. package/dist/components/Badge/index.d.ts +80 -2
  19. package/dist/components/Badge/index.d.ts.map +1 -1
  20. package/dist/components/Badge/index.mjs +89 -10
  21. package/dist/components/Badge/index.mjs.map +1 -1
  22. package/dist/components/Breadcrumb/index.cjs +124 -59
  23. package/dist/components/Breadcrumb/index.cjs.map +1 -1
  24. package/dist/components/Breadcrumb/index.d.ts +89 -5
  25. package/dist/components/Breadcrumb/index.d.ts.map +1 -1
  26. package/dist/components/Breadcrumb/index.mjs +124 -59
  27. package/dist/components/Breadcrumb/index.mjs.map +1 -1
  28. package/dist/components/Button/Button.cjs +44 -25
  29. package/dist/components/Button/Button.cjs.map +1 -1
  30. package/dist/components/Button/Button.d.ts +95 -1
  31. package/dist/components/Button/Button.d.ts.map +1 -1
  32. package/dist/components/Button/Button.mjs +44 -25
  33. package/dist/components/Button/Button.mjs.map +1 -1
  34. package/dist/components/ClickOutsideDiv/index.cjs +38 -7
  35. package/dist/components/ClickOutsideDiv/index.cjs.map +1 -1
  36. package/dist/components/ClickOutsideDiv/index.d.ts +13 -0
  37. package/dist/components/ClickOutsideDiv/index.d.ts.map +1 -1
  38. package/dist/components/ClickOutsideDiv/index.mjs +39 -8
  39. package/dist/components/ClickOutsideDiv/index.mjs.map +1 -1
  40. package/dist/components/Container/index.cjs +2 -0
  41. package/dist/components/Container/index.cjs.map +1 -1
  42. package/dist/components/Container/index.d.ts +42 -0
  43. package/dist/components/Container/index.d.ts.map +1 -1
  44. package/dist/components/Container/index.mjs +2 -0
  45. package/dist/components/Container/index.mjs.map +1 -1
  46. package/dist/components/ContentEditor/ContentEditor.cjs +80 -33
  47. package/dist/components/ContentEditor/ContentEditor.cjs.map +1 -1
  48. package/dist/components/ContentEditor/ContentEditor.d.ts +29 -0
  49. package/dist/components/ContentEditor/ContentEditor.d.ts.map +1 -1
  50. package/dist/components/ContentEditor/ContentEditor.mjs +80 -33
  51. package/dist/components/ContentEditor/ContentEditor.mjs.map +1 -1
  52. package/dist/components/ContentEditor/ContentEditorInput.cjs +58 -31
  53. package/dist/components/ContentEditor/ContentEditorInput.cjs.map +1 -1
  54. package/dist/components/ContentEditor/ContentEditorInput.d.ts +33 -0
  55. package/dist/components/ContentEditor/ContentEditorInput.d.ts.map +1 -1
  56. package/dist/components/ContentEditor/ContentEditorInput.mjs +58 -31
  57. package/dist/components/ContentEditor/ContentEditorInput.mjs.map +1 -1
  58. package/dist/components/ContentEditor/ContentEditorTextArea.cjs +58 -30
  59. package/dist/components/ContentEditor/ContentEditorTextArea.cjs.map +1 -1
  60. package/dist/components/ContentEditor/ContentEditorTextArea.d.ts +35 -0
  61. package/dist/components/ContentEditor/ContentEditorTextArea.d.ts.map +1 -1
  62. package/dist/components/ContentEditor/ContentEditorTextArea.mjs +59 -31
  63. package/dist/components/ContentEditor/ContentEditorTextArea.mjs.map +1 -1
  64. package/dist/components/ContentEditor/index.cjs +4 -0
  65. package/dist/components/ContentEditor/index.cjs.map +1 -1
  66. package/dist/components/ContentEditor/index.d.ts +2 -0
  67. package/dist/components/ContentEditor/index.d.ts.map +1 -1
  68. package/dist/components/ContentEditor/index.mjs +5 -1
  69. package/dist/components/ContentEditor/index.mjs.map +1 -1
  70. package/dist/components/ContentSelector/ContentSelector.cjs +9 -1
  71. package/dist/components/ContentSelector/ContentSelector.cjs.map +1 -1
  72. package/dist/components/ContentSelector/ContentSelector.d.ts +167 -0
  73. package/dist/components/ContentSelector/ContentSelector.d.ts.map +1 -1
  74. package/dist/components/ContentSelector/ContentSelector.mjs +9 -1
  75. package/dist/components/ContentSelector/ContentSelector.mjs.map +1 -1
  76. package/dist/components/CopyButton/index.cjs +23 -8
  77. package/dist/components/CopyButton/index.cjs.map +1 -1
  78. package/dist/components/CopyButton/index.d.ts +78 -0
  79. package/dist/components/CopyButton/index.d.ts.map +1 -1
  80. package/dist/components/CopyButton/index.mjs +23 -8
  81. package/dist/components/CopyButton/index.mjs.map +1 -1
  82. package/dist/components/CopyToClipboard/index.cjs +58 -22
  83. package/dist/components/CopyToClipboard/index.cjs.map +1 -1
  84. package/dist/components/CopyToClipboard/index.d.ts +68 -2
  85. package/dist/components/CopyToClipboard/index.d.ts.map +1 -1
  86. package/dist/components/CopyToClipboard/index.mjs +59 -23
  87. package/dist/components/CopyToClipboard/index.mjs.map +1 -1
  88. package/dist/components/DictionaryFieldEditor/DictionaryFieldEditor.cjs +4 -2
  89. package/dist/components/DictionaryFieldEditor/DictionaryFieldEditor.cjs.map +1 -1
  90. package/dist/components/DictionaryFieldEditor/DictionaryFieldEditor.d.ts +1 -0
  91. package/dist/components/DictionaryFieldEditor/DictionaryFieldEditor.d.ts.map +1 -1
  92. package/dist/components/DictionaryFieldEditor/DictionaryFieldEditor.mjs +4 -2
  93. package/dist/components/DictionaryFieldEditor/DictionaryFieldEditor.mjs.map +1 -1
  94. package/dist/components/DictionaryFieldEditor/NavigationView/NavigationViewNode.cjs +2 -2
  95. package/dist/components/DictionaryFieldEditor/NavigationView/NavigationViewNode.cjs.map +1 -1
  96. package/dist/components/DictionaryFieldEditor/NavigationView/NavigationViewNode.mjs +2 -2
  97. package/dist/components/DictionaryFieldEditor/NavigationView/NavigationViewNode.mjs.map +1 -1
  98. package/dist/components/DictionaryFieldEditor/SaveForm/SaveForm.cjs +3 -0
  99. package/dist/components/DictionaryFieldEditor/SaveForm/SaveForm.cjs.map +1 -1
  100. package/dist/components/DictionaryFieldEditor/SaveForm/SaveForm.d.ts +1 -0
  101. package/dist/components/DictionaryFieldEditor/SaveForm/SaveForm.d.ts.map +1 -1
  102. package/dist/components/DictionaryFieldEditor/SaveForm/SaveForm.mjs +3 -0
  103. package/dist/components/DictionaryFieldEditor/SaveForm/SaveForm.mjs.map +1 -1
  104. package/dist/components/DropDown/index.cjs +6 -4
  105. package/dist/components/DropDown/index.cjs.map +1 -1
  106. package/dist/components/DropDown/index.d.ts +92 -15
  107. package/dist/components/DropDown/index.d.ts.map +1 -1
  108. package/dist/components/DropDown/index.mjs +6 -4
  109. package/dist/components/DropDown/index.mjs.map +1 -1
  110. package/dist/components/EditableField/EditableFieldInput.cjs.map +1 -1
  111. package/dist/components/EditableField/EditableFieldInput.d.ts +38 -0
  112. package/dist/components/EditableField/EditableFieldInput.d.ts.map +1 -1
  113. package/dist/components/EditableField/EditableFieldInput.mjs.map +1 -1
  114. package/dist/components/EditableField/EditableFieldLayout.cjs +10 -2
  115. package/dist/components/EditableField/EditableFieldLayout.cjs.map +1 -1
  116. package/dist/components/EditableField/EditableFieldLayout.d.ts.map +1 -1
  117. package/dist/components/EditableField/EditableFieldLayout.mjs +10 -2
  118. package/dist/components/EditableField/EditableFieldLayout.mjs.map +1 -1
  119. package/dist/components/EditableField/EditableFieldTextArea.cjs.map +1 -1
  120. package/dist/components/EditableField/EditableFieldTextArea.d.ts +42 -0
  121. package/dist/components/EditableField/EditableFieldTextArea.d.ts.map +1 -1
  122. package/dist/components/EditableField/EditableFieldTextArea.mjs.map +1 -1
  123. package/dist/components/ExpandCollapse/ExpandCollapse.cjs.map +1 -1
  124. package/dist/components/ExpandCollapse/ExpandCollapse.d.ts +58 -0
  125. package/dist/components/ExpandCollapse/ExpandCollapse.d.ts.map +1 -1
  126. package/dist/components/ExpandCollapse/ExpandCollapse.mjs.map +1 -1
  127. package/dist/components/Footer/index.cjs.map +1 -1
  128. package/dist/components/Footer/index.d.ts +101 -0
  129. package/dist/components/Footer/index.d.ts.map +1 -1
  130. package/dist/components/Footer/index.mjs.map +1 -1
  131. package/dist/components/Form/elements/MultiselectElement.d.ts.map +1 -1
  132. package/dist/components/Form/elements/SelectElement.d.ts.map +1 -1
  133. package/dist/components/Form/elements/SwitchSelectorElement.d.ts.map +1 -1
  134. package/dist/components/Headers/index.cjs.map +1 -1
  135. package/dist/components/Headers/index.d.ts +69 -2
  136. package/dist/components/Headers/index.d.ts.map +1 -1
  137. package/dist/components/Headers/index.mjs.map +1 -1
  138. package/dist/components/HeightResizer/index.cjs +10 -7
  139. package/dist/components/HeightResizer/index.cjs.map +1 -1
  140. package/dist/components/HeightResizer/index.d.ts +89 -0
  141. package/dist/components/HeightResizer/index.d.ts.map +1 -1
  142. package/dist/components/HeightResizer/index.mjs +10 -7
  143. package/dist/components/HeightResizer/index.mjs.map +1 -1
  144. package/dist/components/InformationTag/index.cjs.map +1 -1
  145. package/dist/components/InformationTag/index.d.ts +72 -0
  146. package/dist/components/InformationTag/index.d.ts.map +1 -1
  147. package/dist/components/InformationTag/index.mjs.map +1 -1
  148. package/dist/components/KeyboardScreenAdapter/index.cjs.map +1 -1
  149. package/dist/components/KeyboardScreenAdapter/index.d.ts +100 -0
  150. package/dist/components/KeyboardScreenAdapter/index.d.ts.map +1 -1
  151. package/dist/components/KeyboardScreenAdapter/index.mjs.map +1 -1
  152. package/dist/components/Label/index.cjs +25 -3
  153. package/dist/components/Label/index.cjs.map +1 -1
  154. package/dist/components/Label/index.d.ts +65 -1
  155. package/dist/components/Label/index.d.ts.map +1 -1
  156. package/dist/components/Label/index.mjs +26 -4
  157. package/dist/components/Label/index.mjs.map +1 -1
  158. package/dist/components/Link/Link.cjs +0 -4
  159. package/dist/components/Link/Link.cjs.map +1 -1
  160. package/dist/components/Link/Link.d.ts +169 -0
  161. package/dist/components/Link/Link.d.ts.map +1 -1
  162. package/dist/components/Link/Link.mjs +0 -4
  163. package/dist/components/Link/Link.mjs.map +1 -1
  164. package/dist/components/Loader/index.cjs.map +1 -1
  165. package/dist/components/Loader/index.d.ts +82 -11
  166. package/dist/components/Loader/index.d.ts.map +1 -1
  167. package/dist/components/Loader/index.mjs.map +1 -1
  168. package/dist/components/Loader/spinner.cjs.map +1 -1
  169. package/dist/components/Loader/spinner.d.ts +56 -0
  170. package/dist/components/Loader/spinner.d.ts.map +1 -1
  171. package/dist/components/Loader/spinner.mjs.map +1 -1
  172. package/dist/components/MarkDownRender/MarkDownRender.cjs +0 -1
  173. package/dist/components/MarkDownRender/MarkDownRender.cjs.map +1 -1
  174. package/dist/components/MarkDownRender/MarkDownRender.d.ts +147 -0
  175. package/dist/components/MarkDownRender/MarkDownRender.d.ts.map +1 -1
  176. package/dist/components/MarkDownRender/MarkDownRender.mjs +0 -1
  177. package/dist/components/MarkDownRender/MarkDownRender.mjs.map +1 -1
  178. package/dist/components/MarkDownRender/processor.cjs +12 -9
  179. package/dist/components/MarkDownRender/processor.cjs.map +1 -1
  180. package/dist/components/MarkDownRender/processor.d.ts.map +1 -1
  181. package/dist/components/MarkDownRender/processor.mjs +12 -9
  182. package/dist/components/MarkDownRender/processor.mjs.map +1 -1
  183. package/dist/components/MaxHeightSmoother/index.cjs.map +1 -1
  184. package/dist/components/MaxHeightSmoother/index.d.ts +152 -0
  185. package/dist/components/MaxHeightSmoother/index.d.ts.map +1 -1
  186. package/dist/components/MaxHeightSmoother/index.mjs.map +1 -1
  187. package/dist/components/Modal/Modal.cjs +5 -0
  188. package/dist/components/Modal/Modal.cjs.map +1 -1
  189. package/dist/components/Modal/Modal.d.ts +81 -3
  190. package/dist/components/Modal/Modal.d.ts.map +1 -1
  191. package/dist/components/Modal/Modal.mjs +5 -0
  192. package/dist/components/Modal/Modal.mjs.map +1 -1
  193. package/dist/components/Navbar/Burger.cjs.map +1 -1
  194. package/dist/components/Navbar/Burger.d.ts +54 -0
  195. package/dist/components/Navbar/Burger.d.ts.map +1 -1
  196. package/dist/components/Navbar/Burger.mjs.map +1 -1
  197. package/dist/components/Navbar/DesktopNavbar.cjs.map +1 -1
  198. package/dist/components/Navbar/DesktopNavbar.d.ts +78 -0
  199. package/dist/components/Navbar/DesktopNavbar.d.ts.map +1 -1
  200. package/dist/components/Navbar/DesktopNavbar.mjs.map +1 -1
  201. package/dist/components/Navbar/MobileNavbar.cjs.map +1 -1
  202. package/dist/components/Navbar/MobileNavbar.d.ts +88 -0
  203. package/dist/components/Navbar/MobileNavbar.d.ts.map +1 -1
  204. package/dist/components/Navbar/MobileNavbar.mjs.map +1 -1
  205. package/dist/components/Navbar/index.cjs.map +1 -1
  206. package/dist/components/Navbar/index.d.ts +69 -0
  207. package/dist/components/Navbar/index.d.ts.map +1 -1
  208. package/dist/components/Navbar/index.mjs.map +1 -1
  209. package/dist/components/Navbar/useNavigation.cjs +8 -1
  210. package/dist/components/Navbar/useNavigation.cjs.map +1 -1
  211. package/dist/components/Navbar/useNavigation.d.ts +83 -0
  212. package/dist/components/Navbar/useNavigation.d.ts.map +1 -1
  213. package/dist/components/Navbar/useNavigation.mjs +8 -1
  214. package/dist/components/Navbar/useNavigation.mjs.map +1 -1
  215. package/dist/components/Pattern/DotPattern.cjs.map +1 -1
  216. package/dist/components/Pattern/DotPattern.d.ts +101 -0
  217. package/dist/components/Pattern/DotPattern.d.ts.map +1 -1
  218. package/dist/components/Pattern/DotPattern.mjs.map +1 -1
  219. package/dist/components/Pattern/GridPattern.cjs.map +1 -1
  220. package/dist/components/Pattern/GridPattern.d.ts +114 -0
  221. package/dist/components/Pattern/GridPattern.d.ts.map +1 -1
  222. package/dist/components/Pattern/GridPattern.mjs.map +1 -1
  223. package/dist/components/Pattern/SpotLight.cjs.map +1 -1
  224. package/dist/components/Pattern/SpotLight.d.ts +125 -0
  225. package/dist/components/Pattern/SpotLight.d.ts.map +1 -1
  226. package/dist/components/Pattern/SpotLight.mjs.map +1 -1
  227. package/dist/components/Popover/index.cjs +10 -10
  228. package/dist/components/Popover/index.cjs.map +1 -1
  229. package/dist/components/Popover/index.d.ts +110 -15
  230. package/dist/components/Popover/index.d.ts.map +1 -1
  231. package/dist/components/Popover/index.mjs +10 -10
  232. package/dist/components/Popover/index.mjs.map +1 -1
  233. package/dist/components/PressableSpan/PressableSpan.cjs +22 -5
  234. package/dist/components/PressableSpan/PressableSpan.cjs.map +1 -1
  235. package/dist/components/PressableSpan/PressableSpan.d.ts +105 -3
  236. package/dist/components/PressableSpan/PressableSpan.d.ts.map +1 -1
  237. package/dist/components/PressableSpan/PressableSpan.mjs +22 -5
  238. package/dist/components/PressableSpan/PressableSpan.mjs.map +1 -1
  239. package/dist/components/RightDrawer/RightDrawer.cjs.map +1 -1
  240. package/dist/components/RightDrawer/RightDrawer.d.ts +182 -0
  241. package/dist/components/RightDrawer/RightDrawer.d.ts.map +1 -1
  242. package/dist/components/RightDrawer/RightDrawer.mjs.map +1 -1
  243. package/dist/components/RightDrawer/isElementAtTopAndNotCovered.cjs.map +1 -1
  244. package/dist/components/RightDrawer/isElementAtTopAndNotCovered.d.ts +44 -0
  245. package/dist/components/RightDrawer/isElementAtTopAndNotCovered.d.ts.map +1 -1
  246. package/dist/components/RightDrawer/isElementAtTopAndNotCovered.mjs.map +1 -1
  247. package/dist/components/RightDrawer/useRightDrawerStore.cjs.map +1 -1
  248. package/dist/components/RightDrawer/useRightDrawerStore.d.ts +102 -0
  249. package/dist/components/RightDrawer/useRightDrawerStore.d.ts.map +1 -1
  250. package/dist/components/RightDrawer/useRightDrawerStore.mjs.map +1 -1
  251. package/dist/components/Select/Multiselect.cjs.map +1 -1
  252. package/dist/components/Select/Multiselect.d.ts +125 -18
  253. package/dist/components/Select/Multiselect.d.ts.map +1 -1
  254. package/dist/components/Select/Multiselect.mjs.map +1 -1
  255. package/dist/components/Select/Select.cjs.map +1 -1
  256. package/dist/components/Select/Select.d.ts +214 -7
  257. package/dist/components/Select/Select.d.ts.map +1 -1
  258. package/dist/components/Select/Select.mjs.map +1 -1
  259. package/dist/components/SwitchSelector/index.cjs.map +1 -1
  260. package/dist/components/SwitchSelector/index.d.ts +157 -8
  261. package/dist/components/SwitchSelector/index.d.ts.map +1 -1
  262. package/dist/components/SwitchSelector/index.mjs.map +1 -1
  263. package/dist/components/Table/Table.cjs.map +1 -1
  264. package/dist/components/Table/Table.d.ts +184 -0
  265. package/dist/components/Table/Table.d.ts.map +1 -1
  266. package/dist/components/Table/Table.mjs.map +1 -1
  267. package/dist/components/Tag/index.cjs.map +1 -1
  268. package/dist/components/Tag/index.d.ts +223 -0
  269. package/dist/components/Tag/index.d.ts.map +1 -1
  270. package/dist/components/Tag/index.mjs.map +1 -1
  271. package/dist/components/TextArea/AutoSizeTextArea.cjs.map +1 -1
  272. package/dist/components/TextArea/AutoSizeTextArea.d.ts +91 -0
  273. package/dist/components/TextArea/AutoSizeTextArea.d.ts.map +1 -1
  274. package/dist/components/TextArea/AutoSizeTextArea.mjs.map +1 -1
  275. package/dist/components/TextArea/AutocompleteTextArea.cjs.map +1 -1
  276. package/dist/components/TextArea/AutocompleteTextArea.d.ts +145 -0
  277. package/dist/components/TextArea/AutocompleteTextArea.d.ts.map +1 -1
  278. package/dist/components/TextArea/AutocompleteTextArea.mjs.map +1 -1
  279. package/dist/components/TextArea/TextArea.cjs.map +1 -1
  280. package/dist/components/TextArea/TextArea.d.ts +74 -0
  281. package/dist/components/TextArea/TextArea.d.ts.map +1 -1
  282. package/dist/components/TextArea/TextArea.mjs.map +1 -1
  283. package/dist/components/Toaster/Toast.cjs +4 -0
  284. package/dist/components/Toaster/Toast.cjs.map +1 -1
  285. package/dist/components/Toaster/Toast.d.ts +148 -2
  286. package/dist/components/Toaster/Toast.d.ts.map +1 -1
  287. package/dist/components/Toaster/Toast.mjs +4 -0
  288. package/dist/components/Toaster/Toast.mjs.map +1 -1
  289. package/dist/components/Toaster/Toaster.cjs.map +1 -1
  290. package/dist/components/Toaster/Toaster.d.ts +42 -0
  291. package/dist/components/Toaster/Toaster.d.ts.map +1 -1
  292. package/dist/components/Toaster/Toaster.mjs.map +1 -1
  293. package/dist/components/Toaster/useToast.cjs.map +1 -1
  294. package/dist/components/Toaster/useToast.d.ts +199 -2
  295. package/dist/components/Toaster/useToast.d.ts.map +1 -1
  296. package/dist/components/Toaster/useToast.mjs.map +1 -1
  297. package/dist/components/WithResizer/index.cjs.map +1 -1
  298. package/dist/components/WithResizer/index.d.ts +143 -0
  299. package/dist/components/WithResizer/index.d.ts.map +1 -1
  300. package/dist/components/WithResizer/index.mjs.map +1 -1
  301. package/dist/components/index.cjs +2 -2
  302. package/dist/components/index.d.ts +0 -1
  303. package/dist/components/index.d.ts.map +1 -1
  304. package/dist/components/index.mjs +4 -4
  305. package/dist/components/index.mjs.map +1 -1
  306. package/dist/hooks/auth.cjs +2 -2
  307. package/dist/hooks/auth.cjs.map +1 -1
  308. package/dist/hooks/auth.mjs +2 -2
  309. package/dist/hooks/auth.mjs.map +1 -1
  310. package/dist/hooks/reactQuery.cjs +2 -1
  311. package/dist/hooks/reactQuery.cjs.map +1 -1
  312. package/dist/hooks/reactQuery.d.ts +1 -1
  313. package/dist/hooks/reactQuery.d.ts.map +1 -1
  314. package/dist/hooks/reactQuery.mjs +2 -1
  315. package/dist/hooks/reactQuery.mjs.map +1 -1
  316. package/dist/hooks/useAuth/useOAuth2.cjs +3 -3
  317. package/dist/hooks/useAuth/useOAuth2.cjs.map +1 -1
  318. package/dist/hooks/useAuth/useOAuth2.mjs +3 -3
  319. package/dist/hooks/useAuth/useOAuth2.mjs.map +1 -1
  320. package/dist/hooks/useAuth/useSession.cjs +3 -3
  321. package/dist/hooks/useAuth/useSession.cjs.map +1 -1
  322. package/dist/hooks/useAuth/useSession.mjs +3 -3
  323. package/dist/hooks/useAuth/useSession.mjs.map +1 -1
  324. package/dist/utils/image.cjs +30 -0
  325. package/dist/utils/image.cjs.map +1 -0
  326. package/dist/utils/image.d.ts +37 -0
  327. package/dist/utils/image.d.ts.map +1 -0
  328. package/dist/utils/image.mjs +30 -0
  329. package/dist/utils/image.mjs.map +1 -0
  330. package/package.json +20 -18
  331. package/dist/utils/capitalize.cjs +0 -10
  332. package/dist/utils/capitalize.cjs.map +0 -1
  333. package/dist/utils/capitalize.d.ts +0 -2
  334. package/dist/utils/capitalize.d.ts.map +0 -1
  335. package/dist/utils/capitalize.mjs +0 -10
  336. package/dist/utils/capitalize.mjs.map +0 -1
@@ -1,2 +1,4 @@
1
1
  export * from './ContentEditor';
2
+ export * from './ContentEditorInput';
3
+ export * from './ContentEditorTextArea';
2
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ContentEditor/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ContentEditor/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC"}
@@ -1,5 +1,9 @@
1
1
  import { ContentEditor } from "./ContentEditor.mjs";
2
+ import { ContentEditorInput } from "./ContentEditorInput.mjs";
3
+ import { ContentEditorTextArea } from "./ContentEditorTextArea.mjs";
2
4
  export {
3
- ContentEditor
5
+ ContentEditor,
6
+ ContentEditorInput,
7
+ ContentEditorTextArea
4
8
  };
5
9
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
1
+ {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
@@ -7,13 +7,21 @@ const ContentSelector = ({
7
7
  children,
8
8
  onSelect,
9
9
  onUnselect,
10
- isSelecting
10
+ isSelecting,
11
+ pressDuration,
12
+ className,
13
+ "aria-label": ariaLabel,
14
+ "aria-describedby": ariaDescribedBy
11
15
  }) => /* @__PURE__ */ jsxRuntime.jsx(
12
16
  components_PressableSpan_PressableSpan.PressableSpan,
13
17
  {
14
18
  onPress: onSelect,
15
19
  onClickOutside: onUnselect,
16
20
  isSelecting,
21
+ pressDuration,
22
+ className,
23
+ "aria-label": ariaLabel,
24
+ "aria-describedby": ariaDescribedBy,
17
25
  children
18
26
  }
19
27
  );
@@ -1 +1 @@
1
- {"version":3,"file":"ContentSelector.cjs","sources":["../../../src/components/ContentSelector/ContentSelector.tsx"],"sourcesContent":["'use client';\n\nimport type { FC, ReactNode } from 'react';\nimport { PressableSpan } from '../PressableSpan';\n\ntype ContentSelectorProps = {\n children: ReactNode;\n onSelect: () => void;\n onUnselect?: () => void;\n isSelecting?: boolean;\n};\n\nexport const ContentSelector: FC<ContentSelectorProps> = ({\n children,\n onSelect,\n onUnselect,\n isSelecting,\n}) => (\n <PressableSpan\n onPress={onSelect}\n onClickOutside={onUnselect}\n isSelecting={isSelecting}\n >\n {children}\n </PressableSpan>\n);\n"],"names":["jsx","PressableSpan"],"mappings":";;;;;AAYO,MAAM,kBAA4C,CAAC;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MACEA,2BAAAA;AAAAA,EAACC,uCAAAA;AAAAA,EAAA;AAAA,IACC,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB;AAAA,IAEC;AAAA,EAAA;AACH;;"}
1
+ {"version":3,"file":"ContentSelector.cjs","sources":["../../../src/components/ContentSelector/ContentSelector.tsx"],"sourcesContent":["'use client';\n\nimport type { FC, ReactNode } from 'react';\nimport { PressableSpan } from '../PressableSpan';\n\n/**\n * Props for the ContentSelector component\n */\ntype ContentSelectorProps = {\n /**\n * The content to be displayed and made selectable\n * @example\n * ```tsx\n * <ContentSelector onSelect={() => startEditing()}>\n * <h1>Selectable Heading</h1>\n * </ContentSelector>\n * ```\n */\n children: ReactNode;\n\n /**\n * Callback function triggered when content is selected via long press or keyboard\n * @example\n * ```tsx\n * <ContentSelector\n * onSelect={() => setEditMode(true)}\n * onUnselect={() => setEditMode(false)}\n * >\n * Click content to edit\n * </ContentSelector>\n * ```\n */\n onSelect: () => void;\n\n /**\n * Optional callback function triggered when clicking outside the selected content\n * Used to deselect the content and exit edit/selection mode\n * @example\n * ```tsx\n * <ContentSelector\n * onSelect={() => enterEditMode()}\n * onUnselect={() => exitEditMode()}\n * >\n * Editable content with auto-deselect\n * </ContentSelector>\n * ```\n */\n onUnselect?: () => void;\n\n /**\n * External control for the selection state\n * When provided, overrides the internal selection state\n * @example\n * ```tsx\n * <ContentSelector\n * isSelecting={isInEditMode}\n * onSelect={() => {}}\n * >\n * Externally controlled content\n * </ContentSelector>\n * ```\n */\n isSelecting?: boolean;\n\n /**\n * Duration in milliseconds for long press detection\n * @default 400\n * @example\n * ```tsx\n * <ContentSelector\n * pressDuration={600}\n * onSelect={() => activateSlowSelection()}\n * >\n * Requires longer press\n * </ContentSelector>\n * ```\n */\n pressDuration?: number;\n\n /**\n * Additional CSS classes for styling the selectable content\n * @example\n * ```tsx\n * <ContentSelector\n * className=\"border-2 border-dashed border-blue-300\"\n * onSelect={() => {}}\n * >\n * Styled selectable content\n * </ContentSelector>\n * ```\n */\n className?: string;\n\n /**\n * ARIA label for accessibility\n * Provides context about what happens when the content is selected\n * @example\n * ```tsx\n * <ContentSelector\n * aria-label=\"Select to edit this content\"\n * onSelect={() => {}}\n * >\n * Content with accessibility context\n * </ContentSelector>\n * ```\n */\n 'aria-label'?: string;\n\n /**\n * ID of element providing additional description\n * @example\n * ```tsx\n * <ContentSelector\n * aria-describedby=\"help-text\"\n * onSelect={() => {}}\n * >\n * Content with help\n * </ContentSelector>\n * <div id=\"help-text\">Long press to edit</div>\n * ```\n */\n 'aria-describedby'?: string;\n};\n\n/**\n * ContentSelector - A higher-level wrapper around PressableSpan for content selection\n *\n * This component provides a semantic interface for making any content selectable through\n * long press gestures. It's specifically designed for content management interfaces\n * where users need to select text, images, or other elements to perform actions like\n * editing, moving, or applying operations.\n *\n * ## Key Features\n * - **Content Selection**: Makes any React content selectable via long press\n * - **Visual Feedback**: Inherits outline-based selection indicators from PressableSpan\n * - **Accessibility**: Full keyboard navigation and screen reader support\n * - **Click Outside**: Automatic deselection when clicking elsewhere\n * - **External Control**: Can be controlled externally for complex selection states\n *\n * ## Use Cases\n * - Content management systems with inline editing\n * - Text and media selection interfaces\n * - Interactive documentation with selectable sections\n * - Dashboard widgets with configurable content\n * - Form builders with selectable form elements\n *\n * ## Accessibility\n * - Inherits all accessibility features from PressableSpan\n * - Keyboard navigation with Tab, Enter, Space, and Escape\n * - Screen reader announcements for selection states\n * - Focus management and proper ARIA attributes\n *\n * @example\n * Basic content selection:\n * ```tsx\n * <ContentSelector onSelect={() => setIsEditing(true)}>\n * <p>This paragraph becomes selectable</p>\n * </ContentSelector>\n * ```\n *\n * @example\n * With deselection handling:\n * ```tsx\n * <ContentSelector\n * onSelect={() => setSelectedContent(contentId)}\n * onUnselect={() => setSelectedContent(null)}\n * >\n * <div className=\"content-block\">\n * <h2>Selectable Content Block</h2>\n * <p>Long press to select this entire block</p>\n * </div>\n * </ContentSelector>\n * ```\n *\n * @example\n * Controlled selection state:\n * ```tsx\n * <ContentSelector\n * isSelecting={selectedItems.includes(itemId)}\n * onSelect={() => selectItem(itemId)}\n * onUnselect={() => deselectItem(itemId)}\n * >\n * <ContentCard data={cardData} />\n * </ContentSelector>\n * ```\n */\n\nexport const ContentSelector: FC<ContentSelectorProps> = ({\n children,\n onSelect,\n onUnselect,\n isSelecting,\n pressDuration,\n className,\n 'aria-label': ariaLabel,\n 'aria-describedby': ariaDescribedBy,\n}) => (\n <PressableSpan\n onPress={onSelect}\n onClickOutside={onUnselect}\n isSelecting={isSelecting}\n pressDuration={pressDuration}\n className={className}\n aria-label={ariaLabel}\n aria-describedby={ariaDescribedBy}\n >\n {children}\n </PressableSpan>\n);\n"],"names":["jsx","PressableSpan"],"mappings":";;;;;AA2LO,MAAM,kBAA4C,CAAC;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,oBAAoB;AACtB,MACEA,2BAAAA;AAAAA,EAACC,uCAAAA;AAAAA,EAAA;AAAA,IACC,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAY;AAAA,IACZ,oBAAkB;AAAA,IAEjB;AAAA,EAAA;AACH;;"}
@@ -1,10 +1,177 @@
1
1
  import { FC, ReactNode } from 'react';
2
+ /**
3
+ * Props for the ContentSelector component
4
+ */
2
5
  type ContentSelectorProps = {
6
+ /**
7
+ * The content to be displayed and made selectable
8
+ * @example
9
+ * ```tsx
10
+ * <ContentSelector onSelect={() => startEditing()}>
11
+ * <h1>Selectable Heading</h1>
12
+ * </ContentSelector>
13
+ * ```
14
+ */
3
15
  children: ReactNode;
16
+ /**
17
+ * Callback function triggered when content is selected via long press or keyboard
18
+ * @example
19
+ * ```tsx
20
+ * <ContentSelector
21
+ * onSelect={() => setEditMode(true)}
22
+ * onUnselect={() => setEditMode(false)}
23
+ * >
24
+ * Click content to edit
25
+ * </ContentSelector>
26
+ * ```
27
+ */
4
28
  onSelect: () => void;
29
+ /**
30
+ * Optional callback function triggered when clicking outside the selected content
31
+ * Used to deselect the content and exit edit/selection mode
32
+ * @example
33
+ * ```tsx
34
+ * <ContentSelector
35
+ * onSelect={() => enterEditMode()}
36
+ * onUnselect={() => exitEditMode()}
37
+ * >
38
+ * Editable content with auto-deselect
39
+ * </ContentSelector>
40
+ * ```
41
+ */
5
42
  onUnselect?: () => void;
43
+ /**
44
+ * External control for the selection state
45
+ * When provided, overrides the internal selection state
46
+ * @example
47
+ * ```tsx
48
+ * <ContentSelector
49
+ * isSelecting={isInEditMode}
50
+ * onSelect={() => {}}
51
+ * >
52
+ * Externally controlled content
53
+ * </ContentSelector>
54
+ * ```
55
+ */
6
56
  isSelecting?: boolean;
57
+ /**
58
+ * Duration in milliseconds for long press detection
59
+ * @default 400
60
+ * @example
61
+ * ```tsx
62
+ * <ContentSelector
63
+ * pressDuration={600}
64
+ * onSelect={() => activateSlowSelection()}
65
+ * >
66
+ * Requires longer press
67
+ * </ContentSelector>
68
+ * ```
69
+ */
70
+ pressDuration?: number;
71
+ /**
72
+ * Additional CSS classes for styling the selectable content
73
+ * @example
74
+ * ```tsx
75
+ * <ContentSelector
76
+ * className="border-2 border-dashed border-blue-300"
77
+ * onSelect={() => {}}
78
+ * >
79
+ * Styled selectable content
80
+ * </ContentSelector>
81
+ * ```
82
+ */
83
+ className?: string;
84
+ /**
85
+ * ARIA label for accessibility
86
+ * Provides context about what happens when the content is selected
87
+ * @example
88
+ * ```tsx
89
+ * <ContentSelector
90
+ * aria-label="Select to edit this content"
91
+ * onSelect={() => {}}
92
+ * >
93
+ * Content with accessibility context
94
+ * </ContentSelector>
95
+ * ```
96
+ */
97
+ 'aria-label'?: string;
98
+ /**
99
+ * ID of element providing additional description
100
+ * @example
101
+ * ```tsx
102
+ * <ContentSelector
103
+ * aria-describedby="help-text"
104
+ * onSelect={() => {}}
105
+ * >
106
+ * Content with help
107
+ * </ContentSelector>
108
+ * <div id="help-text">Long press to edit</div>
109
+ * ```
110
+ */
111
+ 'aria-describedby'?: string;
7
112
  };
113
+ /**
114
+ * ContentSelector - A higher-level wrapper around PressableSpan for content selection
115
+ *
116
+ * This component provides a semantic interface for making any content selectable through
117
+ * long press gestures. It's specifically designed for content management interfaces
118
+ * where users need to select text, images, or other elements to perform actions like
119
+ * editing, moving, or applying operations.
120
+ *
121
+ * ## Key Features
122
+ * - **Content Selection**: Makes any React content selectable via long press
123
+ * - **Visual Feedback**: Inherits outline-based selection indicators from PressableSpan
124
+ * - **Accessibility**: Full keyboard navigation and screen reader support
125
+ * - **Click Outside**: Automatic deselection when clicking elsewhere
126
+ * - **External Control**: Can be controlled externally for complex selection states
127
+ *
128
+ * ## Use Cases
129
+ * - Content management systems with inline editing
130
+ * - Text and media selection interfaces
131
+ * - Interactive documentation with selectable sections
132
+ * - Dashboard widgets with configurable content
133
+ * - Form builders with selectable form elements
134
+ *
135
+ * ## Accessibility
136
+ * - Inherits all accessibility features from PressableSpan
137
+ * - Keyboard navigation with Tab, Enter, Space, and Escape
138
+ * - Screen reader announcements for selection states
139
+ * - Focus management and proper ARIA attributes
140
+ *
141
+ * @example
142
+ * Basic content selection:
143
+ * ```tsx
144
+ * <ContentSelector onSelect={() => setIsEditing(true)}>
145
+ * <p>This paragraph becomes selectable</p>
146
+ * </ContentSelector>
147
+ * ```
148
+ *
149
+ * @example
150
+ * With deselection handling:
151
+ * ```tsx
152
+ * <ContentSelector
153
+ * onSelect={() => setSelectedContent(contentId)}
154
+ * onUnselect={() => setSelectedContent(null)}
155
+ * >
156
+ * <div className="content-block">
157
+ * <h2>Selectable Content Block</h2>
158
+ * <p>Long press to select this entire block</p>
159
+ * </div>
160
+ * </ContentSelector>
161
+ * ```
162
+ *
163
+ * @example
164
+ * Controlled selection state:
165
+ * ```tsx
166
+ * <ContentSelector
167
+ * isSelecting={selectedItems.includes(itemId)}
168
+ * onSelect={() => selectItem(itemId)}
169
+ * onUnselect={() => deselectItem(itemId)}
170
+ * >
171
+ * <ContentCard data={cardData} />
172
+ * </ContentSelector>
173
+ * ```
174
+ */
8
175
  export declare const ContentSelector: FC<ContentSelectorProps>;
9
176
  export {};
10
177
  //# sourceMappingURL=ContentSelector.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ContentSelector.d.ts","sourceRoot":"","sources":["../../../src/components/ContentSelector/ContentSelector.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAG3C,KAAK,oBAAoB,GAAG;IAC1B,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC,oBAAoB,CAapD,CAAC"}
1
+ {"version":3,"file":"ContentSelector.d.ts","sourceRoot":"","sources":["../../../src/components/ContentSelector/ContentSelector.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAG3C;;GAEG;AACH,KAAK,oBAAoB,GAAG;IAC1B;;;;;;;;OAQG;IACH,QAAQ,EAAE,SAAS,CAAC;IAEpB;;;;;;;;;;;OAWG;IACH,QAAQ,EAAE,MAAM,IAAI,CAAC;IAErB;;;;;;;;;;;;OAYG;IACH,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IAExB;;;;;;;;;;;;OAYG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;;;;;;;;;;;OAYG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;;;;;;;;;OAYG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;;;;;;;;;;OAYG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG;AAEH,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC,oBAAoB,CAqBpD,CAAC"}
@@ -5,13 +5,21 @@ const ContentSelector = ({
5
5
  children,
6
6
  onSelect,
7
7
  onUnselect,
8
- isSelecting
8
+ isSelecting,
9
+ pressDuration,
10
+ className,
11
+ "aria-label": ariaLabel,
12
+ "aria-describedby": ariaDescribedBy
9
13
  }) => /* @__PURE__ */ jsx(
10
14
  PressableSpan,
11
15
  {
12
16
  onPress: onSelect,
13
17
  onClickOutside: onUnselect,
14
18
  isSelecting,
19
+ pressDuration,
20
+ className,
21
+ "aria-label": ariaLabel,
22
+ "aria-describedby": ariaDescribedBy,
15
23
  children
16
24
  }
17
25
  );
@@ -1 +1 @@
1
- {"version":3,"file":"ContentSelector.mjs","sources":["../../../src/components/ContentSelector/ContentSelector.tsx"],"sourcesContent":["'use client';\n\nimport type { FC, ReactNode } from 'react';\nimport { PressableSpan } from '../PressableSpan';\n\ntype ContentSelectorProps = {\n children: ReactNode;\n onSelect: () => void;\n onUnselect?: () => void;\n isSelecting?: boolean;\n};\n\nexport const ContentSelector: FC<ContentSelectorProps> = ({\n children,\n onSelect,\n onUnselect,\n isSelecting,\n}) => (\n <PressableSpan\n onPress={onSelect}\n onClickOutside={onUnselect}\n isSelecting={isSelecting}\n >\n {children}\n </PressableSpan>\n);\n"],"names":[],"mappings":";;;AAYO,MAAM,kBAA4C,CAAC;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MACE;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB;AAAA,IAEC;AAAA,EAAA;AACH;"}
1
+ {"version":3,"file":"ContentSelector.mjs","sources":["../../../src/components/ContentSelector/ContentSelector.tsx"],"sourcesContent":["'use client';\n\nimport type { FC, ReactNode } from 'react';\nimport { PressableSpan } from '../PressableSpan';\n\n/**\n * Props for the ContentSelector component\n */\ntype ContentSelectorProps = {\n /**\n * The content to be displayed and made selectable\n * @example\n * ```tsx\n * <ContentSelector onSelect={() => startEditing()}>\n * <h1>Selectable Heading</h1>\n * </ContentSelector>\n * ```\n */\n children: ReactNode;\n\n /**\n * Callback function triggered when content is selected via long press or keyboard\n * @example\n * ```tsx\n * <ContentSelector\n * onSelect={() => setEditMode(true)}\n * onUnselect={() => setEditMode(false)}\n * >\n * Click content to edit\n * </ContentSelector>\n * ```\n */\n onSelect: () => void;\n\n /**\n * Optional callback function triggered when clicking outside the selected content\n * Used to deselect the content and exit edit/selection mode\n * @example\n * ```tsx\n * <ContentSelector\n * onSelect={() => enterEditMode()}\n * onUnselect={() => exitEditMode()}\n * >\n * Editable content with auto-deselect\n * </ContentSelector>\n * ```\n */\n onUnselect?: () => void;\n\n /**\n * External control for the selection state\n * When provided, overrides the internal selection state\n * @example\n * ```tsx\n * <ContentSelector\n * isSelecting={isInEditMode}\n * onSelect={() => {}}\n * >\n * Externally controlled content\n * </ContentSelector>\n * ```\n */\n isSelecting?: boolean;\n\n /**\n * Duration in milliseconds for long press detection\n * @default 400\n * @example\n * ```tsx\n * <ContentSelector\n * pressDuration={600}\n * onSelect={() => activateSlowSelection()}\n * >\n * Requires longer press\n * </ContentSelector>\n * ```\n */\n pressDuration?: number;\n\n /**\n * Additional CSS classes for styling the selectable content\n * @example\n * ```tsx\n * <ContentSelector\n * className=\"border-2 border-dashed border-blue-300\"\n * onSelect={() => {}}\n * >\n * Styled selectable content\n * </ContentSelector>\n * ```\n */\n className?: string;\n\n /**\n * ARIA label for accessibility\n * Provides context about what happens when the content is selected\n * @example\n * ```tsx\n * <ContentSelector\n * aria-label=\"Select to edit this content\"\n * onSelect={() => {}}\n * >\n * Content with accessibility context\n * </ContentSelector>\n * ```\n */\n 'aria-label'?: string;\n\n /**\n * ID of element providing additional description\n * @example\n * ```tsx\n * <ContentSelector\n * aria-describedby=\"help-text\"\n * onSelect={() => {}}\n * >\n * Content with help\n * </ContentSelector>\n * <div id=\"help-text\">Long press to edit</div>\n * ```\n */\n 'aria-describedby'?: string;\n};\n\n/**\n * ContentSelector - A higher-level wrapper around PressableSpan for content selection\n *\n * This component provides a semantic interface for making any content selectable through\n * long press gestures. It's specifically designed for content management interfaces\n * where users need to select text, images, or other elements to perform actions like\n * editing, moving, or applying operations.\n *\n * ## Key Features\n * - **Content Selection**: Makes any React content selectable via long press\n * - **Visual Feedback**: Inherits outline-based selection indicators from PressableSpan\n * - **Accessibility**: Full keyboard navigation and screen reader support\n * - **Click Outside**: Automatic deselection when clicking elsewhere\n * - **External Control**: Can be controlled externally for complex selection states\n *\n * ## Use Cases\n * - Content management systems with inline editing\n * - Text and media selection interfaces\n * - Interactive documentation with selectable sections\n * - Dashboard widgets with configurable content\n * - Form builders with selectable form elements\n *\n * ## Accessibility\n * - Inherits all accessibility features from PressableSpan\n * - Keyboard navigation with Tab, Enter, Space, and Escape\n * - Screen reader announcements for selection states\n * - Focus management and proper ARIA attributes\n *\n * @example\n * Basic content selection:\n * ```tsx\n * <ContentSelector onSelect={() => setIsEditing(true)}>\n * <p>This paragraph becomes selectable</p>\n * </ContentSelector>\n * ```\n *\n * @example\n * With deselection handling:\n * ```tsx\n * <ContentSelector\n * onSelect={() => setSelectedContent(contentId)}\n * onUnselect={() => setSelectedContent(null)}\n * >\n * <div className=\"content-block\">\n * <h2>Selectable Content Block</h2>\n * <p>Long press to select this entire block</p>\n * </div>\n * </ContentSelector>\n * ```\n *\n * @example\n * Controlled selection state:\n * ```tsx\n * <ContentSelector\n * isSelecting={selectedItems.includes(itemId)}\n * onSelect={() => selectItem(itemId)}\n * onUnselect={() => deselectItem(itemId)}\n * >\n * <ContentCard data={cardData} />\n * </ContentSelector>\n * ```\n */\n\nexport const ContentSelector: FC<ContentSelectorProps> = ({\n children,\n onSelect,\n onUnselect,\n isSelecting,\n pressDuration,\n className,\n 'aria-label': ariaLabel,\n 'aria-describedby': ariaDescribedBy,\n}) => (\n <PressableSpan\n onPress={onSelect}\n onClickOutside={onUnselect}\n isSelecting={isSelecting}\n pressDuration={pressDuration}\n className={className}\n aria-label={ariaLabel}\n aria-describedby={ariaDescribedBy}\n >\n {children}\n </PressableSpan>\n);\n"],"names":[],"mappings":";;;AA2LO,MAAM,kBAA4C,CAAC;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,oBAAoB;AACtB,MACE;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAY;AAAA,IACZ,oBAAkB;AAAA,IAEjB;AAAA,EAAA;AACH;"}
@@ -8,21 +8,32 @@ const reactIntlayer = require("react-intlayer");
8
8
  const components_Button_Button = require("../Button/Button.cjs");
9
9
  const CopyButton = ({ content, ...props }) => {
10
10
  const [copied, setCopied] = ReactExports.useState(false);
11
+ const [error, setError] = ReactExports.useState(false);
11
12
  const { label } = reactIntlayer.useIntlayer("copy-button");
12
13
  const handleCopy = async () => {
13
14
  try {
15
+ setError(false);
14
16
  await navigator.clipboard.writeText(content);
15
17
  setCopied(true);
16
- } catch (error) {
17
- console.error("Failed to copy text: ", error);
18
+ } catch (error2) {
19
+ console.error("Failed to copy text: ", error2);
20
+ setError(true);
18
21
  }
19
22
  };
20
23
  ReactExports.useEffect(() => {
21
- const timer = setTimeout(() => {
22
- setCopied(false);
23
- }, 1e3);
24
- return () => clearTimeout(timer);
25
- }, [copied]);
24
+ if (copied || error) {
25
+ const timer = setTimeout(() => {
26
+ setCopied(false);
27
+ setError(false);
28
+ }, 1e3);
29
+ return () => clearTimeout(timer);
30
+ }
31
+ }, [copied, error]);
32
+ const getAriaLabel = () => {
33
+ if (copied) return "Content copied to clipboard";
34
+ if (error) return "Failed to copy content";
35
+ return props.label ?? label.value;
36
+ };
26
37
  return /* @__PURE__ */ jsxRuntime.jsx(
27
38
  components_Button_Button.Button,
28
39
  {
@@ -31,8 +42,12 @@ const CopyButton = ({ content, ...props }) => {
31
42
  variant: components_Button_Button.ButtonVariant.HOVERABLE,
32
43
  color: components_Button_Button.ButtonColor.TEXT,
33
44
  size: components_Button_Button.ButtonSize.ICON_SM,
45
+ tabIndex: 0,
46
+ title: getAriaLabel(),
34
47
  ...props,
35
- label: props.label ?? label.value
48
+ label: getAriaLabel(),
49
+ "aria-describedby": copied ? "copy-success" : error ? "copy-error" : void 0,
50
+ className: `${props.className || ""} ${error ? "text-red-500" : copied ? "text-green-500" : ""}`
36
51
  }
37
52
  );
38
53
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../src/components/CopyButton/index.tsx"],"sourcesContent":["'use client';\n\nimport { CopyCheckIcon, CopyIcon } from 'lucide-react';\nimport { useEffect, useState, type FC } from 'react';\nimport { useIntlayer } from 'react-intlayer';\nimport {\n Button,\n ButtonColor,\n ButtonProps,\n ButtonSize,\n ButtonVariant,\n} from '../Button';\n\ntype CopyButtonProps = {\n content: string;\n} & Partial<ButtonProps>;\n\nexport const CopyButton: FC<CopyButtonProps> = ({ content, ...props }) => {\n const [copied, setCopied] = useState(false);\n const { label } = useIntlayer('copy-button');\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(content);\n setCopied(true);\n } catch (error) {\n console.error('Failed to copy text: ', error);\n }\n };\n\n useEffect(() => {\n const timer = setTimeout(() => {\n setCopied(false);\n }, 1000);\n return () => clearTimeout(timer);\n }, [copied]);\n\n return (\n <Button\n Icon={copied ? CopyCheckIcon : CopyIcon}\n onClick={handleCopy}\n variant={ButtonVariant.HOVERABLE}\n color={ButtonColor.TEXT}\n size={ButtonSize.ICON_SM}\n {...props}\n label={props.label ?? label.value}\n />\n );\n};\n"],"names":["useState","useIntlayer","useEffect","jsx","Button","CopyCheckIcon","CopyIcon","ButtonVariant","ButtonColor","ButtonSize"],"mappings":";;;;;;;;AAiBO,MAAM,aAAkC,CAAC,EAAE,SAAS,GAAG,YAAY;AACxE,QAAM,CAAC,QAAQ,SAAS,IAAIA,aAAAA,SAAS,KAAK;AAC1C,QAAM,EAAE,MAAA,IAAUC,cAAAA,YAAY,aAAa;AAE3C,QAAM,aAAa,YAAY;AAC7B,QAAI;AACF,YAAM,UAAU,UAAU,UAAU,OAAO;AAC3C,gBAAU,IAAI;AAAA,IAChB,SAAS,OAAO;AACd,cAAQ,MAAM,yBAAyB,KAAK;AAAA,IAC9C;AAAA,EACF;AAEAC,eAAAA,UAAU,MAAM;AACd,UAAM,QAAQ,WAAW,MAAM;AAC7B,gBAAU,KAAK;AAAA,IACjB,GAAG,GAAI;AACP,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,MAAM,CAAC;AAEX,SACEC,2BAAAA;AAAAA,IAACC,yBAAAA;AAAAA,IAAA;AAAA,MACC,MAAM,SAASC,YAAAA,gBAAgBC,YAAAA;AAAAA,MAC/B,SAAS;AAAA,MACT,SAASC,yBAAAA,cAAc;AAAA,MACvB,OAAOC,yBAAAA,YAAY;AAAA,MACnB,MAAMC,yBAAAA,WAAW;AAAA,MAChB,GAAG;AAAA,MACJ,OAAO,MAAM,SAAS,MAAM;AAAA,IAAA;AAAA,EAAA;AAGlC;;"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../src/components/CopyButton/index.tsx"],"sourcesContent":["'use client';\n\nimport { CopyCheckIcon, CopyIcon } from 'lucide-react';\nimport { useEffect, useState, type FC } from 'react';\nimport { useIntlayer } from 'react-intlayer';\nimport {\n Button,\n ButtonColor,\n ButtonProps,\n ButtonSize,\n ButtonVariant,\n} from '../Button';\n\n/**\n * Props for the CopyButton component\n */\ntype CopyButtonProps = {\n /**\n * The text content to copy to the clipboard\n * @example\n * ```tsx\n * <CopyButton content=\"Hello World!\" />\n * ```\n */\n content: string;\n} & Partial<ButtonProps>;\n\n/**\n * CopyButton - A specialized button component for copying text to the clipboard\n *\n * This component provides a user-friendly way to copy text content to the system clipboard\n * with visual feedback and accessibility features. It uses the modern Clipboard API with\n * fallback error handling, and provides clear visual indication of successful copy operations.\n *\n * ## Key Features\n * - **Clipboard Integration**: Uses modern Clipboard API for reliable text copying\n * - **Visual Feedback**: Icon changes from copy to check mark on successful copy\n * - **Auto-Reset**: Automatically reverts to copy icon after 1 second\n * - **Error Handling**: Graceful error handling with console logging\n * - **Accessibility**: Full keyboard navigation and screen reader support\n * - **Internationalization**: Multi-language support via Intlayer\n *\n * ## Use Cases\n * - Code snippet copying in documentation\n * - Sharing URLs or links\n * - Copying configuration values\n * - Form data duplication\n * - API key or token copying\n * - Text content sharing in interfaces\n *\n * ## Accessibility\n * - Uses semantic button element with proper ARIA labeling\n * - Keyboard accessible (Tab, Enter, Space)\n * - Screen reader announces copy actions\n * - Focus management with visible indicators\n * - Proper error state handling for assistive technologies\n *\n * ## Browser Compatibility\n * - Requires modern browsers with Clipboard API support\n * - Falls back gracefully with error logging for unsupported browsers\n * - Works in secure contexts (HTTPS) as required by Clipboard API\n *\n * @example\n * Basic usage:\n * ```tsx\n * <CopyButton content=\"Text to copy\" />\n * ```\n *\n * @example\n * With custom styling and label:\n * ```tsx\n * <CopyButton\n * content=\"https://example.com/api/endpoint\"\n * label=\"Copy API endpoint\"\n * variant={ButtonVariant.OUTLINE}\n * color={ButtonColor.PRIMARY}\n * size={ButtonSize.ICON_MD}\n * />\n * ```\n *\n * @example\n * In a code block context:\n * ```tsx\n * <div className=\"relative\">\n * <pre className=\"bg-gray-100 p-4 rounded\">\n * <code>npm install @intlayer/design-system</code>\n * </pre>\n * <CopyButton\n * content=\"npm install @intlayer/design-system\"\n * className=\"absolute top-2 right-2\"\n * label=\"Copy installation command\"\n * />\n * </div>\n * ```\n */\n\nexport const CopyButton: FC<CopyButtonProps> = ({ content, ...props }) => {\n const [copied, setCopied] = useState(false);\n const [error, setError] = useState(false);\n const { label } = useIntlayer('copy-button');\n\n const handleCopy = async () => {\n try {\n setError(false);\n await navigator.clipboard.writeText(content);\n setCopied(true);\n } catch (error) {\n console.error('Failed to copy text: ', error);\n setError(true);\n }\n };\n\n useEffect(() => {\n if (copied || error) {\n const timer = setTimeout(() => {\n setCopied(false);\n setError(false);\n }, 1000);\n return () => clearTimeout(timer);\n }\n }, [copied, error]);\n\n // Determine the current state for accessibility\n const getAriaLabel = () => {\n if (copied) return 'Content copied to clipboard';\n if (error) return 'Failed to copy content';\n return props.label ?? label.value;\n };\n\n return (\n <Button\n Icon={copied ? CopyCheckIcon : CopyIcon}\n onClick={handleCopy}\n variant={ButtonVariant.HOVERABLE}\n color={ButtonColor.TEXT}\n size={ButtonSize.ICON_SM}\n tabIndex={0}\n title={getAriaLabel()}\n {...props}\n label={getAriaLabel()}\n aria-describedby={\n copied ? 'copy-success' : error ? 'copy-error' : undefined\n }\n className={`${props.className || ''} ${error ? 'text-red-500' : copied ? 'text-green-500' : ''}`}\n />\n );\n};\n"],"names":["useState","useIntlayer","error","useEffect","jsx","Button","CopyCheckIcon","CopyIcon","ButtonVariant","ButtonColor","ButtonSize"],"mappings":";;;;;;;;AAgGO,MAAM,aAAkC,CAAC,EAAE,SAAS,GAAG,YAAY;AACxE,QAAM,CAAC,QAAQ,SAAS,IAAIA,aAAAA,SAAS,KAAK;AAC1C,QAAM,CAAC,OAAO,QAAQ,IAAIA,aAAAA,SAAS,KAAK;AACxC,QAAM,EAAE,MAAA,IAAUC,cAAAA,YAAY,aAAa;AAE3C,QAAM,aAAa,YAAY;AAC7B,QAAI;AACF,eAAS,KAAK;AACd,YAAM,UAAU,UAAU,UAAU,OAAO;AAC3C,gBAAU,IAAI;AAAA,IAChB,SAASC,QAAO;AACd,cAAQ,MAAM,yBAAyBA,MAAK;AAC5C,eAAS,IAAI;AAAA,IACf;AAAA,EACF;AAEAC,eAAAA,UAAU,MAAM;AACd,QAAI,UAAU,OAAO;AACnB,YAAM,QAAQ,WAAW,MAAM;AAC7B,kBAAU,KAAK;AACf,iBAAS,KAAK;AAAA,MAChB,GAAG,GAAI;AACP,aAAO,MAAM,aAAa,KAAK;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,QAAQ,KAAK,CAAC;AAGlB,QAAM,eAAe,MAAM;AACzB,QAAI,OAAQ,QAAO;AACnB,QAAI,MAAO,QAAO;AAClB,WAAO,MAAM,SAAS,MAAM;AAAA,EAC9B;AAEA,SACEC,2BAAAA;AAAAA,IAACC,yBAAAA;AAAAA,IAAA;AAAA,MACC,MAAM,SAASC,YAAAA,gBAAgBC,YAAAA;AAAAA,MAC/B,SAAS;AAAA,MACT,SAASC,yBAAAA,cAAc;AAAA,MACvB,OAAOC,yBAAAA,YAAY;AAAA,MACnB,MAAMC,yBAAAA,WAAW;AAAA,MACjB,UAAU;AAAA,MACV,OAAO,aAAA;AAAA,MACN,GAAG;AAAA,MACJ,OAAO,aAAA;AAAA,MACP,oBACE,SAAS,iBAAiB,QAAQ,eAAe;AAAA,MAEnD,WAAW,GAAG,MAAM,aAAa,EAAE,IAAI,QAAQ,iBAAiB,SAAS,mBAAmB,EAAE;AAAA,IAAA;AAAA,EAAA;AAGpG;;"}
@@ -1,8 +1,86 @@
1
1
  import { FC } from 'react';
2
2
  import { ButtonProps } from '../Button';
3
+ /**
4
+ * Props for the CopyButton component
5
+ */
3
6
  type CopyButtonProps = {
7
+ /**
8
+ * The text content to copy to the clipboard
9
+ * @example
10
+ * ```tsx
11
+ * <CopyButton content="Hello World!" />
12
+ * ```
13
+ */
4
14
  content: string;
5
15
  } & Partial<ButtonProps>;
16
+ /**
17
+ * CopyButton - A specialized button component for copying text to the clipboard
18
+ *
19
+ * This component provides a user-friendly way to copy text content to the system clipboard
20
+ * with visual feedback and accessibility features. It uses the modern Clipboard API with
21
+ * fallback error handling, and provides clear visual indication of successful copy operations.
22
+ *
23
+ * ## Key Features
24
+ * - **Clipboard Integration**: Uses modern Clipboard API for reliable text copying
25
+ * - **Visual Feedback**: Icon changes from copy to check mark on successful copy
26
+ * - **Auto-Reset**: Automatically reverts to copy icon after 1 second
27
+ * - **Error Handling**: Graceful error handling with console logging
28
+ * - **Accessibility**: Full keyboard navigation and screen reader support
29
+ * - **Internationalization**: Multi-language support via Intlayer
30
+ *
31
+ * ## Use Cases
32
+ * - Code snippet copying in documentation
33
+ * - Sharing URLs or links
34
+ * - Copying configuration values
35
+ * - Form data duplication
36
+ * - API key or token copying
37
+ * - Text content sharing in interfaces
38
+ *
39
+ * ## Accessibility
40
+ * - Uses semantic button element with proper ARIA labeling
41
+ * - Keyboard accessible (Tab, Enter, Space)
42
+ * - Screen reader announces copy actions
43
+ * - Focus management with visible indicators
44
+ * - Proper error state handling for assistive technologies
45
+ *
46
+ * ## Browser Compatibility
47
+ * - Requires modern browsers with Clipboard API support
48
+ * - Falls back gracefully with error logging for unsupported browsers
49
+ * - Works in secure contexts (HTTPS) as required by Clipboard API
50
+ *
51
+ * @example
52
+ * Basic usage:
53
+ * ```tsx
54
+ * <CopyButton content="Text to copy" />
55
+ * ```
56
+ *
57
+ * @example
58
+ * With custom styling and label:
59
+ * ```tsx
60
+ * <CopyButton
61
+ * content="https://example.com/api/endpoint"
62
+ * label="Copy API endpoint"
63
+ * variant={ButtonVariant.OUTLINE}
64
+ * color={ButtonColor.PRIMARY}
65
+ * size={ButtonSize.ICON_MD}
66
+ * />
67
+ * ```
68
+ *
69
+ * @example
70
+ * In a code block context:
71
+ * ```tsx
72
+ * <div className="relative">
73
+ * <pre className="bg-gray-100 p-4 rounded">
74
+ * <code>npm install @intlayer/design-system</code>
75
+ * </pre>
76
+ * <CopyButton
77
+ * content="npm install @intlayer/design-system"
78
+ * className="absolute top-2 right-2"
79
+ * label="Copy installation command"
80
+ * />
81
+ * </div>
82
+ * ```
83
+ */
6
84
  export declare const CopyButton: FC<CopyButtonProps>;
7
85
  export {};
8
86
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/CopyButton/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAuB,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AAErD,OAAO,EAGL,WAAW,EAGZ,MAAM,WAAW,CAAC;AAEnB,KAAK,eAAe,GAAG;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AAEzB,eAAO,MAAM,UAAU,EAAE,EAAE,CAAC,eAAe,CA+B1C,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/CopyButton/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAuB,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AAErD,OAAO,EAGL,WAAW,EAGZ,MAAM,WAAW,CAAC;AAEnB;;GAEG;AACH,KAAK,eAAe,GAAG;IACrB;;;;;;OAMG;IACH,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AAEzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmEG;AAEH,eAAO,MAAM,UAAU,EAAE,EAAE,CAAC,eAAe,CAkD1C,CAAC"}
@@ -6,21 +6,32 @@ import { useIntlayer } from "react-intlayer";
6
6
  import { Button, ButtonSize, ButtonColor, ButtonVariant } from "../Button/Button.mjs";
7
7
  const CopyButton = ({ content, ...props }) => {
8
8
  const [copied, setCopied] = useState(false);
9
+ const [error, setError] = useState(false);
9
10
  const { label } = useIntlayer("copy-button");
10
11
  const handleCopy = async () => {
11
12
  try {
13
+ setError(false);
12
14
  await navigator.clipboard.writeText(content);
13
15
  setCopied(true);
14
- } catch (error) {
15
- console.error("Failed to copy text: ", error);
16
+ } catch (error2) {
17
+ console.error("Failed to copy text: ", error2);
18
+ setError(true);
16
19
  }
17
20
  };
18
21
  useEffect(() => {
19
- const timer = setTimeout(() => {
20
- setCopied(false);
21
- }, 1e3);
22
- return () => clearTimeout(timer);
23
- }, [copied]);
22
+ if (copied || error) {
23
+ const timer = setTimeout(() => {
24
+ setCopied(false);
25
+ setError(false);
26
+ }, 1e3);
27
+ return () => clearTimeout(timer);
28
+ }
29
+ }, [copied, error]);
30
+ const getAriaLabel = () => {
31
+ if (copied) return "Content copied to clipboard";
32
+ if (error) return "Failed to copy content";
33
+ return props.label ?? label.value;
34
+ };
24
35
  return /* @__PURE__ */ jsx(
25
36
  Button,
26
37
  {
@@ -29,8 +40,12 @@ const CopyButton = ({ content, ...props }) => {
29
40
  variant: ButtonVariant.HOVERABLE,
30
41
  color: ButtonColor.TEXT,
31
42
  size: ButtonSize.ICON_SM,
43
+ tabIndex: 0,
44
+ title: getAriaLabel(),
32
45
  ...props,
33
- label: props.label ?? label.value
46
+ label: getAriaLabel(),
47
+ "aria-describedby": copied ? "copy-success" : error ? "copy-error" : void 0,
48
+ className: `${props.className || ""} ${error ? "text-red-500" : copied ? "text-green-500" : ""}`
34
49
  }
35
50
  );
36
51
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../src/components/CopyButton/index.tsx"],"sourcesContent":["'use client';\n\nimport { CopyCheckIcon, CopyIcon } from 'lucide-react';\nimport { useEffect, useState, type FC } from 'react';\nimport { useIntlayer } from 'react-intlayer';\nimport {\n Button,\n ButtonColor,\n ButtonProps,\n ButtonSize,\n ButtonVariant,\n} from '../Button';\n\ntype CopyButtonProps = {\n content: string;\n} & Partial<ButtonProps>;\n\nexport const CopyButton: FC<CopyButtonProps> = ({ content, ...props }) => {\n const [copied, setCopied] = useState(false);\n const { label } = useIntlayer('copy-button');\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(content);\n setCopied(true);\n } catch (error) {\n console.error('Failed to copy text: ', error);\n }\n };\n\n useEffect(() => {\n const timer = setTimeout(() => {\n setCopied(false);\n }, 1000);\n return () => clearTimeout(timer);\n }, [copied]);\n\n return (\n <Button\n Icon={copied ? CopyCheckIcon : CopyIcon}\n onClick={handleCopy}\n variant={ButtonVariant.HOVERABLE}\n color={ButtonColor.TEXT}\n size={ButtonSize.ICON_SM}\n {...props}\n label={props.label ?? label.value}\n />\n );\n};\n"],"names":[],"mappings":";;;;;;AAiBO,MAAM,aAAkC,CAAC,EAAE,SAAS,GAAG,YAAY;AACxE,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAC1C,QAAM,EAAE,MAAA,IAAU,YAAY,aAAa;AAE3C,QAAM,aAAa,YAAY;AAC7B,QAAI;AACF,YAAM,UAAU,UAAU,UAAU,OAAO;AAC3C,gBAAU,IAAI;AAAA,IAChB,SAAS,OAAO;AACd,cAAQ,MAAM,yBAAyB,KAAK;AAAA,IAC9C;AAAA,EACF;AAEA,YAAU,MAAM;AACd,UAAM,QAAQ,WAAW,MAAM;AAC7B,gBAAU,KAAK;AAAA,IACjB,GAAG,GAAI;AACP,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,MAAM,CAAC;AAEX,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAM,SAAS,gBAAgB;AAAA,MAC/B,SAAS;AAAA,MACT,SAAS,cAAc;AAAA,MACvB,OAAO,YAAY;AAAA,MACnB,MAAM,WAAW;AAAA,MAChB,GAAG;AAAA,MACJ,OAAO,MAAM,SAAS,MAAM;AAAA,IAAA;AAAA,EAAA;AAGlC;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../src/components/CopyButton/index.tsx"],"sourcesContent":["'use client';\n\nimport { CopyCheckIcon, CopyIcon } from 'lucide-react';\nimport { useEffect, useState, type FC } from 'react';\nimport { useIntlayer } from 'react-intlayer';\nimport {\n Button,\n ButtonColor,\n ButtonProps,\n ButtonSize,\n ButtonVariant,\n} from '../Button';\n\n/**\n * Props for the CopyButton component\n */\ntype CopyButtonProps = {\n /**\n * The text content to copy to the clipboard\n * @example\n * ```tsx\n * <CopyButton content=\"Hello World!\" />\n * ```\n */\n content: string;\n} & Partial<ButtonProps>;\n\n/**\n * CopyButton - A specialized button component for copying text to the clipboard\n *\n * This component provides a user-friendly way to copy text content to the system clipboard\n * with visual feedback and accessibility features. It uses the modern Clipboard API with\n * fallback error handling, and provides clear visual indication of successful copy operations.\n *\n * ## Key Features\n * - **Clipboard Integration**: Uses modern Clipboard API for reliable text copying\n * - **Visual Feedback**: Icon changes from copy to check mark on successful copy\n * - **Auto-Reset**: Automatically reverts to copy icon after 1 second\n * - **Error Handling**: Graceful error handling with console logging\n * - **Accessibility**: Full keyboard navigation and screen reader support\n * - **Internationalization**: Multi-language support via Intlayer\n *\n * ## Use Cases\n * - Code snippet copying in documentation\n * - Sharing URLs or links\n * - Copying configuration values\n * - Form data duplication\n * - API key or token copying\n * - Text content sharing in interfaces\n *\n * ## Accessibility\n * - Uses semantic button element with proper ARIA labeling\n * - Keyboard accessible (Tab, Enter, Space)\n * - Screen reader announces copy actions\n * - Focus management with visible indicators\n * - Proper error state handling for assistive technologies\n *\n * ## Browser Compatibility\n * - Requires modern browsers with Clipboard API support\n * - Falls back gracefully with error logging for unsupported browsers\n * - Works in secure contexts (HTTPS) as required by Clipboard API\n *\n * @example\n * Basic usage:\n * ```tsx\n * <CopyButton content=\"Text to copy\" />\n * ```\n *\n * @example\n * With custom styling and label:\n * ```tsx\n * <CopyButton\n * content=\"https://example.com/api/endpoint\"\n * label=\"Copy API endpoint\"\n * variant={ButtonVariant.OUTLINE}\n * color={ButtonColor.PRIMARY}\n * size={ButtonSize.ICON_MD}\n * />\n * ```\n *\n * @example\n * In a code block context:\n * ```tsx\n * <div className=\"relative\">\n * <pre className=\"bg-gray-100 p-4 rounded\">\n * <code>npm install @intlayer/design-system</code>\n * </pre>\n * <CopyButton\n * content=\"npm install @intlayer/design-system\"\n * className=\"absolute top-2 right-2\"\n * label=\"Copy installation command\"\n * />\n * </div>\n * ```\n */\n\nexport const CopyButton: FC<CopyButtonProps> = ({ content, ...props }) => {\n const [copied, setCopied] = useState(false);\n const [error, setError] = useState(false);\n const { label } = useIntlayer('copy-button');\n\n const handleCopy = async () => {\n try {\n setError(false);\n await navigator.clipboard.writeText(content);\n setCopied(true);\n } catch (error) {\n console.error('Failed to copy text: ', error);\n setError(true);\n }\n };\n\n useEffect(() => {\n if (copied || error) {\n const timer = setTimeout(() => {\n setCopied(false);\n setError(false);\n }, 1000);\n return () => clearTimeout(timer);\n }\n }, [copied, error]);\n\n // Determine the current state for accessibility\n const getAriaLabel = () => {\n if (copied) return 'Content copied to clipboard';\n if (error) return 'Failed to copy content';\n return props.label ?? label.value;\n };\n\n return (\n <Button\n Icon={copied ? CopyCheckIcon : CopyIcon}\n onClick={handleCopy}\n variant={ButtonVariant.HOVERABLE}\n color={ButtonColor.TEXT}\n size={ButtonSize.ICON_SM}\n tabIndex={0}\n title={getAriaLabel()}\n {...props}\n label={getAriaLabel()}\n aria-describedby={\n copied ? 'copy-success' : error ? 'copy-error' : undefined\n }\n className={`${props.className || ''} ${error ? 'text-red-500' : copied ? 'text-green-500' : ''}`}\n />\n );\n};\n"],"names":["error"],"mappings":";;;;;;AAgGO,MAAM,aAAkC,CAAC,EAAE,SAAS,GAAG,YAAY;AACxE,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAC1C,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,KAAK;AACxC,QAAM,EAAE,MAAA,IAAU,YAAY,aAAa;AAE3C,QAAM,aAAa,YAAY;AAC7B,QAAI;AACF,eAAS,KAAK;AACd,YAAM,UAAU,UAAU,UAAU,OAAO;AAC3C,gBAAU,IAAI;AAAA,IAChB,SAASA,QAAO;AACd,cAAQ,MAAM,yBAAyBA,MAAK;AAC5C,eAAS,IAAI;AAAA,IACf;AAAA,EACF;AAEA,YAAU,MAAM;AACd,QAAI,UAAU,OAAO;AACnB,YAAM,QAAQ,WAAW,MAAM;AAC7B,kBAAU,KAAK;AACf,iBAAS,KAAK;AAAA,MAChB,GAAG,GAAI;AACP,aAAO,MAAM,aAAa,KAAK;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,QAAQ,KAAK,CAAC;AAGlB,QAAM,eAAe,MAAM;AACzB,QAAI,OAAQ,QAAO;AACnB,QAAI,MAAO,QAAO;AAClB,WAAO,MAAM,SAAS,MAAM;AAAA,EAC9B;AAEA,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAM,SAAS,gBAAgB;AAAA,MAC/B,SAAS;AAAA,MACT,SAAS,cAAc;AAAA,MACvB,OAAO,YAAY;AAAA,MACnB,MAAM,WAAW;AAAA,MACjB,UAAU;AAAA,MACV,OAAO,aAAA;AAAA,MACN,GAAG;AAAA,MACJ,OAAO,aAAA;AAAA,MACP,oBACE,SAAS,iBAAiB,QAAQ,eAAe;AAAA,MAEnD,WAAW,GAAG,MAAM,aAAa,EAAE,IAAI,QAAQ,iBAAiB,SAAS,mBAAmB,EAAE;AAAA,IAAA;AAAA,EAAA;AAGpG;"}
@@ -8,44 +8,80 @@ const utils_cn = require("../../utils/cn.cjs");
8
8
  const CopyToClipboard = ({
9
9
  text,
10
10
  children,
11
- className
11
+ className,
12
+ "aria-label": ariaLabel = "Copy to clipboard",
13
+ "aria-copied-label": ariaCopiedLabel = "Copied to clipboard",
14
+ feedbackDuration = 2e3,
15
+ onCopySuccess,
16
+ onCopyError
12
17
  }) => {
13
18
  const [isCopied, setIsCopied] = ReactExports.useState(false);
14
- const handleCopy = () => {
15
- navigator.clipboard.writeText(text).then(() => {
19
+ const [copyError, setCopyError] = ReactExports.useState(null);
20
+ const handleCopy = async () => {
21
+ if (!text) return;
22
+ try {
23
+ setCopyError(null);
24
+ if (navigator.clipboard && navigator.clipboard.writeText) {
25
+ await navigator.clipboard.writeText(text);
26
+ } else {
27
+ const textArea = document.createElement("textarea");
28
+ textArea.value = text;
29
+ textArea.style.position = "fixed";
30
+ textArea.style.left = "-999999px";
31
+ textArea.style.top = "-999999px";
32
+ document.body.appendChild(textArea);
33
+ textArea.focus();
34
+ textArea.select();
35
+ document.execCommand("copy");
36
+ document.body.removeChild(textArea);
37
+ }
16
38
  setIsCopied(true);
17
- setTimeout(() => setIsCopied(false), 1e3);
18
- });
39
+ setTimeout(() => setIsCopied(false), feedbackDuration);
40
+ onCopySuccess?.();
41
+ } catch (error) {
42
+ const errorMessage = error instanceof Error ? error.message : "Failed to copy to clipboard";
43
+ setCopyError(errorMessage);
44
+ onCopyError?.(error instanceof Error ? error : new Error(errorMessage));
45
+ setTimeout(() => setCopyError(null), feedbackDuration);
46
+ }
47
+ };
48
+ const handleKeyDown = (event) => {
49
+ if (event.key === "Enter" || event.key === " ") {
50
+ event.preventDefault();
51
+ handleCopy();
52
+ }
19
53
  };
54
+ const currentAriaLabel = copyError ? `Error copying to clipboard: ${copyError}` : isCopied ? ariaCopiedLabel : ariaLabel;
55
+ const IconComponent = copyError ? lucideReact.CopyIcon : isCopied ? lucideReact.CopyCheck : lucideReact.CopyIcon;
20
56
  return /* @__PURE__ */ jsxRuntime.jsxs(
21
57
  "span",
22
58
  {
23
59
  className: utils_cn.cn(
24
- "inline-block gap-2 hover:cursor-pointer hover:bg-neutral/10 rounded-md p-0.5",
60
+ "inline-flex gap-2 hover:cursor-pointer hover:bg-neutral/10 rounded-md p-0.5",
25
61
  className
26
62
  ),
27
63
  onClick: handleCopy,
64
+ onKeyDown: handleKeyDown,
65
+ role: "button",
66
+ tabIndex: 0,
67
+ "aria-label": currentAriaLabel,
68
+ "aria-pressed": isCopied,
69
+ "data-testid": "copy-to-clipboard",
28
70
  children: [
29
71
  children,
30
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex", children: text && (isCopied ? /* @__PURE__ */ jsxRuntime.jsx(
31
- lucideReact.CopyCheck,
32
- {
33
- size: 12,
34
- "aria-label": "copied",
35
- role: "button",
36
- "data-testid": "copy-to-clipboard",
37
- className: "ml-1 mt-1"
38
- }
39
- ) : /* @__PURE__ */ jsxRuntime.jsx(
40
- lucideReact.CopyIcon,
72
+ text && /* @__PURE__ */ jsxRuntime.jsx(
73
+ IconComponent,
41
74
  {
42
75
  size: 12,
43
- "aria-label": "copy",
44
- role: "button",
45
- "data-testid": "copy-to-clipboard",
46
- className: "ml-1 mt-1 cursor-pointer"
76
+ className: utils_cn.cn(
77
+ "ml-1 transition-colors duration-200",
78
+ copyError && "text-destructive",
79
+ isCopied && "text-success",
80
+ !copyError && !isCopied && "text-muted-foreground hover:text-foreground"
81
+ ),
82
+ "aria-hidden": "true"
47
83
  }
48
- )) })
84
+ )
49
85
  ]
50
86
  }
51
87
  );