toga-ai 1.0.350 → 1.0.352
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.
- package/knowledge/2.0/apps/ai-bdr/INDEX.md +1 -1
- package/knowledge/2.0/apps/ai-bdr/features/bdr-web-funnel-plan.md +22 -1
- package/knowledge/2.0/apps/ai-bdr/features/web-funnel-app.md +44 -2
- package/knowledge/2.0/apps/toga2-supply/INDEX.md +1 -1
- package/knowledge/2.0/apps/toga2-supply/features/fulfill-and-ship.md +55 -1
- package/package.json +1 -1
|
@@ -6,6 +6,6 @@
|
|
|
6
6
|
| [BDR Web Funnel — Full Implementation Plan](features/bdr-web-funnel-plan.md) | > **Execution status (2026-07-14):** PLAN **Phases 0–5 are BUILT and QA'd** — the web > app engine, full mockup port, and real backend are done. | bdr/PLAN.md, bdr/mockup/app.jsx, bdr/mockup/screens.jsx, bdr/mockup/components.jsx |
|
|
7
7
|
| [Call Orchestration — PHP Worker ↔ Vapi (the integration seam)](features/call-orchestration.md) | The **PHP worker** is the orchestrator; **Vapi** is the actor. | ai-bdr/docs/client-onboarding-sop.md, ai-bdr/docs/vapi-firstmessage-timing-fix.md, ai-bdr/docs/vapi-inbound-callback-assistant-request.md, ai-bdr/docs/vapi-voicemail-iphone-screening.md, ai-bdr/scripts/update_structured_output.py |
|
|
8
8
|
| [Vapi Integration — Assistants, Tools, Structured Output](features/vapi-integration.md) | Everything inside Vapi: the three assistants, the three shared tools, the shared structured-output schema, the Liquid-templated system prompt, and the Python sc | ai-bdr/vapi/templates/assistant.template.json, ai-bdr/vapi/templates/system-prompt.template.md, ai-bdr/prompts/archive/prompt-may-15.txt, ai-bdr/prompts/campaigns/healthcare-2026-03-18.md, ai-bdr/prompts/campaigns/healthcare-v2-2026-03-25.md, ai-bdr/prompts/templates/campaign-template.md, ai-bdr/scripts/update_assistant.py, ai-bdr/scripts/update_system_prompt.py, ai-bdr/scripts/update_structured_output.py, ai-bdr/scripts/update_call_summary_context.py, ai-bdr/scripts/fix_booking_guardrails.py, ai-bdr/scripts/get_assistant.py, ai-bdr/docs/vapi-firstmessage-timing-fix.md, ai-bdr/docs/vapi-voicemail-iphone-screening.md |
|
|
9
|
-
| [Web Funnel — Built Next.js App (structure, stack, how to run)](features/web-funnel-app.md) | The **built** state of the BDR web funnel — the Next.js UI / lead-capture front door of the existing AI-BDR product (see `../architecture.md`). | bdr/PLAN.md, bdr/.gitignore, bdr/eslint.config.mjs, bdr/amplify.yml, bdr/src/app, bdr/src/lib/resolveCampaignId.ts, bdr/src/content, bdr/src/components, bdr/src/flow, bdr/src/server, bdr/src/app/api, bdr/test, bdr/public, bdr/mockup/styles.css |
|
|
9
|
+
| [Web Funnel — Built Next.js App (structure, stack, how to run)](features/web-funnel-app.md) | The **built** state of the BDR web funnel — the Next.js UI / lead-capture front door of the existing AI-BDR product (see `../architecture.md`). | bdr/PLAN.md, bdr/.gitignore, bdr/eslint.config.mjs, bdr/amplify.yml, bdr/src/app, bdr/src/app/layout.tsx, bdr/src/app/studio.css, bdr/src/lib/resolveCampaignId.ts, bdr/src/lib/scheduleSlots.ts, bdr/src/content, bdr/src/components, bdr/src/flow, bdr/src/server, bdr/src/app/api, bdr/test, bdr/public, bdr/mockup/styles.css |
|
|
10
10
|
| [Web Funnel — Next.js UI + Config-Driven Campaign Content](features/web-funnel-content-model.md) | > **Status note:** the content **contract** below (schema, provider seam, adapters) > is now BUILT and QA'd (PLAN Phases 0–5). | bdr/src/content/schema.ts, bdr/src/content/hubspotProvider.ts, bdr/src/content/useCampaign.ts, bdr/src/content/default.ts, bdr/src/lib/resolveCampaignId.ts, bdr/src/server/leadSink.ts, bdr/src/server/callbackService.ts, bdr/src/app/api/call-now/route.ts, bdr/src/app/api/call-later/route.ts, bdr/src/app/api/contact/route.ts |
|
|
11
11
|
| [New-Campaign Onboarding (6-phase runbook)](workflows/new-campaign-onboarding.md) | The end-to-end procedure for launching a new outbound BDR campaign (industry, offer, target persona, geography). | ai-bdr/docs/client-onboarding-sop.md, ai-bdr/docs/calcom-new-campaign-event-guide.md, ai-bdr/prompts/templates/campaign-template.md, ai-bdr/scripts/update_assistant.py, ai-bdr/scripts/update_system_prompt.py |
|
|
@@ -6,7 +6,7 @@ project: "AI-BDR"
|
|
|
6
6
|
client: shared
|
|
7
7
|
type: feature
|
|
8
8
|
status: draft
|
|
9
|
-
updated: 2026-07-
|
|
9
|
+
updated: 2026-07-15
|
|
10
10
|
owners: [tcox]
|
|
11
11
|
files:
|
|
12
12
|
- bdr/PLAN.md
|
|
@@ -515,6 +515,21 @@ so fidelity should be near-exact.
|
|
|
515
515
|
summaries, accent `RichLine`s) is represented (flat columns can't hold arrays cleanly — child rows or
|
|
516
516
|
a JSON field); who authors/owns the schema; and how the slug relates to the existing
|
|
517
517
|
`hsCampaignId`/Toga campaign UUID used for attribution.
|
|
518
|
+
11. **Privacy Policy & Terms links (§9.11, from the first design review).** The consent
|
|
519
|
+
footnotes on Call Now / Schedule link to **dead anchors** (`#privacy` / `#terms`,
|
|
520
|
+
ported verbatim from the mockup; the original `info` app had none). They need real
|
|
521
|
+
pages or links to `togatech` pages. Wiring is a **2-line content change** — the schema
|
|
522
|
+
already supports `[label](href)`, and HubSpot campaigns can override the href per
|
|
523
|
+
campaign.
|
|
524
|
+
12. **Share button is a mock (§9.12).** The Success summary-card Share popover validates
|
|
525
|
+
the email and shows "Sent" but **sends nothing** (the Copy button IS a real clipboard
|
|
526
|
+
write). A functional version needs an **email-send route** AND the **real call
|
|
527
|
+
pipeline** (today's summaries are simulated rotating recaps, not real call data).
|
|
528
|
+
13. **"Avg. connect time" (~7 s) is curated copy, not a metric (§9.13).** It has never
|
|
529
|
+
been computed in any product version — it is campaign-editable bundle copy. Keep it
|
|
530
|
+
campaign-editable for launch; a **live calculation is post-launch** (needs a metric
|
|
531
|
+
definition, a Vapi/Toga call-record source, periodic computation, and real call
|
|
532
|
+
volume).
|
|
518
533
|
|
|
519
534
|
---
|
|
520
535
|
|
|
@@ -558,6 +573,12 @@ so fidelity should be near-exact.
|
|
|
558
573
|
- [ ] Pixel-perfect parity pass against the mockup screens + screenshots.
|
|
559
574
|
|
|
560
575
|
## Change history
|
|
576
|
+
- 2026-07-15 — First UI design review: appended three future items to §9 open questions,
|
|
577
|
+
mirroring `BDR/PLAN.md` §9.11–§9.13. §9.11 real Privacy/Terms pages (consent footnotes
|
|
578
|
+
currently link to dead `#privacy`/`#terms` anchors; 2-line content fix). §9.12 Share
|
|
579
|
+
button is a mock (validates + shows "Sent" but sends nothing; Copy is real) — needs an
|
|
580
|
+
email-send route plus the real call pipeline. §9.13 "Avg. connect time" (~7 s) is
|
|
581
|
+
curated campaign copy, never a computed metric; live calculation is post-launch. (tcox)
|
|
561
582
|
- 2026-07-14 — Phases 0–5 executed and QA'd (engine + full mockup port + real backend);
|
|
562
583
|
built codebase now documented in `web-funnel-app.md`. `BDR/PLAN.md` itself corrected:
|
|
563
584
|
absolute local paths genericized, and the stale "not yet in TOGA registry" note fixed
|
|
@@ -6,7 +6,7 @@ project: AI-BDR
|
|
|
6
6
|
client: shared
|
|
7
7
|
type: feature
|
|
8
8
|
status: active
|
|
9
|
-
updated: 2026-07-
|
|
9
|
+
updated: 2026-07-15
|
|
10
10
|
owners: [tcox]
|
|
11
11
|
files:
|
|
12
12
|
- bdr/PLAN.md
|
|
@@ -14,7 +14,10 @@ files:
|
|
|
14
14
|
- bdr/eslint.config.mjs
|
|
15
15
|
- bdr/amplify.yml
|
|
16
16
|
- bdr/src/app
|
|
17
|
+
- bdr/src/app/layout.tsx
|
|
18
|
+
- bdr/src/app/studio.css
|
|
17
19
|
- bdr/src/lib/resolveCampaignId.ts
|
|
20
|
+
- bdr/src/lib/scheduleSlots.ts
|
|
18
21
|
- bdr/src/content
|
|
19
22
|
- bdr/src/components
|
|
20
23
|
- bdr/src/flow
|
|
@@ -55,6 +58,11 @@ is **decision-gated, not code** (see "What is parked / not built").
|
|
|
55
58
|
hand-authored CSS (ported verbatim as `src/app/studio.css`) and threaten pixel
|
|
56
59
|
parity. Do **not** add Tailwind to this repo — the styling is intentionally the
|
|
57
60
|
mockup's own CSS-variable system. See the styles.css escape-sequence gotcha below.
|
|
61
|
+
- **Font: Plus Jakarta Sans via `next/font/google`** (`Plus_Jakarta_Sans`, weights
|
|
62
|
+
400/500/600/700/800, `display: swap`, self-hosted at build). Loaded in
|
|
63
|
+
`src/app/layout.tsx` and exposed as `--font-jakarta` on `<html>`; `studio.css`
|
|
64
|
+
`--font-display` / `--font-body` resolve `var(--font-jakarta)` first with the
|
|
65
|
+
original stack kept as fallback. See the font-port gotcha below.
|
|
58
66
|
- **ESLint flat config** carries a **no-em-dash rule** on shipped strings
|
|
59
67
|
(`Literal` / `TemplateElement` / `JSXText` selectors) — enforces the mockup copy
|
|
60
68
|
rule on in-repo strings (`eslint.config.mjs`).
|
|
@@ -82,7 +90,10 @@ is **decision-gated, not code** (see "What is parked / not built").
|
|
|
82
90
|
behind `LeadSink` + `CallbackService` adapters (detail in
|
|
83
91
|
`web-funnel-content-model.md`).
|
|
84
92
|
- `src/app/api/*` — route handlers `call-now`, `call-later`, `contact`.
|
|
85
|
-
- `public/*` — assets pruned to the **default campaign only**
|
|
93
|
+
- `public/*` — assets pruned to the **default campaign only**, **plus AutoBuild's
|
|
94
|
+
FLOURISH characters** (Owl 1 `owl-02` + Robot 1 `robot-02`, art + talk videos) which
|
|
95
|
+
the assembly cycle needs even though they are not the campaign agent. See the
|
|
96
|
+
asset-pruning gotcha below.
|
|
86
97
|
- `test/*` — the 67-test Vitest suite.
|
|
87
98
|
|
|
88
99
|
## How the built app behaves (key runtime facts)
|
|
@@ -99,6 +110,12 @@ is **decision-gated, not code** (see "What is parked / not built").
|
|
|
99
110
|
- **Boundary validation on every route handler.** 16 KB body cap; phone / UUID / ISO
|
|
100
111
|
checks; all handlers return the `{isSuccess, status, error, messages, data}`
|
|
101
112
|
envelope (same contract as `info`/Toga).
|
|
113
|
+
- **Schedule timezone is already calculated (not a gap).** `detectLocalTz()`
|
|
114
|
+
(`src/lib/scheduleSlots.ts`) derives the visitor's zone via the `Intl` short name and
|
|
115
|
+
renders it in the "All times in `<tz>`" note + the confirmation label; the backend
|
|
116
|
+
(`src/server/toga.ts`) converts the picked slot to `America/Chicago` for Toga. If
|
|
117
|
+
`Intl` is unavailable the note simply is not rendered (graceful, no crash). A design
|
|
118
|
+
request to "make tz calculated" was already satisfied — do not re-implement.
|
|
102
119
|
|
|
103
120
|
## What is parked / not built
|
|
104
121
|
|
|
@@ -122,6 +139,20 @@ is **decision-gated, not code** (see "What is parked / not built").
|
|
|
122
139
|
parsers. This was **fixed in the ported `src/app/studio.css`**, but
|
|
123
140
|
`mockup/styles.css` was intentionally left pristine — so **anyone re-porting the
|
|
124
141
|
mockup CSS must re-apply this fix.**
|
|
142
|
+
- **Port the mockup's `<head>` resources, not just its CSS.** The initial port mirrored
|
|
143
|
+
the mockup's CSS but not its `<head>` font `<link>`: `studio.css` named Plus Jakarta
|
|
144
|
+
Sans but nothing ever loaded it, so the whole site silently fell back to `system-ui`.
|
|
145
|
+
Fixed by loading the font via `next/font/google` in `layout.tsx` (see Stack). **Anyone
|
|
146
|
+
porting mockup screens must check `<head>` resources (fonts, preconnects, meta) too —
|
|
147
|
+
a named font in CSS does not mean the font is loaded.**
|
|
148
|
+
- **Asset pruning must include AutoBuild's flourish characters.** Phase 2 pruning (§5.8)
|
|
149
|
+
kept only the campaign agent's art, which left AutoBuild's FLOURISH cycle (Owl 1
|
|
150
|
+
`owl-02`, Robot 1 `robot-02`) rendering blank — only the final agent showed. The
|
|
151
|
+
preloader is **silently tolerant** of missing files (resolves `false`, never blocks),
|
|
152
|
+
so the gap produced no error and was easy to miss. Fixed by copying `owl-02.png`,
|
|
153
|
+
`owl-02-talk.mp4`, `robot-02.png`, `robot-02-talk.mp4` into `public/agents/`. **Check
|
|
154
|
+
`public/agents/` against every form/slot the flow actually cycles, not just the
|
|
155
|
+
campaign agent** — the tolerant preloader will not warn you.
|
|
125
156
|
- **No PII in logs.** All of `info`'s PII-logging was stripped on port (identifier-
|
|
126
157
|
only logs); the Toga error paths **strip query strings** because the contact
|
|
127
158
|
lookup carries the email in the query. Do not reintroduce value logging.
|
|
@@ -131,6 +162,17 @@ is **decision-gated, not code** (see "What is parked / not built").
|
|
|
131
162
|
harness; pull it with `npx toga-ai`.
|
|
132
163
|
|
|
133
164
|
## Change history
|
|
165
|
+
- 2026-07-15 — First UI design review pass. FIXED: site-wide font silently fell back to
|
|
166
|
+
`system-ui` (mockup's `<head>` Google-Fonts link was never ported) — now Plus Jakarta
|
|
167
|
+
Sans via `next/font/google` in `layout.tsx`, exposed as `--font-jakarta`, resolved
|
|
168
|
+
first in `studio.css` (added font-port gotcha + Stack note). FIXED: AutoBuild flourish
|
|
169
|
+
agents (`owl-02`, `robot-02`) rendered blank because asset pruning kept only the
|
|
170
|
+
campaign agent and the preloader is silently tolerant of missing files — restored their
|
|
171
|
+
art + talk videos to `public/agents/` (added asset-pruning gotcha, corrected the
|
|
172
|
+
`public/*` pruning note). CONFIRMED: Schedule-screen timezone is already calculated
|
|
173
|
+
(`detectLocalTz()` + backend `America/Chicago` conversion) — documented as a runtime
|
|
174
|
+
fact so it is not mistaken for a gap. All changes uncommitted in the working tree at
|
|
175
|
+
capture time. (tcox)
|
|
134
176
|
- 2026-07-14 — Initial doc: recorded the BUILT state of the BDR web funnel (PLAN
|
|
135
177
|
Phases 0–5 executed + QA'd). Next.js 16.2.3 App Router/TS, deliberate no-Tailwind,
|
|
136
178
|
ESLint no-em-dash rule, `resolveCampaignId`, full mockup component/flow port
|
|
@@ -3,5 +3,5 @@
|
|
|
3
3
|
| Doc | Summary | Files |
|
|
4
4
|
|-----|---------|-------|
|
|
5
5
|
| [TOGa Supply (toga2-supply) Architecture](architecture.md) | `toga2-supply` is the **React + Vite frontend** for TOGa Supply — warehouse fulfillment tooling (shipment selection, fulfill & ship against carrier APIs, NetSui | toga2-supply/src/api/toga.ts, toga2-supply/src/pages/ShipmentItems/view/ShipmentItemsPage.tsx, toga2-supply/src/pages/EditShipment/view/EditShipmentPage.tsx, toga2-supply/src/pages/EditShipment/api/UpdateShipmentApi.ts, toga2-supply/src/pages/Shipments/view/components/ShipmentsCardTableForm/ShipmentsCardTableForm.tsx |
|
|
6
|
-
| [Fulfill & Ship](features/fulfill-and-ship.md) | Fulfill & Ship lets a warehouse user select sales-order line items, enter serials, pick a carrier/method, and in one action: create the Item Fulfillment records | toga2-supply/src/pages/ShipmentItems/view/ShipmentItemsPage.tsx, toga2-supply/src/pages/EditShipment/view/EditShipmentPage.tsx, toga2-supply/src/pages/EditShipment/view/components/forms/EditShipmentForm.tsx, toga2-supply/src/pages/EditShipment/view/components/SelectedShipmentItemsTable.tsx, toga2-supply/src/pages/EditShipment/view/helpers/ShipmentDetailsForm/renderEditShipmentFormInput.tsx, toga2-supply/src/pages/EditShipment/viewModel/FIELDS/DUMMYUPDATESHIPMENTFIELDS.json, toga2-supply/src/pages/EditShipment/helpers/ShipmentDetailsForm/renderEditShipmentFormInput.tsx, toga2-supply/tailwind.config.cjs, toga2-supply/src/pages/EditShipment/view/modals/ReturnShippingModal.tsx, toga2-supply/src/components/ui/BaseInput/BaseInput.tsx, toga2-supply/src/pages/EditShipment/api/UpdateShipmentApi.ts, toga2-supply/src/pages/EditShipment/helpers/ShipmentDetailsForm/formatShipmentData.ts, toga2-supply/src/pages/EditShipment/types.ts, toga2-supply/src/pages/Shipments/view/ShipmentsPage.tsx, toga2-supply/src/pages/Shipments/view/components/ShipmentsCardTableForm/ShipmentsCardTableForm.tsx, toga2-supply/src/pages/Shipments/api/ShipmentsApi.ts, toga2-supply/src/pages/Shipments/types.ts, toga2-supply/src/pages/FulfilledShipments/view/FulfilledShipmentsPage.tsx, toga2-supply/src/components/ui/CardTable/CardTable.tsx, toga2-supply/src/components/ui/CardTable/types.ts, toga2-supply/src/assets/pen-line.svg, _underscore/Model/Client/ItemFulfillment.php, _underscore/Trait/Netsuite/ItemFulfillment.php, _underscore/Component/Library/Carriers/Ups/Ups.php |
|
|
6
|
+
| [Fulfill & Ship](features/fulfill-and-ship.md) | Fulfill & Ship lets a warehouse user select sales-order line items, enter serials, pick a carrier/method, and in one action: create the Item Fulfillment records | toga2-supply/src/pages/ShipmentItems/view/ShipmentItemsPage.tsx, toga2-supply/src/pages/EditShipment/view/EditShipmentPage.tsx, toga2-supply/src/pages/EditShipment/view/components/forms/EditShipmentForm.tsx, toga2-supply/src/pages/EditShipment/view/components/SelectedShipmentItemsTable.tsx, toga2-supply/src/pages/EditShipment/view/helpers/ShipmentDetailsForm/renderEditShipmentFormInput.tsx, toga2-supply/src/pages/EditShipment/viewModel/FIELDS/DUMMYUPDATESHIPMENTFIELDS.json, toga2-supply/src/pages/EditShipment/helpers/ShipmentDetailsForm/renderEditShipmentFormInput.tsx, toga2-supply/tailwind.config.cjs, toga2-supply/src/pages/EditShipment/view/modals/ReturnShippingModal.tsx, toga2-supply/src/styles/index.scss, toga2-supply/src/components/ui/BaseInput/BaseInput.tsx, toga2-supply/src/pages/EditShipment/api/UpdateShipmentApi.ts, toga2-supply/src/pages/EditShipment/helpers/ShipmentDetailsForm/formatShipmentData.ts, toga2-supply/src/pages/EditShipment/types.ts, toga2-supply/src/pages/Shipments/view/ShipmentsPage.tsx, toga2-supply/src/pages/Shipments/view/components/ShipmentsCardTableForm/ShipmentsCardTableForm.tsx, toga2-supply/src/pages/Shipments/api/ShipmentsApi.ts, toga2-supply/src/pages/Shipments/types.ts, toga2-supply/src/pages/FulfilledShipments/view/FulfilledShipmentsPage.tsx, toga2-supply/src/components/ui/CardTable/CardTable.tsx, toga2-supply/src/components/ui/CardTable/types.ts, toga2-supply/src/assets/pen-line.svg, _underscore/Model/Client/ItemFulfillment.php, _underscore/Trait/Netsuite/ItemFulfillment.php, _underscore/Component/Library/Carriers/Ups/Ups.php |
|
|
7
7
|
| [AWS Amplify Build & Deploy (non-prod environments)](workflows/amplify-build-and-deploy.md) | How `toga2-supply` (React + Vite) builds and deploys on **AWS Amplify**. | toga2-supply/amplify.yml, toga2-supply/.gitattributes, toga2-supply/.github/workflows/sync-stage-environments.yml, toga2-supply/.env.qc-security |
|
|
@@ -18,6 +18,7 @@ files:
|
|
|
18
18
|
- toga2-supply/src/pages/EditShipment/helpers/ShipmentDetailsForm/renderEditShipmentFormInput.tsx
|
|
19
19
|
- toga2-supply/tailwind.config.cjs
|
|
20
20
|
- toga2-supply/src/pages/EditShipment/view/modals/ReturnShippingModal.tsx
|
|
21
|
+
- toga2-supply/src/styles/index.scss
|
|
21
22
|
- toga2-supply/src/components/ui/BaseInput/BaseInput.tsx
|
|
22
23
|
- toga2-supply/src/pages/EditShipment/api/UpdateShipmentApi.ts
|
|
23
24
|
- toga2-supply/src/pages/EditShipment/helpers/ShipmentDetailsForm/formatShipmentData.ts
|
|
@@ -187,6 +188,27 @@ bare string** — see the gotcha below before wiring a new select field.
|
|
|
187
188
|
(`onBlur` when `field.isCurrency`). Return modal (`ReturnShippingModal.tsx`): compact selects
|
|
188
189
|
vertically centered; Carrier Account # widened to `w-[172px]` to match Carrier.
|
|
189
190
|
|
|
191
|
+
### Edit Return Label modal — searchable Addressee combobox + discard guard (2026-07-15)
|
|
192
|
+
|
|
193
|
+
`ReturnShippingModal.tsx`:
|
|
194
|
+
- **Addressee is a searchable combobox built on a native `<input list>` + `<datalist>`** of
|
|
195
|
+
warehouse/location options — typing filters the list (Chromium does a substring "contains" match;
|
|
196
|
+
Firefox only prefix-matches) and **custom free text is still allowed**; selecting a known option
|
|
197
|
+
prefills the address via `applyWarehouse`. Prefer this native pattern over react-select when free
|
|
198
|
+
text plus suggestions are both wanted — but mind the two gotchas below.
|
|
199
|
+
- **Backdrop-click discard guard.** `BaseModal` calls its `onClose` prop on backdrop click, which
|
|
200
|
+
would silently discard unsaved edits. Pass a **guarded** handler to `BaseModal`'s `onClose`
|
|
201
|
+
(`if (formMethods.formState.isDirty) return; onClose();`) so an accidental outside click can't
|
|
202
|
+
drop a dirty form, while **Cancel and the header X still call the real `onClose`** to close/discard
|
|
203
|
+
explicitly. Reuse this pattern for any BaseModal wrapping an editable form.
|
|
204
|
+
|
|
205
|
+
### Shared checkbox restyled to the Figma design-system spec (2026-07-15)
|
|
206
|
+
|
|
207
|
+
`BaseInput.tsx`'s checkbox now matches the Figma checkbox component: **16px** (was 20px),
|
|
208
|
+
`rounded-sm`, unchecked border `navy-300`, checked fill `supply-blue-400` (`#3F5DCA`, the primary),
|
|
209
|
+
12px check glyph. This is the **shared** checkbox, so the change applies **app-wide**, not just to
|
|
210
|
+
the shipment forms — audit other consumers when touching it.
|
|
211
|
+
|
|
190
212
|
## Planned direction — "Fulfill & Ship" from an existing Item Fulfillment (future, Eric)
|
|
191
213
|
|
|
192
214
|
A **third entry mode** is planned (distinct from Select-Items-create and the pencil-edit): a
|
|
@@ -221,7 +243,27 @@ the call 403s and returns no label.
|
|
|
221
243
|
|
|
222
244
|
## Gotchas / known issues
|
|
223
245
|
|
|
224
|
-
- **⚠
|
|
246
|
+
- **⚠ Native `<datalist>` renders its OWN dropdown arrow, un-hideable by Tailwind.** An
|
|
247
|
+
`<input list>` combobox (the Edit Return Label Addressee) shows a **second dark arrow** (the
|
|
248
|
+
webkit calendar-picker indicator) that a Tailwind arbitrary variant can't reliably hide. Kill it
|
|
249
|
+
with a **real global CSS rule** in the source stylesheet
|
|
250
|
+
`src/styles/index.scss` (imported by `main.tsx`):
|
|
251
|
+
`input[list]::-webkit-calendar-picker-indicator { display: none !important; }`.
|
|
252
|
+
**Edit `index.scss`, NOT `index.css`** — `index.css` is compiled output and will be overwritten.
|
|
253
|
+
Also set **`autoComplete="off"`** on the input or the browser's address-autofill popup
|
|
254
|
+
("Saved data / Manage personal info") overlaps and fights the datalist.
|
|
255
|
+
- **⚠ A `className` template literal must keep the trailing space before `${...}`.** `border ${cond
|
|
256
|
+
? a : b}` is correct; `border${cond ? a : b}` concatenates into an invalid single class
|
|
257
|
+
(e.g. `borderborder-navy-300`) and the utility silently no-ops. Concrete failure: the `BaseInput`
|
|
258
|
+
checkbox's unchecked border disappeared because the space was dropped. Watch this whenever
|
|
259
|
+
conditional classes are appended to a static base class.
|
|
260
|
+
- **⚠ `justify-between` + `clamp()` gaps are frozen when the container is a FIXED width.** The Update
|
|
261
|
+
Info field row uses `gap-x-[clamp(2px,1vw,50px)]` with `justify-between`, but the card was a fixed
|
|
262
|
+
`w-[1820px]`, so `justify-between` distributed columns across a constant width and the gaps never
|
|
263
|
+
changed on resize. Fix: make the card `w-full max-w-[1820px]` and the form section `w-full` so the
|
|
264
|
+
width tracks the viewport and the clamp'd gaps grow/shrink with it. Note `justify-between` does
|
|
265
|
+
**not** cap the max gap at 50px on very wide screens — the `clamp` only *floors* at 2px; the max
|
|
266
|
+
applies until columns are pushed to the edges. (`EditShipmentPage.tsx`.) — a class used ONLY in `viewModel/FIELDS/*.json`
|
|
225
267
|
is silently inert.** The config-driven forms author Tailwind utility classes inside the field JSON
|
|
226
268
|
(e.g. `DUMMYUPDATESHIPMENTFIELDS.json`), but `tailwind.config.cjs` `content` globs only scan
|
|
227
269
|
`./src/**/*.{js,ts,jsx,tsx}` (+ `index.html` + toga-blox dist) — **not `.json`**. So a class used
|
|
@@ -417,6 +459,18 @@ not the base `_Model_Client_ItemFulfillment`. Tested with GroWrk; UPS support wa
|
|
|
417
459
|
for Compass and is not yet in prod.
|
|
418
460
|
|
|
419
461
|
## Change history
|
|
462
|
+
- 2026-07-15 — TRUE-79191: made the Edit Return Label **Addressee a searchable combobox** (native
|
|
463
|
+
`<input list>` + `<datalist>`, filters + allows custom text, prefills via `applyWarehouse`); added a
|
|
464
|
+
**backdrop-click discard guard** (guarded `BaseModal onClose` on `formState.isDirty`); restyled the
|
|
465
|
+
**shared `BaseInput` checkbox** to the Figma spec (16px, navy-300 border, `supply-blue-400` fill,
|
|
466
|
+
app-wide). Documented four durable gotchas: native `<datalist>`'s un-hideable arrow (hide via a
|
|
467
|
+
real global rule in `src/styles/index.scss`, not the compiled `index.css`) + `autoComplete="off"`
|
|
468
|
+
to stop autofill overlap; the `className` **trailing-space-before-`${...}`** footgun (dropped space
|
|
469
|
+
→ invalid concatenated class → silent no-op, killed the checkbox border); and `justify-between` +
|
|
470
|
+
`clamp()` **gaps frozen by a fixed-width card** (fix: `w-full max-w-[1820px]` so width tracks the
|
|
471
|
+
viewport). Remaining Figma polish (5-col address grid, Signature default object, declared-cost
|
|
472
|
+
2-decimal rehydrate, Clear All wiring, residential alignment, footer/divider spacing) was cosmetic
|
|
473
|
+
— no doc change. (mhammontree)
|
|
420
474
|
- 2026-07-15 — TRUE-79191: unified the **dropdown chevron glyph** across the compact selects — added a
|
|
421
475
|
`CompactDropdownIndicator` (FA `chevronDown`) to `BaseInput` and wired it into both react-select
|
|
422
476
|
`components` blocks **only when `compact` is true**, so the react-select caret matches the native
|
package/package.json
CHANGED