Skip to main content
Westlink Intranet

Command Palette

Search for a command to run...

?
Server room

Development

Intranet Project Status

What's been built, how it works, and what's coming next.

13

Pages

17

Dashboard Widgets

30

WMS Documents

200+

Commits

Infrastructure & Hosting

Azure Static Web Apps, Entra ID, GitHub Actions

  • Azure Static Web Apps (Standard) — fully static site deployed to Azure SWA with custom domain intranet.westlinklogistics.com
  • Entra ID authentication — platform-level SSO restricts access to Westlink employees. No public access
  • GitHub Actions CI/CD — automated build and deploy on push to main. Build runs in workflow, SWA deployer receives pre-built output
  • Azure Function proxy/api/proxy endpoint for RSS feeds and market data (CORS bypass)
  • Custom domain + SSL — automatic HTTPS via Azure-managed certificate

Technology Stack

Astro 6, React 19, Tailwind v4, shadcn/ui

  • Astro 6 — static site generator. Pages are .astro components that compile to zero-JS HTML by default
  • React 19 islands — interactive components (widgets, search, forms) hydrate client-side via client:load/client:idle directives. Layout stays pure Astro
  • Tailwind CSS v4 — utility-first styling via Vite plugin (not PostCSS). Design tokens as CSS variables in globals.css
  • shadcn/ui (new-york) — accessible UI primitives (dialog, command palette, alert). HSL-based semantic tokens
  • MSAL.js — Microsoft Authentication Library for client-side Graph API access. Incremental consent for feature-specific scopes
  • Microsoft Graph API — powers People Directory, Calendar, To Do, Planner, Team Presence, Recent Files, and preferences sync
  • Fluid typography — root font-size scales from 14px (768px viewport) to 16px (1920px baseline) via CSS clamp()
  • View transitions — Astro view transitions for smooth page navigation. Named transitions on sidebar and main content

Dashboard & Widgets

18 widgets, drag-and-drop, roaming sync

Fully customisable widget grid with drag-and-drop reordering, two-axis resizing, and a widget catalogue. Layout persists to localStorage and syncs to Microsoft Graph open extensions for cross-device roaming.

Widgets

Weather & Clock — live Perth time, animated conditions from Open-Meteo, hourly + 7-day forecast with progressive disclosure by widget height
Today's Calendar — Microsoft 365 calendar with now-line, countdown to next meeting, colour-coded categories
Microsoft To Do — read/write with inline task editing, completion toggle, importance flags, create dialog, multi-column layout
Planner — tasks grouped by bucket, list/board views, plan selector, overdue indicators, completion toggle
Recent Files — OneDrive/SharePoint recent files via Graph with file-type icons and relative timestamps
Quick Links — customisable app shortcuts with glassmorphism styling
Company News — 60 articles scraped from westlinklogistics.com with featured hero card and responsive grid
Industry News — configurable RSS feeds across maritime, defence, logistics, resources with proxy backend
Team Presence — live Microsoft Teams availability status with location and role filters
Markets — live ASX 200, S&P 500, Dow, NASDAQ, commodities, FX via Yahoo Finance with sparkline charts and news
Live Fleet Tracker — MarineTraffic embed showing Westlink fleet vessel positions
Windy Weather — interactive weather map with wind, rain, waves, temp, clouds, and pressure layers
NATO Phonetic — quick reference with real-time spell-out tool
Inbox — unread email count and latest messages from Outlook via Graph API
Teams Chats — recent Teams conversations with message previews via Graph API
Bunker Prices — global bunker fuel prices (VLSFO, MGO, IFO 380) from Ship & Bunker via /api/proxy with daily change indicators
Quote of the Day — daily professional or motivational quote from a curated static library
Travel & leave calendar — gantt swim-lanes over a 90-day window from submitted travel briefings + approved annual leave (Dataverse), per-traveller colour for travel, hatched fill for leave, hover tooltip, SO-gated city detail, falls back to a text list when narrow

Dashboard features

  • Quick Actions bar — customisable coloured shortcut buttons with drag reorder, icon/colour/URL editing, gradient presets
  • Container queries — widgets adapt content based on their actual rendered size, not viewport
  • Roaming preferences — layout, widget sizes, quick actions, feed selections sync via Graph open extensions
  • Timestamp-based sync guard — local changes always win over stale remote data

Intranet Pages

