atome 0.4.7.0 → 0.5.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (262) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/README.md +7 -4
  4. data/Rakefile +22 -13
  5. data/app_builder_helpers/Rakefile +63 -21
  6. data/exe/atome +91 -45
  7. data/lib/atome/atome.rb +129 -0
  8. data/lib/atome/extensions/atome.rb +41 -0
  9. data/lib/atome/{kernel/helpers → extensions}/geolocation.rb +0 -0
  10. data/lib/atome/{kernel/helpers → extensions}/ping.rb +0 -0
  11. data/lib/atome/{kernel/helpers → extensions}/sha.rb +3 -1
  12. data/lib/atome/genesis/generators/atome.rb +38 -0
  13. data/lib/atome/{renderers/headless/properties/generator.rb → genesis/generators/communication.rb} +2 -0
  14. data/lib/atome/genesis/generators/effect.rb +6 -0
  15. data/lib/atome/genesis/generators/event.rb +10 -0
  16. data/lib/atome/genesis/generators/geometry.rb +6 -0
  17. data/lib/atome/genesis/generators/identity.rb +29 -0
  18. data/lib/atome/genesis/generators/material.rb +10 -0
  19. data/lib/atome/genesis/generators/spatial.rb +13 -0
  20. data/lib/atome/genesis/generators/utility.rb +31 -0
  21. data/lib/atome/genesis/genesis.rb +46 -0
  22. data/lib/atome/genesis/sparkle.rb +58 -0
  23. data/lib/atome/helpers/callbacks.rb +12 -0
  24. data/lib/atome/helpers/color_helper/color/cmyk.rb +263 -0
  25. data/lib/atome/helpers/color_helper/color/css.rb +7 -0
  26. data/lib/atome/helpers/color_helper/color/grayscale.rb +197 -0
  27. data/lib/atome/helpers/color_helper/color/hsl.rb +240 -0
  28. data/lib/atome/helpers/color_helper/color/palette/adobecolor.rb +260 -0
  29. data/lib/atome/helpers/color_helper/color/palette/gimp.rb +104 -0
  30. data/lib/atome/helpers/color_helper/color/palette/monocontrast.rb +164 -0
  31. data/lib/atome/helpers/color_helper/color/palette.rb +4 -0
  32. data/lib/atome/helpers/color_helper/color/rgb/colors.rb +167 -0
  33. data/lib/atome/helpers/color_helper/color/rgb/contrast.rb +57 -0
  34. data/lib/atome/helpers/color_helper/color/rgb/metallic.rb +28 -0
  35. data/lib/atome/helpers/color_helper/color/rgb.rb +715 -0
  36. data/lib/atome/helpers/color_helper/color/yiq.rb +62 -0
  37. data/lib/atome/helpers/color_helper/color.rb +196 -0
  38. data/lib/atome/helpers/essentials.rb +42 -0
  39. data/lib/atome/helpers/sanitizer.rb +23 -0
  40. data/lib/atome/helpers/utilities.rb +54 -0
  41. data/lib/atome/kernel/essentials.rb +23 -0
  42. data/lib/atome/kernel/universe.rb +92 -26
  43. data/lib/atome/presets/atome.rb +88 -0
  44. data/lib/atome/processors/utilities.rb +10 -0
  45. data/lib/atome/renderers/browser/atome.rb +108 -0
  46. data/lib/atome/renderers/browser/browser.rb +225 -0
  47. data/lib/atome/renderers/browser/effect.rb +23 -0
  48. data/lib/atome/renderers/browser/event.rb +37 -0
  49. data/lib/atome/renderers/browser/geometry.rb +11 -0
  50. data/lib/atome/renderers/browser/identity.rb +24 -0
  51. data/lib/atome/renderers/browser/material.rb +43 -0
  52. data/lib/atome/renderers/{opal → browser}/opal_browser.rb +0 -2
  53. data/lib/atome/renderers/browser/spatial.rb +23 -0
  54. data/lib/atome/renderers/browser/utility.rb +39 -0
  55. data/lib/atome/renderers/headless/headless.rb +10 -0
  56. data/lib/atome/renderers/headless/utility.rb +6 -0
  57. data/lib/atome/renderers/html/atome.rb +47 -0
  58. data/lib/atome/renderers/html/effect.rb +19 -0
  59. data/lib/atome/renderers/html/event.rb +9 -0
  60. data/lib/atome/renderers/html/geometry.rb +11 -0
  61. data/lib/atome/renderers/html/html.rb +42 -0
  62. data/lib/atome/renderers/html/identity.rb +14 -0
  63. data/lib/atome/renderers/html/opal_browser.rb +6 -0
  64. data/lib/atome/renderers/html/spatial.rb +28 -0
  65. data/lib/atome/renderers/html/utility.rb +17 -0
  66. data/lib/atome/renderers/opal/atome_opal_extensions.rb +1 -1
  67. data/lib/atome/renderers/opal/extensions/atome.rb +29 -0
  68. data/lib/atome/renderers/opal/opal.rb +4 -0
  69. data/lib/atome/renderers/renderer.rb +7 -7
  70. data/lib/atome/renderers/server/server.rb +10 -0
  71. data/lib/atome/renderers/server/utility.rb +6 -0
  72. data/lib/atome/version.rb +1 -2
  73. data/lib/atome.rb +25 -44
  74. data/vendor/assets/application/index.rb +3 -1
  75. data/vendor/assets/application/required_example.rb +1 -0
  76. data/vendor/assets/{build/js/application.js → aui.rb} +0 -0
  77. data/vendor/assets/build/css/style.css +51 -0
  78. data/vendor/assets/build/index.html +7 -8
  79. data/vendor/assets/build/js/atome/atome.js +141 -68
  80. data/vendor/assets/build/medias/rubies/examples/_2_solve.rb +13 -0
  81. data/vendor/assets/build/medias/rubies/examples/{animation.rb → _animation.rb} +0 -0
  82. data/vendor/assets/build/medias/rubies/examples/{drag.rb → _drag.rb} +1 -0
  83. data/vendor/assets/build/medias/rubies/examples/atome.new.rb +13 -10
  84. data/vendor/assets/build/medias/rubies/examples/auto_height.rb +2 -0
  85. data/vendor/assets/build/medias/rubies/examples/auto_width.rb +2 -0
  86. data/vendor/assets/build/medias/rubies/examples/blur.rb +4 -0
  87. data/vendor/assets/build/medias/rubies/examples/bottom.rb +3 -1
  88. data/vendor/assets/build/medias/rubies/examples/box.rb +12 -8
  89. data/vendor/assets/build/medias/rubies/examples/circle.rb +2 -0
  90. data/vendor/assets/build/medias/rubies/examples/clear.rb +2 -1
  91. data/vendor/assets/build/medias/rubies/examples/code.rb +10 -4
  92. data/vendor/assets/build/medias/rubies/examples/color.rb +47 -8
  93. data/vendor/assets/build/medias/rubies/examples/create_atome_in_atome.rb +2 -0
  94. data/vendor/assets/build/medias/rubies/examples/delete.rb +7 -0
  95. data/vendor/assets/build/medias/rubies/examples/element.rb +6 -0
  96. data/vendor/assets/build/medias/rubies/examples/fullscreen.rb +15 -0
  97. data/vendor/assets/build/medias/rubies/examples/get_renderer_list.rb +3 -1
  98. data/vendor/assets/build/medias/rubies/examples/grab.rb +2 -0
  99. data/vendor/assets/build/medias/rubies/examples/height.rb +7 -2
  100. data/vendor/assets/build/medias/rubies/examples/id.rb +14 -0
  101. data/vendor/assets/build/medias/rubies/examples/image.rb +6 -2
  102. data/vendor/assets/build/medias/rubies/examples/left.rb +7 -2
  103. data/vendor/assets/build/medias/rubies/examples/link.rb +12 -3
  104. data/vendor/assets/build/medias/rubies/examples/monitoring.rb +33 -0
  105. data/vendor/assets/build/medias/rubies/examples/on.rb +11 -7
  106. data/vendor/assets/build/medias/rubies/examples/parent.rb +7 -5
  107. data/vendor/assets/build/medias/rubies/examples/read.rb +6 -2
  108. data/vendor/assets/build/medias/rubies/examples/refresh.rb +8 -0
  109. data/vendor/assets/build/medias/rubies/examples/repeat.rb +2 -0
  110. data/vendor/assets/build/medias/rubies/examples/right.rb +3 -1
  111. data/vendor/assets/build/medias/rubies/examples/rotate.rb +2 -0
  112. data/vendor/assets/build/medias/rubies/examples/schedule.rb +8 -11
  113. data/vendor/assets/build/medias/rubies/examples/shadow.rb +30 -0
  114. data/vendor/assets/build/medias/rubies/examples/smooth.rb +2 -0
  115. data/vendor/assets/build/medias/rubies/examples/text.rb +21 -7
  116. data/vendor/assets/build/medias/rubies/examples/top.rb +3 -0
  117. data/vendor/assets/build/medias/rubies/examples/touch.rb +7 -0
  118. data/vendor/assets/build/medias/rubies/examples/video.rb +32 -23
  119. data/vendor/assets/build/medias/rubies/examples/wait.rb +8 -3
  120. data/vendor/assets/build/medias/rubies/examples/web.rb +7 -4
  121. data/vendor/assets/build/medias/rubies/examples/width.rb +6 -2
  122. data/vendor/assets/server/atome_server.rb +3 -5
  123. metadata +76 -164
  124. data/lib/atome/atome_native_extensions.rb +0 -5
  125. data/lib/atome/extensions/helper.rb +0 -112
  126. data/lib/atome/kernel/atome.rb +0 -99
  127. data/lib/atome/kernel/generators/generator.rb +0 -517
  128. data/lib/atome/kernel/generators/genesis.rb +0 -277
  129. data/lib/atome/kernel/generators/sanitizer.rb +0 -73
  130. data/lib/atome/kernel/generators/shapes.rb +0 -55
  131. data/lib/atome/kernel/helpers/internal_methods.rb +0 -173
  132. data/lib/atome/kernel/helpers/utilities.rb +0 -39
  133. data/lib/atome/kernel/properties/essential.rb +0 -77
  134. data/lib/atome/kernel/sparkle.rb +0 -38
  135. data/lib/atome/renderers/opal/properties/generator.rb +0 -1
  136. data/lib/atome/renderers/server/properties/generator.rb +0 -9
  137. data/vendor/assets/build/medias/audios/guitar.wav +0 -0
  138. data/vendor/assets/build/medias/images/beach.jpg +0 -0
  139. data/vendor/assets/build/medias/rubies/examples/Old_examples/!demos.rb +0 -111
  140. data/vendor/assets/build/medias/rubies/examples/Old_examples/action.rb +0 -12
  141. data/vendor/assets/build/medias/rubies/examples/Old_examples/add.rb +0 -26
  142. data/vendor/assets/build/medias/rubies/examples/Old_examples/alignment.rb +0 -27
  143. data/vendor/assets/build/medias/rubies/examples/Old_examples/animation.rb +0 -92
  144. data/vendor/assets/build/medias/rubies/examples/Old_examples/atome_as_property.rb +0 -20
  145. data/vendor/assets/build/medias/rubies/examples/Old_examples/atome_list.rb +0 -4
  146. data/vendor/assets/build/medias/rubies/examples/Old_examples/atomiser.rb +0 -17
  147. data/vendor/assets/build/medias/rubies/examples/Old_examples/attach_extract.rb +0 -13
  148. data/vendor/assets/build/medias/rubies/examples/Old_examples/authorisation.rb +0 -22
  149. data/vendor/assets/build/medias/rubies/examples/Old_examples/batch.rb +0 -6
  150. data/vendor/assets/build/medias/rubies/examples/Old_examples/blend.rb +0 -15
  151. data/vendor/assets/build/medias/rubies/examples/Old_examples/blur.rb +0 -9
  152. data/vendor/assets/build/medias/rubies/examples/Old_examples/border.rb +0 -9
  153. data/vendor/assets/build/medias/rubies/examples/Old_examples/calendar.rb +0 -5
  154. data/vendor/assets/build/medias/rubies/examples/Old_examples/capture.rb +0 -57
  155. data/vendor/assets/build/medias/rubies/examples/Old_examples/center.rb +0 -21
  156. data/vendor/assets/build/medias/rubies/examples/Old_examples/child.rb +0 -18
  157. data/vendor/assets/build/medias/rubies/examples/Old_examples/clear.rb +0 -21
  158. data/vendor/assets/build/medias/rubies/examples/Old_examples/clip.rb +0 -11
  159. data/vendor/assets/build/medias/rubies/examples/Old_examples/code.rb +0 -7
  160. data/vendor/assets/build/medias/rubies/examples/Old_examples/code_editor.rb +0 -26
  161. data/vendor/assets/build/medias/rubies/examples/Old_examples/collaborate.rb +0 -115
  162. data/vendor/assets/build/medias/rubies/examples/Old_examples/convert_to_px.rb +0 -14
  163. data/vendor/assets/build/medias/rubies/examples/Old_examples/copy_paste.rb +0 -35
  164. data/vendor/assets/build/medias/rubies/examples/Old_examples/current_code.rb +0 -14
  165. data/vendor/assets/build/medias/rubies/examples/Old_examples/cursor.rb +0 -3
  166. data/vendor/assets/build/medias/rubies/examples/Old_examples/data.rb +0 -11
  167. data/vendor/assets/build/medias/rubies/examples/Old_examples/database.rb +0 -29
  168. data/vendor/assets/build/medias/rubies/examples/Old_examples/delete.rb +0 -12
  169. data/vendor/assets/build/medias/rubies/examples/Old_examples/display.rb +0 -19
  170. data/vendor/assets/build/medias/rubies/examples/Old_examples/disposition.rb +0 -10
  171. data/vendor/assets/build/medias/rubies/examples/Old_examples/double_and_long_touch.rb +0 -23
  172. data/vendor/assets/build/medias/rubies/examples/Old_examples/drag.rb +0 -61
  173. data/vendor/assets/build/medias/rubies/examples/Old_examples/drag_and_drop_import.rb +0 -1
  174. data/vendor/assets/build/medias/rubies/examples/Old_examples/drop.rb +0 -23
  175. data/vendor/assets/build/medias/rubies/examples/Old_examples/duplicate.rb +0 -11
  176. data/vendor/assets/build/medias/rubies/examples/Old_examples/edit.rb +0 -6
  177. data/vendor/assets/build/medias/rubies/examples/Old_examples/eval.rb +0 -9
  178. data/vendor/assets/build/medias/rubies/examples/Old_examples/extract_detach.rb +0 -23
  179. data/vendor/assets/build/medias/rubies/examples/Old_examples/fill.rb +0 -10
  180. data/vendor/assets/build/medias/rubies/examples/Old_examples/find.rb +0 -37
  181. data/vendor/assets/build/medias/rubies/examples/Old_examples/fit.rb +0 -44
  182. data/vendor/assets/build/medias/rubies/examples/Old_examples/fullscreen.rb +0 -28
  183. data/vendor/assets/build/medias/rubies/examples/Old_examples/generate.rb +0 -7
  184. data/vendor/assets/build/medias/rubies/examples/Old_examples/gradient.rb +0 -24
  185. data/vendor/assets/build/medias/rubies/examples/Old_examples/group.rb +0 -21
  186. data/vendor/assets/build/medias/rubies/examples/Old_examples/helper.rb +0 -64
  187. data/vendor/assets/build/medias/rubies/examples/Old_examples/history.rb +0 -7
  188. data/vendor/assets/build/medias/rubies/examples/Old_examples/hue.rb +0 -10
  189. data/vendor/assets/build/medias/rubies/examples/Old_examples/input_text.rb +0 -54
  190. data/vendor/assets/build/medias/rubies/examples/Old_examples/insert_attach.rb +0 -13
  191. data/vendor/assets/build/medias/rubies/examples/Old_examples/internationalisation.rb +0 -10
  192. data/vendor/assets/build/medias/rubies/examples/Old_examples/key.rb +0 -19
  193. data/vendor/assets/build/medias/rubies/examples/Old_examples/keyboard_shortcut.rb +0 -69
  194. data/vendor/assets/build/medias/rubies/examples/Old_examples/list_methods.rb +0 -4
  195. data/vendor/assets/build/medias/rubies/examples/Old_examples/list_types.rb +0 -4
  196. data/vendor/assets/build/medias/rubies/examples/Old_examples/listen.rb +0 -47
  197. data/vendor/assets/build/medias/rubies/examples/Old_examples/mail.rb +0 -9
  198. data/vendor/assets/build/medias/rubies/examples/Old_examples/map.rb +0 -6
  199. data/vendor/assets/build/medias/rubies/examples/Old_examples/mask.rb +0 -15
  200. data/vendor/assets/build/medias/rubies/examples/Old_examples/media_recorder.rb +0 -24
  201. data/vendor/assets/build/medias/rubies/examples/Old_examples/media_streaming.rb +0 -41
  202. data/vendor/assets/build/medias/rubies/examples/Old_examples/meteo.rb +0 -41
  203. data/vendor/assets/build/medias/rubies/examples/Old_examples/methods_chaining.rb +0 -8
  204. data/vendor/assets/build/medias/rubies/examples/Old_examples/midi.rb +0 -37
  205. data/vendor/assets/build/medias/rubies/examples/Old_examples/monitoring.rb +0 -47
  206. data/vendor/assets/build/medias/rubies/examples/Old_examples/mulitrendering.rb +0 -7
  207. data/vendor/assets/build/medias/rubies/examples/Old_examples/noise_gradient_texture.rb +0 -26
  208. data/vendor/assets/build/medias/rubies/examples/Old_examples/notification.rb +0 -9
  209. data/vendor/assets/build/medias/rubies/examples/Old_examples/object_in_object.rb +0 -13
  210. data/vendor/assets/build/medias/rubies/examples/Old_examples/on_resize.rb +0 -12
  211. data/vendor/assets/build/medias/rubies/examples/Old_examples/over.rb +0 -15
  212. data/vendor/assets/build/medias/rubies/examples/Old_examples/overflow.rb +0 -22
  213. data/vendor/assets/build/medias/rubies/examples/Old_examples/parameter.rb +0 -14
  214. data/vendor/assets/build/medias/rubies/examples/Old_examples/parent.rb +0 -19
  215. data/vendor/assets/build/medias/rubies/examples/Old_examples/particle.rb +0 -15
  216. data/vendor/assets/build/medias/rubies/examples/Old_examples/pay.rb +0 -7
  217. data/vendor/assets/build/medias/rubies/examples/Old_examples/ping.rb +0 -7
  218. data/vendor/assets/build/medias/rubies/examples/Old_examples/play.rb +0 -24
  219. data/vendor/assets/build/medias/rubies/examples/Old_examples/play_audio.rb +0 -6
  220. data/vendor/assets/build/medias/rubies/examples/Old_examples/position.rb +0 -7
  221. data/vendor/assets/build/medias/rubies/examples/Old_examples/read_file.rb +0 -9
  222. data/vendor/assets/build/medias/rubies/examples/Old_examples/reboot.rb +0 -15
  223. data/vendor/assets/build/medias/rubies/examples/Old_examples/refresh.rb +0 -17
  224. data/vendor/assets/build/medias/rubies/examples/Old_examples/remote_server.rb +0 -31
  225. data/vendor/assets/build/medias/rubies/examples/Old_examples/render.rb +0 -17
  226. data/vendor/assets/build/medias/rubies/examples/Old_examples/repeat.rb +0 -19
  227. data/vendor/assets/build/medias/rubies/examples/Old_examples/require_remote.rb +0 -3
  228. data/vendor/assets/build/medias/rubies/examples/Old_examples/restore_atome.rb +0 -11
  229. data/vendor/assets/build/medias/rubies/examples/Old_examples/resurect.rb +0 -30
  230. data/vendor/assets/build/medias/rubies/examples/Old_examples/ruby_version.rb +0 -1
  231. data/vendor/assets/build/medias/rubies/examples/Old_examples/say.rb +0 -3
  232. data/vendor/assets/build/medias/rubies/examples/Old_examples/scale.rb +0 -41
  233. data/vendor/assets/build/medias/rubies/examples/Old_examples/schedule.rb +0 -39
  234. data/vendor/assets/build/medias/rubies/examples/Old_examples/scroll.rb +0 -9
  235. data/vendor/assets/build/medias/rubies/examples/Old_examples/select.rb +0 -32
  236. data/vendor/assets/build/medias/rubies/examples/Old_examples/selector.rb +0 -6
  237. data/vendor/assets/build/medias/rubies/examples/Old_examples/shadow.rb +0 -30
  238. data/vendor/assets/build/medias/rubies/examples/Old_examples/shape_with_path.rb +0 -7
  239. data/vendor/assets/build/medias/rubies/examples/Old_examples/size.rb +0 -109
  240. data/vendor/assets/build/medias/rubies/examples/Old_examples/smooth.rb +0 -5
  241. data/vendor/assets/build/medias/rubies/examples/Old_examples/speech_renderer.rb +0 -5
  242. data/vendor/assets/build/medias/rubies/examples/Old_examples/synth.rb +0 -6
  243. data/vendor/assets/build/medias/rubies/examples/Old_examples/system.rb +0 -3
  244. data/vendor/assets/build/medias/rubies/examples/Old_examples/tags.rb +0 -18
  245. data/vendor/assets/build/medias/rubies/examples/Old_examples/text.rb +0 -33
  246. data/vendor/assets/build/medias/rubies/examples/Old_examples/text_selection.rb +0 -33
  247. data/vendor/assets/build/medias/rubies/examples/Old_examples/text_to_midi.rb +0 -22
  248. data/vendor/assets/build/medias/rubies/examples/Old_examples/touch.rb +0 -23
  249. data/vendor/assets/build/medias/rubies/examples/Old_examples/touch_stop_propagation.rb +0 -27
  250. data/vendor/assets/build/medias/rubies/examples/Old_examples/treat_object_in_object.rb +0 -26
  251. data/vendor/assets/build/medias/rubies/examples/Old_examples/type_mutations.rb +0 -27
  252. data/vendor/assets/build/medias/rubies/examples/Old_examples/video_callback.rb +0 -46
  253. data/vendor/assets/build/medias/rubies/examples/Old_examples/view_mode.rb +0 -29
  254. data/vendor/assets/build/medias/rubies/examples/Old_examples/virtual_events.rb +0 -17
  255. data/vendor/assets/build/medias/rubies/examples/Old_examples/visual.rb +0 -23
  256. data/vendor/assets/build/medias/rubies/examples/Old_examples/vr_display.rb +0 -5
  257. data/vendor/assets/build/medias/rubies/examples/Old_examples/wait.rb +0 -21
  258. data/vendor/assets/build/medias/rubies/examples/Old_examples/web.rb +0 -10
  259. data/vendor/assets/build/medias/rubies/examples/Old_examples/web_address_bar.rb +0 -14
  260. data/vendor/assets/build/medias/rubies/examples/Old_examples/websocket.rb +0 -16
  261. data/vendor/assets/build/medias/rubies/examples/Old_examples/webstate.rb +0 -10
  262. data/vendor/assets/build/medias/videos/lion_king.mp4 +0 -0
