atome 0.5.6.4.8 → 0.5.6.5.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/lib/atome/atome.rb +30 -30
  3. data/lib/atome/genesis/atomes.rb +9 -16
  4. data/lib/atome/genesis/genesis.rb +1 -1
  5. data/lib/atome/genesis/particles/effect.rb +9 -5
  6. data/lib/atome/genesis/particles/hierarchy.rb +7 -10
  7. data/lib/atome/genesis/particles/material.rb +22 -1
  8. data/lib/atome/genesis/particles/property.rb +40 -0
  9. data/lib/atome/genesis/particles/spatial.rb +6 -0
  10. data/lib/atome/genesis/sparkle.rb +23 -15
  11. data/lib/atome/kernel/universe.rb +19 -10
  12. data/lib/atome/presets/atome.rb +1 -1
  13. data/lib/atome/{helpers → utilities}/essentials.rb +2 -1
  14. data/lib/atome/{helpers → utilities}/utilities.rb +16 -1
  15. data/lib/atome/version.rb +1 -1
  16. data/lib/atome.rb +5 -5
  17. data/lib/atome_relative.rb +5 -5
  18. data/lib/renderers/html/effect.rb +22 -0
  19. data/lib/renderers/html/hierarchy.rb +11 -1
  20. data/lib/renderers/html/material.rb +20 -12
  21. data/lib/renderers/html/property.rb +0 -27
  22. data/lib/renderers/html/spatial.rb +9 -2
  23. data/vendor/assets/application/examples/border.rb +46 -15
  24. data/vendor/assets/application/examples/increment.rb +23 -0
  25. data/vendor/assets/application/examples/matrix.rb +11 -3
  26. data/vendor/assets/application/examples/shadow.rb +11 -1
  27. data/vendor/assets/server/eDen.rb +8 -1
  28. metadata +21 -21
  29. data/lib/atome/kernel/ruby +0 -0
  30. /data/lib/atome/{helpers → utilities}/color_helper/color/cmyk.rb +0 -0
  31. /data/lib/atome/{helpers → utilities}/color_helper/color/css.rb +0 -0
  32. /data/lib/atome/{helpers → utilities}/color_helper/color/grayscale.rb +0 -0
  33. /data/lib/atome/{helpers → utilities}/color_helper/color/hsl.rb +0 -0
  34. /data/lib/atome/{helpers → utilities}/color_helper/color/palette/adobecolor.rb +0 -0
  35. /data/lib/atome/{helpers → utilities}/color_helper/color/palette/gimp.rb +0 -0
  36. /data/lib/atome/{helpers → utilities}/color_helper/color/palette/monocontrast.rb +0 -0
  37. /data/lib/atome/{helpers → utilities}/color_helper/color/palette.rb +0 -0
  38. /data/lib/atome/{helpers → utilities}/color_helper/color/rgb/colors.rb +0 -0
  39. /data/lib/atome/{helpers → utilities}/color_helper/color/rgb/contrast.rb +0 -0
  40. /data/lib/atome/{helpers → utilities}/color_helper/color/rgb/metallic.rb +0 -0
  41. /data/lib/atome/{helpers → utilities}/color_helper/color/rgb.rb +0 -0
  42. /data/lib/atome/{helpers → utilities}/color_helper/color/yiq.rb +0 -0
  43. /data/lib/atome/{helpers → utilities}/color_helper/color.rb +0 -0
  44. /data/lib/atome/{helpers → utilities}/sanitizer.rb +0 -0
  45. /data/lib/atome/{helpers → utilities}/security.rb +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dc73dbaea0b164408d4656f53afb29c6f207d7a3a9238d7e0f017fee5d99c76a
4
- data.tar.gz: 97860122c2abfec80d74880bd80e24d3c4fb2bab39661aaf3d97e7d6bc1528b3
3
+ metadata.gz: 40ed4954cd1a97e3ebffa9a25d44de095ea8f1b825b91abab913ce9cf61535f6
4
+ data.tar.gz: c6da10feae807b7e738065951de242abfd3dcb31558552d2f47135bd41e67433
5
5
  SHA512:
6
- metadata.gz: bd5524c4909dd4c276c9af722af86b5eaa1505f82ff6503737a5cd6e50e62009bb8be7e7cd82db7e482e7f18e7beb7e1339c2728fbb211f96060b60143f3e136
7
- data.tar.gz: b485ea4522218c293c36f92e79caeb22fb9233e6146cbeb7271d9b328e2be809a86268871338bc49b4ba105352878f3d4ea99361cb7d41b122b46e37e2bb4fac
6
+ metadata.gz: 496ec64689699de33f6538034ba9ace545628ae2fcaa996521c747ffbb89d86461de0ac35580052d93ed1feb0518954cefc2e07afd6cab33f672ea44785ea299
7
+ data.tar.gz: 102a1c8266be193f3781154a597c1715e906e1da63f7df1e070e50c399f078a651947bc5f39d5f4f3a9423833fc0a7966dada61dc1199d280f086061dbe1bdce
data/lib/atome/atome.rb CHANGED
@@ -4,7 +4,7 @@
4
4
  class Atome
5
5
  include Essentials
6
6
 
7
- def aid(_v=nil)
7
+ def aid(_v = nil)
8
8
  @aid
9
9
  end
10
10
 
@@ -22,36 +22,36 @@ class Atome
22
22
  # alert "atome found : #{ grab(new_atome[:id])}"
23
23
  # grab(new_atome[:id])
24
24
  # else
25
- # the keys :renderers, :type and :id should be placed in the first position in the hash
26
- @history = {}
27
- # @language = :english
28
- # @callback = {}
29
- @tag = {}
30
- @selected = false
31
- #@metrics = {}
25
+ # the keys :renderers, :type and :id should be placed in the first position in the hash
26
+ @history = {}
27
+ # @language = :english
28
+ # @callback = {}
29
+ @tag = {}
30
+ @selected = false
31
+ #@metrics = {}
32
32
  @unit = {}
