atome 0.5.6.8.7 → 0.5.7.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (113) hide show
  1. checksums.yaml +4 -4
  2. data/documentation/basic.md +7 -8
  3. data/documentation/deep learning/basic_infos.txt +6 -6
  4. data/documentation/installation/atome_server.md +66 -1
  5. data/documentation/installation/buiding_atome.md +307 -0
  6. data/lib/atome/atome.rb +2 -3
  7. data/lib/atome/extensions/atome.rb +38 -12
  8. data/lib/atome/genesis/atomes.rb +1 -1
  9. data/lib/atome/genesis/genesis.rb +11 -11
  10. data/lib/atome/genesis/particles/event.rb +58 -50
  11. data/lib/atome/genesis/particles/identity.rb +3 -0
  12. data/lib/atome/genesis/particles/property.rb +2 -1
  13. data/lib/atome/genesis/particles/utility.rb +19 -12
  14. data/lib/atome/genesis/presets.rb +10 -0
  15. data/lib/atome/genesis/sparkle.rb +11 -9
  16. data/lib/atome/kernel/universe.rb +22 -11
  17. data/lib/atome/presets/atome.rb +20 -17
  18. data/lib/atome/utilities/essentials.rb +5 -5
  19. data/lib/atome/utilities/utilities.rb +168 -15
  20. data/lib/atome/version.rb +1 -1
  21. data/lib/atome.rb +1 -0
  22. data/lib/atome_relative.rb +1 -0
  23. data/lib/molecules/init.rb +22 -42
  24. data/lib/molecules/intuition/_deprecated_inputs.rb +111 -0
  25. data/lib/molecules/intuition/utillities.rb +105 -11
  26. data/lib/renderers/html/event.rb +20 -4
  27. data/lib/renderers/html/html.rb +145 -161
  28. data/lib/renderers/html/identity.rb +10 -2
  29. data/lib/renderers/html/utility.rb +64 -8
  30. data/vendor/assets/application/examples/b64_to_image.rb +9 -0
  31. data/vendor/assets/application/examples/drag.rb +9 -2
  32. data/vendor/assets/application/examples/matrix.rb +77 -114
  33. data/vendor/assets/application/examples/recorder.rb +74 -0
  34. data/vendor/assets/application/examples/site.rb +41 -0
  35. data/vendor/assets/application/examples/sub_atome_manipulation.rb +0 -2
  36. data/vendor/assets/application/examples/svg_img_to_vector.rb +6 -0
  37. data/vendor/assets/application/examples/svg_vectorizer.rb +21 -0
  38. data/vendor/assets/application/examples/table.rb +1 -1
  39. data/vendor/assets/application/examples/test.rb +572 -0
  40. data/vendor/assets/application/examples/tools.rb +650 -304
  41. data/vendor/assets/application/examples/vector.rb +16 -3
  42. data/vendor/assets/server/atome_server.rb +3 -2
  43. data/vendor/assets/server/atome_server_wasm.rb +2 -2
  44. data/vendor/assets/server/eDen.rb +135 -14
  45. data/vendor/assets/src/index.html +1 -1
  46. data/vendor/assets/src/index_opal.html +1 -1
  47. data/vendor/assets/src/index_server.html +1 -1
  48. data/vendor/assets/src/index_server_wasm.html +1 -1
  49. data/vendor/assets/src/index_wasm.html +1 -1
  50. data/vendor/assets/src/js/atome/atome.js +250 -49
  51. data/vendor/assets/src/js/atome/atome_helpers/communication.js +4 -4
  52. data/vendor/assets/src/js/atome/specific/opal.js +19 -3
  53. data/vendor/assets/src/js/atome/specific/wasm.js +18 -3
  54. data/vendor/assets/src/js/molecules/web.js +1 -1
  55. data/vendor/assets/src/medias/images/icons/Lowpass.svg +8 -0
  56. data/vendor/assets/src/medias/images/icons/activate.svg +3 -0
  57. data/vendor/assets/src/medias/images/icons/audio.svg +7 -0
  58. data/vendor/assets/src/medias/images/icons/band_pass.svg +8 -0
  59. data/vendor/assets/src/medias/images/icons/clear.svg +5 -0
  60. data/vendor/assets/src/medias/images/icons/color.svg +5 -0
  61. data/vendor/assets/src/medias/images/icons/copy.svg +8 -0
  62. data/vendor/assets/src/medias/images/icons/create.svg +3 -0
  63. data/vendor/assets/src/medias/images/icons/delete.svg +8 -0
  64. data/vendor/assets/src/medias/images/icons/edit-.svg +4 -0
  65. data/vendor/assets/src/medias/images/icons/edit.svg +4 -0
  66. data/vendor/assets/src/medias/images/icons/edition.svg +4 -0
  67. data/vendor/assets/src/medias/images/icons/equalizer-.svg +5 -0
  68. data/vendor/assets/src/medias/images/icons/equalizer.svg +5 -0
  69. data/vendor/assets/src/medias/images/icons/filter.svg +4 -0
  70. data/vendor/assets/src/medias/images/icons/folder.svg +4 -0
  71. data/vendor/assets/src/medias/images/icons/group.svg +6 -0
  72. data/vendor/assets/src/medias/images/icons/hamburger.svg +8 -0
  73. data/vendor/assets/src/medias/images/icons/high_pass.svg +5 -0
  74. data/vendor/assets/src/medias/images/icons/link.svg +4 -0
  75. data/vendor/assets/src/medias/images/icons/load.svg +4 -0
  76. data/vendor/assets/src/medias/images/icons/low_pass.svg +5 -0
  77. data/vendor/assets/src/medias/images/icons/microphone.svg +7 -0
  78. data/vendor/assets/src/medias/images/icons/midi_in.svg +4 -0
  79. data/vendor/assets/src/medias/images/icons/midi_out.svg +4 -0
  80. data/vendor/assets/src/medias/images/icons/modules.svg +11 -0
  81. data/vendor/assets/src/medias/images/icons/paste.svg +4 -0
  82. data/vendor/assets/src/medias/images/icons/pause.svg +5 -0
  83. data/vendor/assets/src/medias/images/icons/play.svg +7 -0
  84. data/vendor/assets/src/medias/images/icons/record.svg +4 -0
  85. data/vendor/assets/src/medias/images/icons/save.svg +5 -0
  86. data/vendor/assets/src/medias/images/icons/select--.svg +4 -0
  87. data/vendor/assets/src/medias/images/icons/select-.svg +5 -0
  88. data/vendor/assets/src/medias/images/icons/select-all.svg +4 -0
  89. data/vendor/assets/src/medias/images/icons/select.svg +4 -0
  90. data/vendor/assets/src/medias/images/icons/settings.svg +5 -0
  91. data/vendor/assets/src/medias/images/icons/settings0.svg +2 -0
  92. data/vendor/assets/src/medias/images/icons/settings1.svg +17 -0
  93. data/vendor/assets/src/medias/images/icons/settings2.svg +25 -0
  94. data/vendor/assets/src/medias/images/icons/settings_old.svg +6 -0
  95. data/vendor/assets/src/medias/images/icons/shape.svg +7 -0
  96. data/vendor/assets/src/medias/images/icons/speaker.svg +6 -0
  97. data/vendor/assets/src/medias/images/icons/stop.svg +4 -0
  98. data/vendor/assets/src/medias/images/icons/tool.svg +7 -0
  99. data/vendor/assets/src/medias/images/icons/tools.svg +9 -0
  100. data/vendor/assets/src/medias/images/icons/undo2.svg +4 -0
  101. data/vendor/assets/src/medias/images/icons/validate.svg +9 -0
  102. data/vendor/assets/src/medias/images/icons/vie.svg +3 -0
  103. data/vendor/assets/src/medias/images/icons/wave-saw.svg +3 -0
  104. data/vendor/assets/src/medias/images/icons/wave-sine.svg +3 -0
  105. data/vendor/assets/src/medias/images/icons/wave-square-.svg +4 -0
  106. data/vendor/assets/src/medias/images/icons/wave-square.svg +3 -0
  107. data/vendor/assets/src/medias/images/icons/wave-triangle.svg +3 -0
  108. data/vendor/assets/src/medias/images/icons/waveform-.svg +4 -0
  109. data/vendor/assets/src/medias/images/icons/waveform.svg +7 -0
  110. metadata +68 -6
  111. data/lib/molecules/intuition/inputs.rb +0 -111
  112. /data/lib/molecules/{examples → _deprecated_examples}/site.rb +0 -0
  113. /data/lib/molecules/intuition/{toolbox.rb → _deprecated_toolbox.rb} +0 -0
