atome 0.5.5.7.7 → 0.5.5.8.1

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 (35) hide show
  1. checksums.yaml +4 -4
  2. data/exe/atome +110 -91
  3. data/lib/atome/atome.rb +3 -0
  4. data/lib/atome/extensions/atome.rb +180 -0
  5. data/lib/atome/genesis/generators/communication.rb +6 -2
  6. data/lib/atome/genesis/generators/effect.rb +7 -1
  7. data/lib/atome/genesis/generators/property.rb +2 -0
  8. data/lib/atome/genesis/generators/security.rb +4 -2
  9. data/lib/atome/genesis/generators/utility.rb +1 -0
  10. data/lib/atome/genesis/sparkle.rb +3 -2
  11. data/lib/atome/version.rb +1 -1
  12. data/lib/platform_specific/opal/extensions/js.rb +1 -2
  13. data/lib/renderers/html/effect.rb +7 -3
  14. data/lib/renderers/html/hierarchy.rb +1 -1
  15. data/lib/renderers/html/html.rb +5 -0
  16. data/lib/renderers/html/property.rb +14 -0
  17. data/lib/renderers/html/spatial.rb +14 -5
  18. data/sig/global_variables.rbs +1 -0
  19. data/vendor/assets/application/examples/a_concat.rb +3 -0
  20. data/vendor/assets/application/examples/blur.rb +6 -0
  21. data/vendor/assets/application/examples/border.rb +6 -0
  22. data/vendor/assets/application/examples/console.rb +4 -0
  23. data/vendor/assets/application/examples/import.rb +33 -0
  24. data/vendor/assets/application/examples/messaging.rb +17 -4
  25. data/vendor/assets/application/examples/shortcut.rb +25 -0
  26. data/vendor/assets/application/works/vie.rb +3 -0
  27. data/vendor/assets/server/atome_server.rb +40 -7
  28. data/vendor/assets/server/capture.rb +1 -1
  29. data/vendor/assets/src/index.html +7 -6
  30. data/vendor/assets/src/index_opal.html +11 -6
  31. data/vendor/assets/src/index_server.html +11 -7
  32. data/vendor/assets/src/index_server_wasm.html +7 -6
  33. data/vendor/assets/src/js/atome/atome.js +0 -95
  34. data/vendor/assets/src/js/atome/atome_helpers/communication.js +7 -6
  35. metadata +8 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2a47df79a8df1efe611c135f99a343afefe4e76b8a23bec82385f6f4a95890b4
4
- data.tar.gz: b1315627fd2df81fbc1bb45d19bbc1d6d8a25c8b49e13ab409bc5d0a5b565456
3
+ metadata.gz: dca916be3525186dfd79400fc93edeffbe278488c372a9ce67be16ae595d01a5
4
+ data.tar.gz: a332d054df5551d18058ef0e692e87eb362cb498962bcbc4f6717d2dc31d45b9
5
5
  SHA512:
6
- metadata.gz: 809b5491aa72a6f62ac9c4765bc4ed7f6910f444ee1447e2ce394c6f1217c72ad1e15f39fd5e0f07c13ca0706acca5e7c66a4fb573c8418d54eef532342ffd3b
7
- data.tar.gz: 3df3f9ab29f3d5775fc16d4372cc65f8c9b902771958806eedb7f5fbf05706e5042771248083b6b97a3476eb27055346510a7c3c0772c60e68740ab88bf9ef47
6
+ metadata.gz: 99f23cb4a77974b91c1169727740c4c20afd3c9b06c91b3de1d20fbaa4cd95e75806bc3f2775b659d4467be7618290ed14bd2045e04b0df0cdac1572f1b795ad
7
+ data.tar.gz: afdd19c60b61262fa4cd5abc89edc5a01692adf2aac3878741d1f508980c4cb48ea2d332468c649835f933742084082c13d3481673462ccda86bb9dd17611580
data/exe/atome CHANGED
@@ -413,6 +413,8 @@ def find_requires(file)
413
413
  end
414
414
 
415
415
  def copy_file(source, destination)
416
+ return if source == 'server.rb'
417
+
416
418
  FileUtils.mkdir_p(File.dirname(destination))
417
419
  FileUtils.cp(source, destination)
418
420
  end
@@ -577,52 +579,113 @@ STR
577
579
 
578
580
  end
579
581
 
580
- if ARGV.include?('opal')
581
- puts 'building Opal'
582
+ if ARGV.include?('sparkle')
583
+ temp_dir = if RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/
584
+ 'C:\Windows\Temp'
585
+ # code to exec with Windows
586
+ elsif RbConfig::CONFIG['host_os'] =~ /darwin|mac os/
587
+ '/tmp'
588
+ # code to exec with MacOS
589
+ else
590
+ '/tmp'
591
+ # code to exec with Unix/Linux
592
+ end
593
+
594
+ `cd #{temp_dir}; atome create atome_app` unless Dir.exist?("#{temp_dir}/atome_app")
595
+ # search for server file
596
+ if File.exist?('server.rb')
597
+ file_content = File.read('server.rb')
598
+ File.write("#{temp_dir}/atome_app/server/atome_server.rb", file_content)
599
+ base_folder = File.dirname(project_name)
600
+ copy_with_requires('server.rb', "#{temp_dir}/atome_app/server", base_folder)
601
+ end
602
+ project_name = ARGV[1]
603
+ if project_name.nil? || project_name == 'opal' || project_name == 'wasm' || project_name == 'server'
604
+ project_name = 'index.rb'
605
+ end
606
+ project_name = ensure_rb_extension(project_name)
607
+ base_folder = File.dirname(project_name)
608
+ copy_with_requires(project_name, "#{temp_dir}/atome_app/application", base_folder)
582
609
 
583
- build_opal_application(nil, destination, project_name)
584
- # build host_mode
585
- build_host_mode(destination, project_name, 'web-opal')
586
- # build Opal extensions
587
- if RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/
588
- # code to exec for Windows
589
- `start "" "#{destination}\\#{project_name}\\src\\index_opal.html"`
590
- elsif RbConfig::CONFIG['host_os'] =~ /darwin|mac os/
591
- # code to exec for MacOS
592
- `open #{destination}/#{project_name}/src/index_opal.html`
610
+ if ARGV.include?('opal')
611
+ `cd #{temp_dir}/atome_app;atome run opal`
612
+
613
+ elsif ARGV.include?('wasm')
614
+ `cd #{temp_dir}/atome_app;atome run wasm`
615
+
616
+ elsif ARGV.include?('server')
617
+ `cd #{temp_dir}/atome_app;atome run server`
593
618
  else