33
- @apply = []
34
- @collect = {}
35
- @collect = {}
36
- @int8= {}
37
- @css = {}
38
- @aid = identity_generator
39
- Universe.add_to_atomes( @aid, self)
40
- @id = new_atome[:id] || @aid
41
- Universe.id_to_aid(@id,@aid)
42
- @type = new_atome[:type] || :element
43
- @attached = []
44
- @category = []
45
- # @display = { mode: :default }
46
- # @backup={} # mainly used to restore particle when using grid /table /list display mode
47
- @html = HTML.new(@id, self)
48
- @headless = Headless.new(@id, self)
49
- # now we store the proc in a an atome's property called :bloc
50
- new_atome[:code] = atomes_proc if atomes_proc
51
- # we reorder the hash
52
- reordered_atome =reorder_particles(new_atome)
53
- # FIXME : try to remove the condition below (it crash in the method : def generator ... in genesis.rb)
54
- collapse(reordered_atome)
33
+ @apply = []
34
+ @collect = {}
35
+ @int8 = {}
36
+ @css = {}
37
+ @aid = identity_generator
38
+ Universe.add_to_atomes(@aid, self)
39
+ @id = new_atome[:id] || @aid
40
+ Universe.id_to_aid(@id, @aid)
41
+ @type = new_atome[:type] || :element
42
+ @attached = []
43
+ @affect = []
44
+ @category = []
45
+ # @display = { mode: :default }
46
+ # @backup={} # mainly used to restore particle when using grid /table /list display mode
47
+ @html = HTML.new(@id, self)
48
+ @headless = Headless.new(@id, self)
49
+ # now we store the proc in a an atome's property called :bloc
50
+ new_atome[:code] = atomes_proc if atomes_proc
51
+ # we reorder the hash
52
+ reordered_atome = reorder_particles(new_atome)
53
+ # FIXME : try to remove the condition below (it crash in the method : def generator ... in genesis.rb)
54
+ collapse(reordered_atome)
55
55
  # end
56
56
 
57
57
  end
@@ -35,7 +35,8 @@ new({ sanitizer: :color }) do |params|
35
35
  params
36
36
  end
37
37
  # new({ post: :color }) do
38
- # Atome.global_monitoring(self, [:red, :blue, :blue, :alpha, :left, :right, :diffusion], [:variable1, :variable2])
38
+ #
39
+ # # Atome.global_monitoring(self, [:red, :blue, :blue, :alpha, :left, :right, :diffusion], [:variable1, :variable2])
39
40
  # end
40
41
  new({ atome: :image })
41
42
  new({ sanitizer: :image }) do |params|
@@ -54,7 +55,6 @@ new({ post: :image }) do
54
55
  instance_variable_set("@width", compute({ particle: :width })[:value])
55
56
  instance_variable_set("@height", compute({ particle: :height })[:value])
56
57
  end
57
-
58
58
  new({ atome: :video })
59
59
  new({ sanitizer: :video }) do |params|
60
60
  unless params.instance_of? Hash
@@ -69,23 +69,17 @@ new({ sanitizer: :video }) do |params|
69
69
  end
70
70
  new({ atome: :www })
71
71
  new({ atome: :shadow }) do |params|
72
- # if params
73
- # if params.delete(:affect)
74
- # attach_value = params.delete(:affect)
75
- # else
76
- # attach_value=id
77
- # end
78
- #
79
- # params[:affect] = attach_value
80
- # alert "=> params : #{params}"
81
- #
82
- # end
83
-
84
72
  if params
85
73
  attach_value = params.delete(:affect)
86
74
  params[:affect] = attach_value
87
75
  end
88
- # alert "=> params : #{params}"
76
+ params
77
+ end
78
+ new({ atome: :border }) do |params|
79
+ if params
80
+ attach_value = params.delete(:affect)
81
+ params[:affect] = attach_value
82
+ end
89
83
  params
90
84
  end
91
85
  new({ atome: :raw })
@@ -130,7 +124,6 @@ end
130
124
  new({ atome: :machine })
131
125
  new({ atome: :paint })
132
126
  new({ atome: :vector })
133
-
134
127
  new({ atome: :matrix })
135
128
  new({ atome: :atomized, type: :hash })
136
129
 
@@ -150,7 +150,7 @@ class Genesis
150
150
  # end
151
151
  # TODO : add category for atome( material/physical vs modifier : color, shadow, .. vs shape, image ..)
152
152
  # then add condition same things fo code in presets/atome atome_common
153
- if %i[color shadow paint].include?(element)
153
+ if %i[color shadow paint border].include?(element)
154
154
  # we do the same for apply to be able to retrieve 'color' and other atome that apply instead of being attached
155
155
  @apply.each do |attached_atome|
156
156
  collected_atomes << attached_atome if grab(attached_atome).type.to_sym == element.to_sym
@@ -2,9 +2,13 @@
2
2
 
3
3
  new({ particle: :smooth, category: :effect, type: :int })
4
4
 
5
-
6
5
  new({ particle: :blur, category: :effect, type: :int }) do |params|
7
- # alert params
8
- { value: params, affect: :self } unless params.instance_of?(Hash)
9
- # params
10
- end
6
+ if affect.nil?
7
+ affect_to = affect
8
+ else
9
+ affect_to = [:self]
10
+ end
11
+ val= { value: params, affect: affect_to } unless params.instance_of?(Hash)
12
+ val
13
+ end
14
+
@@ -2,9 +2,9 @@
2
2
  def detach_child(child)
3
3
  return unless child.attach
4
4
 
5
- parent = grab(child.attach)
6
- parent.attached.delete(@id)
7
-
5
+ parent = grab(child.attach)
6
+ parent.attached.delete(@id)
7
+
8
8
  end
9
9
 
10
10
  # def detach_from_parent(parent_found, child_found)
@@ -50,14 +50,14 @@ new({ sanitizer: :attached }) do |children_ids|
50
50
  end
51
51
 
52
52
  new({ particle: :apply, category: :hierarchy, type: :string, render: false, store: false }) do |parents_ids, &user_proc|
53
- # TODO: optimize the 2 lines below:
54
- # html.reset_background
53
+
55
54
  @apply ||= []
56
55
  parents_ids = [parents_ids] unless parents_ids.instance_of?(Array)
57
56
  parents_ids.each do |parent_id|
58
57
  @apply.delete(parent_id)
59
58
  @apply << parent_id
60
59
  end
60
+ puts affect
61
61
  parents_ids = @apply
62
62
  children_ids = [id]
63
63
  parents_ids.each do |parent_id|
