@rolder/kit 3.0.0-alpha.8 → 3.0.0-alpha.9

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 (263) hide show
  1. package/dist/ai/ui/conversation/ConversationContext.d.ts +7 -0
  2. package/dist/ai/ui/conversation/ConversationContext.js +8 -0
  3. package/dist/ai/ui/conversation/ConversationProvider.d.ts +2 -0
  4. package/dist/ai/ui/conversation/ConversationProvider.js +14 -0
  5. package/dist/ai/ui/conversation/Empty.d.ts +1 -0
  6. package/dist/ai/ui/conversation/Empty.js +21 -0
  7. package/dist/ai/ui/conversation/File.d.ts +4 -0
  8. package/dist/ai/ui/conversation/File.js +42 -0
  9. package/dist/ai/ui/conversation/FileIcon.d.ts +3 -0
  10. package/dist/ai/ui/conversation/FileIcon.js +225 -0
  11. package/dist/ai/ui/conversation/Loader.d.ts +2 -0
  12. package/dist/ai/ui/conversation/Loader.js +12 -0
  13. package/dist/ai/ui/conversation/Message.d.ts +4 -0
  14. package/dist/ai/ui/conversation/Message.js +25 -0
  15. package/dist/ai/ui/conversation/Root.d.ts +2 -0
  16. package/dist/ai/ui/conversation/Root.js +26 -0
  17. package/dist/ai/ui/conversation/index.d.ts +13 -0
  18. package/dist/ai/ui/conversation/index.js +14 -0
  19. package/{src/ai/ui/conversation/types.ts → dist/ai/ui/conversation/types.d.ts} +4 -5
  20. package/dist/ai/ui/conversation/types.js +0 -0
  21. package/dist/ai/ui/conversation/useChatMessage.d.ts +2 -0
  22. package/dist/ai/ui/conversation/useChatMessage.js +12 -0
  23. package/dist/ai/ui/promptInput/File.d.ts +2 -0
  24. package/dist/ai/ui/promptInput/File.js +117 -0
  25. package/dist/ai/ui/promptInput/FileIcon.d.ts +3 -0
  26. package/dist/ai/ui/promptInput/FileIcon.js +225 -0
  27. package/dist/ai/ui/promptInput/Footer.d.ts +2 -0
  28. package/dist/ai/ui/promptInput/Footer.js +8 -0
  29. package/dist/ai/ui/promptInput/PromptInputContext.d.ts +12 -0
  30. package/dist/ai/ui/promptInput/PromptInputContext.js +8 -0
  31. package/dist/ai/ui/promptInput/PromptInputProvider.d.ts +2 -0
  32. package/dist/ai/ui/promptInput/PromptInputProvider.js +50 -0
  33. package/dist/ai/ui/promptInput/Root.d.ts +3 -0
  34. package/dist/ai/ui/promptInput/Root.js +17 -0
  35. package/dist/ai/ui/promptInput/Submit.d.ts +2 -0
  36. package/dist/ai/ui/promptInput/Submit.js +40 -0
  37. package/dist/ai/ui/promptInput/Textarea.d.ts +2 -0
  38. package/dist/ai/ui/promptInput/Textarea.js +33 -0
  39. package/dist/ai/ui/promptInput/index.d.ts +8 -0
  40. package/dist/ai/ui/promptInput/index.js +13 -0
  41. package/dist/ai/ui/promptInput/types.d.ts +11 -0
  42. package/dist/ai/ui/promptInput/types.js +0 -0
  43. package/dist/ai/utils/convertFileUIPartBlobToDataURL.d.ts +5 -0
  44. package/dist/ai/utils/convertFileUIPartBlobToDataURL.js +21 -0
  45. package/dist/ai/utils/parseAiMessagePart.d.ts +2 -0
  46. package/dist/ai/utils/parseAiMessagePart.js +12 -0
  47. package/dist/app/AppDefaults.d.ts +3 -0
  48. package/dist/app/AppDefaults.js +27 -0
  49. package/dist/app/DefaultApp.d.ts +6 -0
  50. package/dist/app/DefaultApp.js +43 -0
  51. package/dist/app/cookieColorSchemeManager.d.ts +6 -0
  52. package/dist/app/cookieColorSchemeManager.js +46 -0
  53. package/dist/app/defaultRequestMiddlewares.d.ts +4 -0
  54. package/dist/app/defaultRequestMiddlewares.js +24 -0
  55. package/dist/app/defaultTheme.d.ts +141 -0
  56. package/dist/app/defaultTheme.js +24 -0
  57. package/dist/functions/getCookie.d.ts +3 -0
  58. package/dist/functions/getCookie.js +8 -0
  59. package/dist/functions/setCookie.d.ts +10 -0
  60. package/dist/functions/setCookie.js +19 -0
  61. package/dist/functions/setCookies.d.ts +14 -0
  62. package/dist/functions/setCookies.js +13 -0
  63. package/dist/hooks/useMutation.d.ts +4 -0
  64. package/dist/hooks/useMutation.js +8 -0
  65. package/dist/hooks/useMutationWithInvalidate.d.ts +4 -0
  66. package/dist/hooks/useMutationWithInvalidate.js +16 -0
  67. package/{src/index.ts → dist/index.d.ts} +5 -45
  68. package/dist/index.js +26 -0
  69. package/{src → dist}/styles.css +11 -21
  70. package/dist/surreal/connection.d.ts +9 -0
  71. package/dist/surreal/connection.js +49 -0
  72. package/dist/surreal/deafaultCrud.d.ts +2 -0
  73. package/dist/surreal/deafaultCrud.js +18 -0
  74. package/dist/surreal/deserialize.d.ts +17 -0
  75. package/dist/surreal/deserialize.js +46 -0
  76. package/dist/surreal/encryption.d.ts +6 -0
  77. package/dist/surreal/encryption.js +30 -0
  78. package/dist/ui/AnimatedChevron.d.ts +6 -0
  79. package/dist/ui/AnimatedChevron.js +31 -0
  80. package/dist/ui/JsonInput.d.ts +2 -0
  81. package/dist/ui/JsonInput.js +45 -0
  82. package/dist/ui/RouterLink.d.ts +16 -0
  83. package/dist/ui/RouterLink.js +36 -0
  84. package/dist/ui/editor/Content.d.ts +3 -0
  85. package/dist/ui/editor/Content.js +13 -0
  86. package/dist/ui/editor/Provider.d.ts +17 -0
  87. package/dist/ui/editor/Provider.js +80 -0
  88. package/dist/ui/editor/Root.d.ts +2 -0
  89. package/dist/ui/editor/Root.js +18 -0
  90. package/dist/ui/editor/Toolbar.d.ts +5 -0
  91. package/dist/ui/editor/Toolbar.js +156 -0
  92. package/dist/ui/editor/index.d.ts +12 -0
  93. package/dist/ui/editor/index.js +11 -0
  94. package/dist/ui/editor/types.d.ts +7 -0
  95. package/dist/ui/editor/types.js +0 -0
  96. package/dist/ui/error/DefaultError.d.ts +2 -0
  97. package/dist/ui/error/DefaultError.js +62 -0
  98. package/dist/ui/error/DefaultNotFound.d.ts +1 -0
  99. package/dist/ui/error/DefaultNotFound.js +37 -0
  100. package/dist/ui/error/Forbidden.d.ts +1 -0
  101. package/dist/ui/error/Forbidden.js +32 -0
  102. package/dist/ui/error/defaultErrorNotification.d.ts +1 -0
  103. package/dist/ui/error/defaultErrorNotification.js +8 -0
  104. package/dist/ui/error/index.js +5 -0
  105. package/dist/ui/form/blurOnError.d.ts +4 -0
  106. package/dist/ui/form/blurOnError.js +11 -0
  107. package/dist/ui/form/buttons/CancelButton.d.ts +5 -0
  108. package/dist/ui/form/buttons/CancelButton.js +44 -0
  109. package/dist/ui/form/buttons/SubmitButton.d.ts +5 -0
  110. package/dist/ui/form/buttons/SubmitButton.js +47 -0
  111. package/dist/ui/form/buttons/SubscribeActionIcon.d.ts +4 -0
  112. package/dist/ui/form/buttons/SubscribeActionIcon.js +15 -0
  113. package/dist/ui/form/buttons/SubscribeButton.d.ts +5 -0
  114. package/dist/ui/form/buttons/SubscribeButton.js +16 -0
  115. package/dist/ui/form/buttons/index.js +4 -0
  116. package/dist/ui/form/context.d.ts +83 -0
  117. package/dist/ui/form/context.js +26 -0
  118. package/dist/ui/form/fields/JsonField.d.ts +2 -0
  119. package/dist/ui/form/fields/JsonField.js +13 -0
  120. package/dist/ui/form/fields/MultiSelectField.d.ts +2 -0
  121. package/dist/ui/form/fields/MultiSelectField.js +15 -0
  122. package/dist/ui/form/fields/NumberField.d.ts +2 -0
  123. package/dist/ui/form/fields/NumberField.js +15 -0
  124. package/dist/ui/form/fields/PassowrdField.d.ts +2 -0
  125. package/dist/ui/form/fields/PassowrdField.js +18 -0
  126. package/dist/ui/form/fields/SelectField.d.ts +2 -0
  127. package/dist/ui/form/fields/SelectField.js +15 -0
  128. package/dist/ui/form/fields/SwitchField.d.ts +2 -0
  129. package/dist/ui/form/fields/SwitchField.js +15 -0
  130. package/dist/ui/form/fields/TextField.d.ts +2 -0
  131. package/dist/ui/form/fields/TextField.js +15 -0
  132. package/dist/ui/form/fields/TextPassowrdField.d.ts +2 -0
  133. package/dist/ui/form/fields/TextPassowrdField.js +51 -0
  134. package/dist/ui/form/fields/TextareaField.d.ts +2 -0
  135. package/dist/ui/form/fields/TextareaField.js +15 -0
  136. package/dist/ui/form/fields/index.js +9 -0
  137. package/dist/ui/form/fieldsSchema.d.ts +12 -0
  138. package/dist/ui/form/fieldsSchema.js +13 -0
  139. package/dist/ui/form/index.js +4 -0
  140. package/dist/ui/hoverPaper/HoverPaper.d.ts +6 -0
  141. package/dist/ui/hoverPaper/HoverPaper.js +15 -0
  142. package/dist/ui/hoverPaper/index.js +3 -0
  143. package/dist/ui/hoverPaper/usePaperHover.d.ts +4 -0
  144. package/dist/ui/hoverPaper/usePaperHover.js +9 -0
  145. package/dist/ui/saveInput/JsonInput.d.ts +6 -0
  146. package/dist/ui/saveInput/JsonInput.js +34 -0
  147. package/dist/ui/saveInput/NumberInput.d.ts +6 -0
  148. package/dist/ui/saveInput/NumberInput.js +27 -0
  149. package/dist/ui/saveInput/SaveInput.d.ts +36 -0
  150. package/dist/ui/saveInput/SaveInput.js +15 -0
  151. package/dist/ui/saveInput/Select.d.ts +6 -0
  152. package/dist/ui/saveInput/Select.js +27 -0
  153. package/dist/ui/saveInput/Switch.d.ts +6 -0
  154. package/dist/ui/saveInput/Switch.js +30 -0
  155. package/dist/ui/saveInput/TextInput.d.ts +6 -0
  156. package/dist/ui/saveInput/TextInput.js +26 -0
  157. package/dist/ui/saveInput/Textarea.d.ts +6 -0
  158. package/dist/ui/saveInput/Textarea.js +26 -0
  159. package/dist/ui/saveInput/index.js +2 -0
  160. package/{src/ui/scrollArea/ScrollArea.tsx → dist/ui/scrollArea/ScrollArea.d.ts} +10 -41
  161. package/dist/ui/scrollArea/ScrollArea.js +30 -0
  162. package/dist/ui/scrollArea/ScrollAreaButton.d.ts +5 -0
  163. package/dist/ui/scrollArea/ScrollAreaButton.js +51 -0
  164. package/dist/ui/scrollArea/ScrollAreaContent.d.ts +6 -0
  165. package/dist/ui/scrollArea/ScrollAreaContent.js +29 -0
  166. package/{src/ui/scrollArea/context.tsx → dist/ui/scrollArea/context.d.ts} +3 -18
  167. package/dist/ui/scrollArea/context.js +10 -0
  168. package/dist/ui/scrollArea/index.d.ts +3 -0
  169. package/dist/ui/scrollArea/index.js +3 -0
  170. package/dist/ui/scrollArea/types.d.ts +65 -0
  171. package/dist/ui/scrollArea/types.js +0 -0
  172. package/dist/ui/scrollArea/useScrollArea.d.ts +9 -0
  173. package/dist/ui/scrollArea/useScrollArea.js +146 -0
  174. package/package.json +4 -1
  175. package/rslib.config.ts +0 -21
  176. package/src/ai/ui/conversation/ConversationContext.ts +0 -21
  177. package/src/ai/ui/conversation/ConversationProvider.tsx +0 -21
  178. package/src/ai/ui/conversation/Empty.tsx +0 -15
  179. package/src/ai/ui/conversation/File.tsx +0 -40
  180. package/src/ai/ui/conversation/FileIcon.tsx +0 -143
  181. package/src/ai/ui/conversation/Loader.tsx +0 -8
  182. package/src/ai/ui/conversation/Message.tsx +0 -34
  183. package/src/ai/ui/conversation/Root.tsx +0 -24
  184. package/src/ai/ui/conversation/index.ts +0 -16
  185. package/src/ai/ui/conversation/useChatMessage.ts +0 -13
  186. package/src/ai/ui/promptInput/File.tsx +0 -98
  187. package/src/ai/ui/promptInput/FileIcon.tsx +0 -149
  188. package/src/ai/ui/promptInput/Footer.tsx +0 -5
  189. package/src/ai/ui/promptInput/PromptInputContext.ts +0 -24
  190. package/src/ai/ui/promptInput/PromptInputProvider.tsx +0 -54
  191. package/src/ai/ui/promptInput/Root.tsx +0 -29
  192. package/src/ai/ui/promptInput/Submit.tsx +0 -39
  193. package/src/ai/ui/promptInput/Textarea.tsx +0 -39
  194. package/src/ai/ui/promptInput/index.ts +0 -15
  195. package/src/ai/ui/promptInput/types.ts +0 -9
  196. package/src/ai/utils/convertFileUIPartBlobToDataURL.ts +0 -29
  197. package/src/ai/utils/parseAiMessagePart.ts +0 -19
  198. package/src/app/AppDefaults.tsx +0 -21
  199. package/src/app/DefaultApp.tsx +0 -50
  200. package/src/app/cookieColorSchemeManager.ts +0 -70
  201. package/src/app/defaultRequestMiddlewares.ts +0 -22
  202. package/src/app/defaultTheme.ts +0 -22
  203. package/src/functions/getCookie.ts +0 -36
  204. package/src/functions/setCookie.ts +0 -29
  205. package/src/functions/setCookies.ts +0 -24
  206. package/src/hooks/useMutation.ts +0 -14
  207. package/src/hooks/useMutationWithInvalidate.ts +0 -23
  208. package/src/surreal/connection.ts +0 -72
  209. package/src/surreal/deafaultCrud.ts +0 -25
  210. package/src/surreal/deserialize.ts +0 -144
  211. package/src/surreal/encryption.ts +0 -51
  212. package/src/ui/AnimatedChevron.tsx +0 -32
  213. package/src/ui/JsonInput.tsx +0 -52
  214. package/src/ui/RouterLink.tsx +0 -78
  215. package/src/ui/editor/Content.tsx +0 -11
  216. package/src/ui/editor/Provider.tsx +0 -96
  217. package/src/ui/editor/Root.tsx +0 -25
  218. package/src/ui/editor/Toolbar.tsx +0 -92
  219. package/src/ui/editor/index.ts +0 -13
  220. package/src/ui/editor/types.ts +0 -7
  221. package/src/ui/error/DefaultError.tsx +0 -60
  222. package/src/ui/error/DefaultNotFound.tsx +0 -19
  223. package/src/ui/error/Forbidden.tsx +0 -18
  224. package/src/ui/error/defaultErrorNotification.ts +0 -9
  225. package/src/ui/form/blurOnError.ts +0 -21
  226. package/src/ui/form/buttons/CancelButton.tsx +0 -42
  227. package/src/ui/form/buttons/SubmitButton.tsx +0 -43
  228. package/src/ui/form/buttons/SubscribeActionIcon.tsx +0 -18
  229. package/src/ui/form/buttons/SubscribeButton.tsx +0 -17
  230. package/src/ui/form/context.ts +0 -45
  231. package/src/ui/form/fields/JsonField.tsx +0 -16
  232. package/src/ui/form/fields/MultiSelectField.tsx +0 -17
  233. package/src/ui/form/fields/NumberField.tsx +0 -17
  234. package/src/ui/form/fields/PassowrdField.tsx +0 -20
  235. package/src/ui/form/fields/SelectField.tsx +0 -17
  236. package/src/ui/form/fields/SwitchField.tsx +0 -17
  237. package/src/ui/form/fields/TextField.tsx +0 -17
  238. package/src/ui/form/fields/TextPassowrdField.tsx +0 -51
  239. package/src/ui/form/fields/TextareaField.tsx +0 -17
  240. package/src/ui/form/fieldsSchema.ts +0 -24
  241. package/src/ui/hoverPaper/HoverPaper.tsx +0 -17
  242. package/src/ui/hoverPaper/usePaperHover.ts +0 -9
  243. package/src/ui/saveInput/JsonInput.tsx +0 -40
  244. package/src/ui/saveInput/NumberInput.tsx +0 -40
  245. package/src/ui/saveInput/SaveInput.tsx +0 -15
  246. package/src/ui/saveInput/Select.tsx +0 -41
  247. package/src/ui/saveInput/Switch.tsx +0 -46
  248. package/src/ui/saveInput/TextInput.tsx +0 -40
  249. package/src/ui/saveInput/Textarea.tsx +0 -40
  250. package/src/ui/scrollArea/ARCH.md +0 -204
  251. package/src/ui/scrollArea/README.md +0 -369
  252. package/src/ui/scrollArea/ScrollAreaButton.tsx +0 -56
  253. package/src/ui/scrollArea/ScrollAreaContent.tsx +0 -36
  254. package/src/ui/scrollArea/index.ts +0 -10
  255. package/src/ui/scrollArea/types.ts +0 -77
  256. package/src/ui/scrollArea/useScrollArea.ts +0 -227
  257. package/tsconfig.json +0 -14
  258. /package/{src/ui/error/index.ts → dist/ui/error/index.d.ts} +0 -0
  259. /package/{src/ui/form/buttons/index.ts → dist/ui/form/buttons/index.d.ts} +0 -0
  260. /package/{src/ui/form/fields/index.ts → dist/ui/form/fields/index.d.ts} +0 -0
  261. /package/{src/ui/form/index.ts → dist/ui/form/index.d.ts} +0 -0
  262. /package/{src/ui/hoverPaper/index.ts → dist/ui/hoverPaper/index.d.ts} +0 -0
  263. /package/{src/ui/saveInput/index.ts → dist/ui/saveInput/index.d.ts} +0 -0
