@hanzo/ui 8.27.10 → 8.27.11

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 (303) hide show
  1. package/dist/backends/gui/comparison.cjs +17 -21
  2. package/dist/backends/gui/comparison.d.ts +4 -5
  3. package/dist/backends/gui/comparison.d.ts.map +1 -1
  4. package/dist/backends/gui/comparison.js +18 -22
  5. package/dist/backends/gui/comparison.js.map +1 -1
  6. package/dist/backends/gui/crypto-screener.cjs +21 -31
  7. package/dist/backends/gui/crypto-screener.d.ts +20 -24
  8. package/dist/backends/gui/crypto-screener.d.ts.map +1 -1
  9. package/dist/backends/gui/crypto-screener.js +21 -31
  10. package/dist/backends/gui/crypto-screener.js.map +1 -1
  11. package/dist/backends/gui/cursor.cjs +15 -18
  12. package/dist/backends/gui/cursor.d.ts +4 -3
  13. package/dist/backends/gui/cursor.d.ts.map +1 -1
  14. package/dist/backends/gui/cursor.js +15 -18
  15. package/dist/backends/gui/cursor.js.map +1 -1
  16. package/dist/backends/gui/data-table.cjs +144 -184
  17. package/dist/backends/gui/data-table.d.ts +64 -44
  18. package/dist/backends/gui/data-table.d.ts.map +1 -1
  19. package/dist/backends/gui/data-table.js +146 -152
  20. package/dist/backends/gui/data-table.js.map +1 -1
  21. package/dist/backends/gui/dock.cjs +1 -1
  22. package/dist/backends/gui/dock.d.ts.map +1 -1
  23. package/dist/backends/gui/dock.js +1 -1
  24. package/dist/backends/gui/dock.js.map +1 -1
  25. package/dist/backends/gui/editor.cjs +35 -31
  26. package/dist/backends/gui/editor.d.ts +11 -11
  27. package/dist/backends/gui/editor.d.ts.map +1 -1
  28. package/dist/backends/gui/editor.js +35 -31
  29. package/dist/backends/gui/editor.js.map +1 -1
  30. package/dist/backends/gui/field.cjs +132 -0
  31. package/dist/backends/gui/field.d.ts +74 -0
  32. package/dist/backends/gui/field.d.ts.map +1 -0
  33. package/dist/backends/gui/field.js +121 -0
  34. package/dist/backends/gui/field.js.map +1 -0
  35. package/dist/backends/gui/gantt.cjs +17 -19
  36. package/dist/backends/gui/gantt.d.ts +4 -5
  37. package/dist/backends/gui/gantt.d.ts.map +1 -1
  38. package/dist/backends/gui/gantt.js +18 -21
  39. package/dist/backends/gui/gantt.js.map +1 -1
  40. package/dist/backends/gui/glimpse.cjs +88 -0
  41. package/dist/backends/gui/glimpse.d.ts +57 -0
  42. package/dist/backends/gui/glimpse.d.ts.map +1 -0
  43. package/dist/backends/gui/glimpse.js +81 -0
  44. package/dist/backends/gui/glimpse.js.map +1 -0
  45. package/dist/backends/gui/grid-pattern.cjs +119 -0
  46. package/dist/backends/gui/grid-pattern.d.ts +96 -0
  47. package/dist/backends/gui/grid-pattern.d.ts.map +1 -0
  48. package/dist/backends/gui/grid-pattern.js +84 -0
  49. package/dist/backends/gui/grid-pattern.js.map +1 -0
  50. package/dist/backends/gui/image-crop.cjs +35 -0
  51. package/dist/backends/gui/image-crop.d.ts +20 -0
  52. package/dist/backends/gui/image-crop.d.ts.map +1 -0
  53. package/dist/backends/gui/image-crop.js +33 -0
  54. package/dist/backends/gui/image-crop.js.map +1 -0
  55. package/dist/backends/gui/image-zoom.cjs +58 -0
  56. package/dist/backends/gui/image-zoom.d.ts +16 -0
  57. package/dist/backends/gui/image-zoom.d.ts.map +1 -0
  58. package/dist/backends/gui/image-zoom.js +56 -0
  59. package/dist/backends/gui/image-zoom.js.map +1 -0
  60. package/dist/backends/gui/index.cjs +159 -1
  61. package/dist/backends/gui/index.d.ts +49 -0
  62. package/dist/backends/gui/index.d.ts.map +1 -1
  63. package/dist/backends/gui/index.js +49 -0
  64. package/dist/backends/gui/index.js.map +1 -1
  65. package/dist/backends/gui/interactive-grid-pattern.cjs +61 -0
  66. package/dist/backends/gui/interactive-grid-pattern.d.ts +28 -0
  67. package/dist/backends/gui/interactive-grid-pattern.d.ts.map +1 -0
  68. package/dist/backends/gui/interactive-grid-pattern.js +26 -0
  69. package/dist/backends/gui/interactive-grid-pattern.js.map +1 -0
  70. package/dist/backends/gui/iphone-15-pro.cjs +83 -0
  71. package/dist/backends/gui/iphone-15-pro.d.ts +16 -0
  72. package/dist/backends/gui/iphone-15-pro.d.ts.map +1 -0
  73. package/dist/backends/gui/iphone-15-pro.js +81 -0
  74. package/dist/backends/gui/iphone-15-pro.js.map +1 -0
  75. package/dist/backends/gui/item.cjs +154 -0
  76. package/dist/backends/gui/item.d.ts +72 -0
  77. package/dist/backends/gui/item.d.ts.map +1 -0
  78. package/dist/backends/gui/item.js +143 -0
  79. package/dist/backends/gui/item.js.map +1 -0
  80. package/dist/backends/gui/kanban.cjs +247 -0
  81. package/dist/backends/gui/kanban.d.ts +37 -0
  82. package/dist/backends/gui/kanban.d.ts.map +1 -0
  83. package/dist/backends/gui/kanban.js +212 -0
  84. package/dist/backends/gui/kanban.js.map +1 -0
  85. package/dist/backends/gui/kbd.cjs +45 -0
  86. package/dist/backends/gui/kbd.d.ts +8 -0
  87. package/dist/backends/gui/kbd.d.ts.map +1 -0
  88. package/dist/backends/gui/kbd.js +42 -0
  89. package/dist/backends/gui/kbd.js.map +1 -0
  90. package/dist/backends/gui/limelight-nav.cjs +201 -0
  91. package/dist/backends/gui/limelight-nav.d.ts +20 -0
  92. package/dist/backends/gui/limelight-nav.d.ts.map +1 -0
  93. package/dist/backends/gui/limelight-nav.js +166 -0
  94. package/dist/backends/gui/limelight-nav.js.map +1 -0
  95. package/dist/backends/gui/list.cjs +26 -0
  96. package/dist/backends/gui/list.d.ts +15 -0
  97. package/dist/backends/gui/list.d.ts.map +1 -0
  98. package/dist/backends/gui/list.js +23 -0
  99. package/dist/backends/gui/list.js.map +1 -0
  100. package/dist/backends/gui/macos-dock.cjs +84 -0
  101. package/dist/backends/gui/macos-dock.d.ts +30 -0
  102. package/dist/backends/gui/macos-dock.d.ts.map +1 -0
  103. package/dist/backends/gui/macos-dock.js +82 -0
  104. package/dist/backends/gui/macos-dock.js.map +1 -0
  105. package/dist/backends/gui/magnetic.cjs +40 -0
  106. package/dist/backends/gui/magnetic.d.ts +12 -0
  107. package/dist/backends/gui/magnetic.d.ts.map +1 -0
  108. package/dist/backends/gui/magnetic.js +38 -0
  109. package/dist/backends/gui/magnetic.js.map +1 -0
  110. package/dist/backends/gui/marquee.cjs +110 -0
  111. package/dist/backends/gui/marquee.d.ts +44 -0
  112. package/dist/backends/gui/marquee.d.ts.map +1 -0
  113. package/dist/backends/gui/marquee.js +75 -0
  114. package/dist/backends/gui/marquee.js.map +1 -0
  115. package/dist/backends/gui/menu-dock.cjs +64 -0
  116. package/dist/backends/gui/menu-dock.d.ts +21 -0
  117. package/dist/backends/gui/menu-dock.d.ts.map +1 -0
  118. package/dist/backends/gui/menu-dock.js +62 -0
  119. package/dist/backends/gui/menu-dock.js.map +1 -0
  120. package/dist/backends/gui/menubar.cjs +227 -0
  121. package/dist/backends/gui/menubar.d.ts +106 -0
  122. package/dist/backends/gui/menubar.d.ts.map +1 -0
  123. package/dist/backends/gui/menubar.js +177 -0
  124. package/dist/backends/gui/menubar.js.map +1 -0
  125. package/dist/backends/gui/message-dock.cjs +111 -0
  126. package/dist/backends/gui/message-dock.d.ts +22 -0
  127. package/dist/backends/gui/message-dock.d.ts.map +1 -0
  128. package/dist/backends/gui/message-dock.js +110 -0
  129. package/dist/backends/gui/message-dock.js.map +1 -0
  130. package/dist/backends/gui/mini-calendar.cjs +25 -0
  131. package/dist/backends/gui/mini-calendar.d.ts +22 -0
  132. package/dist/backends/gui/mini-calendar.d.ts.map +1 -0
  133. package/dist/backends/gui/mini-calendar.js +24 -0
  134. package/dist/backends/gui/mini-calendar.js.map +1 -0
  135. package/dist/backends/gui/minimal-tiptap.cjs +56 -0
  136. package/dist/backends/gui/minimal-tiptap.d.ts +20 -0
  137. package/dist/backends/gui/minimal-tiptap.d.ts.map +1 -0
  138. package/dist/backends/gui/minimal-tiptap.js +21 -0
  139. package/dist/backends/gui/minimal-tiptap.js.map +1 -0
  140. package/dist/backends/gui/motion-highlight.cjs +83 -0
  141. package/dist/backends/gui/motion-highlight.d.ts +27 -0
  142. package/dist/backends/gui/motion-highlight.d.ts.map +1 -0
  143. package/dist/backends/gui/motion-highlight.js +48 -0
  144. package/dist/backends/gui/motion-highlight.js.map +1 -0
  145. package/dist/backends/gui/navigation-bar.cjs +47 -0
  146. package/dist/backends/gui/navigation-bar.d.ts +48 -0
  147. package/dist/backends/gui/navigation-bar.d.ts.map +1 -0
  148. package/dist/backends/gui/navigation-bar.js +45 -0
  149. package/dist/backends/gui/navigation-bar.js.map +1 -0
  150. package/dist/backends/gui/news-timeline.cjs +47 -0
  151. package/dist/backends/gui/news-timeline.d.ts +39 -0
  152. package/dist/backends/gui/news-timeline.d.ts.map +1 -0
  153. package/dist/backends/gui/news-timeline.js +45 -0
  154. package/dist/backends/gui/news-timeline.js.map +1 -0
  155. package/dist/backends/gui/order-entry.cjs +53 -0
  156. package/dist/backends/gui/order-entry.d.ts +21 -0
  157. package/dist/backends/gui/order-entry.d.ts.map +1 -0
  158. package/dist/backends/gui/order-entry.js +52 -0
  159. package/dist/backends/gui/order-entry.js.map +1 -0
  160. package/dist/backends/gui/orders-history.cjs +102 -0
  161. package/dist/backends/gui/orders-history.d.ts +24 -0
  162. package/dist/backends/gui/orders-history.d.ts.map +1 -0
  163. package/dist/backends/gui/orders-history.js +67 -0
  164. package/dist/backends/gui/orders-history.js.map +1 -0
  165. package/dist/backends/gui/pagination.cjs +51 -0
  166. package/dist/backends/gui/pagination.d.ts +52 -0
  167. package/dist/backends/gui/pagination.d.ts.map +1 -0
  168. package/dist/backends/gui/pagination.js +42 -0
  169. package/dist/backends/gui/pagination.js.map +1 -0
  170. package/dist/backends/gui/particles-background.cjs +135 -0
  171. package/dist/backends/gui/particles-background.d.ts +24 -0
  172. package/dist/backends/gui/particles-background.d.ts.map +1 -0
  173. package/dist/backends/gui/particles-background.js +133 -0
  174. package/dist/backends/gui/particles-background.js.map +1 -0
  175. package/dist/backends/gui/particles.cjs +145 -0
  176. package/dist/backends/gui/particles.d.ts +25 -0
  177. package/dist/backends/gui/particles.d.ts.map +1 -0
  178. package/dist/backends/gui/particles.js +143 -0
  179. package/dist/backends/gui/particles.js.map +1 -0
  180. package/dist/backends/gui/pill.cjs +82 -0
  181. package/dist/backends/gui/pill.d.ts +12 -0
  182. package/dist/backends/gui/pill.d.ts.map +1 -0
  183. package/dist/backends/gui/pill.js +78 -0
  184. package/dist/backends/gui/pill.js.map +1 -0
  185. package/dist/backends/gui/pin-list.cjs +82 -0
  186. package/dist/backends/gui/pin-list.d.ts +42 -0
  187. package/dist/backends/gui/pin-list.d.ts.map +1 -0
  188. package/dist/backends/gui/pin-list.js +80 -0
  189. package/dist/backends/gui/pin-list.js.map +1 -0
  190. package/dist/backends/gui/pixel-image.cjs +63 -0
  191. package/dist/backends/gui/pixel-image.d.ts +21 -0
  192. package/dist/backends/gui/pixel-image.d.ts.map +1 -0
  193. package/dist/backends/gui/pixel-image.js +61 -0
  194. package/dist/backends/gui/pixel-image.js.map +1 -0
  195. package/dist/backends/gui/positions-list.cjs +60 -0
  196. package/dist/backends/gui/positions-list.d.ts +14 -0
  197. package/dist/backends/gui/positions-list.d.ts.map +1 -0
  198. package/dist/backends/gui/positions-list.js +58 -0
  199. package/dist/backends/gui/positions-list.js.map +1 -0
  200. package/dist/backends/gui/qr-code.cjs +438 -0
  201. package/dist/backends/gui/qr-code.d.ts +42 -0
  202. package/dist/backends/gui/qr-code.d.ts.map +1 -0
  203. package/dist/backends/gui/qr-code.js +402 -0
  204. package/dist/backends/gui/qr-code.js.map +1 -0
  205. package/dist/backends/gui/relative-time.cjs +167 -0
  206. package/dist/backends/gui/relative-time.d.ts +10 -0
  207. package/dist/backends/gui/relative-time.d.ts.map +1 -0
  208. package/dist/backends/gui/relative-time.js +132 -0
  209. package/dist/backends/gui/relative-time.js.map +1 -0
  210. package/dist/backends/gui/safari.cjs +65 -0
  211. package/dist/backends/gui/safari.d.ts +23 -0
  212. package/dist/backends/gui/safari.d.ts.map +1 -0
  213. package/dist/backends/gui/safari.js +63 -0
  214. package/dist/backends/gui/safari.js.map +1 -0
  215. package/dist/backends/gui/snippet.cjs +144 -0
  216. package/dist/backends/gui/snippet.d.ts +38 -0
  217. package/dist/backends/gui/snippet.d.ts.map +1 -0
  218. package/dist/backends/gui/snippet.js +141 -0
  219. package/dist/backends/gui/snippet.js.map +1 -0
  220. package/dist/backends/gui/stars-scrolling-wheel.cjs +106 -0
  221. package/dist/backends/gui/stars-scrolling-wheel.d.ts +24 -0
  222. package/dist/backends/gui/stars-scrolling-wheel.d.ts.map +1 -0
  223. package/dist/backends/gui/stars-scrolling-wheel.js +104 -0
  224. package/dist/backends/gui/stars-scrolling-wheel.js.map +1 -0
  225. package/dist/backends/gui/status.cjs +79 -0
  226. package/dist/backends/gui/status.d.ts +15 -0
  227. package/dist/backends/gui/status.d.ts.map +1 -0
  228. package/dist/backends/gui/status.js +77 -0
  229. package/dist/backends/gui/status.js.map +1 -0
  230. package/dist/backends/gui/stock-market.cjs +21 -0
  231. package/dist/backends/gui/stock-market.d.ts +17 -0
  232. package/dist/backends/gui/stock-market.d.ts.map +1 -0
  233. package/dist/backends/gui/stock-market.js +19 -0
  234. package/dist/backends/gui/stock-market.js.map +1 -0
  235. package/dist/backends/gui/stock-screener.cjs +55 -0
  236. package/dist/backends/gui/stock-screener.d.ts +41 -0
  237. package/dist/backends/gui/stock-screener.d.ts.map +1 -0
  238. package/dist/backends/gui/stock-screener.js +53 -0
  239. package/dist/backends/gui/stock-screener.js.map +1 -0
  240. package/dist/backends/gui/symbol-info.cjs +46 -0
  241. package/dist/backends/gui/symbol-info.d.ts +36 -0
  242. package/dist/backends/gui/symbol-info.d.ts.map +1 -0
  243. package/dist/backends/gui/symbol-info.js +44 -0
  244. package/dist/backends/gui/symbol-info.js.map +1 -0
  245. package/dist/backends/gui/table.cjs +104 -0
  246. package/dist/backends/gui/table.d.ts +57 -0
  247. package/dist/backends/gui/table.d.ts.map +1 -0
  248. package/dist/backends/gui/table.js +95 -0
  249. package/dist/backends/gui/table.js.map +1 -0
  250. package/dist/backends/gui/tags.cjs +22 -0
  251. package/dist/backends/gui/tags.d.ts +22 -0
  252. package/dist/backends/gui/tags.d.ts.map +1 -0
  253. package/dist/backends/gui/tags.js +20 -0
  254. package/dist/backends/gui/tags.js.map +1 -0
  255. package/dist/backends/gui/technical-analysis.cjs +58 -0
  256. package/dist/backends/gui/technical-analysis.d.ts +41 -0
  257. package/dist/backends/gui/technical-analysis.d.ts.map +1 -0
  258. package/dist/backends/gui/technical-analysis.js +56 -0
  259. package/dist/backends/gui/technical-analysis.js.map +1 -0
  260. package/dist/backends/gui/terminal.cjs +266 -0
  261. package/dist/backends/gui/terminal.d.ts +38 -0
  262. package/dist/backends/gui/terminal.d.ts.map +1 -0
  263. package/dist/backends/gui/terminal.js +231 -0
  264. package/dist/backends/gui/terminal.js.map +1 -0
  265. package/dist/backends/gui/ticker.cjs +79 -0
  266. package/dist/backends/gui/ticker.d.ts +19 -0
  267. package/dist/backends/gui/ticker.d.ts.map +1 -0
  268. package/dist/backends/gui/ticker.js +44 -0
  269. package/dist/backends/gui/ticker.js.map +1 -0
  270. package/dist/backends/gui/timeline.cjs +154 -0
  271. package/dist/backends/gui/timeline.d.ts +42 -0
  272. package/dist/backends/gui/timeline.d.ts.map +1 -0
  273. package/dist/backends/gui/timeline.js +118 -0
  274. package/dist/backends/gui/timeline.js.map +1 -0
  275. package/dist/backends/gui/toggle.cjs +96 -0
  276. package/dist/backends/gui/toggle.d.ts +29 -0
  277. package/dist/backends/gui/toggle.d.ts.map +1 -0
  278. package/dist/backends/gui/toggle.js +95 -0
  279. package/dist/backends/gui/toggle.js.map +1 -0
  280. package/dist/backends/gui/video-player.cjs +383 -0
  281. package/dist/backends/gui/video-player.d.ts +54 -0
  282. package/dist/backends/gui/video-player.d.ts.map +1 -0
  283. package/dist/backends/gui/video-player.js +348 -0
  284. package/dist/backends/gui/video-player.js.map +1 -0
  285. package/dist/chat/Composer.cjs +10 -10
  286. package/dist/chat/Composer.d.ts +16 -17
  287. package/dist/chat/Composer.d.ts.map +1 -1
  288. package/dist/chat/Composer.js +11 -11
  289. package/dist/chat/Composer.js.map +1 -1
  290. package/dist/gallery.cjs +180 -1
  291. package/dist/gallery.d.ts.map +1 -1
  292. package/dist/gallery.html +391 -3
  293. package/dist/gallery.js +181 -2
  294. package/dist/gallery.js.map +1 -1
  295. package/dist/index.cjs +110 -1
  296. package/dist/index.d.ts +1 -1
  297. package/dist/index.d.ts.map +1 -1
  298. package/dist/index.js +1 -1
  299. package/dist/index.js.map +1 -1
  300. package/dist/index.node.cjs +110 -1
  301. package/dist/index.node.js +1 -1
  302. package/dist/styles.css +356 -0
  303. package/package.json +1 -1
