atome 0.5.7.1.0 → 0.5.7.1.4

Sign up to get free protection for your applications and to get access to all the features.
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