diff --git a/docs/MODULE-GUIDE.md b/docs/MODULE-GUIDE.md
index bb55b86..ce6c0eb 100644
--- a/docs/MODULE-GUIDE.md
+++ b/docs/MODULE-GUIDE.md
@@ -330,16 +330,17 @@ bar, next to the shell's gear/close buttons:
```js
const btn = moduleApi.header.addButton({
- icon: '', // inline SVG string, and/or
- label: 'A+', // short text
- title: 'Larger text', // hover tooltip
+ icon: '', // inline SVG string (13 px), and/or
+ label: 'Timers ▾', // short text
+ title: 'Larger text', // tooltip — one or two words; the shell shows
+ // it the moment the pointer arrives
onClick() { … },
});
btn.classList.add('active'); // toggle styling for on/off buttons
const menu = moduleApi.header.addMenu({
label: 'Channels ▾',
- title: 'Choose visible channels',
+ title: 'Channels',
build(menuEl) {
// called on every open with an emptied menu element — fill it with
// buttons (give them your scoped classes; the container is styled and
@@ -351,7 +352,10 @@ menu.setLabel('Channels (2/4) ▾'); // update the button text any time
Everything you add is removed automatically when your instance stops, so a
remount never duplicates controls. Keep them compact (icon buttons, short
-labels): the title bar is 32 px tall and shared with the tile's name.
+labels): the title bar is 32 px tall and shared with the tile's name. Draw
+icons as inline SVG rather than characters — a glyph such as ✕ or + takes
+its size from whatever font each browser picks; text-size buttons are a
+drawn − and +.
**One control per action.** Whatever has a dedicated header button is not
offered again in the gear popover: text size is A− / A+ up here (persisted
diff --git a/modules/pco-plan/client.js b/modules/pco-plan/client.js
index 7bf08f4..5088322 100644
--- a/modules/pco-plan/client.js
+++ b/modules/pco-plan/client.js
@@ -10,6 +10,10 @@
const REFRESH_SVG = '';
+/* the text-size buttons: a drawn − and + at the icon size, like every other header icon */
+const MINUS_SVG = '';
+const PLUS_SVG = '';
+
export default function create({ root, moduleApi }) {
let state = null;
let skew = 0; // server clock − local clock, ms
@@ -55,7 +59,7 @@ export default function create({ root, moduleApi }) {
const refreshBtn = moduleApi.header.addButton({
icon: REFRESH_SVG,
- title: 'Re-read the plan from Planning Center now',
+ title: 'Refresh',
onClick() {
refreshBtn.classList.add('active');
moduleApi.fetch('/refresh', { method: 'POST' })
@@ -69,8 +73,8 @@ export default function create({ root, moduleApi }) {
moduleApi.saveInstanceSettings({ textSize: Math.min(40, Math.max(9, size + delta)) });
applyPrefs();
}
- moduleApi.header.addButton({ label: 'A−', title: 'Smaller text', onClick: () => bumpTextSize(-1) });
- moduleApi.header.addButton({ label: 'A+', title: 'Larger text', onClick: () => bumpTextSize(1) });
+ moduleApi.header.addButton({ icon: MINUS_SVG, title: 'Smaller text', onClick: () => bumpTextSize(-1) });
+ moduleApi.header.addButton({ icon: PLUS_SVG, title: 'Larger text', onClick: () => bumpTextSize(1) });
/* ── formatting ─────────────────────────────────────────────────── */
diff --git a/modules/prodcom-transcript/client.js b/modules/prodcom-transcript/client.js
index 76bff3b..439f487 100644
--- a/modules/prodcom-transcript/client.js
+++ b/modules/prodcom-transcript/client.js
@@ -6,6 +6,10 @@
persists in instance settings, and all network traffic goes through
moduleApi (the module's server proxy at /prodcom/*). */
+/* the text-size buttons: a drawn − and + at the icon size, like every other header icon */
+const MINUS_SVG = '';
+const PLUS_SVG = '';
+
export default function create({ root, moduleApi }) {
/* ── per-instance state ─────────────────────────────────────────── */
@@ -48,7 +52,7 @@ export default function create({ root, moduleApi }) {
let channelMenuEl = null; // the open menu's element (filled on each open)
const channelsMenu = moduleApi.header.addMenu({
icon: CHANNELS_SVG,
- title: 'Choose visible channels',
+ title: 'Channels',
build(menu) {
menu.classList.add('pt-menu');
channelMenuEl = menu;
@@ -65,7 +69,7 @@ export default function create({ root, moduleApi }) {
let timeBtn = null;
timeBtn = moduleApi.header.addButton({
icon: CLOCK_SVG,
- title: 'Show / hide timestamps',
+ title: 'Timestamps',
onClick() {
moduleApi.saveInstanceSettings({ showTimes: !moduleApi.instanceSettings.showTimes });
applyInstanceSettings();
@@ -77,8 +81,8 @@ export default function create({ root, moduleApi }) {
moduleApi.saveInstanceSettings({ textSize: Math.min(48, Math.max(10, current + delta)) });
applyInstanceSettings();
}
- moduleApi.header.addButton({ label: 'A−', title: 'Smaller text', onClick: () => bumpTextSize(-2) });
- moduleApi.header.addButton({ label: 'A+', title: 'Larger text', onClick: () => bumpTextSize(2) });
+ moduleApi.header.addButton({ icon: MINUS_SVG, title: 'Smaller text', onClick: () => bumpTextSize(-2) });
+ moduleApi.header.addButton({ icon: PLUS_SVG, title: 'Larger text', onClick: () => bumpTextSize(2) });
// icon and tooltip track the current direction — applyInstanceSettings sets both
const flowBtn = moduleApi.header.addButton({
@@ -93,7 +97,7 @@ export default function create({ root, moduleApi }) {
moduleApi.header.addButton({
icon: JUMP_SVG,
- title: 'Jump to latest',
+ title: 'Latest',
onClick() {
pinnedToLatest = true;
jumpBtn.hidden = true;
@@ -103,7 +107,7 @@ export default function create({ root, moduleApi }) {
const clearBtn = moduleApi.header.addButton({
icon: CLEAR_SVG,
- title: 'Clear this tile (does not affect ProdCom)',
+ title: 'Clear',
onClick: clearView,
});
clearBtn.classList.add('pt-clear');
@@ -120,9 +124,7 @@ export default function create({ root, moduleApi }) {
wrap.classList.toggle('newest-first', up);
flowBtn.innerHTML = up ? FLOW_UP_SVG : FLOW_DOWN_SVG;
flowBtn.classList.toggle('active', up);
- flowBtn.title = up
- ? 'Newest at top — click for newest at bottom'
- : 'Newest at bottom — click for newest at top';
+ flowBtn.title = up ? 'Newest first' : 'Oldest first';
jumpBtn.textContent = (up ? '↑' : '↓') + ' New messages';
}
applyInstanceSettings();
@@ -174,9 +176,7 @@ export default function create({ root, moduleApi }) {
channelCountEl.textContent = filtering ? `${visibleCount}/${channels.size}` : '';
channelCountEl.hidden = !filtering;
channelsMenu.button.classList.toggle('active', filtering);
- channelsMenu.button.title = filtering
- ? `Channels — showing ${visibleCount} of ${channels.size}`
- : 'Choose visible channels';
+ channelsMenu.button.title = filtering ? `Channels ${visibleCount}/${channels.size}` : 'Channels';
}
function rebuildChannelMenu() {
diff --git a/modules/propresenter-timers/client.js b/modules/propresenter-timers/client.js
index 5a8149e..7d81938 100644
--- a/modules/propresenter-timers/client.js
+++ b/modules/propresenter-timers/client.js
@@ -283,7 +283,7 @@ export default function create({ root, moduleApi }) {
let menuEl = null; // the open menu's element (filled on each open)
const itemsMenu = solo ? null : moduleApi.header.addMenu({
label: 'Timers ▾',
- title: 'Choose which timers this tile shows',
+ title: 'Choose timers',
build(menu) {
// the shell hands over an emptied element on every open
menu.classList.add('tm-menu');
diff --git a/modules/slack/client.js b/modules/slack/client.js
index e1dcf71..59637e3 100644
--- a/modules/slack/client.js
+++ b/modules/slack/client.js
@@ -635,6 +635,10 @@ const emojiMenu = (() => {
/* ── the factory ────────────────────────────────────────────────────── */
+/* the text-size buttons: a drawn − and + at the icon size, like every other header icon */
+const MINUS_SVG = '';
+const PLUS_SVG = '';
+
export default function create({ root, moduleApi }) {
const variant = String(moduleApi.variant || '');
// The entry's preset `view` is authoritative; a tile added under 1.0.0 has
@@ -680,11 +684,11 @@ function createTranscriptTile({ root, moduleApi }) {
moduleApi.saveInstanceSettings({ textSize: Math.min(48, Math.max(10, textSizePx(moduleApi) + delta)) });
applyInstanceSettings();
}
- moduleApi.header.addButton({ label: 'A−', title: 'Smaller text', onClick: () => bumpTextSize(-1) });
- moduleApi.header.addButton({ label: 'A+', title: 'Larger text', onClick: () => bumpTextSize(1) });
+ moduleApi.header.addButton({ icon: MINUS_SVG, title: 'Smaller text', onClick: () => bumpTextSize(-1) });
+ moduleApi.header.addButton({ icon: PLUS_SVG, title: 'Larger text', onClick: () => bumpTextSize(1) });
moduleApi.header.addButton({
icon: JUMP_SVG,
- title: 'Jump to latest',
+ title: 'Latest',
onClick() {
pinnedToLatest = true;
jumpBtn.hidden = true;
@@ -1056,7 +1060,7 @@ function createSendTile({ root, moduleApi, mode }) {
const gate = root.querySelector('.sl-gate');
const compose = root.querySelector('.sl-compose');
- const lockBtn = moduleApi.header.addButton({ icon: LOCK_SVG, title: 'Lock now', onClick: () => lock('Locked') });
+ const lockBtn = moduleApi.header.addButton({ icon: LOCK_SVG, title: 'Lock', onClick: () => lock('Locked') });
lockBtn.style.display = 'none';
function applyInstanceSettings() {
diff --git a/public/index.html b/public/index.html
index aab5aba..a1bfa52 100644
--- a/public/index.html
+++ b/public/index.html
@@ -19,7 +19,7 @@
-