@@ -66,16 +66,13 @@ new({ particle: :apply, category: :hierarchy, type: :string, render: false, stor
66
66
  parent_found.instance_variable_set('@affect', []) unless parent_affect.instance_of? Array
67
67
  affect_element = parent_found.instance_variable_get('@affect')
68
68
  children_ids.each do |child_id|
69
- # affect_element << child_id unless affect_element.include?(child_id)
70
69
  affect_element.delete(child_id)
71
- # affect_element.push(child_id)
72
70
  affect_element << child_id
73
71
  child_found = grab(child_id)
74
72
  child_found&.render(:apply, parent_found, &user_proc)
75
73
  end
76
74
  end
77
75
  @apply = parents_ids
78
-
79
76
  parents_ids
80
77
  end
81
78
 
@@ -83,9 +80,9 @@ new({ particle: :affect, category: :hierarchy, type: :string, render: false }) d
83
80
  children_ids = [children_ids] unless children_ids.instance_of? Array
84
81
  children_ids.each do |child_id|
85
82
  child_found = grab(child_id)
86
- #FIXME : found why it crash when removing the condition below
83
+ # FIXME : found why it crash when removing the condition below
87
84
  unless child_found.id == :black_matter
88
- child_found.remove({all: :paint})
85
+ child_found.remove({ all: :paint })
89
86
  end
90
87
  child_found.apply([id], &user_proc)
91
88
  end
@@ -58,6 +58,10 @@ new({ post: :remove }) do |params|
58
58
  shadow.each do |atome_id_found|
59
59
  @apply.delete(atome_id_found)
60
60
  end
61
+ when :border
62
+ border.each do |atome_id_found|
63
+ @apply.delete(atome_id_found)
64
+ end
61
65
  else
62
66
  params.each do |particle, value|
63
67
  case particle
@@ -92,4 +96,21 @@ new({ sanitizer: :definition }) do |params|
92
96
  end
93
97
 
94
98
  new({ particle: :gradient, category: :material, type: :int })
95
- new({ particle: :border, category: :material, type: :int })
99
+
100
+ new({ particle: :thickness, category: :material, type: :int })
101
+ new({ after: :thickness}) do |params|
102
+ a=affect.dup # FIXME we have to dup else some items in the array array other duplicated
103
+ a.each do |atome_to_refresh|
104
+ grab(atome_to_refresh).apply(id)
105
+ end
106
+ params
107
+ end
108
+ new({ particle: :pattern, category: :material, type: :string })
109
+ new({ after: :pattern })do |params|
110
+ a=affect.dup # FIXME we have to dup else some items in the array array other duplicated
111
+ a.each do |atome_to_refresh|
112
+ grab(atome_to_refresh).apply(id)
113
+ end
114
+ params
115
+ end
116
+ # new({ particle: :border, category: :material, type: :int })
@@ -7,24 +7,64 @@ def extract_rgb_alpha(color_string)
7
7
  blue = match_data[3].to_i
8
8
  alpha = match_data[4] ? match_data[4].to_f : nil
9
9
  { red: red, green: green, blue: blue, alpha: alpha }
10
+
10
11
  end
11
12
 
12
13
  new({ particle: :red, category: :property, type: :string }) do
14
+ # alert :ok
13
15
  # we return self to allow syntax of the type : a.color(:black).red(1).green(0.3)
14
16
  self
15
17
  end
18
+ # FIXME we have to apply both at post and after to make it work
19
+ # used to refresh all affected atomes
20
+ new({after: :red}) do |params|
21
+ a=affect.dup # FIXME we have to dup else some items in the array array other duplicated
22
+ a.each do |atome_to_refresh|
23
+ grab(atome_to_refresh).apply(id)
24
+ end
25
+ params
26
+ end
27
+
28
+
16
29
  new({ particle: :green, category: :property, type: :string }) do
17
30
  # we return self to allow syntax of the type : a.color(:black).red(1).green(0.3)
18
31
  self
19
32
  end
33
+
34
+ # used to refresh all affected atomes
35
+ new({after: :green}) do |params|
36
+ a=affect.dup # FIXME we have to dup else some items in the array array other duplicated
37
+ a.each do |atome_to_refresh|
38
+ grab(atome_to_refresh).apply(id)
39
+ end
40
+ params
41
+ end
42
+
20
43
  new({ particle: :blue, category: :property, type: :string }) do
21
44
  # we return self to allow syntax of the type : a.color(:black).red(1).green(0.3)
22
45
  self
23
46
  end
47
+
48
+ # used to refresh all affected atomes
49
+ new({after: :blue}) do |params|
50
+ a=affect.dup # FIXME we have to dup else some items in the array array other duplicated
51
+ a.each do |atome_to_refresh|
52
+ grab(atome_to_refresh).apply(id)
53
+ end
54
+ params
55
+ end
24
56
  new({ particle: :alpha, category: :property, type: :string }) do
25
57
  # we return self to allow syntax of the type : a.color(:black).red(1).green(0.3)
26
58
  self
27
59
  end
60
+ # used to refresh all affected atomes
61
+ new({after: :alpha}) do |params|
62
+ a=affect.dup # FIXME we have to dup else some items in the array array other duplicated
63
+ a.each do |atome_to_refresh|
64
+ grab(atome_to_refresh).apply(id)
65
+ end
66
+ params
67
+ end
28
68
  new({ particle: :diffusion, category: :property, type: :string }) do
29
69
  # we return self to allow syntax of the type : a.color(:black).red(1).green(0.3)
30
70
  self
@@ -90,3 +90,9 @@ new({ particle: :center, category: :spatial, type: :hash }) do |params|
90
90
  params = { x: 0, y: 0, dynamic: true } if params == true
91
91
  params
92
92
  end
93
+ new ({ particle: :increment, category: :spatial, type: :hash }) do |params|
94
+ params.each do |particle, value|
95
+ prev_value=send(particle)
96
+ send(particle, value+prev_value)
97
+ end
98
+ end
@@ -142,13 +142,19 @@ def atome_genesis
142
142
  atome_infos
143
143
  A.server({ address: 'localhost:9292', type: 'ws' })
144
144
  A.init_websocket do |msg|
145
- puts "-3 #{msg}"
145
+ puts "websocket initailsaed #{msg}"
146
146
  end
147
147
  end
148
148
 
149
149
  def init_database # this method is call from JS (atome/communication) at WS connection
150
150
  # we init the db file eDen
151
- A.message({ action: :init_db, data: { database: :eDen } }) do |_db_state|
151
+ A.sync({ action: :init_db, data: { database: :eDen } }) do |data|
152
+
153
+ if data[:data][:message] == 'database_ready'
154
+ Universe.database_ready = true
155
+ else
156
+ Universe.database_ready = false
157
+ end
152
158
  end
153
159
  # authentication : email, pass
154
160
  # atome : date, particles
@@ -156,36 +162,37 @@ def init_database # this method is call from JS (atome/communication) at WS conn
156
162
 
157
163
  particles = Universe.particle_list
158
164
  # now we populate the DB
159
- A.message({ action: :crate_db_table, data: { table: :user } }) do |_db_state|
165
+ A.sync({ action: :crate_db_table, data: { table: :user } }) do |_db_state|
166
+ # puts "===> #{_db_state}"
160
167
  end
161
168
 
162
- A.message({ action: :create_db_column, data: { table: :user, column: :email, type: :string } }) do |_db_state|
169
+ A.sync({ action: :create_db_column, data: { table: :user, column: :email, type: :string } }) do |_db_state|
163
170
  end
164
171
 
165
- A.message({ action: :create_db_column, data: { table: :user, column: :password, type: :string } }) do |_db_state|
172
+ A.sync({ action: :create_db_column, data: { table: :user, column: :password, type: :string } }) do |_db_state|
166
173
  end
167
174
 
168
- A.message({ action: :crate_db_table, data: { table: :history } }) do |_db_state|
175
+ A.sync({ action: :crate_db_table, data: { table: :history } }) do |_db_state|
169
176
  end
170
- A.message({ action: :create_db_column, data: { table: :history, column: :aid, type: :string } }) do |_db_state|
177
+ A.sync({ action: :create_db_column, data: { table: :history, column: :aid, type: :string } }) do |_db_state|
171
178
  end
172
- A.message({ action: :create_db_column, data: { table: :history, column: :particle, type: :string } }) do |_db_state|
179
+ A.sync({ action: :create_db_column, data: { table: :history, column: :particle, type: :string } }) do |_db_state|
173
180
  end
174
- A.message({ action: :create_db_column, data: { table: :history, column: :value, type: :string } }) do |_db_state|
181
+ A.sync({ action: :create_db_column, data: { table: :history, column: :value, type: :string } }) do |_db_state|
175
182
  end
176
- A.message({ action: :create_db_column, data: { table: :history, column: :date, type: :datetime } }) do |_db_state|
183
+ A.sync({ action: :create_db_column, data: { table: :history, column: :date, type: :datetime } }) do |_db_state|
177
184
  end
178
185
 
179
- A.message({ action: :crate_db_table, data: { table: :atome } }) do |_db_state|
186
+ A.sync({ action: :crate_db_table, data: { table: :atome } }) do |_db_state|
180
187
  end
181
188
  particles.each do |particle, infos|
182
189
  type = infos[:type]
183
- A.message({ action: :create_db_column, data: { table: :atome, column: particle, type: type } }) do |_db_state|
190
+ A.sync({ action: :create_db_column, data: { table: :atome, column: particle, type: type } }) do |_db_state|
184
191
  end
185
192
  end
186
193
 
187
194
  # now we send localstorage content to the server
188
- puts "now we send localstorage send_localstorage_content to the server"
195
+ puts "now we send localstorage send_localstorage_content to the server"
189
196
  send_localstorage_content
190
197
  # A.message({ action: :localstorage, data: get_localstorage_content }) do |_db_state|
191
198
  # end
@@ -194,11 +201,12 @@ end
194
201
  def user_login
195
202
  # user = Universe.current_user
196
203
  password = Black_matter.password
197
- message({ action: :authentication, data: { email: 'jeezs@atome.one' } }) do |email|
204
+ sync({ action: :authentication, data: { email: 'jeezs@atome.one' } }) do |email|
198
205
  puts "email received : #{email}"
199
206
  end
200
- message({ action: :authorization, data: { password: password } }) do |pass|
207
+ sync({ action: :authorization, data: { password: password } }) do |pass|
201
208
  puts "password received : #{pass}"
202
209
  end
203
210
  end
211
+
204
212
  # Universe.allow_history=true
@@ -11,18 +11,20 @@ class Universe
11
11
  @sanitizers = {}
12
12
  @specificities = {}
13
13
  @messages = {}
14
- @increment=0
14
+ @increment = 0
15
15
  @categories = %w[atome communication effect event geometry hierarchy identity material
16
16
  property security spatial time utility ]
17
17
  @history = {}
18
18
  @users = {}
19
19
  @help = {}
20
20
  @example = {}
21
- @allow_history= false
21
+ @allow_history = false
22
+ @database_ready = false
22
23
  # @historicize=false
23
24
  class << self
24
- attr_reader :atomes,:atomes_ids, :renderer_list, :atome_list, :particle_list, :classes, :counter, :atomes_specificities
25
- attr_accessor :allow_history
25
+ attr_reader :atomes, :atomes_ids, :renderer_list, :atome_list, :particle_list, :classes, :counter, :atomes_specificities
26
+ attr_accessor :allow_history, :database_ready
27
+
26
28
  def messages
27
29
  @messages
28
30
  end
@@ -124,11 +126,13 @@ class Universe
124
126
  end
125
127
  collected_id
126
128
  end
129
+
127
130
  def generate_uuid
128
- uuid = SecureRandom.uuid.gsub('-','')
131
+ uuid = SecureRandom.uuid.gsub('-', '')
129
132
  formatted_time = Time.now.strftime("%Y%m%d%H%M%S")
130
133
  "#{uuid}#{formatted_time}"
131
134
  end
135
+
132
136
  def app_identity
133
137
  # each app hav its own identity, this allow to generate new user identities from the
134
138
  # unique_id = generate_unique_id_with_timestamp
@@ -237,11 +241,16 @@ class Universe
237
241
  end
238
242
 
239
243
  def historicize(id, operation, element, params)
240
- if @allow_history
241
- operation_timing= Time.now.strftime("%Y%m%d%H%M%S%3N")+@increment.to_s
242
- @increment+=1
243
- @increment=@increment%100
244
- JS.global[:localStorage].setItem(operation_timing,"{ #{id} => { #{operation} => { #{element} => #{params} } }, sync: false }")
244
+
245
+ if @allow_history && @database_ready
246
+ # sync
247
+ A.sync({ action: :historicize, data: { table: :user } }) do |_db_state|
248
+ # puts "===> #{_db_state}"
249
+ end
250
+ operation_timing = Time.now.strftime("%Y%m%d%H%M%S%3N") + @increment.to_s
251
+ @increment += 1
252
+ @increment = @increment % 100
253
+ JS.global[:localStorage].setItem(operation_timing, "{ #{id} => { #{operation} => { #{element} => #{params} } }, sync: false }")
245
254
  @history[@history.length] = { operation_timing => { id => { operation => { element => params } }, sync: false, time: Time.now } }
246
255
  end
247
256
  end
@@ -26,7 +26,7 @@ class Atome
26
26
  # condition to handle color/shadow/paint atomes that shouldn't be attach to view
27
27
  # TODO : add category for atome( material/physical vs modifier : color, shadow, .. vs shape, image ..)
28
28
  # then add condition same things fo code in genesis new_atome
29
- if %i[color shadow paint].include?(atome_preset)
29
+ if %i[color shadow paint border].include?(atome_preset)
30
30
  unless params[:affect]
31
31
  params[:affect] = if @id == :view
32
32
  [:black_matter]
@@ -37,7 +37,8 @@ module Essentials
37
37
  apply: [:text_color],
38
38
  width: :auto, height: :auto, language: :english },
39
39
  drm: { type: :drm, attach: :black_matter },
40
- shadow: { type: :shadow, red: 0, green: 0, blue: 0, alpha: 0 },
40
+ shadow: { type: :shadow, red: 0, green: 0, blue: 0, alpha: 1, blur: 3, left: 3, top: 3 },
41
+ border: { type: :border, red: 0, green: 0, blue: 0, alpha: 0, pattern: :solid, thickness: 6 },
41
42
  color: { type: :color, red: 0, green: 0, blue: 0, alpha: 1}
42
43
  }
