Widget placement, and where the colors actually come from
How to set the launcher's corner and open-on-load behavior, and why this screen deliberately can't edit your palette.
This screen changes exactly four things about your widget: where its launcher sits, whether it's hidden, whether it opens automatically, and whose palette it draws from.
1. Open City → Widget → Style
You'll see a launcher position selector (start or end of the screen), a hide switch, an "open on page load" switch, and a live preview of the launcher itself.
2. Choose the launcher's corner
Position is a straightforward choice, but the live preview beside it is not decorative — it renders in your city's actual branding, in the previewed language's actual direction, so you can check the corner reads correctly before publishing rather than after.
3. Understand "theme source" — and why colors aren't edited here
You get two choices: Branding (the widget uses your city's colors, set on the separate Branding screen) or Override (a widget-specific palette). This screen doesn't grow a second color picker, on purpose: an ungraded palette on a screen residents actually read is a contrast failure waiting to happen, and colors are graded for accessibility exactly once, on the Branding screen. This screen links to it instead of duplicating it.
This is structural, not a design choice you could talk someone out of: the mutation this screen sends (UPDATE_WIDGET_LAUNCHER) has no field that could carry a menu, a greeting, or a color value. It's not that the screen refrains from touching them — it's incapable of it, by the shape of the request itself.
4. Publishing blocks if you have no allowed origins
If your city hasn't registered any origins on the Branding screen, this screen refuses to publish and tells you why, with a direct link to fix it — because a widget with nowhere it's allowed to load would ship and answer nothing.
Check the preview in every language your organization publishes, not just the one you're editing in. A launcher label that fits one language's script can overflow another's.