mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-04 02:14:01 +00:00
- The selected sequence is drawn past the per-tile caps again, and its highlight takes every loaded part, drawn or not: in a dense tile a clicked Mapillary or Panoramax line kept its cones but lost its line. - photoViewer tries :fullscreen and :popover-open one at a time, each in its own try: Safari before 16.4 parses neither, and the fallback threw on every flat KartaView or Panoramax photo. - A lit Street View off Google 3D says it needs the Google 3D map again, instead of "every provider is switched off". - Chips carry their provider colour again (--chip-color, as on main). Each comes with the test that reproduced it. Co-Authored-By: Claude Opus 5.5 <[email protected]>
54 lines
1.9 KiB
JavaScript
54 lines
1.9 KiB
JavaScript
const set = (node, key, value) => {
|
|
if (node[key] !== value) node[key] = value;
|
|
};
|
|
const attribute = (node, key, value) => {
|
|
if (node.getAttribute(key) !== value) node.setAttribute(key, value);
|
|
};
|
|
|
|
/** Keyed chips shared by layer rows and rail cards; the caller owns dispatch. */
|
|
export function syncChipGroup(container, chips = [], { before = null } = {}) {
|
|
if (!container) return;
|
|
const document = container.ownerDocument ?? globalThis.document;
|
|
const stale = new Map();
|
|
for (const node of [...container.children])
|
|
if (node.dataset?.chipId) stale.set(node.dataset.chipId, node);
|
|
const ordered = [];
|
|
for (const chip of chips) {
|
|
let button = stale.get(chip.id);
|
|
stale.delete(chip.id);
|
|
if (!button) {
|
|
button = document.createElement('button');
|
|
button.type = 'button';
|
|
button.dataset.chipId = chip.id;
|
|
}
|
|
const state = chip.state || (chip.active ? 'active' : 'idle');
|
|
set(
|
|
button,
|
|
'className',
|
|
`data-toggle-chip chip-${state}${chip.active ? ' active' : ''}`,
|
|
);
|
|
set(button, 'textContent', chip.label);
|
|
// Optional per-chip colour; CSS decides how it is used.
|
|
const color = chip.color || '';
|
|
if ((button.dataset.chipColor || '') !== color) {
|
|
if (color) {
|
|
button.style.setProperty('--chip-color', color);
|
|
button.dataset.chipColor = color;
|
|
} else {
|
|
button.style.removeProperty('--chip-color');
|
|
delete button.dataset.chipColor;
|
|
}
|
|
}
|
|
set(button, 'title', chip.title || '');
|
|
set(button, 'disabled', Boolean(chip.disabled));
|
|
attribute(button, 'aria-pressed', String(Boolean(chip.active)));
|
|
attribute(button, 'aria-busy', String(Boolean(chip.busy)));
|
|
ordered.push(button);
|
|
}
|
|
for (const node of stale.values()) node.remove();
|
|
ordered.forEach((node, index) => {
|
|
if (container.children[index] !== node)
|
|
container.insertBefore(node, container.children[index] || before);
|
|
});
|
|
}
|