flikkui 0.2.0-beta.2 → 0.2.0-beta.4

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 (214) hide show
  1. package/dist/components/ai/PromptInput/PromptInput.js +23 -15
  2. package/dist/components/ai/PromptSuggestions/PromptSuggestion.d.ts +27 -0
  3. package/dist/components/ai/PromptSuggestions/PromptSuggestion.js +62 -0
  4. package/dist/components/ai/PromptSuggestions/PromptSuggestion.theme.d.ts +10 -0
  5. package/dist/components/ai/PromptSuggestions/PromptSuggestion.theme.js +12 -0
  6. package/dist/components/ai/PromptSuggestions/PromptSuggestion.types.d.ts +53 -0
  7. package/dist/components/ai/PromptSuggestions/index.d.ts +4 -2
  8. package/dist/components/ai/index.d.ts +2 -12
  9. package/dist/components/charts/ActivityRings/ActivityRings.js +70 -58
  10. package/dist/components/charts/ActivityRings/ActivityRings.theme.js +0 -1
  11. package/dist/components/charts/ActivityRings/ActivityRings.types.d.ts +17 -0
  12. package/dist/components/charts/BarChart/BarChart.js +8 -4
  13. package/dist/components/charts/BarChart/BarChart.types.d.ts +14 -0
  14. package/dist/components/charts/DonutChart/DonutChart.js +11 -8
  15. package/dist/components/charts/DonutChart/DonutChart.theme.d.ts +3 -0
  16. package/dist/components/charts/DonutChart/DonutChart.theme.js +5 -4
  17. package/dist/components/charts/DonutChart/donut-utils.d.ts +5 -0
  18. package/dist/components/charts/DonutChart/donut-utils.js +26 -1
  19. package/dist/components/charts/Heatmap/Heatmap.theme.js +2 -2
  20. package/dist/components/charts/shared/ChartAxis/XAxis.d.ts +2 -2
  21. package/dist/components/charts/shared/ChartAxis/XAxis.js +4 -4
  22. package/dist/components/charts/shared/ChartAxis/YAxis.d.ts +2 -2
  23. package/dist/components/charts/shared/ChartAxis/YAxis.js +8 -7
  24. package/dist/components/charts/shared/ChartGrid/HorizontalGrid.d.ts +1 -1
  25. package/dist/components/charts/shared/ChartGrid/HorizontalGrid.js +2 -2
  26. package/dist/components/charts/theme/chart.theme.d.ts +1 -1
  27. package/dist/components/charts/theme/chart.theme.js +39 -39
  28. package/dist/components/core/Accordion/Accordion.d.ts +1 -1
  29. package/dist/components/core/Accordion/Accordion.js +2 -2
  30. package/dist/components/core/Accordion/Accordion.types.d.ts +8 -0
  31. package/dist/components/core/Badge/Badge.js +11 -15
  32. package/dist/components/core/Badge/Badge.theme.js +7 -21
  33. package/dist/components/core/Badge/Badge.types.d.ts +9 -1
  34. package/dist/components/core/Button/Button.js +2 -2
  35. package/dist/components/core/Button/Button.theme.js +1 -1
  36. package/dist/components/core/Button/Button.types.d.ts +8 -0
  37. package/dist/components/core/Card/Card.js +8 -2
  38. package/dist/components/core/Card/Card.theme.js +1 -1
  39. package/dist/components/core/Card/Card.types.d.ts +24 -1
  40. package/dist/components/core/Drawer/Drawer.d.ts +1 -1
  41. package/dist/components/core/Drawer/Drawer.js +10 -40
  42. package/dist/components/core/Drawer/Drawer.theme.js +2 -1
  43. package/dist/components/core/Drawer/Drawer.types.d.ts +8 -0
  44. package/dist/components/core/Dropdown/Dropdown.d.ts +1 -1
  45. package/dist/components/core/Dropdown/Dropdown.js +2 -2
  46. package/dist/components/core/Dropdown/Dropdown.types.d.ts +8 -0
  47. package/dist/components/core/Metric/Metric.d.ts +1 -1
  48. package/dist/components/core/Metric/Metric.js +9 -5
  49. package/dist/components/core/Metric/Metric.theme.d.ts +1 -1
  50. package/dist/components/core/Metric/Metric.theme.js +38 -28
  51. package/dist/components/core/Metric/Metric.types.d.ts +27 -8
  52. package/dist/components/core/Modal/Modal.d.ts +1 -1
  53. package/dist/components/core/Modal/Modal.js +17 -40
  54. package/dist/components/core/Modal/Modal.theme.js +8 -3
  55. package/dist/components/core/Modal/Modal.types.d.ts +18 -0
  56. package/dist/components/core/Modal/index.d.ts +1 -1
  57. package/dist/components/core/Notification/Notification.js +2 -0
  58. package/dist/components/core/Pill/Pill.d.ts +6 -11
  59. package/dist/components/core/Pill/Pill.theme.d.ts +2 -2
  60. package/dist/components/core/Pill/Pill.types.d.ts +9 -22
  61. package/dist/components/core/Pill/index.d.ts +1 -1
  62. package/dist/components/core/Popover/Popover.d.ts +1 -1
  63. package/dist/components/core/Popover/Popover.js +2 -2
  64. package/dist/components/core/Popover/Popover.types.d.ts +8 -0
  65. package/dist/components/core/Progress/Progress.d.ts +28 -0
  66. package/dist/components/core/Progress/Progress.js +114 -0
  67. package/dist/components/core/Progress/Progress.theme.d.ts +5 -0
  68. package/dist/components/core/Progress/Progress.theme.js +33 -0
  69. package/dist/components/core/Progress/Progress.types.d.ts +92 -0
  70. package/dist/components/core/Progress/index.d.ts +2 -0
  71. package/dist/components/core/Tabs/Tabs.js +2 -2
  72. package/dist/components/core/Tabs/Tabs.types.d.ts +8 -0
  73. package/dist/components/core/Tag/Tag.animations.d.ts +3 -0
  74. package/dist/components/core/Tag/Tag.animations.js +31 -0
  75. package/dist/components/core/Tag/Tag.d.ts +14 -0
  76. package/dist/components/core/Tag/Tag.js +45 -0
  77. package/dist/components/core/Tag/Tag.theme.d.ts +2 -0
  78. package/dist/components/core/Tag/Tag.theme.js +21 -0
  79. package/dist/components/core/Tag/Tag.types.d.ts +40 -0
  80. package/dist/components/core/Tag/index.d.ts +3 -0
  81. package/dist/components/core/Tooltip/Tooltip.d.ts +1 -1
  82. package/dist/components/core/Tooltip/Tooltip.js +3 -3
  83. package/dist/components/core/Tooltip/Tooltip.theme.js +1 -1
  84. package/dist/components/core/Tooltip/Tooltip.types.d.ts +17 -0
  85. package/dist/components/core/index.d.ts +2 -1
  86. package/dist/components/core/index.js +3 -2
  87. package/dist/components/effects/CustomCursor/CustomCursor.d.ts +0 -13
  88. package/dist/components/effects/CustomCursor/CustomCursor.js +26 -2
  89. package/dist/components/effects/CustomCursor/CustomCursor.theme.js +12 -1
  90. package/dist/components/effects/CustomCursor/CustomCursor.types.d.ts +14 -1
  91. package/dist/components/forms/Combobox/Combobox.d.ts +25 -0
  92. package/dist/components/forms/Combobox/Combobox.js +412 -0
  93. package/dist/components/forms/Combobox/Combobox.theme.d.ts +6 -0
  94. package/dist/components/forms/Combobox/Combobox.theme.js +60 -0
  95. package/dist/components/forms/Combobox/Combobox.types.d.ts +111 -0
  96. package/dist/components/forms/Combobox/index.d.ts +3 -0
  97. package/dist/components/forms/FileUpload/FileUpload.js +2 -0
  98. package/dist/components/forms/Input/Input.js +25 -28
  99. package/dist/components/forms/Input/inputMasks.d.ts +15 -0
  100. package/dist/components/forms/Input/inputMasks.js +72 -1
  101. package/dist/components/forms/InputTag/InputTag.d.ts +40 -0
  102. package/dist/components/forms/InputTag/InputTag.js +491 -0
  103. package/dist/components/forms/InputTag/InputTag.theme.d.ts +2 -0
  104. package/dist/components/forms/InputTag/InputTag.theme.js +16 -0
  105. package/dist/components/forms/InputTag/InputTag.types.d.ts +107 -0
  106. package/dist/components/forms/InputTag/index.d.ts +3 -0
  107. package/dist/components/forms/Select/Select.d.ts +101 -2
  108. package/dist/components/forms/Select/Select.js +128 -132
  109. package/dist/components/forms/Select/Select.theme.js +10 -14
  110. package/dist/components/forms/Select/Select.types.d.ts +6 -2
  111. package/dist/components/forms/Select/index.d.ts +7 -4
  112. package/dist/components/forms/Select/useSelectState.d.ts +66 -0
  113. package/dist/components/forms/Select/useSelectState.js +134 -0
  114. package/dist/components/forms/SelectExpand/SelectExpand.animations.d.ts +20 -0
  115. package/dist/components/forms/SelectExpand/SelectExpand.animations.js +74 -0
  116. package/dist/components/forms/SelectExpand/SelectExpand.d.ts +9 -0
  117. package/dist/components/forms/SelectExpand/SelectExpand.js +223 -0
  118. package/dist/components/forms/SelectExpand/SelectExpand.theme.d.ts +5 -0
  119. package/dist/components/forms/SelectExpand/SelectExpand.theme.js +74 -0
  120. package/dist/components/forms/SelectExpand/SelectExpand.types.d.ts +126 -0
  121. package/dist/components/forms/SelectExpand/index.d.ts +4 -0
  122. package/dist/components/forms/Switch/Switch.js +3 -3
  123. package/dist/components/forms/Switch/Switch.theme.d.ts +1 -1
  124. package/dist/components/forms/Switch/Switch.theme.js +2 -2
  125. package/dist/components/forms/TimePicker/TimePicker.animations.d.ts +0 -46
  126. package/dist/components/forms/TimePicker/TimePicker.d.ts +15 -6
  127. package/dist/components/forms/TimePicker/TimePicker.js +285 -124
  128. package/dist/components/forms/TimePicker/TimePicker.theme.d.ts +1 -1
  129. package/dist/components/forms/TimePicker/TimePicker.theme.js +39 -22
  130. package/dist/components/forms/TimePicker/TimePicker.types.d.ts +88 -34
  131. package/dist/components/forms/TimePicker/TimePickerContent.d.ts +7 -10
  132. package/dist/components/forms/TimePicker/TimePickerContent.js +149 -16
  133. package/dist/components/forms/TimePicker/TimePickerTrigger.d.ts +3 -3
  134. package/dist/components/forms/TimePicker/TimePickerTrigger.js +22 -19
  135. package/dist/components/forms/TimePicker/WheelColumn.d.ts +14 -0
  136. package/dist/components/forms/TimePicker/WheelColumn.js +90 -0
  137. package/dist/components/forms/TimePicker/index.d.ts +4 -1
  138. package/dist/components/forms/TimePicker/useWheelPicker.d.ts +37 -0
  139. package/dist/components/forms/TimePicker/useWheelPicker.js +138 -0
  140. package/dist/components/forms/forms.theme.d.ts +14 -0
  141. package/dist/components/forms/forms.theme.js +31 -0
  142. package/dist/components/forms/index.d.ts +9 -3
  143. package/dist/components/forms/index.js +73 -2
  144. package/dist/hooks/index.d.ts +0 -4
  145. package/dist/icons/Icon.d.ts +7 -0
  146. package/dist/icons/Icon.js +6 -2
  147. package/dist/index.js +12 -16
  148. package/dist/styles.css +1 -1
  149. package/dist/utils/index.d.ts +0 -1
  150. package/dist/utils/optimisticErrors.js +1 -70
  151. package/package.json +1 -1
  152. package/dist/components/ai/EditingIndicator/EditingIndicator.animations.d.ts +0 -31
  153. package/dist/components/ai/EditingIndicator/EditingIndicator.animations.js +0 -115
  154. package/dist/components/ai/EditingIndicator/EditingIndicator.d.ts +0 -35
  155. package/dist/components/ai/EditingIndicator/EditingIndicator.js +0 -94
  156. package/dist/components/ai/EditingIndicator/EditingIndicator.theme.d.ts +0 -2
  157. package/dist/components/ai/EditingIndicator/EditingIndicator.theme.js +0 -13
  158. package/dist/components/ai/EditingIndicator/EditingIndicator.types.d.ts +0 -54
  159. package/dist/components/ai/EditingIndicator/index.d.ts +0 -9
  160. package/dist/components/ai/GenerativeRenderer/GenerativeRenderer.d.ts +0 -3
  161. package/dist/components/ai/GenerativeRenderer/GenerativeRenderer.js +0 -126
  162. package/dist/components/ai/GenerativeRenderer/GenerativeRenderer.theme.d.ts +0 -2
  163. package/dist/components/ai/GenerativeRenderer/GenerativeRenderer.theme.js +0 -8
  164. package/dist/components/ai/GenerativeRenderer/GenerativeRenderer.types.d.ts +0 -45
  165. package/dist/components/ai/GenerativeRenderer/index.d.ts +0 -3
  166. package/dist/components/ai/PresenceIndicator/PresenceIndicator.animations.d.ts +0 -17
  167. package/dist/components/ai/PresenceIndicator/PresenceIndicator.animations.js +0 -56
  168. package/dist/components/ai/PresenceIndicator/PresenceIndicator.d.ts +0 -38
  169. package/dist/components/ai/PresenceIndicator/PresenceIndicator.js +0 -110
  170. package/dist/components/ai/PresenceIndicator/PresenceIndicator.theme.d.ts +0 -2
  171. package/dist/components/ai/PresenceIndicator/PresenceIndicator.theme.js +0 -13
  172. package/dist/components/ai/PresenceIndicator/PresenceIndicator.types.d.ts +0 -53
  173. package/dist/components/ai/PresenceIndicator/index.d.ts +0 -8
  174. package/dist/components/ai/PresenceProvider/PresenceContext.d.ts +0 -24
  175. package/dist/components/ai/PresenceProvider/PresenceContext.js +0 -34
  176. package/dist/components/ai/PresenceProvider/PresenceProvider.d.ts +0 -32
  177. package/dist/components/ai/PresenceProvider/PresenceProvider.js +0 -321
  178. package/dist/components/ai/PresenceProvider/PresenceProvider.types.d.ts +0 -140
  179. package/dist/components/ai/PresenceProvider/adapters/MockAdapter.d.ts +0 -102
  180. package/dist/components/ai/PresenceProvider/adapters/MockAdapter.js +0 -331
  181. package/dist/components/ai/PresenceProvider/adapters/PresenceAdapter.d.ts +0 -93
  182. package/dist/components/ai/PresenceProvider/adapters/SupabaseAdapter.d.ts +0 -134
  183. package/dist/components/ai/PresenceProvider/adapters/WebSocketAdapter.d.ts +0 -149
  184. package/dist/components/ai/PresenceProvider/adapters/index.d.ts +0 -11
  185. package/dist/components/ai/PresenceProvider/index.d.ts +0 -10
  186. package/dist/components/ai/PromptSuggestions/PromptSuggestions.d.ts +0 -27
  187. package/dist/components/ai/PromptSuggestions/PromptSuggestions.js +0 -61
  188. package/dist/components/ai/PromptSuggestions/PromptSuggestions.types.d.ts +0 -65
  189. package/dist/components/ai/VersionSlider/VersionSlider.d.ts +0 -3
  190. package/dist/components/ai/VersionSlider/VersionSlider.js +0 -97
  191. package/dist/components/ai/VersionSlider/VersionSlider.theme.d.ts +0 -2
  192. package/dist/components/ai/VersionSlider/VersionSlider.theme.js +0 -18
  193. package/dist/components/ai/VersionSlider/VersionSlider.types.d.ts +0 -77
  194. package/dist/components/ai/VersionSlider/index.d.ts +0 -3
  195. package/dist/components/core/Pill/Pill.animations.js +0 -25
  196. package/dist/components/core/Pill/Pill.js +0 -145
  197. package/dist/components/core/Pill/Pill.theme.js +0 -65
  198. package/dist/components/core/RetryBoundary/RetryBoundary.d.ts +0 -35
  199. package/dist/components/core/RetryBoundary/RetryBoundary.js +0 -154
  200. package/dist/components/core/RetryBoundary/RetryBoundary.theme.d.ts +0 -2
  201. package/dist/components/core/RetryBoundary/RetryBoundary.theme.js +0 -7
  202. package/dist/components/core/RetryBoundary/RetryBoundary.types.d.ts +0 -51
  203. package/dist/components/core/RetryBoundary/index.d.ts +0 -3
  204. package/dist/components/forms/OptimisticForm/OptimisticForm.d.ts +0 -33
  205. package/dist/components/forms/OptimisticForm/OptimisticForm.js +0 -87
  206. package/dist/components/forms/OptimisticForm/OptimisticForm.theme.d.ts +0 -2
  207. package/dist/components/forms/OptimisticForm/OptimisticForm.theme.js +0 -8
  208. package/dist/components/forms/OptimisticForm/OptimisticForm.types.d.ts +0 -74
  209. package/dist/components/forms/OptimisticForm/index.d.ts +0 -3
  210. package/dist/hooks/useOptimisticMutation.d.ts +0 -109
  211. package/dist/hooks/useOptimisticMutation.js +0 -171
  212. package/dist/hooks/usePresence.d.ts +0 -88
  213. package/dist/utils/presenceUtils.d.ts +0 -66
  214. package/dist/utils/presenceUtils.js +0 -107
