toga-ai 1.0.955 → 1.0.956

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,6 +9,7 @@
9
9
  | [Client-Configurable Fields (useClientFields / fieldsConfig)](features/client-configurable-fields.md) | Config that varies by client (or client × role) — field overrides, filter buttons, group-by, column pickers, layout toggles — resolved through `src/fieldsConfig |
10
10
  | [Column State (URL-driven show/hide, order & pinning)](features/column-visibility.md) | URL-driven "Columns" button + modal (`cols` param) for show/hide + order + pinning of table columns, client-configurable then Surface-driven; open for column-vi |
11
11
  | [Force Logout on Deployment (useDeploymentGuard)](features/force-logout-on-deployment.md) | Force-signs-out every user when a deploy bumps a Core parameter, so session + caches reset to the new build; open when debugging surprise logouts or `useDeploym |
12
+ | [Loading & save-error states (table skeletons, shimmers, Refresh busy pill, save-error toaster)](features/loading-and-error-states.md) | Owning doc for how supply shows loading (table skeleton, sub-section shimmer, Refresh busy pill, sales-order modal skeletons) and failed saves (error toaster, n |
12
13
  | [Meta-Driven Page & Table Setup](features/meta-driven-table-data.md) | A page is meta-driven end to end — page meta + table meta + table data, each keyed by slug via toga-blox hooks; pagination-vs-infinite is decided solely by meta |
13
14
  | [Persisted React Query cache (localStorage `supply-chain-query-cache`)](features/persisted-query-cache.md) | `localStorage["supply-chain-query-cache"]` is the whole React Query cache dehydrated to disk (survives reloads AND sessions); the owning doc for staleTime rules |
14
15
  | [Record Modals & Nested Tables](features/record-modals-and-nested-tables.md) | The repo's modal + nested-table patterns over toga-blox `TableRecordModal` / `PrimaryTable*Layout` — six load-bearing UI patterns (row-click record modal, neste |
@@ -0,0 +1,64 @@
1
+ ---
2
+ title: Loading & save-error states (table skeletons, shimmers, Refresh busy pill, save-error toaster)
3
+ framework: "2.0"
4
+ repo: toga25-supply
5
+ project: TOGa 2.5 Supply
6
+ client: shared
7
+ type: feature
8
+ status: active
9
+ updated: 2026-10-06
10
+ owners: ["tcox"]
11
+ files:
12
+ - toga25-supply/src/components/TableSkeleton/TableSkeleton.tsx
13
+ - toga25-supply/src/components/TableSkeleton/useTableGeometryMemory.ts
14
+ - toga25-supply/src/components/SubSectionShimmer/SubSectionShimmer.tsx
15
+ - toga25-supply/src/components/Shimmer/Shimmer.tsx
16
+ - toga25-supply/src/hooks/useIsTableRefreshing.ts
17
+ - toga25-supply/src/layout/PrimaryTableServerLayout/PrimaryTableServerLayout.tsx
18
+ - toga25-supply/src/layout/PrimaryTableClientLayout/PrimaryTableClientLayout.tsx
19
+ - toga25-supply/src/pages/SalesOrders/view/SalesOrderRecordModalLayout/helpers/recordShapeMemory.ts
20
+ - toga25-supply/src/utils/saveErrorToaster.ts
21
+ related:
22
+ - ./record-modals-and-nested-tables.md
23
+ - ./transfer-orders-page.md
24
+ - ./persisted-query-cache.md
25
+ - ../workflows/cypress-testing.md
26
+ ---
27
+
28
+ Owning doc for how supply shows loading (table skeleton, sub-section shimmer, Refresh busy pill, sales-order modal skeletons) and failed saves (error toaster, never a modal banner); open before touching any loading/error UI or reviving the old TRUE-79502/79505 branches.
29
+
30
+ ## Summary
31
+
32
+ - **Cold table load** → `TableSkeleton` (real header chrome + remembered column widths, no column shift).
33
+ - **Background refetch** (save, focus, Refresh on warm data) → rows stay; Refresh button shows a busy pill via `useIsTableRefreshing`.
34
+ - **Record modal** (Sales Orders, Transfer Orders) → cold / warm / sub-section skeletons, shaped by remembered record shape.
35
+ - **Failed save/create/edit** → error toaster with `SAVE_ERROR_TOASTER_MESSAGE`. The red `ModalBanner` "error" variant is **retired** (decided 2026-08-25).
36
+
37
+ ## How it works
38
+
39
+ ### Table skeleton gate (`PrimaryTableServerLayout` / `PrimaryTableClientLayout`)
40
+ - Render order: full-body error (`TableStateBlock`) → skeleton → empty/no-results → table.
41
+ - `showSkeleton = isLoadingTableDataLoading || !displayRecords`. Never gate on `isFetching` — `useTableData` keeps prior rows via `placeholderData`, and gating on `isFetching` flashes the skeleton on every modal save / focus refetch. Page Refresh resets the table queries, so it still re-enters the skeleton.
42
+ - `useTableGeometryMemory(slug, …)` stores header fields + pixel widths in `localStorage["toga-table-chrome:<slug>"]` so the skeleton draws the real header before the meta fetch returns. Live fields are label-less until page meta merges labels — skeleton holds the remembered fields until then.
43
+
44
+ ### Refresh busy pill — `useIsTableRefreshing()`
45
+ True while a `["table-data"]` query **that already has data** refetches. Excludes cold loads (skeleton covers them) and infinite-scroll `fetchMore` (scrolling is not a refresh).
46
+
47
+ ### Sales-order modal skeletons — `recordShapeMemory.ts`
48
+ Per-record shape (`itemCount`, `hasInvoices`, `hasShipments`) in `sessionStorage["toga-so-shape:<uuid>"]`, merge-saved as each query settles. The skeleton only draws frames for sections that will exist — no section pops in then vanishes. `SubSectionShimmer` / `Shimmer` give the shared texture.
49
+
50
+ ### Save-error toaster — `src/utils/saveErrorToaster.ts`
51
+ Item, vendor-item, bundle and bundle-item create/edit hooks call `useToaster().addToaster({ status: "error", ...SAVE_ERROR_TOASTER_MESSAGE })`. Raw error goes to the console, never to the user. New save hooks must use the same constant.
52
+
53
+ ### Visual review — temporary dev gallery
54
+ To eyeball every state at once: restore the old gallery with `git show TRUE-79502:src/pages/DevLoadingStates/DevLoadingStatesPage.tsx`, register it in `src/routes.tsx` **inside `AllowedRoutes`** behind `import.meta.env.DEV` at `/dev/loading-states` (needs login). Newer blox `TablePagination` needs `recordsPerPage` inside `paginationMeta` — the old page must be patched. **Delete it before merge**; it is not shipped.
55
+
56
+ ## Gotchas
57
+ - **⚠ blox `useFetchTablePageMeta` has no `isError`.** A failed meta fetch leaves the table on its skeleton forever. Open follow-up.
58
+ - **⚠ `isPageFetch` path in `PrimaryTableServerLayout` is dead code** (never true in practice). Open follow-up — do not build on it.
59
+ - **⚠ Do not merge `_production` into the stale TRUE-79502 / TRUE-79505 branches** — it drops newer prod features. Cut a fresh branch from `_production` and port pieces by hand (done as TRUE-82385).
60
+ - Old-branch pieces deliberately **not** ported: `ModalBanner` error variant + `DevErrorStates` page (TRUE-79505), `BulkProgressToast` (no consumers), `DevLoadingStatesPage` (demo), `SalesOrderItemsTableLayout` (deleted in `_production` 97d20ff). TRUE-79502-update's `useClientFields` / Prudential CSV-BOM edits are unrelated to loading. TRUE-79505-updated, TRUE-79505-prod and TRUE-79501 are already fully in `_production`. TRUE-79506 never existed.
61
+ - A disabled React Query v5 query reports `pending` forever — see [transfer-orders-page](./transfer-orders-page.md) before deriving a skeleton flag from one.
62
+
63
+ ## Change history
64
+ - 2026-10-06 — Ported loading states (TRUE-79502-update) + save-error toaster onto fresh `_production` as TRUE-82385; Transfer Orders wired; Cypress expectations updated. (tcox)
@@ -33,7 +33,7 @@ _Auto-generated by `knowledge.js index`. Do not hand-edit._
33
33
  - **voice-to-voice** (TOGa Voice) — 4 doc(s) → [2.0/apps/voice-to-voice/INDEX.md](2.0/apps/voice-to-voice/INDEX.md)
34
34
  - **ai-bdr** (AI-BDR) — 13 doc(s) → [2.0/apps/ai-bdr/INDEX.md](2.0/apps/ai-bdr/INDEX.md)
35
35
  - **toga2-commerce** (TOGa Commerce) — 29 doc(s) → [2.0/apps/toga2-commerce/INDEX.md](2.0/apps/toga2-commerce/INDEX.md)
36
- - **toga25-supply** (TOGa 2.5 Supply) — 22 doc(s) → [2.0/apps/toga25-supply/INDEX.md](2.0/apps/toga25-supply/INDEX.md)
36
+ - **toga25-supply** (TOGa 2.5 Supply) — 23 doc(s) → [2.0/apps/toga25-supply/INDEX.md](2.0/apps/toga25-supply/INDEX.md)
37
37
  - **toga25-iq** (TOGa IQ) — 1 doc(s) → [2.0/apps/toga25-iq/INDEX.md](2.0/apps/toga25-iq/INDEX.md)
38
38
  - **toga25-desk** (TOGa Desk 2.5) — 1 doc(s) → [2.0/apps/toga25-desk/INDEX.md](2.0/apps/toga25-desk/INDEX.md)
39
39
  - **toga25-blox** (TOGa Blox 2.5) — 1 doc(s) → [2.0/apps/toga25-blox/INDEX.md](2.0/apps/toga25-blox/INDEX.md)
@@ -42,7 +42,7 @@ _Auto-generated by `knowledge.js index`. Do not hand-edit._
42
42
 
43
43
  ## standalone framework
44
44
 
45
- - **togatech** (TOGA Technology Website) — 7 doc(s) → [standalone/apps/togatech/INDEX.md](standalone/apps/togatech/INDEX.md)
45
+ - **togatech** (TOGA Technology Website) — 8 doc(s) → [standalone/apps/togatech/INDEX.md](standalone/apps/togatech/INDEX.md)
46
46
  - **websocket** (WebSocket Server) — 2 doc(s) → [standalone/apps/websocket/INDEX.md](standalone/apps/websocket/INDEX.md)
47
47
  - **forward** (Forwarder) — 3 doc(s) → [standalone/apps/forward/INDEX.md](standalone/apps/forward/INDEX.md)
48
48
  - **claude** (Claude Harness) — 8 doc(s) → [standalone/apps/claude/INDEX.md](standalone/apps/claude/INDEX.md)
@@ -4,7 +4,8 @@
4
4
  |-----|---------|
5
5
  | [TOGA Technology Website Architecture](architecture.md) | Public TOGA Technology marketing site — standalone React/TS SPA (no PHP framework); open for stack, bootstrap, routing, page layout, integrations, build/deploy. |
6
6
  | [Careers Section — Live Paylocity Job Openings (About page + /v2/campaigns/jobs proxy)](features/careers-paylocity-job-openings.md) | togatech About page "Join Our Team" section — live Paylocity jobs via unauthenticated `GET /v2/campaigns/jobs` record-script proxy; open for the fetch→proxy→map |
7
+ | [NavV2 Global Nav — menus, scroll reveal, Talos FAB](features/navv2-global-nav.md) | togatech NavV2 header (designer "phase one"): data-driven menus, `data-nav-reveal` scroll hide/show, opt-in `data-nav-pinned` for sticky scenes, Talos FAB rules |
7
8
  | [SEO / AEO / GEO — Prerendering, Single-Source Meta & Structured Data](features/seo-aeo-geo-prerender.md) | togatech SEO/AEO/GEO — build-time Puppeteer prerender + single-source per-page meta + JSON-LD; open for the robots-gating de-index bug and Amplify build require |
8
- | [Talos Product Page (/talos) — ported designer prototype](features/talos-product-page.md) | togatech `/talos` Talos AI product page, ported from a designer HTML/JSX/CSS prototype; open for the design-port CSS approach, lazy-load + prerender rules, page |
9
+ | [Talos Product Page (/talos) — ported designer prototype](features/talos-product-page.md) | togatech `/talos` Talos AI product page, ported from a designer HTML/JSX/CSS prototype; open for the design-port CSS approach, re-porting a new design drop, laz |
9
10
  | [Creating Pull Requests on togatech](workflows/creating-pull-requests.md) | Open a PR on `agilantsolutions/togatech` — `gh` CLI lacks `read:org`, so use a raw GitHub REST call with the keychain token; base is `_production`. |
10
11
  | [Running togatech Locally & Verifying a Page Without Cypress](workflows/local-dev-and-headless-verification.md) | Get togatech running on a dev machine and verify a data-driven section without Cypress — `npm install` first, `lint` is dead, Cypress 15 fails on Windows. |
@@ -0,0 +1,68 @@
1
+ ---
2
+ title: NavV2 Global Nav — menus, scroll reveal, Talos FAB
3
+ framework: "standalone"
4
+ repo: togatech
5
+ project: TOGA Technology Website
6
+ client: shared
7
+ type: feature
8
+ status: active
9
+ updated: 2026-10-05
10
+ owners: ["tcox"]
11
+ files:
12
+ - togatech/src/components/NavV2/view/NavV2.tsx
13
+ - togatech/src/components/NavV2/view/TalosFab.tsx
14
+ - togatech/src/components/NavV2/view/NavDestLink.tsx
15
+ - togatech/src/components/NavV2/view/panels/WhatPanel.tsx
16
+ - togatech/src/components/NavV2/view/panels/CompanyPanel.tsx
17
+ - togatech/src/components/NavV2/view/panels/PanelFooter.tsx
18
+ - togatech/src/components/NavV2/navV2.module.css
19
+ - togatech/src/components/NavV2/types.ts
20
+ - togatech/src/components/NavV2/navRoutes.ts
21
+ - togatech/src/components/NavV2/viewModel/useNavV2.ts
22
+ - togatech/src/components/NavV2/viewModel/useNavReveal.ts
23
+ - togatech/src/components/NavV2/viewModel/useCompactViewport.ts
24
+ - togatech/src/components/NavV2/viewModel/useRovingTabs.ts
25
+ - togatech/src/components/NavV2/viewModel/useDockedState.ts
26
+ - togatech/src/components/NavV2/viewModel/FIELDS/NAVFIELDS.json
27
+ - togatech/src/components/MobileNav/MobileNav.tsx
28
+ - togatech/src/styles/index.css
29
+ related:
30
+ - ../architecture.md
31
+ - talos-product-page.md
32
+ ---
33
+
34
+ togatech NavV2 header (designer "phase one"): data-driven menus, `data-nav-reveal` scroll hide/show, opt-in `data-nav-pinned` for sticky scenes, Talos FAB rules, design-anchor rule. Open before touching the nav or adding a full-screen sticky section.
35
+
36
+ ## Summary
37
+
38
+ Global header in `src/components/NavV2/` (MVVM: `view/`, `viewModel/`, menu data in `viewModel/FIELDS/NAVFIELDS.json`). Mobile is `components/MobileNav/MobileNav.tsx`. Destinations come from `navRoutes.ts` (`LIVE_ROUTES` / `STUB_ROUTES`) — see [architecture.md](../architecture.md) Routing.
39
+
40
+ ## How it works
41
+
42
+ **Menus (data-driven):**
43
+ - Two menus shown: What we do, Company. Industries / Resources are hidden in `NAVFIELDS.json`; their panel code is kept for a later phase — re-enable via data, do not rebuild.
44
+ - Flat links are `flatLinks[]` (was single `flatLink`): The TOGA Blog → `/blog` stub, Contact.
45
+ - What we do has 2 tabs (Business Units, Platforms). Tab hover switches the tab but never moves keyboard focus (`useRovingTabs`).
46
+ - Company panel and What-we-do share `panels/PanelFooter.tsx`.
47
+
48
+ **Scroll reveal (`useNavReveal.ts`):** sets `data-nav-reveal = top | hidden | shown` on the **nav root**, not `<html>`.
49
+ - `top` within 80px of page top. Hides after 8px scroll down; shows after 8px scroll up.
50
+ - Never hides while a menu is open, the pointer is over the bar, or keyboard focus is inside (`focusin` forces `shown`; a mouse click does not pin it).
51
+ - Initial render is always `top` (prerender gives the same output every time); the real state is computed on mount.
52
+ - Glass look (blur / grain / edge) only in `shown`.
53
+ - `useCompactViewport.ts`: compact padding when viewport height ≤ 1000px.
54
+
55
+ **Pinned scenes (opt-in):** a full-screen sticky scene must carry `data-nav-pinned` so the bar does not pop back during it. Current users: Home `Difference.tsx`, WhatWeDo `CardScroll.tsx`. Add the attribute to any new scroll-pinned section.
56
+
57
+ **Section anchors:** `src/styles/index.css` has `:where(section[id]:not(#top)) { scroll-margin-top: 104px }` (zero specificity — a page rule overrides it freely).
58
+
59
+ **Talos FAB (`TalosFab.tsx`):** a `<button>` that opens the global chat via `openTalosChat` (same as the bar pill) — not a `Link` to `/talos`. Visible only past one screen of scroll **and** while the bar is not `shown`; unfocusable while hidden. Ask Talos pill + FAB use the design's light-trail ring — no box-shadow glow in any state.
60
+
61
+ ## Gotchas
62
+
63
+ - **Design anchors usually do not exist on our pages.** Use a design link anchor (`#apps`, `#solutions`, `#culture`, `#mission`, `#team`, `#why-us`, …) only if that id exists on the target page; otherwise keep the `navRoutes.ts` route / `/company/*` stub. None of the phase-one anchors exist today.
64
+ - Between ~88px scroll and one screen, neither bar nor FAB shows. Matches the design; open question with tcox — do not "fix" without asking.
65
+ - `/ai-solutions` stub is no longer linked from the nav.
66
+
67
+ ## Change history
68
+ - 2026-10-05 — Phase-one redesign: 4 → 2 menus, `flatLinks[]`, Platforms/Company panels rebuilt, scroll reveal + `data-nav-pinned`, compact viewport, FAB visibility rules (tcox)
@@ -6,13 +6,18 @@ project: TOGA Technology Website
6
6
  client: shared
7
7
  type: feature
8
8
  status: active
9
- updated: 2026-09-25
9
+ updated: 2026-10-05
10
10
  owners: ["tcox"]
11
11
  files:
12
12
  - togatech/src/pages/Talos/TalosPage.tsx
13
13
  - togatech/src/pages/Talos/talos.css
14
14
  - togatech/src/pages/Talos/viewModel/useTalosSparks.ts
15
+ - togatech/src/pages/Talos/viewModel/useGlassPanes.ts
16
+ - togatech/src/pages/Talos/viewModel/useTalosPanelSky.ts
15
17
  - togatech/src/pages/Talos/view/shared/Reveal.tsx
18
+ - togatech/src/pages/Talos/view/sections/TalosHero
19
+ - togatech/src/pages/Talos/view/sections/TalosVoice
20
+ - togatech/src/pages/Talos/view/sections/TalosGovernance
16
21
  - togatech/src/routes.tsx
17
22
  - togatech/src/components/templates/AppLayout/AppLayout.tsx
18
23
  - togatech/src/components/templates/AppLayout/appLayoutContext.ts
@@ -20,32 +25,48 @@ files:
20
25
  related:
21
26
  - ../architecture.md
22
27
  - seo-aeo-geo-prerender.md
28
+ - navv2-global-nav.md
23
29
  ---
24
30
 
25
- togatech `/talos` Talos AI product page, ported from a designer HTML/JSX/CSS prototype; open for the design-port CSS approach, lazy-load + prerender rules, page-owned footer, and opening the Talos chat from a page.
31
+ togatech `/talos` Talos AI product page, ported from a designer HTML/JSX/CSS prototype; open for the design-port CSS approach, re-porting a new design drop, lazy-load + prerender rules, page-owned footer, opening the Talos chat from a page.
26
32
 
27
33
  ## Summary
28
34
 
29
- `/talos` is a 15-section product page (`src/pages/Talos/`) ported from a designer prototype (static HTML + in-browser JSX + CSS; the drop-in at `togatech/_design/talos/` is temporary and never committed). Standard MVVM page layout: `view/sections/<Section>/` (incl. `TalosSparks` canvas backdrop and `TalosFooter`), `view/shared/Reveal.tsx`, `viewModel/use*.ts` hooks, copy in `viewModel/FIELDS/*.json`, images in `public/assets/talos/`. Live route, prerendered, in the sitemap list.
35
+ `/talos` is a 15-section product page (`src/pages/Talos/`) ported from a designer prototype (static HTML + in-browser JSX + CSS). Design drops are temporary and never committed — latest at `togatech/project_html/uploads/New TOGA WEBSITE/TOGA Website/` (untracked; first drop was `_design/talos/`). Standard MVVM page layout: `view/sections/<Section>/` (incl. `TalosSparks` canvas backdrop and `TalosFooter`), `view/shared/Reveal.tsx`, `viewModel/use*.ts` hooks, copy in `viewModel/FIELDS/*.json`, images in `public/assets/talos/`. Live route, prerendered, in the sitemap list.
30
36
 
31
37
  ## How it works
32
38
 
33
39
  **CSS port (the reusable approach for any designer prototype):**
34
- - All design CSS is concatenated **in original cascade order** into one plain file, `talos.css`, every selector prefixed `.talosPage `. `:root` / `html` / `body` selectors map to `.talosPage`. Generated by a one-off postcss prefix script (not in `scripts/`) — regenerate the same way if the design CSS changes.
40
+ - All design CSS is concatenated **in original cascade order** into one plain file, `talos.css`, every selector prefixed `.talosPage `. `:root` / `html` / `body` selectors map to `.talosPage`.
41
+ - Generated by a postcss prefix+concat script, `build-talos-css.cjs`, that lives **outside the repo** (session scratchpad, not `scripts/`). If it is lost, re-create it before the next design CSS change — never hand-edit a regenerated `talos.css` in bulk.
42
+ - After regenerating, re-apply the port edits: add any design token the CSS uses but our copy lacks (the first port missed `--ease-enter`, so `.reveal` / `.tlh-enter` / `.tpl-rev` had no valid transition); drop `.needs-dev*`, `.tvq*`, and design `.talos-fab{display:none !important}` (it is for the design's orb launcher and would hide our NavV2 FAB until the orb is ported).
35
43
  - **Not a CSS module:** the design JS finds elements by raw class names/ids and sets keyframe names inline; CSS-module hashing breaks all of that. (CTO-reviewed choice.)
36
44
  - Design timing workarounds are kept on purpose: IntersectionObserver + rect-poll backstops and `setTimeout` retry chains (rAF / ResizeObserver can go silent on cold load). Animation loops pause off-screen and on hidden tab.
37
45
  - `<html>`-level styles (`overflow-x: clip` so `position: sticky` works — never `hidden`; `scroll-behavior: smooth`) are set in `useLayoutEffect` and **removed** on unmount, not "restored" (a prerendered snapshot already carries them, so the "previous" value is wrong).
38
46
 
39
- **Code-split + prerender:** `routes.tsx` wraps the page in `React.lazy` + `<Suspense fallback={null}>` inside the route `Component`. Rules for this live in [seo-aeo-geo-prerender.md](seo-aeo-geo-prerender.md) (router `lazy` vs `React.lazy`, no DOM appends into React-owned nodes, `TOGAPrerender` UA skip for canvas engines).
47
+ **Code-split + prerender:** `routes.tsx` wraps the page in `React.lazy` + `<Suspense fallback={null}>` inside the route `Component`. Rules in [seo-aeo-geo-prerender.md](seo-aeo-geo-prerender.md). Page-specific: `useGlassPanes` `useFitGap` (56px under the lede) skips on the `TOGAPrerender` UA so the snapshot does not bake the crawler-viewport margin.
40
48
 
41
49
  **Layout hooks this page uses:**
42
- - **Opening the Talos chat:** AppLayout owns the global Talos chat modal and passes `<Outlet context={{ openTalosChat }} />`. Pages call `useAppLayoutContext().openTalosChat()` (`AppLayout/appLayoutContext.ts`). Use this — do not mount a second chat.
43
- - **Own footer:** `ROUTES_WITH_OWN_FOOTER` in `AppLayout.tsx` (only `/talos` today, tcox's call) hides the old site footer (with contact form); the page renders `TalosFooter`. The old footer stays on all other pages until the redesigned footer goes site-wide — then retire the list.
44
- - **NavV2 floating Talos button** (`TalosFab.tsx`) is a `<button>` that opens the chat (same as the bar pill), not a `Link` to `/talos`; unfocusable while hidden. Styled from the design's `.talos-persist.talos-fab` (light-trail ring, icon-only, 44px, rises 20px on entrance).
50
+ - **Opening the Talos chat:** AppLayout owns the global Talos chat modal and passes `<Outlet context={{ openTalosChat }} />`. Pages call `useAppLayoutContext().openTalosChat()` (`AppLayout/appLayoutContext.ts`). Use this — do not mount a second chat. The Hero's second button ("Ask Talos", `btn-talos-boxed is-lg is-hero`) uses it; there is no expanded chat mode yet.
51
+ - **Own footer:** `ROUTES_WITH_OWN_FOOTER` in `AppLayout.tsx` (only `/talos` today, tcox's call) hides the old site footer; the page renders `TalosFooter`. Retire the list when the redesigned footer goes site-wide.
52
+ - **Floating Talos button:** NavV2's `TalosFab` — see [navv2-global-nav.md](navv2-global-nav.md).
53
+
54
+ **Section notes:** Voice sits at the end of `.tpanel2` as a `.tproof-*` stat + quote row (moved out of `.tpanel`). Governance `RAIL_COLUMNS = points.length` (7 points). PanelSky has no `.tp2-tw` twinkle; it fades over 360px to `PAGE_FILL`.
45
55
 
46
56
  **Routing:** `/talos` is in `LIVE_ROUTES` (`NavV2/navRoutes.ts`) and `src/routes.config.json`. Sub-pages `/talos/one|flow|engage` are still `STUB_ROUTES`.
47
57
 
48
- **Copy:** uses the design's "Katie" copy set (Katie signs off copy). Still placeholder: FAQ answers (`[Answer not written. Needs Jeff.]`), the Voice section quote, and the demo stage (no video).
58
+ **Copy:** the design's default `COPY.katie` set (Katie signs off copy). Still placeholder: FAQ answers and the demo stage (no video).
59
+
60
+ ## Port status (design drop 2, 2026-10)
61
+
62
+ Done: batches 1–2 (CSS regen, copy, Hero ask, Voice move, Governance, PanelSky). Left:
63
+ 1. Compare rebuild — half-stars, info popover, key.
64
+ 2. FAQ two-column, 9 items, per-item ask. Then **delete the temporary bridge rules** under `#talos-faq:not(:has(.tfq-cols))` in `talos.css`.
65
+ 3. ProductLine "What can X do?" ask buttons + `useTalosSweep`.
66
+ 4. Re-sync `talosSparksRoute.ts` — the sparks line loops wrong around the moved Voice section.
67
+ 5. `TalosOrbLauncher` / `talos-orb.js` replacing the FAB on `/talos`, `.tfab-label`, TalosGuide bubbles, chat API `open(q, {expanded})` / `close()`.
68
+
69
+ Design's `HeroWeave` / `HeroDots` / old Hero are dead code — do not port.
49
70
 
50
71
  ## Gotchas
51
72
 
@@ -55,4 +76,5 @@ togatech `/talos` Talos AI product page, ported from a designer HTML/JSX/CSS pro
55
76
  - Tailwind preflight is global and can differ from the design's browser defaults — check margins/list/button resets when a section looks off.
56
77
 
57
78
  ## Change history
79
+ - 2026-10-05 — Design drop 2, batches 1–2: talos.css regen (+`--ease-enter`, `.talos-mark`), Hero "Ask Talos", Voice → `.tproof-*`, FAQ bridge rules, useFitGap prerender skip (tcox)
58
80
  - 2026-09-25 — Built /talos from the designer prototype; added Outlet context `openTalosChat`, `ROUTES_WITH_OWN_FOOTER`, TalosFab now opens chat (tcox)
@@ -6,7 +6,7 @@ project: TOGA Technology Website
6
6
  client: shared
7
7
  type: workflow
8
8
  status: active
9
- updated: 2026-09-25
9
+ updated: 2026-10-05
10
10
  owners: ["tcox"]
11
11
  files:
12
12
  - togatech/package.json
@@ -36,7 +36,8 @@ The gotcha-avoidance path for getting `togatech` up on a dev machine and actuall
36
36
  - A Vite "imported but could not be resolved" error almost always means **stale install**, not a missing package — check `package.json` before adding a dependency.
37
37
  - `npm run lint` is effectively dead until eslint and an `eslint.config.*` are added to the repo; do not treat a lint failure-to-start as a code problem.
38
38
  - Cypress specs are still the source of truth for e2e coverage — the Puppeteer route is a *local verification* workaround, not a replacement. Don't delete or rewrite specs because Cypress won't launch locally.
39
- - `robotsPlugin` writes `robots.txt` to `./dist` even when you build with `--outDir <other>` — a scratch build still touches `dist/`.
39
+ - `robotsPlugin` hardcodes `./dist`: a `--outDir <other>` scratch build still writes `dist/robots.txt`, and its `closeBundle` errors if `dist/` does not exist. Harmless for scratch builds.
40
+ - A production `vite build` sends GA4 hits even when served from localhost — headless checks against a prod build log real `localhost/...` page views. Verify against `npm run dev` where you can.
40
41
  - Watching the network tab is not proof a fetch is broken: see step 3 (persisted query cache).
41
42
 
42
43
  ## Related
@@ -45,4 +46,5 @@ The gotcha-avoidance path for getting `togatech` up on a dev machine and actuall
45
46
  - [Careers Section — Live Paylocity Job Openings](../features/careers-paylocity-job-openings.md)
46
47
 
47
48
  ## Change history
49
+ - 2026-10-05 — Prod build sends GA hits from localhost; robotsPlugin closeBundle fails without dist/ (tcox)
48
50
  - 2026-09-25 — No eslint config either; `tsc -p tsconfig.app.json` path-filter tip; robotsPlugin ignores --outDir (tcox)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "toga-ai",
3
- "version": "1.0.955",
3
+ "version": "1.0.956",
4
4
  "description": "TOGA Technology Team Claude Knowledge System — shared AI coding harness with skills, knowledge base CLI, and project installer for Claude Code.",
5
5
  "keywords": [
6
6
  "claude",