@@ -14,8 +14,8 @@ async function callback(callback_method, cmd) {
14
14
  } catch (error) {
15
15
  cmd_result = error;
16
16
  }
17
- rubyVMCallback("Atome.instance_variable_set('" + instance_variable_to_set + "','" + cmd_result + "')")
18
- rubyVMCallback(ruby_callback_method)
17
+ atomeJsToRuby("Atome.instance_variable_set('" + instance_variable_to_set + "','" + cmd_result + "')")
18
+ atomeJsToRuby(ruby_callback_method)
19
19
  }
20
20
 
21
21
  //read file
@@ -28,9 +28,8 @@ async function readFile(atome_id, filePath) {
28
28
  } catch (error) {
29
29
  fileContent = error;
30
30
  }
31
- // alert(fileContent);
32
- rubyVMCallback("grab(:" + atome_id + ").callback({ read: '" + fileContent + "' })");
33
- rubyVMCallback("grab(:" + atome_id + ").call(:read)");
31
+ atomeJsToRuby("grab(:" + atome_id + ").callback({ read: '" + fileContent + "' })");
32
+ atomeJsToRuby("grab(:" + atome_id + ").call(:read)");
34
33
  }
35
34
 
36
35
 
@@ -44,8 +43,8 @@ async function browseFile(atome_id, directoryPath) {
44
43
  } catch (error) {
45
44
  directoryContent = error;
46
45
  }
47
- rubyVMCallback("grab(:" + atome_id + ").callback({ browse: '" + directoryContent + "' })");
48
- rubyVMCallback("grab(:" + atome_id + ").call(:browse)");
46
+ atomeJsToRuby("grab(:" + atome_id + ").callback({ browse: '" + directoryContent + "' })");
47
+ atomeJsToRuby("grab(:" + atome_id + ").call(:browse)");
49
48
  }
50
49
 
51
50
 
@@ -59,7 +58,6 @@ async function changeCurrentDirectory(atome_id, newPath) {
59
58
  } catch (error) {
60
59
  result = error;
61
60
  }
62
- alert('result is : ' + result);
63
61
  }
64
62
 
65
63
 
@@ -77,8 +75,8 @@ async function terminal(atome_id, cmd) {
77
75
  }
78
76
  cmd_result = cmd_result.replace(/\r?\n/g, "");
79
77
 
80
- rubyVMCallback("grab(:" + atome_id + ").callback({ terminal: '" + cmd_result + "' })");
81
- rubyVMCallback("grab(:" + atome_id + ").call(:terminal)");
78
+ atomeJsToRuby("grab(:" + atome_id + ").callback({ terminal: '" + cmd_result + "' })");
79
+ atomeJsToRuby("grab(:" + atome_id + ").call(:terminal)");
82
80
 
83
81
  }
84
82
 
@@ -87,8 +85,8 @@ function distant_terminal(id, cmd) {
87
85
  let myd_data_test = 'Terminal particle will soon be implemented when using a non native mode\nYou can switch to OSX to test';
88
86
  let call_back_to_send = `grab(:${id}).callback({terminal: "${myd_data_test}"})`
89
87
  let call = `grab(:${id}).call(:terminal)`
90
- rubyVMCallback(call_back_to_send)
91
- rubyVMCallback(call)
88
+ atomeJsToRuby(call_back_to_send)
89
+ atomeJsToRuby(call)
92
90
  }
93
91
 
94
92
 