@@ -0,0 +1,135 @@
1
+ 'use client';"use strict";
2
+ 'use client';
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.ParticlesBackground = ParticlesBackground;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ /**
7
+ * ParticlesBackground — a decorative field of drifting dots joined by fading
8
+ * connection lines, painted on a fixed full-viewport canvas behind the page.
9
+ *
10
+ * A particle field with per-pair connection lines is the case a canvas exists
11
+ * for: hundreds of dots and their pairwise distances redrawn every frame would
12
+ * mean thousands of styled DOM nodes reflowing at 60fps. The imperative loop
13
+ * lives entirely in one effect — init, animate, resize, pointer — the same
14
+ * shape `AnimatedCursor` uses for its own document-level listeners, gated on
15
+ * `isWeb` and a mount flag so the server render and the first client render
16
+ * stay identical and native gets nothing to choke on.
17
+ */
18
+ const gui_1 = require("@hanzo/gui");
19
+ const react_1 = require("react");
20
+ const sx_1 = require("../../sx.cjs");
21
+ const slot_1 = require("./slot.cjs");
22
+ function ParticlesBackground({ className, particleCount = 50, particleColor = 'rgba(255, 255, 255, 0.6)', lineColor = 'rgba(255, 255, 255, 0.2)', particleSize = 2, speed = 0.5, connectionDistance = 100, opacity = 1, enableMouseInteraction = true, mouseRadius = 150, }) {
23
+ const [mounted, setMounted] = (0, react_1.useState)(false);
24
+ const canvasRef = (0, react_1.useRef)(null);
25
+ const particlesRef = (0, react_1.useRef)([]);
26
+ const mouseRef = (0, react_1.useRef)({ x: -Infinity, y: -Infinity });
27
+ (0, react_1.useEffect)(() => setMounted(true), []);
28
+ const live = mounted && gui_1.isWeb;
29
+ (0, react_1.useEffect)(() => {
30
+ if (!live)
31
+ return;
32
+ const canvas = canvasRef.current;
33
+ if (!canvas)
34
+ return;
35
+ const ctx = canvas.getContext('2d');
36
+ if (!ctx)
37
+ return;
38
+ const seed = (width, height) => {
39
+ particlesRef.current = Array.from({ length: particleCount }, () => ({
40
+ x: Math.random() * width,
41
+ y: Math.random() * height,
42
+ vx: (Math.random() - 0.5) * speed,
43
+ vy: (Math.random() - 0.5) * speed,
44
+ size: Math.random() * particleSize + 1,
45
+ }));
46
+ };
47
+ const resize = () => {
48
+ const rect = canvas.getBoundingClientRect();
49
+ canvas.width = rect.width;
50
+ canvas.height = rect.height;
51
+ seed(canvas.width, canvas.height);
52
+ };
53
+ const onMove = (e) => {
54
+ const rect = canvas.getBoundingClientRect();
55
+ mouseRef.current = { x: e.clientX - rect.left, y: e.clientY - rect.top };
56
+ };
57
+ resize();
58
+ window.addEventListener('resize', resize);
59
+ if (enableMouseInteraction)
60
+ canvas.addEventListener('mousemove', onMove);
61
+ let raf = requestAnimationFrame(function animate() {
62
+ const { width, height } = canvas;
63
+ const particles = particlesRef.current;
64
+ const { x: mouseX, y: mouseY } = mouseRef.current;
65
+ ctx.clearRect(0, 0, width, height);
66
+ for (const p of particles) {
67
+ p.x += p.vx;
68
+ p.y += p.vy;
69
+ if (p.x < 0 || p.x > width) {
70
+ p.vx *= -1;
71
+ p.x = Math.max(0, Math.min(width, p.x));
72
+ }
73
+ if (p.y < 0 || p.y > height) {
74
+ p.vy *= -1;
75
+ p.y = Math.max(0, Math.min(height, p.y));
76
+ }
77
+ if (enableMouseInteraction) {
78
+ const dx = mouseX - p.x;
79
+ const dy = mouseY - p.y;
80
+ const distance = Math.sqrt(dx * dx + dy * dy);
81
+ if (distance < mouseRadius) {
82
+ const force = (mouseRadius - distance) / mouseRadius;
83
+ const angle = Math.atan2(dy, dx);
84
+ p.vx -= Math.cos(angle) * force * 0.2;
85
+ p.vy -= Math.sin(angle) * force * 0.2;
86
+ }
87
+ }
88
+ p.vx *= 0.99;
89
+ p.vy *= 0.99;
90
+ ctx.globalAlpha = opacity;
91
+ ctx.fillStyle = particleColor;
92
+ ctx.beginPath();
93
+ ctx.arc(p.x, p.y, p.size, 0, Math.PI * 2);
94
+ ctx.fill();
95
+ }
96
+ for (let i = 0; i < particles.length; i++) {
97
+ for (let j = i + 1; j < particles.length; j++) {
98
+ const dx = particles[i].x - particles[j].x;
99
+ const dy = particles[i].y - particles[j].y;
100
+ const distance = Math.sqrt(dx * dx + dy * dy);
101
+ if (distance < connectionDistance) {
102
+ ctx.globalAlpha = Math.max(0, 1 - distance / connectionDistance) * opacity;
103
+ ctx.strokeStyle = lineColor;
104
+ ctx.lineWidth = 0.5;
105
+ ctx.beginPath();
106
+ ctx.moveTo(particles[i].x, particles[i].y);
107
+ ctx.lineTo(particles[j].x, particles[j].y);
108
+ ctx.stroke();
109
+ }
110
+ }
111
+ }
112
+ raf = requestAnimationFrame(animate);
113
+ });
114
+ return () => {
115
+ cancelAnimationFrame(raf);
116
+ window.removeEventListener('resize', resize);
117
+ if (enableMouseInteraction)
118
+ canvas.removeEventListener('mousemove', onMove);
119
+ };
120
+ }, [
121
+ live,
122
+ particleCount,
123
+ particleColor,
124
+ lineColor,
125
+ particleSize,
126
+ speed,
127
+ connectionDistance,
128
+ opacity,
129
+ enableMouseInteraction,
130
+ mouseRadius,
131
+ ]);
132
+ if (!live)
133
+ return null;
134
+ return ((0, jsx_runtime_1.jsx)(gui_1.YStack, { ...(0, slot_1.slot)('particles-background'), style: { position: 'fixed', inset: 0, pointerEvents: 'none', zIndex: -1 }, ...(0, sx_1.sx)(className), children: (0, jsx_runtime_1.jsx)("canvas", { ref: canvasRef, style: { display: 'block', width: '100%', height: '100%' } }) }));
135
+ }
@@ -0,0 +1,24 @@
1
+ export type ParticlesBackgroundProps = {
2
+ /** Class notation for the fixed frame. */
3
+ className?: string;
4
+ /** Number of particles to render. */
5
+ particleCount?: number;
6
+ /** Fill of each particle. */
7
+ particleColor?: string;
8
+ /** Stroke of the lines joining nearby particles. */
9
+ lineColor?: string;
10
+ /** Maximum radius of a particle, in px. */
11
+ particleSize?: number;
12
+ /** Top speed of a particle's drift, in px per frame. */
13
+ speed?: number;
14
+ /** Distance below which two particles are joined by a line. */
15
+ connectionDistance?: number;
16
+ /** Overall opacity of the effect. */
17
+ opacity?: number;
18
+ /** Whether particles are pushed away from the pointer. */
19
+ enableMouseInteraction?: boolean;
20
+ /** Radius of the pointer's repulsion, in px. */
21
+ mouseRadius?: number;
22
+ };
23
+ export declare function ParticlesBackground({ className, particleCount, particleColor, lineColor, particleSize, speed, connectionDistance, opacity, enableMouseInteraction, mouseRadius, }: ParticlesBackgroundProps): import("react").JSX.Element | null;
24
+ //# sourceMappingURL=particles-background.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"particles-background.d.ts","sourceRoot":"","sources":["../../../src/backends/gui/particles-background.tsx"],"names":[],"mappings":"AA2BA,MAAM,MAAM,wBAAwB,GAAG;IACrC,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,qCAAqC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,6BAA6B;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,2CAA2C;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,+DAA+D;IAC/D,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,0DAA0D;IAC1D,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,gDAAgD;IAChD,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,wBAAgB,mBAAmB,CAAC,EAClC,SAAS,EACT,aAAkB,EAClB,aAA0C,EAC1C,SAAsC,EACtC,YAAgB,EAChB,KAAW,EACX,kBAAwB,EACxB,OAAW,EACX,sBAA6B,EAC7B,WAAiB,GAClB,EAAE,wBAAwB,sCAuI1B"}
@@ -0,0 +1,133 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ /**
4
+ * ParticlesBackground — a decorative field of drifting dots joined by fading
5
+ * connection lines, painted on a fixed full-viewport canvas behind the page.
6
+ *
7
+ * A particle field with per-pair connection lines is the case a canvas exists
8
+ * for: hundreds of dots and their pairwise distances redrawn every frame would
9
+ * mean thousands of styled DOM nodes reflowing at 60fps. The imperative loop
10
+ * lives entirely in one effect — init, animate, resize, pointer — the same
11
+ * shape `AnimatedCursor` uses for its own document-level listeners, gated on
12
+ * `isWeb` and a mount flag so the server render and the first client render
13
+ * stay identical and native gets nothing to choke on.
14
+ */
15
+ import { YStack, isWeb } from '@hanzo/gui';
16
+ import { useEffect, useRef, useState } from 'react';
17
+ import { sx } from '../../sx.js';
18
+ import { slot } from './slot.js';
19
+ export function ParticlesBackground({ className, particleCount = 50, particleColor = 'rgba(255, 255, 255, 0.6)', lineColor = 'rgba(255, 255, 255, 0.2)', particleSize = 2, speed = 0.5, connectionDistance = 100, opacity = 1, enableMouseInteraction = true, mouseRadius = 150, }) {
20
+ const [mounted, setMounted] = useState(false);
21
+ const canvasRef = useRef(null);
22
+ const particlesRef = useRef([]);
23
+ const mouseRef = useRef({ x: -Infinity, y: -Infinity });
24
+ useEffect(() => setMounted(true), []);
25
+ const live = mounted && isWeb;
26
+ useEffect(() => {
27
+ if (!live)
28
+ return;
29
+ const canvas = canvasRef.current;
30
+ if (!canvas)
31
+ return;
32
+ const ctx = canvas.getContext('2d');
33
+ if (!ctx)
34
+ return;
35
+ const seed = (width, height) => {
36
+ particlesRef.current = Array.from({ length: particleCount }, () => ({
37
+ x: Math.random() * width,
38
+ y: Math.random() * height,
39
+ vx: (Math.random() - 0.5) * speed,
40
+ vy: (Math.random() - 0.5) * speed,
41
+ size: Math.random() * particleSize + 1,
42
+ }));
43
+ };
44
+ const resize = () => {
45
+ const rect = canvas.getBoundingClientRect();
46
+ canvas.width = rect.width;
47
+ canvas.height = rect.height;
48
+ seed(canvas.width, canvas.height);
49
+ };
50
+ const onMove = (e) => {
51
+ const rect = canvas.getBoundingClientRect();
52
+ mouseRef.current = { x: e.clientX - rect.left, y: e.clientY - rect.top };
53
+ };
54
+ resize();
55
+ window.addEventListener('resize', resize);
56
+ if (enableMouseInteraction)
57
+ canvas.addEventListener('mousemove', onMove);
58
+ let raf = requestAnimationFrame(function animate() {
59
+ const { width, height } = canvas;
60
+ const particles = particlesRef.current;
61
+ const { x: mouseX, y: mouseY } = mouseRef.current;
62
+ ctx.clearRect(0, 0, width, height);
63
+ for (const p of particles) {
64
+ p.x += p.vx;
65
+ p.y += p.vy;
66
+ if (p.x < 0 || p.x > width) {
67
+ p.vx *= -1;
68
+ p.x = Math.max(0, Math.min(width, p.x));
69
+ }
70
+ if (p.y < 0 || p.y > height) {
71
+ p.vy *= -1;
72
+ p.y = Math.max(0, Math.min(height, p.y));
73
+ }
74
+ if (enableMouseInteraction) {
75
+ const dx = mouseX - p.x;
76
+ const dy = mouseY - p.y;
77
+ const distance = Math.sqrt(dx * dx + dy * dy);
78
+ if (distance < mouseRadius) {
79
+ const force = (mouseRadius - distance) / mouseRadius;
80
+ const angle = Math.atan2(dy, dx);
81
+ p.vx -= Math.cos(angle) * force * 0.2;
82
+ p.vy -= Math.sin(angle) * force * 0.2;
83
+ }
84
+ }
85
+ p.vx *= 0.99;
86
+ p.vy *= 0.99;
87
+ ctx.globalAlpha = opacity;
88
+ ctx.fillStyle = particleColor;
89
+ ctx.beginPath();
90
+ ctx.arc(p.x, p.y, p.size, 0, Math.PI * 2);
91
+ ctx.fill();
92
+ }
93
+ for (let i = 0; i < particles.length; i++) {
94
+ for (let j = i + 1; j < particles.length; j++) {
95
+ const dx = particles[i].x - particles[j].x;
96
+ const dy = particles[i].y - particles[j].y;
97
+ const distance = Math.sqrt(dx * dx + dy * dy);
98
+ if (distance < connectionDistance) {
99
+ ctx.globalAlpha = Math.max(0, 1 - distance / connectionDistance) * opacity;
100
+ ctx.strokeStyle = lineColor;
101
+ ctx.lineWidth = 0.5;
102
+ ctx.beginPath();
103
+ ctx.moveTo(particles[i].x, particles[i].y);
104
+ ctx.lineTo(particles[j].x, particles[j].y);
105
+ ctx.stroke();
106
+ }
107
+ }
108
+ }
109
+ raf = requestAnimationFrame(animate);
110
+ });
111
+ return () => {
112
+ cancelAnimationFrame(raf);
113
+ window.removeEventListener('resize', resize);
114
+ if (enableMouseInteraction)
115
+ canvas.removeEventListener('mousemove', onMove);
116
+ };
117
+ }, [
118
+ live,
119
+ particleCount,
120
+ particleColor,
121
+ lineColor,
122
+ particleSize,
123
+ speed,
124
+ connectionDistance,
125
+ opacity,
126
+ enableMouseInteraction,
127
+ mouseRadius,
128
+ ]);
129
+ if (!live)
130
+ return null;
131
+ return (_jsx(YStack, { ...slot('particles-background'), style: { position: 'fixed', inset: 0, pointerEvents: 'none', zIndex: -1 }, ...sx(className), children: _jsx("canvas", { ref: canvasRef, style: { display: 'block', width: '100%', height: '100%' } }) }));
132
+ }
133
+ //# sourceMappingURL=particles-background.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"particles-background.js","sourceRoot":"","sources":["../../../src/backends/gui/particles-background.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,145 @@
1
+ 'use client';"use strict";
2
+ 'use client';
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.Particles = Particles;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ /**
7
+ * Particles — an animated field of small drifting dots that draws a line
8
+ * between any two that fall within `connectionDistance`, brighter the closer
9
+ * they are, and nudges nearby dots away from the pointer. It fills its
10
+ * nearest positioned ancestor (`position: absolute; inset: 0`) and never
11
+ * intercepts a pointer event, so it sits behind ordinary content as a
12
+ * backdrop.
13
+ *
14
+ * A particle field is a per-frame pixel loop, native to `<canvas>` on web —
15
+ * that is the one piece @hanzo/gui has no primitive for, so this wraps the
16
+ * platform element directly and renders nothing on native.
17
+ */
18
+ const gui_1 = require("@hanzo/gui");
19
+ const react_1 = require("react");
20
+ const slot_1 = require("./slot.cjs");
21
+ function Particles({ className, particleCount = 50, particleColor = 'rgba(255, 255, 255, 0.6)', lineColor = 'rgba(255, 255, 255, 0.2)', particleSize = 2, speed = 0.5, connectionDistance = 100, opacity = 1, enableMouseInteraction = true, mouseRadius = 150, }) {
22
+ const canvasRef = (0, react_1.useRef)(null);
23
+ const particlesRef = (0, react_1.useRef)([]);
24
+ const mouseRef = (0, react_1.useRef)({ x: 0, y: 0 });
25
+ (0, react_1.useEffect)(() => {
26
+ if (!gui_1.isWeb || typeof window === 'undefined')
27
+ return;
28
+ const canvas = canvasRef.current;
29
+ if (!canvas)
30
+ return;
31
+ const seed = (width, height) => {
32
+ particlesRef.current = Array.from({ length: particleCount }, () => ({
33
+ x: Math.random() * width,
34
+ y: Math.random() * height,
35
+ vx: (Math.random() - 0.5) * speed,
36
+ vy: (Math.random() - 0.5) * speed,
37
+ size: Math.random() * particleSize + 1,
38
+ }));
39
+ };
40
+ const resize = () => {
41
+ const rect = canvas.getBoundingClientRect();
42
+ canvas.width = rect.width;
43
+ canvas.height = rect.height;
44
+ seed(canvas.width, canvas.height);
45
+ };
46
+ const onMove = (e) => {
47
+ const rect = canvas.getBoundingClientRect();
48
+ mouseRef.current = { x: e.clientX - rect.left, y: e.clientY - rect.top };
49
+ };
50
+ resize();
51
+ window.addEventListener('resize', resize);
52
+ if (enableMouseInteraction)
53
+ canvas.addEventListener('mousemove', onMove);
54
+ // jsdom (the test DOM) implements neither `getContext('2d')` nor
55
+ // `requestAnimationFrame` — both are feature-detected so the effect wires
56
+ // up its listeners and cleans them up correctly even where the browser
57
+ // pixel loop itself cannot run.
58
+ const hasRaf = typeof requestAnimationFrame === 'function';
59
+ let frame = 0;
60
+ const step = () => {
61
+ const ctx = canvas.getContext('2d');
62
+ if (ctx) {
63
+ const { width, height } = canvas;
64
+ const particles = particlesRef.current;
65
+ const { x: mouseX, y: mouseY } = mouseRef.current;
66
+ ctx.clearRect(0, 0, width, height);
67
+ for (const p of particles) {
68
+ p.x += p.vx;
69
+ p.y += p.vy;
70
+ if (p.x < 0 || p.x > width) {
71
+ p.vx *= -1;
72
+ p.x = Math.max(0, Math.min(width, p.x));
73
+ }
74
+ if (p.y < 0 || p.y > height) {
75
+ p.vy *= -1;
76
+ p.y = Math.max(0, Math.min(height, p.y));
77
+ }
78
+ if (enableMouseInteraction) {
79
+ const dx = mouseX - p.x;
80
+ const dy = mouseY - p.y;
81
+ const distance = Math.sqrt(dx * dx + dy * dy);
82
+ if (distance < mouseRadius) {
83
+ const force = (mouseRadius - distance) / mouseRadius;
84
+ const angle = Math.atan2(dy, dx);
85
+ p.vx -= Math.cos(angle) * force * 0.2;
86
+ p.vy -= Math.sin(angle) * force * 0.2;
87
+ }
88
+ }
89
+ p.vx *= 0.99;
90
+ p.vy *= 0.99;
91
+ ctx.globalAlpha = opacity;
92
+ ctx.fillStyle = particleColor;
93
+ ctx.beginPath();
94
+ ctx.arc(p.x, p.y, p.size, 0, Math.PI * 2);
95
+ ctx.fill();
96
+ }
97
+ for (let i = 0; i < particles.length; i++) {
98
+ for (let j = i + 1; j < particles.length; j++) {
99
+ const dx = particles[i].x - particles[j].x;
100
+ const dy = particles[i].y - particles[j].y;
101
+ const distance = Math.sqrt(dx * dx + dy * dy);
102
+ if (distance < connectionDistance) {
103
+ ctx.globalAlpha = Math.max(0, 1 - distance / connectionDistance) * opacity;
104
+ ctx.strokeStyle = lineColor;
105
+ ctx.lineWidth = 0.5;
106
+ ctx.beginPath();
107
+ ctx.moveTo(particles[i].x, particles[i].y);
108
+ ctx.lineTo(particles[j].x, particles[j].y);
109
+ ctx.stroke();
110
+ }
111
+ }
112
+ }
113
+ }
114
+ if (hasRaf)
115
+ frame = requestAnimationFrame(step);
116
+ };
117
+ if (hasRaf)
118
+ frame = requestAnimationFrame(step);
119
+ return () => {
120
+ if (hasRaf)
121
+ cancelAnimationFrame(frame);
122
+ window.removeEventListener('resize', resize);
123
+ if (enableMouseInteraction)
124
+ canvas.removeEventListener('mousemove', onMove);
125
+ };
126
+ }, [
127
+ particleCount,
128
+ particleColor,
129
+ lineColor,
130
+ particleSize,
131
+ speed,
132
+ connectionDistance,
133
+ opacity,
134
+ enableMouseInteraction,
135
+ mouseRadius,
136
+ ]);
137
+ if (!gui_1.isWeb)
138
+ return null;
139
+ const style = {
140
+ position: 'absolute',
141
+ inset: 0,
142
+ pointerEvents: 'none',
143
+ };
144
+ return (0, jsx_runtime_1.jsx)("canvas", { ref: canvasRef, ...(0, slot_1.slot)('particles'), className: className, style: style });
145
+ }
@@ -0,0 +1,25 @@
1
+ export type ParticlesProps = {
2
+ /** CSS class names for the canvas frame. Since the frame is a raw `<canvas>`,
3
+ * not a gui component, this is forwarded as-is rather than through `sx`. */
4
+ className?: string;
5
+ /** How many dots drift across the field. */
6
+ particleCount?: number;
7
+ /** Fill of each dot, any CSS colour. */
8
+ particleColor?: string;
9
+ /** Stroke of the lines drawn between near dots, any CSS colour. */
10
+ lineColor?: string;
11
+ /** Upper bound of a dot's random radius, in px. */
12
+ particleSize?: number;
13
+ /** Top speed of a dot's drift, in px per frame. */
14
+ speed?: number;
15
+ /** Distance, in px, within which two dots are joined by a line. */
16
+ connectionDistance?: number;
17
+ /** Overall alpha applied to dots and lines alike. */
18
+ opacity?: number;
19
+ /** Whether nearby dots are pushed away from the pointer. */
20
+ enableMouseInteraction?: boolean;
21
+ /** Radius, in px, within which the pointer pushes dots away. */
22
+ mouseRadius?: number;
23
+ };
24
+ export declare function Particles({ className, particleCount, particleColor, lineColor, particleSize, speed, connectionDistance, opacity, enableMouseInteraction, mouseRadius, }: ParticlesProps): import("react").JSX.Element | null;
25
+ //# sourceMappingURL=particles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"particles.d.ts","sourceRoot":"","sources":["../../../src/backends/gui/particles.tsx"],"names":[],"mappings":"AAkBA,MAAM,MAAM,cAAc,GAAG;IAC3B;iFAC6E;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,4CAA4C;IAC5C,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,wCAAwC;IACxC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,mDAAmD;IACnD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,mEAAmE;IACnE,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,4DAA4D;IAC5D,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,gEAAgE;IAChE,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AAID,wBAAgB,SAAS,CAAC,EACxB,SAAS,EACT,aAAkB,EAClB,aAA0C,EAC1C,SAAsC,EACtC,YAAgB,EAChB,KAAW,EACX,kBAAwB,EACxB,OAAW,EACX,sBAA6B,EAC7B,WAAiB,GAClB,EAAE,cAAc,sCAsIhB"}
@@ -0,0 +1,143 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ /**
4
+ * Particles — an animated field of small drifting dots that draws a line
5
+ * between any two that fall within `connectionDistance`, brighter the closer
6
+ * they are, and nudges nearby dots away from the pointer. It fills its
7
+ * nearest positioned ancestor (`position: absolute; inset: 0`) and never
8
+ * intercepts a pointer event, so it sits behind ordinary content as a
9
+ * backdrop.
10
+ *
11
+ * A particle field is a per-frame pixel loop, native to `<canvas>` on web —
12
+ * that is the one piece @hanzo/gui has no primitive for, so this wraps the
13
+ * platform element directly and renders nothing on native.
14
+ */
15
+ import { isWeb } from '@hanzo/gui';
16
+ import { useEffect, useRef } from 'react';
17
+ import { slot } from './slot.js';
18
+ export function Particles({ className, particleCount = 50, particleColor = 'rgba(255, 255, 255, 0.6)', lineColor = 'rgba(255, 255, 255, 0.2)', particleSize = 2, speed = 0.5, connectionDistance = 100, opacity = 1, enableMouseInteraction = true, mouseRadius = 150, }) {
19
+ const canvasRef = useRef(null);
20
+ const particlesRef = useRef([]);
21
+ const mouseRef = useRef({ x: 0, y: 0 });
22
+ useEffect(() => {
23
+ if (!isWeb || typeof window === 'undefined')
24
+ return;
25
+ const canvas = canvasRef.current;
26
+ if (!canvas)
27
+ return;
28
+ const seed = (width, height) => {
29
+ particlesRef.current = Array.from({ length: particleCount }, () => ({
30
+ x: Math.random() * width,
31
+ y: Math.random() * height,
32
+ vx: (Math.random() - 0.5) * speed,
33
+ vy: (Math.random() - 0.5) * speed,
34
+ size: Math.random() * particleSize + 1,
35
+ }));
36
+ };
37
+ const resize = () => {
38
+ const rect = canvas.getBoundingClientRect();
39
+ canvas.width = rect.width;
40
+ canvas.height = rect.height;
41
+ seed(canvas.width, canvas.height);
42
+ };
43
+ const onMove = (e) => {
44
+ const rect = canvas.getBoundingClientRect();
45
+ mouseRef.current = { x: e.clientX - rect.left, y: e.clientY - rect.top };
46
+ };
47
+ resize();
48
+ window.addEventListener('resize', resize);
49
+ if (enableMouseInteraction)
50
+ canvas.addEventListener('mousemove', onMove);
51
+ // jsdom (the test DOM) implements neither `getContext('2d')` nor
52
+ // `requestAnimationFrame` — both are feature-detected so the effect wires
53
+ // up its listeners and cleans them up correctly even where the browser
54
+ // pixel loop itself cannot run.
55
+ const hasRaf = typeof requestAnimationFrame === 'function';
56
+ let frame = 0;
57
+ const step = () => {
58
+ const ctx = canvas.getContext('2d');
59
+ if (ctx) {
60
+ const { width, height } = canvas;
61
+ const particles = particlesRef.current;
62
+ const { x: mouseX, y: mouseY } = mouseRef.current;
63
+ ctx.clearRect(0, 0, width, height);
64
+ for (const p of particles) {
65
+ p.x += p.vx;
66
+ p.y += p.vy;
67
+ if (p.x < 0 || p.x > width) {
68
+ p.vx *= -1;
69
+ p.x = Math.max(0, Math.min(width, p.x));
70
+ }
71
+ if (p.y < 0 || p.y > height) {
72
+ p.vy *= -1;
73
+ p.y = Math.max(0, Math.min(height, p.y));
74
+ }
75
+ if (enableMouseInteraction) {
76
+ const dx = mouseX - p.x;
77
+ const dy = mouseY - p.y;
78
+ const distance = Math.sqrt(dx * dx + dy * dy);
79
+ if (distance < mouseRadius) {
80
+ const force = (mouseRadius - distance) / mouseRadius;
81
+ const angle = Math.atan2(dy, dx);
82
+ p.vx -= Math.cos(angle) * force * 0.2;
83
+ p.vy -= Math.sin(angle) * force * 0.2;
84
+ }
85
+ }
86
+ p.vx *= 0.99;
87
+ p.vy *= 0.99;
88
+ ctx.globalAlpha = opacity;
89
+ ctx.fillStyle = particleColor;
90
+ ctx.beginPath();
91
+ ctx.arc(p.x, p.y, p.size, 0, Math.PI * 2);
92
+ ctx.fill();
93
+ }
94
+ for (let i = 0; i < particles.length; i++) {
95
+ for (let j = i + 1; j < particles.length; j++) {
96
+ const dx = particles[i].x - particles[j].x;
97
+ const dy = particles[i].y - particles[j].y;
98
+ const distance = Math.sqrt(dx * dx + dy * dy);
99
+ if (distance < connectionDistance) {
100
+ ctx.globalAlpha = Math.max(0, 1 - distance / connectionDistance) * opacity;
101
+ ctx.strokeStyle = lineColor;
102
+ ctx.lineWidth = 0.5;
103
+ ctx.beginPath();
104
+ ctx.moveTo(particles[i].x, particles[i].y);
105
+ ctx.lineTo(particles[j].x, particles[j].y);
106
+ ctx.stroke();
107
+ }
108
+ }
109
+ }
110
+ }
111
+ if (hasRaf)
112
+ frame = requestAnimationFrame(step);
113
+ };
114
+ if (hasRaf)
115
+ frame = requestAnimationFrame(step);
116
+ return () => {
117
+ if (hasRaf)
118
+ cancelAnimationFrame(frame);
119
+ window.removeEventListener('resize', resize);
120
+ if (enableMouseInteraction)
121
+ canvas.removeEventListener('mousemove', onMove);
122
+ };
123
+ }, [
124
+ particleCount,
125
+ particleColor,
126
+ lineColor,
127
+ particleSize,
128
+ speed,
129
+ connectionDistance,
130
+ opacity,
131
+ enableMouseInteraction,
132
+ mouseRadius,
133
+ ]);
134
+ if (!isWeb)
135
+ return null;
136
+ const style = {
137
+ position: 'absolute',
138
+ inset: 0,
139
+ pointerEvents: 'none',
140
+ };
141
+ return _jsx("canvas", { ref: canvasRef, ...slot('particles'), className: className, style: style });
142
+ }
143
+ //# sourceMappingURL=particles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"particles.js","sourceRoot":"","sources":["../../../src/backends/gui/particles.tsx"],"names":[],"mappings":"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"}