diff --git a/frontend/src/v2/__tests__/v2Primitives.test.tsx b/frontend/src/v2/__tests__/v2Primitives.test.tsx
index 92a4bda88..4486259e7 100644
--- a/frontend/src/v2/__tests__/v2Primitives.test.tsx
+++ b/frontend/src/v2/__tests__/v2Primitives.test.tsx
@@ -58,4 +58,13 @@ describe('D223 primitives', () => {
render();
expect(screen.getByLabelText('Primitives')).toHaveClass('v2p-pane--scroll');
});
+
+ test('the disclosure row has its summary grid, chevron turn and 390 rule', () => {
+ expect(css).toContain('details.v2p-disc > summary {');
+ expect(css).toContain('details.v2p-disc[open] > summary .chev { transform: rotate(180deg); }');
+ expect(css).toMatch(/@media \(max-width: 480px\)[\s\S]*details\.v2p-disc > summary \{ grid-template-columns: minmax\(0, 1fr\) auto auto;/);
+ const { container } = render();
+ expect(container.querySelector('details.v2p-disc')).not.toBeNull();
+ expect(container.querySelector('details.v2p-disc svg.chev path')?.getAttribute('d')).toBe('m6 9 6 6 6-6');
+ });
});
diff --git a/frontend/src/v2/primitives/V2PrimitivesPage.tsx b/frontend/src/v2/primitives/V2PrimitivesPage.tsx
index 12f717e0c..58305b742 100644
--- a/frontend/src/v2/primitives/V2PrimitivesPage.tsx
+++ b/frontend/src/v2/primitives/V2PrimitivesPage.tsx
@@ -37,6 +37,18 @@ const V2PrimitivesPage: React.FC = () => (
+
disclosure row
+
+
+
+ How it runs
+ CLI ยท webhook
+
+
+ Detail sits behind the row and is closed by default.
+
+
+
chips, badges, dots
diff --git a/frontend/src/v2/primitives/primitives.css b/frontend/src/v2/primitives/primitives.css
index 20b6ed072..4f8c63d70 100644
--- a/frontend/src/v2/primitives/primitives.css
+++ b/frontend/src/v2/primitives/primitives.css
@@ -192,6 +192,14 @@
border-top: 1px solid var(--v2-border-soft);
}
.v2p-lrow:first-child { border-top: 0; }
+/* Disclosure row, lifted from d215 (details.disc, lines 322-326 and the 390 rule at 504). */
+details.v2p-disc { border-top: 1px solid var(--v2-border-soft); }
+details.v2p-disc > summary { list-style: none; cursor: pointer; display: grid; grid-template-columns: 180px minmax(0, 1fr) auto; align-items: center; gap: 14px; min-height: 52px; padding: 8px 14px 8px 16px; }
+details.v2p-disc > summary::-webkit-details-marker { display: none; }
+details.v2p-disc > summary .chev { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; color: var(--v2-text-placeholder); transition: transform 160ms; }
+details.v2p-disc[open] > summary .chev { transform: rotate(180deg); }
+details.v2p-disc > summary .lb { font-size: 13px; font-weight: 600; color: var(--v2-text-primary); display: flex; align-items: center; gap: 8px; }
+details.v2p-disc > summary .vl { font-size: 13.5px; color: var(--v2-ink-2); min-width: 0; display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.v2p-lrow .lb { font-size: 13px; font-weight: 600; color: var(--v2-text-primary); display: flex; align-items: center; gap: 8px; }
.v2p-lrow .vl { font-size: 13.5px; color: var(--v2-ink-2); min-width: 0; display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.v2p-lrow .vl .mo { font-size: 12px; color: var(--v2-text-muted); }
@@ -340,6 +348,7 @@
.v2p-ph h1 { font-size: 20px; white-space: normal; }
.v2p-body { padding: 16px 14px; }
.v2p-lrow { grid-template-columns: minmax(0, 1fr); min-height: 48px; padding: 8px 12px; }
+ details.v2p-disc > summary { grid-template-columns: minmax(0, 1fr) auto auto; min-height: 48px; padding: 8px 12px; }
.v2p-drawer:not(.v2p-drawer--inline) { width: 100%; border-radius: 0; }
.v2p-cols { grid-template-columns: minmax(0, 1fr); }
.v2p-tile { height: 104px; }