14 pages with branded heroes and section images

  • Dashboard — personalised greeting, quick actions, customisable widget grid
  • People Directory — live Graph API directory with search, filters, premium card layout, team availability timeline with meeting room status
  • Templates — SharePoint document library browser with search, views, favourites, and M365 file icons
  • Company — corporate details, office locations, ISO/DISP/JOSCAR certifications with certificates, FIATA membership, full insurance portfolio with expandable summaries and downloadable policy documents
  • Help — 5-section guide covering getting started, widgets, customisation, accessibility, and troubleshooting with Intune/ad-blocker guidance
  • Cyber Security — phishing awareness, password/MFA guidance, useful security links, incident reporting
  • WMS Library — 27 management system documents via Astro content collections with Zod schema, search, classification banners, TOC sidebar, keyboard navigation
  • Process Overview — interactive BPMN-style flowchart for WMS processes
  • Leave Request — forms prototype (dev only)
  • Leave Entry — admin-only annual leave entry (gated by Westlink Leave Admin Dataverse role); mirrors payroll-approved leave to the Travel & leave calendar
  • Dev Status — this page
  • Custom 404 — branded error page

Authentication & APIs

MSAL, Graph API, incremental consent

  • MSAL.js — PublicClientApplication with localStorage cache. Silent token acquisition with redirect fallback
  • Incremental consent — 4 base scopes at login (Directory.Read.All, ProfilePhoto.Read.All, Presence.Read.All, Calendars.Read), feature-specific scopes (Mail.Read, Chat.Read, Tasks.ReadWrite, Sites.Read.All, Schedule.Read.All, Files.Read, User.ReadWrite) requested on first use via popup
  • Graph API endpoints — /me, /users, /me/calendarView, /me/todo/lists, /me/planner, /me/drive/recent, /me/presence, /me/extensions, /communications/presences
  • SWA /.auth/me fallback — Azure SWA built-in auth endpoint as backup when MSAL is blocked by ad blockers
  • Open extensions — preferences sync via Graph open extensions on /me (single extension stores all synced keys)
  • External APIs — Open-Meteo (weather), Yahoo Finance (markets), MarineTraffic (fleet), Windy (weather map), RSS feeds via Azure Function proxy

Payments (deep dive)

React island, 5 Power Automate flows, Dataverse, Xero, Planner

The Payments page composes Accounts Payable bills into payment batches for the Payments v2 Planner plan. It is a single React island (client:load) that runs a drag-and-drop batching UI on the front end and orchestrates five Power Automate flows plus Dataverse on the back end. The page ships zero business data — every figure is fetched live from Xero (via Power Automate) at runtime. Entry point: src/pages/payments.astro<PaymentsApp client:load />. All client code lives under src/components/payments/ and src/lib/payments/.

Page & components

  • PaymentsApp.tsx — the orchestrator. Holds all state via useReducer, wires @dnd-kit DndContext (pointer + keyboard sensors, keyboard-accessible drag), dispatches every flow call, and renders the three-pane layout
  • BillsPool.tsx / BillCard.tsx — left pane: unbatched AP bills, draggable, with AR-linkage and AM-cert badges
  • BatchList.tsx / BatchCard.tsx — centre pane: composed batches as drop targets; per-batch totals, validation errors, and lock state
  • PreviewPanel.tsx — right pane: inline PDF preview of a single bill or a merged batch
  • CancelBatchDialog.tsx — confirmation dialog for cancelling a submitted batch
  • badges.tsx — status / payment-type / AR-status pills

State management

  • state.ts — a single useReducer: PaymentsState plus a discriminated Action union (~28 actions). The reducer is pure and is the only place state changes
  • Crash-resilient composition — batches reconstruct from cf_compositionsnapshot on reload, so the page survives Flow 1 wiping the ephemeral batch-item rows; bills whose Xero payment-date has since changed are synthesised back from the snapshot (stale-date warning)

Business logic — suggestBatches.ts

  • suggestBatches(bills) — auto-groups bills into batches: International by supplier + currency, BPay as singletons, DirectCredit by supplier / overhead
  • derivePaymentTypeFromBills — International (any SWIFT/IBAN) > BPay > DirectCredit
  • computeBatchTotals — totals + currency auto-derive (homogeneous → derived, mixed → keep declared)
  • validateBatch — blocks submit on: empty, international multi-supplier, international multi-currency, BPay multi-item, or a missing AM certificate

Backend — five Power Automate flows