594
- # code to exec for Unix/Linux
595
- `open #{destination}/#{project_name}/src/index_opal.html`
619
+ `cd #{temp_dir}/atome_app;atome run opal`
596
620
  end
621
+ else
622
+ if ARGV.include?('opal')
623
+ puts 'building Opal'
597
624
 
598
- puts "opal ready!"
599
- end
625
+ build_opal_application(nil, destination, project_name)
626
+ # build host_mode
627
+ build_host_mode(destination, project_name, 'web-opal')
628
+ # build Opal extensions
629
+ if RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/
630
+ # code to exec for Windows
631
+ `start "" "#{destination}\\#{project_name}\\src\\index_opal.html"`
632
+ elsif RbConfig::CONFIG['host_os'] =~ /darwin|mac os/
633
+ # code to exec for MacOS
634
+ `open #{destination}/#{project_name}/src/index_opal.html`
635
+ else
636
+ # code to exec for Unix/Linux
637
+ `open #{destination}/#{project_name}/src/index_opal.html`
638
+ end
600
639
 
601
- if ARGV.include?('wasm')
602
- puts 'building Ruby wasm'
603
- wasi_file = 'wasi-vfs-osx_arm'
604
- wasm_common(source, destination, project_name, wasi_file, :pure_wasi)
640
+ puts "opal ready!"
641
+ end
642
+
643
+ if ARGV.include?('wasm')
644
+ puts 'building Ruby wasm'
645
+ wasi_file = 'wasi-vfs-osx_arm'
646
+ wasm_common(source, destination, project_name, wasi_file, :pure_wasi)
647
+
648
+ if RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/
649
+ # code to exec for Windows
650
+ `start "" "#{destination}\\#{project_name}\\src\\index.html"`
651
+ elsif RbConfig::CONFIG['host_os'] =~ /darwin|mac os/
652
+ # code to exec for MacOS
653
+ `open #{destination}/#{project_name}/src/index.html`
654
+ else
655
+ # code to exec for Unix/Linux
656
+ `open #{destination}/#{project_name}/src/index.html`
657
+ end
605
658
 
606
- if RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/
607
- # code to exec for Windows
608
- `start "" "#{destination}\\#{project_name}\\src\\index.html"`
609
- elsif RbConfig::CONFIG['host_os'] =~ /darwin|mac os/
610
- # code to exec for MacOS
611
- `open #{destination}/#{project_name}/src/index.html`
612
- else
613
- # code to exec for Unix/Linux
614
- `open #{destination}/#{project_name}/src/index.html`
615
659
  end
616
660
 
617
- end
661
+ if ARGV.include?('server')
662
+ puts 'building Server'
663
+ build_opal_application(nil, destination, project_name)
664
+ build_host_mode(destination, project_name, 'web-opal')
665
+ threads = []
666
+ threads << Thread.new do
667
+ sleep 1
668
+ if RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/
669
+ # code to exec with Windows
670
+ `start "" "#{destination}\\#{project_name}\\src\\index_opal.html`
671
+ elsif RbConfig::CONFIG['host_os'] =~ /darwin|mac os/
672
+ # code to exec with MacOS
673
+ `open http://localhost:9292`
674
+ else
675
+ # code to exec with Unix/Linux
676
+ `open http://localhost:9292`
677
+ end
678
+ end
679
+ threads << Thread.new do
680
+ build_for_server(destination, project_name, 9292, false)
681
+ end
618
682
 
619
- if ARGV.include?('server')
620
- puts 'building Server'
621
- build_opal_application(nil, destination, project_name)
622
- build_host_mode(destination, project_name, 'web-opal')
623
- threads = []
624
- threads << Thread.new do
625
- sleep 1
683
+ threads.each(&:join)
684
+ end
685
+
686
+ if ARGV.include?('server_refresh')
687
+ puts 're building Server'
688
+ build_opal_application(nil, destination, project_name)
626
689
  if RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/
627
690
  # code to exec with Windows
628
691
  `start "" "#{destination}\\#{project_name}\\src\\index_opal.html`
@@ -634,63 +697,19 @@ if ARGV.include?('server')
634
697
  `open http://localhost:9292`
635
698
  end
636
699
  end
637
- threads << Thread.new do
638
- build_for_server(destination, project_name, 9292, false)
639
- end
640
-
641
- threads.each(&:join)
642
- end
643
700
 
644
- if ARGV.include?('server_refresh')
645
- puts 're building Server'
646
- build_opal_application(nil, destination, project_name)
647
- if RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/
648
- # code to exec with Windows
649
- `start "" "#{destination}\\#{project_name}\\src\\index_opal.html`
650
- elsif RbConfig::CONFIG['host_os'] =~ /darwin|mac os/
651
- # code to exec with MacOS
652
- `open http://localhost:9292`
653
- else
654
- # code to exec with Unix/Linux
655
- `open http://localhost:9292`
701
+ if ARGV.include?('osx')
702
+ puts 'building osx'
703
+ wasi_file = 'wasi-vfs-osx_arm'
704
+ wasm_common(source, destination, project_name, wasi_file, :tauri)
705
+ build_for_osx(destination)
656
706
  end
657
- end
658
-
659
- if ARGV.include?('osx')
660
- puts 'building osx'
661
- wasi_file = 'wasi-vfs-osx_arm'
662
- wasm_common(source, destination, project_name, wasi_file, :tauri)
663
- build_for_osx(destination)
664
- end
665
707
 
666
- puts 'building Android' if ARGV.include?('android')
708
+ puts 'building Android' if ARGV.include?('android')
667
709
 
668
- puts 'building iOS' if ARGV.include?('ios')
669
- puts 'building Windows' if ARGV.include?('windows')
670
- puts 'building Linux' if ARGV.include?('linux')
671
- puts 'building Freebsd' if ARGV.include?('freebsd')
672
-
673
- if ARGV.include?('sparkle')
674
- if RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/
675
- temp_dir = 'C:\Windows\Temp'
676
- # code to exec with Windows
677
- elsif RbConfig::CONFIG['host_os'] =~ /darwin|mac os/
678
- temp_dir = '/tmp'
679
- # code to exec with MacOS
680
- else
681
- temp_dir = '/tmp'
682
- # code to exec with Unix/Linux
683
- end
684
- unless Dir.exist?("#{temp_dir}/atome_app")
685
- # `cd #{temp_dir}; atome create atome_app;cd atome_app;atome run opal`
686
- `cd #{temp_dir}; atome create atome_app`
687
- end
688
-
689
- project_name = ARGV[1]
690
- project_name = ensure_rb_extension(project_name)
691
- base_folder = File.dirname(project_name)
692
-
693
- copy_with_requires(project_name, "#{temp_dir}/atome_app/application", base_folder)
694
- `cd #{temp_dir}/atome_app;atome run opal`
710
+ puts 'building iOS' if ARGV.include?('ios')
711
+ puts 'building Windows' if ARGV.include?('windows')
712
+ puts 'building Linux' if ARGV.include?('linux')
713
+ puts 'building Freebsd' if ARGV.include?('freebsd')
695
714
 
