Skip to content

Admin theming fixes (round 2) - #40

Merged
kbyjoel merged 12 commits into
aropixel:mainfrom
kbyjoel:fix/modal-header-and-h1-weight
Sep 1, 2026
Merged

Admin theming fixes (round 2)#40
kbyjoel merged 12 commits into
aropixel:mainfrom
kbyjoel:fix/modal-header-and-h1-weight

Conversation

@kbyjoel

@kbyjoel kbyjoel commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator

No description provided.

kbyjoel and others added 4 commits August 31, 2026 15:43
- A .modal-header holding only the close button drew Bootstrap's hairline
  under nothing; detect the title structurally with :has() and zero the
  border width for that case only.
- h1 goes bold (700): Bootstrap's reboot leaves headings at 500, and h1
  carried 700 through v2 (Stisla set every heading bold).
- The hr rhythm (dashed, 2.5rem) takes !important on its margin so scoped
  tweaks cannot silently compress the separator.

Static catalogue rebuilt (castor catalog:build --no-shot).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G9HvRYqT42n7yvuCwqHGSh
The navbar notification panels (communication, sync) collapsed to their
content: v2's '.dropdown-list { width: 350px; padding: 0 }' was lost in
the ablation. Restore it as a min-width, and drop the menu padding the
rows never expect (they carry their own).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G9HvRYqT42n7yvuCwqHGSh
Flash messages and legacy templates use Bootstrap's alert vocabulary, which
v3 left on Bootstrap's pale defaults. Paint them the way Tick&Live wore
them through v2: semantic fill, white text (links included), no border —
driven through --bs-alert-* variables like the other bridged components.
Also kill the stray bottom margin on a <p> inside any alert (v2 rule).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G9HvRYqT42n7yvuCwqHGSh
The bridge hardcoded every --bs-*-rgb triplet: an integrator overriding a
colour token still got the default palette in everything Bootstrap builds
from rgba() — .bg-*, .text-bg-*, focus rings — and no override rule can
catch a utility, since Bootstrap's layered !important beats any unlayered
one. CSS cannot decompose a hex token into a bare comma triplet (relative
colour syntax cannot escape its own function), so each bridged colour now
carries an --aro-color-*-rgb companion in _tokens.css and the bridge maps
it: one place to override the pair, no literal left behind.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G9HvRYqT42n7yvuCwqHGSh
@kbyjoel kbyjoel changed the title Admin CSS polish: modals, alerts, dropdowns and token bridge Admin theming fixes (round 2) Aug 31, 2026
kbyjoel and others added 8 commits August 31, 2026 17:12
Stisla gave .tab-content > .tab-pane its own leading (24px, plus a 28px
prose rule); the ablation dropped both and panes fell back to the 18px
body leading, which cramps prose framed by chrome on every side. 28px is
the arbitrated value, kept as a literal like the body leading in
_typography.css, pending the §4 density pass.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G9HvRYqT42n7yvuCwqHGSh
Same reasoning as h1's bold: Bootstrap's reboot leaves headings at 500.
h1 bold, h2 semibold — a step apart so the hierarchy reads.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G9HvRYqT42n7yvuCwqHGSh
The v3 ImageMapper calls getAttributes() for every ImageType, where v2
only read attributes in the gallery (whose items always carry one). Any
integration passing a domain object without an 'attributes' property —
legitimate, since only filename_value is configurable — now threw
NoSuchPropertyException. Attributes and crops are optional and guarded by
the mapper: read them through isReadable() and return null when absent.
getFileName() stays strict, an unreadable filename is a real
misconfiguration.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G9HvRYqT42n7yvuCwqHGSh
app.js reads its button labels from data-confirm-label / data-cancel-label, which yield
undefined when the attributes are absent. Object.assign copied that undefined over the
translated defaults, and textContent = undefined empties the node — so every caller not
using the actions macro rendered two blank buttons.

Drop the undefined entries before merging.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G9HvRYqT42n7yvuCwqHGSh
The macro covers edit / status / delete and nothing else, so a row needing one more item —
a preview link, a modal trigger — had to fall back to hand-written markup, and with it to
the blank-button bug. Add an optional 'extra' parameter, rendered between edit and status
and counted by the divider logic. Capture it with {% set %} so it stays Markup.

The parameter table in doc/macros.md was also missing 'status' and 'delete_token'.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G9HvRYqT42n7yvuCwqHGSh
_bootstrap-layer.css claimed unlayered CSS always wins and that an integrator's stylesheet
therefore keeps winning over ours. True for normal declarations, false for !important: the
layer order reverses (CSS Cascading 5 §6.4), so a layered important beats an unlayered one.

Every Bootstrap utility is !important, so .w-100 in the markup now defeats an unlayered
.my-column { width: 350px !important }. Verified in Chromium. Nothing to escalate to — the
fix is to drop the utility. This is also the real reason components/ may not use !important.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G9HvRYqT42n7yvuCwqHGSh
processResults moved from data.items / data.total_count to data.results /
data.pagination.more. An endpoint answering the old shape fails in the worst way: the
request fires, the response arrives, the list renders empty, and nothing reaches the
console.

Also note that Component\Select2\Select2 only covers Doctrine-backed lists — every path
ends in a QueryBuilder, Select2DataProviderInterface included.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G9HvRYqT42n7yvuCwqHGSh
The picker behind ColorType is unchanged since v3.0.0 — the type, the
`aropixel_admin_color_widget` block, the `$('.color-picker').spectrum()`
init and the `<link>`/`<script>` tags in Form/base.html.twig are all
still there. What went missing is the skin: it lived in the deleted
`css/custom.css`, and unlike Select2, DataTables, pickadate and
tagsinput it was never transcribed into `css/vendor/`. The picker fell
back to the raw plugin stylesheet — orange border, gradient buttons, hue
bar hard against the saturation square.

Restyled on tokens rather than transcribed, because two things the
v3.0.0 rules leaned on are gone: `--main-bg-color` (the *choose* button,
now on the primary tokens) and the Font Awesome 5 chevron of `.sp-dd`
(the admin no longer ships FA, so Spectrum's own `▼` glyph stays, muted).
The resting control now wears the field surface of the other inputs
instead of the old flat grey; geometry is kept as it was.

No form in the sandbox uses ColorType, so the popup appears in no visual
baseline — validated by driving a picker in Browserless, open and
closed, with and without the sheet.

The catalogue is rebuilt because a sheet entered the manifest: pure
addition, and the README preview came back byte-identical.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EkNJFwEGLYcH6MNb4rjHFK
@kbyjoel
kbyjoel merged commit 3e6ecb0 into aropixel:main Sep 1, 2026
@kbyjoel
kbyjoel deleted the fix/modal-header-and-h1-weight branch September 1, 2026 09:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant