atome 0.5.7.1.0 → 0.5.7.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -0
  3. data/documentation/deep learning/basic_infos.txt +1 -1
  4. data/lib/atome/extensions/atome.rb +9 -19
  5. data/lib/atome/genesis/atomes.rb +11 -0
  6. data/lib/atome/genesis/particles/property.rb +3 -1
  7. data/lib/atome/genesis/sparkle.rb +2 -1
  8. data/lib/atome/kernel/universe.rb +2 -1
  9. data/lib/atome/presets/atome.rb +5 -14
  10. data/lib/atome/version.rb +1 -1
  11. data/lib/renderers/html/hierarchy.rb +2 -2
  12. data/lib/renderers/html/html.rb +44 -17
  13. data/lib/renderers/html/identity.rb +4 -1
  14. data/lib/renderers/html/material.rb +10 -10
  15. data/lib/renderers/html/property.rb +5 -0
  16. data/lib/renderers/html/utility.rb +1 -1
  17. data/vendor/assets/application/examples/audio.rb +70 -0
  18. data/vendor/assets/application/examples/hypertext.rb +24 -3
  19. data/vendor/assets/application/examples/rotate.rb +8 -0
  20. data/vendor/assets/application/examples/test.rb +146 -572
  21. data/vendor/assets/application/examples/text_align.rb +3 -0
  22. data/vendor/assets/application/examples/tools.rb +46 -31
  23. data/vendor/assets/src/index.html +14 -6
  24. data/vendor/assets/src/index_opal.html +16 -7
  25. data/vendor/assets/src/index_server.html +20 -0
  26. data/vendor/assets/src/index_server_wasm.html +14 -6
  27. data/vendor/assets/src/index_wasm.html +20 -12
  28. data/vendor/assets/src/js/third_parties/wavesurfer.min.js +1 -0
  29. data/vendor/assets/src/js/third_parties/webaudio-pianoroll.min.js +66 -0
  30. data/vendor/assets/src/medias/images/icons/module.svg +6 -0
  31. data/vendor/assets/src/medias/images/utils/full_keyboard.svg +50 -0
  32. data/vendor/assets/src/medias/images/utils/keyboard.svg +29 -0
  33. data/vendor/assets/src/medias/images/utils/notes.svg +28 -0
  34. metadata +12 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3ac857ff76516c3e581e3204e6e1e1f9e497d1dc80575edeb0045e001e235b53
4
- data.tar.gz: a6f94e75d6ab5596d005d3f84565b25f413406ec959aae10ddaa8eaeebef7777
3
+ metadata.gz: f381b9c8d4123904b8ee97d71b0c6e1f78dc8143eb34b953670a273bd29fad10
4
+ data.tar.gz: d517e9cf6a13592fda0352bd5aa55c64ff30ffd4a0daab3776ce420c3ec0b970
5
5
  SHA512:
6
- metadata.gz: 6b6c2f0f2cdc28ef9a51ba50c0e42a5d564db451b3842b20ded678b43fcb94edf20dd63144e381269bf580c8bb521b23d7a324c6e55947319bd510dba79b4072
7
- data.tar.gz: 3de7b9612d651409b56ce4ce04a5c951739414066d904135be8311ebdf24dfc2487ac78594bd80a18b54b440d4818b62555bc56667ea3bbe5ca942641f2cce4f
6
+ metadata.gz: bd812f2209652f5f4e8b24a7d16214cedfc1e8ae5be2149d7f106393cef7f810908f61fbeb33a7854f0bbaab607e63b7d5c46c72c908e27a9cf799e27dd5380e
7
+ data.tar.gz: 77b884af5e674424861d278dcbd803f094d37600d2bf990cfbd14f041c9103e5cfbd392b772b2065485a5e54b2e146741f7f1654ae96272087d9ab9528eaeff5
data/Gemfile CHANGED
@@ -12,3 +12,4 @@ gem 'faye-websocket'
12
12
  gem "minitest", "~> 5.0"
