|
12 | 12 | let { activeLayer = $bindable(undefined), pointerupTimestamp } = $props(); |
13 | 13 |
|
14 | 14 | let layers: oekaki.LayeredCanvas[] = $state([]); |
| 15 | + let reversedLayers = $derived([...layers].reverse()); |
| 16 | +
|
15 | 17 | $effect(() => { |
16 | 18 | if (!activeLayer) return; |
17 | 19 | layers = oekaki.getLayers(); |
18 | 20 | }); |
19 | 21 |
|
20 | 22 | const moveLayerUp = (layer: oekaki.LayeredCanvas) => { |
21 | | - const { below } = layer; |
22 | | - if (below) { |
23 | | - layer.swap(below.index); |
| 23 | + const { above } = layer; |
| 24 | + if (above) { |
| 25 | + layer.swap(above.index); |
24 | 26 | layers = oekaki.getLayers(); |
25 | 27 | } |
26 | 28 | }; |
27 | 29 |
|
28 | 30 | const moveLayerDown = (layer: oekaki.LayeredCanvas) => { |
29 | | - const { above } = layer; |
30 | | - if (above) { |
31 | | - layer.swap(above.index); |
| 31 | + const { below } = layer; |
| 32 | + if (below) { |
| 33 | + layer.swap(below.index); |
32 | 34 | layers = oekaki.getLayers(); |
33 | 35 | } |
34 | 36 | }; |
35 | 37 |
|
36 | 38 | const addLayer = () => { |
37 | | - activeLayer = new oekaki.LayeredCanvas( |
38 | | - `レイヤー #${layers.length + 1}`, |
39 | | - ); |
| 39 | + const newLayer = new oekaki.LayeredCanvas(); |
| 40 | + newLayer.name = `レイヤー #${newLayer.index + 1}`; |
| 41 | + activeLayer = newLayer; |
40 | 42 | }; |
41 | 43 | </script> |
42 | 44 |
|
43 | 45 | <div |
44 | 46 | class="p-4 bg-white rounded shadow-md w-full max-w-md mx-auto max-h-[50vh] flex flex-col select-none" |
45 | 47 | > |
46 | | - <div class="flex items-center text-xs text-gray-500"> |
47 | | - <ArrowUpIcon class="w-4 h-4 mr-1" /> |
48 | | - 最背面 |
49 | | - </div> |
| 48 | + <button |
| 49 | + class="flex items-center justify-center py-1 bg-blue-500 text-white rounded hover:bg-blue-600" |
| 50 | + onclick={addLayer} |
| 51 | + > |
| 52 | + <PlusIcon class="w-4 h-4 mr-2" /> |
| 53 | + レイヤー追加 |
| 54 | + </button> |
50 | 55 |
|
51 | 56 | <!-- レイヤーリスト(スクロール可能部分) --> |
52 | 57 | <ul class="divide-y divide-gray-200 overflow-auto flex-1 min-h-0"> |
53 | | - {#each layers as layer} |
| 58 | + {#each reversedLayers as layer} |
54 | 59 | {#key activeLayer === layer ? pointerupTimestamp : "noop"} |
55 | 60 | <li |
56 | 61 | class="flex items-center justify-between p-2 cursor-pointer {activeLayer === |
|
134 | 139 | {/key} |
135 | 140 | {/each} |
136 | 141 | </ul> |
137 | | - |
138 | | - <div class="flex items-center text-xs text-gray-500"> |
139 | | - <ArrowDownIcon class="w-4 h-4 mr-1" /> |
140 | | - 最前面 |
141 | | - </div> |
142 | | - |
143 | | - <button |
144 | | - class="flex items-center justify-center py-1 bg-blue-500 text-white rounded hover:bg-blue-600" |
145 | | - onclick={addLayer} |
146 | | - > |
147 | | - <PlusIcon class="w-4 h-4 mr-2" /> |
148 | | - レイヤー追加 |
149 | | - </button> |
150 | 142 | </div> |
0 commit comments