1 · getBillsByPaymentDate — pulls AP bills for a payment date from Xero and enriches each with AR linkage. ~1.8 s/bill. async (fire-and-poll)
2 · getAttachmentsForBill — resolves the AM-certificate PDF (filename match) for preview. ~12 s, synchronous
3 · mergeBatchToPDF — merges a batch's bill PDFs into one document. async (fire-and-poll, Path E)
4 · commitToPlanner — creates the Planner task for a submitted batch (one task per batch). synchronous
5 · cancelBatch — sets the Dataverse status and flags the Planner task. synchronous

Long-running flows: fire-and-poll

Flows 1 and 3 exceed the Power Automate HTTP-gateway's ~120 s synchronous-response window. The client (flow.ts) fires the flow, uses the synchronous 200 if it arrives in time, and otherwise polls Dataverse (dataversePoll.ts) for the result the flow persists:

  • Flow 1 writes the full bills envelope to cf_payment_run.cf_billsjson; the client polls that column matched on a per-call correlationId, so a re-run never reads a stale envelope. 4 s interval, 600 s timeout
  • Flow 3 writes cf_payment_batch.cf_mergedpdfurl / cf_mergedpdfsize; the client polls those. 3 s interval, 180 s timeout
  • FAST_FAIL_MS (10 s) discriminates a real failure (fast 502 / CORS → throw immediately) from the expected long run (slow timeout → poll). A failed flow's Response action never runs, so the gateway 502s just as fast as a hard error — hence the time-based heuristic

Authentication — two distinct paths

  • Flow calls — anonymous SAS-signed HTTP-trigger URLs; the signature in the URL is the auth (no MSAL/Bearer). URLs are injected via PUBLIC_FLOW_*_URL (Azure SWA app settings, never committed). postFlow enforces https and strips the SAS query-string out of any error message
  • Dataverse polling — MSAL Dataverse token (getDataverseToken, separate scopes from Graph) sent as a Bearer header via dvFetch
  • Page access — a finance allowlist enforced page-side in financeAuth.ts (isFinanceUser: MSAL → SWA /.auth/me → localhost-dev bypass). Because the flows are anonymous, this page gate plus the Sidebar Finance entry are the authorization set. Dataverse reads additionally require the Westlink - Payments (Intranet) security role

Data stores & integrations

  • Dataversecf_payment_run, cf_payment_batch (note the irregular Web API plural cf_payment_batchs), cf_payment_batch_items (ephemeral — rewritten on every Flow 1 run)
  • Xero — AP bills and AR invoices, both via the Xero connector inside Flow 1
  • SharePoint — merged-PDF storage. It is served with X-Frame-Options: SAMEORIGIN, so the preview fetches it as a blob via Graph (Files.Read.All) and falls back to opening a new tab if blocked or oversized
  • Planner — the Payments v2 plan; one task per submitted batch. A task at percentComplete = 100 means the batch is paid → it locks (no edit / cancel / delete)

Dependencies & dev mode

  • npm@dnd-kit/core + @dnd-kit/sortable (drag-and-drop), sonner (toasts), lucide-react (icons), shadcn/ui primitives, MSAL.js
  • Mock mode — set PUBLIC_DEV_MODE_MOCK_FLOWS=1 and mockFlows.ts intercepts all five flows with canned responses (8 sample bills) for offline UI work
  • Note — Power Automate flow definitions live in the Westlink PA environment, not this repo. The repo holds only the client and the contracts (src/lib/payments/)

Design & UX

Brand identity, dark mode, accessibility, print

  • Westlink brand identity — primary #015696, secondary #0c92d1, accent #F08920, teal #00b0ae. Gradient accent lines, triangle motifs, branded card borders
  • Dark mode — navy palette (not neutral grey), .dark class + prefers-color-scheme fallback, inline script prevents FOUC, synced across devices
  • AI-generated imagery — all hero banners and section images generated via nano-banana (Gemini Flash) at 21:9 2K
  • Fluid typography — CSS clamp() scales root font from 14px to 16px baselined on 1920x1080
  • WCAG 2.2 AA — skip links, focus-visible rings, aria-current on nav, semantic HTML, keyboard-accessible drag-and-drop
  • Print styles — hides chrome, shows link URLs, "Uncontrolled when printed" footer for WMS docs
  • Animations — fade-in-up entrance animations, staggered children, respects prefers-reduced-motion
  • macOS dock effect — collapsed sidebar icons magnify on hover with neighbour scaling
  • Command palette — Ctrl+K search across all pages and WMS documents
  • Mega menu — header dropdown with all site links, searchable via command palette

