added symbols for later breakout groups to edit trackpoints
|
After Width: | Height: | Size: 1.4 MiB |
|
After Width: | Height: | Size: 1.8 MiB |
|
After Width: | Height: | Size: 1.9 MiB |
|
After Width: | Height: | Size: 1.3 MiB |
|
After Width: | Height: | Size: 1.9 MiB |
|
After Width: | Height: | Size: 1.9 MiB |
|
After Width: | Height: | Size: 1.9 MiB |
|
After Width: | Height: | Size: 1.8 MiB |
@@ -0,0 +1,51 @@
|
||||
(function (ns) {
|
||||
'use strict';
|
||||
|
||||
const entries = Object.freeze([
|
||||
['🍎', 'Apfel'],
|
||||
['🔑', 'Schlüssel'],
|
||||
['🔔', 'Glocke'],
|
||||
['📘', 'Buch'],
|
||||
['🌻', 'Sonnenblume'],
|
||||
['☂️', 'Regenschirm'],
|
||||
['⚽', 'Fußball'],
|
||||
['☕', 'Tasse']
|
||||
].map(([unicode, label]) => Object.freeze({
|
||||
unicode,
|
||||
label,
|
||||
imageUrl: `/images/group-symbols/${unicode}.png`
|
||||
})));
|
||||
|
||||
// Presentation selectors must not create different symbols for the same object.
|
||||
function normalizeUnicode(value) {
|
||||
if (typeof value !== 'string') return null;
|
||||
return value.normalize('NFC').replaceAll(/[\uFE0E\uFE0F]/g, '');
|
||||
}
|
||||
|
||||
const byUnicode = new Map(entries.map(entry => [normalizeUnicode(entry.unicode), entry]));
|
||||
|
||||
/**
|
||||
* Read-only catalogue of the eight approved group-code illustrations.
|
||||
* Loading this file only registers the class; it does not create UI or sessions.
|
||||
*/
|
||||
class GroupSymbols {
|
||||
static list() {
|
||||
return entries;
|
||||
}
|
||||
|
||||
/** Returns the immutable motif descriptor, or null for an unknown symbol. */
|
||||
static get(unicode) {
|
||||
return byUnicode.get(normalizeUnicode(unicode)) ?? null;
|
||||
}
|
||||
|
||||
static has(unicode) {
|
||||
return this.get(unicode) !== null;
|
||||
}
|
||||
|
||||
static imageUrl(unicode) {
|
||||
return this.get(unicode)?.imageUrl ?? null;
|
||||
}
|
||||
}
|
||||
|
||||
ns.GroupSymbols = GroupSymbols;
|
||||
}(globalThis.Wegwichtel ??= {}));
|
||||