Skip to content

release/v0.4.6: skeleton loading components and dark palette tiers - #189

Open
roncodes wants to merge 13 commits into
mainfrom
release/v0.4.6
Open

roncodes wants to merge 13 commits into
mainfrom
release/v0.4.6

Conversation

@roncodes

@roncodes roncodes commented Oct 11, 2026 •

Copy link
Copy Markdown
Member

Companion to fleetbase/storefront#137 (Storefront UX overhaul).

What changed

  • Skeleton loading components. The family covers these components:

    • Skeleton, with text, title, circle, avatar, rect, button, badge and input shapes.
    • Skeleton::Text, Skeleton::Table, Skeleton::Card, Skeleton::CardsGrid, Skeleton::Panel, Skeleton::Form, Skeleton::StatTiles, Skeleton::PageHeader and Skeleton::Tabs.
    • The Skeleton::Page composite for route loading.hbs templates. Its @view is table, cards, form, dashboard or panel, or a block replaces the body.

    Boxes are aria-hidden. The page composite announces once through role="status" aria-busy="true" with @label, which falls back to common.loading. The shimmer honours prefers-reduced-motion.

  • Skeletons follow the page they stand in for. Every new argument is optional, and the defaults draw what they drew before.

    • Skeleton::Page table card: @tabs sets the status-tab count and 0 means none. @toolbar={{false}}, @checkbox={{false}} and @footer={{false}} drop those parts. @identityColumn takes the index of the avatar-and-name column, or false for none.
    • Header: @borderlessHeader.
    • Skeleton::Card and Skeleton::CardsGrid: @mediaFirst puts the image first. @avatar draws an identity header and @subtitle adds a line under the title. @status is "badge", a dot or false. @lines sets the body lines, and the body is skipped at 0. @footerActions sets the icon buttons and @footerBadge leads them with a badge. @footerLines adds meta lines under the footer row.
    • Skeleton::Tabs draws an underlined tab strip with optional count pills.
  • Dark resource card tier. Layout::Resource::Card gets hook classes (resource-card, -header, -body, -footer) and an opaque #1f2937 surface. Inner hairlines are #2d3748 and the footer is #273244, replacing bg-gray-700/50.

  • The button and input restyles from the first push were reverted (f289b6e, ba18b8f). They wait for the platform-wide pass.

  • Comment thread: a subject keyed by uuid (such as a contact record) now sends subject_uuid. The console's comment serializer drops subject_id, so notes on contacts were inserted without a subject.

  • Badges and buttons: a delivery badge status uses the violet tone, and the dark-mode success button hover is two tones darker than before (green-600; green-500 still read too light).

  • Skeleton grid: the cards grid follows the Layout::Resource::CardsGrid breakpoints, so it never shows fewer columns than the page.

  • Version bumped to 0.4.6.

Validation

  • npx ember test --filter "/comment-thread|skeleton/": 53 tests, 53 pass.
  • eslint, ember-template-lint and stylelint on the touched files are clean.
  • Dark success hover checked in the console: a hovered Accept order button computes to rgb(22, 163, 74) (green-600).
  • Rendered in the console at 1440×900 through the linked package. Storefront loading states were checked against the pages they stand in for: dashboard, orders, customers, catalogs, trucks, promotions, products, settings and the network pages. Both themes were checked.

Notes

  • Loading substates in extensions only render if the console's application route lets the loading event bubble with return true. That one-line change is needed in fleetbase/fleetbase console/app/routes/application.js, and the Storefront PR calls it out.
  • No API or docs impact.

… cards, buttons and inputs

Adds a Skeleton family (Skeleton, Skeleton::Text, Table, Card, CardsGrid, Panel, Form,
StatTiles, PageHeader and the Skeleton::Page composite for route loading templates) with
a shimmer that respects reduced motion and a single role=status announcement.

Dark palette: the resource card gets hook classes and an opaque surface with hairline
inner borders and a raised footer instead of a half-transparent fill; the default button
border is one step lighter than its fill so it has an edge on every surface; inputs are
inset (darker than the surface) with a visible border. Version 0.4.6.
@codecov

codecov Bot commented Oct 11, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (82207f0) to head (1fe5931).
⚠️ Report is 7 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##              main      #189    +/-   ##
==========================================
  Coverage   100.00%   100.00%            
==========================================
  Files          325       338    +13     
  Lines         9189      9360   +171     
==========================================
+ Hits          9189      9360   +171     
Flag Coverage Δ
ember-ui 100.00% <100.00%> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
addon/components/comment-thread.js 100.00% <100.00%> (ø)
addon/components/coordinates-input.js 100.00% <ø> (ø)
addon/components/date-picker.js 100.00% <100.00%> (ø)
addon/components/layout/resource/card.js 100.00% <ø> (ø)
addon/components/layout/resource/card/body.js 100.00% <ø> (ø)
addon/components/layout/resource/card/footer.js 100.00% <ø> (ø)
addon/components/layout/resource/card/header.js 100.00% <ø> (ø)
addon/components/skeleton.js 100.00% <100.00%> (ø)
addon/components/skeleton/card.js 100.00% <100.00%> (ø)
addon/components/skeleton/cards-grid.js 100.00% <100.00%> (ø)
... and 11 more
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

The inset dark inputs did not look right in the console; inputs go back to exactly
what 0.4.5 shipped. The skeleton components, card tiers and button edge stay.
Button styling waits for the platform-wide ember-ui pass; 0.4.5's default button is back.
feat(widget): run the report widget live instead of showing stored results
isPoint() checked typeof === 'object' before reading .type, and typeof
null is "object", so <CoordinatesInput @value={{null}} /> threw while the
component was created.
…livery badge status; dark success hover one tone darker
… so it never shows fewer columns than the page
… state

The coverage gate failed on PR #189: the only polling test overrides
pollDelay, and every run assigns runError before the template reads it,
so neither the base pollDelay nor the runError initializer ever executed.
The field bound @value straight into <Input>, so a consumer that stored the
picked Date (fn (mut ...)) saw the Date's full toString() in the field: the
re-render after a pick lands while the field still has focus, which
syncValue deliberately skips, and a Date already set at render was shown
raw too. The field now renders displayValue, the value's dates formatted
with the picker's dateFormat and separator, whatever shape @value has.

This branch has not been deployed

No deployments
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