Skip to content

Commit df11fa8

Browse files
ayutazclaude
andcommitted
feat: カスタムカラーパレット機能を追加
- パレットモードの選択(自動生成/カスタム/プリセット) - カスタムパレットエディタUI実装 - 色の追加/削除/編集機能 - プリセットパレット6種類追加(GameBoy, NES, PICO-8, CGA, グレースケール, セピア) - カスタムパレットによる量子化アルゴリズム実装 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent e387800 commit df11fa8

3 files changed

Lines changed: 873 additions & 1 deletion

File tree

index.html

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,49 @@ <h1 class="title">Image to Pixel Art</h1>
3636
<h2 class="section-title">変換設定</h2>
3737
<div class="settings-grid">
3838
<div class="setting-group">
39+
<label class="setting-label">パレットモード</label>
40+
<div class="setting-control">
41+
<select id="paletteMode" class="select">
42+
<option value="auto">自動生成</option>
43+
<option value="custom">カスタムパレット</option>
44+
<option value="preset">プリセット</option>
45+
</select>
46+
</div>
47+
</div>
48+
49+
<div class="setting-group" id="autoColorGroup">
3950
<label class="setting-label">色数</label>
4051
<div class="setting-control">
4152
<input type="range" id="colorCount" class="slider" min="2" max="256" value="8">
4253
<span class="slider-value" id="colorCountValue">8</span>
4354
</div>
4455
</div>
4556

57+
<div class="setting-group" id="customPaletteGroup" style="display: none;">
58+
<label class="setting-label">カスタムパレット</label>
59+
<div class="color-palette-editor">
60+
<div class="color-palette-grid" id="colorPaletteGrid">
61+
<!-- Colors will be added dynamically -->
62+
</div>
63+
<button class="btn btn-small" id="addColorButton">色を追加</button>
64+
<button class="btn btn-small" id="clearPaletteButton">クリア</button>
65+
</div>
66+
</div>
67+
68+
<div class="setting-group" id="presetPaletteGroup" style="display: none;">
69+
<label class="setting-label">プリセットパレット</label>
70+
<div class="setting-control">
71+
<select id="presetPalette" class="select">
72+
<option value="gameboy">ゲームボーイ (4色)</option>
73+
<option value="nes">ファミコン (54色)</option>
74+
<option value="pico8">PICO-8 (16色)</option>
75+
<option value="cga">CGA (16色)</option>
76+
<option value="grayscale">グレースケール (8色)</option>
77+
<option value="sepia">セピア (8色)</option>
78+
</select>
79+
</div>
80+
</div>
81+
4682
<div class="setting-group">
4783
<label class="setting-label">ピクセルサイズ</label>
4884
<div class="setting-control">
@@ -117,6 +153,6 @@ <h2 class="section-title">変換結果</h2>
117153
<script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2.0.5/FileSaver.min.js"></script>
118154

119155
<!-- Main Application -->
120-
<script src="src/js/app-v2.js"></script>
156+
<script src="src/js/app-v3.js"></script>
121157
</body>
122158
</html>

src/css/main.css

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,13 +195,117 @@ body {
195195
border-color: #667eea;
196196
}
197197

198+
/* Color Palette Editor */
199+
.color-palette-editor {
200+
display: flex;
201+
flex-direction: column;
202+
gap: 12px;
203+
}
204+
205+
.color-palette-grid {
206+
display: grid;
207+
grid-template-columns: repeat(auto-fill, minmax(40px, 1fr));
208+
gap: 8px;
209+
padding: 12px;
210+
background: #f7fafc;
211+
border-radius: 8px;
212+
min-height: 60px;
213+
max-height: 200px;
214+
overflow-y: auto;
215+
}
216+
217+
.color-item {
218+
position: relative;
219+
width: 40px;
220+
height: 40px;
221+
border-radius: 6px;
222+
border: 2px solid #e2e8f0;
223+
cursor: pointer;
224+
transition: all 0.3s;
225+
}
226+
227+
.color-item:hover {
228+
transform: scale(1.1);
229+
border-color: #667eea;
230+
box-shadow: 0 2px 8px rgba(0,0,0,0.2);
231+
}
232+
233+
.color-item-remove {
234+
position: absolute;
235+
top: -6px;
236+
right: -6px;
237+
width: 18px;
238+
height: 18px;
239+
background: #e74c3c;
240+
color: white;
241+
border: none;
242+
border-radius: 50%;
243+
font-size: 10px;
244+
cursor: pointer;
245+
display: none;
246+
align-items: center;
247+
justify-content: center;
248+
}
249+
250+
.color-item:hover .color-item-remove {
251+
display: flex;
252+
}
253+
254+
.color-item-add {
255+
width: 40px;
256+
height: 40px;
257+
border: 2px dashed #cbd5e0;
258+
border-radius: 6px;
259+
background: white;
260+
cursor: pointer;
261+
display: flex;
262+
align-items: center;
263+
justify-content: center;
264+
color: #a0aec0;
265+
font-size: 24px;
266+
transition: all 0.3s;
267+
}
268+
269+
.color-item-add:hover {
270+
border-color: #667eea;
271+
color: #667eea;
272+
background: #f7fafc;
273+
}
274+
275+
.color-picker-popup {
276+
position: fixed;
277+
top: 50%;
278+
left: 50%;
279+
transform: translate(-50%, -50%);
280+
background: white;
281+
padding: 24px;
282+
border-radius: 12px;
283+
box-shadow: 0 10px 40px rgba(0,0,0,0.3);
284+
z-index: 1001;
285+
}
286+
287+
.color-picker-overlay {
288+
position: fixed;
289+
top: 0;
290+
left: 0;
291+
right: 0;
292+
bottom: 0;
293+
background: rgba(0,0,0,0.5);
294+
z-index: 1000;
295+
}
296+
198297
/* Buttons */
199298
.button-group {
200299
display: flex;
201300
gap: 16px;
202301
justify-content: center;
203302
}
204303

304+
.btn-small {
305+
padding: 6px 16px;
306+
font-size: 14px;
307+
}
308+
205309
.btn {
206310
padding: 12px 32px;
207311
border: none;

0 commit comments

Comments
 (0)