@@ -165,7 +163,7 @@ function createSvgElement(tagName, attributes) {
165
163
  // reader.onload = function(event) {
166
164
  // var content = event.target.result;
167
165
  // var sanitizedContent = sanitizeString(content);
168
- // rubyVMCallback("input_callback('"+sanitizedContent+"')");
166
+ // atomeJsToRuby("input_callback('"+sanitizedContent+"')");
169
167
  // };
170
168
  //
171
169
  // reader.readAsText(file);
@@ -220,35 +218,6 @@ function fileForOpal(parent, bloc) {
220
218
  }
221
219
 
222
220
 
223
- // function loadFeature() {
224
- // var script = document.createElement('script');
225
- // script.src = 'js/molecules/web.js?' + new Date().getTime();
226
- // // script.onload = function () {
227
- // // // Code to use loaded features
228
- // // };
229
- // // puts to solve native (osx) compatiblity use fetch
230
- //
231
- // document.head.appendChild(script);
232
- // }
233
-
234
- // function loadFeature() {
235
- // fetch('js/molecules/web.js')
236
- // .then(response => {
237
- // if (response.ok) {
238
- // return response.text();
239
- // }
240
- // throw new Error('Le chargement du fichier a échoué');
241
- // })
242
- // .then(data => {
243
- // console.log(data); // Log le contenu du fichier web.js
244
- // // Vous pouvez ici utiliser le contenu du fichier comme nécessaire
245
- // })
246
- // .catch(error => {
247
- // console.error('Erreur lors du chargement du fichier:', error);
248
- // });
249
- // }
250
-
251
-
252
221
  function loadFeature() {
253
222
  if (NativeMode) {
254
223
  // fetch('js/molecules/web.js')
@@ -294,12 +263,244 @@ function loadFeature() {
294
263
  }
295
264
  }
296
265
 
297
- ///test methode
298
- function my_opal_js_fct(val){
299
- Opal.eval("my_ruby_meth('opal call ruby with eval: "+val+"')");
300
- Opal.Object.$my_ruby_meth('opal call ruby with method name: '+val);
266
+
267
+ // temp storage for active recording media
268
+ let atomeStore = {}
269
+ function writeatomestore(primaryKey, secondaryKey, value) {
270
+ if (!atomeStore[primaryKey]) {
271
+ atomeStore[primaryKey] = {};
272
+ }
273
+ atomeStore[primaryKey][secondaryKey] = value;
274
+ }
275
+
276
+ function readatomestore(primaryKey, secondaryKey) {
277
+ if (atomeStore.hasOwnProperty(primaryKey) && atomeStore[primaryKey].hasOwnProperty(secondaryKey)) {
278
+ return atomeStore[primaryKey][secondaryKey];
279
+ } else {
280
+ console.error("MediaRecorder not found");
281
+ return null;
282
+ }
283
+ }
284
+
285
+
286
+ // preview
287
+ function create_preview(preview_id, enableVideo, enableAudio) {
288
+ if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) {
289
+ console.log("Your browser doesn't support media recording");
290
+ return;
291
+ }
292
+
293
+ navigator.mediaDevices.getUserMedia({ audio: enableAudio, video: enableVideo })
294
+ .then(function (stream) {
295
+ window.mediaStream = stream;
296
+ console.log("Media stream ready. You can start recording.");
297
+
298
+ let previewContainer = document.getElementById(preview_id);
299
+ if (!previewContainer) {
300
+ previewContainer = document.createElement('div');
301
+ previewContainer.id = preview_id;
302
+
303
+ const viewDiv = document.getElementById('view');
304
+ if (viewDiv) {
305
+ viewDiv.appendChild(previewContainer);
306
+ } else {
307
+ document.body.appendChild(previewContainer); // Fallback
308
+ }
309
+ }
310
+
311
+ if (enableVideo == 'true') {
312
+ const videoElement = document.createElement('video');
313
+ videoElement.controls = true;
314
+ videoElement.autoplay = true;
315
+ videoElement.muted = true;
316
+ videoElement.srcObject = stream;
317
+ videoElement.muted = false;
318
+ videoElement.volume = 1.0;
319
+ previewContainer.appendChild(videoElement);
320
+ } else {
321
+ console.log("Video preview is disabled.");
322
+ }
323
+
324
+ if (enableAudio == 'true') {
325
+ const audioElement = document.createElement('audio');
326
+ audioElement.controls = true;
327
+ audioElement.autoplay = true;
328
+ audioElement.srcObject = stream;
329
+ previewContainer.appendChild(audioElement);
330
+
331
+ }
332
+
333
+ })
334
+ .catch(function (err) {
335
+ console.error("Error when accessing media devices: " + err);
336
+ });
337
+ }
338
+ function stopPreview(preview_id) {
339
+ const previewContainer = document.getElementById(preview_id);
340
+ if (previewContainer) {
341
+ // Arrêter toutes les pistes du flux
342
+ if (window.mediaStream) {
343
+ window.mediaStream.getTracks().forEach(track => {
344
+ track.stop();
345
+ });
346
+ }
347
+
348
+ // Supprimer la `div` de prévisualisation
349
+ previewContainer.remove();
350
+ } else {
351
+ console.log("Preview container not found.");
352
+ }
353
+ }
354
+ // Audio recorder
355
+
356
+ function recordAudio(duration, atome_id,filename) {
357
+ writeatomestore(atome_id, 'record', 'playing')
358
+
359
+ if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) {
360
+ console.log("Your browser doesn't support audio recording");
361
+ return;
362
+ }
363
+
364
+ navigator.mediaDevices.getUserMedia({ audio: true })
365
+ .then(function (stream) {
366
+ const audioOptions = [
367
+ 'audio/webm',
368
+ 'audio/webm;codecs=opus',
369
+ 'audio/ogg',
370
+ 'audio/wav'
371
+ ];
372
+
373
+ let mimeType = audioOptions.find(option => MediaRecorder.isTypeSupported(option));
374
+ const mediaRecorder = new MediaRecorder(stream, mimeType ? { mimeType: mimeType } : {});
375
+
376
+ let audioChunks = [];
377
+
378
+ // Start recording with a time slice to trigger data available events periodically
379
+ mediaRecorder.start(10); // Timeslice of 1000 ms
380
+
381
+ mediaRecorder.ondataavailable = function (event) {
382
+ if (readatomestore(atome_id, 'record') == 'stop'){
383
+ mediaRecorder.stop();
384
+ }
385
+ atomeJsToRuby("grab(:" + atome_id + ").js_callback('"+atome_id+"','record', '"+event.data+"', 'audio')");
386
+ audioChunks.push(event.data);
387
+
388
+ };
389
+
390
+ setTimeout(() => {
391
+ mediaRecorder.stop();
392
+ }, duration);
393
+
394
+ mediaRecorder.onstop = function () {
395
+ const audioBlob = new Blob(audioChunks, { type: mimeType || 'audio/mp4' });
396
+ const audioUrl = URL.createObjectURL(audioBlob);
397
+
398
+ // Functions to handle the recording post processing
399
+ if (atome_id === 'atome'){
400
+ atome_id ='view'
401
+ }
402
+ record_content(audioUrl);
403
+ playRecording(audioBlob,filename,atome_id);
404
+ saveRecording(audioUrl,filename);
405
+ atomeJsToRuby("grab(:" + atome_id + ").js_callback('"+atome_id+"','record','"+audioBlob+"', 'audio')");
406
+
407
+ // Ensure all tracks are stopped once recording is finished
408
+ stream.getTracks().forEach(track => track.stop());
409
+ };
410
+ })
411
+ .catch(function (err) {
412
+ console.error("Error when accessing microphone: " + err);
413
+ });
414
+ }
415
+
416
+
417
+ // # video recorder
418
+
419
+ function recordVideo(duration, atome_id, filename) {
420
+ writeatomestore(atome_id, 'record', 'playing')
421
+
422
+ if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) {
423
+ console.log("Your browser doesn't support video recording");
424
+ return;
425
+ }
426
+
427
+ navigator.mediaDevices.getUserMedia({audio: true, video: true})
428
+ .then(function (stream) {
429
+ const mediaOptions = [
430
+ 'video/webm; codecs=vp9,opus',
431
+ 'video/webm; codecs=vp8,opus',
432
+ 'video/webm'
433
+ ];
434
+
435
+ let mimeType = mediaOptions.find(option => MediaRecorder.isTypeSupported(option));
436
+ const mediaRecorder = new MediaRecorder(stream, mimeType ? {mimeType: mimeType} : {});
437
+
438
+ let mediaChunks = [];
439
+
440
+ mediaRecorder.start(10); // Set timeslice to 1000 milliseconds
441
+
442
+
443
+ mediaRecorder.ondataavailable = function (event) {
444
+ if (readatomestore(atome_id, 'record') == 'stop'){
445
+ mediaRecorder.stop();
446
+ }
447
+ atomeJsToRuby("grab(:" + atome_id + ").js_callback('"+atome_id+"','record', '"+event.data+"', 'video')");
448
+ mediaChunks.push(event.data);
449
+ };
450
+
451
+ // Stop recording after the specified duration
452
+ setTimeout(() => {
453
+ mediaRecorder.stop();
454
+ }, duration);
455
+
456
+ mediaRecorder.onstop = function () {
457
+ const mediaBlob = new Blob(mediaChunks, {type: mimeType || 'video/mp4'});
458
+ const mediaUrl = URL.createObjectURL(mediaBlob);
459
+ if (atome_id === 'atome'){
460
+ atome_id ='view'
461
+ }
462
+ // Functions to handle the recording post-processing
463
+ record_content(mediaUrl);
464
+ playRecording(mediaBlob,filename,atome_id);
465
+ saveRecording(mediaUrl,filename);
466
+ atomeJsToRuby("grab(:" + atome_id + ").js_callback('"+atome_id+"','record', '"+mediaBlob+"', 'video')");
467
+ // Stop all media tracks and clear the video element source
468
+ stream.getTracks().forEach(track => track.stop());
469
+ // videoElement.srcObject = null;
470
+ };
471
+ })
472
+ .catch(function (err) {
473
+ console.error("Error when accessing peripherals: " + err);
474
+ });
475
+ }
476
+
477
+
478
+ let mediaUrlGlobal = "";
479
+
480
+ function saveRecording(url,filename) {
481
+ mediaUrlGlobal = url;
482
+ console.log("URL recorded: " + url);
483
+ const downloadLink = document.createElement('a');
484
+ downloadLink.href = url;
485
+ downloadLink.download = filename+".mp4";
486
+ document.body.appendChild(downloadLink);
487
+ downloadLink.click();
488
+ document.body.removeChild(downloadLink);
489
+ }
490
+
491
+ function playRecording(blob,filename, parent) {
492
+
493
+ const mediaElement = document.createElement('video');
494
+ mediaElement.src = URL.createObjectURL(blob);
495
+ mediaElement.controls = true; // add control to media element
496
+ mediaElement.id = filename;
497
+ const viewDiv = document.getElementById(parent);
498
+ viewDiv.appendChild(mediaElement);
499
+
500
+ }
501
+
502
+ function record_content(blob) {
503
+ console.log("recorded blob content :", blob);
301
504
  }