13
13
 
14
14
  gem 'rubocop', group: 'development', require: false
15
+ gem 'rubocop', group: 'development', require: false
@@ -13,7 +13,7 @@ curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh
13
13
  brew install openssl
14
14
  cargo install tauri-cli --force
15
15
 
16
- Install Homebew
16
+ Install Homebrew
17
17
 
18
18
  /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
19
19
 
@@ -614,11 +614,6 @@ class Object
614
614
  end
615
615
 
616
616
 
617
- JS.eval(<<~JS)
618
- window.preventDefaultAction = function(e) {
619
- e.preventDefault();
620
- }
621
- JS
622
617
 
623
618
  def touch_allow(allow)
624
619
  if allow
@@ -633,26 +628,21 @@ JS
633
628
 
634
629
  def allow_copy(allow)
635
630
  if allow
636
- # Rétablir la sélection et la copie de texte
631
+ # allow selection and text copy
637
632
  JS.eval(<<~JS)
638
- document.body.style.userSelect = 'auto'; // Permet la sélection de texte
639
- document.removeEventListener('copy', preventDefaultAction); // Permet la copie
640
- JS
633
+ document.body.style.userSelect = 'auto'; // allow text slectiion
634
+ document.removeEventListener('copy', preventDefaultAction); // allow copy
635
+ JS
641
636
  else
642
- # Bloquer la sélection et la copie de texte
637
+ # lock selection and text copy
643
638
  JS.eval(<<~JS)
644
- document.body.style.userSelect = 'none'; // Bloque la sélection de texte
645
- document.addEventListener('copy', preventDefaultAction); // Bloque la copie
646
- JS
639
+ document.body.style.userSelect = 'none'; // prevent text selection
640
+ document.addEventListener('copy', preventDefaultAction); // prevent copy
641
+ JS
647
642
  end
648
643
  end
649
644
 
650
- # Définit la fonction preventDefaultAction dans un contexte global pour être utilisée par allow_copy
651
- JS.eval(<<~JS)
652
- window.preventDefaultAction = function(e) {
653
- e.preventDefault();
654
- }
655
- JS
645
+
656
646
 
657
647
 
658
648
  end
@@ -63,6 +63,17 @@ new({ atome: :raw })
63
63
  new({ atome: :shape })
64
64
  new({ atome: :code })
65
65
  new({ atome: :audio })
66
+ new({ sanitizer: :audio }) do |params|
67
+ unless params.instance_of? Hash
68
+ # TODO : we have to convert all image to png or maintain a database with extension
69
+ # FIXME : temporary patch that add .mp4 to the string if no extension is found
70
+ params = "#{params}.mp4" if params.to_s.split('.').length == 1
71
+
72
+ params = { path: "./medias/audios/#{params}" }
73
+ end
74
+ # TODO : the line below should get the value from default params Essentials
75
+ params
76
+ end
66
77
  new({ atome: :element })
67
78
  new({ sanitizer: :element }) do |params|
68
79
  default_params = { data: '' }
@@ -142,6 +142,8 @@ new({ particle: :value }) do |val|
142
142
  val
143
143
  end
144
144
 
145
- new({ particle: :behavior })
145
+ new({ particle: :behavior, type: :symbol, category: :property })
146
146
 
147
147
  new({ particle: :orientation, type: :symbol, category: :property })
148
+
149
+ new({ particle: :align , type: :symbol, category: :property })
@@ -154,7 +154,8 @@ def atome_genesis
154
154
  end
155
155
  end
156
156
 
157
- def init_database # this method is call from JS (atome/communication) at WS connection
157
+ # this method is call from JS (atome/communication) at WS connection
158
+ def init_database
158
159
  # we init the db file eDen
159
160
  A.sync({ action: :init_db, data: { database: :eDen } }) do |data|
