Skip to content

Commit ece54ea

Browse files
author
DavidQ
committed
refactor(shell): split Workspace tool tiles by role and clean up spacing overrides
add Workspace-only tile sections with headings: Editors and Creators and Viewers move viewer tools into dedicated lower section with divider between groups add per-section nav grid wrappers and styles for full-width stacked layout keep core spacing fix by using content-height nav grid rows (grid-auto-rows: auto, align-items: start) remove temporary force/debug CSS overrides (!important compaction rules) after validation to reduce side effects
1 parent 3c1b50d commit ece54ea

2 files changed

Lines changed: 106 additions & 11 deletions

File tree

tools/shared/platformShell.css

Lines changed: 46 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -157,8 +157,8 @@ body.tools-platform-surface {
157157
background: linear-gradient(180deg, var(--panel, rgba(76, 29, 149, 0.88)) 0%, var(--panel2, rgba(49, 17, 102, 0.94)) 100%);
158158
box-shadow: var(--tools-shell-shadow);
159159
min-width: 220px;
160-
min-height: 156px;
161-
height: 100%;
160+
min-height: 120px;
161+
height: auto;
162162
align-self: stretch;
163163
justify-content: flex-start;
164164
}
@@ -175,18 +175,19 @@ body.tools-platform-surface {
175175
.tools-platform-frame__nav-bucket-links {
176176
display: flex;
177177
align-items: stretch;
178-
gap: 10px;
178+
gap: 6px;
179179
flex-wrap: nowrap;
180180
flex-direction: column;
181181
}
182182

183183
.tools-platform-frame__nav-tool-row {
184-
display: grid;
184+
display: flex;
185+
flex-wrap: wrap;
186+
align-items: center;
185187
gap: 6px;
186-
align-items: start;
187-
padding-bottom: 10px;
188-
margin-bottom: 10px;
189-
border-bottom: 1px solid rgba(221, 214, 254, 0.18);
188+
padding-bottom: 4px;
189+
margin-bottom: 4px;
190+
border-bottom: 0;
190191
}
191192

192193
.tools-platform-frame__nav-tool-row:last-child {
@@ -196,9 +197,10 @@ body.tools-platform-surface {
196197
}
197198

198199
.tools-platform-frame__binding-badges {
199-
display: flex;
200+
display: inline-flex;
200201
flex-wrap: wrap;
201202
gap: 6px;
203+
margin: 0;
202204
}
203205

204206
.tools-platform-frame__binding-badge {
@@ -230,14 +232,47 @@ body.tools-platform-surface {
230232
.tools-platform-frame__nav {
231233
display: grid;
232234
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
233-
grid-auto-rows: 1fr;
235+
grid-auto-rows: auto;
234236
gap: 12px;
235-
align-items: stretch;
237+
align-items: start;
238+
align-content: start;
239+
justify-items: stretch;
240+
width: 100%;
241+
}
242+
243+
.tools-platform-frame__nav-section {
244+
display: grid;
245+
gap: 10px;
246+
}
247+
248+
.tools-platform-frame__nav > .tools-platform-frame__nav-section,
249+
.tools-platform-frame__nav > .tools-platform-frame__divider--nav-split {
250+
grid-column: 1 / -1;
251+
width: 100%;
252+
}
253+
254+
.tools-platform-frame__nav-section-title {
255+
margin: 0;
256+
font-size: 1.05rem;
257+
line-height: 1.2;
258+
color: var(--text, #f7f4ff);
259+
}
260+
261+
.tools-platform-frame__nav-grid {
262+
display: grid;
263+
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
264+
grid-auto-rows: auto;
265+
gap: 12px;
266+
align-items: start;
236267
align-content: start;
237268
justify-items: stretch;
238269
width: 100%;
239270
}
240271

272+
.tools-platform-frame__divider--nav-split {
273+
margin: 14px 0;
274+
}
275+
241276
.tools-platform-frame__actions,
242277
.tools-platform-frame__shared-status {
243278
display: flex;

tools/shared/platformShell.js

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,11 +168,70 @@ function renderToolBindingBadges(tool) {
168168
}
169169

170170
function renderToolLinks(currentToolId) {
171+
const viewerToolIds = new Set([
172+
"3d-asset-viewer",
173+
"state-inspector",
174+
"replay-visualizer",
175+
"performance-profiler"
176+
]);
171177
const tools = getToolRegistry()
172178
.filter((entry) => entry.active === true)
173179
.filter((entry) => entry.visibleInToolsList === true)
174180
.sort((left, right) => String(left.displayName || "").localeCompare(String(right.displayName || "")));
175181

182+
function renderBucketGrid(toolEntries) {
183+
const bucketMap = new Map();
184+
toolEntries.forEach((tool) => {
185+
const bucket = String(tool.showcaseTag || "Other").trim() || "Other";
186+
if (!bucketMap.has(bucket)) {
187+
bucketMap.set(bucket, []);
188+
}
189+
bucketMap.get(bucket).push(tool);
190+
});
191+
192+
return Array.from(bucketMap.entries())
193+
.sort((left, right) => left[0].localeCompare(right[0]))
194+
.map(([bucketName, bucketTools]) => `
195+
<div class="tools-platform-frame__nav-bucket" aria-label="${escapeHtml(bucketName)} tools">
196+
<h3 class="tools-platform-frame__nav-bucket-title">${escapeHtml(bucketName)}</h3>
197+
<div class="tools-platform-frame__nav-bucket-links">
198+
${bucketTools
199+
.map((tool) => {
200+
const currentClass = tool.id === currentToolId ? " is-current" : "";
201+
return `
202+
<div class="tools-platform-frame__nav-tool-row">
203+
<a class="tools-platform-frame__nav-link${currentClass}" href="${escapeHtml(getRegistryEntryHref(tool.entryPoint))}">${escapeHtml(tool.displayName)}</a>
204+
${renderToolBindingBadges(tool)}
205+
</div>
206+
`;
207+
})
208+
.join("")}
209+
</div>
210+
</div>
211+
`)
212+
.join("");
213+
}
214+
215+
if (isWorkspaceManagerContext()) {
216+
const creatorTools = tools.filter((tool) => !viewerToolIds.has(tool.id));
217+
const viewerTools = tools.filter((tool) => viewerToolIds.has(tool.id));
218+
return `
219+
<section class="tools-platform-frame__nav-section" aria-label="Editor and creator tools">
220+
<h1 class="tools-platform-frame__nav-section-title">Editors and Creators</h1>
221+
<div class="tools-platform-frame__nav-grid">
222+
${renderBucketGrid(creatorTools)}
223+
</div>
224+
</section>
225+
<hr class="tools-platform-frame__divider tools-platform-frame__divider--nav-split" />
226+
<section class="tools-platform-frame__nav-section" aria-label="Viewer tools">
227+
<h1 class="tools-platform-frame__nav-section-title">Viewers</h1>
228+
<div class="tools-platform-frame__nav-grid">
229+
${renderBucketGrid(viewerTools)}
230+
</div>
231+
</section>
232+
`;
233+
}
234+
176235
const bucketMap = new Map();
177236
tools.forEach((tool) => {
178237
const bucket = String(tool.showcaseTag || "Other").trim() || "Other";
@@ -368,6 +427,7 @@ function renderStatusMarkup(currentTool) {
368427

369428
function applyDocumentMetadata(currentTool) {
370429
document.body.classList.add("tools-platform-surface");
430+
document.body.classList.toggle("tools-platform-workspace-context", isWorkspaceManagerContext());
371431
const surfaceName = getDisplaySurfaceName(currentTool);
372432
if (currentTool || isWorkspaceManagerContext()) {
373433
document.title = `${surfaceName} | Tools Platform`;

0 commit comments

Comments
 (0)