302
505
 
303
- function my_ruby_wasm_js_fct(val){
304
- rubyVM.eval("my_ruby_meth('ruby wasm eval: "+val+"')");
305
- }
506
+
@@ -8,16 +8,16 @@
8
8
  // websocket = new WebSocket(address);
9
9
  //
10
10
  // websocket.onopen = function (event) {
11
- // rubyVMCallback("puts 'Connected to WebSocket'")
11
+ // atomeJsToRuby("puts 'Connected to WebSocket'")
12
12
  //
13
13
  // };
14
14
  //
15
15
  // websocket.onmessage = function (event) {
16
- // // rubyVMCallback("puts 'object ruby callback : " + event.data + "'")
16
+ // // atomeJsToRuby("puts 'object ruby callback : " + event.data + "'")
17
17
  // };
18
18
  //
19
19
  // websocket.onclose = function (event) {
20
- // rubyVMCallback("puts 'WebSocket closed'")
20
+ // atomeJsToRuby("puts 'WebSocket closed'")
21
21
  // };
22
22
  //
23
23
  // websocket.onerror = function (event) {
@@ -31,5 +31,5 @@
31
31
 
32
32
  // function controller_message(msg) {
33
33
  // // let json_msgs = JSON.parse(msg);
34
- // rubyVMCallback("A.receptor("+msg+")")
34
+ // atomeJsToRuby("A.receptor("+msg+")")
35
35
  // }