160
161
  Universe.database_ready = data[:data][:message] == 'database_ready'
@@ -23,6 +23,7 @@ class Universe
23
23
  @allow_sync = false # temp server storage sync
24
24
  @connected = false
25
25
  @database_ready = false
26
+ @tools_root=[]
26
27
  @tools = {}
27
28
  @allow_tool_operations = false
28
29
  @active_tools = []
@@ -33,7 +34,7 @@ class Universe
33
34
  class << self
34
35
  attr_reader :atomes, :atomes_ids, :renderer_list, :molecule_list, :atome_list, :particle_list, :classes, :counter,
35
36
  :atomes_specificities
36
- attr_accessor :connected, :allow_sync, :allow_localstorage, :database_ready, :edit_mode, :tools,
37
+ attr_accessor :connected, :allow_sync, :allow_localstorage, :database_ready, :edit_mode, :tools,:tools_root,
37
38
  :allow_tool_operations, :active_tools, :atome_preset, :applicable_atomes, :default_selection_style
38
39
 
39
40
  def messages
@@ -16,13 +16,15 @@ class Atome
16
16
  # preset_params = {preset: atome_preset}
17
17
  basic_params[:type] = preset_params[:type] || :element
18
18
  # basic_params[:aid] = identity_generator(:a)
19
- basic_params[:id] = params[:id]|| identity_generator
19
+ # alert "common => #{params[:id]}"
20
+ # alert "basic_params #{basic_params[:id].class}"
21
+ basic_params[:id] = params[:id] || identity_generator
20
22
  basic_params[:renderers] = @renderers || preset_params[:renderers]
21
23
  essential_params = basic_params.merge(preset_params)
22
24
  #
23
25
  reordered_params = essential_params.reject { |key, _| params.has_key?(key) }
24
26
  params = reordered_params.merge(params)
25
- params[:id]=params[:id].to_sym
27
+ params[:id] = params[:id].to_sym
26
28
  # condition to handle color/shadow/paint atomes that shouldn't be attach to view
27
29
  if Universe.applicable_atomes.include?(atome_preset)
28
30
  unless params[:affect]
@@ -36,24 +38,13 @@ class Atome
36
38
  params[:attach] = params[:attach] || @id || :view
37
39
  end
38
40
  # we reorder the hash
39
- reorder_particles(params)
41
+ reorder_particles(params)
40
42
  end
41
43
 
42
44
  def preset_common(params, &bloc)
43
-
44
- ## if an atome with current id exist we update the ID in the params
45
- # params[:id] = "#{params[:id]}_#{Universe.atomes.length}" if grab(params[:id])
46
- # if Universe.atomes[params[:id]]
47
- # alert "atome found : #{ grab(params[:id])}"
48
- # grab(params[:id])
49
- # else
50
-
51
45
  Atome.new(params, &bloc)
52
- # end
53
46
  end
54
47
 
55
-
56
-
57
48
  # def box(params = {}, &bloc)
58
49
  # atome_preset = :box
59
50
  # params = atome_common(atome_preset, params)
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.7.1.0'
5
+ VERSION = '0.5.7.1.4'
6
6
  end
@@ -4,9 +4,10 @@ new({ renderer: :html, method: :attach, type: :string }) do |parent_found, _user
4
4
  html.append_to(parent_found)
5
5
  end
6
6
 
7
+
7
8
  new({ renderer: :html, method: :apply, type: :string }) do |parent_found, _user_proc|
8
9
 
9
- # TODO : factorise code below between text and shape, especially shadow as code is written twice and identical
10
+ # TODO : factorise code below between text and shape, especially shadow as code is written twice and identical
10
11
  case parent_found.type
11
12
  when :shadow
12
13
  shadows_to_apply = { filter: [], boxShadow: [] }
@@ -32,7 +33,6 @@ new({ renderer: :html, method: :apply, type: :string }) do |parent_found, _user_
32
33
  html.style("boxShadow", box_shadow)
