diff --git a/browse/css/base.css b/browse/css/base.css index 17a96fd..65ec2b4 100644 --- a/browse/css/base.css +++ b/browse/css/base.css @@ -52,7 +52,7 @@ body { margin: 0.4rem 0; } -.hidden { display: none !important; } +/* .hidden lives in shared/base.css; no per-tool override needed. */ /* Status bar — shows transient errors/info */ .status-bar { diff --git a/form/css/form.css b/form/css/form.css index 9fda7b0..deb4f8e 100644 --- a/form/css/form.css +++ b/form/css/form.css @@ -1,5 +1,8 @@ /* form/ — ZDDC generic form renderer. - Pulls theme tokens from shared/base.css; only adds form-specific layout. */ + Form-specific layout only; theme tokens (--primary, --bg, --text, + --border, --bg-secondary, --text-muted, --font-mono, --radius) come + from shared/base.css. Button styles (.btn, .btn-primary, + .btn-secondary, .btn-sm) likewise inherit from shared. */ .form-main { max-width: 800px; @@ -10,20 +13,20 @@ .form-status { padding: 0.75rem 1rem; margin-bottom: 1rem; - border-radius: 4px; - border: 1px solid var(--color-border); + border-radius: var(--radius); + border: 1px solid var(--border); } .form-status.is-error { - background: var(--color-bg-alt); - border-color: #c43; - color: #c43; + background: var(--bg-secondary); + border-color: var(--danger); + color: var(--danger); } .form-status.is-success { - background: var(--color-bg-alt); - border-color: #283; - color: #283; + background: var(--bg-secondary); + border-color: var(--success); + color: var(--success); } .form-root { @@ -44,24 +47,24 @@ } .form-field__label .required-mark { - color: #c43; + color: var(--danger); margin-left: 0.15rem; } .form-field__description { font-size: 0.85rem; - color: var(--color-text-muted, #666); + color: var(--text-muted); } .form-field__error { font-size: 0.85rem; - color: #c43; + color: var(--danger); margin-top: 0.15rem; } .form-field__help { font-size: 0.8rem; - color: var(--color-text-muted, #666); + color: var(--text-muted); font-style: italic; } @@ -69,10 +72,10 @@ .form-field__textarea, .form-field__select { padding: 0.5rem 0.65rem; - border: 1px solid var(--color-border); - border-radius: 4px; - background: var(--color-bg, #fff); - color: var(--color-text, #111); + border: 1px solid var(--border); + border-radius: var(--radius); + background: var(--bg); + color: var(--text); font: inherit; width: 100%; box-sizing: border-box; @@ -86,14 +89,14 @@ .form-field__input:focus, .form-field__textarea:focus, .form-field__select:focus { - outline: 2px solid var(--color-primary, #1e3a5f); + outline: 2px solid var(--primary); outline-offset: -1px; } .form-field--invalid .form-field__input, .form-field--invalid .form-field__textarea, .form-field--invalid .form-field__select { - border-color: #c43; + border-color: var(--danger); } .form-field__radio-group, @@ -113,8 +116,8 @@ } .form-fieldset { - border: 1px solid var(--color-border); - border-radius: 4px; + border: 1px solid var(--border); + border-radius: var(--radius); padding: 0.75rem 1rem 1rem; display: flex; flex-direction: column; @@ -136,10 +139,10 @@ display: flex; gap: 0.5rem; align-items: flex-start; - border: 1px solid var(--color-border); - border-radius: 4px; + border: 1px solid var(--border); + border-radius: var(--radius); padding: 0.5rem; - background: var(--color-bg-alt, #f6f6f8); + background: var(--bg-secondary); } .form-array__row-body { @@ -165,41 +168,8 @@ gap: 0.5rem; } -.btn { - padding: 0.5rem 1rem; - border-radius: 4px; - border: 1px solid var(--color-border); - background: var(--color-bg, #fff); - color: var(--color-text, #111); - cursor: pointer; - font: inherit; -} - -.btn:hover { - background: var(--color-bg-alt, #f6f6f8); -} - -.btn-primary { - background: var(--color-primary, #1e3a5f); - color: #fff; - border-color: var(--color-primary, #1e3a5f); -} - -.btn-primary:hover { - filter: brightness(1.1); -} - -.btn-small { - padding: 0.2rem 0.5rem; - font-size: 0.85rem; -} - -.btn[disabled] { - opacity: 0.5; - cursor: not-allowed; -} - -/* Standalone welcome — shown when form.html is opened directly (no server-injected #form-context). */ +/* Standalone welcome — shown when form.html is opened directly (no + server-injected #form-context). */ .form-welcome { max-width: 36rem; margin: 2rem auto; diff --git a/form/js/array.js b/form/js/array.js index 2737e1e..7074bce 100644 --- a/form/js/array.js +++ b/form/js/array.js @@ -54,7 +54,7 @@ const actions = u.h('div', { className: 'form-array__row-actions' }); const removeBtn = u.h('button', { type: 'button', - className: 'btn btn-small', + className: 'btn btn-sm btn-secondary', title: 'Remove this row', onClick: function () { removeRow(rowEl); } }, '×'); @@ -85,7 +85,7 @@ if (addable) { const addBtn = u.h('button', { type: 'button', - className: 'btn btn-small form-array__add', + className: 'btn btn-sm btn-secondary form-array__add', onClick: function () { addRow(undefined); } }, '+ Add'); wrap.appendChild(addBtn); diff --git a/tests/form-safety.spec.js b/tests/form-safety.spec.js index aee3b1a..50d4acc 100644 --- a/tests/form-safety.spec.js +++ b/tests/form-safety.spec.js @@ -108,8 +108,9 @@ test.describe('form/ — safety check-in renderer', () => { await page.locator('.form-array__add').click(); await expect(page.locator('.form-array__row')).toHaveCount(2); - // Remove the first row. - await page.locator('.form-array__row').first().locator('button.btn-small').click(); + // Remove the first row. Button now uses shared .btn-sm + // instead of the legacy form-local .btn-small class. + await page.locator('.form-array__row').first().locator('button.btn-sm').click(); await expect(page.locator('.form-array__row')).toHaveCount(1); });