Bundles are loaded via require.js exactly as Duda does — AMD modules at
/dist/widget-*.js. Run npm run dev to start.
Switch to the embed harness (no Duda) →
Unchecked (default) — no dmAPI, so
PropertiesInternal reads empty: the list falls back to
Properties/REST, featured has no
nearbyLocationPriorityOrder to apply so it sorts by name, and there is no
spaceGroupId either — so spaces load the OLD way, two REST calls per
property for the 3 or 6 cards on the visible page.
Checked — the harness serves a mock collection built from live data
(company kQoBXA8vpn and each property's real "Website Group"), which is what
a configured site looks like: ONE
space-groups?space_group_id=… call prices every facility, so all the
cards fill at once and a page turn fetches nothing. Watch the network tab to see the
difference. Note this also switches off other widgets' no-dmAPI demo
fallbacks — the mega menu loses its demo location tree and star ratings — so leave it off
unless you are looking at #07.
Max properties empty = the whole portfolio.
Value tiers on Select — routes a card's Select through #14 exactly as
#05 does: it emits on tierBus and the modal on this page opens for
that card's facility (#14 adopts the emitted propertyId rather than
being scoped to the page's). With no #14 mounted the click falls through to the rental
page and logs why. Off ⇒ Select goes straight to /rental with the tier in
localStorage.
The Company Information and Storage Types
columns are built entirely from the site's page tree (dmAPI.getNavItemsAsync()) —
there is no hardcoded fallback any more. With no dmAPI, Storage Types is
simply absent and Company Information shows Sitemap alone
(/sitemap.xml needs no page tree), exactly as in the Duda editor. Reload
with ?mockCollections=1 to see them populated, including the merge of
company-information/* and legal-pages/*.
The Company Information and Storage Types
columns are built entirely from the site's page tree (dmAPI.getNavItemsAsync()) —
there is no hardcoded fallback any more. With no dmAPI, Storage Types is
simply absent and Company Information shows Sitemap alone
(/sitemap.xml needs no page tree), exactly as in the Duda editor. Reload
with ?mockCollections=1 to see them populated, including the merge of
company-information/* and legal-pages/*.
The Company Information and Storage Types
columns are built entirely from the site's page tree (dmAPI.getNavItemsAsync()) —
there is no hardcoded fallback any more. With no dmAPI, Storage Types is
simply absent and Company Information shows Sitemap alone
(/sitemap.xml needs no page tree), exactly as in the Duda editor. Reload
with ?mockCollections=1 to see them populated, including the merge of
company-information/* and legal-pages/*.
The harness has no login_api_base, so the code check runs offline:
enter 000000 to pass, anything else is rejected. With "Accounts on
the email" at 2 the account picker follows the code step (on a live page it appears
when the API returns several accounts).
Outside Duda there is no dmAPI, so the property dropdown falls back
to the demo locations from #02's Find Storage menu — on the published site it
reads the Properties collection instead. Picking
Storage Outlet Seattle exercises the 3rd-party branch, so
Continue redirects off-site rather than sending a code.
The list comes from the Duda page tree under
storage-types; featurePage adds copy and
PropertiesInternal.amenities supplies imagery.
Without ?mockCollections=1 there is no page tree either, so
example cards show instead.
The footer modal's "Send us a Message" form, inline, for the
/contact-us page. Same shared LeadForm the
lightbox renders, so the two cannot drift. The property dropdown is the
portfolio from fetchFacilityOptions() (config.json creds
here — on a live site the site texts' creds and the
Company collection take over), and Submit requires
a property: this page sits on none, and an unselected submit
would otherwise file the lead against config.json's stale id.
Submitting here creates a real lead on the dev
company, like the footer modal does.
NOT a page widget: this is the app inside the Widget Builder's
"Embed your own external widget settings" iframe. The build
emits its shell to dist/spacelist-ordering-settings.html,
which loads the bundle from right next to itself; Duda appends
siteId/elementId to that URL. Live
through the dev ngrok tunnel (hardcoded while testing):
properties from PropertiesInternal via
/api/spacelist/rows, the picked property's space groups
via the hb passthrough. Property tab: pick the property
first (dynamic page), drag its groups into order, and
Save console.logs the payload — open devtools to see
it. Company tab's catalogue is still demo data.
Built from Figma 8753-47700 (forms) and 9215-57188
(buttons). Import from @shared/ui — do not re-style inputs or
buttons inside a widget.
Hand-built, data-free flows for devs to build widgets from. Not a Duda
widget. Add a flow in src/static-screens/flows/index.ts.