43
44
 
@@ -7,6 +7,8 @@ class Atome
7
7
  class << self
8
8
 
9
9
 
10
+
11
+
10
12
  def file_handler(parent, content, bloc)
11
13
  grab(parent).instance_exec(content, &bloc)
12
14
  end
@@ -303,11 +305,16 @@ class Atome
303
305
  end
304
306
 
305
307
  def refresh
308
+ # we get the current color because they will be removed
309
+ # prev_color=color
310
+ # alert color.class
306
311
  particles_found = to_hash
307
312
  particles_found.each do |particle_found, value_found|
308
313
  send(particle_found, value_found)
309
314
  end
310
-
315
+ color.each do |col|
316
+ apply(col)
317
+ end
311
318
  end
312
319
 
313
320
  def each(&proc)
@@ -449,6 +456,14 @@ class Atome
449
456
  puts "sanitizer temp patch when an atome is passed instead of an id"
450
457
  @id
451
458
  end
459
+
460
+ def sync(params, &bloc)
461
+ params = { data: params } unless params.instance_of? Hash
462
+ message_id= "msg_#{Universe.messages.length}"
463
+ params[:message_id]=message_id
464
+ Universe.store_messages({msg_nb:message_id, proc: bloc })
465
+ html.send_message(params)
466
+ end
452
467
  end