@@ -1,331 +0,0 @@
1
- /**
2
- * Mock Presence Adapter
3
- *
4
- * Simulates real-time presence behavior for development and Storybook demos.
5
- * No external dependencies - pure client-side simulation.
6
- *
7
- * Features:
8
- * - Simulates 4-5 users joining at staggered intervals
9
- * - Random typing events every 5 seconds
10
- * - Auto-stop typing after 2-5 seconds
11
- * - Connection status simulation
12
- */
13
- /**
14
- * Mock user data for simulation
15
- */
16
- const MOCK_USERS = [
17
- {
18
- id: 'mock-user-2',
19
- name: 'Sarah Wilson',
20
- avatar: 'https://i.pravatar.cc/150?img=1',
21
- status: 'online',
22
- },
23
- {
24
- id: 'mock-user-3',
25
- name: 'John Doe',
26
- avatar: 'https://i.pravatar.cc/150?img=2',
27
- status: 'online',
28
- },
29
- {
30
- id: 'mock-user-4',
31
- name: 'Emily Chen',
32
- avatar: 'https://i.pravatar.cc/150?img=3',
33
- status: 'busy',
34
- },
35
- {
36
- id: 'mock-user-5',
37
- name: 'Michael Brown',
38
- avatar: 'https://i.pravatar.cc/150?img=4',
39
- status: 'away',
40
- },
41
- ];
42
- /**
43
- * Mock adapter implementation
44
- * Simulates presence behavior without backend
45
- */
46
- class MockPresenceAdapter {
47
- constructor() {
48
- this.config = null;
49
- this.connectionStatus = 'disconnected';
50
- this.users = [];
51
- this.typingUsers = [];
52
- this.intervals = [];
53
- this.timeouts = [];
54
- // Callback sets
55
- this.presenceCallbacks = new Set();
56
- this.typingCallbacks = new Set();
57
- this.connectionCallbacks = new Set();
58
- this.errorCallbacks = new Set();
59
- }
60
- /**
61
- * Connect to mock presence channel
62
- */
63
- async connect(config) {
64
- this.config = config;
65
- this.connectionStatus = 'connecting';
66
- this.notifyConnectionChange();
67
- // Simulate connection delay
68
- await new Promise(resolve => setTimeout(resolve, 500));
69
- // Add current user
70
- this.users = [{
71
- ...config.currentUser,
72
- joinedAt: new Date(),
73
- }];
74
- this.connectionStatus = 'connected';
75
- this.notifyConnectionChange();
76
- this.notifyPresenceChange();
77
- if (process.env.NODE_ENV !== 'production') {
78
- console.log('[MockPresenceAdapter]: Connected to channel:', config.channel);
79
- }
80
- // Start simulating user activity
81
- this.simulateUserActivity();
82
- }
83
- /**
84
- * Disconnect from mock channel
85
- */
86
- async disconnect() {
87
- // Clear all intervals and timeouts
88
- this.intervals.forEach(id => clearInterval(id));
89
- this.timeouts.forEach(id => clearTimeout(id));
90
- this.intervals = [];
91
- this.timeouts = [];
92
- // Reset state
93
- this.users = [];
94
- this.typingUsers = [];
95
- this.connectionStatus = 'disconnected';
96
- this.notifyConnectionChange();
97
- if (process.env.NODE_ENV !== 'production') {
98
- console.log('[MockPresenceAdapter]: Disconnected from channel');
99
- }
100
- }
101
- /**
102
- * Subscribe to presence changes
103
- */
104
- onPresenceChange(callback) {
105
- this.presenceCallbacks.add(callback);
106
- return () => this.presenceCallbacks.delete(callback);
107
- }
108
- /**
109
- * Subscribe to typing changes
110
- */
111
- onTypingChange(callback) {
112
- this.typingCallbacks.add(callback);
113
- return () => this.typingCallbacks.delete(callback);
114
- }
115
- /**
116
- * Subscribe to connection changes
117
- */
118
- onConnectionChange(callback) {
119
- this.connectionCallbacks.add(callback);
120
- return () => this.connectionCallbacks.delete(callback);
121
- }
122
- /**
123
- * Subscribe to errors
124
- */
125
- onError(callback) {
126
- this.errorCallbacks.add(callback);
127
- return () => this.errorCallbacks.delete(callback);
128
- }
129
- /**
130
- * Send typing start (current user)
131
- */
132
- sendTypingStart() {
133
- if (!this.config)
134
- return;
135
- // Add current user to typing list if not already there
136
- const alreadyTyping = this.typingUsers.find(u => u.id === this.config.currentUser.id);
137
- if (!alreadyTyping) {
138
- this.typingUsers.push({
139
- id: this.config.currentUser.id,
140
- name: this.config.currentUser.name,
141
- avatar: this.config.currentUser.avatar,
142
- startedAt: new Date(),
143
- });
144
- this.notifyTypingChange();
145
- }
146
- }
147
- /**
148
- * Send typing stop (current user)
149
- */
150
- sendTypingStop() {
151
- if (!this.config)
152
- return;
153
- this.typingUsers = this.typingUsers.filter(u => u.id !== this.config.currentUser.id);
154
- this.notifyTypingChange();
155
- }
156
- /**
157
- * Update current user metadata
158
- */
159
- updateUserMetadata(metadata) {
160
- if (!this.config)
161
- return;
162
- // Update current user in users list
163
- this.users = this.users.map(user => user.id === this.config.currentUser.id
164
- ? { ...user, ...metadata }
165
- : user);
166
- // Update config
167
- this.config.currentUser = {
168
- ...this.config.currentUser,
169
- ...metadata,
170
- };
171
- this.notifyPresenceChange();
172
- }
173
- /**
174
- * Send custom event (mock implementation)
175
- */
176
- sendCustomEvent(event, data) {
177
- if (process.env.NODE_ENV !== 'production') {
178
- console.log('[MockPresenceAdapter]: Custom event sent:', event, data);
179
- }
180
- }
181
- /**
182
- * Get current connection status
183
- */
184
- getConnectionStatus() {
185
- return this.connectionStatus;
186
- }
187
- /**
188
- * Get current user
189
- */
190
- getCurrentUser() {
191
- if (!this.config) {
192
- throw new Error('Adapter not connected');
193
- }
194
- return this.config.currentUser;
195
- }
196
- // ===== Private methods =====
197
- /**
198
- * Simulate realistic user activity
199
- */
200
- simulateUserActivity() {
201
- // Stagger mock user joins (2s intervals)
202
- MOCK_USERS.forEach((mockUser, index) => {
203
- const timeout = setTimeout(() => {
204
- this.users.push({
205
- ...mockUser,
206
- joinedAt: new Date(),
207
- });
208
- this.notifyPresenceChange();
209
- }, (index + 1) * 2000);
210
- this.timeouts.push(timeout);
211
- });
212
- // Simulate random typing events every 5 seconds
213
- const typingInterval = setInterval(() => {
214
- if (this.users.length > 1 && Math.random() > 0.5) {
215
- // Pick random user (excluding current user)
216
- const otherUsers = this.users.filter(u => { var _a; return u.id !== ((_a = this.config) === null || _a === void 0 ? void 0 : _a.currentUser.id); });
217
- if (otherUsers.length > 0) {
218
- const randomUser = otherUsers[Math.floor(Math.random() * otherUsers.length)];
219
- this.simulateTypingStart(randomUser);
220
- // Auto-stop typing after 2-5 seconds
221
- const stopDelay = 2000 + Math.random() * 3000;
222
- const stopTimeout = setTimeout(() => {
223
- this.simulateTypingStop(randomUser.id);
224
- }, stopDelay);
225
- this.timeouts.push(stopTimeout);
226
- }
227
- }
228
- }, 5000);
229
- this.intervals.push(typingInterval);
230
- // Simulate occasional user leaving (after 30s, 1 random user leaves)
231
- const leaveTimeout = setTimeout(() => {
232
- if (this.users.length > 2) {
233
- // Remove random mock user (not current user)
234
- const mockUserIds = MOCK_USERS.map(u => u.id);
235
- const removableUsers = this.users.filter(u => mockUserIds.includes(u.id));
236
- if (removableUsers.length > 0) {
237
- const randomIndex = Math.floor(Math.random() * removableUsers.length);
238
- const userToRemove = removableUsers[randomIndex];
239
- this.users = this.users.filter(u => u.id !== userToRemove.id);
240
- this.typingUsers = this.typingUsers.filter(u => u.id !== userToRemove.id);
241
- this.notifyPresenceChange();
242
- this.notifyTypingChange();
243
- if (process.env.NODE_ENV !== 'production') {
244
- console.log('[MockPresenceAdapter]: User left:', userToRemove.name);
245
- }
246
- }
247
- }
248
- }, 30000);
249
- this.timeouts.push(leaveTimeout);
250
- }
251
- /**
252
- * Simulate typing start for a user
253
- */
254
- simulateTypingStart(user) {
255
- // Don't add if already typing
256
- if (this.typingUsers.find(u => u.id === user.id)) {
257
- return;
258
- }
259
- this.typingUsers.push({
260
- id: user.id,
261
- name: user.name,
262
- avatar: user.avatar,
263
- startedAt: new Date(),
264
- });
265
- this.notifyTypingChange();
266
- if (process.env.NODE_ENV !== 'production') {
267
- console.log('[MockPresenceAdapter]: User typing:', user.name);
268
- }
269
- }
270
- /**
271
- * Simulate typing stop for a user
272
- */
273
- simulateTypingStop(userId) {
274
- const wasTyping = this.typingUsers.some(u => u.id === userId);
275
- this.typingUsers = this.typingUsers.filter(u => u.id !== userId);
276
- if (wasTyping) {
277
- this.notifyTypingChange();
278
- if (process.env.NODE_ENV !== 'production') {
279
- const user = this.users.find(u => u.id === userId);
280
- console.log('[MockPresenceAdapter]: User stopped typing:', user === null || user === void 0 ? void 0 : user.name);
281
- }
282
- }
283
- }
284
- /**
285
- * Notify all presence callbacks
286
- */
287
- notifyPresenceChange() {
288
- this.presenceCallbacks.forEach(callback => {
289
- try {
290
- callback([...this.users]);
291
- }
292
- catch (error) {
293
- if (process.env.NODE_ENV !== 'production') {
294
- console.error('[MockPresenceAdapter]: Error in presence callback:', error);
295
- }
296
- }
297
- });
298
- }
299
- /**
300
- * Notify all typing callbacks
301
- */
302
- notifyTypingChange() {
303
- this.typingCallbacks.forEach(callback => {
304
- try {
305
- callback([...this.typingUsers]);
306
- }
307
- catch (error) {
308
- if (process.env.NODE_ENV !== 'production') {
309
- console.error('[MockPresenceAdapter]: Error in typing callback:', error);
310
- }
311
- }
312
- });
313
- }
314
- /**
315
- * Notify all connection callbacks
316
- */
317
- notifyConnectionChange() {
318
- this.connectionCallbacks.forEach(callback => {
319
- try {
320
- callback(this.connectionStatus);
321
- }
322
- catch (error) {
323
- if (process.env.NODE_ENV !== 'production') {
324
- console.error('[MockPresenceAdapter]: Error in connection callback:', error);
325
- }
326
- }
327
- });
328
- }
329
- }
330
-
331
- export { MockPresenceAdapter };
@@ -1,93 +0,0 @@
1
- /**
2
- * Presence Adapter Interface
3
- *
4
- * Defines the contract for backend adapters that enable real-time presence.
5
- * Implementations can use WebSocket, Supabase, Ably, Pusher, or custom backends.
6
- */
7
- import { PresenceUser, TypingUser, ConnectionStatus } from '../PresenceProvider.types';
8
- /**
9
- * Adapter configuration
10
- * Passed to adapter on connection
11
- */
12
- export interface PresenceAdapterConfig {
13
- /** Channel/room ID */
14
- channel: string;
15
- /** Current user information */
16
- currentUser: PresenceUser;
17
- /** Typing debounce delay in ms (default: 300) */
18
- typingDebounce?: number;
19
- /** Typing timeout in ms (default: 3000) */
20
- typingTimeout?: number;
21
- }
22
- /**
23
- * Base adapter interface
24
- * All presence adapters must implement these methods
25
- */
26
- export interface PresenceAdapter {
27
- /**
28
- * Connect to presence channel
29
- * @param config - Connection configuration
30
- * @returns Promise that resolves when connected
31
- */
32
- connect(config: PresenceAdapterConfig): Promise<void>;
33
- /**
34
- * Disconnect from channel
35
- * @returns Promise that resolves when disconnected
36
- */
37
- disconnect(): Promise<void>;
38
- /**
39
- * Subscribe to presence changes (users joining/leaving)
40
- * @param callback - Called when presence state changes
41
- * @returns Unsubscribe function
42
- */
43
- onPresenceChange(callback: (users: PresenceUser[]) => void): () => void;
44
- /**
45
- * Subscribe to typing state changes
46
- * @param callback - Called when typing state changes
47
- * @returns Unsubscribe function
48
- */
49
- onTypingChange(callback: (typingUsers: TypingUser[]) => void): () => void;
50
- /**
51
- * Subscribe to connection status changes
52
- * @param callback - Called when connection status changes
53
- * @returns Unsubscribe function
54
- */
55
- onConnectionChange(callback: (status: ConnectionStatus) => void): () => void;
56
- /**
57
- * Subscribe to errors
58
- * @param callback - Called when an error occurs
59
- * @returns Unsubscribe function
60
- */
61
- onError(callback: (error: Error) => void): () => void;
62
- /**
63
- * Send typing start event
64
- * Notifies other users that current user started typing
65
- */
66
- sendTypingStart(): void;
67
- /**
68
- * Send typing stop event
69
- * Notifies other users that current user stopped typing
70
- */
71
- sendTypingStop(): void;
72
- /**
73
- * Update current user metadata
74
- * @param metadata - Partial user data to update
75
- */
76
- updateUserMetadata(metadata: Partial<PresenceUser>): void;
77
- /**
78
- * Send custom event to channel
79
- * @param event - Event name
80
- * @param data - Event payload (JSON serializable)
81
- */
82
- sendCustomEvent(event: string, data?: unknown): void;
83
- /**
84
- * Get current connection status
85
- * @returns Current connection status
86
- */
87
- getConnectionStatus(): ConnectionStatus;
88
- /**
89
- * Get current user
90
- * @returns Current user data
91
- */
92
- getCurrentUser(): PresenceUser;
93
- }
@@ -1,134 +0,0 @@
1
- /**
2
- * Supabase Presence Adapter
3
- *
4
- * Supabase Realtime integration for presence tracking.
5
- * Requires @supabase/supabase-js to be installed.
6
- *
7
- * @example
8
- * ```tsx
9
- * import { createClient } from '@supabase/supabase-js';
10
- *
11
- * const supabase = createClient('YOUR_URL', 'YOUR_KEY');
12
- * const adapter = new SupabasePresenceAdapter(supabase);
13
- *
14
- * <PresenceProvider adapter={adapter} currentUser={user} channel="room-123">
15
- * <YourApp />
16
- * </PresenceProvider>
17
- * ```
18
- */
19
- import { PresenceAdapter, PresenceAdapterConfig } from './PresenceAdapter';
20
- import { PresenceUser, TypingUser, ConnectionStatus } from '../PresenceProvider.types';
21
- /**
22
- * Supabase Realtime Channel interface
23
- * (Minimal type definition for adapter, user should have @supabase/supabase-js installed)
24
- */
25
- interface SupabaseRealtimeChannel {
26
- on(event: string, filter: {
27
- event: string;
28
- }, callback: (payload: any) => void): SupabaseRealtimeChannel;
29
- send(payload: {
30
- type: string;
31
- event: string;
32
- payload: any;
33
- }): Promise<any>;
34
- track(payload: any): Promise<any>;
35
- subscribe(callback?: (status: string) => void): SupabaseRealtimeChannel;
36
- unsubscribe(): Promise<any>;
37
- presenceState(): Record<string, any[]>;
38
- }
39
- /**
40
- * Minimal SupabaseClient interface
41
- */
42
- interface SupabaseClient {
43
- channel(name: string, options?: {
44
- config?: {
45
- presence?: {
46
- key: string;
47
- };
48
- };
49
- }): SupabaseRealtimeChannel;
50
- }
51
- /**
52
- * Supabase presence adapter
53
- * Uses Supabase Realtime for presence tracking
54
- *
55
- * NOTE: Requires @supabase/supabase-js installed:
56
- * npm install @supabase/supabase-js
57
- */
58
- export declare class SupabasePresenceAdapter implements PresenceAdapter {
59
- private client;
60
- private channel;
61
- private config;
62
- private connectionStatus;
63
- private typingStates;
64
- private presenceCallbacks;
65
- private typingCallbacks;
66
- private connectionCallbacks;
67
- private errorCallbacks;
68
- constructor(client: SupabaseClient);
69
- /**
70
- * Connect to Supabase Realtime channel
71
- */
72
- connect(config: PresenceAdapterConfig): Promise<void>;
73
- /**
74
- * Disconnect from Supabase channel
75
- */
76
- disconnect(): Promise<void>;
77
- /**
78
- * Subscribe to presence changes
79
- */
80
- onPresenceChange(callback: (users: PresenceUser[]) => void): () => void;
81
- /**
82
- * Subscribe to typing changes
83
- */
84
- onTypingChange(callback: (users: TypingUser[]) => void): () => void;
85
- /**
86
- * Subscribe to connection changes
87
- */
88
- onConnectionChange(callback: (status: ConnectionStatus) => void): () => void;
89
- /**
90
- * Subscribe to errors
91
- */
92
- onError(callback: (error: Error) => void): () => void;
93
- /**
94
- * Send typing start
95
- */
96
- sendTypingStart(): void;
97
- /**
98
- * Send typing stop
99
- */
100
- sendTypingStop(): void;
101
- /**
102
- * Update user metadata
103
- */
104
- updateUserMetadata(metadata: Partial<PresenceUser>): void;
105
- /**
106
- * Send custom event
107
- */
108
- sendCustomEvent(event: string, data?: unknown): void;
109
- /**
110
- * Get connection status
111
- */
112
- getConnectionStatus(): ConnectionStatus;
113
- /**
114
- * Get current user
115
- */
116
- getCurrentUser(): PresenceUser;
117
- /**
118
- * Notify presence callbacks
119
- */
120
- private notifyPresenceChange;
121
- /**
122
- * Notify typing callbacks
123
- */
124
- private notifyTypingChange;
125
- /**
126
- * Notify connection callbacks
127
- */
128
- private notifyConnectionChange;
129
- /**
130
- * Notify error callbacks
131
- */
132
- private notifyError;
133
- }
134
- export {};
@@ -1,149 +0,0 @@
1
- /**
2
- * WebSocket Presence Adapter
3
- *
4
- * Generic WebSocket implementation for real-time presence.
5
- * Requires a WebSocket server that implements the presence protocol.
6
- *
7
- * @example
8
- * ```tsx
9
- * const adapter = new WebSocketPresenceAdapter({
10
- * url: 'ws://localhost:3000/presence',
11
- * reconnect: {
12
- * enabled: true,
13
- * maxAttempts: 5,
14
- * delay: 1000,
15
- * },
16
- * });
17
- *
18
- * <PresenceProvider adapter={adapter} currentUser={user} channel="room-123">
19
- * <YourApp />
20
- * </PresenceProvider>
21
- * ```
22
- */
23
- import { PresenceAdapter, PresenceAdapterConfig } from './PresenceAdapter';
24
- import { PresenceUser, TypingUser, ConnectionStatus } from '../PresenceProvider.types';
25
- /**
26
- * WebSocket adapter configuration
27
- */
28
- export interface WebSocketAdapterOptions {
29
- /** WebSocket server URL */
30
- url: string;
31
- /** Reconnection configuration */
32
- reconnect?: {
33
- /** Enable automatic reconnection */
34
- enabled: boolean;
35
- /** Maximum reconnection attempts */
36
- maxAttempts?: number;
37
- /** Initial delay between attempts (ms) */
38
- delay?: number;
39
- };
40
- /** Custom message protocol names */
41
- protocols?: {
42
- /** Join channel message type */
43
- join?: string;
44
- /** Leave channel message type */
45
- leave?: string;
46
- /** Typing message type */
47
- typing?: string;
48
- /** Update user message type */
49
- update?: string;
50
- /** Presence update message type */
51
- presenceUpdate?: string;
52
- /** Typing update message type */
53
- typingUpdate?: string;
54
- };
55
- }
56
- /**
57
- * WebSocket presence adapter
58
- * Connects to a WebSocket server for real-time presence
59
- */
60
- export declare class WebSocketPresenceAdapter implements PresenceAdapter {
61
- private ws;
62
- private config;
63
- private options;
64
- private connectionStatus;
65
- private reconnectAttempts;
66
- private reconnectTimeoutId?;
67
- private presenceCallbacks;
68
- private typingCallbacks;
69
- private connectionCallbacks;
70
- private errorCallbacks;
71
- private readonly DEFAULT_PROTOCOLS;
72
- constructor(options: WebSocketAdapterOptions);
73
- /**
74
- * Connect to WebSocket server
75
- */
76
- connect(config: PresenceAdapterConfig): Promise<void>;
77
- /**
78
- * Disconnect from WebSocket
79
- */
80
- disconnect(): Promise<void>;
81
- /**
82
- * Subscribe to presence changes
83
- */
84
- onPresenceChange(callback: (users: PresenceUser[]) => void): () => void;
85
- /**
86
- * Subscribe to typing changes
87
- */
88
- onTypingChange(callback: (users: TypingUser[]) => void): () => void;
89
- /**
90
- * Subscribe to connection changes
91
- */
92
- onConnectionChange(callback: (status: ConnectionStatus) => void): () => void;
93
- /**
94
- * Subscribe to errors
95
- */
96
- onError(callback: (error: Error) => void): () => void;
97
- /**
98
- * Send typing start
99
- */
100
- sendTypingStart(): void;
101
- /**
102
- * Send typing stop
103
- */
104
- sendTypingStop(): void;
105
- /**
106
- * Update user metadata
107
- */
108
- updateUserMetadata(metadata: Partial<PresenceUser>): void;
109
- /**
110
- * Send custom event
111
- */
112
- sendCustomEvent(event: string, data?: unknown): void;
113
- /**
114
- * Get connection status
115
- */
116
- getConnectionStatus(): ConnectionStatus;
117
- /**
118
- * Get current user
119
- */
120
- getCurrentUser(): PresenceUser;
121
- /**
122
- * Send message to WebSocket
123
- */
124
- private send;
125
- /**
126
- * Handle incoming WebSocket message
127
- */
128
- private handleMessage;
129
- /**
130
- * Handle reconnection logic
131
- */
132
- private handleReconnect;
133
- /**
134
- * Notify presence callbacks
135
- */
136
- private notifyPresenceChange;
137
- /**
138
- * Notify typing callbacks
139
- */
140
- private notifyTypingChange;
141
- /**
142
- * Notify connection callbacks
143
- */
144
- private notifyConnectionChange;
145
- /**
146
- * Notify error callbacks
147
- */
148
- private notifyError;
149
- }