@@ -0,0 +1,146 @@
1
+ import { useDebouncedCallback, useMergedRef, useResizeObserver } from "@mantine/hooks";
2
+ import { useCallback, useEffect, useRef, useState } from "react";
3
+ const useScrollAreaState = (options = {})=>{
4
+ const { autoScroll = false, scrollToBottomOnInit = false, animated = true, nearThreshold = 32 } = options;
5
+ const scrollAreaRef = useRef(null);
6
+ const isUserInteractingRef = useRef(false);
7
+ const userInteractionTimeoutRef = useRef(void 0);
8
+ const isInitializedRef = useRef(false);
9
+ const [contentResizeRef, contentRect] = useResizeObserver();
10
+ const [scrollPosition, setScrollPosition] = useState({
11
+ scrollTop: 0,
12
+ clientHeight: 0,
13
+ scrollHeight: 0
14
+ });
15
+ const isAtTop = 0 === scrollPosition.scrollTop;
16
+ const isAtBottom = scrollPosition.scrollTop + scrollPosition.clientHeight >= scrollPosition.scrollHeight;
17
+ const isNearTop = scrollPosition.scrollTop <= nearThreshold;
18
+ const isNearBottom = scrollPosition.scrollTop + scrollPosition.clientHeight >= scrollPosition.scrollHeight - nearThreshold;
19
+ const isAboveCenter = scrollPosition.scrollTop < (scrollPosition.scrollHeight - scrollPosition.clientHeight) / 2;
20
+ const hasScrollableContent = scrollPosition.scrollHeight > scrollPosition.clientHeight;
21
+ const debouncedUpdatePosition = useDebouncedCallback((element)=>{
22
+ const newPosition = {
23
+ scrollTop: element.scrollTop,
24
+ clientHeight: element.clientHeight,
25
+ scrollHeight: element.scrollHeight
26
+ };
27
+ setScrollPosition(newPosition);
28
+ }, {
29
+ delay: 16
30
+ });
31
+ const scrollToTop = useCallback((isAnimated)=>{
32
+ const element = scrollAreaRef.current;
33
+ if (!element) return;
34
+ const shouldAnimate = isAnimated ?? animated;
35
+ if (shouldAnimate) element.scrollTo({
36
+ top: 0,
37
+ behavior: 'smooth'
38
+ });
39
+ else element.scrollTop = 0;
40
+ }, [
41
+ animated
42
+ ]);
43
+ const scrollToBottom = useCallback((isAnimated)=>{
44
+ const element = scrollAreaRef.current;
45
+ if (!element) return;
46
+ const shouldAnimate = isAnimated ?? animated;
47
+ if (shouldAnimate) element.scrollTo({
48
+ top: element.scrollHeight,
49
+ behavior: 'smooth'
50
+ });
51
+ else element.scrollTop = element.scrollHeight;
52
+ const scrollHeightBefore = element.scrollHeight;
53
+ setTimeout(()=>{
54
+ const scrollHeightAfter = element.scrollHeight;
55
+ const diff = element.scrollHeight - (element.scrollTop + element.clientHeight);
56
+ if (diff > 1 && scrollHeightAfter !== scrollHeightBefore) element.scrollTop = element.scrollHeight;
57
+ }, 50);
58
+ }, [
59
+ animated
60
+ ]);
61
+ const performAutoScroll = useCallback(()=>{
62
+ if (!autoScroll || isUserInteractingRef.current || !scrollAreaRef.current) return;
63
+ if (isAtBottom) scrollToBottom(false);
64
+ }, [
65
+ autoScroll,
66
+ isAtBottom,
67
+ scrollToBottom
68
+ ]);
69
+ const handleUserInteraction = useCallback(()=>{
70
+ isUserInteractingRef.current = true;
71
+ if (userInteractionTimeoutRef.current) clearTimeout(userInteractionTimeoutRef.current);
72
+ userInteractionTimeoutRef.current = setTimeout(()=>{
73
+ isUserInteractingRef.current = false;
74
+ }, 150);
75
+ }, []);
76
+ const handleScroll = useCallback((event)=>{
77
+ const element = event.target;
78
+ debouncedUpdatePosition(element);
79
+ }, [
80
+ debouncedUpdatePosition
81
+ ]);
82
+ useEffect(()=>{
83
+ if (!scrollToBottomOnInit || isInitializedRef.current) return;
84
+ if (hasScrollableContent) {
85
+ scrollToBottom(animated);
86
+ isInitializedRef.current = true;
87
+ }
88
+ }, [
89
+ scrollToBottomOnInit,
90
+ hasScrollableContent,
91
+ scrollToBottom,
92
+ animated
93
+ ]);
94
+ useEffect(()=>{
95
+ const element = scrollAreaRef.current;
96
+ if (!element || 0 === contentRect.height) return;
97
+ debouncedUpdatePosition(element);
98
+ const timeoutId = setTimeout(performAutoScroll, 10);
99
+ return ()=>clearTimeout(timeoutId);
100
+ }, [
101
+ contentRect.height,
102
+ debouncedUpdatePosition,
103
+ performAutoScroll
104
+ ]);
105
+ useEffect(()=>{
106
+ const element = scrollAreaRef.current;
107
+ if (!element) return;
108
+ const events = [
109
+ 'wheel',
110
+ 'touchstart',
111
+ 'touchmove',
112
+ 'mousedown'
113
+ ];
114
+ element.addEventListener('scroll', handleScroll);
115
+ events.forEach((event)=>{
116
+ element.addEventListener(event, handleUserInteraction);
117
+ });
118
+ debouncedUpdatePosition(element);
119
+ return ()=>{
120
+ element.removeEventListener('scroll', handleScroll);
121
+ events.forEach((event)=>{
122
+ element.removeEventListener(event, handleUserInteraction);
123
+ });
124
+ if (userInteractionTimeoutRef.current) clearTimeout(userInteractionTimeoutRef.current);
125
+ };
126
+ }, [
127
+ handleScroll,
128
+ handleUserInteraction,
129
+ debouncedUpdatePosition
130
+ ]);
131
+ const callbackRef = useMergedRef(scrollAreaRef);
132
+ return {
133
+ isAtTop,
134
+ isNearTop,
135
+ isAtBottom,
136
+ isNearBottom,
137
+ isAboveCenter,
138
+ hasScrollableContent,
139
+ scrollToTop,
140
+ scrollToBottom,
141
+ viewportRef: scrollAreaRef,
142
+ _callbackRef: callbackRef,
143
+ _contentResizeRef: contentResizeRef
144
+ };
145
+ };
146
+ export { useScrollAreaState };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rolder/kit",
3
- "version": "3.0.0-alpha.8",
3
+ "version": "3.0.0-alpha.9",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -12,6 +12,9 @@
12
12
  "sideEffects": [
13
13
  "*.css"
14
14
  ],