453
468
 
454
469
 
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.6.4.8'
5
+ VERSION = '0.5.6.5.4'
6
6
  end
data/lib/atome.rb CHANGED
@@ -7,9 +7,9 @@ require 'atome/version'
7
7
  require 'atome/genesis/genesis'
8
8
  require 'atome/kernel/black_matter'
9
9
  require 'atome/kernel/universe'
10
- require 'atome/helpers/essentials'
10
+ require 'atome/utilities/essentials'
11
11
  require 'renderers/renderer'
12
- require 'atome/helpers/color_helper/color'
12
+ require 'atome/utilities/color_helper/color'
13
13
  require 'atome/extensions/atome'
14
14
  require 'atome/extensions/mathematics'
15
15
  require 'atome/atome'
@@ -28,12 +28,12 @@ require 'atome/genesis/particles/security'
28
28
  require 'atome/genesis/particles/spatial'
29
29
  require 'atome/genesis/particles/time'
30
30
  require 'atome/genesis/particles/utility'
31
- require 'atome/helpers/utilities'
32
- require 'atome/helpers/security'
31
+ require 'atome/utilities/utilities'
32
+ require 'atome/utilities/security'
33
33
  require 'renderers/html/index'
34
34
  require 'renderers/headless/index'
35
35
  require 'renderers/server/index'
36
- require 'atome/helpers/sanitizer'
36
+ require 'atome/utilities/sanitizer'
37
37
  require 'atome/genesis/sparkle'
38
38
  require 'molecules/init'
39
39
  # require 'eVe/lib/eVe'
@@ -6,9 +6,9 @@ require_relative './atome/version'
6
6
  require_relative './atome/genesis/genesis'
7
7
  require_relative 'atome/kernel/black_matter'
8
8
  require_relative './atome/kernel/universe'
9
- require_relative './atome/helpers/essentials'
9
+ require_relative './atome/utilities/essentials'
10
10
  require_relative './renderers/renderer'
11
- require_relative './atome/helpers/color_helper/color'
11
+ require_relative './atome/utilities/color_helper/color'
12
12
  require_relative './atome/extensions/atome'
13
13
  require_relative './atome/extensions/mathematics'
14
14
  require_relative './atome/atome'
@@ -27,12 +27,12 @@ require_relative './atome/genesis/particles/security'
27
27
  require_relative './atome/genesis/particles/spatial'
28
28
  require_relative './atome/genesis/particles/time'
29
29
  require_relative './atome/genesis/particles/utility'
30
- require_relative './atome/helpers/utilities'
31
- require_relative './atome/helpers/security'
30
+ require_relative './atome/utilities/utilities'
31
+ require_relative './atome/utilities/security'
32
32
  require_relative './renderers/html/index_relative'
33
33
  require_relative './renderers/headless/index_relative'