33
34
  html.style("filter", drop_shadow)
34
35
  when :color
35
-
36
36
  red = parent_found.red * 255
37
37
  green = parent_found.green * 255
38
38
  blue = parent_found.blue * 255
@@ -4,8 +4,6 @@
4
4
 
5
5
  class HTML
6
6
 
7
-
8
-
9
7
  # def id
10
8
  # :poil
11
9
  # end
@@ -221,7 +219,6 @@ STRDELIM
221
219
  particles_from_style[key.to_sym] = value if key && value
222
220
  end
223
221
 
224
- # alert "hyperedit"
225
222
 
226
223
  particles_found = particles_found.merge(particles_from_style)
227
224
  current_atome = grab(@id)
@@ -378,6 +375,18 @@ STRDELIM
378
375
  self
379
376
  end
380
377
 
378
+ def audio(id)
379
+ # we remove any element if the id already exist
380
+ check_double(id)
381
+ markup_found = @original_atome.markup || :audio
382
+ @element_type = markup_found.to_s
383
+ @element = JS.global[:document].createElement(@element_type)
384
+ JS.global[:document][:body].appendChild(@element)
385
+ add_class('atome')
386
+ self.id(id)
387
+ self
388
+ end
389
+
381
390
  def www(id)
382
391
  # we remove any element if the id already exist
383
392
  check_double(id)
@@ -505,7 +514,6 @@ STRDELIM
505
514
  end
506
515
  end
507
516
 
508
-
509
517
  def transform(property, value = nil)
510
518
  transform_needed = "#{property}(#{value}deg)"
511
519
  @element[:style][:transform] = transform_needed.to_s
@@ -578,8 +586,6 @@ STRDELIM
578
586
  @element[:style][:"-webkit-backdrop-filter"] = filter_needed
579
587
  end
580
588
 
581
-
582
-
583
589
  def currentTime(time)
584
590
  @element[:currentTime] = time
585
591
  end
@@ -598,7 +604,6 @@ STRDELIM
598
604
 
599
605
  def action(_particle, action_found, option = nil)
600
606
 
601
- # alert option
602
607
  if action_found == :stop
603
608
  currentTime(option)
604
609
  @element.pause
@@ -1146,13 +1151,11 @@ STRDELIM
1146
1151
  end
1147
1152
 
1148
1153
  def touch_tap(_option)
1149
- # alert :touch_tap
1150
1154
  @element[:style][:cursor] = 'pointer'
1151
1155
  interact = JS.eval("return interact('##{@id}')")
1152
1156
  touch_tap = @original_atome.instance_variable_get('@touch_code')[:tap]
1153
1157
  # unless @touch_removed[:tap]
1154
1158
  interact.on('tap') do |native_event|
1155
- # alert 'touchy'
1156
1159
  event = Native(native_event)
1157
1160
  # we use .call instead of instance_eval because instance_eval bring the current object as context
1158
1161
  # and it's lead to a problem of context and force the use of grab(:view) when using atome method such as shape ,
@@ -1339,6 +1342,7 @@ STRDELIM
1339
1342
  # Table manipulation
1340
1343
 
1341
1344
  def table(data)
1345
+
1342
1346
  table_html = JS.global[:document].createElement('table')
1343
1347
  thead = JS.global[:document].createElement('thead')
1344
1348
 
@@ -1358,7 +1362,6 @@ STRDELIM
1358
1362
 
1359
1363
  table_html.appendChild(thead)
1360
1364
  tbody = JS.global[:document].createElement('tbody')
1361
-
1362
1365
  data.each_with_index do |row, row_index|
1363
1366
  tr = JS.global[:document].createElement('tr')
1364
1367
 
@@ -1388,6 +1391,17 @@ STRDELIM
1388
1391
  JS.global[:document].querySelector("##{@id}").appendChild(table_html)
