shows) via display:list-item — geometrically
symmetric open/closed, and immune to the italic style of the button
- labels (font glyphs like ▶/▼ skew in italics; the marker icon doesn't).
+ labels (font glyphs like ⏵/⏷ skew in italics; the marker icon doesn't).
The empty span doubles as the key-column alignment slot: every key cell
renders one (markerless on scalar rows), so all key texts start at the
same x. */
@@ -22988,13 +22976,13 @@
button > .tool-param-fold-glyph {
display: list-item;
list-style-position: inside;
- list-style-type: "\25B8";
+ list-style-type: "\23F5";
list-style-type: disclosure-closed;
}
.tool-param-key-toggle[aria-expanded='true'] > .tool-param-fold-glyph,
[data-state='expanded'] > .tool-param-fold-glyph {
- list-style-type: "\25BE";
+ list-style-type: "\23F7";
list-style-type: disclosure-open;
}
@@ -23017,7 +23005,7 @@
display: none;
}
- /* A keyed fold's open summary carries nothing (the key glyph shows ▼ and
+ /* A keyed fold's open summary carries nothing (the key glyph shows ⏷ and
the rows-toggle sits in the controls strip below) — drop the line it
would occupy. This also suppresses the generic ::after "collapse". */
.tool-param-row-fold > .tool-param-value > details[open] > summary {
@@ -26130,11 +26118,11 @@
- ▼
+ ⏷
2 teammates, 1 user
- ▼▼
+ ⏷⏷
9 tools, 5 assistants, 8 more total
@@ -26165,11 +26153,11 @@
- ▼
+ ⏷
6 tools
- ▼▼
+ ⏷⏷
6 tools, 4 assistants, 5 more total
@@ -26337,7 +26325,7 @@
- ▼
+ ⏷
2 assistants, 1 user
@@ -26439,7 +26427,7 @@
- ▼
+ ⏷
2 assistants, 1 teammate
@@ -26574,7 +26562,7 @@
- ▼
+ ⏷
3 tools, 1 assistant
@@ -27066,7 +27054,7 @@
const allOpen = rows.length > 0 &&
Array.from(rows).every(row => row.open);
const kind = button.dataset.kind || 'rows';
- // data-state drives the CSS rotation of the constant ▸ glyph;
+ // data-state drives the CSS rotation of the constant ⏵ glyph;
// only the label text changes.
button.dataset.state = allOpen ? 'expanded' : 'collapsed';
const label = button.querySelector('.tool-param-fold-label');
@@ -27102,7 +27090,7 @@
syncExpandAll(root);
return;
}
- // Key-column fold toggle (▶/▼): drives the value cell's
+ // Key-column fold toggle (⏵/⏷): drives the value cell's
// details from the key cell, keeping the summary free of
// per-fold collapse chrome. Glyph state is derived in the
// toggle listener below, so any other opener stays in sync.
@@ -27150,7 +27138,7 @@
const keyBtn = row && row.querySelector(
':scope > .tool-param-key > .tool-param-key-toggle');
if (keyBtn) {
- // CSS rotates the single ▸ glyph on aria-expanded —
+ // CSS rotates the single ⏵ glyph on aria-expanded —
// symmetric open/closed states by construction.
keyBtn.setAttribute('aria-expanded',
details.open ? 'true' : 'false');
@@ -27487,18 +27475,18 @@
const allSection = foldBar ? foldBar.querySelector('.fold-all-levels') : null;
if (state === 'folded') {
if (cc) cc.style.display = 'none';
- setSectionState(oneSection, true, '▶');
- setSectionState(allSection, true, '▶▶');
+ setSectionState(oneSection, true, '⏵');
+ setSectionState(allSection, true, '⏵⏵');
} else if (state === 'first') {
if (cc) cc.style.display = '';
getImmediateChildMessages(messageEl).forEach(child => applyFoldState(child, 'folded'));
- setSectionState(oneSection, false, '▼');
- setSectionState(allSection, true, '▶▶');
+ setSectionState(oneSection, false, '⏷');
+ setSectionState(allSection, true, '⏵⏵');
} else { // 'open'
if (cc) cc.style.display = '';
getImmediateChildMessages(messageEl).forEach(child => applyFoldState(child, 'open'));
- setSectionState(oneSection, false, '▼');
- setSectionState(allSection, false, '▼▼');
+ setSectionState(oneSection, false, '⏷');
+ setSectionState(allSection, false, '⏷⏷');
}
}
@@ -27544,15 +27532,15 @@
const cc = getChildrenContainer(msg);
if ((isSession || isUser) && !hasOnlyTools) {
- // First level visible (▼), deeper levels folded (▶▶)
+ // First level visible (⏷), deeper levels folded (⏵⏵)
if (cc) cc.style.display = '';
- setSectionState(oneSection, false, '▼');
- setSectionState(allSection, true, '▶▶');
+ setSectionState(oneSection, false, '⏷');
+ setSectionState(allSection, true, '⏵⏵');
} else {
// Fully folded
if (cc) cc.style.display = 'none';
- setSectionState(oneSection, true, '▶');
- setSectionState(allSection, true, '▶▶');
+ setSectionState(oneSection, true, '⏵');
+ setSectionState(allSection, true, '⏵⏵');
}
});
}
@@ -27579,8 +27567,8 @@
const card = wrapper ? wrapper.querySelector(':scope > .message') : null;
const foldBar = card ? card.querySelector(':scope > .fold-bar') : null;
if (foldBar) {
- setSectionState(foldBar.querySelector('.fold-one-level'), false, '▼');
- setSectionState(foldBar.querySelector('.fold-all-levels'), false, '▼▼');
+ setSectionState(foldBar.querySelector('.fold-one-level'), false, '⏷');
+ setSectionState(foldBar.querySelector('.fold-all-levels'), false, '⏷⏷');
}
}
node = node.parentElement;
@@ -28796,14 +28784,11 @@
font-size: 1.1em;
line-height: 1;
color: var(--fold-color);
- /* Tighten the gap between the two glyphs in ``▼▼`` / ``▶▶`` —
- Chrome renders default kerning much wider than Firefox does,
- leaving an awkward gap. The pulled-in -0.2em compromise reads
- cleanly in Chrome without crowding the glyphs in Firefox
- (issue #73 / #153). No visible effect on single-glyph ``▼``
- since letter-spacing only matters when two characters are
- adjacent. */
- letter-spacing: -.2em;
+ /* The doubled glyphs ``⏷⏷`` / ``⏵⏵`` (U+23F7 / U+23F5) sit at a
+ natural, even spacing in both Chrome and Firefox, so no kerning
+ trick is needed (the earlier ``▼▼`` / ``▶▶`` needed a -0.2em
+ letter-spacing pull-in to tame Chrome's wide default — issue
+ #73 / #153 / #247). */
}
.fold-count {
@@ -29763,9 +29748,9 @@
}
/* Fold-valued rows hoist their toggle into the KEY column: the key cell's
- ▶/▼ button (wired in transcript.html, state derived from toggle events)
+ ⏵/⏷ button (wired in transcript.html, state derived from toggle events)
replaces the per-fold in-summary collapse chrome, which only remained
- useful en masse — every row showing "▼ collapse" drowned the content.
+ useful en masse — every row showing "⏷ collapse" drowned the content.
Scoped to keyed rows: the top-level root fold has no key column and
keeps its summary affordances (the pure-CSS ::after "collapse" hint —
no interactive child). */
@@ -29789,7 +29774,7 @@
/* The shared fold glyph: the BROWSER'S native disclosure marker (the same
UA-drawn icon a shows) via display:list-item — geometrically
symmetric open/closed, and immune to the italic style of the button
- labels (font glyphs like ▶/▼ skew in italics; the marker icon doesn't).
+ labels (font glyphs like ⏵/⏷ skew in italics; the marker icon doesn't).
The empty span doubles as the key-column alignment slot: every key cell
renders one (markerless on scalar rows), so all key texts start at the
same x. */
@@ -29806,13 +29791,13 @@
button > .tool-param-fold-glyph {
display: list-item;
list-style-position: inside;
- list-style-type: "\25B8";
+ list-style-type: "\23F5";
list-style-type: disclosure-closed;
}
.tool-param-key-toggle[aria-expanded='true'] > .tool-param-fold-glyph,
[data-state='expanded'] > .tool-param-fold-glyph {
- list-style-type: "\25BE";
+ list-style-type: "\23F7";
list-style-type: disclosure-open;
}
@@ -29835,7 +29820,7 @@
display: none;
}
- /* A keyed fold's open summary carries nothing (the key glyph shows ▼ and
+ /* A keyed fold's open summary carries nothing (the key glyph shows ⏷ and
the rows-toggle sits in the controls strip below) — drop the line it
would occupy. This also suppresses the generic ::after "collapse". */
.tool-param-row-fold > .tool-param-value > details[open] > summary {
@@ -32948,11 +32933,11 @@
- ▼
+ ⏷
5 users
- ▼▼
+ ⏷⏷
5 users, 2 assistants, 2 more total
@@ -32983,7 +32968,7 @@
- ▼
+ ⏷
1 assistant
@@ -33081,7 +33066,7 @@
- ▼
+ ⏷
1 tool
@@ -33191,11 +33176,11 @@
- ▼
+ ⏷
1 assistant
- ▼▼
+ ⏷⏷
1 assistant, 1 tool total
@@ -33228,7 +33213,7 @@
- ▼
+ ⏷
1 tool
@@ -33329,7 +33314,7 @@
- ▼
+ ⏷
1 tool
@@ -33847,7 +33832,7 @@
const allOpen = rows.length > 0 &&
Array.from(rows).every(row => row.open);
const kind = button.dataset.kind || 'rows';
- // data-state drives the CSS rotation of the constant ▸ glyph;
+ // data-state drives the CSS rotation of the constant ⏵ glyph;
// only the label text changes.
button.dataset.state = allOpen ? 'expanded' : 'collapsed';
const label = button.querySelector('.tool-param-fold-label');
@@ -33883,7 +33868,7 @@
syncExpandAll(root);
return;
}
- // Key-column fold toggle (▶/▼): drives the value cell's
+ // Key-column fold toggle (⏵/⏷): drives the value cell's
// details from the key cell, keeping the summary free of
// per-fold collapse chrome. Glyph state is derived in the
// toggle listener below, so any other opener stays in sync.
@@ -33931,7 +33916,7 @@
const keyBtn = row && row.querySelector(
':scope > .tool-param-key > .tool-param-key-toggle');
if (keyBtn) {
- // CSS rotates the single ▸ glyph on aria-expanded —
+ // CSS rotates the single ⏵ glyph on aria-expanded —
// symmetric open/closed states by construction.
keyBtn.setAttribute('aria-expanded',
details.open ? 'true' : 'false');
@@ -34268,18 +34253,18 @@
const allSection = foldBar ? foldBar.querySelector('.fold-all-levels') : null;
if (state === 'folded') {
if (cc) cc.style.display = 'none';
- setSectionState(oneSection, true, '▶');
- setSectionState(allSection, true, '▶▶');
+ setSectionState(oneSection, true, '⏵');
+ setSectionState(allSection, true, '⏵⏵');
} else if (state === 'first') {
if (cc) cc.style.display = '';
getImmediateChildMessages(messageEl).forEach(child => applyFoldState(child, 'folded'));
- setSectionState(oneSection, false, '▼');
- setSectionState(allSection, true, '▶▶');
+ setSectionState(oneSection, false, '⏷');
+ setSectionState(allSection, true, '⏵⏵');
} else { // 'open'
if (cc) cc.style.display = '';
getImmediateChildMessages(messageEl).forEach(child => applyFoldState(child, 'open'));
- setSectionState(oneSection, false, '▼');
- setSectionState(allSection, false, '▼▼');
+ setSectionState(oneSection, false, '⏷');
+ setSectionState(allSection, false, '⏷⏷');
}
}
@@ -34325,15 +34310,15 @@
const cc = getChildrenContainer(msg);
if ((isSession || isUser) && !hasOnlyTools) {
- // First level visible (▼), deeper levels folded (▶▶)
+ // First level visible (⏷), deeper levels folded (⏵⏵)
if (cc) cc.style.display = '';
- setSectionState(oneSection, false, '▼');
- setSectionState(allSection, true, '▶▶');
+ setSectionState(oneSection, false, '⏷');
+ setSectionState(allSection, true, '⏵⏵');
} else {
// Fully folded
if (cc) cc.style.display = 'none';
- setSectionState(oneSection, true, '▶');
- setSectionState(allSection, true, '▶▶');
+ setSectionState(oneSection, true, '⏵');
+ setSectionState(allSection, true, '⏵⏵');
}
});
}
@@ -34360,8 +34345,8 @@
const card = wrapper ? wrapper.querySelector(':scope > .message') : null;
const foldBar = card ? card.querySelector(':scope > .fold-bar') : null;
if (foldBar) {
- setSectionState(foldBar.querySelector('.fold-one-level'), false, '▼');
- setSectionState(foldBar.querySelector('.fold-all-levels'), false, '▼▼');
+ setSectionState(foldBar.querySelector('.fold-one-level'), false, '⏷');
+ setSectionState(foldBar.querySelector('.fold-all-levels'), false, '⏷⏷');
}
}
node = node.parentElement;
@@ -35577,14 +35562,11 @@
font-size: 1.1em;
line-height: 1;
color: var(--fold-color);
- /* Tighten the gap between the two glyphs in ``▼▼`` / ``▶▶`` —
- Chrome renders default kerning much wider than Firefox does,
- leaving an awkward gap. The pulled-in -0.2em compromise reads
- cleanly in Chrome without crowding the glyphs in Firefox
- (issue #73 / #153). No visible effect on single-glyph ``▼``
- since letter-spacing only matters when two characters are
- adjacent. */
- letter-spacing: -.2em;
+ /* The doubled glyphs ``⏷⏷`` / ``⏵⏵`` (U+23F7 / U+23F5) sit at a
+ natural, even spacing in both Chrome and Firefox, so no kerning
+ trick is needed (the earlier ``▼▼`` / ``▶▶`` needed a -0.2em
+ letter-spacing pull-in to tame Chrome's wide default — issue
+ #73 / #153 / #247). */
}
.fold-count {
@@ -36544,9 +36526,9 @@
}
/* Fold-valued rows hoist their toggle into the KEY column: the key cell's
- ▶/▼ button (wired in transcript.html, state derived from toggle events)
+ ⏵/⏷ button (wired in transcript.html, state derived from toggle events)
replaces the per-fold in-summary collapse chrome, which only remained
- useful en masse — every row showing "▼ collapse" drowned the content.
+ useful en masse — every row showing "⏷ collapse" drowned the content.
Scoped to keyed rows: the top-level root fold has no key column and
keeps its summary affordances (the pure-CSS ::after "collapse" hint —
no interactive child). */
@@ -36570,7 +36552,7 @@
/* The shared fold glyph: the BROWSER'S native disclosure marker (the same
UA-drawn icon a shows) via display:list-item — geometrically
symmetric open/closed, and immune to the italic style of the button
- labels (font glyphs like ▶/▼ skew in italics; the marker icon doesn't).
+ labels (font glyphs like ⏵/⏷ skew in italics; the marker icon doesn't).
The empty span doubles as the key-column alignment slot: every key cell
renders one (markerless on scalar rows), so all key texts start at the
same x. */
@@ -36587,13 +36569,13 @@
button > .tool-param-fold-glyph {
display: list-item;
list-style-position: inside;
- list-style-type: "\25B8";
+ list-style-type: "\23F5";
list-style-type: disclosure-closed;
}
.tool-param-key-toggle[aria-expanded='true'] > .tool-param-fold-glyph,
[data-state='expanded'] > .tool-param-fold-glyph {
- list-style-type: "\25BE";
+ list-style-type: "\23F7";
list-style-type: disclosure-open;
}
@@ -36616,7 +36598,7 @@
display: none;
}
- /* A keyed fold's open summary carries nothing (the key glyph shows ▼ and
+ /* A keyed fold's open summary carries nothing (the key glyph shows ⏷ and
the rows-toggle sits in the controls strip below) — drop the line it
would occupy. This also suppresses the generic ::after "collapse". */
.tool-param-row-fold > .tool-param-value > details[open] > summary {
@@ -39790,11 +39772,11 @@
- ▼
+ ⏷
2 users
- ▼▼
+ ⏷⏷
2 users, 1 assistant total
@@ -39825,7 +39807,7 @@
- ▼
+ ⏷
1 assistant
@@ -39902,11 +39884,11 @@
- ▼
+ ⏷
4 users
- ▼▼
+ ⏷⏷
4 users, 3 assistants, 2 more total
@@ -39937,7 +39919,7 @@
- ▼
+ ⏷
1 assistant
@@ -40016,7 +39998,7 @@
- ▼
+ ⏷
1 tool, 1 assistant
@@ -40130,7 +40112,7 @@
- ▼
+ ⏷
1 tool, 1 assistant
@@ -40571,7 +40553,7 @@
const allOpen = rows.length > 0 &&
Array.from(rows).every(row => row.open);
const kind = button.dataset.kind || 'rows';
- // data-state drives the CSS rotation of the constant ▸ glyph;
+ // data-state drives the CSS rotation of the constant ⏵ glyph;
// only the label text changes.
button.dataset.state = allOpen ? 'expanded' : 'collapsed';
const label = button.querySelector('.tool-param-fold-label');
@@ -40607,7 +40589,7 @@
syncExpandAll(root);
return;
}
- // Key-column fold toggle (▶/▼): drives the value cell's
+ // Key-column fold toggle (⏵/⏷): drives the value cell's
// details from the key cell, keeping the summary free of
// per-fold collapse chrome. Glyph state is derived in the
// toggle listener below, so any other opener stays in sync.
@@ -40655,7 +40637,7 @@
const keyBtn = row && row.querySelector(
':scope > .tool-param-key > .tool-param-key-toggle');
if (keyBtn) {
- // CSS rotates the single ▸ glyph on aria-expanded —
+ // CSS rotates the single ⏵ glyph on aria-expanded —
// symmetric open/closed states by construction.
keyBtn.setAttribute('aria-expanded',
details.open ? 'true' : 'false');
@@ -40992,18 +40974,18 @@
const allSection = foldBar ? foldBar.querySelector('.fold-all-levels') : null;
if (state === 'folded') {
if (cc) cc.style.display = 'none';
- setSectionState(oneSection, true, '▶');
- setSectionState(allSection, true, '▶▶');
+ setSectionState(oneSection, true, '⏵');
+ setSectionState(allSection, true, '⏵⏵');
} else if (state === 'first') {
if (cc) cc.style.display = '';
getImmediateChildMessages(messageEl).forEach(child => applyFoldState(child, 'folded'));
- setSectionState(oneSection, false, '▼');
- setSectionState(allSection, true, '▶▶');
+ setSectionState(oneSection, false, '⏷');
+ setSectionState(allSection, true, '⏵⏵');
} else { // 'open'
if (cc) cc.style.display = '';
getImmediateChildMessages(messageEl).forEach(child => applyFoldState(child, 'open'));
- setSectionState(oneSection, false, '▼');
- setSectionState(allSection, false, '▼▼');
+ setSectionState(oneSection, false, '⏷');
+ setSectionState(allSection, false, '⏷⏷');
}
}
@@ -41049,15 +41031,15 @@
const cc = getChildrenContainer(msg);
if ((isSession || isUser) && !hasOnlyTools) {
- // First level visible (▼), deeper levels folded (▶▶)
+ // First level visible (⏷), deeper levels folded (⏵⏵)
if (cc) cc.style.display = '';
- setSectionState(oneSection, false, '▼');
- setSectionState(allSection, true, '▶▶');
+ setSectionState(oneSection, false, '⏷');
+ setSectionState(allSection, true, '⏵⏵');
} else {
// Fully folded
if (cc) cc.style.display = 'none';
- setSectionState(oneSection, true, '▶');
- setSectionState(allSection, true, '▶▶');
+ setSectionState(oneSection, true, '⏵');
+ setSectionState(allSection, true, '⏵⏵');
}
});
}
@@ -41084,8 +41066,8 @@
const card = wrapper ? wrapper.querySelector(':scope > .message') : null;
const foldBar = card ? card.querySelector(':scope > .fold-bar') : null;
if (foldBar) {
- setSectionState(foldBar.querySelector('.fold-one-level'), false, '▼');
- setSectionState(foldBar.querySelector('.fold-all-levels'), false, '▼▼');
+ setSectionState(foldBar.querySelector('.fold-one-level'), false, '⏷');
+ setSectionState(foldBar.querySelector('.fold-all-levels'), false, '⏷⏷');
}
}
node = node.parentElement;
@@ -42301,14 +42283,11 @@
font-size: 1.1em;
line-height: 1;
color: var(--fold-color);
- /* Tighten the gap between the two glyphs in ``▼▼`` / ``▶▶`` —
- Chrome renders default kerning much wider than Firefox does,
- leaving an awkward gap. The pulled-in -0.2em compromise reads
- cleanly in Chrome without crowding the glyphs in Firefox
- (issue #73 / #153). No visible effect on single-glyph ``▼``
- since letter-spacing only matters when two characters are
- adjacent. */
- letter-spacing: -.2em;
+ /* The doubled glyphs ``⏷⏷`` / ``⏵⏵`` (U+23F7 / U+23F5) sit at a
+ natural, even spacing in both Chrome and Firefox, so no kerning
+ trick is needed (the earlier ``▼▼`` / ``▶▶`` needed a -0.2em
+ letter-spacing pull-in to tame Chrome's wide default — issue
+ #73 / #153 / #247). */
}
.fold-count {
@@ -43268,9 +43247,9 @@
}
/* Fold-valued rows hoist their toggle into the KEY column: the key cell's
- ▶/▼ button (wired in transcript.html, state derived from toggle events)
+ ⏵/⏷ button (wired in transcript.html, state derived from toggle events)
replaces the per-fold in-summary collapse chrome, which only remained
- useful en masse — every row showing "▼ collapse" drowned the content.
+ useful en masse — every row showing "⏷ collapse" drowned the content.
Scoped to keyed rows: the top-level root fold has no key column and
keeps its summary affordances (the pure-CSS ::after "collapse" hint —
no interactive child). */
@@ -43294,7 +43273,7 @@
/* The shared fold glyph: the BROWSER'S native disclosure marker (the same
UA-drawn icon a shows) via display:list-item — geometrically
symmetric open/closed, and immune to the italic style of the button
- labels (font glyphs like ▶/▼ skew in italics; the marker icon doesn't).
+ labels (font glyphs like ⏵/⏷ skew in italics; the marker icon doesn't).
The empty span doubles as the key-column alignment slot: every key cell
renders one (markerless on scalar rows), so all key texts start at the
same x. */
@@ -43311,13 +43290,13 @@
button > .tool-param-fold-glyph {
display: list-item;
list-style-position: inside;
- list-style-type: "\25B8";
+ list-style-type: "\23F5";
list-style-type: disclosure-closed;
}
.tool-param-key-toggle[aria-expanded='true'] > .tool-param-fold-glyph,
[data-state='expanded'] > .tool-param-fold-glyph {
- list-style-type: "\25BE";
+ list-style-type: "\23F7";
list-style-type: disclosure-open;
}
@@ -43340,7 +43319,7 @@
display: none;
}
- /* A keyed fold's open summary carries nothing (the key glyph shows ▼ and
+ /* A keyed fold's open summary carries nothing (the key glyph shows ⏷ and
the rows-toggle sits in the controls strip below) — drop the line it
would occupy. This also suppresses the generic ::after "collapse". */
.tool-param-row-fold > .tool-param-value > details[open] > summary {
@@ -46453,11 +46432,11 @@
- ▼
+ ⏷
4 users
- ▼▼
+ ⏷⏷
4 users, 3 assistants, 2 more total
@@ -46488,7 +46467,7 @@
- ▼
+ ⏷
1 assistant
@@ -46567,7 +46546,7 @@
- ▼
+ ⏷
1 tool, 1 assistant
@@ -46681,7 +46660,7 @@
- ▼
+ ⏷
1 tool, 1 assistant
@@ -47122,7 +47101,7 @@
const allOpen = rows.length > 0 &&
Array.from(rows).every(row => row.open);
const kind = button.dataset.kind || 'rows';
- // data-state drives the CSS rotation of the constant ▸ glyph;
+ // data-state drives the CSS rotation of the constant ⏵ glyph;
// only the label text changes.
button.dataset.state = allOpen ? 'expanded' : 'collapsed';
const label = button.querySelector('.tool-param-fold-label');
@@ -47158,7 +47137,7 @@
syncExpandAll(root);
return;
}
- // Key-column fold toggle (▶/▼): drives the value cell's
+ // Key-column fold toggle (⏵/⏷): drives the value cell's
// details from the key cell, keeping the summary free of
// per-fold collapse chrome. Glyph state is derived in the
// toggle listener below, so any other opener stays in sync.
@@ -47206,7 +47185,7 @@
const keyBtn = row && row.querySelector(
':scope > .tool-param-key > .tool-param-key-toggle');
if (keyBtn) {
- // CSS rotates the single ▸ glyph on aria-expanded —
+ // CSS rotates the single ⏵ glyph on aria-expanded —
// symmetric open/closed states by construction.
keyBtn.setAttribute('aria-expanded',
details.open ? 'true' : 'false');
@@ -47543,18 +47522,18 @@
const allSection = foldBar ? foldBar.querySelector('.fold-all-levels') : null;
if (state === 'folded') {
if (cc) cc.style.display = 'none';
- setSectionState(oneSection, true, '▶');
- setSectionState(allSection, true, '▶▶');
+ setSectionState(oneSection, true, '⏵');
+ setSectionState(allSection, true, '⏵⏵');
} else if (state === 'first') {
if (cc) cc.style.display = '';
getImmediateChildMessages(messageEl).forEach(child => applyFoldState(child, 'folded'));
- setSectionState(oneSection, false, '▼');
- setSectionState(allSection, true, '▶▶');
+ setSectionState(oneSection, false, '⏷');
+ setSectionState(allSection, true, '⏵⏵');
} else { // 'open'
if (cc) cc.style.display = '';
getImmediateChildMessages(messageEl).forEach(child => applyFoldState(child, 'open'));
- setSectionState(oneSection, false, '▼');
- setSectionState(allSection, false, '▼▼');
+ setSectionState(oneSection, false, '⏷');
+ setSectionState(allSection, false, '⏷⏷');
}
}
@@ -47600,15 +47579,15 @@
const cc = getChildrenContainer(msg);
if ((isSession || isUser) && !hasOnlyTools) {
- // First level visible (▼), deeper levels folded (▶▶)
+ // First level visible (⏷), deeper levels folded (⏵⏵)
if (cc) cc.style.display = '';
- setSectionState(oneSection, false, '▼');
- setSectionState(allSection, true, '▶▶');
+ setSectionState(oneSection, false, '⏷');
+ setSectionState(allSection, true, '⏵⏵');
} else {
// Fully folded
if (cc) cc.style.display = 'none';
- setSectionState(oneSection, true, '▶');
- setSectionState(allSection, true, '▶▶');
+ setSectionState(oneSection, true, '⏵');
+ setSectionState(allSection, true, '⏵⏵');
}
});
}
@@ -47635,8 +47614,8 @@
const card = wrapper ? wrapper.querySelector(':scope > .message') : null;
const foldBar = card ? card.querySelector(':scope > .fold-bar') : null;
if (foldBar) {
- setSectionState(foldBar.querySelector('.fold-one-level'), false, '▼');
- setSectionState(foldBar.querySelector('.fold-all-levels'), false, '▼▼');
+ setSectionState(foldBar.querySelector('.fold-one-level'), false, '⏷');
+ setSectionState(foldBar.querySelector('.fold-all-levels'), false, '⏷⏷');
}
}
node = node.parentElement;
diff --git a/test/test_hook_attachment_rendering.py b/test/test_hook_attachment_rendering.py
index d9c17697..9a5aaed2 100644
--- a/test/test_hook_attachment_rendering.py
+++ b/test/test_hook_attachment_rendering.py
@@ -461,7 +461,7 @@ def test_hook_does_not_pair_with_chained_system_entry(self) -> None:
``stop_hook_summary`` whose ``parentUuid`` is a hook attachment
used to pair with the hook via ``_try_pair_by_index`` because
both share ``type == "system"``. That made every hook render
- with a spurious "▼ 1 system" fold-bar in transcripts where
+ with a spurious "⏷ 1 system" fold-bar in transcripts where
plugins fire on every turn (issue #128 follow-up).
"""
from claude_code_log.renderer import generate_template_messages
diff --git a/test/test_params_rows_toggle_browser.py b/test/test_params_rows_toggle_browser.py
index 47beb2bd..8c26b1fa 100644
--- a/test/test_params_rows_toggle_browser.py
+++ b/test/test_params_rows_toggle_browser.py
@@ -1,11 +1,11 @@
"""Playwright tests for the params-table fold controls.
-An open structured-value fold shows "▶ expand all rows" in a controls
+An open structured-value fold shows "⏵ expand all rows" in a controls
strip after the summary (never inside it — interactive elements within
are an accessibility violation); pressing it opens every
-row-level fold of that table and turns into "▼ collapse all rows";
+row-level fold of that table and turns into "⏷ collapse all rows";
closing the outer fold restores the initial state. Fold-valued rows
-carry their ▶/▼ toggle in the KEY column, derived from the actual open
+carry their ⏵/⏷ toggle in the KEY column, derived from the actual open
state.
"""
@@ -148,7 +148,7 @@ def test_closing_fold_restores_initial_state(self, page: Page) -> None:
assert all(outer.evaluate(ROW_DETAILS_JS))
# Close the outer fold via its key-column toggle (the open summary
- # is hidden for keyed rows — the ▼ in the key cell is the collapse
+ # is hidden for keyed rows — the ⏷ in the key cell is the collapse
# control), then reopen the same way.
key_toggle = page.locator(
"tr.tool-param-row-fold > td.tool-param-key > .tool-param-key-toggle"