@@ -23,7 +23,6 @@ defmodule ComponentsGuideWeb.ColorLive do
23
23
24
24
color = { :srgb , r , g , b } |> Styling . convert ( :lab )
25
25
26
- IO . puts ( "INPUT #{ r } #{ g } #{ b } OUTPUT #{ inspect ( color ) } " )
27
26
% State { color: color }
28
27
end
29
28
@@ -75,49 +74,33 @@ defmodule ComponentsGuideWeb.ColorLive do
75
74
end
76
75
77
76
def render ( assigns ) do
78
- swatch_size = 100
77
+ swatch_size = 160
79
78
{ :lab , l , a , b } = assigns . state . color
80
79
81
- l_steps = 10
80
+ gradient_steps = 20
82
81
83
82
l_gradient =
84
83
Styling . linear_gradient (
85
84
"150grad" ,
86
- for ( n <- 0 .. l_steps , do: { :lab , n * ( 100 / l_steps ) , a , b } )
85
+ for ( n <- 0 .. gradient_steps , do: { :lab , n * ( 100 / gradient_steps ) , a , b } )
87
86
)
88
87
89
88
l_gradient_svg =
90
89
Styling . svg_linear_gradient (
91
90
"rotate(45)" ,
92
- for ( n <- 0 .. l_steps , do: { :lab , interpolate ( n / l_steps , { 0.0 , 100.0 } ) , a , b } )
93
- )
94
-
95
- a_steps = 10
96
-
97
- a_gradient =
98
- Styling . linear_gradient (
99
- "150grad" ,
100
- for ( n <- 0 .. a_steps , do: { :lab , l , interpolate ( n / a_steps , { - 127.0 , 127.0 } ) , b } )
91
+ for ( n <- 0 .. gradient_steps , do: { :lab , interpolate ( n / gradient_steps , { 0.0 , 100.0 } ) , a , b } )
101
92
)
102
93
103
94
a_gradient_svg =
104
95
Styling . svg_linear_gradient (
105
96
"rotate(45)" ,
106
- for ( n <- 0 .. a_steps , do: { :lab , l , interpolate ( n / a_steps , { - 127.0 , 127.0 } ) , b } )
107
- )
108
-
109
- b_steps = 10
110
-
111
- b_gradient =
112
- Styling . linear_gradient (
113
- "150grad" ,
114
- for ( n <- 0 .. b_steps , do: { :lab , l , a , interpolate ( n / b_steps , { - 127.0 , 127.0 } ) } )
97
+ for ( n <- 0 .. gradient_steps , do: { :lab , l , interpolate ( n / gradient_steps , { - 127.0 , 127.0 } ) , b } )
115
98
)
116
99
117
100
b_gradient_svg =
118
101
Styling . svg_linear_gradient (
119
102
"rotate(45)" ,
120
- for ( n <- 0 .. b_steps , do: { :lab , l , a , interpolate ( n / b_steps , { - 127.0 , 127.0 } ) } )
103
+ for ( n <- 0 .. gradient_steps , do: { :lab , l , a , interpolate ( n / gradient_steps , { - 127.0 , 127.0 } ) } )
121
104
)
122
105
123
106
~L"""
@@ -126,35 +109,27 @@ defmodule ComponentsGuideWeb.ColorLive do
126
109
<rect fill="<%= State.css_srgb(@state) %>" width="1" height="1" />
127
110
</svg>
128
111
<div class="flex">
129
- <svg viewBox="0 0 1 1" width="100 " height="100" >
112
+ <svg viewBox="0 0 1 1" width="<%= swatch_size %> " height="<%= swatch_size %>" phx-hook=SwatchInput data-color-property=l >
130
113
<defs>
131
114
<%= l_gradient_svg %>
132
115
</defs>
133
116
<rect width="1" height="1" fill="url('#myGradient')" />
134
- <circle cx="<%= l / 100.0 %>" cy="<%= l / 100.0 %>" r="0.05" fill="white" stroke="black" stroke-width="0.01" />
117
+ <circle data-drag-knob cx="<%= l / 100.0 %>" cy="<%= l / 100.0 %>" r="0.05" fill="white" stroke="black" stroke-width="0.01" />
135
118
</svg>
136
- <svg viewBox="0 0 1 1" width="100 " height="100" >
119
+ <svg viewBox="0 0 1 1" width="<%= swatch_size %> " height="<%= swatch_size %>" phx-hook=SwatchInput data-color-property=a >
137
120
<defs>
138
121
<%= a_gradient_svg %>
139
122
</defs>
140
123
<rect width="1" height="1" fill="url('#myGradient')" />
141
124
<circle cx="<%= (a / 127.0) / 2.0 + 0.5 %>" cy="<%= (a / 127.0) / 2.0 + 0.5 %>" r="0.05" fill="white" stroke="black" stroke-width="0.01" />
142
125
</svg>
143
- <svg viewBox="0 0 1 1" width="100 " height="100" >
126
+ <svg viewBox="0 0 1 1" width="<%= swatch_size %> " height="<%= swatch_size %>" phx-hook=SwatchInput data-color-property=b >
144
127
<defs>
145
128
<%= b_gradient_svg %>
146
129
</defs>
147
130
<rect width="1" height="1" fill="url('#myGradient')" />
148
131
<circle cx="<%= (b / 127.0) / 2.0 + 0.5 %>" cy="<%= (b / 127.0) / 2.0 + 0.5 %>" r="0.05" fill="white" stroke="black" stroke-width="0.01" />
149
132
</svg>
150
- <!--<div style="width: 100px; height: 100px; background-image: <%= l_gradient %>"></div>-->
151
- <!--<div style="width: 100px; height: 100px; background-image: <%= a_gradient %>"></div>-->
152
- <div style="width: 100px; height: 100px; background-image: <%= b_gradient %>"></div>
153
- <svg width="100" height="100">
154
- <foreignObject>
155
- <div style="width: 100px; height: 100px; background-image: <%= b_gradient %>"></div>
156
- </foreignObject>
157
- </svg>
158
133
</div>
159
134
<form phx-change="lab_changed" class="flex flex-col">
160
135
<label>
@@ -209,12 +184,8 @@ defmodule ComponentsGuideWeb.ColorLive do
209
184
|> push_patch ( to: Routes . color_path ( socket , :lab , encoded ) , replace: true ) }
210
185
end
211
186
212
- def handle_event ( "lab_changed" , % { "l" => l , "a" => a , "b" => b } , socket ) do
213
- l = l |> String . to_integer ( )
214
- a = a |> String . to_integer ( )
215
- b = b |> String . to_integer ( )
216
-
217
- state = socket . assigns . state |> State . set_color ( { :lab , l , a , b } )
187
+ def change_color ( color , socket ) do
188
+ state = socket . assigns . state |> State . set_color ( color )
218
189
219
190
case socket . assigns . tref do
220
191
nil -> nil
@@ -232,4 +203,30 @@ defmodule ComponentsGuideWeb.ColorLive do
232
203
|> assign ( :tref , tref )
233
204
}
234
205
end
206
+
207
+ def handle_event ( "lab_changed" , % { "l" => l , "a" => a , "b" => b } , socket ) do
208
+ l = l |> String . to_integer ( )
209
+ a = a |> String . to_integer ( )
210
+ b = b |> String . to_integer ( )
211
+
212
+ { :lab , l , a , b } |> change_color ( socket )
213
+ end
214
+
215
+ def handle_event ( "color_property_changed" , % { "l" => l } , socket ) do
216
+ l = ( String . to_float ( l ) * 100 ) |> round ( )
217
+ { :lab , _ , a , b } = socket . assigns . state . color
218
+ { :lab , l , a , b } |> change_color ( socket )
219
+ end
220
+
221
+ def handle_event ( "color_property_changed" , % { "a" => a } , socket ) do
222
+ a = ( ( String . to_float ( a ) * 2 - 1.0 ) * 127 ) |> round ( )
223
+ { :lab , l , _ , b } = socket . assigns . state . color
224
+ { :lab , l , a , b } |> change_color ( socket )
225
+ end
226
+
227
+ def handle_event ( "color_property_changed" , % { "b" => b } , socket ) do
228
+ b = ( ( String . to_float ( b ) * 2 - 1.0 ) * 127 ) |> round ( )
229
+ { :lab , l , a , _ } = socket . assigns . state . color
230
+ { :lab , l , a , b } |> change_color ( socket )
231
+ end
235
232
end
0 commit comments