1389
1392
  end
1390
1393
 
1394
+ # Helper function to handle Atome objects
1395
+ def handle_atome(atome, td_element)
1396
+ atome.fit(cell_height)
1397
+ html_element = JS.global[:document].getElementById(atome.id.to_s)
1398
+ td_element.appendChild(html_element)
1399
+ html_element[:style][:transformOrigin] = 'top left'
1400
+ html_element[:style][:position] = 'relative'
1401
+ atome.top(0)
1402
+ atome.left(0)
1403
+ end
1404
+
1391
1405
  def refresh_table(_params)
1392
1406
  # first we need to extact all atome from the table or they will be deleted by the table refres
1393
1407
  data = @original_atome.data
@@ -1425,18 +1439,31 @@ STRDELIM
1425
1439
  end
1426
1440
 
1427
1441
  def set_td_style(td)
1428
- cell_height = 50
1429
- td[:style][:border] = '1px solid black'
1442
+ cell_height = @original_atome.component[:height]
1443
+ cell_width = @original_atome.component[:width]
1444
+ # shadow_found = @original_atome.component[:shadow]
1445
+ # if shadow_found
1446
+ # red = shadow_found[:red] * 255
1447
+ # green = shadow_found[:green] * 255
1448
+ # blue = shadow_found[:blue] * 255
1449
+ # alpha = shadow_found[:alpha]
1450
+ # left = shadow_found[:left]
1451
+ # top = shadow_found[:top]
1452
+ # blur = shadow_found[:blur] # new correct behavior all atome's value should now be get using :value,here to resolve conflict with blur and back blur
1453
+ # inset = :inset if shadow_found[:invert]
1454
+ # shadow_created = "#{left}px #{top}px #{blur}px rgba(#{red}, #{green}, #{blue}, #{alpha}) #{inset}"
1455
+ # end
1456
+ # td[:style][:border] = '1px solid black'
1430
1457
  td[:style][:backgroundColor] = 'white'
1431
- td[:style][:boxShadow] = '10px 10px 5px #888888'
1432
- td[:style][:width] = "#{cell_height}px"
1433
- td[:style]['min-width'] = "#{cell_height}px"
1458
+ # td[:style][:boxShadow] = shadow_created
1459
+ td[:style][:width] = "#{cell_width}px"
1460
+ td[:style]['min-width'] = "#{cell_width}px"
1434
1461
  td[:style]['max-width'] = "#{cell_height}px"
1435
1462
  td[:style]['min-height'] = "#{cell_height}px"
1436
1463
  td[:style]['max-height'] = "#{cell_height}px"
1437
1464
  td[:style][:height] = "#{cell_height}px"
1438
1465
  td[:style][:overflow] = 'hidden'
1439
- { cell_height: cell_height, cell_width: cell_height }
1466
+ { cell_height: cell_height, cell_width: cell_width }
1440
1467
  end
1441
1468
 
1442
1469
  def insert_cell(params)
@@ -1625,7 +1652,7 @@ STRDELIM
1625
1652
 
1626
1653
  # atomisation!
1627
1654
  def atomized(html_object)
1628
- html_object = html_object[0] if html_object.instance_of? Array
1655
+ # html_object = html_object[0] if html_object.instance_of? Array
1629
1656
  @element = html_object
1630
1657
  end
1631
1658
 
@@ -17,6 +17,9 @@ end
17
17
  new({ method: :type, type: :string, renderer: :html, specific: :video }) do |_value, _user_proc|
18
18
  html.video(@id)
19
19
  end
20
+ new({ method: :type, type: :string, renderer: :html, specific: :audio }) do |_value, _user_proc|
21
+ html.audio(@id)
22
+ end
20
23
 
21
24
  new({ method: :type, type: :string, renderer: :html, specific: :www }) do |_value, _user_proc|
22
25
  html.www(@id)