696
715
  end
data/lib/atome/atome.rb CHANGED
@@ -5,6 +5,9 @@ class Atome
5
5
  include Essentials
6
6
 
7
7
  def initialize(new_atome = {}, &atomes_proc)
8
+ # TODO: atome format should always be as followed : {value: 0.44, unit: :px, opt1: 554}
9
+ # when using optimised version of atome you must type eg : a.set({left: {value: 33, unit: '%', reference: :center}})
10
+
8
11
  # the keys :renderers, :type and :id should be placed in the first position in the hash
9
12
  @history = {}
10
13
  @callback = {}
@@ -165,5 +165,185 @@ class Object
165
165
  end
166
166
  atome_get
167
167
  end
168
+ # shortcut
169
+
170
+ # we initialise $current_hovered_element
171
+ $current_hovered_element = nil
172
+
173
+ def shortcut(key:, option: nil, affect: :all, exclude: [], &block)
174
+ element_ids = (Array(affect) + Array(exclude)).uniq
175
+
176
+ element_ids.each do |element_id|
177
+ element = JS.global[:document].querySelector("##{element_id}")
178
+ if element
179
+ element.addEventListener("mouseenter") { $current_hovered_element = element_id }
180
+ element.addEventListener("mouseleave") { $current_hovered_element = nil }
181
+ end
182
+ end
183
+
184
+ JS.global[:document].addEventListener("keydown") do |native_event|
185
+ event = Native(native_event)
186
+ key_pressed = event[:key].downcase
187
+ ctrl_pressed = event[:ctrlKey]
188
+ alt_pressed = event[:altKey]
189
+ meta_pressed = event[:metaKey]
190
+
191
+ modifier_matched = case option
192
+ when :ctrl then ctrl_pressed
193
+ when :alt then alt_pressed
194
+ when :meta then meta_pressed
195
+ else true
196
+ end
197
+
198
+ affect_condition = affect == :all || Array(affect).include?($current_hovered_element)
199
+ exclude_condition = !Array(exclude).include?($current_hovered_element)
200
+ if $current_hovered_element.nil?
201
+ $current_hovered_element=:view
202
+ end
203
+ if key_pressed == key.to_s.downcase && modifier_matched && affect_condition && exclude_condition
204
+ block.call(key_pressed, $current_hovered_element)
205
+ end
206
+ end
207
+ end
208
+
209
+ def console(debug)
210
+ if debug
211
+ console=box({id: :console, width: :auto, height:225, bottom: 0,top: :auto, left: 0,right: 0,depth: 30, color: {alpha: 0, red: 0.1, green: 0.3 , blue:0.3}})
212
+ console_back=console.box({id: :console_back,blur: { value: 10, affect: :back}, overflow: :auto, width: :auto, height: :auto, top: 25, bottom: 0,left: 0,right: 0, depth: 30, color: {alpha: 0.3, red: 1, green: 1 , blue: 1}})
213
+ console_top=console.box({id: :console_top,overflow: :auto, width: :auto, height:25, top: 0, bottom: 0,left: 0,right: 0, depth: 30, color: {alpha: 1, red: 0.3, green: 0.3 , blue: 0.3}})
214
+
215
+ console_top.touch(:double) do
216
+ console.height(25)
217
+ console.bottom(0)
218
+ console.top(:auto)
219
+ end
220
+ console_top.shadow({
221
+ id: :s1,
222
+ # affect: [:the_circle],
223
+ left: 0, top: 3, blur: 9,
224
+ invert: false,
225
+ red: 0, green: 0, blue: 0, alpha: 1
226
+ })
227
+ console.drag(:locked) do |event|
228
+ dy = event[:dy]
229
+ y = console.to_px(:top)+dy.to_f
230
+ console.top(y)
231
+ console.height(:auto)
232
+ total_height=grab(:view).to_px(:height)
233
+ # console_back.height(total_height-console.top)
234
+ end
235
+ console_output=console_back.text({data: '', id: :console_output, component: {size: 12}})
236
+ JS.eval <<~JS
237
+ (function() {
238
+ var oldLog = console.log;
239
+ var consoleDiv = document.getElementById("console_output");
240
+ console.log = function(message) {
241
+ if (consoleDiv) {
242
+ consoleDiv.innerHTML += '<p>' + message + '</p>';
243
+ }
244
+ oldLog.apply(console, arguments);
245
+ };
246
+ }());
247
+ JS
248
+
249
+ console_clear=console_top.circle({id: :console_clear, color: :red, top: 3, left: 3, width: 19, height:19})
250
+ console_clear.touch(true) do
251
+ console_output.data("")
252
+ end
253
+ JS.global[:document].addEventListener("contextmenu") do |event|
254
+ end
255
+ # element[:style][:WebkitUserSelect] = 'none'
256
+ # element[:style][:MozUserSelect] = 'none'
257
+ else
258
+ grab(:console_back).delete(true)
259
+ JS.global[:document].addEventListener("contextmenu") do |native_event|
260
+ event = Native(native_event)
261
+ event.preventDefault
262
+ end
263
+ end
264
+ end
265
+
266
+ # import methode below
267
+ def importer_all(&proc)
268
+ JS.global[:document][:body].addEventListener('dragover') do |native_event|
269
+ event = Native(native_event)
270
+ event.preventDefault
271
+ end
272
+
273
+ JS.global[:document][:body].addEventListener('drop') do |native_event|
274
+ event = Native(native_event)
275
+ event.preventDefault
276
+ files = event[:dataTransfer][:files]
277
+
278
+ if files[:length].to_i > 0
279
+ (0...files[:length].to_i).each do |i|
280
+ file = files[i]
281
+ reader = JS.eval('let a= new FileReader(); return a')
282
+ reader.readAsText(file)
283
+ reader.addEventListener('load') do
284
+ proc.call({ content: reader[:result].to_s, name: file[:name].to_s, type: file[:type].to_s, size: file[:size].to_s })
285
+ end
286
+ reader.addEventListener('error') do
287
+ puts 'Error: ' + file[:name].to_s
288
+ end
289
+ end
290
+ end
291
+ end
292
+ end
293
+
294
+ def exception_import(atome_id, &proc)
295
+ if Universe.user_atomes.include?(atome_id.to_sym)
296
+ special_div = JS.global[:document].getElementById(atome_id)
297
+ special_div.addEventListener('dragover') do |native_event|
298
+ event = Native(native_event)
299
+ special_div[:style][:backgroundColor] = 'red'
300
+ event.preventDefault
301
+ event.stopPropagation
302
+ end
303
+
304
+ special_div.addEventListener('dragleave') do |native_event|
305
+ event = Native(native_event)
306
+ special_div[:style][:backgroundColor] = 'yellow'
307
+ event.stopPropagation
308
+ end
309
+
310
+ special_div.addEventListener('drop') do |native_event|
311
+ event = Native(native_event)
312
+ event.preventDefault
313
+ event.stopPropagation
314
+
315
+ files = event[:dataTransfer][:files]
316
+
317
+ if files[:length].to_i > 0
318
+ (0...files[:length].to_i).each do |i|
319
+ file = files[i]
320
+ reader = JS.eval('let a= new FileReader(); return a')
321
+ reader.readAsText(file)
322
+ reader.addEventListener('load') do
323
+ proc.call({ content: reader[:result].to_s, name: file[:name].to_s, type: file[:type].to_s, size: file[:size].to_s })
324
+ end
325
+ reader.addEventListener('error') do
326
+ puts 'Error: ' + file[:name].to_s
327
+ end
328
+ end
329
+ end
330
+ end
331
+ JS.global[:document][:body].addEventListener('drop') do |native_event|
332
+ event = Native(native_event)
333
+ event.preventDefault
334
+ event.stopPropagation
335
+
336
+ puts 'Fichier déposé hors de la zone spéciale'
337
+ end
338
+ end
339
+ end
340
+
341
+ def importer(target=:all,&proc)
342
+ if target== :all
343
+ importer_all(&proc)
344
+ else
345
+ exception_import(target,&proc)
346
+ end
347
+ end
168
348
 