WMS Document Library

27 documents, content collections, SharePoint sync

  • Content collections — 27 markdown documents with Zod-validated frontmatter schema (ref, title, status, department, document type, approver, effective date)
  • Conversion pipelinescripts/convert-wms.mjs transforms SharePoint HTML exports into clean markdown
  • Dedicated layoutWmsDocument.astro with classification banner, auto-generated TOC sidebar, keyboard navigation (j/k/h), print styles
  • Dynamic routes[slug].astro generates a page per document at build time
  • Search — WMS documents searchable via command palette with ref and title matching
  • Document types — policies (GOV-POL), procedures (GOV-PRO), standards (GOV-STD), schedules (GOV-SCH), manuals (QHSE-MAN), commercial documents (COM-DOC)

Corporate Document Library

Certificates, insurance policies, reference guides

All corporate documents hosted locally on the intranet as static assets, downloadable directly from the Company page.

Certificates

  • Certificate of Incorporation + Certificate of Change of Name
  • ISO 9001:2015, ISO 14001:2015, ISO 45001:2018 (Equal Assurance)
  • DISP Membership Certificate (Defence)
  • JOSCAR Pre-qualification Certificate
  • FIATA Membership Certificate

Insurance (31 documents)

  • Insurance Manual 2025–26
  • 9 policies — certificates of currency, schedules, and wordings for T&L, Excess, Management Liability, MPE, Business Package, Corporate Travel, Workers Comp (WA + QLD), Cyber, Charterers Liability
  • 3 branded HTML reference guides — Charterers Summary, Charterers Quick Ref, T&L Quick Ref
  • Charterers claims manual + Iran cancellation notice

Backlog & Ideas

Planned features and enhancements

  • Vessel tracking widget — live AIS positions via VesselFinder API
  • Project map — interactive map of active project locations and routes
  • Approvals dashboard — centralised view of pending approvals across systems
  • TV mode — full-screen auto-rotating dashboard for office displays
  • WMS search — full-text search across all management system documents
  • Cyber security updates — refresh when defence policies are rewritten in WMS project

Site Taxonomy

Complete inventory of all site elements by category

Layouts (2)

LayoutShellUsage
Layout.astroStandard intranetHeader + Sidebar + Content + Footer
WmsDocument.astroWMS documentsClassification banner + TOC sidebar + keyboard nav

Pages (14)

PageLayoutTypeKey Component
index.astroStandardDashboardDashboardGrid
people.astroStandardDirectoryPeopleDirectory
documents.astroStandardLibrarySharePointBrowser
company.astroStandardStatic content
cyber-security.astroStandardAwareness
help.astroStandardStatic content
forms/leave-request.astroStandardFormLeaveRequestForm
forms/leave-entry.astroStandardForm (admin)LeaveEntryForm
dev/index.astroStandardDev tools
dev/links.astroStandardDev toolsSiteLinksEditor
404.astroStandardError
wms/index.astroStandardWMS libraryWmsLibrary
wms/[slug].astroWmsDocumentWMS documentDocumentControls
wms/process-overview.astroStandardFlowchartProcessOverview

Dashboard Widgets (18)

WidgetCategoryData SourceLoad
Weather & ClockproductivityOpen-Meteo APIeager
Microsoft To DoproductivityGraph API (To Do)lazy
Today's CalendarproductivityGraph API (Calendar)lazy
Quick Linksproductivitylocal configeager
Recent FilesproductivityGraph API (OneDrive)eager
PlannerproductivityGraph API (Planner)lazy
Quote of the Daycommunicationstatic (quotes.ts)eager
Company Newscommunicationscraped articleseager
Industry NewscommunicationRSS via /api/proxylazy
Team PresencecommunicationGraph API (Presence)lazy
NATO Phoneticcompliancestaticlazy
Live Fleet TrackerdataMarineTraffic embedlazy
Windy WeatherdataWindy embedlazy
MarketsdataYahoo Finance / RSSlazy
Bunker PricesdataShip & Bunker / proxylazy
InboxcommunicationGraph API (Mail)lazy
Teams ChatscommunicationGraph API (Chat)lazy
Travel & leave calendarcommunicationDataverse (travel briefings + leave entries)lazy

Dashboard Infrastructure (5)