@@ -95,7 +98,7 @@ new({ method: :data, type: :string, specific: :table, renderer: :html }) do |val
95
98
  end
96
99
 
97
100
  new({ method: :type, type: :hash, specific: :atomized, renderer: :html }) do |value, _user_proc|
98
- html.atomized(value)
101
+ html.atomized(alien)
99
102
  end
100
103
 
101
104
 
@@ -20,9 +20,11 @@ new({ method: :remove, renderer: :html, type: :string }) do |object_id_to_remove
20
20
  when :category
21
21
  html.remove_class(value)
22
22
  else
23
- atome_ids_found = send(object_id_to_remove[:all])
24
- atome_ids_found.each do |atome_id|
25
- remove(atome_id)
23
+ if object_id_to_remove[:all]
24
+ atome_ids_found = send(object_id_to_remove[:all])
25
+ atome_ids_found.each do |atome_id|
26
+ remove(atome_id)
27
+ end
26
28
  end
27
29
  end
28
30
  end
@@ -44,9 +46,7 @@ new({ method: :remove, renderer: :html, type: :string }) do |object_id_to_remove
44
46
  html.style("boxShadow", 'none')
45
47
  html.style("filter", 'none')
46
48
  @apply.delete(object_id_to_remove)
47
- # apply(@apply)
48
49
  when :border
49
- # alert :poipoipoipoipo
50
50
  html.style("border", 'none')
51
51
  html.style("filter", 'none')
52
52
  @apply.delete(object_id_to_remove)
@@ -81,20 +81,20 @@ end
81
81
  #
82
82
  # html.style(:border, "#{type} #{thickness}px rgba(#{red},#{green},#{blue},#{alpha})")
83
83
  # end
84
- new({ method: :thickness, type: :integer, renderer: :html})
84
+ new({ method: :thickness, type: :integer, renderer: :html })
85
85
 
86
86
  # end
87
- new({ method: :pattern, type: :integer, renderer: :html})
87
+ new({ method: :pattern, type: :integer, renderer: :html })
88
88
 
89
89
  new({ method: :fill, renderer: :html }) do |params|
90
90
  html.fill(params)
91
91
  end
92
92
 
93
- new({ method: :opacity, type: :integer, renderer: :html}) do |value|
93
+ new({ method: :opacity, type: :integer, renderer: :html }) do |value|
94
94
  # html.opacity(value)
95
- html.style('opacity',value)
95
+ html.style('opacity', value)
96
96
  end
97
97
 
98
98
  new({ method: :visual, type: :string, renderer: :html, specific: :text }) do |value, _user_proc|
99
- html.style('fontFamily', value)
99
+ html.style('fontFamily', value)
100
100
  end
@@ -46,3 +46,8 @@ new({ method: :inside, renderer: :html }) do |params|
46
46
  html.style("boxSizing", ' content-box')
47
47
  end
48
48
  end
49
+
50
+
51
+ new({ method: :align, renderer: :html, type: :hash }) do |params|
52
+ html.style('text-align', params)
53
+ end
@@ -167,4 +167,4 @@ new({ renderer: :html, method: :record }) do |params, user_proc|
167
167
  end
168
168
  end
169
169
 
