# Admin UI visual parity inventory

One row per major admin page. Compiled from the rendered-D7 baseline
(`d7_form_baseline.json`, captured from D7's own output), live D10 renders, and
the focused verifiers named in each row.

## How to read the CSS column, before anything else

🛑 **D7 and D10 do not share an admin theme, and no row here claims they do.**
D7's admin renders in `seven`/`bootstrap`; D10's renders in **Claro**. Claro is
not a reskin of Seven — different type scale, different control heights,
different form-item spacing. Matching it pixel-for-pixel would mean shipping a
D7 theme clone as the D10 admin theme, which is a far larger change than
anything else in this migration and is not what was built.

What *was* made to match is **structure**: the markup, classes, grouping and
inline/stacked layout that the ported D7 stylesheet keys off. Where a layout
defect was real — a widget label outside its wrapper, a date pair stacking
instead of sitting inline, a view missing its `view-id-*` wrapper classes — it
was fixed **in the Form API, render arrays, Views config or templates**, never
with new CSS. Every such fix is named in its row.

So `CSS` below means: *does this page carry D7's structural classes and layout
shape*. It does not mean the two screenshots are identical, and a row saying
`STRUCTURAL` is telling you they are not.

| Page | D7 source | Fields | Sections | Layout | Labels | CSS | Date picker | Actions | Status |
|---|---|---|---|---|---|---|---|---|---|
| `/report` | `admin_report_new:panel_pane_admin_report_new_detail` | 8 widgets, match | filter row | inline pairs restored | exact | STRUCTURAL — D7 view wrapper classes restored via template | **2 filters, jQuery UI** | Apply | **PASS** |
| `/report/history` | `report_history:page` | match | table | table | exact | STRUCTURAL | n/a — D7 exposes none | — | **PASS** |
| `/sale-report` | `sale_report:panel_pane_admin_sale_report` | 5 widgets, match | filter row | inline pairs | exact | STRUCTURAL | **1 filter, jQuery UI** | Apply | **PASS** |
| `/evaluation-results` | `evaluation_results:default` | 3 widgets, match | filter + pivot table | rebuilt to D7's shape (Round 8) | exact | STRUCTURAL | **1 filter, jQuery UI** | Apply | **PASS** |
| `/marketing-report` | `sale_report:panel_pane_advanced_report` | 2 widgets, match | filter row | inline | exact | STRUCTURAL | **1 filter, jQuery UI** | Apply | **PASS** |
| `/marketing-report/detail` | `sale_report:panel_pane_adv_report_detail` | 21 widgets, match | filter grid | inline | exact | STRUCTURAL | **4 filters, jQuery UI** | Apply | **PASS** |
| `/marketing-report/new-detail` | `sale_report:panel_pane_adv_report_new_detail` | 24 widgets, match | filter grid | inline | exact | STRUCTURAL | **5 filters, jQuery UI** | Apply | **PASS** |
| Report exports (XLS) | `views_data_export_*` | n/a | n/a | n/a | n/a | n/a | n/a | Download | **PASS** |
| `/admin/structure/certificates` | `certificate_templates_list()` | 4 columns | list | table | exact | Claro table | n/a | Edit·Delete·PDF·Create | **PASS** |
| …`/settings`, `/clear` | `certificate_admin_*` | exact | 1 each | stacked | exact | Claro form | n/a | Save·Clear | **PASS** |
| …`/mapping` (Global) | `certificate_settings_form()` | 1 select + 58 options | 1 fieldset | collapsed | exact | Claro details | n/a | Update | **PASS** |
| …`/mapping/groups` | `certificate_field_grouping_form()` | Submit only — as D7 | 0 | — | exact | Claro | n/a | Submit·Add | **PASS** |
| Certificate mapping on node form | `certificate_mapping_form()` | 1 select | fieldset | vertical tabs | exact | Claro | n/a | — | **PASS** |
| `/admin/config/ce-referral` | `ce_referral_config_form()` | 18, match | flat | stacked | exact | Claro | n/a | Save configuration | **PASS** |
| `/admin/config/ce-referral/admin-credit-debit_referral` | `ce_referral_credit_debit_form()` | 5, match | flat | stacked | exact | Claro | n/a | Submit | **PASS** |
| `/admin/config/services/wistia_integration` | `wistia_global_settings()` | 3, match | flat | stacked | exact | Claro | n/a | Save configuration | **PASS** |
| Quiz node form settings | `quiz_form()` | 17 of 33 columns | 3 fieldsets | vertical tabs, as D7 | exact | Claro | n/a | Save | **PASS** |
| Multichoice answer editor | `MultichoiceQuestion::getCreationForm()` | per-alternative | fieldsets | stacked | exact | Claro | n/a | Save·Add choice | **PASS** |
| `/admin/commerce/orders` + order view/edit/payments | Commerce 1 order UI | Commerce 3 native | Commerce 3 native | Commerce 3 | Commerce 3 | Claro | n/a | incl. `operation/{op}` | **LEGITIMATE DIFFERENCE** |
| `/admin/commerce/products` (+ types, variations) | Commerce 1 product UI | Commerce 3 native | Commerce 3 native | Commerce 3 | Commerce 3 | Claro | n/a | Add·Edit·Delete | **LEGITIMATE DIFFERENCE** |
| Product **Change history** | `diff` module on products | — | — | — | — | — | — | — | **BUSINESS DECISION** — needs revisionable Commerce entities; reverses Decision 12; 169 revisions archived |
| `/admin/people` | D7 people view | Name·E-mail·Roles·Active | filters | inline | exact | Claro | n/a | Add·Edit·Cancel | **PASS** |
| `/admin/content`, taxonomy, media, webform | core + contrib | core | core | core | core | Claro | n/a | core | **LEGITIMATE DIFFERENCE** |
| `/admin/config/content/flag-manager` | `flag_clear` | match | list | table | exact | Claro | n/a | Clear | **PASS** |
| `/admin/config/development/license-prefix-update` | `ce_users` | match | 1 | stacked | exact | Claro | n/a | Run | **PASS** |
| Dashboard shortcuts | D7 dashboard | all destinations audited Round 6 | — | — | — | Claro | n/a | — | **PASS** |
| `admin/quiz/settings/config` (12 globals) | `quiz_admin_settings()` | — | — | — | — | — | — | — | **N/A** — no setting is read by `ce_quiz`; per-setting evidence in Round 17 §A |
| `admin/config/services/wistia` (API key) | `media_wistia_ceonline` | — | — | — | — | — | — | — | **N/A** — D7 Media browser only; no D10 consumer |
| Panels · Page manager · Features · Data · Schema · Rules · CKEditor 3 · Ultimate Cron · AdvAgg · Backup&Migrate · print_pdf · custom_breadcrumbs · masquerade · mimemail · Views export/revert | D7 contrib | — | — | — | — | — | — | — | **OBSOLETE** |
| D7 admin theme pixel parity (type scale, control heights, form-item spacing) | `seven` / `bootstrap` | — | — | Claro | — | Claro ≠ Seven | — | — | **LEGITIMATE DIFFERENCE** — see the note at the top |

## Date picker — the one visual item that was changed in this round

D7 runs **better_exposed_filters** with `bef_format = 'bef_datepicker'`, i.e. a
**jQuery UI calendar**, and `datepicker_options = "changeMonth: true\r\nchangeYear:
true"` with **no `dateFormat` override** — so jQuery UI's default `mm/dd/yy`.

Before this round D10 rendered `<input type="date">`. That is a calendar, but it
differs where an administrator notices: the browser's locale format instead of
`mm/dd/yy`, segmented keyboard entry instead of free text, and placeholders
silently ignored. `jquery_ui_datepicker` is now installed and bound to exactly
the filters D7 binds it to, with D7's two options and D7's format.

Coverage, checked against the **rendered** D7 baseline rather than the stored
config, because D7 also carries `bef_datepicker` settings for filters it never
exposes (21 configured, 14 exposed):

| Page | exposed D7 date filters | D10 picker inputs |
|---|---|---|
| `/report` | 2 (`date_filter_2`, `date_filter`) | 4 ✓ |
| `/sale-report` | 1 (`created`) | 2 ✓ |
| `/marketing-report` | 1 | 2 ✓ |
| `/marketing-report/detail` | 4 | 8 ✓ |
| `/marketing-report/new-detail` | 5 | 10 ✓ |
| `/evaluation-results` | 1 (`submitted`) | 2 ✓ |

⚠️ `commerce_order_total_amount` is a numeric `between` filter and correctly gets
**no** picker — D7 renders it as a plain pair of text boxes.

🛑 **jQuery UI is end-of-life.** D10 core removed it deliberately, and Drupal's
own webform maintainers call their datepicker integration "deprecated because
jQueryUI is no longer maintained". It is reinstated here because the brief
requires the date-picker UI and behaviour to match D7. Whether to keep it or
accept the native control is a **business decision** the client now owns.

## Layout defects found and fixed in earlier rounds — all in the Form API, none in CSS

| Defect | Fix |
|---|---|
| Date range stacked vertically instead of inline | `container-inline` + `ce-report-date-range` on the wrapper, in `hook_form_views_exposed_form_alter()` |
| Widget label rendered outside its wrapper | label emitted as a child `html_tag`, not `#prefix` (which `ce_core` prepends to first) |
| Views missing D7's `view view-id-* view-display-id-*` wrapper classes | five `views-view--*.html.twig` templates re-adding them |
| Evaluation Results rendered as a modern D10 table | pivot view rebuilt to D7's shape (Round 8) |
| Flag fieldset ignoring its weight | it is an *extra field*; position set on the form display component |
| Hidden form-display components on product/course/article/blog/page/certificate/video/webform | restored at D7's weights and widgets |
| Toolbar overlapping the header | `toolbar-displacement.css` — the one CSS file, and it exists because core writes an inline `padding-top` that only `!important` can outrank |
