diff --git a/docs/site-map.md b/docs/site-map.md index 6da4767960..b66d620f17 100644 --- a/docs/site-map.md +++ b/docs/site-map.md @@ -1025,6 +1025,9 @@ This file is generated by `npm run docs:update` (or `npm run sitemap:update` dir - `/mockups/search-heading` - Route discovered from app directory Source: `src/app/mockups/search-heading/page.tsx`. - `/mockups/search-lens-menu` - Route discovered from app directory Source: `src/app/mockups/search-lens-menu/page.tsx`. - `/mockups/search-refine-adaptive` - Route discovered from app directory Source: `src/app/mockups/search-refine-adaptive/page.tsx`. +- `/mockups/settings-recommended-features` - Route discovered from app directory Source: `src/app/mockups/settings-recommended-features/page.tsx`. +- `/mockups/settings-recommended-features/[group]` - Route discovered from app directory Source: `src/app/mockups/settings-recommended-features/[group]/page.tsx`. +- `/mockups/settings-recommended-features/gallery` - Route discovered from app directory Source: `src/app/mockups/settings-recommended-features/gallery/page.tsx`. - `/mockups/settings-search-clinical` - Route discovered from app directory Source: `src/app/mockups/settings-search-clinical/page.tsx`. - `/mockups/settings-search-general` - Route discovered from app directory Source: `src/app/mockups/settings-search-general/page.tsx`. - `/mockups/settings-search-privacy` - Route discovered from app directory Source: `src/app/mockups/settings-search-privacy/page.tsx`. diff --git a/src/app/mockups/settings-recommended-features/[group]/page.tsx b/src/app/mockups/settings-recommended-features/[group]/page.tsx new file mode 100644 index 0000000000..eb4695c0d4 --- /dev/null +++ b/src/app/mockups/settings-recommended-features/[group]/page.tsx @@ -0,0 +1,69 @@ +import type { Metadata } from "next"; +import { notFound } from "next/navigation"; + +import { + SettingsRecommendedFeaturesMockupPage, + type SettingsFeatureGroupId, +} from "@/components/settings-recommended-features-mockups"; + +const GROUPS: ReadonlyArray<{ + id: SettingsFeatureGroupId; + title: string; + summary: string; +}> = [ + { + id: "source-evidence", + title: "Source & evidence", + summary: "Control how answers prefer, show, and reconcile clinical sources.", + }, + { + id: "answer-reading", + title: "Answer reading", + summary: "Make answers easier to verify, copy, and read in clinical settings.", + }, + { + id: "clinical-workflow", + title: "Clinical workflow", + summary: "Start in the right mode and keep practice context ready without PHI.", + }, + { + id: "privacy-trust", + title: "Privacy & trust", + summary: "Keep the app honest about data mode, sync, and PHI boundaries.", + }, + { + id: "productivity", + title: "Productivity", + summary: "Speed up repeated clinical lookups and document review habits.", + }, + { + id: "accessibility-device", + title: "Accessibility / device", + summary: "Tune display and device behaviour for ward phones and shared workstations.", + }, +]; + +type PageProps = { + params: Promise<{ group: string }>; +}; + +export function generateStaticParams() { + return GROUPS.map((group) => ({ group: group.id })); +} + +export async function generateMetadata({ params }: PageProps): Promise { + const { group: groupId } = await params; + const group = GROUPS.find((item) => item.id === groupId); + if (!group) return { title: "Settings Feature Mockup - Clinical KB" }; + return { + title: `${group.title} Settings Mockup - Clinical KB`, + description: group.summary, + }; +} + +export default async function SettingsRecommendedFeatureGroupMockupRoute({ params }: PageProps) { + const { group: groupId } = await params; + const group = GROUPS.find((item) => item.id === groupId); + if (!group) notFound(); + return ; +} diff --git a/src/app/mockups/settings-recommended-features/gallery/page.tsx b/src/app/mockups/settings-recommended-features/gallery/page.tsx new file mode 100644 index 0000000000..37f810933f --- /dev/null +++ b/src/app/mockups/settings-recommended-features/gallery/page.tsx @@ -0,0 +1,12 @@ +import type { Metadata } from "next"; + +import { SettingsRecommendedFeaturesMockupPage } from "@/components/settings-recommended-features-mockups"; + +export const metadata: Metadata = { + title: "Recommended Settings Gallery Mockup - Clinical KB", + description: "Full gallery of all recommended new settings options with what each adds.", +}; + +export default function SettingsRecommendedFeaturesGalleryMockupRoute() { + return ; +} diff --git a/src/app/mockups/settings-recommended-features/page.tsx b/src/app/mockups/settings-recommended-features/page.tsx new file mode 100644 index 0000000000..6ecb0c94fd --- /dev/null +++ b/src/app/mockups/settings-recommended-features/page.tsx @@ -0,0 +1,13 @@ +import type { Metadata } from "next"; + +import { SettingsRecommendedFeaturesMockupPage } from "@/components/settings-recommended-features-mockups"; + +export const metadata: Metadata = { + title: "Recommended Settings Features Mockup - Clinical KB", + description: + "Phone and desktop mockups for recommended new settings options, organised by source, reading, workflow, privacy, productivity, and accessibility.", +}; + +export default function SettingsRecommendedFeaturesMockupRoute() { + return ; +} diff --git a/src/components/settings-recommended-features-mockups/index.ts b/src/components/settings-recommended-features-mockups/index.ts new file mode 100644 index 0000000000..345c95f732 --- /dev/null +++ b/src/components/settings-recommended-features-mockups/index.ts @@ -0,0 +1,2 @@ +export { SettingsRecommendedFeaturesMockupPage } from "./settings-recommended-features-mockup-page"; +export type { SettingsFeatureGroupId } from "./settings-recommended-features-mockup-page"; diff --git a/src/components/settings-recommended-features-mockups/settings-recommended-features-mockup-page.tsx b/src/components/settings-recommended-features-mockups/settings-recommended-features-mockup-page.tsx new file mode 100644 index 0000000000..f126478343 --- /dev/null +++ b/src/components/settings-recommended-features-mockups/settings-recommended-features-mockup-page.tsx @@ -0,0 +1,691 @@ +"use client"; + +import { + ArrowLeft, + BatteryFull, + BookOpen, + Check, + ChevronRight, + CircleAlert, + ClipboardList, + Download, + Eye, + FileText, + FolderOpen, + Globe2, + Keyboard, + LayoutGrid, + LockKeyhole, + Monitor, + Palette, + PanelTop, + Scale, + ShieldCheck, + Signal, + Sparkles, + Stethoscope, + Sun, + Type, + VibrateOff, + Wifi, + X, + type LucideIcon, +} from "lucide-react"; +import { useMemo, useState, type ReactNode } from "react"; + +import { appBackdrop, cn } from "@/components/ui-primitives"; + +export type SettingsFeatureGroupId = + | "source-evidence" + | "answer-reading" + | "clinical-workflow" + | "privacy-trust" + | "productivity" + | "accessibility-device"; + +type FeatureRow = { + label: string; + adds: string; + value?: string; + enabled?: boolean; + icon: LucideIcon; +}; + +type FeatureGroup = { + id: SettingsFeatureGroupId; + order: number; + title: string; + shortTitle: string; + summary: string; + icon: LucideIcon; + rows: FeatureRow[]; +}; + +export const SETTINGS_FEATURE_GROUPS: ReadonlyArray = [ + { + id: "source-evidence", + order: 1, + title: "Source & evidence", + shortTitle: "Source", + summary: "Control how answers prefer, show, and reconcile clinical sources.", + icon: BookOpen, + rows: [ + { + label: "Show source-only answers by default", + adds: "Skip AI synthesis and show cited sources first unless you ask for a generated answer", + enabled: true, + icon: FileText, + }, + { + label: "Local-first vs best-evidence", + adds: "Decide whether WA/local protocols or broader best evidence wins when sources conflict", + value: "Local first", + icon: Scale, + }, + { + label: "Preferred authority set", + adds: "Choose which publishers/authorities to prioritise (e.g. WA Health, RANZCP, TGA/PBS, BMJ)", + value: "WA · RANZCP · PBS", + icon: ShieldCheck, + }, + { + label: "Conflict surfacing when sources disagree", + adds: "Show a clear conflict notice when local and non-local guidance differ", + enabled: true, + icon: CircleAlert, + }, + { + label: "Richer citation detail", + adds: "Always show page, section path, and publisher with each citation", + enabled: true, + icon: BookOpen, + }, + { + label: "Always open evidence drawer", + adds: "Open the evidence/source panel automatically with every answer", + enabled: false, + icon: PanelTop, + }, + ], + }, + { + id: "answer-reading", + order: 2, + title: "Answer reading", + shortTitle: "Reading", + summary: "Make answers easier to verify, copy, and read in clinical settings.", + icon: Type, + rows: [ + { + label: "Copy with citations + source status by default", + adds: "Copied answers include citations and source status automatically", + enabled: true, + icon: ClipboardList, + }, + { + label: "Session-sticky filters", + adds: "Remember jurisdiction, population, and scope filters for the current browser session", + enabled: true, + icon: Sparkles, + }, + { + label: "Always-on safety / disclaimer strip", + adds: "Keep the “reference, not clinical decision support” notice visible on answers", + enabled: true, + icon: CircleAlert, + }, + { + label: "Answer text size / reading measure", + adds: "Adjust answer reading size and line length for ward/laptop use", + value: "Comfortable", + icon: Type, + }, + ], + }, + { + id: "clinical-workflow", + order: 3, + title: "Clinical workflow", + shortTitle: "Workflow", + summary: "Start in the right mode and keep practice context ready without PHI.", + icon: Stethoscope, + rows: [ + { + label: "Default clinical mode on launch", + adds: "Open straight into Answer, Prescribing, Differentials, DSM, Forms, etc.", + value: "Answer", + icon: LayoutGrid, + }, + { + label: "Default query mode", + adds: "Set the usual search intent to auto, protocol, dosing, or differential", + value: "Auto", + icon: Sparkles, + }, + { + label: "Pinned mode dock / favourites strip", + adds: "Choose which modes appear first in the phone/desktop dock", + value: "Answer · Rx · DSM", + icon: PanelTop, + }, + { + label: "Ward / service context", + adds: "Optional non-PHI practice label (e.g. EMHS adult acute, CAMHS) to bias forms/services/protocols", + value: "EMHS adult acute", + icon: Stethoscope, + }, + { + label: "Prescribing locale helpers", + adds: "Prefer Australian/PBS naming, spelling, and unit display conventions", + enabled: true, + icon: Globe2, + }, + ], + }, + { + id: "privacy-trust", + order: 4, + title: "Privacy & trust", + shortTitle: "Privacy", + summary: "Keep the app honest about data mode, sync, and PHI boundaries.", + icon: LockKeyhole, + rows: [ + { + label: "Demo vs live mode indicator", + adds: "Clearly show whether the app is using demo data or the live knowledge base", + value: "Live", + icon: Eye, + }, + { + label: "Local-only mode", + adds: "Keep favourites and preferences on this device only, with no account sync", + enabled: false, + icon: LockKeyhole, + }, + { + label: "Auto-clear recent searches", + adds: "Clear recent searches after the session, after 24 hours, or never", + value: "After session", + icon: ShieldCheck, + }, + { + label: "PHI reminder cadence", + adds: "Show periodic reminders not to enter protected health information", + value: "Weekly", + icon: CircleAlert, + }, + { + label: "Upload retention / deletion clarity", + adds: "Show who can see uploaded docs and make deletion/retention status clear", + value: "Owner only", + icon: FileText, + }, + { + label: "Export / import preferences + favourites", + adds: "Download/upload a backup file to move settings between devices", + value: "Export…", + icon: Download, + }, + { + label: "Signed-in device list / session revoke", + adds: "See active signed-in sessions and sign them out remotely", + value: "1 device", + icon: Monitor, + }, + ], + }, + { + id: "productivity", + order: 5, + title: "Productivity", + shortTitle: "Productivity", + summary: "Speed up repeated clinical lookups and document review habits.", + icon: FolderOpen, + rows: [ + { + label: "Saved search templates", + adds: "Save reusable searches with mode and filters baked in", + value: "3 saved", + icon: ClipboardList, + }, + { + label: "Favourites folders / tags", + adds: "Organise favourites into folders or tags", + value: "Protocols · Meds", + icon: FolderOpen, + }, + { + label: "PDF open behaviour", + adds: "Choose whether PDFs open in-app or in a new tab", + value: "In-app", + icon: FileText, + }, + { + label: "Remember document viewer zoom / layout", + adds: "Restore last zoom and layout when reopening documents", + enabled: true, + icon: Eye, + }, + { + label: "Custom keyboard shortcuts", + adds: "Remap shortcuts like focus search, command menu, and new question", + value: "Defaults", + icon: Keyboard, + }, + { + label: "Offline reading pack for favourites", + adds: "Download favourited documents for offline hospital/clinic use", + value: "12 docs", + icon: Download, + }, + ], + }, + { + id: "accessibility-device", + order: 6, + title: "Accessibility / device", + shortTitle: "Access", + summary: "Tune display and device behaviour for ward phones and shared workstations.", + icon: Palette, + rows: [ + { + label: "Larger text / reading options", + adds: "Increase text size for easier ward/phone reading", + value: "Large", + icon: Type, + }, + { + label: "Force light mode", + adds: "Keep the app in light mode even if the device is in dark mode", + enabled: true, + icon: Sun, + }, + { + label: "Reduced transparency / simpler chrome", + adds: "Reduce glass/blur effects for clearer, faster UI", + enabled: false, + icon: Monitor, + }, + { + label: "Haptics off", + adds: "Disable vibration feedback on shared or clinical devices", + enabled: true, + icon: VibrateOff, + }, + ], + }, +]; + +function Toggle({ enabled }: { enabled?: boolean }) { + return ( + + } + > +
+ {SETTINGS_FEATURE_GROUPS.map((item) => ( + + ))} +
+ + ); + } + + return ( + + {SETTINGS_FEATURE_GROUPS.map((item) => ( + + ))} + + } + > +
+
+ +
+
+ +
+
+
+ ); +}