34
34
  require_relative './renderers/server/index_relative'
35
- require_relative './atome/helpers/sanitizer'
35
+ require_relative './atome/utilities/sanitizer'
36
36
  require_relative './atome/genesis/sparkle'
37
37
  require_relative './molecules/init'
38
38
  # require_relative './eVe/lib/eVe'
@@ -27,3 +27,25 @@ new({ renderer: :html, method: :blur, type: :integer }) do |params, _user_proc|
27
27
  html.filter(:blur, "#{params[:value]}px")
28
28
  end
29
29
  end
30
+
31
+
32
+ new({ renderer: :html, method: :blur, type: :integer, specific: :shadow }) do |params, _user_proc|
33
+ if params[:affect] == :back
34
+ html.backdropFilter(:blur, "#{params[:value]}px")
35
+ else
36
+ html.filter(:blur, "#{params[:value]}px")
37
+ end
38
+ # now we refresh if needed for dynamic refresh od affected atomes
39
+ affect(affect)
40
+ end
41
+
42
+ # new({ particle: :blur, category: :effect, type: :int , specific: :shadow}) do |params|
43
+ # alert :cool
44
+ # if affect.nil?
45
+ # affect_to = affect
46
+ # else
47
+ # affect_to = [:self]
48
+ # end
49
+ # val= { value: params, affect: affect_to } unless params.instance_of?(Hash)
50
+ # val
51
+ # end
@@ -38,7 +38,6 @@ new({ renderer: :html, method: :apply, type: :string }) do |parent_found, _user_
38
38
  alpha = parent_found.alpha
39
39
  html.style(:backgroundColor, "rgba(#{red}, #{green}, #{blue}, #{alpha})")
40
40
  when :paint
41
-
42
41
  # if when found colors when use it for the gradient , else whe use the colors within the current atome
43
42
  # gradient_found = params[:colors] || @apply
44
43
  # we get all the paint atomes applied to the current atome
@@ -75,6 +74,17 @@ new({ renderer: :html, method: :apply, type: :string }) do |parent_found, _user_
75
74
  # full_gradient_to_apply=gradients_to_apply.join(',')
76
75
  full_gradient_to_apply = gradients_to_apply.last
77
76
  html.style(:background, full_gradient_to_apply)
77
+ when :border
78
+ border.each do |border_id_found|
79
+ border_found = grab(border_id_found)
80
+ red = border_found.red * 255
81
+ green = border_found.green * 255
82
+ blue = border_found.blue * 255
83
+ alpha = border_found.alpha
84
+ thickness = border_found.thickness
85
+ pattern = border_found.pattern
86
+ html.style(:border, "#{pattern} #{thickness}px rgba(#{red},#{green},#{blue},#{alpha})")
87
+ end
78
88
  else
79
89
  #
80
90
  end
@@ -52,16 +52,24 @@ new({ method: :remove, renderer: :html, type: :string }) do |object_id_to_remove
52
52
  end
53
53
  end
54
54
 
55
+ # new({ method: :border, type: :hash, renderer: :html }) do |value, _user_proc|
56
+ # thickness = value[:thickness] || 5
57
+ # type = value[:pattern] || :solid
58
+ #
59
+ # if value[:color].instance_of? Atome
60
+ # color_found = value[:color]
61
+ # else
62
+ # color_found = grab('black_matter').color(value[:color])
63
+ # end
64
+ #
65
+ # red = color_found.red * 255
66
+ # green = color_found.green * 255
67
+ # blue = color_found.blue * 255
68
+ # alpha = color_found.alpha
69
+ #
70
+ # html.style(:border, "#{type} #{thickness}px rgba(#{red},#{green},#{blue},#{alpha})")
71
+ # end
72
+ new({ method: :thickness, type: :integer, renderer: :html})
55
73
 
56
- new({ method: :border, type: :hash, renderer: :html }) do |value, _user_proc|
57
- thickness = value[:thickness] || 5
58
- type = value[:pattern] || :solid
59
- color = if value[:color]
60
- color_found = value[:color]
61
- "#{color_found.red * 255},#{color_found.green * 255},#{color_found.blue * 255},#{color_found.alpha} "
62
- else
63
- "0,0,0,1"
64
- end
65
-
66
- html.style(:border, "#{type} #{thickness}px rgba(#{color})")
67
- end
74
+ # end
75
+ new({ method: :pattern, type: :integer, renderer: :html})
@@ -22,33 +22,6 @@ new({ renderer: :html, method: :edit }) do |params|
22
22
  html.update_data(params)
23
23
  end
24
24
 
25
- new({ method: :border, type: :hash, renderer: :html }) do |value, _user_proc|
26
- thickness = value[:thickness] || 5
27
- type = value[:pattern] || :solid
28
- # color = if value[:color]
29
- # color_found = value[:color]
30
- # "#{color_found.red * 255},#{color_found.green * 255},#{color_found.blue * 255},#{color_found.alpha} "
31
- # else
32
- # "0,0,0,1"
33
- # end
34
- if value[:color].instance_of? Atome
35
- color_found= value[:color]
36
- else
37
- color_found=grab('black_matter').color(value[:color])
38
- end
39
-
40
- # alert "atome found 2 : #{color_found}"
41
- red = color_found.red* 255
42
- green = color_found.green* 255
43
- blue = color_found.blue* 255
44
- alpha = color_found.alpha
45
- # alert "rgba(#{red},#{green},#{blue},#{alpha})"
46
- # color_found= "#{1 * 255},#{color_found.green * 255},#{0 * 255},#{0.3} "
47
-
48
- html.style(:border, "#{type} #{thickness}px rgba(#{red},#{green},#{blue},#{alpha})")
49
- # html.style(:border, "#{type} #{thickness}px rgba(#{color_found})")
50
- # html.style(:border, "solid 12px rgba(255, 255, 120, 0,3)")
51
- end
52
25
 
53
26
  new({ method: :clean, renderer: :html, type: :hash }) do |params|
54
27
  html.table_clean(params)
@@ -9,6 +9,7 @@ new({ method: :top, type: :integer, renderer: :html }) do |params|
9
9
  unit = @unit[:top] || :px if params.is_a? Numeric
10
10
  js[:style][:top] = "#{params}#{unit}"