15
+ "files": [
16
+ "dist"
17
+ ],
15
18
  "scripts": {
16
19
  "build": "rslib build",
17
20
  "dev": "rslib build --watch",
package/rslib.config.ts DELETED
@@ -1,21 +0,0 @@
1
- import { pluginReact } from '@rsbuild/plugin-react';
2
- import { defineConfig } from '@rslib/core';
3
-
4
- export default defineConfig({
5
- source: {
6
- entry: {
7
- index: ['./src/**/*.{ts,tsx,js,jsx,css}'],
8
- },
9
- },
10
- lib: [
11
- {
12
- bundle: false,
13
- dts: true,
14
- format: 'esm',
15
- },
16
- ],
17
- output: {
18
- target: 'web',
19
- },
20
- plugins: [pluginReact()],
21
- });
@@ -1,21 +0,0 @@
1
- import { createContext, useContext } from 'react';
2
-
3
- export interface ConversationContext {
4
- loading: boolean;
5
- streaming: boolean;
6
- empty: boolean;
7
- }
8
-
9
- export const ConversationContext = createContext<ConversationContext | null>(
10
- null,
11
- );
12
-
13
- export const useConversation = () => {
14
- const context = useContext(ConversationContext);
15
- if (!context) {
16
- throw new Error(
17
- 'useConversation must be used within a ConversationProvider',
18
- );
19
- }
20
- return context;
21
- };
@@ -1,21 +0,0 @@
1
- import { ConversationContext } from './ConversationContext';
2
- import type { ConversationProps } from './types';
3
-
4
- export const Provider = ({
5
- children,
6
- loading,
7
- streaming,
8
- empty,
9
- }: ConversationProps) => {
10
- const value: ConversationContext = {
11
- loading,
12
- streaming,
13
- empty,
14
- };
15
-
16
- return (
17
- <ConversationContext.Provider value={value}>
18
- {children}
19
- </ConversationContext.Provider>
20
- );
21
- };
@@ -1,15 +0,0 @@
1
- import { Stack, Text } from '@mantine/core';
2
- import { useConversation } from './ConversationContext';
3
-
4
- export const Empty = () => {
5
- const { empty } = useConversation();
6
-
7
- return !empty ? (
8
- <Stack align="center" gap={0}>
9
- <Text>Нет сообщений</Text>
10
- <Text size="sm" c="dimmed">
11
- Начните общение, чтобы увидеть сообщения здесь
12
- </Text>
13
- </Stack>
14
- ) : null;
15
- };
@@ -1,40 +0,0 @@
1
- import { Image, Paper } from '@mantine/core';
2
- import type { UIMessage } from 'ai';
3
- import { FileIcon } from './FileIcon';
4
-
5
- export const File = <T extends UIMessage>({ message }: { message: T }) => {
6
- const textFileType = message.id.split('-')[1];
7
-
8
- const fileParts = message.parts?.filter((i) => i.type === 'file');
9
- const lastFilePart = fileParts[fileParts.length - 1];
10
-
11
- const FileComponent = () => {
12
- switch (textFileType) {
13
- case 'excel':
14
- return <FileIcon mimeType="excel" />;
15
- case 'word':
16
- return <FileIcon mimeType="word" />;
17
- case 'powerpoint':
18
- return <FileIcon mimeType="powerpoint" />;
19
- }
20
-
21
- if (lastFilePart.mediaType.includes('image/'))
22
- return (
23
- <Image radius="md" h={128} src={lastFilePart.url} alt="Image Preview" />
24
- );
25
-
26
- return <FileIcon mimeType={lastFilePart.mediaType} />;
27
- };
28
-
29
- return textFileType || lastFilePart ? (
30
- <Paper
31
- radius="md"
32
- px="md"
33
- py="sm"
34
- ml="auto"
35
- bg="var(--mantine-color-default-hover)"
36
- >
37
- <FileComponent />
38
- </Paper>
39
- ) : null;
40
- };
@@ -1,143 +0,0 @@
1
- export const FileIcon = ({ mimeType }: { mimeType: string }) => {
2
- switch (true) {
3
- case mimeType.includes('image/'):
4
- return (
5
- <svg
6
- xmlns="http://www.w3.org/2000/svg"
7
- width="36"
8
- height="36"
9
- viewBox="0 0 36 36"
10
- fill="none"
11
- stroke="var(--mantine-color-text)"
12
- strokeWidth="1.5"
13
- strokeLinecap="round"
14
- strokeLinejoin="round"
15
- role="img"
16
- aria-label="Image"
17
- >
18
- <path stroke="none" d="M0 0h24v24H0z" fill="none" />
19
- <path d="M15 8h.01" />
20
- <path d="M3 6a3 3 0 0 1 3 -3h12a3 3 0 0 1 3 3v12a3 3 0 0 1 -3 3h-12a3 3 0 0 1 -3 -3v-12" />
21
- <path d="M3 16l5 -5c.928 -.893 2.072 -.893 3 0l5 5" />
22
- <path d="M14 14l1 -1c.928 -.893 2.072 -.893 3 0l3 3" />
23
- </svg>
24
- );
25
- case mimeType.includes('application/pdf'):
26
- return (
27
- <svg
28
- xmlns="http://www.w3.org/2000/svg"
29
- width="36"
30
- height="36"
31
- viewBox="0 0 36 36"
32
- fill="none"
33
- stroke="var(--mantine-color-text)"
34
- strokeWidth="1.5"
35
- strokeLinecap="round"
36
- strokeLinejoin="round"
37
- role="img"
38
- aria-label="FilePdf"
39
- >
40
- <path stroke="none" d="M0 0h24v24H0z" fill="none" />
41
- <path d="M14 3v4a1 1 0 0 0 1 1h4" />
42
- <path d="M5 12v-7a2 2 0 0 1 2 -2h7l5 5v4" />
43
- <path d="M5 18h1.5a1.5 1.5 0 0 0 0 -3h-1.5v6" />
44
- <path d="M17 18h2" />
45
- <path d="M20 15h-3v6" />
46
- <path d="M11 15v6h1a2 2 0 0 0 2 -2v-2a2 2 0 0 0 -2 -2h-1" />
47
- </svg>
48
- );
49
- case mimeType === 'word':
50
- return (
51
- <svg
52
- xmlns="http://www.w3.org/2000/svg"
53
- width="36"
54
- height="36"
55
- viewBox="0 0 36 36"
56
- fill="none"
57
- stroke="var(--mantine-color-text)"
58
- strokeWidth="1.5"
59
- strokeLinecap="round"
60
- strokeLinejoin="round"
61
- role="img"
62
- aria-label="FileDoc"
63
- >
64
- <path stroke="none" d="M0 0h24v24H0z" fill="none" />
65
- <path d="M14 3v4a1 1 0 0 0 1 1h4" />
66
- <path d="M5 12v-7a2 2 0 0 1 2 -2h7l5 5v4" />
67
- <path d="M5 15v6h1a2 2 0 0 0 2 -2v-2a2 2 0 0 0 -2 -2h-1" />
68
- <path d="M20 16.5a1.5 1.5 0 0 0 -3 0v3a1.5 1.5 0 0 0 3 0" />
69
- <path d="M12.5 15a1.5 1.5 0 0 1 1.5 1.5v3a1.5 1.5 0 0 1 -3 0v-3a1.5 1.5 0 0 1 1.5 -1.5" />
70
- </svg>
71
- );
72
- case mimeType === 'excel':
73
- return (
74
- <svg
75
- xmlns="http://www.w3.org/2000/svg"
76
- width="36"
77
- height="36"
78
- viewBox="0 0 36 36"
79
- fill="none"
80
- stroke="var(--mantine-color-text)"
81
- strokeWidth="1.5"
82
- strokeLinecap="round"
83
- strokeLinejoin="round"
84
- role="img"
85
- aria-label="FileXls"
86
- >
87
- <path stroke="none" d="M0 0h24v24H0z" fill="none" />
88
- <path d="M14 3v4a1 1 0 0 0 1 1h4" />
89
- <path d="M5 12v-7a2 2 0 0 1 2 -2h7l5 5v4" />
90
- <path d="M4 15l4 6" />
91
- <path d="M4 21l4 -6" />
92
- <path d="M17 20.25c0 .414 .336 .75 .75 .75h1.25a1 1 0 0 0 1 -1v-1a1 1 0 0 0 -1 -1h-1a1 1 0 0 1 -1 -1v-1a1 1 0 0 1 1 -1h1.25a.75 .75 0 0 1 .75 .75" />
93
- <path d="M11 15v6h3" />
94
- </svg>
95
- );
96
- case mimeType === 'powerpoint':
97
- return (
98
- <svg
99
- xmlns="http://www.w3.org/2000/svg"
100
- width="36"
101
- height="36"
102
- viewBox="0 0 36 36"
103
- fill="none"
104
- stroke="var(--mantine-color-text)"
105
- strokeWidth="1.5"
106
- strokeLinecap="round"
107
- strokeLinejoin="round"
108
- role="img"
109
- aria-label="FilePpt"
110
- >
111
- <path stroke="none" d="M0 0h24v24H0z" fill="none" />
112
- <path d="M14 3v4a1 1 0 0 0 1 1h4" />
113
- <path d="M14 3v4a1 1 0 0 0 1 1h4" />
114
- <path d="M5 18h1.5a1.5 1.5 0 0 0 0 -3h-1.5v6" />
115
- <path d="M11 18h1.5a1.5 1.5 0 0 0 0 -3h-1.5v6" />
116
- <path d="M16.5 15h3" />
117
- <path d="M18 15v6" />
118
- <path d="M5 12v-7a2 2 0 0 1 2 -2h7l5 5v4" />
119
- </svg>
120
- );
121
- default:
122
- return (
123
- <svg
124
- xmlns="http://www.w3.org/2000/svg"
125
- width="36"
126
- height="36"
127
- viewBox="0 0 36 36"
128
- fill="none"
129
- stroke="var(--mantine-color-text)"
130
- strokeWidth="1.5"
131
- strokeLinecap="round"
132
- strokeLinejoin="round"
133
- role="img"
134
- aria-label="File"
135
- >
136
- <path stroke="none" d="M0 0h24v24H0z" fill="none" />
137
- <path d="M15 3v4a1 1 0 0 0 1 1h4" />
138
- <path d="M18 17h-7a2 2 0 0 1 -2 -2v-10a2 2 0 0 1 2 -2h4l5 5v7a2 2 0 0 1 -2 2" />
139
- <path d="M16 17v2a2 2 0 0 1 -2 2h-7a2 2 0 0 1 -2 -2v-10a2 2 0 0 1 2 -2h2" />
140
- </svg>
141
- );
142
- }
143
- };
@@ -1,8 +0,0 @@
1
- import { type LoaderProps, Loader as MantineLoader } from '@mantine/core';
2
- import { useConversation } from './ConversationContext';
3
-
4
- export const Loader = (props: LoaderProps) => {
5
- const { loading } = useConversation();
6
-
7
- return loading ? <MantineLoader size={28} type="dots" {...props} /> : null;
8
- };
@@ -1,34 +0,0 @@
1
- import { Paper } from '@mantine/core';
2
- import type { UIMessage } from 'ai';
3
- import { Streamdown } from 'streamdown';
4
- import { useConversation } from './ConversationContext';
5
- import { useChatMessage } from './useChatMessage';
6
-
7
- export const Message = <T extends UIMessage>({ message }: { message: T }) => {
8
- const textParts = message?.parts?.filter((i) => i.type === 'text');
9
- const lastTextPart = textParts?.[textParts.length - 1];
10
-
11
- const chatMessage = useChatMessage(lastTextPart);
12
-
13
- const { streaming } = useConversation();
14
-
15
- return chatMessage && message.role !== 'system' ? (
16
- <Paper
17
- radius="md"
18
- px="md"
19
- py="sm"
20
- maw="80%"
21
- ml={message.role === 'user' ? 'auto' : undefined}
22
- bg={
23
- message.role === 'user'
24
- ? 'var(--mantine-color-default-hover)'
25
- : 'var(--mantine-primary-color-light)'
26
- }
27
- fz="sm"
28
- >
29
- <Streamdown isAnimating={streaming && message.role === 'assistant'}>
30
- {chatMessage}
31
- </Streamdown>
32
- </Paper>
33
- ) : null;
34
- };
@@ -1,24 +0,0 @@
1
- import { Paper, Stack } from '@mantine/core';
2
- import { ScrollArea } from '../../../ui/scrollArea';
3
- import { Provider } from './ConversationProvider';
4
- import type { ConversationProps } from './types';
5
-
6
- export const Root = ({
7
- children,
8
- loading,
9
- streaming,
10
- empty,
11
- ...props
12
- }: ConversationProps) => {
13
- return (
14
- <Provider loading={loading} streaming={streaming} empty={empty}>
15
- <Paper withBorder radius="md" {...props}>
16
- <ScrollArea autoScroll scrollToBottomOnInit p="md">
17
- <Stack>{children}</Stack>
18
-
19
- <ScrollArea.ScrollButton />
20
- </ScrollArea>
21
- </Paper>
22
- </Provider>
23
- );
24
- };
@@ -1,16 +0,0 @@
1
- import { Empty } from './Empty';
2
- import { File } from './File';
3
- import { Loader } from './Loader';
4
- import { Message } from './Message';
5
- import { Root } from './Root';
6
-
7
- export type { ConversationProps } from './types';
8
- export { useChatMessage } from './useChatMessage';
9
-
10
- export const Conversation = {
11
- Root,
12
- Message,
13
- File,
14
- Loader,
15
- Empty,
16
- };
@@ -1,13 +0,0 @@
1
- import type { TextUIPart } from 'ai';
2
- import { useEffect, useState } from 'react';
3
- import { parseAiMessagePart } from '../../utils/parseAiMessagePart';
4
-
5
- export const useChatMessage = (part: TextUIPart) => {
6
- const [parsedText, setParsedText] = useState('');
7
-
8
- useEffect(() => {
9
- parseAiMessagePart(part).then((i) => setParsedText(i.text));
10
- }, [part]);
11
-
12
- return parsedText;
13
- };
@@ -1,98 +0,0 @@
1
- import {
2
- ActionIcon,
3
- FileButton,
4
- type FileButtonProps,
5
- Tooltip,
6
- } from '@mantine/core';
7
- import { useRef } from 'react';
8
- import { FileIcon } from './FileIcon';
9
- import { usePromptInput } from './PromptInputContext';
10
-
11
- export const File = (props: Omit<FileButtonProps, 'onChange' | 'children'>) => {
12
- const resetRef = useRef<() => void>(null);
13
- const { file, setFile, accept, submiting, uploading } = usePromptInput();
14
-
15
- return (
16
- <FileButton
17
- resetRef={resetRef}
18
- onChange={async (file) => {
19
- // Проверка для сценария отмены в системном диалоговом окне
20
- if (file) setFile(file);
21
- }}
22
- accept={accept}
23
- disabled={submiting || uploading}
24
- {...props}
25
- >
26
- {(props) => (
27
- <ActionIcon.Group>
28
- <ActionIcon
29
- size="lg"
30
- variant="default"
31
- disabled={submiting}
32
- loading={uploading}
33
- classNames={{ root: 'rolder-prompt-input-file-action-action' }}
34
- {...props}
35
- >
36
- <svg
37
- xmlns="http://www.w3.org/2000/svg"
38
- width="24"
39
- height="24"
40
- viewBox="0 0 24 24"
41
- fill="none"
42
- stroke="currentColor"
43
- strokeWidth="1.5"
44
- strokeLinecap="round"
45
- strokeLinejoin="round"
46
- role="img"
47
- aria-label="Paperclip"
48
- >
49
- <path stroke="none" d="M0 0h24v24H0z" fill="none" />
50
- <path d="M15 7l-6.5 6.5a1.5 1.5 0 0 0 3 3l6.5 -6.5a3 3 0 0 0 -6 -6l-6.5 6.5a4.5 4.5 0 0 0 9 9l6.5 -6.5" />
51
- </svg>
52
- </ActionIcon>
53
-
54
- {file && (
55
- <>
56
- <Tooltip label={file.name} openDelay={500}>
57
- <ActionIcon.GroupSection variant="default" size="lg">
58
- <FileIcon mimeType={file.type} />
59
- </ActionIcon.GroupSection>
60
- </Tooltip>
61
-
62
- <ActionIcon
63
- size="lg"
64
- variant="default"
65
- classNames={{ root: 'rolder-prompt-input-file-action-action' }}
66
- onClick={() => {
67
- resetRef.current?.();
68
- setFile(undefined);
69
- }}
70
- >
71
- <svg
72
- xmlns="http://www.w3.org/2000/svg"
73
- width="24"
74
- height="24"
75
- viewBox="0 0 24 24"
76
- fill="none"
77
- stroke="currentColor"
78
- strokeWidth="1.5"
79
- strokeLinecap="round"
80
- strokeLinejoin="round"
81
- role="img"
82
- aria-label="Trash"
83
- >
84
- <path stroke="none" d="M0 0h24v24H0z" fill="none" />
85
- <path d="M4 7l16 0" />
86
- <path d="M10 11l0 6" />
87
- <path d="M14 11l0 6" />
88
- <path d="M5 7l1 12a2 2 0 0 0 2 2h8a2 2 0 0 0 2 -2l1 -12" />
89
- <path d="M9 7v-3a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v3" />
90
- </svg>
91
- </ActionIcon>
92
- </>
93
- )}
94
- </ActionIcon.Group>
95
- )}
96
- </FileButton>
97
- );
98
- };