@@ -0,0 +1,108 @@
1
+ # frozen_string_literal: true
2
+
3
+ # TODO : remove the DOM const and the parents methods there's just there to satisfy Rubocop
4
+ # start dummy code
5
+ DOM = :nil
6
+
7
+ def parents(_val) end
8
+
9
+ # end dummy code
10
+
11
+ generator = Genesis.generator
12
+
13
+ generator.build_render_method(:browser_shape) do
14
+ @browser_type = :div
15
+ id_found = @atome[:id]
16
+ DOM do
17
+ div(id: id_found).atome
18
+ end.append_to(BrowserHelper.browser_document[:user_view])
19
+ @browser_object = BrowserHelper.browser_document[id_found]
20
+ # Render particles below
21
+ # collapse
22
+ end
23
+
24
+ generator.build_render_method(:browser_color) do |_value|
25
+ @browser_type = :style
26
+ id_found = @atome[:id]
27
+ type_found = @atome[:type]
28
+ # we remove previous unused style tag
29
+ BrowserHelper.browser_document[id]&.remove
30
+ red_found = @atome[:red]
31
+ blue_found = @atome[:blue]
32
+ green_found = @atome[:green]
33
+ alpha_found = @atome[:alpha]
34
+ BrowserHelper.browser_document.head << Browser.DOM("<style atome='#{type_found}'
35
+ id='#{id_found}'>.#{id_found}{background-color: rgba(#{red_found * 255},
36
+ #{green_found * 255},#{blue_found * 255},#{alpha_found})}</style>")
37
+ # TODO/ use the code below to modify the style tag
38
+ @browser_object = BrowserHelper.browser_document[id_found]
39
+ # now we just have to attach the color atome
40
+ # parents(@atome[:parents])
41
+ # children(@atome[:children])
42
+ # collapse
43
+ end
44
+
45
+ generator.build_render_method(:browser_shadow) do |_value|
46
+ @browser_type = :style
47
+ id_found = @atome[:id]
48
+ type_found = @atome[:type]
49
+ # we remove previous unused style tag
50
+ BrowserHelper.browser_document[id]&.remove
51
+ red_found = @atome[:red]
52
+ blue_found = @atome[:blue]
53
+ green_found = @atome[:green]
54
+ alpha_found = @atome[:alpha]
55
+ blur = @atome[:blur]
56
+ left = @atome[:left]
57
+ top = @atome[:top]
58
+ inset = @atome[:direction]
59
+
60
+ BrowserHelper.browser_document.head << Browser.DOM("<style atome='#{type_found}'
61
+ id='#{id_found}'>.#{id_found}{box-shadow: #{left}px #{top}px #{blur}px #{inset} rgba(#{red_found * 255},
62
+ #{green_found * 255},#{blue_found * 255},#{alpha_found})}</style>")
63
+ # TODO/ use the code below to modify the style tag
64
+ @browser_object = BrowserHelper.browser_document[id_found]
65
+ end
66
+
67
+ generator.build_render_method(:browser_image) do |_user_prc|
68
+ @browser_type = :div
69
+ id_found = @atome[:id]
70
+ DOM do
71
+ img({ id: id_found }).atome
72
+ end.append_to(BrowserHelper.browser_document[:user_view])
73
+ @browser_object = BrowserHelper.browser_document[id_found]
74
+ # Render particles below
75
+ # collapse
76
+ end
77
+
78
+ generator.build_render_method(:browser_text) do |_value, _user_proc|
79
+ id_found = @atome[:id]
80
+ DOM do
81
+ div(id: id_found).atome.text
82
+ end.append_to(BrowserHelper.browser_document[:user_view])
83
+ @browser_object = BrowserHelper.browser_document[id_found]
84
+ @browser_type = :div
85
+ # Render particles below
86
+ # collapse
87
+ end
88
+
89
+ generator.build_render_method(:browser_web) do
90
+ @browser_type = :web
91
+ id_found = @atome[:id]
92
+ DOM do
93
+ iframe({ id: id_found }).atome
94
+ end.append_to(BrowserHelper.browser_document[:user_view])
95
+ @browser_object = BrowserHelper.browser_document[id_found]
96
+ @browser_object.attributes[:allow] = 'accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture'
97
+ @browser_object.attributes[:allowfullscreen] = true
98
+ @html_type = :web
99
+ end
100
+
101
+ generator.build_render_method(:browser_video) do |_value, _user_proc|
102
+ @browser_type = :div
103
+ id_found = @atome[:id]
104
+ DOM do
105
+ video({ id: id_found, autoplay: false, loop: false, muted: true }).atome
106
+ end.append_to(BrowserHelper.browser_document[:user_view])
107
+ @browser_object = BrowserHelper.browser_document[id_found]
108
+ end
@@ -0,0 +1,225 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'atome/renderers/browser/effect'
4
+ require 'atome/renderers/browser/event'
5
+ require 'atome/renderers/browser/geometry'
6
+ require 'atome/renderers/browser/identity'
7
+ require 'atome/renderers/browser/material'
8
+ require 'atome/renderers/browser/spatial'
9
+ require 'atome/renderers/browser/atome'
10
+ require 'atome/renderers/browser/utility'
11
+
12
+ class Atome
13
+ attr_accessor :browser_object
14
+ end
15
+
16
+ # for opal rendering
17
+ module BrowserHelper
18
+ def self.browser_document
19
+ # Work because of the patched version of opal-browser(0.39)
20
+ Browser.window
21
+ end
22
+
23
+ def self.browser_attach_div(parents, html_object, _atome)
24
+ html_object.append_to(browser_document[parents])
25
+ end
26
+
27
+ def self.browser_attach_web(parents, html_object, _atome)
28
+ html_object.append_to(browser_document[parents])
29
+ end
30
+
31
+ def self.browser_attach_style(parents, _html_object, atome)
32
+ browser_document[parents].add_class(atome[:id])
33
+ end
34
+
35
+ def self.browser_blur_style(_browser_object, value, atome)
36
+ b_left = "#{atome[:left]}px"
37
+ b_top = "#{atome[:top]}px"
38
+ b_blur = "#{atome[:blur] = value}px"
39
+ b_red = atome[:red] * 255
40
+ b_green = atome[:green] * 255
41
+ b_blue = (atome[:blue]) * 255
42
+ b_direction = atome[:direction]
43
+ b_alpha = atome[:alpha]
44
+
45
+ shadow_updated = "#{b_left} #{b_top} #{b_blur} rgba(#{b_red}, #{b_green}, #{b_blue}, #{b_alpha}) #{b_direction}"
46
+ `document.getElementById(#{atome[:id]}).sheet.cssRules[0].style.boxShadow = #{shadow_updated}`
47
+ end
48
+
49
+ def self.browser_blur_div(browser_object, value, _atome)
50
+ browser_object.style[:filter] = "blur(#{value}px)"
51
+ end
52
+
53
+ def self.browser_colorize_color(color_updated, atome)
54
+ `document.getElementById(#{atome[:id]}).sheet.cssRules[0].style.backgroundColor = #{color_updated}`
55
+ end
56
+
57
+ def self.browser_colorize_shadow(color_updated, atome)
58
+ left = atome[:left]
59
+ top = atome[:top]
60
+ blur = atome[:blur]
61
+ direction = atome[:direction]
62
+ shadow_updated = "#{left}px #{top}px #{blur}px #{color_updated} #{direction}"
63
+ `document.getElementById(#{atome[:id]}).sheet.cssRules[0].style.boxShadow = #{shadow_updated}`
64
+ end
65
+
66
+ def self.browser_left_shape(value, browser_object, _atome)
67
+ browser_object.style[:left] = "#{value}px"
68
+ end
69
+
70
+ def self.browser_right_shape(value, browser_object, _atome)
71
+ browser_object.style[:right] = "#{value}px"
72
+ end
73
+
74
+ def self.browser_top_shape(value, browser_object, _atome)
75
+ browser_object.style[:top] = "#{value}px"
76
+ end
77
+
78
+ def self.browser_bottom_shape(value, browser_object, _atome)
79
+ browser_object.style[:bottom] = "#{value}px"
80
+ end
81
+
82
+ # image
83
+ def self.browser_left_image(value, browser_object, _atome)
84
+ browser_object.style[:left] = "#{value}px"
85
+ end
86
+
87
+ def self.browser_right_image(value, browser_object, _atome)
88
+ browser_object.style[:right] = "#{value}px"
89
+ end
90
+
91
+ def self.browser_top_image(value, browser_object, _atome)
92
+ browser_object.style[:top] = "#{value}px"
93
+ end
94
+
95
+ def self.browser_bottom_image(value, browser_object, _atome)
96
+ browser_object.style[:bottom] = "#{value}px"
97
+ end
98
+
99
+ def self.browser_path_image(value, browser_object, _atome)
100
+ browser_object[:src] = value
101
+ end
102
+
103
+ # shadow
104
+ def self.browser_left_shadow(value, _browser_object, atome)
105
+ ls_left = "#{atome[:left] = value}px"
106
+ ls_top = "#{atome[:top]}px"
107
+ ls_blur = "#{atome[:blur]}px"
108
+ red = atome[:red] * 255
109
+ green = atome[:green] * 255
110
+ blue = (atome[:blue]) * 255
111
+ direction = atome[:direction]
112
+ alpha = atome[:alpha]
113
+
114
+ shadow_updated = "#{ls_left} #{ls_top} #{ls_blur} rgba(#{red}, #{green}, #{blue}, #{alpha}) #{direction}"
115
+ `document.getElementById(#{atome[:id]}).sheet.cssRules[0].style.boxShadow = #{shadow_updated}`
116
+ end
117
+
118
+ def self.browser_top_shadow(value, _browser_object, atome)
119
+ rs_left = "#{atome[:left]}px"
120
+ rs_top = "#{atome[:top] = value}px"
121
+ rs_blur = "#{atome[:blur]}px"
122
+ red = atome[:red] * 255
123
+ green = atome[:green] * 255
124
+ blue = (atome[:blue]) * 255
125
+ direction = atome[:direction]
126
+ alpha = atome[:alpha]
127
+
128
+ shadow_updated = "#{rs_left}px #{rs_top}px #{rs_blur}px rgba(#{red}, #{green}, #{blue}, #{alpha}) #{direction}"
129
+ `document.getElementById(#{atome[:id]}).sheet.cssRules[0].style.boxShadow = #{shadow_updated}`
130
+ end
131
+
132
+ def self.browser_left_color(_value, _browser_object, _atome)
133
+ puts 'code to write when implementing gradient'
134
+ end
135
+
136
+ def self.browser_right_color(_value, _browser_object, _atome)
137
+ puts 'code to write when implementing gradient'
138
+ end
139
+
140
+ def self.browser_top_color(_value, _browser_object, _atome)
141
+ puts 'code to write when implementing gradient'
142
+ end
143
+
144
+ def self.browser_bottom_color(_value, _browser_object, _atome)
145
+ puts 'code to write when implementing gradient'
146
+ end
147
+
148
+ # text
149
+ def self.browser_left_text(value, browser_object, _atome)
150
+ browser_object.style[:left] = "#{value}px"
151
+ end
152
+
153
+ def self.browser_right_text(value, browser_object, _atome)
154
+ browser_object.style[:right] = "#{value}px"
155
+ end
156
+
157
+ def self.browser_top_text(value, browser_object, _atome)
158
+ browser_object.style[:top] = "#{value}px"
159
+ end
160
+
161
+ def self.browser_bottom_text(value, browser_object, _atome)
162
+ browser_object.style[:bottom] = "#{value}px"
163
+ end
164
+
165
+ def self.browser_data_text(value)
166
+ browser_object.text = value
167
+ end
168
+
169
+ # web
170
+ def self.browser_left_web(value, browser_object, _atome)
171
+ browser_object.style[:left] = "#{value}px"
172
+ end
173
+
174
+ def self.browser_right_web(value, browser_object, _atome)
175
+ browser_object.style[:right] = "#{value}px"
176
+ end
177
+
178
+ def self.browser_top_web(value, browser_object, _atome)
179
+ browser_object.style[:top] = "#{value}px"
180
+ end
181
+
182
+ def self.browser_bottom_web(value, browser_object, _atome)
183
+ browser_object.style[:bottom] = "#{value}px"
184
+ end
185
+
186
+ def self.browser_path_web(value, browser_object, _atome)
187
+ browser_object[:src] = value
188
+ end
189
+
190
+ # video
191
+ def self.browser_left_video(value, browser_object, _atome)
192
+ browser_object.style[:left] = "#{value}px"
193
+ end
194
+
195
+ def self.browser_right_videob(value, browser_object, _atome)
196
+ browser_object.style[:right] = "#{value}px"
197
+ end
198
+
199
+ def self.browser_top_video(value, browser_object, _atome)
200
+ browser_object.style[:top] = "#{value}px"
201
+ end
202
+
203
+ def self.browser_bottom_video(value, browser_object, _atome)
204
+ browser_object.style[:bottom] = "#{value}px"
205
+ end
206
+
207
+ def self.browser_path_video(value, browser_object, _atome)
208
+ browser_object[:src] = value
209
+ end
210
+
211
+ def self.browser_play_video(_value, browser_object_found, atome_found, atome_object, proc)
212
+ browser_object_found.play
213
+ # TODO : change timeupdate for when possible requestVideoFrameCallback
214
+ # (opal-browser/opal/browser/event.rb line 36)
215
+ video_callback = atome_found[:code] # this is the video callback not the play callback
216
+ play_callback = proc # this is the video callback not the play callback
217
+ browser_object_found.on(:timeupdate) do |e|
218
+ e.prevent # Prevent the default action (eg. form submission)
219
+ # You can also use `e.stop` to stop propagating the event to other handlers.
220
+ current_time = browser_object_found.currentTime
221
+ atome_object.instance_exec(current_time, &video_callback) if video_callback.is_a?(Proc)
222
+ atome_object.instance_exec(current_time, &play_callback) if play_callback.is_a?(Proc)
223
+ end
224
+ end
225
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ generator = Genesis.generator
4
+
5
+ generator.build_render_method(:browser_smooth) do |value|
6
+ format_params = case value
7
+ when Array
8
+ properties = []
9
+ value.each do |param|
10
+ properties << "#{param}px"
11
+ end
12
+ properties.join(' ').to_s
13
+ when Integer
14
+ "#{value}px"
15
+ else
16
+ value
17
+ end
18
+ @browser_object.style['border-radius'] = format_params
19
+ end
20
+
21
+ generator.build_render_method(:browser_blur) do |value|
22
+ BrowserHelper.send("browser_blur_#{@browser_type}", @browser_object, value, @atome)
23
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ generator = Genesis.generator
4
+
5
+ generator.build_render_method(:browser_touch) do |_value, proc|
6
+ @browser_object.on :click do |e|
7
+ instance_exec(e, &proc) if proc.is_a?(Proc)
8
+ end
9
+ end
10
+
11
+ generator.build_render_method(:browser_play) do |value, proc|
12
+ BrowserHelper.send("browser_play_#{@atome[:type]}", value, @browser_object, @atome, self, proc)
13
+ end
14
+
15
+ generator.build_render_method(:browser_time) do |value = nil, _proc|
16
+ if value
17
+ @browser_object.currentTime = value
18
+ else
19
+ @browser_object.currentTime
20
+ end
21
+ end
22
+
23
+ generator.build_render_method(:browser_pause) do |_value, proc|
24
+ instance_exec(@browser_object.currentTime, &proc) if proc.is_a?(Proc)
25
+ @browser_object.pause
26
+ end
27
+
28
+ generator.build_render_method(:on) do |value, proc|
29
+ @browser_object.on(value) do |e|
30
+ instance_exec(e, &proc) if proc.is_a?(Proc)
31
+ end
32
+ end
33
+
34
+ generator.build_render_method(:fullscreen) do |value, proc|
35
+ atome_id=atome[:id]
36
+ `atome.js_Fullscreen(#{atome_id})`
37
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ generator = Genesis.generator
4
+
5
+ generator.build_render_method(:browser_width) do |value|
6
+ @browser_object.style[:width] = "#{value}px"
7
+ end
8
+
9
+ generator.build_render_method(:browser_height) do |value|
10
+ @browser_object.style[:height] = "#{value}px"
11
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ generator = Genesis.generator
4
+
5
+ generator.build_render_method(:browser_id) do |params|
6
+ browser_object.id = params if @atome[:id] != params
7
+ end
8
+
9
+ generator.build_render_method(:browser_type) do |params|
10
+ send("browser_#{params}", user_proc)
11
+ end
12
+
13
+ generator.build_render_method(:browser_parents) do |parents_found|
14
+ parents_found.each do |parent_found|
15
+ BrowserHelper.send("browser_attach_#{@browser_type}", parent_found, @browser_object, @atome)
16
+ end
17
+ end
18
+
19
+ generator.build_option(:pre_render_children) do |children_pass|
20
+ children_pass.each do |child_found|
21
+ atome_found = grab(child_found)
22
+ atome_found.parents([@atome[:id]])
23
+ end
24
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ generator = Genesis.generator
4
+
5
+ generator.build_render_method(:red) do |value|
6
+ red = ((@atome[:red] = value) * 255)
7
+ green = @atome[:green] * 255
8
+ blue = @atome[:blue] * 255
9
+ alpha = @atome[:alpha]
10
+ color_updated = "rgba(#{red}, #{green}, #{blue}, #{alpha})"
11
+ BrowserHelper.send("browser_colorize_#{@atome[:type]}", color_updated, @atome)
12
+ end
13
+
14
+ generator.build_render_method(:green) do |value|
15
+ red = @atome[:red] * 255
16
+ green = (@atome[:green] = value) * 255
17
+ blue = @atome[:blue] * 255
18
+ alpha = @atome[:alpha]
19
+ color_updated = "rgba(#{red}, #{green}, #{blue}, #{alpha})"
20
+ BrowserHelper.send("browser_colorize_#{@atome[:type]}", color_updated, @atome)
21
+ end
22
+
23
+ generator.build_render_method(:blue) do |value|
24
+ red = @atome[:red] * 255
25
+ green = @atome[:green] * 255
26
+ blue = (@atome[:blue] = value) * 255
27
+ alpha = @atome[:alpha]
28
+ color_updated = "rgba(#{red}, #{green}, #{blue}, #{alpha})"
29
+ BrowserHelper.send("browser_colorize_#{@atome[:type]}", color_updated, @atome)
30
+ end
31
+
32
+ generator.build_render_method(:alpha) do |value|
33
+ red = @atome[:red] * 255
34
+ green = @atome[:green] * 255
35
+ blue = @atome[:blue] * 255
36
+ alpha = (@atome[:alpha] = value)
37
+ color_updated = "rgba(#{red}, #{green}, #{blue}, #{alpha})"
38
+ BrowserHelper.send("browser_colorize_#{@atome[:type]}", color_updated, @atome)
39
+ end
40
+
41
+ generator.build_render_method(:visual) do |value|
42
+ browser_object.style['font-size'] = "#{value[:size]}px"
43
+ end
@@ -1,8 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # render methods
4
- require 'opal'
5
4
  require 'native'
6
5
  require 'promise'
7
6
  require 'browser/setup/full'
8
- @atome_client_ready = true
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ generator = Genesis.generator
4
+
5
+ generator.build_render_method(:browser_left) do |value, _user_proc|
6
+ BrowserHelper.send("browser_left_#{@atome[:type]}", value, @browser_object, @atome)
7
+ end
8
+
9
+ generator.build_render_method(:browser_right) do |value, _user_proc|
10
+ BrowserHelper.send("browser_right_#{@atome[:type]}", value, @browser_object, @atome)
11
+ end
12
+
13
+ generator.build_render_method(:browser_top) do |value, _user_proc|
14
+ BrowserHelper.send("browser_top_#{@atome[:type]}", value, @browser_object, @atome)
15
+ end
16
+
17
+ generator.build_render_method(:browser_bottom) do |value, _user_proc|
18
+ BrowserHelper.send("browser_bottom_#{@atome[:type]}", value, @browser_object, @atome)
19
+ end
20
+
21
+ generator.build_render_method(:browser_rotate) do |value, _user_proc|
22
+ @browser_object.style[:transform] = "rotate(#{value}deg)" unless @browser_type == :style
23
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ generator = Genesis.generator
4
+ generator.build_render_method(:browser_bloc)
5
+ generator.build_render_method(:browser_render)
6
+ generator.build_render_method(:browser_delete) do
7
+ browser_object&.remove
8
+ end
9
+
10
+ generator.build_render_method(:browser_clear) do
11
+ @atome[:children].each do |child_found|
12
+ grab(child_found).browser_object&.remove
13
+ end
14
+ children([])
15
+ end
16
+
17
+ generator.build_render_method(:browser_path) do |value|
18
+ BrowserHelper.send("browser_path_#{@atome[:type]}", value, @browser_object, @atome)
19
+ end
20
+
21
+ generator.build_render_method(:browser_data) do |data|
22
+ # according to the type we send the data to different operator
23
+ type_found = @atome[:type]
24
+ send("browser_data_#{type_found}", data)
25
+ end
26
+
27
+ generator.build_render_method(:browser_schedule) do |format_date, proc|
28
+ years = format_date[0]
29
+ months = format_date[1]
30
+ days = format_date[2]
31
+ hours = format_date[3]
32
+ minutes = format_date[4]
33
+ seconds = format_date[5]
34
+ `atome.jsSchedule(#{years},#{months},#{days},#{hours},#{minutes},#{seconds},#{self},#{proc})`
35
+ end
36
+
37
+ generator.build_render_method(:browser_reader) do |file, proc|
38
+ `atome.jsReader(#{file},#{self},#{proc})`
39
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ # require 'atome/renderers/headless/effect'
4
+ # require 'atome/renderers/headless/event'
5
+ # require 'atome/renderers/headless/geometry'
6
+ # require 'atome/renderers/headless/identity'
7
+ # require 'atome/renderers/headless/material'
8
+ # require 'atome/renderers/headless/spatial'
9
+ # require 'atome/renderers/headless/atome'
10
+ require 'atome/renderers/headless/utility'
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ generator = Genesis.generator
4
+
5
+ generator.build_render_method(:headless_schedule)
6
+ generator.build_render_method(:headless_reader)
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+
4
+ generator = Genesis.generator
5
+
6
+ generator.build_render_method(:html_shape) do
7
+ current_atome = @atome
8
+ id_found = current_atome[:id]
9
+ @html_object = Html.new
10
+ @html_object.add_class('atome')
11
+ @html_object.attr('id', id_found)
12
+ end
13
+
14
+ generator.build_render_method(:html_color) do |_value|
15
+ # we remove previous unused style tag
16
+ opal_document[id]&.remove
17
+ red_found = @atome[:red]
18
+ blue_found = @atome[:blue]
19
+ green_found = @atome[:green]
20
+ alpha_found = @atome[:alpha]
21
+ opal_document.head << DOM("<style atome='#{type}' id='#{id}'>.#{id}{background-color: rgba(#{red_found * 255},
22
+ #{green_found * 255},#{blue_found * 255},#{alpha_found})}</style>")
23
+ # TODO/ use the code below to modify the style tag
24
+ # `document.getElementById(#{id}).sheet.cssRules[0].style.backgroundColor = 'red'`
25
+ end
26
+
27
+ generator.build_render_method(:html_image) do |_user_prc|
28
+ # id_found = id
29
+ # instance_exec(&proc) if proc.is_a?(Proc)
30
+ # DOM do
31
+ # img({ id: id_found }).atome
32
+ # end.append_to($document[:user_view])
33
+ # @html_object = $document[id_found]
34
+ # @html_type = :image
35
+ end
36
+
37
+ generator.build_render_method(:html_shadow) do
38
+ end
39
+
40
+ generator.build_render_method(:html_video) do |_value, _user_proc|
41
+ # id_found = id
42
+ # # instance_exec(&proc) if proc.is_a?(Proc)
43
+ # DOM do
44
+ # video({ id: id_found, autoplay: true ,loop: false, muted: true }).atome
45
+ # end.append_to($document[:user_view])
46
+ # @html_object = $document[id_found]
47
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ generator = Genesis.generator
4
+
5
+ generator.build_render_method(:html_smooth) do |value|
6
+ formated_params = case value
7
+ when Array
8
+ properties = []
9
+ value.each do |param|
10
+ properties << "#{param}px"
11
+ end
12
+ properties.join(' ').to_s
13
+ when Integer
14
+ "#{value}px"
15
+ else
16
+ value
17
+ end
18
+ @html_object.style['border-radius'] = formated_params unless @html_type == :style
19
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ generator = Genesis.generator
4
+
5
+ generator.build_render_method(:html_touch) do |_value, proc|
6
+ @html_object.on :click do |e|
7
+ instance_exec(&proc) if proc.is_a?(Proc)
8
+ end
9
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ generator = Genesis.generator
4
+
5
+ generator.build_render_method(:html_width) do |value|
6
+ @html_object.style[:width] = "#{value}px" unless @html_type == :style
7
+ end
8
+
9
+ generator.build_render_method(:html_height) do |value|
10
+ @html_object.style[:height] = "#{value}px" unless @html_type == :style
11
+ end