diff --git a/src/app/work-mode.css b/src/app/work-mode.css index 66d1df657c..6fbad8c776 100644 --- a/src/app/work-mode.css +++ b/src/app/work-mode.css @@ -658,7 +658,8 @@ html:not([data-mode-band]) [data-testid="chrome-safe-area-top"][data-work-band] } } -/* Round glass buttons: a 48px tap, a 44px glass circle. */ +/* Round glass buttons: a 48px glass circle, the same size as the clinical + header's round buttons (Josh, 10 Oct 2026). */ .universal-header[data-work-frame] .universal-header-icon-control { position: relative; isolation: isolate; @@ -671,7 +672,7 @@ html:not([data-mode-band]) [data-testid="chrome-safe-area-top"][data-work-band] .universal-header[data-work-frame] .universal-header-icon-control::before { content: ""; position: absolute; - inset: 2px; + inset: 0; z-index: var(--work-z-under); border-radius: var(--radius-pill); background: var(--work-glass-fill); @@ -756,22 +757,23 @@ html:not([data-mode-band]) [data-testid="chrome-safe-area-top"][data-work-band] outline-offset: 2px; } -/* The mode pill: glass, a flat mode-colour badge, page over area. */ +/* The mode pill: glass, a flat mode-colour badge, page over area. The same + 48px height as the clinical pill (Josh, 10 Oct 2026), and like it the pill + hugs its name with the chevron right after it, leaving no empty space + (Josh, 10 Oct 2026). A long name grows the pill up to its limit. */ .universal-header[data-work-frame] .universal-header-mode-button { position: relative; isolation: isolate; width: auto; min-width: 0; - /* Room for the longest area name ("Assessments") beside two round - buttons on a 390px phone, without truncating it, and for a short one - ("Roster") at 320px now the pill names the area only. Never narrower than - a tap, so at large text sizes the badge still shows when the name cannot. */ + /* Never narrower than a tap, so at large text sizes the badge still shows + when the name cannot. */ max-width: max(var(--spacing-tap, 3rem), min(15rem, calc(100vw - 11rem))); /* The name's track sizes to the name itself, so a name that fits is never cut short by rounding; it shortens only once the pill reaches its limit. */ grid-template-columns: auto minmax(0, max-content) auto; - gap: calc(var(--spacing) * 1.75); - padding: 0 calc(var(--spacing) * 2) 0 calc(var(--spacing) * 1.5); + gap: calc(var(--spacing) * 2); + padding: 0 calc(var(--spacing) * 2.5); border-color: transparent; background: transparent; box-shadow: none; @@ -779,14 +781,16 @@ html:not([data-mode-band]) [data-testid="chrome-safe-area-top"][data-work-band] @media (min-width: 640px) { .universal-header[data-work-frame] .universal-header-mode-button { + width: auto; max-width: 18rem; + padding-right: calc(var(--spacing) * 3); } } .universal-header[data-work-frame] .universal-header-mode-button::before { content: ""; position: absolute; - inset: 0.25rem 0; + inset: 0; z-index: var(--work-z-under); border-radius: var(--radius-pill); background: var(--work-glass-fill); @@ -860,6 +864,8 @@ html:not([data-mode-band]) [data-testid="chrome-safe-area-top"][data-work-band] .universal-header[data-work-frame] .universal-header-mode-button { grid-template-columns: auto minmax(0, 1fr); gap: calc(var(--spacing) * 0.5); + width: auto; + min-width: 0; max-width: 100%; height: auto; min-height: 48px; diff --git a/src/components/admin/admin-compliance-export-page.tsx b/src/components/admin/admin-compliance-export-page.tsx index 27d2db715c..4c972fd895 100644 --- a/src/components/admin/admin-compliance-export-page.tsx +++ b/src/components/admin/admin-compliance-export-page.tsx @@ -9,7 +9,6 @@ import { focusRing } from "@/components/card-recipes"; import { AccountSetupDialog } from "@/components/clinical-dashboard/account-setup-dialog"; import { InformationPageBreadcrumbs } from "@/components/information-page-shell"; import { PageTitleUnderBand, useModeBandHeading } from "@/components/mode-band/mode-band"; -import { ModeNotice } from "@/components/mode-kit/notice"; import { WorkButton, WorkChip, WorkDock, WorkIconCircle, WorkSectionLabel } from "@/components/mode-kit/work"; import { WorkStateNotice } from "@/components/mode-kit/work-state"; import { announce } from "@/components/ui/live-announcer"; @@ -31,7 +30,6 @@ import { ADMIN_PAGE_HREFS } from "@/lib/admin/page-hrefs"; import { ADMIN_REQUIREMENTS_CATALOGUE } from "@/lib/admin/requirements"; import { buildXlsx, XLSX_MIME } from "@/lib/admin/xlsx-lite"; import { perthCalendarDate } from "@/lib/cme/cpd-year"; -import { useExampleData } from "@/lib/example-data/store"; import { useOnCallEntries } from "@/lib/on-call/entry-store"; import { guardExampleAction } from "@/lib/example-data/guards"; @@ -68,8 +66,6 @@ const RANGE_OPTIONS = [ */ export function AdminComplianceExportPage({ now: nowProp }: { now?: Date } = {}) { const state = useOnCallEntries(); - // The example data banner already says these are example records; this notice is for the demo build. - const examplesBanner = useExampleData("admin").active; const mountedAt = useMemo(() => new Date(), []); const now = nowProp ?? mountedAt; const today = perthCalendarDate(now); @@ -155,12 +151,6 @@ export function AdminComplianceExportPage({ now: nowProp }: { now?: Date } = {}) > ) : (
{dateEcho}
- {state.demoMode && load === "ready" && !examplesBanner ? ( -- Made-up data to look around. Nothing is saved. -
- {signedOut ? ( - - ) : null} - -- Turn it off to {words.verb} your own records. -
-+ Turn it off to {words.verb} your own records. +
+
-
{children}
diff --git a/src/components/my-day/my-day-calendar-page.tsx b/src/components/my-day/my-day-calendar-page.tsx
index 92b65c400b..6c82a79406 100644
--- a/src/components/my-day/my-day-calendar-page.tsx
+++ b/src/components/my-day/my-day-calendar-page.tsx
@@ -385,9 +385,6 @@ function CalendarBody({
label="Show the month or a list"
testId="my-day-calendar-view"
/>
- {example ? (
-
Example data can't be exported.
- ) : null}- {demoNote ? Example data: made up to look around. : null} - {demoNote && notYet.length > 0 ? " " : null} - {notYet.length > 0 ? ( - - {`${listNames(notYet)} ${notYet.length > 1 || rosterUnavailable ? "aren't" : "isn't"} available yet.`} - - ) : null} + + {`${listNames(notYet)} ${notYet.length > 1 || rosterUnavailable ? "aren't" : "isn't"} available yet.`} +
) : null}{example.mode === "on" - ? "On. Every area shows example records, marked as examples, and nothing can be sent or exported." + ? "On. Every area shows example records, and nothing can be sent or exported." : "Off. Areas show only your own records."}
- {shifts.sample - ? "Example shifts and team, all made up." - : "Your copy of the roster. Check official changes with your service."} -
+ {shifts.sample ? null : ( ++ Your copy of the roster. Check official changes with your service. +
+ )}
WA public holidays, wa.gov.au, read 25 Sep 2026.{" "}
diff --git a/src/components/roster/roster-shifts-page.tsx b/src/components/roster/roster-shifts-page.tsx
index 5c156a2c4c..4aaffe574c 100644
--- a/src/components/roster/roster-shifts-page.tsx
+++ b/src/components/roster/roster-shifts-page.tsx
@@ -23,7 +23,6 @@ import { InformationPageShell } from "@/components/information-page-shell";
import { ModeGroupedList, ModeRow } from "@/components/mode-kit/grouped-list";
import { ModeModuleSkeleton } from "@/components/mode-kit/module-skeleton";
import { ModeNotice } from "@/components/mode-kit/notice";
-import { useRosterSignedOutSample } from "@/components/roster/roster-sample-context";
import { modeModuleSurface, modePressable } from "@/components/mode-kit/recipes";
import { ConfirmDialog } from "@/components/ui/confirm-dialog";
import { Sheet } from "@/components/ui/sheet";
@@ -350,8 +349,6 @@ export function RosterShiftsPage({ now: pinnedNow }: { readonly now?: Date } = {
to: maxDate(shownRange.to, addDaysToDate(today, ROSTER_AHEAD_DAYS)),
};
const shifts = useRosterShifts(teamRange);
- // The frame's example data banner already says these are examples.
- const exampleBanner = useRosterSignedOutSample();
const teams = useRosterTeams();
const enabledTeams = (Array.isArray(teams.data?.teams) ? teams.data.teams : []).filter((team) => team.enabled);
const oneTeamId = enabledTeams.length === 1 ? enabledTeams[0]!.serviceId : null;
@@ -507,9 +504,6 @@ export function RosterShiftsPage({ now: pinnedNow }: { readonly now?: Date } = {
const notices = (
<>
- {shifts.demoMode && !exampleBanner ? (
-
-
- {children}
-
diff --git a/src/components/teaching/teaching-term.tsx b/src/components/teaching/teaching-term.tsx
index 57c9cdb2a6..ded77196e3 100644
--- a/src/components/teaching/teaching-term.tsx
+++ b/src/components/teaching/teaching-term.tsx
@@ -57,7 +57,6 @@ import {
type TermRecord,
type TermTrackerState,
} from "@/lib/teaching/term-tracker";
-import { useExampleData } from "@/lib/example-data/store";
type Update = (change: (current: TermTrackerState) => TermTrackerState) => void;
@@ -677,8 +676,6 @@ function Meeting({ term, today, update }: { term: TermRecord; today: string; upd
/* ---------- the page ---------- */
function TeachingTermContent({ demoMode }: { demoMode: boolean }) {
- // The shared example banner already says the records are made up, so the demo note shows only without it.
- const { active: exampleShown } = useExampleData("teach");
const now = useTeachingNow();
const today = now ? perthDateKey(now) : null;
const sample = useMemo(() => (demoMode && today ? sampleTermTracker(today) : null), [demoMode, today]);
@@ -744,9 +741,6 @@ function TeachingTermContent({ demoMode }: { demoMode: boolean }) {
{whatsOnHeading(read.data.healthServices)}
{title}
- {demoMode && !exampleShown ? (
- My exam prep
- {demoMode && !exampleShown ? (
- Logbook
- {demoMode && !exampleShown ? (
- This term
- {demoMode && !exampleShown ? (
-
{payslipResultWord(latestResult, latest.resolved)}
- {isExampleRecord(latest) ?
Work expenses you added
- {year.expenses.some(isExampleRecord) ?
@@ -296,7 +294,7 @@ export function AdminTaxPage({ now: pinned }: { now?: Date } = {}) { month={MONTHS[Number(expense.on.slice(5, 7)) - 1]!} day={Number(expense.on.slice(8))} title={expense.title} - sub={`${isExampleRecord(expense) ? "Example · " : ""}${expenseLine(expense)}`} + sub={expenseLine(expense)} end={{formatCents(expense.cents)}} />
-
-
{WORKFORCE_SAMPLE_LABEL}
Every name and date below is invented. Going live needs Josh's approval for workforce accounts, a
diff --git a/src/components/work-screens/hospital/hospital-page.tsx b/src/components/work-screens/hospital/hospital-page.tsx
index c8d93a6a47..3a8ee47519 100644
--- a/src/components/work-screens/hospital/hospital-page.tsx
+++ b/src/components/work-screens/hospital/hospital-page.tsx
@@ -2,7 +2,6 @@
import { useMemo, useState } from "react";
-import { ExampleTag } from "@/components/example-data/example-tag";
import {
WorkBody,
WorkButton,
@@ -251,7 +250,6 @@ function HubView({
- {example ?
- {example ?
- {example ?
- Some of what's shown here is sample data, not yours. -
- ) : null} {patient ? null : (