fix(edit-content): resolve UI inconsistencies after Lara Theme migration#35319
fix(edit-content): resolve UI inconsistencies after Lara Theme migration#35319
Conversation
|
Claude finished @oidacra's task in 3m 19s —— View job PR Review
FindingsFunctional regressions
Accessibility
Inconsistent focus/error states across the new fields
Fragile approach
Calendar SCSS architecture
Unfixed items from prior review comments
Minor
|
|
Claude finished @oidacra's task in 53s —— View job Rollback Safety Analysis
Result: Safe to Rollback ✅All 5 changed files are pure frontend (Angular/CSS/SCSS) — no backend, database, Elasticsearch, or API changes are present.
All changes are limited to:
Label |
|
Screenshot please :D |
Legal RiskThe following dependencies were released under a license that RecommendationWhile merging is not directly blocked, it's best to pause and consider what it means to use this license before continuing. If you are unsure, reach out to your security team or Semgrep admin to address this issue. GPL-2.0 MPL-2.0 |
9b20df0 to
274d0f6
Compare
Added video |
a23c961 to
1a0847a
Compare
|
Thanks for the review — walking through the findings: 1. 2. 3. 4. Sidebar toggle 5. 6. Sidebar data reloads on every open — Won't fix. 7. |
…ra theme tokens - Add [fluid]="true" to tags field autocomplete for full-width rendering - Replace hardcoded outline styles on block editor with PrimeNG Lara input tokens for border, hover, focus, and error states - Replace $border-radius-md with var(--p-inputtext-border-radius) on binary field drop-zone elements
…ttom border - Wire [loading] and [disabled] bindings to workflow action buttons using the store's isSaving signal to prevent duplicate submissions - Add tabsPt passthrough config with bottom border on main content tabs to match sidebar tab styling
… align tabs Unifies hover/focus/transition and border-radius across non-native PrimeNG inputs (Binary, Block Editor, File/Image, JSON, WYSIWYG/TinyMCE + Monaco, Relationship, Category, Calendar) using Lara theme tokens so they move with the theme. Other fixes in the same pass: - Move date field focus/hover ring to the p-datepicker wrapper so it encloses the input and calendar button as one unit. - Category field: gray border, border-radius, stable 36px min-height. - JSON field: remove overflow-auto clipping the focus ring and reserve horizontal breathing room so the ring is not cut off on the sides. - Form and sidebar p-tablist: add matching gray bottom border and align both tablists at the same 51px height so their baselines match. - Form tablist: add px-8 so tabs and right-side actions align with the form body; drop redundant pr-4 on edit-content-actions.
- Keep sidebar always mounted with @defer (on idle) instead of @if, avoiding mount/unmount churn and the content squeeze during the grid transition. - Mark the sidebar inert and aria-hidden while collapsed so it stays focus-/AT-transparent. - Sync the external toggle with an Angular :enter/:leave width animation (150ms) so the Save group no longer snaps when the button appears or disappears; it now interpolates in step with the grid columns. - Match the external toggle's wrapper, button size, icon, and right placement (-mr-8) to the internal one so the icon does not jump between the open and closed states. - Force the sidebar tablist inner list and tabs to full height so the inactive tab background reaches the bottom border.
Replace shadow-md (all-sides) with a left-biased shadow so the sidebar reads as a floating panel over the body instead of a boxed pane.
Apply the left-cast shadow only when the sidebar is not inert so it stops bleeding into the body area while the sidebar is off-screen.
… flash Drop the @defer (on idle) around the sidebar: the component is statically imported, so deferring only delayed instantiation without reducing the bundle. The grid reserves the sidebar column from the first frame, so waiting for idle left ~200ms of empty white space on initial load.
… sidebar gating, and WYSIWYG focus ring - Wrap ::ng-deep rules in :host in dot-wysiwyg-tinymce.component.scss - Exclude .editor-wrapper--error from hover/focus-within rules in block editor so the invalid border is never masked - Gate sidebar getReferencePages/loadActivities on isSidebarOpen to skip unnecessary API calls when the sidebar is collapsed - Replace :focus-within with a JS-driven --focused class for TinyMCE because Chrome does not propagate :focus from an iframe to its parent, making the CSS pseudo-class a no-op
The TinyMCE upgrade changed the statusbar DOM structure, making the previously hidden branding badge visible again. Hide it with a scoped ::ng-deep rule targeting .tox-statusbar__branding.
…onaco ng-dirty, defer, sidebar token - dot-category-field.component.scss: add :host.ng-invalid.ng-touched rule; guard hover against .ng-invalid so the error color is not masked - dot-edit-content-monaco-editor-control.component.scss: drop :not(.ng-dirty) from hover/focus suppressors and remove standalone .ng-dirty red-border rule; ng-invalid is now the sole error indicator - dot-edit-content.layout.component.html: remove redundant @defer inside @if for both view === 'form' and view === 'compare' branches - dot-edit-content-sidebar.component.html: sidebar-toggle border uses --p-inputtext-border-color instead of legacy --gray-200 - dot-file-field.component.{html,scss}: move border and border-radius out of the template into .dot-file-field__container SCSS using PrimeNG tokens
…m fields
- dot-card-field.component.ts: collapse empty <dot-card-field-footer> with :empty { display: none } so consumers that always project the footer element no longer push column content out of alignment via the flex gap
- dot-edit-content-calendar-field.component.html: wrap <dot-card-field-footer> in @if so the always-rendered inner wrapper div stops contributing a 7px gap when there is no error, hint, or timezone message
- dot-category-field.component.scss: match pInputText rendered height exactly with min-height: calc(var(--p-form-field-padding-y) * 2 + 1.4em + 2px) and box-sizing: border-box; previous 39px left a 0.1px sub-pixel gap
Result: every .field wrapper in the 2-column grid renders at 65.703px, so adjacent left/right rows align to the pixel.
Replace the conditional inline-SVG toggle and the tabs-embedded close button with a single always-visible button that mirrors the UVE editor's right-panel toggle. - dot-edit-content-form.component.html: render the toggle unconditionally; swap the inline SVG for the UVE assets (left_panel_open.svg and left_panel_close.svg) flipped with -scale-x-100 and toggled via [class.hidden]; drop the border-l separator and fixed 64px wrapper, keep -mr-4 to nudge it toward the sidebar edge - dot-edit-content-form.component.ts: remove the now-unused slideToggle animation trigger - dot-edit-content-sidebar.component.html: remove the dotTabViewInsert reference, the appendContent template and the inline close button inside the tabs toolbar; set min-h-[53px] on <p-tablist> so its bottom border aligns with the external tabs at the pixel level, and add flex-1 + flex items-center justify-center on each p-tab so icons are evenly distributed and centered - dot-edit-content-sidebar.component.ts: drop TabViewInsertDirective import, remove toggleButtonPt, remove justify-between from the tabs navContent (no longer needed without the embedded button) - tab-view-insert.directive.ts: mark the directive as deprecated in JSDoc (it is still used from the form component but is now only a legacy escape hatch) - Language.properties: add edit.content.sidebar.open / edit.content.sidebar.close i18n keys for the img alt text
- dot-edit-content-sidebar.component.spec.ts: drop the 'should have toggle-button element' assertion and the whole 'Sidebar Controls' describe block — the inline toggle button and its append-content template were removed from the sidebar in the previous commit - dot-edit-content-form.component.spec.ts: drop the 'sidebar is closed so the toggle renders' precondition (the toggle is now always visible); add a new assertion that both sidebar-open-icon and sidebar-close-icon exist and that exactly one is hidden at any time All 1774 tests in edit-content pass (28 skipped, 0 failed).
f689082 to
0eb6ff4
Compare
…update size limits in project.json - Deleted .postcssrc.json as it is no longer needed. - Updated budget limits in project.json to allow larger initial bundle sizes (3.5mb warning, 5mb error). - Removed Tailwind CSS imports from style.css to streamline styles.
…state detection - Added an input to the activities tab component to track its visibility state. - Updated the scroll effect to trigger when the activities tab becomes active, ensuring smooth scrolling to the last activity item when the tab is displayed.
Summary
isSidebarOpento avoid unnecessary network requests when the sidebar is collapsed:focusfrom TinyMCE's iframe)Closes #35009
Changes
tag-field.component.html[fluid]="true"to<p-autoComplete>for 100% widthdot-block-editor.component.css--p-inputtext-*tokens for border, hover, focus, error, and border-radius; exclude error state from hover/focus-within rules so invalid border is never maskeddot-edit-content-binary-field.component.scss$border-radius-mdwithvar(--p-inputtext-border-radius)dot-edit-content-form.component.html[loading]and[disabled]bindings on workflow action buttons; add[pt]="tabsPt"to tabsdot-edit-content-form.component.tstabsPtpassthrough config with bottom border for main content tabsdot-edit-content.layout.component.htmlinert/aria-hiddentogglingdot-edit-content-sidebar.component.htmldot-edit-content-sidebar.component.tsgetReferencePages/loadActivitieseffect onisSidebarOpen()signal; add softer sidebar shadow; hide shadow when collapsedcalendar-field.component.scss+.ts<p-datepicker>wrapper enclosing input + icon buttondot-category-field.component.{html,scss,ts}dot-file-field.component.{html,scss}dot-relationship-field.component.{html,scss,ts}dot-edit-content-json-field.component.htmldot-edit-content-monaco-editor-control.component.scssdot-wysiwyg-tinymce.component.{ts,html,scss}:focus-within(broken on iframes) with JS-driven--focusedclass via TinyMCE focus/blur events; scope all::ng-deepinside:host; hide.tox-statusbar__brandingbadgeAcceptance Criteria
getReferencePages/loadActivitiesAPI calls when collapsed (persisted via localStorage)Test Plan
Visual Changes
CleanShot.2026-04-16.at.10.12.49.mp4
Notes
Atomic commits on this branch:
fix(edit-content): align tags, block editor, and binary field with Lara theme tokens— Pure CSS/SCSS/template styling fixesfix(edit-content): disable action buttons during save and add tabs bottom border— Component logic wiring for button state and tabs passthroughfix(edit-content): apply Lara focus/hover tokens to custom fields and align tabs— Calendar, category, file, relationship, WYSIWYG, Monaco, and JSON field token alignmentfix(edit-content): smooth sidebar open/close flow without layout pop— Always-mounted sidebar with inert/aria-hiddenfix(edit-content): use a softer left-cast shadow on the sidebar— Sidebar shadow tuningfix(edit-content): hide sidebar shadow when collapsed— Conditional shadow via :not([inert])fix(edit-content): render sidebar synchronously to avoid empty column flash— Remove @defer, render sidebar eagerlyfix(edit-content): fix review findings — scoped ng-deep, error hover, sidebar gating, and WYSIWYG focus ring— Code review fixes: ::ng-deep scoping, block editor error/hover specificity, sidebar API gating, TinyMCE iframe focus workaroundfix(edit-content): hide TinyMCE branding badge after library upgrade— Hide .tox-statusbar__branding