169
349
  end
@@ -6,6 +6,10 @@ new({ particle: :connection }) do |params, bloc|
6
6
  end
7
7
 
8
8
  new({ particle: :message }) do |params, bloc|
9
- params = { server: params } unless params.instance_of? Hash
10
- html.send_message(params[:server], &bloc)
9
+
10
+ params = {message: params } unless params.instance_of? Hash
11
+ params[:user]=Universe.current_user
12
+ params[:pass]=Black_matter.password
13
+
14
+ html.send_message(params, &bloc)
11
15
  end
@@ -1,4 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  new({ particle: :smooth })
4
- new({ particle: :blur })
4
+
5
+
6
+ new({ particle: :blur }) do |params|
7
+ # alert params
8
+ { value: params, affect: :self } unless params.instance_of?(Hash)
9
+ # params
10
+ end
@@ -29,3 +29,5 @@ new({ particle: :diffusion }) do
29
29
  # we return self to allow syntax of the type : a.color(:black).red(1).green(0.3)
30
30
  self
31
31
  end
32
+
33
+ new = new({ particle: :border })
@@ -6,6 +6,8 @@ new ({ sanitizer: :password }) do |params|
6
6
  params = { read: params, write: params } unless params.instance_of? Hash
7
7
 
8
8
  # encoding below
9
+ params[:global] = Black_matter.encode(params[:global])
10
+
9
11
  params[:read]&.each do |k, v|
10
12
  params[:read][k] = Black_matter.encode(v)
11
13
  end
@@ -25,7 +27,7 @@ end
25
27
 
26
28
  new({ read: :password }) do |params|
27
29
  params = Black_matter.password if params.nil?
28
- params[:read][:atome]=Black_matter.password[:read][:atome] unless @authorisations[:write][:atome]
29
- params[:write][:atome]=Black_matter.password[:write][:atome] unless @authorisations[:write][:atome]
30
+ params[:read][:atome] = Black_matter.password[:read][:atome] unless @authorisations[:write][:atome]
31
+ params[:write][:atome] = Black_matter.password[:write][:atome] unless @authorisations[:write][:atome]
30
32
  params
31
33
  end
@@ -35,6 +35,7 @@ new({ particle: :delete, render: false }) do |params|
35
35
  id_found = @id.to_sym
36
36
  parent_found = grab(@attach)
37
37
  parent_found.attached.delete(id_found)
38
+ Universe.delete(@id)
38
39
  end
39
40
  elsif params.instance_of? Hash
40
41
 
@@ -79,7 +79,6 @@ Atome.new(
79
79
  machine_id = :dummy_machine
80
80
  # attention we must used two separate pass to avoid the password to be encode twice
81
81
  machine_password = { read: { atome: :star_wars }, write: { atome: :star_wars } }
82
- user_password = { read: { atome: :star_wars }, write: { atome: :star_wars } }
83
82
 
84
83
  # copy basket
85
84
  Atome.new({ renderers: [:html], id: :copy, collect: [], type: :group, tag: { system: true } })
@@ -90,6 +89,8 @@ Atome.new({ renderers: default_render, id: machine_id, type: :machine, password:
90
89
  name: :macAir, data: { date: '10090717' }, tag: { system: true } })
91
90
 
92
91
  #user
92
+ user_password = {global: :star_win, read: { atome: :star_wars }, write: { atome: :star_wars } }
93
+
93
94
  human({ id: :anonymous, login: true, password: user_password, data: { birthday: '10/05/1996' },selection: [], tag: { system: true } , attach: :user_view })
94
95
 
95
96
  Universe.current_machine = machine_id
@@ -115,4 +116,4 @@ def atome_infos
115
116
  puts "server: #{server}"
116
117
  end
117
118
 
118
- atome_infos
119
+ # atome_infos
data/lib/atome/version.rb CHANGED
@@ -2,5 +2,5 @@
2
2
 
3
3
  # return atome version
4
4
  class Atome
5
- VERSION = '0.5.5.7.7'
5
+ VERSION = '0.5.5.8.1'
6
6
  end
@@ -6,8 +6,7 @@ module JS
6
6
  def self.eval(string)
7
7
  clean_str = string.gsub('return', '')
8
8
  result = `eval(#{clean_str})`
9
- native_result = Native(result)
10
- native_result
9
+ Native(result)
11
10
  end
12
11
 
13
12
  def self.global
@@ -21,6 +21,10 @@ new({ renderer: :html, method: :smooth, type: :string }) do |value, _user_proc|
21
21
  html.style('border-radius', format_params)
22
22
  end
23
23
 
24
- new({ renderer: :html, method: :blur, type: :integer }) do |value, _user_proc|
25
- html.filter(:blur, "#{value}px")
26
- end
24
+ new({ renderer: :html, method: :blur, type: :integer }) do |params, _user_proc|
25
+ if params[:affect] == :back
26
+ html.backdropFilter(:blur, "#{params[:value]}px")
27
+ else
28
+ html.filter(:blur, "#{params[:value]}px")
29
+ end
30
+ end
@@ -18,7 +18,7 @@ new({ renderer: :html, method: :apply, type: :string }) do |parent_found, _user_
18
18
  alpha = shadow_found.alpha
19
19
  left = shadow_found.left
20
20
  top = shadow_found.top
21
- blur = shadow_found.blur
21
+ blur = shadow_found.blur[:value] # new correct behavior all atome's value should now be get using :value,here to resolve conflict with blur and back blur
22
22
  inset = :inset if shadow_found.invert
23
23
  if shadow_found.option == :natural
24
24
  shadows_to_apply[:filter] << "drop-shadow(#{left}px #{top}px #{blur}px rgba(#{red}, #{green}, #{blue}, #{alpha}))"
@@ -465,6 +465,11 @@ class HTML
465
465
  @element[:style][:filter] = filter_needed
466
466
  end
467
467
 
468
+ def backdropFilter(property, value)
469
+ filter_needed = "#{property}(#{value})"
470
+ @element[:style][:"-webkit-backdrop-filter"] = filter_needed
471
+ end
472
+
468
473
  def currentTime(time)
469
474
  @element[:currentTime] = time
470
475
  end
@@ -22,3 +22,17 @@ new({ renderer: :html, method: :edit }) do |params|
22
22
  html.attr(:contenteditable, params)
23
23
  html.update_data(params)
24
24
  end
25
+
26
+
27
+ new({ method: :border, type: :hash, renderer: :html }) do |value, _user_proc|
28
+ thickness = value[:thickness] || 5
29
+ type = value[:pattern] || :solid
30
+ color = if value[:color]
31
+ color_found = value[:color]
32
+ "#{color_found.red * 255},#{color_found.green * 255},#{color_found.blue * 255},#{color_found.alpha} "
33
+ else
34
+ "0,0,0,1"
35
+ end
36
+
37
+ html.style(:border, "#{type} #{thickness}px rgba(#{color})")
38
+ end
@@ -1,7 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  new({ method: :top, type: :integer, renderer: :html }) do |params|
4
- html.style(:top, "#{params}px")
4
+ # TODO: replace px with the unit specified by the user or sepcified by default by the system
5
+ params="#{params}px" unless params.instance_of?(Symbol)
6
+ html.style(:top, params)
7
+
5
8
  end
6
9
 
7
10
  new({ method: :top, type: :integer, renderer: :html, specific: :text }) do |params|
@@ -10,19 +13,25 @@ end
10
13
  new({ method: :top, type: :integer, renderer: :html, specific: :shadow })
11
14
 
12
15
  new({ method: :bottom, type: :integer, renderer: :html }) do |params|
13
- html.style(:bottom, "#{params}px")
16
+ # TODO: replace px with the unit specified by the user or sepcified by default by the system
17
+ params="#{params}px" unless params.instance_of?(Symbol)
18
+ html.style(:bottom, params)
14
19
  end
15
20
 
16
21
  new({ method: :bottom, type: :integer, renderer: :html, specific: :text }) do |params|
17
- html.style(:bottom, "#{params}px")
22
+ html.style(:bottom, params)
18
23
  end
19
24
 
20
25
  new({ method: :right, type: :integer, renderer: :html }) do |params|
21
- html.style(:right, "#{params}px")
26
+ # TODO: replace px with the unit specified by the user or sepcified by default by the system
27
+ params="#{params}px" unless params.instance_of?(Symbol)
28
+ html.style(:right, params)
22
29
  end
23
30
 
24
31
  new({ method: :left, type: :integer, renderer: :html }) do |params|
25
- html.style(:left, "#{params}px")
32
+ # TODO: replace px with the unit specified by the user or sepcified by default by the system
33
+ params="#{params}px" unless params.instance_of?(Symbol)
34
+ html.style(:left, params)
26
35
  end
27
36
 
28
37
  new({ method: :left, type: :integer, specific: :color, renderer: :html })
@@ -0,0 +1 @@
1
+ $current_hovered_element: untyped
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+
1
4
  # Chemin du dossier contenant les fichiers
2
5
  folder_path = "./*"
3
6
 
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+
4
+
5
+ b=circle
6
+ b.blur(20)
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+
4
+
5
+ c=circle
6
+ c.border({ thickness: 5, color: color(:blue), pattern: :dotted })
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ box({id: :my_box})
4
+ console(true)
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ support = box({ top: 250, left: 12, width: 300, height: 40, smooth: 9, color: { red: 0.3, green: 0.3, blue: 0.3 }, id: :support })
4
+
5
+ support.shadow({
6
+ id: :s3,
7
+ left: 3, top: 3, blur: 9,
8
+ invert: true,
9
+ red: 0, green: 0, blue: 0, alpha: 0.7
10
+ })
11
+
12
+
13
+
14
+ box({ id: :the_boxy })
15
+
16
+
17
+
18
+ support.import(true) do |content|
19
+ puts "add code here, content: #{content}"
20
+ end
21
+
22
+
23
+ importer do |val|
24
+ alert "case 21 #{val}"
25
+ end
26
+
27
+ # importer(:all) do |val|
28
+ # alert "case 21 #{val}"
29
+ # end
30
+
31
+ importer('the_boxy') do |val|
32
+ alert "yes !!! exception found : #{val}"
33
+ end
@@ -1,16 +1,29 @@
1
1
  # frozen_string_literal: true
2
- #
3
- b = box({ color: :red })
4
2
 
3
+ user_password = {global: :all_star, read: { atome: :all_star }, write: { atome: :all_star } }
4
+
5
+ human({ id: :jeezs, login: true, password: user_password, data: { birthday: '10/05/2016' },selection: [], tag: { system: true } , attach: :user_view })
6
+
7
+
8
+
9
+ b = box({ color: :red, id: :my_box })
10
+ b.connection('localhost:9292') do |params|
11
+ alert " the connection is : #{params}"
12
+ end
5
13
  b.touch(true) do
6
14
  b.connection('localhost:9292') do |params|
7
15
  alert " the connection is : #{params}"
8
16
  end
9
17
  end
10
18
 
19
+
11
20
  c = box({ color: :yellow, left: 333 })
12
21
 
13
22
  c.touch(true) do
14
- b.message('hi there!!')
23
+ b.message({message: 'cd ..;cd server;ls; pwd', action: :terminal })
24
+ b.message({message: 'capture.rb', action: :file, option: :read })
25
+ b.message({message: 'tototo.rb', action: :file, option: :write, value: :hello })
26
+ # b.message({message: 'cd ..;cd server;ls; pwd'})
15
27
  # c = box({ color: :red, left: 333 })
16
- end
28
+ end
29
+
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+
4
+ box({id: :my_box})
5
+ circle({id: :my_circle, left: 333})
6
+ box({id: :red_box, left: 666, color: :red})
7
+
8
+
9
+
10
+ shortcut(key: :b, affect: :all) do |key, object_id|
11
+ puts "Key #{key} press on #{object_id}"
12
+ end
13
+ text({data: "Key 'b' on :all", top: 0})
14
+
15
+ shortcut(key: :t, option: :meta,affect: [:my_circle, :red_box]) do |key, object_id|
16
+ puts "Key #{key} press on #{object_id}"
17
+ end
18
+ text({data: "Key 't' with Meta on [:my_circle, :red_box]", top: 30, left: 0, position: :absolute})
19
+
20
+
21
+ shortcut(key: :j, option: :ctrl, affect: :all, exclude: [:my_circle, :my_box]) do |key, object_id|
22
+ puts "Key #{key} with Ctrl press on #{object_id}"
23
+ end
24
+ text({data: "Key 'j' with Ctrl on :all but [:my_circle, :my_box]", top: 50,left: 0, position: :absolute})
25
+
@@ -138,6 +138,7 @@ cursor.drag({ restrict: {max:{ left: 309, top: 0}} }) do |event|
138
138
 
139
139
  end
140
140
 
141
+ # new({ particle: :import })
141
142
 
142
143
  support=box({top: 250, left: 12, width: 300, height: 40, smooth: 9, color:{red: 0.3, green: 0.3, blue: 0.3}, id: :support })
143
144
 
@@ -147,6 +148,8 @@ support.shadow({
147
148
  invert: true,
148
149
  red: 0, green: 0, blue: 0, alpha: 0.7
149
150
  })
151
+
152
+ # support.duplicate
150
153
  support.import(true) do |content|
151
154
  puts "add code here, content: #{content}"
152
155
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  # atome server
4
4
  require 'em/pure_ruby' if RUBY_PLATFORM == 'x64-mingw32'
5
+ require 'fileutils'
5
6
  require '../src/utilities/aui'
6
7
  require 'digest/sha2'
7
8
  require 'faye/websocket'
@@ -14,7 +15,30 @@ require 'rufus-scheduler'
14
15
  require 'securerandom'
15
16
  require 'sequel'
16
17
 
17
- Faye::WebSocket.load_adapter('puma') # Utilisez l'adaptateur 'thin' pour Faye
18
+ class EDen
19
+ def self.terminal(cmd,option,ws,value, user, pass)
20
+ `#{cmd}`
21
+ end
22
+
23
+ def self.file(source, operation,ws,value,user, pass)
24
+ file_content= File.send(operation, source, value).to_s
25
+ file_content = file_content.gsub("'", "\"")
26
+ "=> operation: #{operation}, source: #{source} , content : #{file_content},"
27
+ end
28
+ # return_message = EDen.safe_send(action_requested, message,option, current_user, user_pass)
29
+
30
+ def self.safe_send(method_name, *args)
31
+ method_sym = method_name.to_sym
32
+ eden_methods = EDen.singleton_methods(false) - Object.singleton_methods
33
+ if eden_methods.include?(method_sym)
34
+ send(method_sym, *args)
35
+ else
36
+ "forbidden action: #{method_name}"
37
+ end
38
+ end
39
+ end
40
+
41
+ Faye::WebSocket.load_adapter('puma')
18
42
 
19
43
  class String
20
44
  def is_json?
@@ -65,6 +89,7 @@ class Database
65
89
  end
66
90
 
67
91
  class App < Roda
92
+
68
93
  # comment below when test will be done
69
94
  File.delete("./eden.sqlite3") if File.exist?("./eden.sqlite3")
70
95
  eden = Database.connect_database
@@ -74,11 +99,8 @@ class App < Roda
74
99
  items.insert(name: 'abc', width: rand * 100)
75
100
  items.insert(name: 'def', width: rand * 100)
76
101
  items.insert(name: 'ghi', width: rand * 100)
77
-
78
102
  puts "Item count: #{items.count}"
79
-
80
103
  puts "The average price is: #{items.avg(:width)}"
81
-
82
104
  index_content = File.read("../src/index_server.html")
83
105
 
84
106
  opts[:root] = '../src'
@@ -87,15 +109,26 @@ class App < Roda
87
109
  r.root do
88
110
  if Faye::WebSocket.websocket?(r.env)
89
111
  ws = Faye::WebSocket.new(r.env)
90
-
91
112
  ws.on :open do |event|
92
113
  ws.send('server ready'.to_json)
93
114
  ws.send('asking for synchro data'.to_json)
94
115
  end
95
116
 
96
117
  ws.on(:message) do |event|
97
- #TODO : encode event on both client and server
98
- ws.send(event.data.reverse.to_json) # Envoie le message inversé au client
118
+ json_string = event.data.gsub(/(\w+):/) { "\"#{$1}\":" }.gsub('=>', ':')
119
+ full_data = JSON.parse(json_string)
120
+ message = full_data['message']
121
+ action_requested = full_data['action']
122
+ value= full_data['value']
123
+ option= full_data['option']
124
+ current_user = full_data['user']
125
+ user_pass = full_data['pass']['global']
126
+ if action_requested
127
+ return_message = EDen.safe_send(action_requested, message,option,ws,value, current_user, user_pass)
128
+ else
129
+ return_message = "no action msg: #{full_data}"
130
+ end
131
+ ws.send(return_message.to_json)
99
132
  end
100
133
 
101
134
  ws.on(:close) do |event|
@@ -1,7 +1,7 @@
1
1
  path = ARGV[0]
2
2
  name = ARGV[1]
3
3
 
4
- File.open( "#{path}#{name}.txt", 'w') do |f|
4
+ File.open("#{path}#{name}.txt", 'w') do |f|
5
5
  f.write("Le chemin ; #{path}!\n")
6
6
  f.write("Le nom du fichier #{name}\n")
7
7
  end
@@ -20,12 +20,12 @@
20
20
  <script type="text/javascript" src="js/third_parties/papaparse.min.js" defer></script>
21
21
  <script defer src="js/atome/atome_helpers/communication.js" type="text/javascript"></script>
22
22
  <script defer src="js/atome/atome_helpers/file.js" type="text/javascript"></script>
23
- <script>
24
- // to prevent right click
25
- document.addEventListener("contextmenu", function (e) {
26
- e.preventDefault();
27
- });
28
- </script>
23
+ <!-- <script>-->
24
+ <!-- // to prevent right click-->
25
+ <!-- document.addEventListener("contextmenu", function (e) {-->
26
+ <!-- e.preventDefault();-->
27
+ <!-- });-->
28
+ <!-- </script>-->
29
29
  <title>atome</title>
30
30
  </head>
31
31
  <body id='user_view' class='atome'>
@@ -40,6 +40,7 @@
40
40
  require '/lib/atome_relative'
41
41
  require './index'
42
42
  #puts Universe.host
43
+ atome_infos
43
44
  </script>
44
45
  <script defer src="js/atome/specific/wasm.js" type="text/javascript"></script>
45
46
  <script defer src="js/atome/atome.js" type="text/javascript"></script>
@@ -25,12 +25,12 @@
25
25
  <script src='js/atome/kernel.js' defer></script>
26
26
  <script defer src="js/atome/atome_helpers/communication.js" type="text/javascript"></script>
27
27
  <script defer src="js/atome/atome_helpers/file.js" type="text/javascript"></script>
28
- <script>
29
- // to prevent right click
30
- document.addEventListener("contextmenu", function (e) {
31
- e.preventDefault();
32
- });
33
- </script>
28
+ <!-- <script>-->
29
+ <!-- // to prevent right click-->
30
+ <!-- document.addEventListener("contextmenu", function (e) {-->
31
+ <!-- e.preventDefault();-->
32
+ <!-- });-->
33
+ <!-- </script>-->
34
34
  <title>atome</title>
35
35
  </head>
36
36
  <body id='user_view' class='atome'>
@@ -39,4 +39,9 @@
39
39
  <script defer src="js/atome/specific/opal.js" type="text/javascript"></script>
40
40
  <script defer src="js/atome/atome.js" type="text/javascript"></script>
41
41
  <script src='js/application.js' defer></script>
42
+ <script>
43
+ window.addEventListener('load', function () {
44
+ Opal.eval('atome_infos')
45
+ })
46
+ </script>
42
47
  </html>
@@ -25,12 +25,12 @@
25
25
  <script defer src='js/atome/kernel.js'></script>
26
26
  <script defer src="js/atome/atome_helpers/communication.js" type="text/javascript"></script>
27
27
  <script defer src="js/atome/atome_helpers/file.js" type="text/javascript"></script>
28
- <script>
29
- // to prevent right click
30
- document.addEventListener("contextmenu", function (e) {
31
- e.preventDefault();
32
- });
33
- </script>
28
+ <!-- <script>-->
29
+ <!-- // to prevent right click-->
30
+ <!-- document.addEventListener("contextmenu", function (e) {-->
31
+ <!-- e.preventDefault();-->
32
+ <!-- });-->
33
+ <!-- </script>-->
34
34
  <title>atome</title>
35
35
  </head>
36
36
  <body id='user_view' class='atome'>
@@ -39,5 +39,9 @@
39
39
  <script defer src="js/atome/specific/opal.js" type="text/javascript"></script>
40
40
  <script defer src="js/atome/atome.js" type="text/javascript"></script>
41
41
  <script defer src='js/application.js'></script>
42
-
42
+ <script>
43
+ window.addEventListener('load', function () {
44
+ Opal.eval('atome_infos')
45
+ })
46
+ </script>
43
47
  </html>
@@ -20,12 +20,12 @@
20
20
  <script type="text/javascript" src="js/third_parties/papaparse.min.js" defer></script>
21
21
  <script defer src="js/atome/atome_helpers/communication.js" type="text/javascript"></script>
22
22
  <script defer src="js/atome/atome_helpers/file.js" type="text/javascript"></script>
23
- <script>
24
- // to prevent right click
25
- document.addEventListener("contextmenu", function (e) {
26
- e.preventDefault();
27
- });
28
- </script>
23
+ <!-- <script>-->
24
+ <!-- // to prevent right click-->
25
+ <!-- document.addEventListener("contextmenu", function (e) {-->
26
+ <!-- e.preventDefault();-->
27
+ <!-- });-->
28
+ <!-- </script>-->
29
29
  <title>atome</title>
30
30
  </head>
31
31
  <body id='user_view' class='atome'>
@@ -40,6 +40,7 @@
40
40
  require '/lib/atome_relative'
41
41
  require './index'
42
42
  #puts Universe.host
43
+ atome_infos
43
44
  </script>
44
45
  <script defer src="js/atome/specific/wasm.js" type="text/javascript"></script>
45
46
  <script defer src="js/atome/atome.js" type="text/javascript"></script>
@@ -218,98 +218,3 @@ function fileForOpal(parent, bloc) {
218
218
  })