ComponentRole
DashboardGrid.tsxGrid layout, drag-drop, persistence
WidgetShell.tsxCard wrapper (title, resize, remove)
WidgetCatalogue.tsxAdd-widget picker dialog
EditModeToolbar.tsxEdit / reset controls
SortableWidget.tsxDrag handle wrapper

Interactive Components — React Islands (15)

ComponentPage(s)Auth
PeopleDirectory.tsxpeopleGraph API
DocumentLibrary.tsxorphanedstatic data
WmsLibrary.tsxwms/index
DocumentSearch.tsxwms docs
DocumentControls.tsxwms/[slug]
ProcessOverview.tsxwms/process
flowchart/FlowchartV2.tsxwms/processReact Flow + dagre
NodeDetail.tsxwms/process
ProcessBreadcrumb.tsxwms/process
LeaveRequestForm.tsxforms/leave
LeaveEntryForm.tsxforms/leave-entryDataverse + Graph
LeaveAdminFormCard.tsxforms (conditional)Dataverse (role check)
CommandPalette.tsxglobal (layout)
SharePointBrowser.tsxdocumentsGraph API
TeamAvailability.tsxpeopleGraph API
TodayCalendar.tsxdashboard (widget)Graph API
SiteLinksEditor.tsxdev/links

Chrome — Shared Shell (8)

ComponentTypeScope
Header.astroAstroboth layouts
Sidebar.astroAstroboth layouts
Footer.astroAstroboth layouts
Breadcrumb.astroAstrostandard pages
ThemeToggle.tsxReactheader
SidebarToggle.tsxReactheader
MegaMenu.tsxReactheader
UserAvatar.tsxReactheader

Utility Components (4)

ComponentPurpose
Greeting.tsxTime-based greeting on dashboard
AnimatedCounter.tsxNumber animation for stats
ScrollProgress.tsxReading progress bar
LiveClock.tsxClock display

UI Primitives — shadcn/ui (17)

alert-dialog, avatar, badge, breadcrumb, button, calendar, card, command, dialog, dropdown-menu, input, label, select, separator, skeleton, sonner, table, tabs, textarea

Content Collections (1)

CollectionSchemaCountSource
wmsZod (ref, title, revision, dates, classification, department, documentType, approval, downloads, revisionHistory)30 docsconvert-wms.mjs from ~/projects/wms/

Services & Libraries (4)

ModulePurpose
msal.tsMSAL auth + Graph API token acquisition
graph.tsGraph API helpers
preferences-sync.tsRoaming preferences via Graph open extensions
dashboard/storage.tsDashboard layout persistence

Build & Deploy Infrastructure (5)

ItemPurpose
api/proxy/Azure Function — CORS proxy for RSS and market feeds
.github/workflows/deploy.ymlCI/CD → Azure Static Web Apps
scripts/convert-wms.mjsWMS HTML → markdown content pipeline
globals.cssDesign tokens (HSL vars, dark mode, print styles)
staticwebapp.config.jsonSWA routing, auth, security headers

Component Quality Matrix

Evaluation criteria per taxonomy category

Each taxonomy category is evaluated against dimensions specific to its role. Cells show current state: = implemented, ½ = partial, = missing.

1. Layouts

LayoutSemantic HTMLSkip LinksDark ModePrint StylesView TransitionsResponsiveCSP Headers
Layout.astro
WmsDocument.astro

2. Pages

PageHeroAnimationsSemantic HTMLAccessibilityPrintMeta TagsLines
index.astro½49
people.astro½29
documents.astro½½21
company.astro½643
cyber-security.astro½263
help.astro½423
forms/leave-request½½17
dev.astro½533
wms/index.astro½½54
wms/[slug].astro19
wms/process-overview½½26

Criteria: Hero = branded hero banner. Animations = entrance animations with stagger. Semantic = section/article/nav. Accessibility = aria attributes beyond layout-inherited. Print = page-specific print rules. Meta = title passed to layout.

3. Dashboard Widgets

WidgetLoading StateError StateEmpty StateAuthRefreshKeyboardA11yLines
Weather & Clock396
Microsoft To Do1157
Today's CalendarThin wrapper → delegates to TodayCalendar.tsx (a11y added)5
Quick Links½432
Recent Files197
Planner582
Quote of the Day49
Company News½144
Industry News329
Team Presence365
NATO Phonetic199
Live Fleet Tracker244
Windy Weather½244
Markets339
Bunker Prices290
Inbox494
Teams Chats361
Travel Calendar370

