tokimeki-image-editor 0.1.8 → 0.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -12,310 +12,344 @@ function resetAll() {
12
12
  shadows: 0,
13
13
  brightness: 0,
14
14
  saturation: 0,
15
- hue: 0,
15
+ temperature: 0,
16
16
  vignette: 0,
17
17
  sepia: 0,
18
- grayscale: 0
18
+ grayscale: 0,
19
+ blur: 0,
20
+ grain: 0
19
21
  });
20
22
  }
21
23
  // Prevent wheel events from propagating to canvas zoom handler
22
24
  function handleWheel(e) {
23
25
  e.stopPropagation();
24
26
  }
25
- </script>
26
-
27
- <div class="adjust-tool" onwheel={handleWheel}>
28
- <div class="tool-header">
29
- <h3>{$_('editor.adjust')}</h3>
30
- <button class="close-btn" onclick={onClose} title={$_('editor.close')}>
31
- <X size={20} />
32
- </button>
33
- </div>
34
-
35
- <div class="adjustments-grid">
36
- <!-- Exposure -->
37
- <div class="adjustment-control">
38
- <label for="exposure">
39
- <span>{$_('adjustments.exposure')}</span>
40
- <span class="value">{adjustments.exposure}</span>
41
- </label>
42
- <input
43
- id="exposure"
44
- type="range"
45
- min="-100"
46
- max="100"
47
- value={adjustments.exposure}
48
- oninput={(e) => handleChange('exposure', Number(e.currentTarget.value))}
49
- />
50
- </div>
51
-
52
- <!-- Brightness -->
53
- <div class="adjustment-control">
54
- <label for="brightness">
55
- <span>{$_('adjustments.brightness')}</span>
56
- <span class="value">{adjustments.brightness}</span>
57
- </label>
58
- <input
59
- id="brightness"
60
- type="range"
61
- min="-100"
62
- max="100"
63
- value={adjustments.brightness}
64
- oninput={(e) => handleChange('brightness', Number(e.currentTarget.value))}
65
- />
66
- </div>
67
-
68
- <!-- Contrast -->
69
- <div class="adjustment-control">
70
- <label for="contrast">
71
- <span>{$_('adjustments.contrast')}</span>
72
- <span class="value">{adjustments.contrast}</span>
73
- </label>
74
- <input
75
- id="contrast"
76
- type="range"
77
- min="-100"
78
- max="100"
79
- value={adjustments.contrast}
80
- oninput={(e) => handleChange('contrast', Number(e.currentTarget.value))}
81
- />
82
- </div>
83
-
84
- <!-- Highlights -->
85
- <div class="adjustment-control">
86
- <label for="highlights">
87
- <span>{$_('adjustments.highlights')}</span>
88
- <span class="value">{adjustments.highlights}</span>
89
- </label>
90
- <input
91
- id="highlights"
92
- type="range"
93
- min="-100"
94
- max="100"
95
- value={adjustments.highlights}
96
- oninput={(e) => handleChange('highlights', Number(e.currentTarget.value))}
97
- />
98
- </div>
99
-
100
- <!-- Shadows -->
101
- <div class="adjustment-control">
102
- <label for="shadows">
103
- <span>{$_('adjustments.shadows')}</span>
104
- <span class="value">{adjustments.shadows}</span>
105
- </label>
106
- <input
107
- id="shadows"
108
- type="range"
109
- min="-100"
110
- max="100"
111
- value={adjustments.shadows}
112
- oninput={(e) => handleChange('shadows', Number(e.currentTarget.value))}
113
- />
114
- </div>
115
-
116
- <!-- Saturation -->
117
- <div class="adjustment-control">
118
- <label for="saturation">
119
- <span>{$_('adjustments.saturation')}</span>
120
- <span class="value">{adjustments.saturation}</span>
121
- </label>
122
- <input
123
- id="saturation"
124
- type="range"
125
- min="-100"
126
- max="100"
127
- value={adjustments.saturation}
128
- oninput={(e) => handleChange('saturation', Number(e.currentTarget.value))}
129
- />
130
- </div>
131
-
132
- <!-- Hue -->
133
- <div class="adjustment-control">
134
- <label for="hue">
135
- <span>{$_('adjustments.hue')}</span>
136
- <span class="value">{adjustments.hue}°</span>
137
- </label>
138
- <input
139
- id="hue"
140
- type="range"
141
- min="-180"
142
- max="180"
143
- value={adjustments.hue}
144
- oninput={(e) => handleChange('hue', Number(e.currentTarget.value))}
145
- />
146
- </div>
147
-
148
- <!-- Vignette -->
149
- <div class="adjustment-control">
150
- <label for="vignette">
151
- <span>{$_('adjustments.vignette')}</span>
152
- <span class="value">{adjustments.vignette}</span>
153
- </label>
154
- <input
155
- id="vignette"
156
- type="range"
157
- min="-100"
158
- max="100"
159
- value={adjustments.vignette}
160
- oninput={(e) => handleChange('vignette', Number(e.currentTarget.value))}
161
- />
162
- </div>
163
- </div>
164
-
165
- <div class="tool-actions">
166
- <button class="btn btn-secondary" onclick={resetAll}>
167
- {$_('editor.reset')}
168
- </button>
169
- </div>
170
- </div>
171
-
172
- <style>
173
- .adjust-tool {
174
- display: flex;
175
- flex-direction: column;
176
- gap: 1rem;
177
- }
178
-
179
- .tool-header {
180
- display: flex;
181
- justify-content: space-between;
182
- align-items: center;
183
- }
184
-
185
- .tool-header h3 {
186
- margin: 0;
187
- font-size: 1.1rem;
188
- color: #fff;
189
- }
190
-
191
- .close-btn {
192
- display: flex;
193
- align-items: center;
194
- justify-content: center;
195
- padding: 0.25rem;
196
- background: transparent;
197
- border: none;
198
- color: #999;
199
- cursor: pointer;
200
- border-radius: 4px;
201
- transition: all 0.2s;
202
- }
203
-
204
- .close-btn:hover {
205
- background: #444;
206
- color: #fff;
207
- }
208
-
209
- .adjustments-grid {
210
- display: grid;
211
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
212
- gap: 1rem;
213
- }
214
-
215
- @media (max-width: 767px) {
216
-
217
- .adjustments-grid {
218
- grid-template-columns: 1fr;
219
- gap: 0.75rem;
220
- max-height: 35vh;
221
- overflow-y: auto
222
- }
223
- }
224
-
225
- .adjustment-control {
226
- display: flex;
227
- flex-direction: column;
228
- gap: 0.5rem;
229
- }
230
-
231
- @media (max-width: 767px) {
232
-
233
- .adjustment-control {
234
- gap: 0.3rem
235
- }
236
- }
237
-
238
- .adjustment-control label {
239
- display: flex;
240
- justify-content: space-between;
241
- align-items: center;
242
- font-size: 0.85rem;
243
- color: #ccc;
244
- }
245
-
246
- @media (max-width: 767px) {
247
-
248
- .adjustment-control label {
249
- font-size: 0.8rem
250
- }
251
- }
252
-
253
- .adjustment-control .value {
254
- color: var(--primary-color, #63b97b);
255
- font-weight: 600;
256
- min-width: 3rem;
257
- text-align: right;
258
- }
259
-
260
- .adjustment-control input[type='range'] {
261
- width: 100%;
262
- height: 6px;
263
- background: #444;
264
- border-radius: 3px;
265
- outline: none;
266
- cursor: pointer;
267
- }
268
-
269
- .adjustment-control input[type='range']::-webkit-slider-thumb {
270
- appearance: none;
271
- width: 16px;
272
- height: 16px;
273
- background: var(--primary-color, #63b97b);
274
- border-radius: 50%;
275
- cursor: pointer;
276
- transition: all 0.2s;
277
- }
278
-
279
- .adjustment-control input[type='range']::-webkit-slider-thumb:hover {
280
- background: var(--primary-color, #63b97b);
281
- transform: scale(1.1);
282
- }
283
-
284
- .adjustment-control input[type='range']::-moz-range-thumb {
285
- width: 16px;
286
- height: 16px;
287
- background: var(--primary-color, #63b97b);
288
- border: none;
289
- border-radius: 50%;
290
- cursor: pointer;
291
- transition: all 0.2s;
292
- }
293
-
294
- .adjustment-control input[type='range']::-moz-range-thumb:hover {
295
- background: var(--primary-color, #63b97b);
296
- transform: scale(1.1);
297
- }
298
-
299
- .tool-actions {
300
- display: flex;
301
- justify-content: flex-end;
302
- gap: 0.5rem;
303
- }
304
-
305
- .btn {
306
- padding: 0.5rem 1rem;
307
- border: none;
308
- border-radius: 4px;
309
- cursor: pointer;
310
- font-size: 0.9rem;
311
- transition: all 0.2s;
312
- }
313
-
314
- .btn-secondary {
315
- background: #666;
316
- color: #fff;
317
- }
318
-
319
- .btn-secondary:hover {
320
- background: #777;
321
- }</style>
27
+ </script>
28
+
29
+ <div class="adjust-tool" onwheel={handleWheel}>
30
+ <div class="tool-header">
31
+ <h3>{$_('editor.adjust')}</h3>
32
+ <button class="close-btn" onclick={onClose} title={$_('editor.close')}>
33
+ <X size={20} />
34
+ </button>
35
+ </div>
36
+
37
+ <div class="adjustments-grid">
38
+ <!-- Exposure -->
39
+ <div class="adjustment-control">
40
+ <label for="exposure">
41
+ <span>{$_('adjustments.exposure')}</span>
42
+ <span class="value">{adjustments.exposure}</span>
43
+ </label>
44
+ <input
45
+ id="exposure"
46
+ type="range"
47
+ min="-100"
48
+ max="100"
49
+ value={adjustments.exposure}
50
+ oninput={(e) => handleChange('exposure', Number(e.currentTarget.value))}
51
+ />
52
+ </div>
53
+
54
+ <!-- Brightness -->
55
+ <div class="adjustment-control">
56
+ <label for="brightness">
57
+ <span>{$_('adjustments.brightness')}</span>
58
+ <span class="value">{adjustments.brightness}</span>
59
+ </label>
60
+ <input
61
+ id="brightness"
62
+ type="range"
63
+ min="-100"
64
+ max="100"
65
+ value={adjustments.brightness}
66
+ oninput={(e) => handleChange('brightness', Number(e.currentTarget.value))}
67
+ />
68
+ </div>
69
+
70
+ <!-- Contrast -->
71
+ <div class="adjustment-control">
72
+ <label for="contrast">
73
+ <span>{$_('adjustments.contrast')}</span>
74
+ <span class="value">{adjustments.contrast}</span>
75
+ </label>
76
+ <input
77
+ id="contrast"
78
+ type="range"
79
+ min="-100"
80
+ max="100"
81
+ value={adjustments.contrast}
82
+ oninput={(e) => handleChange('contrast', Number(e.currentTarget.value))}
83
+ />
84
+ </div>
85
+
86
+ <!-- Highlights -->
87
+ <div class="adjustment-control">
88
+ <label for="highlights">
89
+ <span>{$_('adjustments.highlights')}</span>
90
+ <span class="value">{adjustments.highlights}</span>
91
+ </label>
92
+ <input
93
+ id="highlights"
94
+ type="range"
95
+ min="-100"
96
+ max="100"
97
+ value={adjustments.highlights}
98
+ oninput={(e) => handleChange('highlights', Number(e.currentTarget.value))}
99
+ />
100
+ </div>
101
+
102
+ <!-- Shadows -->
103
+ <div class="adjustment-control">
104
+ <label for="shadows">
105
+ <span>{$_('adjustments.shadows')}</span>
106
+ <span class="value">{adjustments.shadows}</span>
107
+ </label>
108
+ <input
109
+ id="shadows"
110
+ type="range"
111
+ min="-100"
112
+ max="100"
113
+ value={adjustments.shadows}
114
+ oninput={(e) => handleChange('shadows', Number(e.currentTarget.value))}
115
+ />
116
+ </div>
117
+
118
+ <!-- Saturation -->
119
+ <div class="adjustment-control">
120
+ <label for="saturation">
121
+ <span>{$_('adjustments.saturation')}</span>
122
+ <span class="value">{adjustments.saturation}</span>
123
+ </label>
124
+ <input
125
+ id="saturation"
126
+ type="range"
127
+ min="-100"
128
+ max="100"
129
+ value={adjustments.saturation}
130
+ oninput={(e) => handleChange('saturation', Number(e.currentTarget.value))}
131
+ />
132
+ </div>
133
+
134
+ <!-- Temperature -->
135
+ <div class="adjustment-control">
136
+ <label for="temperature">
137
+ <span>{$_('adjustments.temperature')}</span>
138
+ <span class="value">{adjustments.temperature}</span>
139
+ </label>
140
+ <input
141
+ id="temperature"
142
+ type="range"
143
+ min="-100"
144
+ max="100"
145
+ value={adjustments.temperature}
146
+ oninput={(e) => handleChange('temperature', Number(e.currentTarget.value))}
147
+ />
148
+ </div>
149
+
150
+ <!-- Vignette -->
151
+ <div class="adjustment-control">
152
+ <label for="vignette">
153
+ <span>{$_('adjustments.vignette')}</span>
154
+ <span class="value">{adjustments.vignette}</span>
155
+ </label>
156
+ <input
157
+ id="vignette"
158
+ type="range"
159
+ min="-100"
160
+ max="100"
161
+ value={adjustments.vignette}
162
+ oninput={(e) => handleChange('vignette', Number(e.currentTarget.value))}
163
+ />
164
+ </div>
165
+
166
+ <!-- Blur -->
167
+ <div class="adjustment-control">
168
+ <label for="blur">
169
+ <span>{$_('adjustments.blur')}</span>
170
+ <span class="value">{adjustments.blur}</span>
171
+ </label>
172
+ <input
173
+ id="blur"
174
+ type="range"
175
+ min="0"
176
+ max="100"
177
+ value={adjustments.blur}
178
+ oninput={(e) => handleChange('blur', Number(e.currentTarget.value))}
179
+ />
180
+ </div>
181
+
182
+ <!-- Film Grain -->
183
+ <div class="adjustment-control">
184
+ <label for="grain">
185
+ <span>{$_('adjustments.grain')}</span>
186
+ <span class="value">{adjustments.grain}</span>
187
+ </label>
188
+ <input
189
+ id="grain"
190
+ type="range"
191
+ min="0"
192
+ max="100"
193
+ value={adjustments.grain}
194
+ oninput={(e) => handleChange('grain', Number(e.currentTarget.value))}
195
+ />
196
+ </div>
197
+ </div>
198
+
199
+ <div class="tool-actions">
200
+ <button class="btn btn-secondary" onclick={resetAll}>
201
+ {$_('editor.reset')}
202
+ </button>
203
+ </div>
204
+ </div>
205
+
206
+ <style>
207
+ .adjust-tool {
208
+ display: flex;
209
+ flex-direction: column;
210
+ gap: 1rem;
211
+ }
212
+
213
+ .tool-header {
214
+ display: flex;
215
+ justify-content: space-between;
216
+ align-items: center;
217
+ }
218
+
219
+ .tool-header h3 {
220
+ margin: 0;
221
+ font-size: 1.1rem;
222
+ color: #fff;
223
+ }
224
+
225
+ .close-btn {
226
+ display: flex;
227
+ align-items: center;
228
+ justify-content: center;
229
+ padding: 0.25rem;
230
+ background: transparent;
231
+ border: none;
232
+ color: #999;
233
+ cursor: pointer;
234
+ border-radius: 4px;
235
+ transition: all 0.2s;
236
+ }
237
+
238
+ .close-btn:hover {
239
+ background: #444;
240
+ color: #fff;
241
+ }
242
+
243
+ .adjustments-grid {
244
+ display: grid;
245
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
246
+ gap: 1rem;
247
+ }
248
+
249
+ @media (max-width: 767px) {
250
+
251
+ .adjustments-grid {
252
+ grid-template-columns: 1fr;
253
+ gap: 0.75rem;
254
+ max-height: 35vh;
255
+ overflow-y: auto
256
+ }
257
+ }
258
+
259
+ .adjustment-control {
260
+ display: flex;
261
+ flex-direction: column;
262
+ gap: 0.5rem;
263
+ }
264
+
265
+ @media (max-width: 767px) {
266
+
267
+ .adjustment-control {
268
+ gap: 0.3rem
269
+ }
270
+ }
271
+
272
+ .adjustment-control label {
273
+ display: flex;
274
+ justify-content: space-between;
275
+ align-items: center;
276
+ font-size: 0.85rem;
277
+ color: #ccc;
278
+ }
279
+
280
+ @media (max-width: 767px) {
281
+
282
+ .adjustment-control label {
283
+ font-size: 0.8rem
284
+ }
285
+ }
286
+
287
+ .adjustment-control .value {
288
+ color: var(--primary-color, #63b97b);
289
+ font-weight: 600;
290
+ min-width: 3rem;
291
+ text-align: right;
292
+ }
293
+
294
+ .adjustment-control input[type='range'] {
295
+ width: 100%;
296
+ height: 6px;
297
+ background: #444;
298
+ border-radius: 3px;
299
+ outline: none;
300
+ cursor: pointer;
301
+ }
302
+
303
+ .adjustment-control input[type='range']::-webkit-slider-thumb {
304
+ appearance: none;
305
+ width: 16px;
306
+ height: 16px;
307
+ background: var(--primary-color, #63b97b);
308
+ border-radius: 50%;
309
+ cursor: pointer;
310
+ transition: all 0.2s;
311
+ }
312
+
313
+ .adjustment-control input[type='range']::-webkit-slider-thumb:hover {
314
+ background: var(--primary-color, #63b97b);
315
+ transform: scale(1.1);
316
+ }
317
+
318
+ .adjustment-control input[type='range']::-moz-range-thumb {
319
+ width: 16px;
320
+ height: 16px;
321
+ background: var(--primary-color, #63b97b);
322
+ border: none;
323
+ border-radius: 50%;
324
+ cursor: pointer;
325
+ transition: all 0.2s;
326
+ }
327
+
328
+ .adjustment-control input[type='range']::-moz-range-thumb:hover {
329
+ background: var(--primary-color, #63b97b);
330
+ transform: scale(1.1);
331
+ }
332
+
333
+ .tool-actions {
334
+ display: flex;
335
+ justify-content: flex-end;
336
+ gap: 0.5rem;
337
+ }
338
+
339
+ .btn {
340
+ padding: 0.5rem 1rem;
341
+ border: none;
342
+ border-radius: 4px;
343
+ cursor: pointer;
344
+ font-size: 0.9rem;
345
+ transition: all 0.2s;
346
+ }
347
+
348
+ .btn-secondary {
349
+ background: #666;
350
+ color: #fff;
351
+ }
352
+
353
+ .btn-secondary:hover {
354
+ background: #777;
355
+ }</style>