11
11
  end
12
+
12
13
  new({ method: :bottom, type: :integer, renderer: :html }) do |params|
13
14
  unit = @unit[:bottom] || :px if params.is_a? Numeric
14
15
  js[:style][:bottom] = "#{params}#{unit}"
@@ -20,7 +21,10 @@ new({ method: :right, type: :integer, renderer: :html }) do |params|
20
21
  js[:style][:right] = "#{params}#{unit}"
21
22
  end
22
23
 
23
- new({ method: :top, type: :integer, renderer: :html, specific: :shadow })
24
+ new({ method: :top, type: :integer, renderer: :html, specific: :shadow }) do
25
+ # now we refresh if needed for dynamic refresh od affected atomes
26
+ affect(affect)
27
+ end
24
28
 
25
29
  # new({ method: :top, type: :integer, renderer: :html, specific: :text }) do |params|
26
30
  # unit = @unit[:left] || :px
@@ -33,7 +37,10 @@ new({ method: :top, type: :integer, renderer: :html, specific: :shadow })
33
37
 
34
38
  new({ method: :left, type: :integer, specific: :color, renderer: :html })
35
39
 
36
- new({ method: :left, type: :integer, renderer: :html, specific: :shadow })
40
+ new({ method: :left, type: :integer, renderer: :html, specific: :shadow }) do
41
+ # now we refresh if needed for dynamic refresh od affected atomes
42
+ affect(affect)
43
+ end
37
44
 
38
45
  new({ method: :top, type: :integer, specific: :color, renderer: :html })
39
46
 
@@ -1,28 +1,59 @@
1
1
  # frozen_string_literal: true
2
2
 
3
-
4
- col=color({red: 1, green: 0.2, id: :the_col})
5
- c=circle
6
- b=box({left: 333})
7
- c2=circle({top: 190, width: 99, height: 99})
3
+ # col=color({red: 1, green: 0.2, id: :the_col})
4
+ c = circle({ id: :the_circle })
5
+ b = box({ left: 333, id: :the_box })
6
+ circle({ top: 190, width: 99, height: 99, id: :dont_break_too })
7
+ c2 = circle({ top: 190, width: 99, height: 99, id: :dont_break })
8
8
  # let's add the border
9
- c2.border({ thickness: 5, color: :blue, pattern: :dotted })
10
- c.border({ thickness: 5, color: col, pattern: :dotted })
11
- b.border({ thickness: 5, color: col, pattern: :dotted })
12
-
13
9
  wait 1 do
14
- c2.border({ thickness: 5, color: :green, pattern: :dotted })
15
- c.border({ thickness: 5, color: :green, pattern: :dotted })
16
- b.border({ thickness: 5, color: :green, pattern: :dotted })
10
+ c2.shadow({
11
+ # id: :s1,
12
+ # affect: [:the_circle],
13
+ left: 9,
14
+ top: 3,
15
+ blur: 9,
16
+ invert: false,
17
+ option: :natural,
18
+ red: 0, green: 0, blue: 0, alpha: 1
19
+ })
20
+ c2.border({ thickness: 5, red: 1, green: 0, blue: 0, alpha: 1, pattern: :dotted, id: :borderline })
17
21
  end
22
+ c.border({ thickness: 5, red: 1, green: 1, blue: 0, alpha: 1, pattern: :dotted })
23
+ b.border({ thickness: 5, red: 0, green: 1, blue: 0, alpha: 1, pattern: :dotted })
18
24
 
25
+ wait 2 do
26
+ c2.border({ thickness: 5, red: 1, green: 1, blue: 0, alpha: 1, pattern: :solid })
27
+ c.border({ thickness: 5, red: 1, green: 1, blue: 0, alpha: 1, pattern: :dotted })
28
+ b.border({ thickness: 3, red: 1, green: 1, blue: 0, alpha: 1, pattern: :dotted })
29
+ b.text('touch me')
30
+ end
31
+ #
19
32
  b.touch(true) do
20
33
 
21
- b.border({ thickness: 5, color: { red: 1, green: 0 }, pattern: :dotted })
22
- puts " no new atome added!, number of atomes: #{Universe.atomes.length}"
34
+ b.border({ thickness: 5, red: 1, green: 1, blue: 1, alpha: 1, pattern: :dotted, id: :the_door })
35
+ puts " no new atome added!, number of atomes: #{Universe.atomes.length}"
36
+ b.apply([:the_door])
37
+ c.apply([:the_door])
38
+ c2.apply([:the_door])
39
+ wait 1 do
40
+ # if the_door (border) is change all affect atomes are refreshed
41
+ grab(:the_door).pattern(:solid)
42
+ wait 1 do
43
+ # if the_door (border) is change all affect atomes are refreshed
44
+ grab(:the_door).thickness(20)
45
+ wait 1 do
46
+ # if the_door (border) is change all affect atomes are refreshed
47
+ grab(:the_door).red(0)
48
+ c2.color({alpha: 0})
49
+
50
+ end
51
+ end
52
+ end
23
53
  end
54
+
24
55
  # wait 6 do
25
- # iamge(:red_planet)
56
+ # image(:red_planet)
26
57
  # end
27
58
 
28
59
  # # frozen_string_literal: true
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ cc=color({red: 1, blue: 0.1,id: :the_col})
4
+ b=box({ left: 12, id: :the_first_box, apply: cc.id })
5
+ c=circle({ left: 99, top: 99 })
6
+
7
+ wait 1 do
8
+ c.increment({left: 33, top: 99})
9
+ b.increment({left: 33, top: 99})
10
+ wait 1 do
11
+ c.increment({width: 33, top: -22})
12
+ b.increment({width: 33, top: -9})
13
+ cc.increment({red: -0.5})
14
+ wait 1 do
15
+ cc.increment({blue: 1})
16
+ end
17
+ # Atome.sync(:ok)
18
+ end
19
+ end
20
+
21
+ # wait 3 do
22
+ # color(:red)
23
+ # end
@@ -22,12 +22,12 @@ def matrix(id, horizontal_nb, vertical_nb, spacing, size)
22
22
  end
23
23
  box_width = available_width / horizontal_nb
24
24
  box_height = available_height / vertical_nb
25
-
25
+ background=box({id: :background, width: 666, height: 666, color:{alpha: 0}})
26
26
  vertical_nb.times do |y|