Criteria: Loading = Skeleton/spinner while data loads. Error = error message on fetch failure. Empty = message when no data. Auth = uses Graph API token. Refresh = auto-refresh or manual refresh. Keyboard = focus/key handlers beyond browser defaults. A11y = aria labels, roles, sr-only text.

4. Dashboard Infrastructure

ComponentTypeScriptError HandlingPersistenceDrag A11yMigrationPerf
DashboardGrid
WidgetShell
WidgetCatalogue
EditModeToolbar
SortableWidget

Criteria: TypeScript = fully typed props/state. Error Handling = try/catch on storage/render. Persistence = saves to localStorage or Graph. Drag A11y = keyboard-accessible drag-and-drop. Migration = handles layout version upgrades. Perf = lazy loading, memoization, or Suspense boundaries.

5. Interactive Components — React Islands

ComponentLoadingErrorKeyboard NavSearch/FilterHydrationGraph API
PeopleDirectory½load
DocumentLibraryload
WmsLibraryload
DocumentSearchload
DocumentControlsload
ProcessOverview½load
FlowchartV2load
NodeDetailload
ProcessBreadcrumbload
LeaveRequestForm½load
CommandPaletteload
SharePointBrowser½load

Criteria: Loading = visual feedback during data fetch. Error = graceful failure UI. Keyboard = custom key handlers. Search = filter or search capability. Hydration = client:load vs client:idle directive. Graph = uses MSAL token.

6. Chrome — Shared Shell

ComponentResponsiveDark ModeKeyboardARIAAnimationsFocus Mgmt
Header.astro½½
Sidebar.astro
Footer.astro
Breadcrumb.astro
ThemeToggle½
SidebarToggle½
MegaMenu½½½
UserAvatar½½½

Criteria: Responsive = adapts across breakpoints. Dark = themed for both modes. Keyboard = custom key handlers. ARIA = roles, labels, expanded/current. Animations = transitions/motion. Focus = trap/restore on open/close.

7. Utility Components

ComponentTypeScriptReduced MotionSSR SafeReusableA11y
Greeting½
AnimatedCounter½
ScrollProgress½
LiveClock½

Criteria: TypeScript = typed props. Reduced Motion = respects prefers-reduced-motion. SSR Safe = no window/document at import time. Reusable = no page-specific coupling. A11y = aria-live, sr-only, or role attributes.

8. UI Primitives — shadcn/ui

DimensionStatusNotes
Sourceshadcn/ui new-york style — upstream maintained
CustomisationHSL CSS vars for brand palette in globals.css
WCAG 2.2 AARadix primitives provide keyboard, focus, ARIA by default
Dark ModeSemantic tokens switch via .dark class
Tree-shakingOnly imported primitives ship to client
Version Currency½Manually updated — no automated sync with upstream

9. Content Collections

DimensionStatusNotes
Schema ValidationZod schema with coerced dates, enums, nested objects
Type SafetyAstro generates TypeScript types from schema
Build-time ErrorsInvalid frontmatter fails the build
Cross-referencesrelatedDocuments + referencedBy fields
Pipeline Automation½convert-wms.mjs exists but manual invocation
Freshness Tracking½reviewDueDate in schema but no automated alerts
Full-text SearchCommand palette matches ref/title only, not body content

10. Services & Libraries

ModuleTypesError HandlingCachingToken MgmtTests
msal.ts
graph.ts½
preferences-sync.ts
dashboard/storage.ts

Criteria: Types = exported interfaces/generics. Error = try/catch with fallback. Caching = localStorage or in-memory cache. Token = silent acquisition with consent fallback. Tests = unit or integration tests.

11. Build & Deploy Infrastructure

ItemAutomatedError RecoverySecurityMonitoringDocs
deploy.yml½½
api/proxy½½
convert-wms.mjs½½
globals.css
staticwebapp.config½

Criteria: Automated = runs without manual steps. Error Recovery = handles failures gracefully. Security = secrets management, CSP, auth. Monitoring = alerts or logging on failure. Docs = inline comments or README.

Coverage Summary

CategoryComponentsFullPartialMissingScore
Layouts21400100%
Pages114217875%
Dashboard Widgets175605550%
Dashboard Infra51811162%
React Islands122382945%
Chrome82712969%
Utility Components4124470%
UI Primitives1751092%
Content Collections142171%
Services4122665%
Build & Deploy5107854%