219
219
 
220
220
  }
221
-
222
- function importer(){
223
-
224
- // Gestionnaire pour le drag and drop de fichiers
225
- document.body.addEventListener('dragover', function(e) {
226
- e.preventDefault(); // Nécessaire pour autoriser le drop
227
- // Modifier le style si nécessaire
228
- });
229
-
230
- document.body.addEventListener('drop', function(e) {
231
- e.preventDefault();
232
- let files = e.dataTransfer.files; // Obtention de la liste des fichiers déposés
233
-
234
- if (files.length) {
235
- // Parcourir chaque fichier
236
- for (let i = 0; i < files.length; i++) {
237
- let file = files[i];
238
- let reader = new FileReader();
239
-
240
- // Lire le fichier en tant que texte
241
- reader.readAsText(file);
242
-
243
- // Événement déclenché une fois la lecture terminée
244
- reader.onload = function() {
245
- console.log('Contenu du fichier #' + (i + 1));
246
- console.log('Nom: ' + file.name);
247
- console.log('Type: ' + file.type);
248
- console.log('Taille: ' + file.size + ' octets');
249
- console.log('Contenu: \n' + reader.result); // Affichage du contenu du fichier
250
- };
251
-
252
- // Gestion des erreurs de lecture
253
- reader.onerror = function() {
254
- console.error('Erreur de lecture du fichier: ' + file.name);
255
- };
256
- }
257
- }
258
- // if (e.dataTransfer.files.length) {
259
- // alert (e.dataTransfer.files);
260
- // // Traiter les fichiers déposés
261
- // }
262
- });
263
-
264
- // Gestionnaire pour les éléments div
265
- var divs = document.querySelectorAll('.draggable-div');
266
- divs.forEach(function(div) {
267
- div.addEventListener('dragstart', function(e) {
268
- e.dataTransfer.setData('text/plain', 'some-data');
269
- e.stopPropagation(); // Empêcher la propagation au body
270
- });
271
- });
272
-
273
- }
274
-
275
- importer()
276
-
277
-
278
- function exception_import (){
279
- // Sélectionner la div spéciale par son ID
280
- var specialDiv = document.getElementById('my_box');
281
-
282
- // Gestionnaire d'événements pour la 'special-div' pour le drag over
283
- specialDiv.addEventListener('dragover', function(e) {
284
-
285
- specialDiv.style.backgroundColor= 'red';
286
- e.preventDefault(); // Prévenir le comportement par défaut
287
- e.stopPropagation(); // Arrêter la propagation de l'événement
288
- });
289
- specialDiv.addEventListener('dragleave', function(e) {
290
- specialDiv.style.backgroundColor = 'yellow'; // Réinitialiser la couleur de fond lors du drag out
291
- e.stopPropagation(); // Arrêter la propagation de l'événement
292
- });
293
- // Gestionnaire d'événements pour la 'special-div' pour le drop
294
- specialDiv.addEventListener('drop', function(e) {
295
- e.preventDefault(); // Prévenir le comportement par défaut
296
- e.stopPropagation(); // Arrêter la propagation de l'événement
297
-
298
- // Traitement spécifique pour les fichiers déposés sur la 'special-div'
299
- console.log('Fichier déposé dans la zone spéciale');
300
- });
301
-
302
- // Gestionnaire d'événements pour le body pour le drop
303
- document.body.addEventListener('drop', function(e) {
304
- e.preventDefault(); // Prévenir le comportement par défaut
305
-
306
- // Traitement pour les fichiers déposés en dehors de la 'special-div'
307
- console.log('Fichier déposé hors de la zone spéciale');
308
- });
309
-
310
-
311
- }
312
- setTimeout(function () {
313
- exception_import();
314
- console.log('ready');
315
- }, 3000);
@@ -29,7 +29,7 @@ const communication = {
29
29
 
30
30
  if (window.webkit) {
31
31
  try {
32
- window.webkit.messageHandlers.toggleMessageHandler.postMessage(json_msg);
32
+ window.webkit.messageHandlers.wkHandler.postMessage(json_msg);
33
33
  } catch (error) {
34
34
  console.log('no server, unable to post message')
35
35
  }
@@ -86,8 +86,9 @@ const communication = {
86
86
  };
87
87
 
88
88
  },
89
- ws_sender: function (address) {
90
- this.websocket.send("Hello, WebSocket! !look look")
89
+ ws_sender: function (message) {
90
+ // now we send the data to the server
91
+ this.websocket.send(message)
91
92
  },
92
93
  }
93
94
 
@@ -120,7 +121,7 @@ function connect(address) {
120
121
 
121
122
  }
122
123
 
123
- function ws_sender() {
124
- websocket.send("the Hello, WebSocket!!!")
125
- }
124
+ // function ws_sender() {
125
+ // websocket.send("the Hello, WebSocket!!!")
126
+ // }
126
127
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: atome
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.5.7.7
4
+ version: 0.5.5.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jean-Eric Godard
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-01-02 00:00:00.000000000 Z
11
+ date: 2024-01-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: eventmachine
@@ -471,6 +471,7 @@ files:
471
471
  - sig/browser_helper.rbs
472
472
  - sig/essentials.rbs
473
473
  - sig/genesis.rbs
474
+ - sig/global_variables.rbs
474
475
  - sig/matrix.rbs
475
476
  - sig/object.rbs
476
477
  - sig/universe.rbs
@@ -486,6 +487,8 @@ files:
486
487
  - vendor/assets/application/examples/attach.rb
487
488
  - vendor/assets/application/examples/attached.rb
488
489
  - vendor/assets/application/examples/basic_understanding.rb
490
+ - vendor/assets/application/examples/blur.rb
491
+ - vendor/assets/application/examples/border.rb
489
492
  - vendor/assets/application/examples/browse.rb
490
493
  - vendor/assets/application/examples/callback.rb
491
494
  - vendor/assets/application/examples/category.rb
@@ -493,6 +496,7 @@ files:
493
496
  - vendor/assets/application/examples/clones.rb
494
497
  - vendor/assets/application/examples/code.rb
495
498
  - vendor/assets/application/examples/color.rb
499
+ - vendor/assets/application/examples/console.rb
496
500
  - vendor/assets/application/examples/convert.rb
497
501
  - vendor/assets/application/examples/copy.rb
498
502
  - vendor/assets/application/examples/copybck.rb
@@ -516,6 +520,7 @@ files:
516
520
  - vendor/assets/application/examples/history.rb
517
521
  - vendor/assets/application/examples/hypertext.rb
518
522
  - vendor/assets/application/examples/image.rb
523
+ - vendor/assets/application/examples/import.rb
519
524
  - vendor/assets/application/examples/keyboard.rb
520
525
  - vendor/assets/application/examples/layout.rb
521
526
  - vendor/assets/application/examples/login.rb
@@ -544,6 +549,7 @@ files:
544
549
  - vendor/assets/application/examples/selected.rb
545
550
  - vendor/assets/application/examples/shadow.rb
546
551
  - vendor/assets/application/examples/shapes.rb
552
+ - vendor/assets/application/examples/shortcut.rb
547
553
  - vendor/assets/application/examples/smooth.rb
548
554
  - vendor/assets/application/examples/style.rb
549
555
  - vendor/assets/application/examples/sync.rb