27
27
  horizontal_nb.times do |x|
28
28
  id_generated = "#{id}_#{x}_#{y}"
29
29
  matrix_cells << id_generated
30
- new_box = box({ id: id_generated })
30
+ new_box = background.box({ id: id_generated })
31
31
  new_box.width(box_width)
32
32
  new_box.height(box_height)
33
33
  new_box.left((box_width + spacing) * x + spacing)
@@ -142,4 +142,12 @@ test_cell.touch(true) do
142
142
  # test_cell.color(:blue)
143
143
  # end
144
144
 
145
- end
145
+ end
146
+ wait 1 do
147
+ @current_matrix.width(33)
148
+ end
149
+ @current_matrix.drag(true)
150
+ wait 2 do
151
+ grab(:background).left(666)
152
+ grab(:background).drag(true)
153
+ end
@@ -34,7 +34,7 @@ wait 2 do
34
34
  end
35
35
 
36
36
 
37
- the_text = text({ data: 'text with shadow!', center: true, top: 222, width: 777, component: { size: 66 } })
37
+ the_text = text({ data: 'text with shadow!', center: true, top: 222, width: 777, component: { size: 66 }, id: :my_text })
38
38
 
39
39
 
40
40
  the_text.shadow({
@@ -48,3 +48,13 @@ the_text.left(255)
48
48
  the_text.top(66)
49
49
  the_text.color(:red)
50
50
 
51
+ wait 1 do
52
+ text_shadow= grab(:my_shadow)
53
+ text_shadow.alpha(0.5)
54
+ text_shadow.left(120)
55
+ text_shadow.blur({ value: 1 })
56
+
57
+ # grab(:my_text).refresh(true)
58
+
59
+ end
60
+
@@ -85,11 +85,18 @@ class EDen
85
85
 
86
86
  end
87
87
 
88
+ def historicize(data, message_id)
89
+ # return test
90
+ # ws.send(return_message.to_json)
91
+ return { return: 'item to historicize received', authorized: true, message_id: message_id }
92
+
93
+ end
94
+
88
95
  def init_db(_data, message_id)
89
96
  unless File.exist?("eden.sqlite3")
90
97
  Sequel.connect("sqlite://eden.sqlite3")
91
98
  end
92
- { data: { message: 'database initialised' }, message_id: message_id }
99
+ { data: { message: 'database_ready' }, message_id: message_id }
93
100
  end
94
101
 
95
102
  def crate_db_table(data, message_id)
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.6.4.8
4
+ version: 0.5.6.5.4
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-03-01 00:00:00.000000000 Z
11
+ date: 2024-03-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: artoo
@@ -436,28 +436,27 @@ files:
436
436
  - lib/atome/genesis/particles/time.rb
437
437
  - lib/atome/genesis/particles/utility.rb
438
438
  - lib/atome/genesis/sparkle.rb
439
- - lib/atome/helpers/color_helper/color.rb
440
- - lib/atome/helpers/color_helper/color/cmyk.rb
441
- - lib/atome/helpers/color_helper/color/css.rb
442
- - lib/atome/helpers/color_helper/color/grayscale.rb
443
- - lib/atome/helpers/color_helper/color/hsl.rb
444
- - lib/atome/helpers/color_helper/color/palette.rb
445
- - lib/atome/helpers/color_helper/color/palette/adobecolor.rb
446
- - lib/atome/helpers/color_helper/color/palette/gimp.rb
447
- - lib/atome/helpers/color_helper/color/palette/monocontrast.rb
448
- - lib/atome/helpers/color_helper/color/rgb.rb
449
- - lib/atome/helpers/color_helper/color/rgb/colors.rb
450
- - lib/atome/helpers/color_helper/color/rgb/contrast.rb
451
- - lib/atome/helpers/color_helper/color/rgb/metallic.rb
452
- - lib/atome/helpers/color_helper/color/yiq.rb
453
- - lib/atome/helpers/essentials.rb
454
- - lib/atome/helpers/sanitizer.rb
455
- - lib/atome/helpers/security.rb
456
- - lib/atome/helpers/utilities.rb
457
439
  - lib/atome/kernel/black_matter.rb
458
- - lib/atome/kernel/ruby
459
440
  - lib/atome/kernel/universe.rb
460
441
  - lib/atome/presets/atome.rb
442
+ - lib/atome/utilities/color_helper/color.rb
443
+ - lib/atome/utilities/color_helper/color/cmyk.rb
444
+ - lib/atome/utilities/color_helper/color/css.rb
445
+ - lib/atome/utilities/color_helper/color/grayscale.rb
446
+ - lib/atome/utilities/color_helper/color/hsl.rb
447
+ - lib/atome/utilities/color_helper/color/palette.rb
448
+ - lib/atome/utilities/color_helper/color/palette/adobecolor.rb
449
+ - lib/atome/utilities/color_helper/color/palette/gimp.rb
450
+ - lib/atome/utilities/color_helper/color/palette/monocontrast.rb
451
+ - lib/atome/utilities/color_helper/color/rgb.rb
452
+ - lib/atome/utilities/color_helper/color/rgb/colors.rb
453
+ - lib/atome/utilities/color_helper/color/rgb/contrast.rb
454
+ - lib/atome/utilities/color_helper/color/rgb/metallic.rb
455
+ - lib/atome/utilities/color_helper/color/yiq.rb
456
+ - lib/atome/utilities/essentials.rb
457
+ - lib/atome/utilities/sanitizer.rb
458
+ - lib/atome/utilities/security.rb
459
+ - lib/atome/utilities/utilities.rb
461
460
  - lib/atome/version.rb
462
461
  - lib/atome_relative.rb
463
462
  - lib/molecules/examples/site.rb
@@ -568,6 +567,7 @@ files:
568
567
  - vendor/assets/application/examples/hypertext.rb
569
568
  - vendor/assets/application/examples/image.rb
570
569
  - vendor/assets/application/examples/import.rb
570
+ - vendor/assets/application/examples/increment.rb
571
571
  - vendor/assets/application/examples/infos.rb
572
572
  - vendor/assets/application/examples/int8.rb
573
573
  - vendor/assets/application/examples/keyboard.rb
File without changes
File without changes
File without changes