Skip to content

Commit 78f8115

Browse files
committed
more
1 parent 4791d5d commit 78f8115

3 files changed

Lines changed: 126 additions & 31 deletions

File tree

css/grid.css

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,21 @@ h1 {
225225
color: var(--muted);
226226
white-space: nowrap;
227227
}
228+
.grid-sizing-toggle {
229+
display: flex;
230+
align-items: center;
231+
gap: 6px;
232+
flex: 0 0 auto;
233+
font-size: 12px;
234+
color: var(--label);
235+
cursor: pointer;
236+
user-select: none;
237+
}
238+
.grid-sizing-toggle input {
239+
margin: 0;
240+
accent-color: #c0c0c0;
241+
cursor: pointer;
242+
}
228243
.grid-wrap {
229244
position: relative;
230245
width: 100%;
@@ -718,14 +733,17 @@ button.tool[aria-pressed="true"] {
718733
width: 100%;
719734
max-width: 100%;
720735
flex-shrink: 0;
721-
max-height: min(72dvh, 100%);
736+
overflow: visible;
722737
}
723738
.grid-stage {
739+
flex: 0 0 auto;
724740
width: 100%;
725-
container-type: size;
741+
min-height: auto;
726742
}
727743
.grid-stage .grid-wrap {
728-
width: min(100cqw, 100cqh);
744+
width: 100%;
745+
height: auto;
746+
max-height: none;
729747
}
730748
.palette-panel {
731749
width: 100%;

grid.html

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,10 @@ <h1>Color Grid</h1>
132132
<output id="silverSizeVal" for="silverSize"></output>
133133
</label>
134134
<p class="grid-sizing-units" id="silverSizeUnits" aria-live="polite" title="Band width on a 96-unit axis">4 silver · 4 paint</p>
135+
<label class="grid-sizing-toggle">
136+
<input type="checkbox" id="compactGridToggle">
137+
<span>Drop center row &amp; column</span>
138+
</label>
135139
</div>
136140
</section>
137141
<section class="palette-panel">
@@ -171,6 +175,6 @@ <h2>Recently used</h2>
171175
</div>
172176
</div>
173177
<script src="./js/paint-palette-data.js"></script>
174-
<script src="./js/grid.js?v=8" defer></script>
178+
<script src="./js/grid.js?v=10" defer></script>
175179
</body>
176180
</html>

js/grid.js

Lines changed: 100 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
(function () {
2-
var SILVER_INDICES = new Set([0, 2, 4, 6, 8, 10, 13, 15, 17, 19, 21, 23]);
2+
var GRID_FULL = 24;
3+
var GRID_COMPACT = 23;
4+
var MIDDLE_SKIP = 11;
5+
var SILVER_SPLIT = [0, 2, 4, 6, 8, 10, 13, 15, 17, 19, 21, 23];
6+
var compactGrid = false;
7+
var silverIndices = new Set(SILVER_SPLIT);
38
var SILVER_HEX = '#c0c0c0';
49
var BLACK_HEX = '#000000';
510
var WHITE_HEX = '#ffffff';
@@ -19,8 +24,81 @@
1924
var strokeColor = null;
2025
var silverWeight = 1;
2126

27+
function gridSize() {
28+
return compactGrid ? GRID_COMPACT : GRID_FULL;
29+
}
30+
31+
function paintBandCount() {
32+
return compactGrid ? 11 : 12;
33+
}
34+
35+
function buildCompactSilverIndices() {
36+
var indices = [];
37+
for (var i = 0; i < GRID_COMPACT; i += 2) indices.push(i);
38+
return indices;
39+
}
40+
41+
function updateSilverIndices() {
42+
silverIndices = new Set(compactGrid ? buildCompactSilverIndices() : SILVER_SPLIT);
43+
}
44+
2245
function isSilverIndex(i) {
23-
return SILVER_INDICES.has(i);
46+
return silverIndices.has(i);
47+
}
48+
49+
function copyCellFill(srcTd, destTd) {
50+
if (!srcTd || destTd.classList.contains('silver')) return;
51+
if (srcTd.classList.contains('filled') && srcTd.style.background && !srcTd.classList.contains('silver')) {
52+
destTd.style.background = srcTd.style.background;
53+
destTd.classList.add('filled');
54+
}
55+
}
56+
57+
function rebuildGrid() {
58+
var oldCells = cells;
59+
var size = gridSize();
60+
var table = document.getElementById('grid');
61+
table.innerHTML = '';
62+
cells = [];
63+
64+
for (var r = 0; r < size; r++) {
65+
var tr = document.createElement('tr');
66+
var row = [];
67+
for (var c = 0; c < size; c++) {
68+
var td = document.createElement('td');
69+
td.dataset.r = r;
70+
td.dataset.c = c;
71+
if (isSilverCell(r, c)) td.classList.add('silver');
72+
73+
if (oldCells.length) {
74+
var srcTd = null;
75+
if (compactGrid && oldCells.length === GRID_FULL) {
76+
srcTd = oldCells[r < MIDDLE_SKIP ? r : r + 1][c < MIDDLE_SKIP ? c : c + 1];
77+
} else if (!compactGrid && oldCells.length === GRID_COMPACT) {
78+
if (r !== MIDDLE_SKIP && c !== MIDDLE_SKIP) {
79+
srcTd = oldCells[r < MIDDLE_SKIP ? r : r - 1][c < MIDDLE_SKIP ? c : c - 1];
80+
}
81+
} else {
82+
srcTd = oldCells[r][c];
83+
}
84+
copyCellFill(srcTd, td);
85+
}
86+
87+
tr.appendChild(td);
88+
row.push(td);
89+
}
90+
table.appendChild(tr);
91+
cells.push(row);
92+
}
93+
sizingAttempts = 0;
94+
scheduleGridSizing();
95+
}
96+
97+
function setCompactGrid(on) {
98+
if (compactGrid === on) return;
99+
compactGrid = on;
100+
updateSilverIndices();
101+
rebuildGrid();
24102
}
25103

26104
function isSilverCell(r, c) {
@@ -54,12 +132,17 @@
54132
var h = Math.round(rect.height);
55133
if (w < 1 || h < 1) return;
56134

57-
var colSizes = axisPixelSizes(w, 24, colWeight);
58-
var rowSizes = axisPixelSizes(h, 24, rowWeight);
135+
var size = gridSize();
136+
var colSizes = axisPixelSizes(w, size, colWeight);
137+
var rowSizes = axisPixelSizes(h, size, rowWeight);
59138
var colgroup = table.querySelector('colgroup');
139+
if (colgroup && colgroup.children.length !== size) {
140+
colgroup.remove();
141+
colgroup = null;
142+
}
60143
if (!colgroup) {
61144
colgroup = document.createElement('colgroup');
62-
for (var c = 0; c < 24; c++) {
145+
for (var c = 0; c < size; c++) {
63146
colgroup.appendChild(document.createElement('col'));
64147
}
65148
table.insertBefore(colgroup, table.firstChild);
@@ -69,7 +152,7 @@
69152
colgroup.querySelectorAll('col').forEach(function (col, c) {
70153
col.style.width = colSizes[c] + 'px';
71154
});
72-
for (var r = 0; r < 24; r++) {
155+
for (var r = 0; r < size; r++) {
73156
table.rows[r].style.height = rowSizes[r] + 'px';
74157
}
75158
}
@@ -127,22 +210,7 @@
127210
}
128211

129212
function buildGrid() {
130-
var table = document.getElementById('grid');
131-
cells = [];
132-
for (var r = 0; r < 24; r++) {
133-
var tr = document.createElement('tr');
134-
var row = [];
135-
for (var c = 0; c < 24; c++) {
136-
var td = document.createElement('td');
137-
td.dataset.r = r;
138-
td.dataset.c = c;
139-
if (isSilverCell(r, c)) td.classList.add('silver');
140-
tr.appendChild(td);
141-
row.push(td);
142-
}
143-
table.appendChild(tr);
144-
cells.push(row);
145-
}
213+
rebuildGrid();
146214
}
147215

148216
function hexToRgb(hex) {
@@ -529,8 +597,9 @@
529597

530598
function saveImage() {
531599
var gridPx = 480;
532-
var colSizes = axisPixelSizes(gridPx, 24, colWeight);
533-
var rowSizes = axisPixelSizes(gridPx, 24, rowWeight);
600+
var size = gridSize();
601+
var colSizes = axisPixelSizes(gridPx, size, colWeight);
602+
var rowSizes = axisPixelSizes(gridPx, size, rowWeight);
534603
var borderPx = 32;
535604
var text = 'thanks for coming ❋ zesameri';
536605
var textGap = 36;
@@ -545,10 +614,10 @@
545614
ctx.fillRect(0, 0, canvas.width, canvas.height);
546615

547616
var rowY = borderPx;
548-
for (var r = 0; r < 24; r++) {
617+
for (var r = 0; r < size; r++) {
549618
var colX = borderPx;
550619
var cellH = rowSizes[r];
551-
for (var c = 0; c < 24; c++) {
620+
for (var c = 0; c < size; c++) {
552621
var cellW = colSizes[c];
553622
ctx.fillStyle = getCellFill(cells[r][c]);
554623
ctx.fillRect(colX, rowY, cellW, cellH);
@@ -867,7 +936,7 @@
867936

868937
function bandWidthsOnAxis(weight) {
869938
var silverCount = 12;
870-
var paintCount = 12;
939+
var paintCount = paintBandCount();
871940
var totalWeight = silverCount * weight + paintCount;
872941
return {
873942
silver: (AXIS_UNITS * weight) / totalWeight,
@@ -900,6 +969,10 @@
900969
watchGridResize();
901970
scheduleGridSizing();
902971
bindSilverSizing('silverSize', 'silverSizeVal', 'silverSizeUnits', function (v) { silverWeight = v; });
972+
document.getElementById('compactGridToggle').addEventListener('change', function (e) {
973+
setCompactGrid(e.target.checked);
974+
document.getElementById('silverSizeUnits').textContent = formatBandWidths(silverWeight);
975+
});
903976
updateRampTargetUI();
904977
setBorders(false);
905978
updateCurrentUI();

0 commit comments

Comments
 (0)