Skip to content

Commit de15af0

Browse files
V48 (implementation-only): Height Auxillaries selector cards and drop active-pane banner
Add one-word feature pills on each left-rail selector card, remove the redundant Active support pane summary, align the content pane top with the selector column, and slightly compact pill height. Update access tests.
1 parent 5885a79 commit de15af0

6 files changed

Lines changed: 111 additions & 29 deletions

File tree

uapi/components/auxillaries/AuxillariesContent/AuxillariesContent.tsx

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ function AuxillariesContent(props: AuxillariesContentProps) {
4949
const usesTabNavigation = navigationMode === 'tabs';
5050
const usesContainedLayout = surfaceVariant === 'contained';
5151
const activePaneLabel = currentStep ? labelForAuxillaryPane(currentStep) : 'Auxillaries';
52-
const activeDescriptor = currentStep ? getAuxillaryDescriptor(currentStep) : null;
5352
const availableStepLabels = availableSteps.filter(Boolean).map((step) => labelForAuxillaryPane(step));
5453
const blockedStepLabels = steps
5554
.filter((step) => step && !availableSteps.includes(step))
@@ -270,27 +269,11 @@ function AuxillariesContent(props: AuxillariesContentProps) {
270269
data-testid="auxillaries-active-pane-region"
271270
data-auxillaries-pane-state={showContent ? 'ready' : 'loading'}
272271
>
273-
<div className="auxillaries-active-pane-summary" role="status" aria-atomic="true">
274-
<div className="auxillaries-active-pane-summary-copy">
275-
<p className="auxillaries-active-pane-kicker">Active support pane</p>
276-
<h2 className="auxillaries-active-pane-title">{activePaneLabel}</h2>
277-
{activeDescriptor ? (
278-
<p className="auxillaries-active-pane-description">{activeDescriptor.routeDescription}</p>
279-
) : null}
280-
</div>
281-
<div className="auxillaries-active-pane-chips" aria-label="Auxillaries readiness summary">
282-
<span className="auxillaries-active-pane-chip" data-state={showContent ? 'ready' : 'loading'}>
283-
{showContent ? 'Ready' : 'Loading'}
284-
</span>
285-
<span className="auxillaries-active-pane-chip">{availableStepLabels.length} panes available</span>
286-
{blockedStepLabels.length ? (
287-
<span className="auxillaries-active-pane-chip" data-state="blocked">
288-
{blockedStepLabels.length} blocked
289-
</span>
290-
) : null}
291-
</div>
292-
</div>
293-
272+
{/*
273+
No redundant "Active support pane" banner — readiness lives in the
274+
left selector + audit detail; content starts at the same top edge
275+
as the selector column.
276+
*/}
294277
{contentPanel ?? (
295278
<div className="auxillaries-active-pane-loading" role="status" aria-live="polite">
296279
Loading active pane.

uapi/components/auxillaries/AuxillaryPaneMeta/AuxillaryPaneMeta.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@ export interface AuxillaryPaneDescriptor {
2727
labelPosition: 'top' | 'right' | 'bottom' | 'left';
2828
routeTitle: string;
2929
routeDescription: string;
30+
/**
31+
* One-word feature pills rendered at the bottom of the selector card.
32+
* Three to four short labels fill card height and reduce vertical dead space
33+
* between Wallet / Externals / Profile / Interfaces in the left rail.
34+
*/
35+
featurePills: readonly [string, string, string] | readonly [string, string, string, string];
3036
}
3137

3238
export const AUXILLARY_DESCRIPTORS: Record<ConcreteAuxillaryPane, AuxillaryPaneDescriptor> = {
@@ -38,6 +44,7 @@ export const AUXILLARY_DESCRIPTORS: Record<ConcreteAuxillaryPane, AuxillaryPaneD
3844
routeTitle: 'Profile Auxillary',
3945
routeDescription:
4046
'Manage optional email, display identity, admin role, and organization membership without mixing in wallet or third-party connection controls.',
47+
featurePills: ['Email', 'Identity', 'Role', 'Org'],
4148
},
4249
externals: {
4350
label: 'Externals',
@@ -47,6 +54,7 @@ export const AUXILLARY_DESCRIPTORS: Record<ConcreteAuxillaryPane, AuxillaryPaneD
4754
routeTitle: 'Externals Auxillary',
4855
routeDescription:
4956
'Attach GitHub and other non-wallet third-party bindings Bitcode reuses across read measurement, asset-pack synthesis, settlement follow-through, and external interface behavior.',
57+
featurePills: ['GitHub', 'Source', 'Bindings', 'Scope'],
5058
},
5159
interfaces: {
5260
label: 'Interfaces',
@@ -56,6 +64,7 @@ export const AUXILLARY_DESCRIPTORS: Record<ConcreteAuxillaryPane, AuxillaryPaneD
5664
routeTitle: 'Interfaces Auxillary',
5765
routeDescription:
5866
'Shape how Packs, Deposits, Reads, MCP API, ChatGPT App, proofs, and default Bitcode behavior read and operate through one focused auxillary.',
67+
featurePills: ['Packs', 'Reads', 'MCP', 'Proofs'],
5968
},
6069
wallet: {
6170
label: 'Wallet',
@@ -65,6 +74,7 @@ export const AUXILLARY_DESCRIPTORS: Record<ConcreteAuxillaryPane, AuxillaryPaneD
6574
routeTitle: 'Wallet Auxillary',
6675
routeDescription:
6776
'Connect Bitcoin wallet providers, review BTC and BTD balances, and inspect wallet-bound source-share posture in one focused auxillary.',
77+
featurePills: ['Providers', 'BTC', 'BTD', 'Posture'],
6878
},
6979
};
7080

uapi/components/auxillaries/shared/AuxillariesWorkspacePanels/AuxillariesWorkspacePanels.tsx

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
/**
2+
* Auxillaries left-rail selector: one card per pane with state chip, title,
3+
* description, and one-word feature pills that fill vertical card height.
4+
*/
15
'use client';
26

37
import React from 'react';
@@ -40,6 +44,7 @@ export default function AuxillariesWorkspacePanels({
4044
? 'Ready auxillary'
4145
: 'Locked auxillary';
4246
const descriptionId = `auxillaries-panel-${step}-state`;
47+
const pillsId = `auxillaries-panel-${step}-pills`;
4348

4449
return (
4550
<div key={step} role="listitem">
@@ -61,7 +66,7 @@ export default function AuxillariesWorkspacePanels({
6166
aria-label={`${descriptor.label} auxillary`}
6267
aria-current={isActive ? 'page' : undefined}
6368
aria-disabled={!isAvailable}
64-
aria-describedby={descriptionId}
69+
aria-describedby={`${descriptionId} ${pillsId}`}
6570
>
6671
<span id={descriptionId} className="sr-only">
6772
{stateLabel}. {descriptor.routeDescription}
@@ -80,6 +85,20 @@ export default function AuxillariesWorkspacePanels({
8085
<p className="orbital-workspace-panel-copy auxillaries-bitcode-selector-card-copy">
8186
{descriptor.routeDescription}
8287
</p>
88+
<ul
89+
id={pillsId}
90+
className="auxillaries-bitcode-selector-card-pills"
91+
aria-label={`${descriptor.label} key features`}
92+
>
93+
{descriptor.featurePills.map((pill) => (
94+
<li
95+
key={pill}
96+
className="auxillaries-bitcode-selector-card-pill"
97+
>
98+
{pill}
99+
</li>
100+
))}
101+
</ul>
83102
</button>
84103
</div>
85104
);

uapi/styles/auxillaries-bitcode.css

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,11 @@
151151
}
152152

153153
.auxillaries-bitcode-pane-with-chrome {
154-
/* Stage still spans full height; chrome only occupies the left column row. */
155-
grid-row: 1 / -1;
154+
/*
155+
* Align content top with the selector list (row 2), not the Close/Disconnect
156+
* chrome row above the left column.
157+
*/
158+
grid-row: 2 / -1;
156159
}
157160

158161
.auxillaries-skip-link {
@@ -395,6 +398,55 @@
395398
text-align: center !important;
396399
}
397400

401+
/* One-word feature pills: square chips that height the card and eat dead space. */
402+
.auxillaries-bitcode-selector-card-pills {
403+
display: flex !important;
404+
flex-wrap: wrap !important;
405+
justify-content: center !important;
406+
align-items: stretch !important;
407+
gap: 0.3rem !important;
408+
list-style: none !important;
409+
margin: 0.35rem 0 0 !important;
410+
padding: 0.28rem 0 0 !important;
411+
border-top: 1px solid rgba(255, 255, 255, 0.06);
412+
width: 100%;
413+
box-sizing: border-box;
414+
}
415+
416+
.auxillaries-bitcode-selector-card-pill {
417+
display: inline-flex !important;
418+
align-items: center !important;
419+
justify-content: center !important;
420+
box-sizing: border-box !important;
421+
/* Compact square-ish chips (slightly shorter than the first pass). */
422+
min-width: 2.35rem;
423+
min-height: 1.85rem;
424+
padding: 0.22rem 0.32rem !important;
425+
border-radius: 0 !important;
426+
border: 1px solid rgba(101, 254, 183, 0.22) !important;
427+
background: rgba(101, 254, 183, 0.06) !important;
428+
color: rgba(220, 252, 231, 0.92) !important;
429+
font-size: 0.58rem !important;
430+
font-weight: 700 !important;
431+
letter-spacing: 0.08em !important;
432+
line-height: 1.05 !important;
433+
text-transform: uppercase !important;
434+
text-align: center !important;
435+
white-space: nowrap;
436+
}
437+
438+
.auxillaries-bitcode-selector-card-current .auxillaries-bitcode-selector-card-pill {
439+
border-color: rgba(101, 254, 183, 0.42) !important;
440+
background: rgba(101, 254, 183, 0.12) !important;
441+
color: rgba(236, 253, 245, 0.98) !important;
442+
}
443+
444+
.auxillaries-bitcode-selector-card-locked .auxillaries-bitcode-selector-card-pill {
445+
border-color: rgba(148, 163, 184, 0.16) !important;
446+
background: rgba(148, 163, 184, 0.06) !important;
447+
color: rgba(203, 213, 225, 0.72) !important;
448+
}
449+
398450
.auxillaries-bitcode-pane {
399451
display: flex !important;
400452
flex-direction: column;

uapi/tests/auxillariesContent.access.test.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,9 @@ describe('AuxillariesContent contained accessibility shell', () => {
8383
expect(activePane).toHaveAttribute('aria-busy', 'false');
8484
expect(activePane).toHaveAttribute('data-auxillaries-pane-state', 'ready');
8585

86-
expect(within(activePane).getByRole('status')).toHaveTextContent('Interfaces');
87-
expect(within(activePane).getByRole('status')).toHaveTextContent('3 panes available');
88-
expect(within(activePane).getByRole('status')).toHaveTextContent('1 blocked');
86+
// Banner summary removed; readiness remains in audit detail + selector cards.
87+
expect(within(activePane).queryByText('Active support pane')).not.toBeInTheDocument();
88+
expect(within(activePane).queryByText(/panes available/i)).not.toBeInTheDocument();
8989
expect(screen.getByTestId('pane-interfaces')).toHaveTextContent('Rendered interfaces');
9090

9191
expect(screen.getByRole('button', { name: 'Interfaces auxillary' })).toHaveAttribute('aria-current', 'page');
@@ -122,7 +122,7 @@ describe('AuxillariesContent contained accessibility shell', () => {
122122
const activePane = screen.getByRole('region', { name: 'Wallet active support pane' });
123123
expect(activePane).toHaveAttribute('aria-busy', 'true');
124124
expect(activePane).toHaveAttribute('data-auxillaries-pane-state', 'loading');
125-
expect(within(activePane).getAllByRole('status')[1]).toHaveTextContent('Loading active pane.');
125+
expect(within(activePane).getByRole('status')).toHaveTextContent('Loading active pane.');
126126
expect(screen.getByTestId('auxillaries-audit-detail')).toHaveTextContent('source-safe summary only');
127127
expect(screen.queryByText(/"currentStep"/)).not.toBeInTheDocument();
128128
});

uapi/tests/auxillariesWorkspacePanels.test.tsx

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,22 @@ describe('AuxillariesWorkspacePanels', () => {
2222
expect(screen.getByLabelText('Active auxillary')).toHaveAttribute('data-state', 'active');
2323
expect(screen.getAllByLabelText('Ready auxillary')).toHaveLength(3);
2424
});
25+
26+
it('renders one-word feature pills on each selector card', () => {
27+
render(
28+
<AuxillariesWorkspacePanels
29+
steps={['wallet', 'externals', 'profile', 'interfaces']}
30+
currentStep="wallet"
31+
availableSteps={['wallet', 'externals', 'profile', 'interfaces']}
32+
onStepClick={jest.fn()}
33+
/>,
34+
);
35+
36+
expect(screen.getByLabelText('Wallet key features')).toBeInTheDocument();
37+
expect(screen.getByText('Providers')).toBeInTheDocument();
38+
expect(screen.getByText('BTC')).toBeInTheDocument();
39+
expect(screen.getByText('GitHub')).toBeInTheDocument();
40+
expect(screen.getByText('Identity')).toBeInTheDocument();
41+
expect(screen.getByText('MCP')).toBeInTheDocument();
42+
});
2543
});

0 commit comments

Comments
 (0)