170
- end
170
+ end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # # audio tag
4
+ a = audio({ path: 'medias/audios/clap.wav', id: :audioElement })
5
+ b=box({id: :playButton})
6
+ b.text(:audio_tag)
7
+ a.left(333)
8
+ b.touch(:down) do
9
+ a.play(true)
10
+ end
11
+
12
+
13
+ #
14
+ #
15
+ ### Web Audio
16
+ # Initialisation des variables globales
17
+ @audio_context = JS.eval('return new AudioContext()')
18
+ @audio_element = JS.global[:document].getElementById('audioElement')
19
+ @track = @audio_context.createMediaElementSource(@audio_element)
20
+
21
+ # Ajout d'un nœud de gain (volume)
22
+ @gain_node = @audio_context.createGain()
23
+ @gain_node[:gain][:value] = 0.5 # Réduit le volume à 50%
24
+ #
25
+ # # Connexion de la chaîne
26
+ @track.connect(@gain_node) # Connecte la source au nœud de gain
27
+ @gain_node.connect(@audio_context[:destination]) # Connecte le nœud de gain à la sortie
28
+
29
+ def play_audio
30
+ # Réactive l'AudioContext s'il est suspendu
31
+ @audio_context[:resume].to_s if @audio_context[:state].to_s == 'suspended'
32
+ # Joue l'audio
33
+ @audio_element.play
34
+ end
35
+ b2=box({left: 166})
36
+ b2.text(:web_audio)
37
+ b2.touch(:down) do
38
+ play_audio
39
+ end
40
+
41
+
42
+ # ######### wadjs
43
+ bb=box({left: 333})
44
+ bb.text(:wadjs)
45
+ init_code = "window.snare = new Wad({source : 'medias/audios/clap.wav'});"
46
+ JS.eval(init_code)
47
+
48
+ # Code JavaScript pour jouer le son et l'arrêter après 300 ms, dans un bloc indépendant
49
+ play_code = <<~STRDEL
50
+ window.snare.play();
51
+ setTimeout(function() {
52
+ window.snare.stop();
53
+ }, 300);
54
+ STRDEL
55
+
56
+ # Exécution du bloc indépendant pour jouer et arrêter le son
57
+ # JS.eval(play_code)
58
+ # snare=JS.eval("return new Wad({source : 'medias/audios/clap.wav'})")
59
+ # js_code=<<STRDEL
60
+ # snare = #{snare};
61
+ # snare =new Wad({source : 'medias/audios/clap.wav'})
62
+ # snare.play();
63
+ # setTimeout(() => {
64
+ # snare.stop();
65
+ # }, "300");
66
+ # STRDEL
67
+ bb.touch(:down) do
68
+ JS.eval(play_code)
69
+ end
70
+
@@ -58,7 +58,7 @@ html_desc = <<STR
58
58
  </nav>
59
59
  </header>
60
60
 
61
- <section id='title' class="section my_class" style='left: 333px;color: yellow'>
61
+ <section id='div_id' class="section my_class" style='left: 333px;color: yellow'>
62
62
  <h2>PRODUCTIONS AUDIOVISUELLES</h2>
63
63
  <!-- Contenu de la section -->
64
64
  </section>
@@ -105,8 +105,29 @@ b.hypertext(html_desc)
105
105
  # get tag content convert to data
106
106
  # get style and class convert to particle
107
107
  # end
108
- b.hyperedit(:title) do |tag_desc|
109
- puts tag_desc
108
+ b.hyperedit(:div_id) do |tag_desc|
109
+ puts tag_desc.class
110
+ end
111
+
112
+ wait 2 do
113
+ div_result = HTML.locate(id: 'div_id') # find by ID
114
+
115
+ atomized_el= atomizer({ target: div_result, id: :my_second_html_obj })
116
+ atomized_el.rotate(55)
117
+ atomized_el.color(:purple)
118
+ atomized_el.position(:absolute)
119
+ atomized_el.left(255)
120
+ atomized_el.top(255)
121
+ end
122
+
123
+
124
+ wait 3 do
125
+ # or handle the objet in pure ruby js style
126
+ div_result = HTML.locate(id: 'div_id') # find by ID
127
+ div_result[:style][:left]= "66px"
128
+ puts "the div is : #{div_result[:style][:left]}"
129
+
130
+
110
131
  end
111
132
 
112
133
  # TODO : create an html to atome converter
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+
4
+ b=box
5
+ i=b.image({path: 'medias/images/icons/hamburger.svg'})
6
+ wait 2 do
7
+ i.rotate(22)
8
+ end