@@ -1,4 +1,4 @@
1
- function rubyVMCallback(rubycode) {
1
+ function atomeJsToRuby(rubycode) {
2
2
  Opal.eval(rubycode);
3
3
  }
4
4
 
@@ -11,7 +11,7 @@ function controller_message(msg) {
11
11
  function loadApplicationJs() {
12
12
  var script = document.createElement('script');
13
13
  script.src = 'js/application.js';
14
- script.onload = function() {
14
+ script.onload = function () {
15
15
  Opal.Object.$init_database();
16
16
  };
17
17
  document.body.appendChild(script);
@@ -68,7 +68,7 @@ const communication = {
68
68
 
69
69
  // now new can exec user code : loadApplicationJs in index.html
70
70
  loadApplicationJs();
71
- // rubyVMCallback("A.user_login");
71
+ // atomeJsToRuby("A.user_login");
72
72
  };
73
73
  this.websocket.onmessage = function (event) {
74
74
  Opal.eval("Atome.server_receiver(" + event.data + ")");
@@ -92,4 +92,20 @@ const communication = {
92
92
  // puts "--> message : #{message}"
93
93
  this.websocket.send(message)
94
94
  },
95
+ }
96
+
97
+
98
+ function my_ruby_wasm_js_fct(val) {
99
+ Opal.eval("my_ruby_meth('ruby wasm eval: " + val + "')");
100
+ }
101
+
102
+ function fetchSVGContent(svgPath, target) {
103
+ fetch(svgPath)
104
+ .then(response => response.text())
105
+ .then(data => {
106
+ // Opal.eval("A.handleSVGContent('"+data+"', '"+target+"')") ;
107
+ Opal.Atome.$handleSVGContent(data, target);
108
+ })
109
+ .catch(error => console.error('Erreur de chargement du SVG :', error));
110
+
95
111
  }
@@ -1,4 +1,4 @@
1
- function rubyVMCallback(rubycode) {
1
+ function atomeJsToRuby(rubycode) {
2
2
  rubyVM.eval(rubycode);
3
3
  }
4
4
 
@@ -8,7 +8,7 @@ function controller_message(msg) {
8
8
 
9
9
  // window.addEventListener('load', function () {
10
10
  // // Opal.Object.$atome_genesis();
11
- // rubyVMCallback('atome_genesis');
11
+ // atomeJsToRuby('atome_genesis');
12
12
  // })
13
13
 
14
14
  const communication = {
@@ -105,4 +105,19 @@ const communication = {
105
105
  // puts "--> message : #{message}"
106
106
  this.websocket.send(message)
107
107
  },
108
- }
108
+ }
109
+
110
+
111
+ function my_ruby_wasm_js_fct(val){
112
+ rubyVM.eval("my_ruby_meth('ruby wasm eval: "+val+"')");
113
+ }
114
+ function fetchSVGContent(svgPath, target) {
115
+ fetch(svgPath)
116
+ .then(response => response.text())
117
+ .then(data => {
118
+ rubyVM.eval("Atome.handleSVGContent('"+data+"', '"+target+"')") ;
119
+ // Module.call('handleSVGContent', 'void', ['string'], [data]);
120
+ })
121
+ .catch(error => console.error('Erreur de chargement du SVG :', error));
122
+
123
+ }
@@ -1,4 +1,4 @@
1
1
 
2
2
 
3
3
  rb_file='circle({left: 166, color: :orange})'
4
- rubyVMCallback(rb_file);
4
+ atomeJsToRuby(rb_file);
@@ -0,0 +1,8 @@
1
+
2
+ <svg width="100%" height="100%" viewBox="0 0 390 390" version="1.1" xmlns="http://www.w3.org/2000/svg"
3
+ style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:7;">
4
+ <g transform="matrix(1.13971,0,0,1.13971,-18.3598,-6.45008)">
5
+ <path id="p1" d="M80.093,115.773L231.615,115.773L307.243,232.645"
6
+ style="fill:none;stroke:white;stroke-width:25.59px;"/>
7
+ </g>
8
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" fill="currentColor">
2
+ <path id="mainPath" d="M15 5.5a4.394 4.394 0 0 1-4 4.5 2.955 2.955 0 0 0-.2-1A3.565 3.565 0 0 0 14 5.5a3.507 3.507 0 0 0-7-.3A3.552 3.552 0 0 0 6 5a4.622 4.622 0 0 1 4.5-4A4.481 4.481 0 0 1 15 5.5zM5.5 6a4.5 4.5 0 1 0 0 9.001 4.5 4.5 0 0 0 0-9z"/>
3
+ </svg>
@@ -0,0 +1,7 @@
1
+ <svg class="svg-icon" style="width: 1em; height: 1em;vertical-align: middle;overflow: hidden;"
2
+ viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
3
+ <path id="path1" d="M842 454c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8 0 140.3-113.7 254-254 254S258 594.3 258 454c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8 0 168.7 126.6 307.9 290 327.6V884H326.7c-13.7 0-24.7 14.3-24.7 32v36c0 4.4 2.8 8 6.2 8h407.6c3.4 0 6.2-3.6 6.2-8v-36c0-17.7-11-32-24.7-32H548V782.1c165.3-18 294-158 294-328.1z"
4
+ />
5
+ <path id="path2" d="M512 624c93.9 0 170-75.2 170-168V232c0-92.8-76.1-168-170-168s-170 75.2-170 168v224c0 92.8 76.1 168 170 168z m-94-392c0-50.6 41.9-92 94-92s94 41.4 94 92v224c0 50.6-41.9 92-94 92s-94-41.4-94-92V232z"
6
+ />
7
+ </svg>
@@ -0,0 +1,8 @@
1
+ <svg width="100%" height="100%" viewBox="0 0 390 390" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:7;">
2
+ <g transform="matrix(1.13971,0,0,1.13971,23.2937,-15.4579)">
3
+ <path id="p1" d="M80.093,115.773L231.615,115.773L307.243,232.645" style="fill:none;;stroke-width:25.59px;"/>
4
+ </g>
5
+ <g transform="matrix(-1.13971,0,0,1.13971,367.898,-15.2565)">
6
+ <path id="p2" d="M80.093,115.773L231.615,115.773L307.243,232.645" style="fill:none;stroke-width:25.59px;"/>
7
+ </g>
8
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg class="svg-icon" style="width: 1em; height: 1em;vertical-align: middle;fill: currentColor;overflow: hidden;"
2
+ viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
3
+ <path id="path1" d="M772.096 368.64H654.336V153.6c0-78.848-63.488-142.336-142.336-142.336S369.664 74.752 369.664 153.6v215.04H251.904c-94.208 0-171.008 76.8-171.008 171.008v59.392c0 53.248 44.032 97.28 97.28 97.28h4.096l-51.2 121.856c-18.432 43.008-13.312 92.16 12.288 132.096 25.6 38.912 69.632 62.464 116.736 62.464h501.76c48.128 0 92.16-23.552 117.76-64.512 25.6-39.936 29.696-90.112 9.216-133.12L833.536 696.32h12.288c53.248 0 97.28-44.032 97.28-97.28v-59.392c0-95.232-76.8-171.008-171.008-171.008zM451.584 153.6c0-32.768 26.624-60.416 60.416-60.416 32.768 0 60.416 26.624 60.416 60.416v215.04H451.584V153.6zM808.96 904.192c-11.264 16.384-28.672 26.624-49.152 26.624h-501.76c-19.456 0-36.864-9.216-48.128-25.6s-12.288-35.84-5.12-54.272l63.488-150.528h12.288v124.928c0 22.528 18.432 40.96 40.96 40.96s40.96-18.432 40.96-40.96v-122.88-2.048h40.96v124.928c0 22.528 18.432 40.96 40.96 40.96s40.96-18.432 40.96-40.96v-122.88-3.072h40.96v125.952c0 22.528 18.432 40.96 40.96 40.96s40.96-18.432 40.96-40.96v-122.88-4.096h40.96v126.976c0 22.528 18.432 40.96 40.96 40.96s40.96-18.432 40.96-40.96v-122.88-5.12h14.336L815.104 849.92c6.144 16.384 5.12 36.864-6.144 54.272z m52.224-306.176c0 8.192-7.168 15.36-15.36 15.36H178.176c-8.192 0-15.36-7.168-15.36-15.36v-59.392c0-49.152 39.936-89.088 89.088-89.088h520.192c49.152 0 89.088 39.936 89.088 89.088v59.392z"
4
+ fill="#333C4F"/>
5
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1024" height="1024" xml:space="preserve" id="colorCanvas">
2
+ <circle id="colorCanvas-oval" stroke="none" fill="rgb(255, 0, 0)" cx="274" cy="306" r="198" />
3
+ <circle id="colorCanvas-oval2" stroke="none" fill="rgb(0, 142, 255)" cx="767" cy="306" r="198" />
4
+ <circle id="colorCanvas-oval3" stroke="none" fill="rgb(50, 255, 0)" cx="499" cy="702" r="198" />
5
+ </svg>
@@ -0,0 +1,8 @@
1
+ <svg class="svg-icon" style="width: 1em; height: 1em;vertical-align: middle;fill: currentColor;overflow: hidden;"
2
+ viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
3
+ <path id="p1" d="M672 832 224 832c-52.928 0-96-43.072-96-96L128 160c0-52.928 43.072-96 96-96l448 0c52.928 0 96 43.072 96 96l0 576C768 788.928 724.928 832 672 832zM224 128C206.368 128 192 142.368 192 160l0 576c0 17.664 14.368 32 32 32l448 0c17.664 0 32-14.336 32-32L704 160c0-17.632-14.336-32-32-32L224 128z"/>
4
+ <path id="p2" d="M800 960 320 960c-17.664 0-32-14.304-32-32s14.336-32 32-32l480 0c17.664 0 32-14.336 32-32L832 256c0-17.664 14.304-32 32-32s32 14.336 32 32l0 608C896 916.928 852.928 960 800 960z"/>
5
+ <path id="p3" d="M544 320 288 320c-17.664 0-32-14.336-32-32s14.336-32 32-32l256 0c17.696 0 32 14.336 32 32S561.696 320 544 320z"/>
6
+ <path id="p4" d="M608 480 288.032 480c-17.664 0-32-14.336-32-32s14.336-32 32-32L608 416c17.696 0 32 14.336 32 32S625.696 480 608 480z"/>
7
+ <path id="p5" d="M608 640 288 640c-17.664 0-32-14.304-32-32s14.336-32 32-32l320 0c17.696 0 32 14.304 32 32S625.696 640 608 640z"/>
8
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
2
+ <path fill-rule="evenodd" id= "p1" d="M12.3023235,7.94519388 L4.69610276,15.549589 C4.29095108,15.9079238 4.04030835,16.4092335 4,16.8678295 L4,20.0029438 L7.06398288,20.004826 C7.5982069,19.9670062 8.09548693,19.7183782 8.49479322,19.2616227 L16.0567001,11.6997158 L12.3023235,7.94519388 Z M13.7167068,6.53115006 L17.4709137,10.2855022 L19.8647941,7.89162181 C19.9513987,7.80501747 20.0000526,7.68755666 20.0000526,7.56507948 C20.0000526,7.4426023 19.9513987,7.32514149 19.8647932,7.23853626 L16.7611243,4.13485646 C16.6754884,4.04854589 16.5589355,4 16.43735,4 C16.3157645,4 16.1992116,4.04854589 16.1135757,4.13485646 L13.7167068,6.53115006 Z M16.43735,2 C17.0920882,2 17.7197259,2.26141978 18.1781068,2.7234227 L21.2790059,5.82432181 C21.7406843,6.28599904 22.0000526,6.91216845 22.0000526,7.56507948 C22.0000526,8.21799052 21.7406843,8.84415992 21.2790068,9.30583626 L9.95750718,20.6237545 C9.25902448,21.4294925 8.26890003,21.9245308 7.1346,22.0023295 L2,22.0023295 L2,21.0023295 L2.00324765,16.7873015 C2.08843822,15.7328366 2.57866679,14.7523321 3.32649633,14.0934196 L14.6953877,2.72462818 C15.1563921,2.2608295 15.7833514,2 16.43735,2 Z"/>
3
+ </svg>
@@ -0,0 +1,8 @@
1
+ <svg class="svg-icon"
2
+ style="width: 1em; height: 1em;vertical-align: middle;fill: currentColor;overflow: hidden;" viewBox="0 0 1024 1024"
3
+ version="1.1" xmlns="http://www.w3.org/2000/svg">
4
+ <path id="p1" d="M768 384c-19.2 0-32 12.8-32 32l0 377.6c0 25.6-19.2 38.4-38.4 38.4L326.4 832c-25.6 0-38.4-19.2-38.4-38.4L288 416C288 396.8 275.2 384 256 384S224 396.8 224 416l0 377.6c0 57.6 44.8 102.4 102.4 102.4l364.8 0c57.6 0 102.4-44.8 102.4-102.4L793.6 416C800 396.8 787.2 384 768 384z"/>
5
+ <path id="p2" d="M460.8 736l0-320C460.8 396.8 448 384 435.2 384S396.8 396.8 396.8 416l0 320c0 19.2 12.8 32 32 32S460.8 755.2 460.8 736z"/>
6
+ <path id="p3" d="M627.2 736l0-320C627.2 396.8 608 384 588.8 384S563.2 396.8 563.2 416l0 320C563.2 755.2 576 768 588.8 768S627.2 755.2 627.2 736z"/>
7
+ <path id="p4" d="M832 256l-160 0L672 211.2C672 166.4 633.6 128 588.8 128L435.2 128C390.4 128 352 166.4 352 211.2L352 256 192 256C172.8 256 160 268.8 160 288S172.8 320 192 320l640 0c19.2 0 32-12.8 32-32S851.2 256 832 256zM416 211.2C416 198.4 422.4 192 435.2 192l153.6 0c12.8 0 19.2 6.4 19.2 19.2L608 256l-192 0L416 211.2z"/>
8
+ </svg>
@@ -0,0 +1,4 @@
1
+ <svg class="svg-icon" style="width: 1em; height: 1em;vertical-align: middle;fill: currentColor;overflow: hidden;"
2
+ viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
3
+ <path id="p1" d="M257.7 752c2 0 4-0.2 6-0.5L431.9 722c2-0.4 3.9-1.3 5.3-2.8l423.9-423.9c3.9-3.9 3.9-10.2 0-14.1L694.9 114.9c-1.9-1.9-4.4-2.9-7.1-2.9s-5.2 1-7.1 2.9L256.8 538.8c-1.5 1.5-2.4 3.3-2.8 5.3l-29.5 168.2c-1.9 11.1 1.5 21.9 9.4 29.8 6.6 6.4 14.9 9.9 23.8 9.9z m67.4-174.4L687.8 215l73.3 73.3-362.7 362.6-88.9 15.7 15.6-89zM880 836H144c-17.7 0-32 14.3-32 32v36c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-36c0-17.7-14.3-32-32-32z"/>
4
+ </svg>
@@ -0,0 +1,4 @@
1
+ <svg class="svg-icon" style="width: 1em; height: 1em;vertical-align: middle;fill: currentColor;overflow: hidden;"
2
+ viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
3
+ <path id="p1" d="M941.04 398.64 850.736 489.136 850.736 489.152 805.584 534.4 805.584 534.384 384.32 960.528 128.32 960.528C92.976 960.528 64.32 931.872 64.32 896.512L64.32 640.528 625.008 81.856C649.952 56.864 690.368 56.864 715.296 81.856L941.04 308.128C965.968 333.12 965.968 373.648 941.04 398.64ZM128.32 670.096 128.32 896.512 353.904 896.512 760.432 489.136 534.704 262.848 128.32 670.096ZM670.16 127.104 579.856 217.6 805.584 443.872 895.888 353.392 670.16 127.104Z"/>
4
+ </svg>
@@ -0,0 +1,4 @@
1
+ <svg class="svg-icon" style="width: 1em; height: 1em;vertical-align: middle;fill: currentColor;overflow: hidden;"
2
+ viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
3
+ <path id="p1" d="M257.7 752c2 0 4-0.2 6-0.5L431.9 722c2-0.4 3.9-1.3 5.3-2.8l423.9-423.9c3.9-3.9 3.9-10.2 0-14.1L694.9 114.9c-1.9-1.9-4.4-2.9-7.1-2.9s-5.2 1-7.1 2.9L256.8 538.8c-1.5 1.5-2.4 3.3-2.8 5.3l-29.5 168.2c-1.9 11.1 1.5 21.9 9.4 29.8 6.6 6.4 14.9 9.9 23.8 9.9z m67.4-174.4L687.8 215l73.3 73.3-362.7 362.6-88.9 15.7 15.6-89zM880 836H144c-17.7 0-32 14.3-32 32v36c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-36c0-17.7-14.3-32-32-32z"/>
4
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg class="svg-icon" style="width: 1em; height: 1em;vertical-align: middle;fill: currentColor;overflow: hidden;"
2
+ viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
3
+ <path id="p1" d="M561.92 298.666667a128.042667 128.042667 0 0 1 241.493333 0H896a42.666667 42.666667 0 0 1 0 85.333333h-92.586667a128.042667 128.042667 0 0 1-241.493333 0H128a42.666667 42.666667 0 1 1 0-85.333333h433.92z m-341.333333 341.333333a128.042667 128.042667 0 0 1 241.493333 0H896a42.666667 42.666667 0 0 1 0 85.333333H462.08a128.042667 128.042667 0 0 1-241.493333 0H128a42.666667 42.666667 0 0 1 0-85.333333h92.586667zM682.666667 384a42.666667 42.666667 0 1 0 0-85.333333 42.666667 42.666667 0 0 0 0 85.333333z m-341.333334 341.333333a42.666667 42.666667 0 1 0 0-85.333333 42.666667 42.666667 0 0 0 0 85.333333z"
4
+ fill="#000000"/>
5
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg class="svg-icon" style="width: 1em; height: 1em;vertical-align: middle;fill: currentColor;overflow: hidden;"
2
+ viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
3
+ <path id="p1" d="M704 512v234.666667a42.666667 42.666667 0 1 1-85.333333 0V512c-58.88 0-106.666667-47.850667-106.666667-106.666667v-85.333333c0-58.88 47.850667-106.666667 106.666667-106.666667h85.333333c58.88 0 106.666667 47.850667 106.666667 106.666667v85.333333c0 58.88-47.850667 106.666667-106.666667 106.666667z m-298.666667 0c58.88 0 106.666667 47.850667 106.666667 106.666667v85.333333c0 58.88-47.850667 106.666667-106.666667 106.666667h-85.333333c-58.88 0-106.666667-47.850667-106.666667-106.666667v-85.333333c0-58.88 47.850667-106.666667 106.666667-106.666667V277.333333a42.666667 42.666667 0 1 1 85.333333 0v234.666667zM42.666667 149.482667A106.752 106.752 0 0 1 149.482667 42.666667h725.034666A106.752 106.752 0 0 1 981.333333 149.482667v725.034666A106.752 106.752 0 0 1 874.517333 981.333333H149.482667A106.752 106.752 0 0 1 42.666667 874.517333V149.482667z m85.333333 0v725.034666C128 886.421333 137.578667 896 149.482667 896h725.034666c11.904 0 21.482667-9.578667 21.482667-21.482667V149.482667C896 137.578667 886.421333 128 874.517333 128H149.482667C137.578667 128 128 137.578667 128 149.482667zM298.666667 618.666667v85.333333c0 11.733333 9.6 21.333333 21.333333 21.333333h85.333333c11.733333 0 21.333333-9.6 21.333334-21.333333v-85.333333c0-11.733333-9.6-21.333333-21.333334-21.333334h-85.333333c-11.733333 0-21.333333 9.6-21.333333 21.333334z m298.666666-298.666667v85.333333c0 11.733333 9.6 21.333333 21.333334 21.333334h85.333333c11.733333 0 21.333333-9.6 21.333333-21.333334v-85.333333c0-11.733333-9.6-21.333333-21.333333-21.333333h-85.333333c-11.733333 0-21.333333 9.6-21.333334 21.333333z"
4
+ fill=""/>
5
+ </svg>
@@ -0,0 +1,4 @@
1
+ <svg class="svg-icon" style="width: 1em; height: 1em;vertical-align: middle;fill: currentColor;overflow: hidden;"
2
+ viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
3
+ <path id="p1" d="M987.898047 114.973767 654.502698 448.369116 654.502698 857.302326C654.502698 883.616744 633.165395 904.930233 606.874791 904.930233 580.560372 904.930233 559.246884 883.616744 559.246884 857.302326L559.246884 428.651163 571.868279 428.651163C568.32 413.195907 571.725395 396.454698 583.751442 384.404837L872.900465 95.255814 150.313674 95.255814 439.486512 384.404837C445.344744 390.26307 448.678698 397.407256 450.845767 404.837209L463.99107 404.837209 463.99107 976.372093C463.99107 1002.686512 442.677581 1024 416.363163 1024 390.048744 1024 368.735256 1002.686512 368.735256 976.372093L368.735256 448.369116 35.339907 114.973767C16.741209 96.37507 16.741209 66.226605 35.339907 47.627907 35.339907 47.627907 35.339907 47.627907 35.339907 47.627907 35.339907 21.313488 56.653395 0 82.967814 0L940.27014 0C966.584558 0 987.898047 21.313488 987.898047 47.627907 987.898047 47.627907 987.898047 47.627907 987.898047 47.627907 1006.496744 66.226605 1006.496744 96.37507 987.898047 114.973767Z"/>
4
+ </svg>
@@ -0,0 +1,4 @@
1
+ <svg class="svg-icon" style="width: 1em; height: 1em;vertical-align: middle;fill: currentColor;overflow: hidden;"
2
+ viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
3
+ <path id="p1" d="M896 967.111111h-768C57.315556 967.111111 0 908.885333 0 837.091556V186.88C0 115.114667 57.315556 56.888889 128 56.888889h183.466667A127.857778 127.857778 0 0 1 426.666667 130.56l26.453333 56.348444H896c70.684444 0 128 58.225778 128 130.048v520.135112C1024 908.885333 966.684444 967.111111 896 967.111111zM85.333333 437.447111v399.644445c0 23.921778 19.114667 43.320889 42.666667 43.320888h768c23.552 0 42.666667-19.399111 42.666667-43.320888v-399.644445H85.333333z m0-86.698667h853.333334v-33.792c0-23.950222-19.114667-43.349333-42.666667-43.349333H426.666667a42.609778 42.609778 0 0 1-38.4-24.718222l-37.973334-80.611556a42.609778 42.609778 0 0 0-38.826666-24.689777H128c-23.552 0-42.666667 19.399111-42.666667 43.320888v163.84z"/>
4
+ </svg>
@@ -0,0 +1,6 @@
1
+ <svg width="24" height="24" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
2
+ <path id="p1" d="M5 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4ZM19 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4ZM21 19a2 2 0 1 1-4 0 2 2 0 0 1 4 0ZM5 21a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z"
3
+ fill="#212121"/>
4
+ <path id="p2" d="M7.83 6a2.995 2.995 0 0 0 0-2h4.67A2.5 2.5 0 0 1 15 6.5V9h2.5a2.5 2.5 0 0 1 2.5 2.5v4.67a2.997 2.997 0 0 0-2 0V11.5a.5.5 0 0 0-.5-.5H15v1.5a2.5 2.5 0 0 1-2.5 2.5H11v2.5a.5.5 0 0 0 .5.5h4.67a2.997 2.997 0 0 0 0 2H11.5A2.5 2.5 0 0 1 9 17.5V15H6.5A2.5 2.5 0 0 1 4 12.5V7.83a2.995 2.995 0 0 0 2 0v4.67a.5.5 0 0 0 .5.5H9v-1.5A2.5 2.5 0 0 1 11.5 9H13V6.5a.5.5 0 0 0-.5-.5H7.83ZM13 12.5V11h-1.5a.5.5 0 0 0-.5.5V13h1.5a.5.5 0 0 0 .5-.5Z"
5
+ fill="#212121"/>
6
+ </svg>
@@ -0,0 +1,8 @@
1
+ <svg width="800px" height="800px" viewBox="0 0 24 24" fill="#000000" xmlns="http://www.w3.org/2000/svg">
2
+ <g>
3
+ <path id="p1" d="M5 7H19" stroke="#000000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
4
+ <path id="p2" d="M5 12L19 12" stroke="#000000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
5
+ <path id="p3" d="M5 17L19 17" stroke="#000000" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
6
+
7
+ </g>
8
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg width="100%" height="100%" viewBox="0 0 390 390" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:7;">
2
+ <g transform="matrix(-1.13971,0,0,1.13971,367.898,-15.2565)">
3
+ <path id="p1" d="M80.093,115.773L231.615,115.773L307.243,232.645" style="fill:none;stroke-width:25.59px;"/>
4
+ </g>
5
+ </svg>
@@ -0,0 +1,4 @@
1
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path id="p1" d="M18.5104 3.86829C16.9483 2.30619 14.4156 2.30619 12.8535 3.86829L8.61089 8.11093C7.04879 9.67303 7.04879 12.2057 8.61089 13.7678C10.173 15.3299 12.7056 15.3299 14.2677 13.7678L14.7704 13.2651C14.7704 13.2651 14.5439 12.6297 14.2677 12.3536C13.9916 12.0774 13.3562 11.8509 13.3562 11.8509L12.8535 12.3536C12.0725 13.1346 10.8061 13.1346 10.0251 12.3536C9.24405 11.5725 9.24405 10.3062 10.0251 9.52514L14.2677 5.2825C15.0488 4.50145 16.3151 4.50145 17.0962 5.2825C17.8772 6.06355 17.8772 7.32988 17.0962 8.11093L16.3891 8.81804C16.3891 8.81804 16.8786 9.1363 17.1873 9.44504C17.4961 9.75378 17.8033 10.2323 17.8033 10.2323L18.5104 9.52514C20.0725 7.96305 20.0725 5.43039 18.5104 3.86829Z" fill="black"/>
3
+ <path id="p2" d="M16.3891 10.2323C14.827 8.67015 12.2943 8.67015 10.7322 10.2323L10.1908 10.7736C10.1908 10.7736 10.4588 11.3731 10.735 11.6492C11.0111 11.9254 11.605 12.1878 11.605 12.1878L12.1464 11.6465C12.9275 10.8654 14.1938 10.8654 14.9748 11.6465C15.7559 12.4275 15.7559 13.6938 14.9748 14.4749L10.7322 18.7175C9.95116 19.4986 8.68483 19.4986 7.90378 18.7175C7.12273 17.9365 7.12273 16.6702 7.90378 15.8891L8.6827 15.1102C8.6827 15.1102 8.17992 14.751 7.90378 14.4749C7.62764 14.1987 7.26849 13.696 7.26849 13.696L6.48957 14.4749C4.92747 16.037 4.92747 18.5696 6.48957 20.1317C8.05166 21.6938 10.5843 21.6938 12.1464 20.1317L16.3891 15.8891C17.9512 14.327 17.9512 11.7943 16.3891 10.2323Z" fill="black"/>
4
+ </svg>