Name Tag Maker
HTML
<bitty-7-0 data-connect="NameTagMaker">
<div data-init="nameTagColors"></div>
<div>
<label>Name
<input type="text" size="10" data-send="updateNameTagName" />
</label>
</div>
<div>
<div data-receive="showNameTag"></div>
</div>
</bitty-7-0>
JavaScript
const nameTagTemplates = {
colorBlock: `
<div
class="name-tag-color-block"
style="--color: COLOR"
data-color="COLOR"
data-send="updateNameTagColor"
data-receive="updateNameTagColor"></div>`,
colorStyle: `
.name-tag-color-COLOR {
background-color: COLOR;
}`,
nameTag: `
<div class="name-tag-wrapper" style="--color: COLOR">
<div class="name-tag-hello" style="--color: COLOR">Hello, my name is:</div>
<div class="name-tag-name">NAME</div>
</div>`,
};
const nameTagColorArray = [
"firebrick",
"goldenrod",
"rebeccapurple",
"slateblue",
"cadetblue",
];
window.NameTagMaker = class {
#currentName = "";
#currentColor = nameTagColorArray[1];
bittyReady() {
this.api.trigger("showNameTag");
}
nameTagColors(_ev, el) {
nameTagColorArray.forEach((color) => {
const subs = [
["COLOR", color],
];
const newEl = this.api.makeElement(
nameTagTemplates.colorBlock,
subs,
);
if (color === this.#currentColor) {
newEl.innerHTML = "x";
}
el.appendChild(newEl);
});
}
updateNameTagName(ev, el) {
this.#currentName = ev.value;
this.api.trigger("showNameTag");
}
showNameTag(_ev, el) {
const subs = [
["COLOR", this.#currentColor],
["NAME", this.#currentName],
];
const newTag = this.api.makeHTML(nameTagTemplates.nameTag, subs);
el.replaceChildren(newTag);
}
updateNameTagColor(ev, el) {
if (el.isSender) {
el.innerHTML = "x";
this.#currentColor = el.prop("color");
} else {
el.innerHTML = "";
}
this.api.trigger("showNameTag");
}
};